Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sjinks/node-fetch-retry-ts
Adds retry functionality to fetch()
https://github.com/sjinks/node-fetch-retry-ts
fetch fetch-api node nodejs retry retry-request
Last synced: 11 days ago
JSON representation
Adds retry functionality to fetch()
- Host: GitHub
- URL: https://github.com/sjinks/node-fetch-retry-ts
- Owner: sjinks
- License: mit
- Created: 2020-05-21T23:42:10.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-04-23T03:04:58.000Z (7 months ago)
- Last Synced: 2024-04-24T03:16:52.684Z (7 months ago)
- Topics: fetch, fetch-api, node, nodejs, retry, retry-request
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/fetch-retry-ts
- Size: 2.17 MB
- Stars: 6
- Watchers: 3
- Forks: 3
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome - sjinks/node-fetch-retry-ts - Adds retry functionality to fetch() (TypeScript)
README
# fetch-retry-ts
![Build and Test CI](https://github.com/sjinks/node-fetch-retry-ts/workflows/Build%20and%20Test%20CI/badge.svg)
Adds retry functionality to `fetch()`.
## Installation
```bash
npm install fetch-retry-ts
```## Usage
```typescript
import originalFetch from 'isomorphic-fetch';
import fetchBuilder from 'fetch-retry-ts';const options = {
retries: 3,
retryDelay: 1000,
retryOn: [419, 503, 504],
};const fetch = fetchBuilder(originalFetch, options);
fetch('https://example.com/').then(/* ... */);
````fetch-retry-ts` exports a function, which is used to build the new `fetch()`-compatible function supporting the retry logic.
It accepts two arguments:
* `fetch` (required): the original `fetch()` function (from `isomorphic-fetch` etc)
* `defaults` (optional): default values for the retry logic:
* `retries?: number`: number of attempts to make (3 by default);
* `retryDelay?: number | () => number | (attempt: number, error: Error | null, response: Response | null) => number`: delay between attempts (in ms). If specified as a function, the function accepts the following parameters:
* `attempt`: the number of the current attempt;
* `error`: `Error` object coming from `fetch()` when it rejects on a network failure, or `null`;
* `response`: `Response` or `null` if `error !== null`
It should return an integer, which is treated as the delay in ms before the enxt attempt is made. The default value for `retryDelay` is `1000`.
* `retryOn?: number[] | (attempt: number, retries: number, error: Error | null, response: Response | null) => boolean`: if specified as an array of integers, it is treated as a list of HTTP codes which trigger retry. When specified as a function, that functoin accepts the same parameters as the one described in `retryDelay`, and an additional parameter called `retries`, whcih is the number of configured retries. The function should return a truthy value if the request should be retried. *If `retryOn` is a function, `retries` is ignored.* The default value for `retryOn` in `[429, 503, 504]`.
It returns a function to be used instead of `fetch()`.The returned function accepts the same arguments as `fetch(input: RequestInfo, init?: RequestInit)`, and three additional properties in `init` object. Those are `retries`, `retryDelay`, and `retryOn`.
## Examples
### Retry on any 5xx Error
```typescript
fetch(url, {
retryOn: (attempt: number, retries: number, error: Error | null, response: Response | null): boolean => (
attempt < retries && (!!error || !response || response.status >= 500)
),
}).then(/* ... */)
```### Retry only on Network Failures
```typescript
fetch(url, {
retryOn: [],
}).then(/* ... */)
```### Do not retry on Network Failures
```typescript
fetch(url, {
retryOn: (attempt: number, retries: number, error: Error | null, response: Response | null): boolean => (
attempt < retries && error === null /* && additional logic to check response code */
),
}).then(/* ... */)
```### Exponential Backoff
```typescript
fetch(url, {
retryDelay: (attempt: number, error: Error | null, response: Response | null): number => (
Math.pow(2, attempt) * 1000
),
}).then(/* ... */)
```