From 67c298197597827620505e5e254cf6951240e73e Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 9 Jan 2017 18:02:59 +0100 Subject: [PATCH] subscribeToEvent -> subscribeToEvents --- js/src/contracts/verification.js | 4 +- js/src/util/subscribe-to-event.js | 77 ------------------------ js/src/util/subscribe-to-events.js | 97 ++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 79 deletions(-) delete mode 100644 js/src/util/subscribe-to-event.js create mode 100644 js/src/util/subscribe-to-events.js diff --git a/js/src/contracts/verification.js b/js/src/contracts/verification.js index 05b7ea35f..af2f3b3a7 100644 --- a/js/src/contracts/verification.js +++ b/js/src/contracts/verification.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import subscribeToEvent from '../util/subscribe-to-event'; +import subscribeToEvents from '../util/subscribe-to-events'; export const checkIfVerified = (contract, account) => { return contract.instance.certified.call({}, [account]); @@ -72,7 +72,7 @@ export const awaitPuzzle = (api, contract, account) => { return blockNumber(api) .then((block) => { return new Promise((resolve, reject) => { - const subscription = subscribeToEvent(contract, 'Puzzled', { + const subscription = subscribeToEvents(contract, 'Puzzled', { from: block.toNumber(), filter: (log) => log.params.who.value === account }); diff --git a/js/src/util/subscribe-to-event.js b/js/src/util/subscribe-to-event.js deleted file mode 100644 index 36d1f6d55..000000000 --- a/js/src/util/subscribe-to-event.js +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2015, 2016 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity 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 General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -import EventEmitter from 'eventemitter3'; - -const defaults = { - from: 0, // TODO - to: 'latest', - timeout: null, - filter: () => true -}; - -const subscribeToEvent = (contract, name, opt = {}) => { - opt = Object.assign({}, defaults, opt); - - let subscription = null; - let timeout = null; - - const unsubscribe = () => { - if (subscription) { - contract.unsubscribe(subscription); - subscription = null; - } - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - }; - - const emitter = new EventEmitter(); - emitter.unsubscribe = unsubscribe; - - if (typeof opt.timeout === 'number') { - timeout = setTimeout(() => { - unsubscribe(); - emitter.emit('timeout'); - }, opt.timeout); - } - - const callback = (err, logs) => { - if (err) { - return emitter.emit('error', err); - } - for (let log of logs) { - if (opt.filter(log)) { - emitter.emit('log', log); - } - } - }; - - contract.subscribe(name, { - fromBlock: opt.from, toBlock: opt.to - }, callback) - .then((_subscription) => { - subscription = _subscription; - }) - .catch((err) => { - emitter.emit('error', err); - }); - - return emitter; -}; - -export default subscribeToEvent; diff --git a/js/src/util/subscribe-to-events.js b/js/src/util/subscribe-to-events.js new file mode 100644 index 000000000..48c990277 --- /dev/null +++ b/js/src/util/subscribe-to-events.js @@ -0,0 +1,97 @@ +// Copyright 2015, 2016 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import EventEmitter from 'eventemitter3'; + +const defaults = { + from: 0, + to: 'latest', + interval: 5000, + filter: () => true +}; + +const subscribeToEvents = (contract, events, opt = {}) => { + const { api } = contract; + opt = Object.assign({}, defaults, opt); + + let filter = null; + let interval = null; + + const unsubscribe = () => { + if (filter) { + filter + .then((filterId) => { + return api.eth.uninstallFilter(filterId); + }) + .catch((err) => { + emitter.emit('error', err); + }); + filter = null; + } + if (interval) { + clearInterval(interval); + interval = null; + } + }; + + const emitter = new EventEmitter(); + emitter.unsubscribe = unsubscribe; + + const fetcher = (method, filterId) => () => { + api + .eth[method](filterId) + .then((logs) => { + logs = contract.parseEventLogs(logs); + + for (let log of logs) { + if (opt.filter(log)) { + emitter.emit('log', log); + emitter.emit(log.event, log); + } + } + }) + .catch((err) => { + emitter.emit('error', err); + }); + }; + + const signatures = events + .filter((event) => contract.instance[event]) + .map((event) => contract.instance[event].signature); + + filter = api.eth + .newFilter({ + fromBlock: opt.from, toBlock: opt.to, + address: contract.address, + topics: [signatures] + }) + .then((filterId) => { + fetcher('getFilterLogs', filterId)(); // fetch immediately + + const fetchChanges = fetcher('getFilterChanges', filterId); + interval = setInterval(fetchChanges, opt.interval); + + return filterId; + }) + .catch((err) => { + emitter.emit('error', err); + throw err; // reject Promise + }); + + return emitter; +}; + +export default subscribeToEvents;