@pgchain/blockchain-libs
Version:
PGWallet Blockchain Libs
145 lines (144 loc) • 6.47 kB
JavaScript
;
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