Skip to content

Commit dbeed6b

Browse files
committed
feat: add maxRetryAfterTime option
1 parent 8446573 commit dbeed6b

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ The default options are:
6464
"ignoreRedirects": false,
6565
"retry": 3,
6666
"userAgent": "textlint-rule-no-dead-link/1.0",
67-
"maxRetryTime": 10
67+
"maxRetryTime": 10,
68+
"maxRetryAfterTime": 90
6869
}
6970
}
7071
}
@@ -151,10 +152,18 @@ Customize `User-Agent` http header.
151152

152153
### maxRetryTime
153154

154-
The max of allow waiting time second for retry, if response header has `Retry-After`.
155+
The max of waiting seconds for retry. It is related to `retry` option.
156+
157+
:memo: It does affect to `Retry-After` header. If you want to max waiting seconds for `Retry-After` header, please use `maxRetryAfterTime` option.
155158

156159
Default: `10`
157160

161+
### maxRetryAfterTime
162+
163+
The max of allow waiting time second for `maxRetryAfterTime` header value.
164+
165+
Default: `90`
166+
158167
## Tests
159168

160169
```

src/no-dead-link.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export type Options = {
2424
intervalCap: number; // The max number of runs in the given interval of time. [Experimental]
2525
keepAlive: boolean; // {boolean} if it is true, use keepAlive for checking request [Experimental]
2626
userAgent: string; // {String} a UserAgent,
27-
maxRetryTime: number; // (number) The max of waiting seconds for retry, if response returns `After-Retry` header.
27+
maxRetryTime: number; // (number) The max of waiting seconds for retry. It is related to `retry` option. It does affect to `Retry-After` header.
28+
maxRetryAfterTime: number; // (number) The max of waiting seconds for `Retry-After` header.
2829
};
2930
const DEFAULT_OPTIONS: Options = {
3031
checkRelative: true, // {boolean} `false` disables the checks for relative URIs.
@@ -38,7 +39,8 @@ const DEFAULT_OPTIONS: Options = {
3839
intervalCap: 8, // The max number of runs in the given interval of time. [Experimental]
3940
keepAlive: false, // {boolean} if it is true, use keepAlive for checking request [Experimental]
4041
userAgent: "textlint-rule-no-dead-link/1.0", // {String} a UserAgent,
41-
maxRetryTime: 10 // (number) The max of waiting seconds for retry, if response returns `After-Retry` header.
42+
maxRetryTime: 10, // (number) The max of waiting seconds for retry. It is related to `retry` option. It does affect to `Retry-After` header.
43+
maxRetryAfterTime: 90 // (number) The max of waiting seconds for `Retry-After` header.
4244
};
4345

4446
// Adopted from http://stackoverflow.com/a/3809435/951517
@@ -227,14 +229,21 @@ const createCheckAliveURL = (ruleOptions: Options) => {
227229

228230
// try to fetch again if not reach max retry count
229231
if (currentRetryCount < maxRetryCount) {
230-
const retrySeconds = res.headers.get("Retry-After");
232+
const retryAfter = res.headers.get("Retry-After");
231233
// If the response has `Retry-After` header, prefer it
232-
// else exponential retry: 0ms -> 100ms -> 200ms -> 400ms -> 800ms ...
233-
const retryWaitTimeMs =
234-
retrySeconds !== null ? Number(retrySeconds) * 1000 : currentRetryCount ** 2 * 100;
235-
const maxRetryTimeMs = ruleOptions.maxRetryTime * 1000;
236-
if (retryWaitTimeMs <= maxRetryTimeMs) {
237-
await waitTimeMs(retryWaitTimeMs);
234+
if (retryAfter) {
235+
const retryAfterMs = Number(retryAfter) * 1000;
236+
const maxRetryAfterTimeMs = ruleOptions.maxRetryAfterTime * 1000;
237+
if (retryAfterMs <= maxRetryAfterTimeMs) {
238+
await waitTimeMs(retryAfterMs);
239+
}
240+
} else {
241+
// exponential retry: 0ms -> 100ms -> 200ms -> 400ms -> 800ms ...
242+
const retryWaitTimeMs = currentRetryCount ** 2 * 100;
243+
const maxRetryTimeMs = ruleOptions.maxRetryTime * 1000;
244+
if (retryWaitTimeMs <= maxRetryTimeMs) {
245+
await waitTimeMs(retryWaitTimeMs);
246+
}
238247
}
239248
return isAliveURI(uri, "GET", maxRetryCount, currentRetryCount + 1);
240249
}

0 commit comments

Comments
 (0)