UNPKG

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
"use strict"; 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;