aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/httpsync.js3
-rw-r--r--lib/jsonrpc.js61
-rw-r--r--lib/providermanager.js36
-rw-r--r--lib/qtsync.js3
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;