fling
Version:
JSON Fling is a simple JSON-RPC framework for NodeJS with built-in permissions and support for different transports.
119 lines (85 loc) • 2.17 kB
JavaScript
;
var AbstractSenderTransport = require( './transport.receiver.abstract' );
var request = require( 'request' );
var requestIds = 0;
var ExpressSenderTransport = function( config ) {
AbstractSenderTransport.apply( this, arguments );
this._url = this._config.url;
this._ca = this._config.ca || null;
this._headers = this._config.headers || null;
};
require( 'util' ).inherits( ExpressSenderTransport, AbstractSenderTransport );
ExpressSenderTransport.prototype.call = function( method, params, headers, done ) {
if ( typeof headers === 'function' ) {
done = headers;
headers = null;
}
if ( !method ) {
done( {
code: 400,
message: 'method is required',
data: null
} );
return;
}
if ( typeof params === 'function' ) {
done = params;
params = null;
}
var id = ++requestIds;
var requestPayload = {
jsonrpc: '2.0',
id: id,
method: method,
params: params
};
var query = {
uri: this._url,
method: 'POST',
rejectUnauthorized: false,
requestCert: true,
agent: false,
json: requestPayload
};
if ( this._ca ) {
query.ca = this._ca;
}
if ( this._headers ) {
query.headers = this._headers;
}
if ( headers && typeof headers === 'object' ) {
if ( !query.headers ) {
query.headers = {};
}
for ( var field in headers ) {
if ( headers.hasOwnProperty( field ) ) {
query.headers[ field ] = headers[ field ];
}
}
}
request( query, function( err, response, body ) {
if ( !err ) {
if ( !body ) {
err = 'no response payload';
} else if ( !body.hasOwnProperty( 'result' ) && !body.hasOwnProperty( 'error' ) ) {
err = 'no response result or error';
}
}
var errObj = null;
if ( err ) {
errObj = new Error( 'transport error' );
errObj.code = 500;
errObj.data = err.message;
done( errObj );
} else if ( body.error ) {
errObj = new Error( body.error.message );
errObj.code = body.error.code;
errObj.data = body.error.data;
done( errObj );
} else {
done( null, body.result );
}
} );
return id;
};
module.exports = ExpressSenderTransport;