@ton/ton
Version:
[](https://www.npmjs.com/package/ton)
63 lines (62 loc) • 1.94 kB
JavaScript
;
/**
* Copyright (c) Whales Corp.
* All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exponentialBackoffDelay = exponentialBackoffDelay;
exports.delay = delay;
exports.delayBreakable = delayBreakable;
exports.forever = forever;
exports.backoff = backoff;
function exponentialBackoffDelay(currentFailureCount, minDelay, maxDelay, maxFailureCount) {
let maxDelayRet = minDelay + ((maxDelay - minDelay) / maxFailureCount) * Math.max(currentFailureCount, maxFailureCount);
return Math.round(Math.random() * maxDelayRet);
}
async function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function delayBreakable(ms) {
// We can cancel delay from outer code
let promiseResolver = null;
let resolver = () => {
if (promiseResolver) {
promiseResolver();
}
};
let promise = new Promise(resolve => {
promiseResolver = resolve;
setTimeout(resolve, ms);
});
return { promise, resolver };
}
const promise = new Promise(() => { });
function forever() {
return promise;
}
async function backoff(callback, log) {
let currentFailureCount = 0;
const minDelay = 500;
const maxDelay = 15000;
const maxFailureCount = 50;
while (true) {
try {
return await callback();
}
catch (e) {
if (currentFailureCount > 3) {
if (log) {
console.warn(e);
}
}
if (currentFailureCount < maxFailureCount) {
currentFailureCount++;
}
let waitForRequest = exponentialBackoffDelay(currentFailureCount, minDelay, maxDelay, maxFailureCount);
await delay(waitForRequest);
}
}
}