fauna
Version:
A driver to query Fauna databases in browsers, Node.js, and other Javascript runtimes
42 lines (38 loc) • 889 B
text/typescript
export type RetryOptions = {
maxAttempts: number;
maxBackoff: number;
shouldRetry?: (error: any) => boolean;
attempt?: number;
sleepFn?: (callback: (args: void) => void, ms?: number) => void;
};
export const withRetries = async <T>(
fn: () => Promise<T>,
{
maxAttempts,
maxBackoff,
shouldRetry = () => true,
attempt = 0,
sleepFn = setTimeout,
}: RetryOptions,
): Promise<T> => {
const backoffMs =
attempt > 0
? Math.min(Math.random() * 2 ** attempt, maxBackoff) * 1_000
: 0;
attempt += 1;
try {
return await fn();
} catch (error: any) {
if (attempt >= maxAttempts || shouldRetry(error) !== true) {
throw error;
}
await new Promise((resolve) => sleepFn(resolve, backoffMs));
return withRetries(fn, {
maxAttempts,
maxBackoff,
shouldRetry,
attempt,
sleepFn,
});
}
};