UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

35 lines (34 loc) • 1.17 kB
export async function withRetry(op, policy, opts = {}) { const maxAttempts = Math.max(1, Math.floor(policy.maxAttempts)); const sleep = opts.sleep ?? ((ms) => new Promise((resolve) => { if (opts.signal?.aborted) return resolve(); let timer; const onAbort = () => { clearTimeout(timer); resolve(); }; timer = setTimeout(() => { opts.signal?.removeEventListener("abort", onAbort); resolve(); }, ms); opts.signal?.addEventListener("abort", onAbort, { once: true }); })); let last = await op(1); for (let attempt = 2; attempt <= maxAttempts; attempt++) { if (last.ok) return last; if (!policy.retryableCodes.includes(last.error.code)) return last; if (opts.signal?.aborted) return last; const wait = policy.backoffMs?.(attempt - 1) ?? 0; if (wait > 0) await sleep(wait); if (opts.signal?.aborted) return last; last = await op(attempt); } return last; }