108 lines
3.8 KiB
Markdown
108 lines
3.8 KiB
Markdown
# Class: RetryHandler
|
|
|
|
Extends: `undici.DispatcherHandlers`
|
|
|
|
A handler class that implements the retry logic for a request.
|
|
|
|
## `new RetryHandler(dispatchOptions, retryHandlers, [retryOptions])`
|
|
|
|
Arguments:
|
|
|
|
- **options** `Dispatch.DispatchOptions & RetryOptions` (required) - It is an intersection of `Dispatcher.DispatchOptions` and `RetryOptions`.
|
|
- **retryHandlers** `RetryHandlers` (required) - Object containing the `dispatch` to be used on every retry, and `handler` for handling the `dispatch` lifecycle.
|
|
|
|
Returns: `retryHandler`
|
|
|
|
### Parameter: `Dispatch.DispatchOptions & RetryOptions`
|
|
|
|
Extends: [`Dispatch.DispatchOptions`](Dispatcher.md#parameter-dispatchoptions).
|
|
|
|
#### `RetryOptions`
|
|
|
|
- **retry** `(err: Error, context: RetryContext, callback: (err?: Error | null) => void) => void` (optional) - Function to be called after every retry. It should pass error if no more retries should be performed.
|
|
- **maxRetries** `number` (optional) - Maximum number of retries. Default: `5`
|
|
- **maxTimeout** `number` (optional) - Maximum number of milliseconds to wait before retrying. Default: `30000` (30 seconds)
|
|
- **minTimeout** `number` (optional) - Minimum number of milliseconds to wait before retrying. Default: `500` (half a second)
|
|
- **timeoutFactor** `number` (optional) - Factor to multiply the timeout by for each retry attempt. Default: `2`
|
|
- **retryAfter** `boolean` (optional) - It enables automatic retry after the `Retry-After` header is received. Default: `true`
|
|
-
|
|
- **methods** `string[]` (optional) - Array of HTTP methods to retry. Default: `['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE']`
|
|
- **statusCodes** `number[]` (optional) - Array of HTTP status codes to retry. Default: `[429, 500, 502, 503, 504]`
|
|
- **errorCodes** `string[]` (optional) - Array of Error codes to retry. Default: `['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ENETDOWN','ENETUNREACH', 'EHOSTDOWN',
|
|
|
|
**`RetryContext`**
|
|
|
|
- `state`: `RetryState` - Current retry state. It can be mutated.
|
|
- `opts`: `Dispatch.DispatchOptions & RetryOptions` - Options passed to the retry handler.
|
|
|
|
### Parameter `RetryHandlers`
|
|
|
|
- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandlers) => Promise<Dispatch.DispatchResponse>` (required) - Dispatch function to be called after every retry.
|
|
- **handler** Extends [`Dispatch.DispatchHandlers`](Dispatcher.md#dispatcherdispatchoptions-handler) (required) - Handler function to be called after the request is successful or the retries are exhausted.
|
|
|
|
Examples:
|
|
|
|
```js
|
|
const client = new Client(`http://localhost:${server.address().port}`);
|
|
const chunks = [];
|
|
const handler = new RetryHandler(
|
|
{
|
|
...dispatchOptions,
|
|
retryOptions: {
|
|
// custom retry function
|
|
retry: function (err, state, callback) {
|
|
counter++;
|
|
|
|
if (err.code && err.code === "UND_ERR_DESTROYED") {
|
|
callback(err);
|
|
return;
|
|
}
|
|
|
|
if (err.statusCode === 206) {
|
|
callback(err);
|
|
return;
|
|
}
|
|
|
|
setTimeout(() => callback(null), 1000);
|
|
},
|
|
},
|
|
},
|
|
{
|
|
dispatch: (...args) => {
|
|
return client.dispatch(...args);
|
|
},
|
|
handler: {
|
|
onConnect() {},
|
|
onBodySent() {},
|
|
onHeaders(status, _rawHeaders, resume, _statusMessage) {
|
|
// do something with headers
|
|
},
|
|
onData(chunk) {
|
|
chunks.push(chunk);
|
|
return true;
|
|
},
|
|
onComplete() {},
|
|
onError() {
|
|
// handle error properly
|
|
},
|
|
},
|
|
}
|
|
);
|
|
```
|
|
|
|
#### Example - Basic RetryHandler with defaults
|
|
|
|
```js
|
|
const client = new Client(`http://localhost:${server.address().port}`);
|
|
const handler = new RetryHandler(dispatchOptions, {
|
|
dispatch: client.dispatch.bind(client),
|
|
handler: {
|
|
onConnect() {},
|
|
onBodySent() {},
|
|
onHeaders(status, _rawHeaders, resume, _statusMessage) {},
|
|
onData(chunk) {},
|
|
onComplete() {},
|
|
onError(err) {},
|
|
},
|
|
});
|
|
```
|