1# Class: RetryHandler 2 3Extends: `undici.DispatcherHandlers` 4 5A handler class that implements the retry logic for a request. 6 7## `new RetryHandler(dispatchOptions, retryHandlers, [retryOptions])` 8 9Arguments: 10 11- **options** `Dispatch.DispatchOptions & RetryOptions` (required) - It is an intersection of `Dispatcher.DispatchOptions` and `RetryOptions`. 12- **retryHandlers** `RetryHandlers` (required) - Object containing the `dispatch` to be used on every retry, and `handler` for handling the `dispatch` lifecycle. 13 14Returns: `retryHandler` 15 16### Parameter: `Dispatch.DispatchOptions & RetryOptions` 17 18Extends: [`Dispatch.DispatchOptions`](Dispatcher.md#parameter-dispatchoptions). 19 20#### `RetryOptions` 21 22- **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. 23- **maxRetries** `number` (optional) - Maximum number of retries. Default: `5` 24- **maxTimeout** `number` (optional) - Maximum number of milliseconds to wait before retrying. Default: `30000` (30 seconds) 25- **minTimeout** `number` (optional) - Minimum number of milliseconds to wait before retrying. Default: `500` (half a second) 26- **timeoutFactor** `number` (optional) - Factor to multiply the timeout by for each retry attempt. Default: `2` 27- **retryAfter** `boolean` (optional) - It enables automatic retry after the `Retry-After` header is received. Default: `true` 28- 29- **methods** `string[]` (optional) - Array of HTTP methods to retry. Default: `['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE']` 30- **statusCodes** `number[]` (optional) - Array of HTTP status codes to retry. Default: `[429, 500, 502, 503, 504]` 31- **errorCodes** `string[]` (optional) - Array of Error codes to retry. Default: `['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ENETDOWN','ENETUNREACH', 'EHOSTDOWN', 32 33**`RetryContext`** 34 35- `state`: `RetryState` - Current retry state. It can be mutated. 36- `opts`: `Dispatch.DispatchOptions & RetryOptions` - Options passed to the retry handler. 37 38### Parameter `RetryHandlers` 39 40- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandlers) => Promise<Dispatch.DispatchResponse>` (required) - Dispatch function to be called after every retry. 41- **handler** Extends [`Dispatch.DispatchHandlers`](Dispatcher.md#dispatcherdispatchoptions-handler) (required) - Handler function to be called after the request is successful or the retries are exhausted. 42 43Examples: 44 45```js 46const client = new Client(`http://localhost:${server.address().port}`); 47const chunks = []; 48const handler = new RetryHandler( 49 { 50 ...dispatchOptions, 51 retryOptions: { 52 // custom retry function 53 retry: function (err, state, callback) { 54 counter++; 55 56 if (err.code && err.code === "UND_ERR_DESTROYED") { 57 callback(err); 58 return; 59 } 60 61 if (err.statusCode === 206) { 62 callback(err); 63 return; 64 } 65 66 setTimeout(() => callback(null), 1000); 67 }, 68 }, 69 }, 70 { 71 dispatch: (...args) => { 72 return client.dispatch(...args); 73 }, 74 handler: { 75 onConnect() {}, 76 onBodySent() {}, 77 onHeaders(status, _rawHeaders, resume, _statusMessage) { 78 // do something with headers 79 }, 80 onData(chunk) { 81 chunks.push(chunk); 82 return true; 83 }, 84 onComplete() {}, 85 onError() { 86 // handle error properly 87 }, 88 }, 89 } 90); 91``` 92 93#### Example - Basic RetryHandler with defaults 94 95```js 96const client = new Client(`http://localhost:${server.address().port}`); 97const handler = new RetryHandler(dispatchOptions, { 98 dispatch: client.dispatch.bind(client), 99 handler: { 100 onConnect() {}, 101 onBodySent() {}, 102 onHeaders(status, _rawHeaders, resume, _statusMessage) {}, 103 onData(chunk) {}, 104 onComplete() {}, 105 onError(err) {}, 106 }, 107}); 108``` 109