From d408fb0867ba0db83a0047f712f27a04ebb4b990 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Sat, 21 Mar 2015 23:10:34 +0100 Subject: [PATCH] comments in requestmanager --- lib/web3/requestmanager.js | 187 ++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 74 deletions(-) diff --git a/lib/web3/requestmanager.js b/lib/web3/requestmanager.js index 45176be..f32b4ac 100644 --- a/lib/web3/requestmanager.js +++ b/lib/web3/requestmanager.js @@ -34,93 +34,132 @@ var InvalidResponse = new Error('jsonrpc response is not valid'); * It's also responsible for polling the ethereum node for incoming messages * Default poll timeout is 1 second */ -var requestManager = function() { - var polls = []; - var timeout = null; - var provider; +var RequestManager = function() { + this.polls = []; + this.timeout = null; + this.provider; + + this.poll(); +}; - var send = function (data, callback) { +/** + * Should be used to synchronously send request + * + * @method send + * @param {Object|Array} data + * @return {Object} + */ +RequestManager.prototype.send = function (data) { + var payload = utils.isArray(data) ? jsonrpc.toBatchPayload(data) : jsonrpc.toPayload(data.method, data.params); + var result = this.provider.send(payload); - var payload = utils.isArray(data) ? jsonrpc.toBatchPayload(data) : jsonrpc.toPayload(data.method, data.params); - var result = provider.send(payload); + if (!jsonrpc.isValidResponse(result)) { + throw InvalidResponse; + } + return result.result; +}; + +/** + * Should be used to asynchronously send request + * + * @method sendAsync + * @param {Object|Array} data + * @param {Function} callback + */ +RequestManager.prototype.sendAsync = function (data, callback) { + var payload = utils.isArray(data) ? jsonrpc.toBatchPayload(data) : jsonrpc.toPayload(data.method, data.params); + this.provider.sendAsync(payload, function (err, result) { + if (err) { + return callback(err); + } + if (!jsonrpc.isValidResponse(result)) { - throw InvalidResponse; + return callback(InvalidResponse); } - return result.result; - }; + callback(null, result.result); + }); +}; - var sendAsync = function (data, callback) { - var payload = utils.isArray(data) ? jsonrpc.toBatchPayload(data) : jsonrpc.toPayload(data.method, data.params); - provider.sendAsync(payload, function (err, result) { - if (err) { - return callback(err); - } - - if (!jsonrpc.isValidResponse(result)) { - return callback(InvalidResponse); - } +/** + * Should be used to set provider of request manager + * + * @method setProvider + * @param {Object} + */ +RequestManager.prototype.setProvider = function (p) { + this.provider = p; +}; - callback(null, result.result); - }); - }; +/*jshint maxparams:4 */ - var setProvider = function (p) { - provider = p; - }; +/** + * Should be used to start polling + * + * @method startPolling + * @param data + * @param pollId + * @param callback + * @param uninstall + * + * @todo cleanup number of params + */ +RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) { + this.polls.push({data: data, id: pollId, callback: callback, uninstall: uninstall}); +}; +/*jshint maxparams:3 */ - /*jshint maxparams:4 */ - var startPolling = function (data, pollId, callback, uninstall) { - polls.push({data: data, id: pollId, callback: callback, uninstall: uninstall}); - }; - /*jshint maxparams:3 */ - - var stopPolling = function (pollId) { - for (var i = polls.length; i--;) { - var poll = polls[i]; - if (poll.id === pollId) { - polls.splice(i, 1); - } +/** + * Should be used to stop polling for filter with given id + * + * @method stopPolling + * @param pollId + */ +RequestManager.prototype.stopPolling = function (pollId) { + for (var i = this.polls.length; i--;) { + var poll = this.polls[i]; + if (poll.id === pollId) { + this.polls.splice(i, 1); } - }; + } +}; - var reset = function () { - polls.forEach(function (poll) { - poll.uninstall(poll.id); +/** + * Should be called to reset polling mechanism of request manager + * + * @method reset + */ +RequestManager.prototype.reset = function () { + this.polls.forEach(function (poll) { + poll.uninstall(poll.id); + }); + this.polls = []; + + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + this.poll(); +}; + +/** + * Should be called to poll for changes on filter with given id + * + * @method poll + */ +RequestManager.prototype.poll = function () { + this.polls.forEach(function (data) { + // send async + sendAsync(data.data, function(error, result){ + if (error || !(isArray(result)) || result.length === 0) { + return; + } + + data.callback(result); }); - polls = []; - - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - poll(); - }; - - var poll = function () { - polls.forEach(function (data) { - // send async - sendAsync(data.data, function(error, result){ - if (error || !(isArray(result)) || result.length === 0) { - return; - } - - data.callback(result); - }); - }); - timeout = setTimeout(poll, c.ETH_POLLING_TIMEOUT); - }; - - poll(); - - return { - send: send, - setProvider: setProvider, - startPolling: startPolling, - stopPolling: stopPolling, - reset: reset - }; + }); + timeout = setTimeout(poll, c.ETH_POLLING_TIMEOUT); }; module.exports = requestManager;