UNPKG

@pgchain/blockchain-libs

Version:
145 lines (144 loc) 6.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProviderController = void 0; const precondtion_1 = require("../basic/precondtion"); const promise_plus_1 = require("../basic/promise-plus"); const IMPLS = { algo: require('./chains/algo'), cfx: require('./chains/cfx'), cosmos: require('./chains/cosmos'), eth: require('./chains/eth'), sol: require('./chains/sol'), stc: require('./chains/stc'), near: require('./chains/near'), btc: require('./chains/btc'), bch: require('./chains/bch'), ltc: require('./chains/btc'), doge: require('./chains/btc'), btg: require('./chains/btc'), dgb: require('./chains/btc'), nmc: require('./chains/btc'), vtc: require('./chains/btc'), dash: require('./chains/btc'), trx: require('./chains/trx'), }; class ProviderController { constructor(chainSelector) { this.clientsCache = {}; this.lastClientCache = {}; this.chainSelector = chainSelector; } async getClient(chainCode, filter) { filter = filter || (() => true); const [lastClient, expiredAt] = this.lastClientCache[chainCode] || []; if (typeof lastClient !== undefined && expiredAt <= Date.now() && filter(lastClient)) { return Promise.resolve(lastClient); } let clients = this.clientsCache[chainCode]; if (!clients || clients.length === 0) { const chainInfo = this.chainSelector(chainCode); const module = this.requireChainImpl(chainInfo.impl); clients = chainInfo.clients .map((config) => [module[config.name], config]) .filter(([clazz, _]) => typeof clazz != 'undefined') .map(([clazz, config]) => new clazz(...config.args)); for (const client of clients) { client.setChainInfo(chainInfo); } this.clientsCache[chainCode] = clients; } let client = undefined; try { client = await Promise.race([ (0, promise_plus_1.createAnyPromise)(clients.filter(filter).map(async (candidate) => { const info = await candidate.getInfo(); if (!info.isReady) { throw Error(`${candidate.constructor.name}<${candidate}> is not ready.`); } return candidate; })), (0, promise_plus_1.createDelayPromise)(10000, undefined), ]); } catch (e) { console.error(e); } if (typeof client === 'undefined') { throw Error('No available client'); } this.lastClientCache[chainCode] = [client, Date.now() + 300000]; // Expired at 5 minutes return client; } getProvider(chainCode) { const chainInfo = this.chainSelector(chainCode); const { Provider } = this.requireChainImpl(chainInfo.impl); return Promise.resolve(new Provider(chainInfo, (filter) => this.getClient(chainCode, filter))); } requireChainImpl(impl) { return (0, precondtion_1.checkIsDefined)(IMPLS[impl]); } getInfo(chainCode) { return this.getClient(chainCode).then((client) => client.getInfo()); } getAddresses(chainCode, address) { return this.getClient(chainCode).then((client) => client.getAddresses(address)); } async getBalances(chainCode, requests) { return this.getClient(chainCode).then((client) => client.getBalances(requests)); } getTransactionStatuses(chainCode, txids) { return this.getClient(chainCode).then((client) => client.getTransactionStatuses(txids)); } getFeePricePerUnit(chainCode) { return this.getClient(chainCode).then((client) => client.getFeePricePerUnit()); } broadcastTransaction(chainCode, rawTx) { return this.getClient(chainCode).then((client) => client.broadcastTransaction(rawTx)); } getTokenInfos(chainCode, tokenAddresses) { return this.getClient(chainCode).then((client) => client.getTokenInfos(tokenAddresses)); } getUTXOs(chainCode, address) { return this.getClient(chainCode).then((provider) => provider.getUTXOs(address)); } buildUnsignedTx(chainCode, unsignedTx) { return this.getProvider(chainCode).then((provider) => provider.buildUnsignedTx(unsignedTx)); } pubkeyToAddress(chainCode, verifier, encoding) { return this.getProvider(chainCode).then((provider) => provider.pubkeyToAddress(verifier, encoding)); } signTransaction(chainCode, unsignedTx, signers) { return this.getProvider(chainCode).then((provider) => provider.signTransaction(unsignedTx, signers)); } verifyAddress(chainCode, address) { return this.getProvider(chainCode).then((provider) => provider.verifyAddress(address)); } verifyTokenAddress(chainCode, address) { return this.getProvider(chainCode).then((provider) => provider.verifyTokenAddress(address)); } signMessage(chainCode, message, signer, address) { return this.getProvider(chainCode).then((provider) => provider.signMessage(message, signer, address)); } verifyMessage(chainCode, address, message, signature) { return this.getProvider(chainCode).then((provider) => provider.verifyMessage(address, message, signature)); } hardwareGetXpubs(chainCode, paths, showOnDevice = true) { return this.getProvider(chainCode).then((provider) => provider.hardwareGetXpubs(paths, showOnDevice)); } hardwareGetAddress(chainCode, path, showOnDevice = true, addressToVerify) { return this.getProvider(chainCode).then((provider) => provider.hardwareGetAddress(path, showOnDevice, addressToVerify)); } hardwareSignTransaction(chainCode, unsignedTx, signers) { return this.getProvider(chainCode).then((provider) => provider.hardwareSignTransaction(unsignedTx, signers)); } hardwareSignMessage(chainCode, message, signer) { return this.getProvider(chainCode).then((provider) => provider.hardwareSignMessage(message, signer)); } hardwareVerifyMessage(chainCode, address, message, signature) { return this.getProvider(chainCode).then((provider) => provider.hardwareVerifyMessage(address, message, signature)); } } exports.ProviderController = ProviderController; //# sourceMappingURL=index.js.map