You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.3 KiB
106 lines
3.3 KiB
import {OperationOptions} from 'retry'; |
|
|
|
declare class AbortErrorClass extends Error { |
|
readonly name: 'AbortError'; |
|
readonly originalError: Error; |
|
|
|
/** |
|
Abort retrying and reject the promise. |
|
|
|
@param message - Error message or custom error. |
|
*/ |
|
constructor(message: string | Error); |
|
} |
|
|
|
declare namespace pRetry { |
|
interface FailedAttemptError extends Error { |
|
readonly attemptNumber: number; |
|
readonly retriesLeft: number; |
|
} |
|
|
|
interface Options extends OperationOptions { |
|
/** |
|
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 = require('p-retry'); |
|
import delay = require('delay'); |
|
|
|
const run = async () => { ... }; |
|
|
|
(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. |
|
*/ |
|
readonly onFailedAttempt?: (error: FailedAttemptError) => void | Promise<void>; |
|
} |
|
|
|
type AbortError = AbortErrorClass; |
|
} |
|
|
|
declare const pRetry: { |
|
/** |
|
Returns a `Promise` that is fulfilled when calling `input` returns a fulfilled promise. If calling `input` returns a rejected promise, `input` is called again until the max retries are reached, it then rejects with the last rejection reason. |
|
|
|
Does not retry on most `TypeErrors`, with the exception of network errors. This is done on a best case basis as different browsers have different [messages](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Checking_that_the_fetch_was_successful) to indicate this. |
|
See [whatwg/fetch#526 (comment)](https://github.com/whatwg/fetch/issues/526#issuecomment-554604080) |
|
|
|
@param input - Receives the number of attempts as the first argument and is expected to return a `Promise` or any value. |
|
@param options - Options are passed to the [`retry`](https://github.com/tim-kos/node-retry#retryoperationoptions) module. |
|
|
|
@example |
|
``` |
|
import pRetry = require('p-retry'); |
|
import fetch from 'node-fetch'; |
|
|
|
const run = async () => { |
|
const response = await fetch('https://sindresorhus.com/unicorn'); |
|
|
|
// Abort retrying if the resource doesn't exist |
|
if (response.status === 404) { |
|
throw new pRetry.AbortError(response.statusText); |
|
} |
|
|
|
return response.blob(); |
|
}; |
|
|
|
(async () => { |
|
console.log(await pRetry(run, {retries: 5})); |
|
|
|
// With the `onFailedAttempt` option: |
|
const result = await pRetry(run, { |
|
onFailedAttempt: error => { |
|
console.log(`Attempt ${error.attemptNumber} failed. There are ${error.retriesLeft} retries left.`); |
|
// 1st request => Attempt 1 failed. There are 4 retries left. |
|
// 2nd request => Attempt 2 failed. There are 3 retries left. |
|
// … |
|
}, |
|
retries: 5 |
|
}); |
|
|
|
console.log(result); |
|
})(); |
|
``` |
|
*/ |
|
<T>( |
|
input: (attemptCount: number) => PromiseLike<T> | T, |
|
options?: pRetry.Options |
|
): Promise<T>; |
|
|
|
AbortError: typeof AbortErrorClass; |
|
|
|
// TODO: remove this in the next major version |
|
default: typeof pRetry; |
|
}; |
|
|
|
export = pRetry;
|
|
|