37 lines
1011 B
JavaScript
37 lines
1011 B
JavaScript
import { delay } from '../promise/delay.mjs';
|
|
|
|
const DEFAULT_DELAY = 0;
|
|
const DEFAULT_RETRIES = Number.POSITIVE_INFINITY;
|
|
async function retry(func, _options) {
|
|
let delay$1;
|
|
let retries;
|
|
let signal;
|
|
if (typeof _options === 'number') {
|
|
delay$1 = DEFAULT_DELAY;
|
|
retries = _options;
|
|
signal = undefined;
|
|
}
|
|
else {
|
|
delay$1 = _options?.delay ?? DEFAULT_DELAY;
|
|
retries = _options?.retries ?? DEFAULT_RETRIES;
|
|
signal = _options?.signal;
|
|
}
|
|
let error;
|
|
for (let attempts = 0; attempts < retries; attempts++) {
|
|
if (signal?.aborted) {
|
|
throw error ?? new Error(`The retry operation was aborted due to an abort signal.`);
|
|
}
|
|
try {
|
|
return await func();
|
|
}
|
|
catch (err) {
|
|
error = err;
|
|
const currentDelay = typeof delay$1 === 'function' ? delay$1(attempts) : delay$1;
|
|
await delay(currentDelay);
|
|
}
|
|
}
|
|
throw error;
|
|
}
|
|
|
|
export { retry };
|