export const BACKOFF_BASE_MS = 30_000; export const BACKOFF_MAX_MS = 60 * 60 * 1000; /** After this many attempts a row is marked failed (a durable, terminal retry record). */ export const MAX_ATTEMPTS = 12; /** Exponential per-row delay after `attempts` failures, capped at one hour. */ export function backoffMs(attempts: number): number { if (attempts <= 0) return 0; return Math.min(BACKOFF_BASE_MS * 2 ** (attempts - 1), BACKOFF_MAX_MS); } export function nextAttemptAt(attempts: number, lastAttemptAt: Date): Date { return new Date(lastAttemptAt.getTime() + backoffMs(attempts)); }