From c22bb65bdaa686f65dc228d2b10abe9afcbbe993 Mon Sep 17 00:00:00 2001 From: Blake Finney Date: Thu, 29 Jun 2017 10:57:00 +0100 Subject: [PATCH 1/5] Refactored to include Call Mutli function, for multiple calls on same connection --- package.json | 2 +- src/client.js | 98 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 66 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index a84d139..67965cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "json-rpc2", - "version": "1.0.2", + "version": "1.0.3", "description": "JSON-RPC 2.0 server and client library, with HTTP, TCP and Websocket endpoints", "main": "./src/jsonrpc.js", "keywords": [ diff --git a/src/client.js b/src/client.js index 5f7a386..2d33eb9 100644 --- a/src/client.js +++ b/src/client.js @@ -36,22 +36,30 @@ module.exports = function (classes){ * In HTTP mode, we get to submit exactly one message and receive up to n * messages. */ - connectHttp : function (method, params, opts, callback){ + connectHttp : function (calls, opts, callback){ if (_.isFunction(opts)) { callback = opts; opts = {}; } opts = opts || {}; + calls = calls || []; var id = 1, self = this; // First we encode the request into JSON - var requestJSON = JSON.stringify({ - 'id' : id, - 'method' : method, - 'params' : params, - 'jsonrpc': '2.0' - }); + var req; + + if (calls && calls instanceof Array) { + req = []; + // Loop through the shortest array, for multiple calls + for (var c = 0; c < calls.length; c++){ + var call = calls[c] || {}; + EventEmitter.trace('-->', 'Http call (method ' + call.method + '): ' + JSON.stringify(call.params)); + req.push({'id': id, 'method' : call.method, 'params' : call.params, 'jsonrpc': '2.0'}) + } + } + + var requestJSON = JSON.stringify(req); var headers = {}; @@ -69,6 +77,9 @@ module.exports = function (classes){ method : 'POST', headers : headers }; + if (opts.agent){ + options.agent = opts.agent; + } var request; if(opts.https === true) { if(opts.rejectUnauthorized !== undefined) { @@ -255,37 +266,58 @@ module.exports = function (classes){ opts = {}; } opts = opts || {}; - EventEmitter.trace('-->', 'Http call (method ' + method + '): ' + JSON.stringify(params)); - - this.connectHttp(method, params, opts, function connectHttp(id, request, response){ - // Check if response object exists. - if (!response) { - callback(new Error('Have no response object')); - return; + this.call_multi([{method: method, params: params}, opts, callback]); + }, + call_multi : function (calls, opts, callback){ + // Calls object to be array of object in format [{"method": "method1", "params": ["params1"]}] + if (_.isFunction(opts)) { + callback = opts; + opts = {}; } + opts = opts || {}; + calls = calls || []; + this.connectHttp(calls, opts, function connectHttp(id, request, response){ + // Check if response object exists. + if (!response) { + callback(new Error('Have no response object')); + return; + } - var data = ''; + var data = ''; - response.on('data', function responseData(chunk){ - data += chunk; - }); + response.on('data', function responseData(chunk){ + data += chunk; + }); - response.on('end', function responseEnd(){ - if (response.statusCode !== 200) { - callback(new Error('"' + response.statusCode + '"' + data)) - ; - return; - } - var decoded = JSON.parse(data); - if (_.isFunction(callback)) { - if (!decoded.error) { - decoded.error = null; - } - callback(decoded.error, decoded.result); - } + response.on('end', function responseEnd(){ + if (response.statusCode !== 200) { + callback(new Error('"' + response.statusCode + '"' + data)) + ; + return; + } + var decoded = JSON.parse(data); + if (_.isFunction(callback)) { + var return_error = null; + if (decoded instanceof Array && decoded.length) { + for (var d in decoded){ + if (decoded[d] && !decoded[d].error){ + decoded[d].error = null; + } else { + if(!return_error){ + return_error = []; + } + return_error.push(decoded[d].error) + } + } + callback(return_error, decoded); + } else { + callback(new Error('Have no response object')); + return; + } + } + }); }); - }); - } + } }); return Client; From fab926565a77806b282ffea92bc976262b658dd9 Mon Sep 17 00:00:00 2001 From: Blake Finney Date: Thu, 29 Jun 2017 11:26:22 +0100 Subject: [PATCH 2/5] Correct end of calls array --- src/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client.js b/src/client.js index 2d33eb9..d9c0cb0 100644 --- a/src/client.js +++ b/src/client.js @@ -266,7 +266,7 @@ module.exports = function (classes){ opts = {}; } opts = opts || {}; - this.call_multi([{method: method, params: params}, opts, callback]); + this.call_multi([{method: method, params: params}], opts, callback); }, call_multi : function (calls, opts, callback){ // Calls object to be array of object in format [{"method": "method1", "params": ["params1"]}] From 5bfc77706873a83e8efd7ad824534f377b0709c4 Mon Sep 17 00:00:00 2001 From: Blake Finney Date: Thu, 29 Jun 2017 13:38:42 +0100 Subject: [PATCH 3/5] If singular call, return as object; not array of 1. Remove old comment --- src/client.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/client.js b/src/client.js index d9c0cb0..a73d82f 100644 --- a/src/client.js +++ b/src/client.js @@ -50,8 +50,7 @@ module.exports = function (classes){ var req; if (calls && calls instanceof Array) { - req = []; - // Loop through the shortest array, for multiple calls + req = []; for (var c = 0; c < calls.length; c++){ var call = calls[c] || {}; EventEmitter.trace('-->', 'Http call (method ' + call.method + '): ' + JSON.stringify(call.params)); @@ -309,6 +308,10 @@ module.exports = function (classes){ return_error.push(decoded[d].error) } } + if (decoded.length === 1){ + // If singular call, unpack from array + decoded = decoded[0]; + } callback(return_error, decoded); } else { callback(new Error('Have no response object')); From 8faad6cdb3faa7d4ac2e39de420ecf5bd50ab94b Mon Sep 17 00:00:00 2001 From: Blake Finney Date: Mon, 3 Jul 2017 14:58:14 +0100 Subject: [PATCH 4/5] Undo version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 67965cc..a84d139 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "json-rpc2", - "version": "1.0.3", + "version": "1.0.2", "description": "JSON-RPC 2.0 server and client library, with HTTP, TCP and Websocket endpoints", "main": "./src/jsonrpc.js", "keywords": [ From 995bae0ebaba73ee8f29892daeeff1195eb0def7 Mon Sep 17 00:00:00 2001 From: Blake Finney Date: Tue, 4 Jul 2017 09:32:42 +0100 Subject: [PATCH 5/5] Added missing semi-colons --- src/client.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client.js b/src/client.js index a73d82f..169ff54 100644 --- a/src/client.js +++ b/src/client.js @@ -54,7 +54,7 @@ module.exports = function (classes){ for (var c = 0; c < calls.length; c++){ var call = calls[c] || {}; EventEmitter.trace('-->', 'Http call (method ' + call.method + '): ' + JSON.stringify(call.params)); - req.push({'id': id, 'method' : call.method, 'params' : call.params, 'jsonrpc': '2.0'}) + req.push({'id': id, 'method' : call.method, 'params' : call.params, 'jsonrpc': '2.0'}); } } @@ -305,7 +305,7 @@ module.exports = function (classes){ if(!return_error){ return_error = []; } - return_error.push(decoded[d].error) + return_error.push(decoded[d].error); } } if (decoded.length === 1){