File size: 758 Bytes
c09f67c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | export async function withRetry<TResult>(
fn: (attempt: number) => TResult | Promise<TResult>,
{
maxRetries = 1,
onError,
delay,
}: {
maxRetries?: number;
onError?(error: unknown, attempt: number): boolean | undefined;
delay?: number;
} = {},
) {
let retries = 0;
let lastError: unknown;
while (retries <= maxRetries) {
if (delay && retries > 0) {
await new Promise((resolve) => setTimeout(resolve, delay));
}
try {
const res = await fn(retries);
return res;
} catch (err) {
lastError = err;
if (onError) {
const shouldRetry = onError(err, retries);
if (!shouldRetry) {
break;
}
}
retries++;
}
}
throw lastError;
}
|