rubic-sdk
Version:
Simplify dApp creation
116 lines • 6.13 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Web3PublicService = void 0;
const lodash_clonedeep_1 = __importDefault(require("lodash.clonedeep"));
const errors_1 = require("../../../common/errors");
const p_timeout_1 = __importDefault(require("../../../common/utils/p-timeout"));
const tron_web_1 = require("../constants/tron/tron-web");
const blockchain_name_1 = require("../models/blockchain-name");
const web3_public_storage_1 = require("./models/web3-public-storage");
const evm_web3_public_1 = require("./web3-public/evm-web3-public/evm-web3-public");
const tron_web3_public_1 = require("./web3-public/tron-web3-public/tron-web3-public");
const web3_1 = __importDefault(require("web3"));
class Web3PublicService {
static isSupportedBlockchain(blockchain) {
return web3_public_storage_1.web3PublicSupportedBlockchains.some(supportedBlockchain => supportedBlockchain === blockchain);
}
constructor(rpcProvider) {
this.rpcProvider = rpcProvider;
this.createWeb3Public = this.setCreateWeb3Public();
this.web3PublicStorage = this.createWeb3PublicStorage();
}
getWeb3Public(blockchainName) {
if (!Web3PublicService.isSupportedBlockchain(blockchainName)) {
throw new errors_1.RubicSdkError(`Blockchain ${blockchainName} is not supported in web3 public.`);
}
const web3Public = this.web3PublicStorage[blockchainName];
if (!web3Public) {
throw new errors_1.RubicSdkError(`Provider for ${blockchainName} was not initialized. Pass rpc link for this blockchain to sdk configuration object.`);
}
return web3Public;
}
setCreateWeb3Public() {
return {
...Object.values(blockchain_name_1.EVM_BLOCKCHAIN_NAME).reduce((acc, evmBlockchainName) => ({
...acc,
[evmBlockchainName]: this.createEvmWeb3PublicProxy.bind(this)
}), {}),
[blockchain_name_1.BLOCKCHAIN_NAME.TRON]: this.createTronWeb3PublicProxy.bind(this)
};
}
createWeb3PublicStorage() {
return Object.keys(this.rpcProvider).reduce((acc, blockchainName) => {
if (!Web3PublicService.isSupportedBlockchain(blockchainName)) {
console.debug(`Blockchain ${blockchainName} is not supported in web3 public.`);
return acc;
}
return {
...acc,
[blockchainName]: this.createWeb3Public[blockchainName](blockchainName)
};
}, {});
}
createEvmWeb3PublicProxy(blockchainName) {
const rpcProvider = this.rpcProvider[blockchainName];
const evmWeb3Public = new evm_web3_public_1.EvmWeb3Public(new web3_1.default(rpcProvider.rpcList[0]), blockchainName);
return this.createWeb3PublicProxy(blockchainName, evmWeb3Public);
}
createTronWeb3PublicProxy() {
const rpcProvider = this.rpcProvider[blockchain_name_1.BLOCKCHAIN_NAME.TRON];
const tronWeb3Public = new tron_web3_public_1.TronWeb3Public(new tron_web_1.TronWeb(rpcProvider.rpcList[0]));
return this.createWeb3PublicProxy(blockchain_name_1.BLOCKCHAIN_NAME.TRON, tronWeb3Public);
}
createWeb3PublicProxy(blockchainName, web3Public) {
const rpcProvider = this.rpcProvider[blockchainName];
return new Proxy(web3Public, {
get(target, prop) {
if (prop === 'setProvider') {
return target[prop].bind(target);
}
if (typeof target[prop] === 'function') {
return async function method(...params) {
const curRpc = rpcProvider.rpcList[0];
if (!curRpc) {
throw new errors_1.RubicSdkError(`There is no working rpc left for ${blockchainName}.`);
}
const methodParams = (0, lodash_clonedeep_1.default)(params);
const callMethod = () => target[prop].call(target, ...params);
try {
const result = await (0, p_timeout_1.default)(callMethod(), rpcProvider.mainRpcTimeout ||
Web3PublicService.mainRpcDefaultTimeout);
if (prop === 'healthCheck' && result === false) {
throw new errors_1.HealthcheckError();
}
return result;
}
catch (e) {
const rpcString = typeof curRpc === 'string' ? curRpc : curRpc.fullHost;
if (e instanceof errors_1.TimeoutError ||
e instanceof errors_1.HealthcheckError ||
e.message?.toLowerCase().includes(rpcString.toLowerCase())) {
if (curRpc === rpcProvider.rpcList[0]) {
rpcProvider.rpcList.shift();
if (!rpcProvider.rpcList.length) {
throw new errors_1.RubicSdkError(`There is no working rpc left for ${blockchainName}.`);
}
const nextRpc = rpcProvider.rpcList[0];
web3Public.setProvider(nextRpc);
console.debug(`Rpc provider for ${blockchainName} is changed to ${nextRpc}.`);
}
return method(...methodParams);
}
throw e;
}
};
}
return target[prop];
}
});
}
}
exports.Web3PublicService = Web3PublicService;
Web3PublicService.mainRpcDefaultTimeout = 10000;
//# sourceMappingURL=web3-public-service.js.map
;