@clappr/retry-utils v1.3.2
Retry Utils
This lib aims to apply retry patterns for various needed situations. The definitions were inspired by the retry implementation of Shaka Player.
$ npm i retry-utilsUsage
retryPromise - Implements retries for a callback function with exponential backoff, returning a resolved promise if successeded and a rejected promise if doesn't.
Configuration:
retryParameters: {
action: 'Callback to be executed', (*)
maxAttempts: 'The maximum number of attempts that should be retried'
baseDelay: 'The delay before the first retry, in milliseconds',
backOffFactor: 'The multiplier for successive retry delays'
retryableErrors: 'A array specifying which HTTP status should be at retry flow' (**)
}(*) Mandatory fields.
(**) To use the retryableErrors property you must pass the status code into the error object, like demonstrated in Examples section (getSomething method).
The retryPromise method apply a fuzz factor of 50% in either direction. So if the ideal delay is 1000ms, the actual delay will be randomly chosen between 500ms and 1500ms.
The returned promise should have the follow content:
When resolved: A object with the resource and the retry history flow, like:
{
retryResponse: 'Hey! I as successfull in the third attempt!'
retryHistory: [
attempt_1 : { retryError: 'Failed at first' },
attempt_2 : { retryError: 'Failed at second' }
]
}When rejected: A object with the error and the retry history flow, like:
{
retryError: 'Failed at my last attempt, sorry :('
retryHistory: [
attempt_1 : { retryError: 'Failed at first' },
attempt_2 : { retryError: 'Failed at second' },
attempt_3 : { retryError: 'Failed at my last attempt, sorry :(' }
]
}Examples:
retryPromise:
import { retryPromise } from 'retry-utils'
const getSomething = () => {
return fetch(`http://httpbin.org/status/500`)
.then((response) => {
if (response.ok) return response
throw new Error({ statusCode: response.status })
})
}
let retryParameters: {
action: getSomething,
maxAttempts: 5,
baseDelay: 1000,
backOffFactor: 3,
retryableErrors: [500, 501, 502]
}
retryPromise(retryParameters)
.then((data) => console.log('Retry success ', data))
.catch((error) => console.log('Retry error ', error))