UNPKG

mana-common

Version:

Common utils for mana

34 lines (29 loc) 1.03 kB
/* eslint-disable @typescript-eslint/no-explicit-any */ import { CancellationToken, cancelled } from './cancellation'; import { Deferred } from './deferred'; /** * @returns resolves after a specified number of milliseconds * @throws cancelled if a given token is cancelled before a specified number of milliseconds */ export function timeout(ms, token = CancellationToken.None) { const deferred = new Deferred(); const handle = setTimeout(() => deferred.resolve(), ms); token.onCancellationRequested(() => { clearTimeout(handle); deferred.reject(cancelled()); }); return deferred.promise; } export async function retry(task, delay, retries) { let lastError; for (let i = 0; i < retries; i += 1) { try { // eslint-disable-next-line no-await-in-loop return await task(); } catch (error) { lastError = error; // eslint-disable-next-line no-await-in-loop await timeout(delay); } } // eslint-disable-next-line @typescript-eslint/no-throw-literal throw lastError; }