UNPKG

fling

Version:

JSON Fling is a simple JSON-RPC framework for NodeJS with built-in permissions and support for different transports.

90 lines (57 loc) 1.91 kB
"use strict"; var __ = require( 'doublescore' ); var AbstractReceiverTransport = require( './transport.receiver.abstract' ); var bodyParser = require( 'body-parser' ); var express = require( 'express' ); var Request = require( './request' ); var Response = require( './response' ); var ExpressReceiverTransport = function( config ) { AbstractReceiverTransport.apply( this, arguments ); this._server = this._config.express; this._url = this._config.url; this._parserConfig = __( { limit: '100kb', strict: true } ).mixin( this._config.parser ); }; require( 'util' ).inherits( ExpressReceiverTransport, AbstractReceiverTransport ); ExpressReceiverTransport.prototype.init = function( done ) { var self = this; var parser = bodyParser.json( self._parserConfig ); self._server.post( self._url, function( req, res, next ) { parser( req, res, function( err ) { if ( err ) { req._bodyParseError = err; } next(); } ); }, function( httpRequest, httpResponse ) { var request = new Request( httpRequest.body, httpRequest ); var response = new Response( request.getId() ); response.once( 'send', function( payload ) { if ( typeof self._config.beforeSend === 'function' ) { payload = self._config.beforeSend( payload ); } httpResponse.writeHead( 200, { 'Content-Type': 'application/json' } ); httpResponse.end( JSON.stringify( payload ) ); } ); if ( httpRequest._bodyParseError ) { response.addError( 400, 'failed to parse payload: ' + httpRequest._bodyParseError.message, { status: httpRequest._bodyParseError.statusCode } ); response.send(); } else { self.emit( 'rpc', { request: request, response: response } ); } } ); setImmediate( done, null ); }; ExpressReceiverTransport.prototype.dinit = function( done ) { setImmediate( done, null ); }; module.exports = ExpressReceiverTransport;