UNPKG

@ton/ton

Version:

[![Version npm](https://img.shields.io/npm/v/ton.svg?logo=npm)](https://www.npmjs.com/package/ton)

63 lines (62 loc) 1.94 kB
"use strict"; /** * 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); } } }