27 lines
714 B
TypeScript
27 lines
714 B
TypeScript
import { setTimeout as delay } from "node:timers/promises";
|
|
|
|
export type BackoffPolicy = {
|
|
initialMs: number;
|
|
maxMs: number;
|
|
factor: number;
|
|
jitter: number;
|
|
};
|
|
|
|
export function computeBackoff(policy: BackoffPolicy, attempt: number) {
|
|
const base = policy.initialMs * policy.factor ** Math.max(attempt - 1, 0);
|
|
const jitter = base * policy.jitter * Math.random();
|
|
return Math.min(policy.maxMs, Math.round(base + jitter));
|
|
}
|
|
|
|
export async function sleepWithAbort(ms: number, abortSignal?: AbortSignal) {
|
|
if (ms <= 0) return;
|
|
try {
|
|
await delay(ms, undefined, { signal: abortSignal });
|
|
} catch (err) {
|
|
if (abortSignal?.aborted) {
|
|
throw new Error("aborted");
|
|
}
|
|
throw err;
|
|
}
|
|
}
|