diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/httpsync.js | 3 | ||||
-rw-r--r-- | lib/jsonrpc.js | 61 | ||||
-rw-r--r-- | lib/providermanager.js | 36 | ||||
-rw-r--r-- | lib/qtsync.js | 3 |
4 files changed, 88 insertions, 15 deletions
diff --git a/lib/httpsync.js b/lib/httpsync.js index 478779c4b..06e410ca8 100644 --- a/lib/httpsync.js +++ b/lib/httpsync.js @@ -38,7 +38,8 @@ HttpSyncProvider.prototype.send = function (payload) { request.send(JSON.stringify(payload)); // check request.status - return request.responseText; + var result = request.responseText; + return JSON.parse(result); }; module.exports = HttpSyncProvider; diff --git a/lib/jsonrpc.js b/lib/jsonrpc.js new file mode 100644 index 000000000..0036d0abf --- /dev/null +++ b/lib/jsonrpc.js @@ -0,0 +1,61 @@ +/* + This file is part of ethereum.js. + + ethereum.js is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ethereum.js is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with ethereum.js. If not, see <http://www.gnu.org/licenses/>. +*/ +/** @file jsonrpc.js + * @authors: + * Marek Kotewicz <marek@ethdev.com> + * @date 2015 + */ + +var messageId = 1; + +/// Should be called to valid json create payload object +/// @param method of jsonrpc call, required +/// @param params, an array of method params, optional +/// @returns valid jsonrpc payload object +var toPayload = function (method, params) { + if (!method) + console.error('jsonrpc method should be specified!'); + + return { + jsonrpc: '2.0', + method: method, + params: params || [], + id: messageId++ + }; +}; + +/// Should be called to check if jsonrpc response is valid +/// @returns true if response doesn't have error field +var isValidResponse = function (response) { + return response && !response.error; +}; + +/// Should be called to create batch payload object +/// @param messages, an array of objects with method (required) and params (optional) fields +var toBatchPayload = function (messages) { + return messages.map(function (message) { + return toPayload(message.method, message.params); + }); +}; + +module.exports = { + toPayload: toPayload, + isValidResponse: isValidResponse, + toBatchPayload: toBatchPayload +}; + + diff --git a/lib/providermanager.js b/lib/providermanager.js index 38c0f6c46..ce208917d 100644 --- a/lib/providermanager.js +++ b/lib/providermanager.js @@ -23,7 +23,9 @@ * @date 2014 */ -var web3 = require('./web3'); // jshint ignore:line +var web3 = require('./web3'); +var jsonrpc = require('./jsonrpc'); + /** * Provider manager object prototype @@ -37,21 +39,34 @@ var web3 = require('./web3'); // jshint ignore:line var ProviderManager = function() { this.polls = []; this.provider = undefined; - this.id = 1; var self = this; var poll = function () { if (self.provider) { - self.polls.forEach(function (data) { - var result = self.send(data.data); - + var pollsBatch = self.polls.map(function (data) { + return data.data; + }); + + var payload = jsonrpc.toBatchPayload(pollsBatch); + var results = self.provider.send(payload); + + self.polls.forEach(function (data, index) { + var result = results[index]; + + if (!jsonrpc.isValidResponse(result)) { + return; + } + + result = result.result; // dont call the callback if result is not an array, or empty one if (!(result instanceof Array) || result.length === 0) { return; } data.callback(result); + }); + } setTimeout(poll, 1000); }; @@ -61,21 +76,16 @@ var ProviderManager = function() { /// sends outgoing requests /// @params data - an object with at least 'method' property ProviderManager.prototype.send = function(data) { - - data.jsonrpc = '2.0'; - data.params = data.params || []; - data.id = this.id++; + var payload = jsonrpc.toPayload(data.method, data.params); if (this.provider === undefined) { console.error('provider is not set'); return null; } - //TODO: handle error here? - var result = this.provider.send(data); - result = JSON.parse(result); + var result = this.provider.send(payload); - if (result.error) { + if (!jsonrpc.isValidResponse(result)) { console.log(result.error); return null; } diff --git a/lib/qtsync.js b/lib/qtsync.js index a287a7172..75dcb43ab 100644 --- a/lib/qtsync.js +++ b/lib/qtsync.js @@ -25,7 +25,8 @@ var QtSyncProvider = function () { }; QtSyncProvider.prototype.send = function (payload) { - return navigator.qt.callMethod(JSON.stringify(payload)); + var result = navigator.qt.callMethod(JSON.stringify(payload)); + return JSON.parse(result); }; module.exports = QtSyncProvider; |