@sema-agent/core
Version:
Stateless, task-oriented AI agent core
35 lines (34 loc) • 1.17 kB
JavaScript
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;
}