refactor: share backoff helpers

This commit is contained in:
Peter Steinberger
2026-01-07 23:22:12 +00:00
parent c96f669f2f
commit 11006d1245
4 changed files with 118 additions and 91 deletions

View File

@@ -1,12 +1,10 @@
import { randomUUID } from "node:crypto";
import type { ClawdbotConfig } from "../config/config.js";
import type { BackoffPolicy } from "../infra/backoff.js";
import { computeBackoff, sleepWithAbort } from "../infra/backoff.js";
export type ReconnectPolicy = {
initialMs: number;
maxMs: number;
factor: number;
jitter: number;
export type ReconnectPolicy = BackoffPolicy & {
maxAttempts: number;
};
@@ -51,35 +49,7 @@ export function resolveReconnectPolicy(
return merged;
}
export function computeBackoff(policy: ReconnectPolicy, 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 function sleepWithAbort(ms: number, abortSignal?: AbortSignal) {
if (ms <= 0) return Promise.resolve();
return new Promise<void>((resolve, reject) => {
const timer = setTimeout(() => {
cleanup();
resolve();
}, ms);
const onAbort = () => {
cleanup();
reject(new Error("aborted"));
};
const cleanup = () => {
clearTimeout(timer);
abortSignal?.removeEventListener("abort", onAbort);
};
if (abortSignal) {
abortSignal.addEventListener("abort", onAbort, { once: true });
}
});
}
export { computeBackoff, sleepWithAbort };
export function newConnectionId() {
return randomUUID();