Skip to content

Commit 643a305

Browse files
committedAug 6, 2020
Revert Export isErrorWithResponse, add retryAfter to RetryObject
Fixes #1068
1 parent 28c400f commit 643a305

File tree

2 files changed

+26
-29
lines changed

2 files changed

+26
-29
lines changed
 

‎source/core/calculate-retry-delay.ts

+9-29
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,31 @@
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 '.';
102

113
type Returns<T extends (...args: any) => unknown, V> = (...args: Parameters<T>) => V;
124

13-
const retryAfterStatusCodes: ReadonlySet<number> = new Set([413, 429, 503]);
5+
export const retryAfterStatusCodes: ReadonlySet<number> = new Set([413, 429, 503]);
146

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}) => {
208
if (attemptCount > retryOptions.limit) {
219
return 0;
2210
}
2311

2412
const hasMethod = retryOptions.methods.includes(error.options.method);
2513
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);
2715
if (!hasMethod || (!hasErrorCode && !hasStatusCode)) {
2816
return 0;
2917
}
3018

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) {
4222
return 0;
4323
}
4424

45-
return after;
25+
return retryAfter;
4626
}
4727

48-
if (response.statusCode === 413) {
28+
if (error.response.statusCode === 413) {
4929
return 0;
5030
}
5131
}

‎source/core/index.ts

+17
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ export interface RetryObject {
152152
retryOptions: RequiredRetryOptions;
153153
error: TimeoutError | RequestError;
154154
computedValue: number;
155+
retryAfter?: number;
155156
}
156157

157158
export type RetryFunction = (retryObject: RetryObject) => number | Promise<number>;
@@ -1689,14 +1690,30 @@ export default class Request extends Duplex implements RequestEvents<Request> {
16891690
let backoff: number;
16901691

16911692
try {
1693+
let retryAfter;
1694+
if (response && 'retry-after' in response.headers) {
1695+
retryAfter = Number(response.headers['retry-after']);
1696+
if (Number.isNaN(retryAfter)) {
1697+
retryAfter = Date.parse(response.headers['retry-after']!) - Date.now();
1698+
1699+
if (retryAfter <= 0) {
1700+
retryAfter = 1;
1701+
}
1702+
} else {
1703+
retryAfter *= 1000;
1704+
}
1705+
}
1706+
16921707
backoff = await options.retry.calculateDelay({
16931708
attemptCount: retryCount,
16941709
retryOptions: options.retry,
16951710
error: typedError,
1711+
retryAfter,
16961712
computedValue: calculateRetryDelay({
16971713
attemptCount: retryCount,
16981714
retryOptions: options.retry,
16991715
error: typedError,
1716+
retryAfter,
17001717
computedValue: 0
17011718
})
17021719
});

0 commit comments

Comments
 (0)
Please sign in to comment.