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
JavaScript
;
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;