2026-09-13 14:14:38 -04:00
import { OperationOptions } from 'retry' ;
declare class AbortErrorClass extends Error {
2026-09-12 23:57:45 -04:00
readonly name : 'AbortError' ;
readonly originalError : Error ;
/ * *
2026-09-13 14:14:38 -04:00
Abort retrying and reject the promise .
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
@param message - Error message or custom error .
2026-09-12 23:57:45 -04:00
* /
constructor ( message : string | Error ) ;
}
2026-09-13 14:14:38 -04:00
declare namespace pRetry {
interface FailedAttemptError extends Error {
readonly attemptNumber : number ;
readonly retriesLeft : number ;
}
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
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 .
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
The ` onFailedAttempt ` function can return a promise . For example , to add a [ delay ] ( https : //github.com/sindresorhus/delay):
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
` ` `
import pRetry = require ( 'p-retry' ) ;
import delay = require ( 'delay' ) ;
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
const run = async ( ) = > { . . . } ;
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
( async ( ) = > {
const result = await pRetry ( run , {
onFailedAttempt : async error = > {
console . log ( 'Waiting for 1 second before retrying' ) ;
await delay ( 1000 ) ;
}
} ) ;
} ) ( ) ;
` ` `
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
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 > ;
}
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
type AbortError = AbortErrorClass ;
}
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
declare const pRetry : {
2026-09-12 23:57:45 -04:00
/ * *
2026-09-13 14:14:38 -04:00
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 .
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
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)
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
@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.
2026-09-12 23:57:45 -04:00
@example
` ` `
2026-09-13 14:14:38 -04:00
import pRetry = require ( 'p-retry' ) ;
import fetch from 'node-fetch' ;
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
const run = async ( ) = > {
const response = await fetch ( 'https://sindresorhus.com/unicorn' ) ;
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
// Abort retrying if the resource doesn't exist
if ( response . status === 404 ) {
throw new pRetry . AbortError ( response . statusText ) ;
}
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
return response . blob ( ) ;
} ;
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
( 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 ) ;
} ) ( ) ;
2026-09-12 23:57:45 -04:00
` ` `
* /
2026-09-13 14:14:38 -04:00
< T > (
input : ( attemptCount : number ) = > PromiseLike < T > | T ,
options? : pRetry.Options
) : Promise < T > ;
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
AbortError : typeof AbortErrorClass ;
2026-09-12 23:57:45 -04:00
2026-09-13 14:14:38 -04:00
// TODO: remove this in the next major version
default : typeof pRetry ;
2026-09-12 23:57:45 -04:00
} ;
2026-09-13 14:14:38 -04:00
export = pRetry ;