jsonrpc.js file && batch polling
This commit is contained in:
1 parent
f3ce1f07c4
commit
45134de740
7 files changed
+196
-46
No files matched your search
+2
-1
@@ -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;
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
+23
-13
@@ -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;
|
||||
}
|
||||
|
||||
+2
-1
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user