UNPKG

@sen-use/web3

Version:
87 lines (86 loc) 4.37 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAccountDataSmart = exports.getMultipleAccounts = void 0; const GET_MULTIPLE_ACCOUNTS_LIMIT = 99; function getMultipleAccountsCore(connection, publicKeys, commitmentOverride) { return __awaiter(this, void 0, void 0, function* () { const commitment = commitmentOverride !== null && commitmentOverride !== void 0 ? commitmentOverride : connection.commitment; const accounts = yield connection.getMultipleAccountsInfo(publicKeys, commitment); return accounts.map((account, idx) => { if (account === null) { return null; } return { publicKey: publicKeys[idx], account, }; }); }); } function chunks(array, size) { return Array.apply(0, new Array(Math.ceil(array.length / size))).map((_, index) => array.slice(index * size, (index + 1) * size)); } function getMultipleAccounts(connection, publicKeys, commitment) { return __awaiter(this, void 0, void 0, function* () { if (publicKeys.length <= GET_MULTIPLE_ACCOUNTS_LIMIT) { return yield getMultipleAccountsCore(connection, publicKeys, commitment); } else { const batches = chunks(publicKeys, GET_MULTIPLE_ACCOUNTS_LIMIT); const results = yield Promise.all(batches.map((batch) => getMultipleAccountsCore(connection, batch, commitment))); return results.flat(); } }); } exports.getMultipleAccounts = getMultipleAccounts; /** * STORES */ let processStores = new Array(); let processCache = new Map(); function getAccountDataSmart(params, parseData) { return __awaiter(this, void 0, void 0, function* () { const { connection, publicKey, commitment = 'confirmed', debounce = 500, } = params; const cacheKey = publicKey.toBase58(); if (!processCache.has(cacheKey)) { const newProcess = new Promise((resolve, reject) => { function fetchData() { return __awaiter(this, void 0, void 0, function* () { const processes = processStores; processStores = []; processCache = new Map(); const accounts = yield getMultipleAccounts(connection, processes.map((e) => e.publicKey), commitment); for (let i = 0; i < processes.length; i++) { const process = processes[i]; try { const acc = accounts[i]; if (!(acc === null || acc === void 0 ? void 0 : acc.account.data)) throw new Error('Invalid Data'); const accData = parseData(acc === null || acc === void 0 ? void 0 : acc.account.data); process.resolve({ publicKey: process.publicKey, data: accData }); } catch (error) { process.resolve({ publicKey: process.publicKey, data: null }); } } }); } if (!processStores.length) setTimeout(() => __awaiter(this, void 0, void 0, function* () { return fetchData(); }), debounce); processStores.push({ publicKey, resolve, reject }); }); processCache.set(cacheKey, newProcess); } return processCache.get(cacheKey); }); } exports.getAccountDataSmart = getAccountDataSmart;