/* 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 . */ /** @file filter.js * @authors: * Jeffrey Wilcke * Marek Kotewicz * Marian Oancea * Gav Wood * @date 2014 */ /// Should be called to check if filter implementation is valid /// @returns true if it is, otherwise false var implementationIsValid = function (i) { return !!i && typeof i.newFilter === 'function' && typeof i.getMessages === 'function' && typeof i.uninstallFilter === 'function' && typeof i.startPolling === 'function' && typeof i.stopPolling === 'function'; }; /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones /// @param should be string or object /// @returns options string or object var getOptions = function (options) { if (typeof options === 'string') { return options; } options = options || {}; if (options.topics) { console.warn('"topics" is deprecated, is "topic" instead'); } // evaluate lazy properties return { to: options.to, topic: options.topic, earliest: options.earliest, latest: options.latest, max: options.max, skip: options.skip, address: options.address }; }; /// Should be used when we want to watch something /// it's using inner polling mechanism and is notified about changes /// @param options are filter options /// @param implementation, an abstract polling implementation /// @param formatter (optional), callback function which formats output before 'real' callback var filter = function(options, implementation, formatter) { if (!implementationIsValid(implementation)) { console.error('filter implemenation is invalid'); return; } options = getOptions(options); var callbacks = []; var filterId = implementation.newFilter(options); var onMessages = function (messages) { messages.forEach(function (message) { message = formatter ? formatter(message) : message; callbacks.forEach(function (callback) { callback(message); }); }); }; implementation.startPolling(filterId, onMessages, implementation.uninstallFilter); var changed = function (callback) { callbacks.push(callback); }; var messages = function () { return implementation.getMessages(filterId); }; var uninstall = function (callback) { implementation.stopPolling(filterId); implementation.uninstallFilter(filterId); callbacks = []; }; return { changed: changed, arrived: changed, happened: changed, messages: messages, logs: messages, uninstall: uninstall }; }; module.exports = filter;