@devmoods/fetch
v4.0.1
Published
JSON-friendly wrapper around the Fetch API with timeouts and automatic retries
Downloads
940
Readme
@devmoods/fetch
JSON-friendly wrapper around the Fetch API Fetch API with timeouts and automatic retries
npm install @devmoods/fetch
Features
- Assume JSON responses and always make it available as
response.jsonData
- no need toawait response.json()
- Create
fetch
instances with pre-configured options and root URLs. - Type argument
fetch<T>
to specify response types (no validation, so use wisely) - Throw a
HttpError
whenstatus < 200
orstatus >= 400
(containingerror.response
) - Timeouts
- Automatic retries with configurable behaviour
- Request and Response interceptors
- Attach
X-Request-ID
to all requests. Retried requests have the same ID
Examples
Setup a configured fetch
instance
import { createFetch, TimeoutError } from '@devmoods/fetch';
const fetch = createFetch({
getRootUrl: () => 'http://localhost:3000/api',
timeout: 1000,
retryOn: () => error => error instanceof TimeoutError,
});
fetch.intercept({
request: request => console.log(request),
response: response => console.log(response),
});
Basic usage
type User = Record<string, any>;
const response = await fetch<User>('/users/1');
console.log(response.jsonData);
await fetch<User[]>('/users', {
timeout: 5000,
credentials: 'include',
retryOn: () = false
});
Advanced RetryOn
creator
Use the exported createRetryOn
to create functions you can pass to retryOn
. This utility makes it easy to limit amount of attempts, determine what errors to retry and setting a backoff strategy (e.g. linear or exponential).
import {
createFetch,
createRetryOn,
TimeoutError,
HttpError,
} from '@devmoods/fetch';
const fetch = createFetch({
getRootUrl: () => 'http://localhost:3000/api',
timeout: 20000,
retryOn: () =>
createRetryOn({
max: 5,
isRetriable: error =>
error instanceof HttpError
? error.response.status === 503
: error instanceof TimeoutError,
getDelay: n => 500 * n,
}),
});
License
MIT