solana-framework
Version:
solana-framework is solana uni-tools for typescript
100 lines • 4.28 kB
JavaScript
;
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