|
1 |
| -import { |
2 |
| - ParseError, |
3 |
| - HTTPError, |
4 |
| - MaxRedirectsError |
5 |
| -} from '../as-promise/types'; |
6 |
| -import { |
7 |
| - RetryObject, |
8 |
| - RetryFunction |
9 |
| -} from '.'; |
| 1 | +import {RetryFunction} from '.'; |
10 | 2 |
|
11 | 3 | type Returns<T extends (...args: any) => unknown, V> = (...args: Parameters<T>) => V;
|
12 | 4 |
|
13 |
| -const retryAfterStatusCodes: ReadonlySet<number> = new Set([413, 429, 503]); |
| 5 | +export const retryAfterStatusCodes: ReadonlySet<number> = new Set([413, 429, 503]); |
14 | 6 |
|
15 |
| -export const isErrorWithResponse = (error: RetryObject['error']): error is HTTPError | ParseError | MaxRedirectsError => ( |
16 |
| - error instanceof HTTPError || error instanceof ParseError || error instanceof MaxRedirectsError |
17 |
| -); |
18 |
| - |
19 |
| -const calculateRetryDelay: Returns<RetryFunction, number> = ({attemptCount, retryOptions, error}) => { |
| 7 | +const calculateRetryDelay: Returns<RetryFunction, number> = ({attemptCount, retryOptions, error, retryAfter}) => { |
20 | 8 | if (attemptCount > retryOptions.limit) {
|
21 | 9 | return 0;
|
22 | 10 | }
|
23 | 11 |
|
24 | 12 | const hasMethod = retryOptions.methods.includes(error.options.method);
|
25 | 13 | const hasErrorCode = retryOptions.errorCodes.includes(error.code!);
|
26 |
| - const hasStatusCode = isErrorWithResponse(error) && retryOptions.statusCodes.includes(error.response.statusCode); |
| 14 | + const hasStatusCode = error.response && retryOptions.statusCodes.includes(error.response.statusCode); |
27 | 15 | if (!hasMethod || (!hasErrorCode && !hasStatusCode)) {
|
28 | 16 | return 0;
|
29 | 17 | }
|
30 | 18 |
|
31 |
| - if (isErrorWithResponse(error)) { |
32 |
| - const {response} = error; |
33 |
| - if (response && 'retry-after' in response.headers && retryAfterStatusCodes.has(response.statusCode)) { |
34 |
| - let after = Number(response.headers['retry-after']); |
35 |
| - if (Number.isNaN(after)) { |
36 |
| - after = Date.parse(response.headers['retry-after']!) - Date.now(); |
37 |
| - } else { |
38 |
| - after *= 1000; |
39 |
| - } |
40 |
| - |
41 |
| - if (retryOptions.maxRetryAfter === undefined || after > retryOptions.maxRetryAfter) { |
| 19 | + if (error.response) { |
| 20 | + if (retryAfter) { |
| 21 | + if (retryOptions.maxRetryAfter === undefined || retryAfter > retryOptions.maxRetryAfter) { |
42 | 22 | return 0;
|
43 | 23 | }
|
44 | 24 |
|
45 |
| - return after; |
| 25 | + return retryAfter; |
46 | 26 | }
|
47 | 27 |
|
48 |
| - if (response.statusCode === 413) { |
| 28 | + if (error.response.statusCode === 413) { |
49 | 29 | return 0;
|
50 | 30 | }
|
51 | 31 | }
|
|
0 commit comments