UNPKG

solana-framework

Version:

solana-framework is solana uni-tools for typescript

100 lines 4.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Retry = void 0; class Retry { static withMerge(targets, maxErrorCount = Retry.DEFAULT_MAX_ERROR_LIMIT, everyErrorWaitMS = Retry.DEFAULT_TIMEOUT_MS) { if (targets.length === 0) { throw new Error(`[Retry.withMerge] [ERROR] targets must > 0`); } if (targets.some(proxy => !proxy)) { throw new Error("[Retry.withMerge] [ERROR] targets has none!"); } return new Proxy(targets[0], { get(_, name) { let target = targets.find(proxy => name in proxy); if (target === undefined) return undefined; if (typeof target[name] === 'function') { const func = target[name].bind(target); return function (...args) { let result = func(...args); if (Retry.isPromise(result)) { let count = 0; const attempt = async (param) => { try { return await (param ?? func(...args)); } catch (e) { if (count++ < maxErrorCount) { console.log(`[Proxy] [ERROR] ${name}() => ${e}`); await new Promise(resolve => setTimeout(resolve, everyErrorWaitMS)); return attempt(); } else { throw e; } } }; return attempt(result); } return result; }; } return target[name]; }, }); } static withIterator(targets, maxErrorCount = Retry.DEFAULT_MAX_ERROR_LIMIT, everyErrorWaitMS = Retry.DEFAULT_TIMEOUT_MS) { if (targets.length === 0) { throw new Error("targets must > 0"); } if (targets.some(proxy => !proxy)) { throw new Error("targets has none!"); } const baseTarget = targets[0]; let index = 0; return new Proxy(baseTarget, { get(_, name) { if (typeof baseTarget[name] === 'function') { return function (...args) { const result = targets[index++ % targets.length][name](...args); if (Retry.isPromise(result)) { let count = 0; const attempt = async (param) => { try { return await (param ?? targets[index++ % targets.length][name](...args)); } catch (e) { if (count++ < maxErrorCount) { console.log(`[Retry.iterate] [ERROR] ${name}() => ${e}`); await new Promise(resolve => setTimeout(resolve, everyErrorWaitMS)); return attempt(); } else { throw e; } } }; return attempt(result); } return result; }; } return baseTarget[name]; }, }); } } exports.Retry = Retry; Retry.DEFAULT_MAX_ERROR_LIMIT = 5; Retry.DEFAULT_TIMEOUT_MS = 200; Retry.isPromise = (value) => { return value && typeof value.then === 'function' && typeof value.catch === 'function'; }; Retry.bigintReplacer = (_, value) => { if (typeof value === 'bigint') { return value.toString(); } return value; }; //# sourceMappingURL=Retry.js.map