mana-common
Version:
Common utils for mana
40 lines (35 loc) • 1.16 kB
text/typescript
/* 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: number, token = CancellationToken.None): Promise<void> {
const deferred = new Deferred<void>();
const handle = setTimeout(() => deferred.resolve(), ms);
token.onCancellationRequested(() => {
clearTimeout(handle);
deferred.reject(cancelled());
});
return deferred.promise;
}
export async function retry<T>(
task: () => Promise<T>,
delay: number,
retries: number,
): Promise<T | undefined> {
let lastError: Error | undefined;
for (let i = 0; i < retries; i += 1) {
try {
// eslint-disable-next-line no-await-in-loop
return await task();
} catch (error: any) {
lastError = error;
// eslint-disable-next-line no-await-in-loop
await timeout(delay);
}
}
// eslint-disable-next-line @typescript-eslint/no-throw-literal
throw lastError;
}