@lpezet/p-retry-ts
Version:
Retry a promise-returning or async function
81 lines (65 loc) • 2.68 kB
TypeScript
import { type OperationOptions } from 'retry';
export declare class AbortError extends Error {
originalError: Error;
constructor(message: string | Error);
}
export declare class FailedAttemptError extends Error {
attemptNumber: number;
retriesLeft: number;
cause?: Error;
constructor(cause?: Error);
}
export type Options = {
/**
Callback invoked on each retry. Receives the error thrown by `input` as the first argument with properties `attemptNumber` and `retriesLeft` which indicate the current attempt number and the number of attempts left, respectively.
The `onFailedAttempt` function can return a promise. For example, to add a [delay](https://github.com/sindresorhus/delay):
```
import pRetry from 'p-retry';
import delay from 'delay';
const run = async () => { ... };
const result = await pRetry(run, {
onFailedAttempt: async error => {
console.log('Waiting for 1 second before retrying');
await delay(1000);
}
});
```
If the `onFailedAttempt` function throws, all retries will be aborted and the original promise will reject with the thrown error.
*/
onFailedAttempt?: (error: FailedAttemptError) => void | Promise<void>;
/**
Decide if a retry should occur based on the error. Returning true triggers a retry, false aborts with the error.
It is not called for `TypeError` (except network errors) and `AbortError`.
@param error - The error thrown by the input function.
@example
```
import pRetry from 'p-retry';
const run = async () => { … };
const result = await pRetry(run, {
shouldRetry: error => !(error instanceof CustomError);
});
```
In the example above, the operation will be retried unless the error is an instance of `CustomError`.
*/
shouldRetry?: (error: FailedAttemptError) => boolean | Promise<boolean>;
/**
You can abort retrying using [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).
```
import pRetry from 'p-retry';
const run = async () => { … };
const controller = new AbortController();
cancelButton.addEventListener('click', () => {
controller.abort(new Error('User clicked cancel button'));
});
try {
await pRetry(run, {signal: controller.signal});
} catch (error) {
console.log(error.message);
//=> 'User clicked cancel button'
}
```
*/
signal?: AbortSignal;
retries?: number;
} & OperationOptions;
export default function pRetry<T>(input: (attemptCount: number) => PromiseLike<T> | T, options?: Options): Promise<T>;