@certd/acme-client 1.26.16 → 1.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/agents.js +22 -6
- package/src/auto.js +2 -1
- package/src/axios.js +9 -7
- package/src/client.js +6 -4
- package/src/error.js +10 -0
- package/src/index.js +1 -0
- package/src/wait.js +1 -1
- package/types/index.d.ts +3 -1
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "Simple and unopinionated ACME client",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "nmorsman",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.27.1",
|
|
7
7
|
"main": "src/index.js",
|
|
8
8
|
"types": "types/index.d.ts",
|
|
9
9
|
"license": "MIT",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"bugs": {
|
|
61
61
|
"url": "https://github.com/publishlab/node-acme-client/issues"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a"
|
|
64
64
|
}
|
package/src/agents.js
CHANGED
|
@@ -42,19 +42,26 @@ function setGlobalProxy(opts) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
class HttpError extends Error {
|
|
45
|
+
// eslint-disable-next-line constructor-super
|
|
45
46
|
constructor(error) {
|
|
46
|
-
super(error || error.message);
|
|
47
47
|
if (!error) {
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
|
+
super(error.message);
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
this.message = error.message;
|
|
53
|
+
const { message } = error;
|
|
54
|
+
if (message && typeof message === 'string') {
|
|
55
|
+
if (message.indexOf && message.indexOf('ssl3_get_record:wrong version number') >= 0) {
|
|
56
|
+
this.message = `${message}(http协议错误,服务端要求http协议,请检查是否使用了https请求)`;
|
|
57
|
+
}
|
|
58
|
+
else if (message.indexOf('getaddrinfo EAI_AGAIN')) {
|
|
59
|
+
this.message = `${message}(无法解析域名,请检查网络连接或dns配置)`;
|
|
60
|
+
}
|
|
53
61
|
}
|
|
54
62
|
|
|
55
63
|
this.name = error.name;
|
|
56
64
|
this.code = error.code;
|
|
57
|
-
this.cause = error.cause;
|
|
58
65
|
|
|
59
66
|
if (error.response) {
|
|
60
67
|
this.status = error.response.status;
|
|
@@ -62,6 +69,9 @@ class HttpError extends Error {
|
|
|
62
69
|
this.response = {
|
|
63
70
|
data: error.response.data,
|
|
64
71
|
};
|
|
72
|
+
if (!this.message) {
|
|
73
|
+
this.message = this.statusText;
|
|
74
|
+
}
|
|
65
75
|
}
|
|
66
76
|
|
|
67
77
|
let url = '';
|
|
@@ -73,12 +83,18 @@ class HttpError extends Error {
|
|
|
73
83
|
params: error.config.params,
|
|
74
84
|
data: error.config.data,
|
|
75
85
|
};
|
|
76
|
-
url = error.config.baseURL + error.config.url;
|
|
86
|
+
url = (error.config.baseURL || '') + error.config.url;
|
|
77
87
|
}
|
|
78
88
|
if (url) {
|
|
79
89
|
this.message = `${this.message}:${url}`;
|
|
80
90
|
}
|
|
81
|
-
|
|
91
|
+
// const { stack, cause } = error;
|
|
92
|
+
delete this.cause;
|
|
93
|
+
delete this.stack;
|
|
94
|
+
// this.cause = cause;
|
|
95
|
+
// this.stack = stack;
|
|
96
|
+
delete error.stack;
|
|
97
|
+
delete error.cause;
|
|
82
98
|
delete error.response;
|
|
83
99
|
delete error.config;
|
|
84
100
|
delete error.request;
|
package/src/auto.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const { readCsrDomains } = require('./crypto');
|
|
6
6
|
const { log } = require('./logger');
|
|
7
7
|
const { wait } = require('./wait');
|
|
8
|
+
const { CancelError } = require('./error');
|
|
8
9
|
|
|
9
10
|
const defaultOpts = {
|
|
10
11
|
csr: null,
|
|
@@ -250,7 +251,7 @@ module.exports = async (client, userOpts) => {
|
|
|
250
251
|
i += 1;
|
|
251
252
|
log(`开始第${i}组`);
|
|
252
253
|
if (opts.signal && opts.signal.aborted) {
|
|
253
|
-
throw new
|
|
254
|
+
throw new CancelError('用户取消');
|
|
254
255
|
}
|
|
255
256
|
|
|
256
257
|
try {
|
package/src/axios.js
CHANGED
|
@@ -114,17 +114,19 @@ instance.interceptors.response.use(null, async (error) => {
|
|
|
114
114
|
const code = response ? `HTTP ${response.status}` : error.code;
|
|
115
115
|
log(`Caught ${code}, retry attempt ${config.retryAttempt}/${retryMaxAttempts} to URL ${config.url}`);
|
|
116
116
|
|
|
117
|
+
const retryAfter = (retryDefaultDelay * config.retryAttempt);
|
|
117
118
|
/* Attempt to parse Retry-After header, fallback to default delay */
|
|
118
|
-
|
|
119
|
+
const headerRetryAfter = response ? parseRetryAfterHeader(response.headers['retry-after']) : 0;
|
|
119
120
|
|
|
120
|
-
if (
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
log(`Unable to locate or parse retry-after response header, waiting ${retryAfter} seconds`);
|
|
121
|
+
if (headerRetryAfter > 0) {
|
|
122
|
+
const waitMinutes = (headerRetryAfter / 60).toFixed(1);
|
|
123
|
+
log(`Found retry-after response header with value: ${response.headers['retry-after']}, waiting ${waitMinutes} minutes`);
|
|
124
|
+
log(JSON.stringify(response.data));
|
|
125
|
+
return Promise.reject(new Agents.HttpError(error));
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
+
log(`waiting ${retryAfter} seconds`);
|
|
129
|
+
|
|
128
130
|
/* Wait and retry the request */
|
|
129
131
|
await new Promise((resolve) => { setTimeout(resolve, (retryAfter * 1000)); });
|
|
130
132
|
return instance(config);
|
package/src/client.js
CHANGED
|
@@ -12,6 +12,7 @@ const AcmeApi = require('./api');
|
|
|
12
12
|
const verify = require('./verify');
|
|
13
13
|
const util = require('./util');
|
|
14
14
|
const auto = require('./auto');
|
|
15
|
+
const { CancelError } = require('./error');
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* ACME states
|
|
@@ -490,9 +491,10 @@ class AcmeClient {
|
|
|
490
491
|
|
|
491
492
|
const keyAuthorization = await this.getChallengeKeyAuthorization(challenge);
|
|
492
493
|
|
|
493
|
-
const verifyFn = async () => {
|
|
494
|
+
const verifyFn = async (abort) => {
|
|
494
495
|
if (this.opts.signal && this.opts.signal.aborted) {
|
|
495
|
-
|
|
496
|
+
abort();
|
|
497
|
+
throw new CancelError('用户取消');
|
|
496
498
|
}
|
|
497
499
|
await verify[challenge.type](authz, challenge, keyAuthorization);
|
|
498
500
|
};
|
|
@@ -518,7 +520,7 @@ class AcmeClient {
|
|
|
518
520
|
|
|
519
521
|
async completeChallenge(challenge) {
|
|
520
522
|
if (this.opts.signal && this.opts.signal.aborted) {
|
|
521
|
-
throw new
|
|
523
|
+
throw new CancelError('用户取消');
|
|
522
524
|
}
|
|
523
525
|
const resp = await this.api.completeChallenge(challenge.url, {});
|
|
524
526
|
return resp.data;
|
|
@@ -559,7 +561,7 @@ class AcmeClient {
|
|
|
559
561
|
const verifyFn = async (abort) => {
|
|
560
562
|
if (this.opts.signal && this.opts.signal.aborted) {
|
|
561
563
|
abort();
|
|
562
|
-
throw new
|
|
564
|
+
throw new CancelError('用户取消');
|
|
563
565
|
}
|
|
564
566
|
|
|
565
567
|
const resp = await this.api.apiRequest(item.url, null, [200]);
|
package/src/error.js
ADDED
package/src/index.js
CHANGED
package/src/wait.js
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -198,6 +198,8 @@ export const agents: any;
|
|
|
198
198
|
* Logger
|
|
199
199
|
*/
|
|
200
200
|
|
|
201
|
-
export function setLogger(fn: (
|
|
201
|
+
export function setLogger(fn: (message: any, ...args: any[]) => void): void;
|
|
202
202
|
|
|
203
203
|
export function walkTxtRecord(record: any): Promise<string[]>;
|
|
204
|
+
|
|
205
|
+
export const CancelError: Error;
|