UNPKG

@parity/api

Version:

The Parity Promise-based API library for interfacing with Ethereum over RPC

82 lines (65 loc) 2.19 kB
// Copyright 2015-2019 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 <http://www.gnu.org/licenses/>. const Eth = require('./eth'); const Parity = require('./parity'); const Net = require('./net'); const Signer = require('./signer'); const { isFunction } = require('../util/types'); class PubSub { constructor (provider) { if (!provider || !isFunction(provider.subscribe)) { throw new Error('Pubsub API needs transport with subscribe() function defined. (WebSocket)'); } this._eth = new Eth(provider); this._net = new Net(provider); this._parity = new Parity(provider); this._signer = new Signer(provider); } get net () { return this._net; } get eth () { return this._eth; } get parity () { return this._parity; } get signer () { return this._signer; } unsubscribe (subscriptionIds) { // subscriptions are namespace independent. Thus we can simply removeListener from any. return this._parity.removeListener(subscriptionIds); } subscribeAndGetResult (f, callback) { return new Promise((resolve, reject) => { let isFirst = true; let onSubscription = (error, data) => { const p1 = error ? Promise.reject(error) : Promise.resolve(data); const p2 = p1.then(callback); if (isFirst) { isFirst = false; p2 .then(resolve) .catch(reject); } }; try { f.call(this, onSubscription).catch(reject); } catch (err) { reject(err); } }); } } module.exports = PubSub;