abler-api 0.1.27 → 0.1.28
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/dist/cjs/pp-util.js +452 -171
- package/dist/es/pp-util.js +451 -171
- package/package.json +1 -1
package/dist/cjs/pp-util.js
CHANGED
|
@@ -7,6 +7,7 @@ var require$$3 = require('abler-net');
|
|
|
7
7
|
var require$$0$1 = require('fs');
|
|
8
8
|
var require$$1$1 = require('path');
|
|
9
9
|
var require$$1$2 = require('abler-messenger');
|
|
10
|
+
var require$$0$2 = require('node-cron');
|
|
10
11
|
|
|
11
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
12
13
|
|
|
@@ -17,15 +18,16 @@ var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3);
|
|
|
17
18
|
var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$1);
|
|
18
19
|
var require$$1__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$1$1);
|
|
19
20
|
var require$$1__default$2 = /*#__PURE__*/_interopDefaultLegacy(require$$1$2);
|
|
21
|
+
var require$$0__default$2 = /*#__PURE__*/_interopDefaultLegacy(require$$0$2);
|
|
20
22
|
|
|
21
23
|
const crypto = require$$0__default["default"];
|
|
22
|
-
const ppUtil$
|
|
24
|
+
const ppUtil$4 = require$$1__default["default"].ppUtil;
|
|
23
25
|
const {
|
|
24
26
|
dbUtil,
|
|
25
27
|
kvStorage
|
|
26
28
|
} = require$$2__default["default"];
|
|
27
29
|
const netUtil$1 = require$$3__default["default"];
|
|
28
|
-
let conf$
|
|
30
|
+
let conf$3, appSetting$1, err$2, dbSql;
|
|
29
31
|
const pnToken = "access_token",
|
|
30
32
|
hnToken = pnToken,
|
|
31
33
|
pnApiKey = "apiKey",
|
|
@@ -33,22 +35,22 @@ const pnToken = "access_token",
|
|
|
33
35
|
// 我们接收到的 headers 中的字段名总是全小写的
|
|
34
36
|
pnApiSecret = "apiSecret",
|
|
35
37
|
hnApiSecret = pnApiSecret.toLowerCase();
|
|
36
|
-
const MD5 = ppUtil$
|
|
37
|
-
moveProperty = ppUtil$
|
|
38
|
+
const MD5 = ppUtil$4.MD5,
|
|
39
|
+
moveProperty = ppUtil$4.moveProperty;
|
|
38
40
|
|
|
39
|
-
class apiUtil$
|
|
40
|
-
static debugFlag = ppUtil$
|
|
41
|
+
class apiUtil$2 {
|
|
42
|
+
static debugFlag = ppUtil$4.newGuid(); //应用必须设置,否则谁也不知道是啥
|
|
41
43
|
|
|
42
|
-
static testFlag = ppUtil$
|
|
44
|
+
static testFlag = ppUtil$4.newGuid();
|
|
43
45
|
static envId_dev = "?"; // static apiCallRecSaver;
|
|
44
46
|
|
|
45
47
|
static config(appConfig, appErrCfg, appDbSql) {
|
|
46
|
-
ppUtil$
|
|
47
|
-
conf$
|
|
48
|
-
appSetting$1 = conf$
|
|
49
|
-
err$
|
|
50
|
-
apiUtil$
|
|
51
|
-
apiUtil$
|
|
48
|
+
ppUtil$4.config(appConfig, appErrCfg);
|
|
49
|
+
conf$3 = appConfig;
|
|
50
|
+
appSetting$1 = conf$3?.appSetting;
|
|
51
|
+
err$2 = appErrCfg, dbSql = appDbSql;
|
|
52
|
+
apiUtil$2.debugFlag = appSetting$1?.debugFlag || apiUtil$2.debugFlag;
|
|
53
|
+
apiUtil$2.testFlag = appSetting$1?.testFlag || apiUtil$2.testFlag; // apiUtil.apiCallRecSaver = apiCallRecSaver;
|
|
52
54
|
} //#region ===== 需要应用系统重写的方法
|
|
53
55
|
|
|
54
56
|
/**
|
|
@@ -59,7 +61,7 @@ class apiUtil$1 {
|
|
|
59
61
|
|
|
60
62
|
|
|
61
63
|
static _getApiSecret(companyId) {
|
|
62
|
-
return ppUtil$
|
|
64
|
+
return ppUtil$4.newGuid();
|
|
63
65
|
}
|
|
64
66
|
/**
|
|
65
67
|
* 保存 API 调用记录,应用系统必须重写此方法
|
|
@@ -136,7 +138,7 @@ class apiUtil$1 {
|
|
|
136
138
|
req._requestParams = Object.assign(req.params, req._requestParams);
|
|
137
139
|
}
|
|
138
140
|
|
|
139
|
-
apiUtil$
|
|
141
|
+
apiUtil$2.setParamsFunctions(req._requestParams);
|
|
140
142
|
}
|
|
141
143
|
|
|
142
144
|
return req._requestParams;
|
|
@@ -147,11 +149,11 @@ class apiUtil$1 {
|
|
|
147
149
|
return req.tokenData;
|
|
148
150
|
}
|
|
149
151
|
|
|
150
|
-
let params = apiUtil$
|
|
152
|
+
let params = apiUtil$2.extractParams(req);
|
|
151
153
|
let tokenData = {
|
|
152
154
|
apiKey: req.headers[hnApiKey] || params[pnApiKey],
|
|
153
155
|
apiSecret: req.headers[hnApiSecret] || params[pnApiSecret],
|
|
154
|
-
clientIp: apiUtil$
|
|
156
|
+
clientIp: apiUtil$2.getClientIp(req)
|
|
155
157
|
};
|
|
156
158
|
return tokenData;
|
|
157
159
|
}
|
|
@@ -162,18 +164,18 @@ class apiUtil$1 {
|
|
|
162
164
|
|
|
163
165
|
|
|
164
166
|
static setParamsFunctions(params) {
|
|
165
|
-
ppUtil$
|
|
167
|
+
ppUtil$4.defUnenumProp(params, "asNumber", function (name, minValue, maxValue, defaultValue) {
|
|
166
168
|
// if (!this.hasOwnProperty(name)) // {} 定义的对象没有 hasOwnProperty 函数
|
|
167
169
|
if (this[name] === undefined) return defaultValue;
|
|
168
170
|
let result = +this[name];
|
|
169
171
|
|
|
170
172
|
if (typeof result !== "number" || result < minValue || result > maxValue) {
|
|
171
|
-
throw [err$
|
|
173
|
+
throw [err$2.INVALID_PARAM, `参数 ${name} 必须是 ${minValue} ~ ${maxValue} 之间的数字`];
|
|
172
174
|
}
|
|
173
175
|
|
|
174
176
|
return result;
|
|
175
177
|
});
|
|
176
|
-
ppUtil$
|
|
178
|
+
ppUtil$4.defUnenumProp(params, "asBool", function (name, defaultValue) {
|
|
177
179
|
if (this[name] === undefined) return defaultValue;
|
|
178
180
|
let result = JSON.parse(this[name]);
|
|
179
181
|
return !!result;
|
|
@@ -238,7 +240,7 @@ class apiUtil$1 {
|
|
|
238
240
|
|
|
239
241
|
static apiFail(error, req) {
|
|
240
242
|
configNeeded();
|
|
241
|
-
let response = err$
|
|
243
|
+
let response = err$2.ERROR(error, err$2.errorLangParamFlag + ppUtil$4.getMsgLang(req));
|
|
242
244
|
response.datetime = new Date();
|
|
243
245
|
|
|
244
246
|
if (req && req.headers) {
|
|
@@ -260,8 +262,8 @@ class apiUtil$1 {
|
|
|
260
262
|
|
|
261
263
|
|
|
262
264
|
static spoApiSucc(data, req) {
|
|
263
|
-
let params = apiUtil$
|
|
264
|
-
return apiUtil$
|
|
265
|
+
let params = apiUtil$2.extractParams(req);
|
|
266
|
+
return apiUtil$2.apiSuccess(data, req, params.spOrderNum);
|
|
265
267
|
}
|
|
266
268
|
/**
|
|
267
269
|
* 生成面向服务商的API失败返回结果
|
|
@@ -272,8 +274,8 @@ class apiUtil$1 {
|
|
|
272
274
|
|
|
273
275
|
|
|
274
276
|
static spoApiFail(error, req) {
|
|
275
|
-
let params = apiUtil$
|
|
276
|
-
return apiUtil$
|
|
277
|
+
let params = apiUtil$2.extractParams(req);
|
|
278
|
+
return apiUtil$2.apiFail(error, req, params.spOrderNum);
|
|
277
279
|
}
|
|
278
280
|
/**
|
|
279
281
|
* API 服务结束,发送响应
|
|
@@ -310,10 +312,10 @@ class apiUtil$1 {
|
|
|
310
312
|
static async responseOf(response, promise) {
|
|
311
313
|
promise.then(function (data) {
|
|
312
314
|
// console.log('RES:', apiSuccess(data));
|
|
313
|
-
if (!response.finished) response.send(apiUtil$
|
|
315
|
+
if (!response.finished) response.send(apiUtil$2.apiSuccess(data, response.req));
|
|
314
316
|
}, function (error) {
|
|
315
317
|
console.log('ERROR:', error);
|
|
316
|
-
if (!response.finished) response.send(apiUtil$
|
|
318
|
+
if (!response.finished) response.send(apiUtil$2.apiFail(error, response.req));
|
|
317
319
|
});
|
|
318
320
|
}
|
|
319
321
|
/**
|
|
@@ -325,16 +327,16 @@ class apiUtil$1 {
|
|
|
325
327
|
|
|
326
328
|
static async spoApiResponse(response, promise) {
|
|
327
329
|
promise.then(function (result) {
|
|
328
|
-
let responseData = apiUtil$
|
|
330
|
+
let responseData = apiUtil$2.spoApiSucc(result, response.req);
|
|
329
331
|
|
|
330
|
-
apiUtil$
|
|
332
|
+
apiUtil$2._saveApiCallRec(response.req.apiCallRec, responseData);
|
|
331
333
|
|
|
332
334
|
if (!response.finished) response.send(responseData);
|
|
333
335
|
}, function (error) {
|
|
334
336
|
console.log('ERROR:', error);
|
|
335
|
-
let responseData = apiUtil$
|
|
337
|
+
let responseData = apiUtil$2.spoApiFail(error, response.req);
|
|
336
338
|
|
|
337
|
-
apiUtil$
|
|
339
|
+
apiUtil$2._saveApiCallRec(response.req.apiCallRec, responseData);
|
|
338
340
|
|
|
339
341
|
if (!response.finished) response.send(responseData);
|
|
340
342
|
});
|
|
@@ -351,7 +353,7 @@ class apiUtil$1 {
|
|
|
351
353
|
req.headers.timestamp = new Date().valueOf(); // let options = {replacements: {}};
|
|
352
354
|
|
|
353
355
|
let options = {};
|
|
354
|
-
let parameters = apiUtil$
|
|
356
|
+
let parameters = apiUtil$2.extractParams(req);
|
|
355
357
|
|
|
356
358
|
for (let qryParam in parameters) {
|
|
357
359
|
if (qryParam !== 'token') {
|
|
@@ -383,7 +385,7 @@ class apiUtil$1 {
|
|
|
383
385
|
// }
|
|
384
386
|
|
|
385
387
|
options.userInfo = req.userInfo;
|
|
386
|
-
return apiUtil$
|
|
388
|
+
return apiUtil$2.setOptionsPropFuncions(options, res);
|
|
387
389
|
}
|
|
388
390
|
/**
|
|
389
391
|
* 为API请求 options 设置属性
|
|
@@ -448,7 +450,7 @@ class apiUtil$1 {
|
|
|
448
450
|
let token = req.headers[hnToken] || req.headers['x-access-token']; //向后兼容
|
|
449
451
|
|
|
450
452
|
if (!token) {
|
|
451
|
-
let params = apiUtil$
|
|
453
|
+
let params = apiUtil$2.extractParams(req);
|
|
452
454
|
token = params[pnToken];
|
|
453
455
|
|
|
454
456
|
if (token) {
|
|
@@ -459,12 +461,12 @@ class apiUtil$1 {
|
|
|
459
461
|
delete params.token;
|
|
460
462
|
} else {
|
|
461
463
|
// 如果没有token,则返回错误
|
|
462
|
-
console.log(err$
|
|
464
|
+
console.log(err$2.TOKEN_NEEDED);
|
|
463
465
|
|
|
464
466
|
if (res) {
|
|
465
|
-
res.send(err$
|
|
467
|
+
res.send(err$2.ERROR(err$2.TOKEN_NEEDED));
|
|
466
468
|
} else if (!noErr) {
|
|
467
|
-
throw err$
|
|
469
|
+
throw err$2.TOKEN_NEEDED;
|
|
468
470
|
}
|
|
469
471
|
}
|
|
470
472
|
}
|
|
@@ -483,10 +485,10 @@ class apiUtil$1 {
|
|
|
483
485
|
|
|
484
486
|
static async checkInternalToken(req) {
|
|
485
487
|
// return await checkInternalToken(req);
|
|
486
|
-
const params = apiUtil$
|
|
487
|
-
req.accessToken = req.accessToken || apiUtil$
|
|
488
|
+
const params = apiUtil$2.extractParams(req);
|
|
489
|
+
req.accessToken = req.accessToken || apiUtil$2.extractToken(req);
|
|
488
490
|
|
|
489
|
-
if (req.accessToken === MD5(ppUtil$
|
|
491
|
+
if (req.accessToken === MD5(ppUtil$4.idNumDisturbing)) {
|
|
490
492
|
//todo: 检查IP
|
|
491
493
|
params.__internal__ = true;
|
|
492
494
|
req.ignoreToken = true; // if (params.idNum || params.personId) {
|
|
@@ -507,7 +509,7 @@ class apiUtil$1 {
|
|
|
507
509
|
return true;
|
|
508
510
|
} else {
|
|
509
511
|
// console.log('token error.', req.accessToken);
|
|
510
|
-
throw err$
|
|
512
|
+
throw err$2.TOKEN_INVALID;
|
|
511
513
|
}
|
|
512
514
|
}
|
|
513
515
|
/**
|
|
@@ -518,16 +520,16 @@ class apiUtil$1 {
|
|
|
518
520
|
|
|
519
521
|
|
|
520
522
|
static async checkRequestToken(req) {
|
|
521
|
-
req.accessToken = req.accessToken || apiUtil$
|
|
522
|
-
const tokenKey = apiUtil$
|
|
523
|
-
const expireTime = apiUtil$
|
|
524
|
-
return await apiUtil$
|
|
525
|
-
req.userInfo = apiUtil$
|
|
523
|
+
req.accessToken = req.accessToken || apiUtil$2.extractToken(req);
|
|
524
|
+
const tokenKey = apiUtil$2.userTokenStoreKey(req.accessToken);
|
|
525
|
+
const expireTime = apiUtil$2.tokenExpireTime(req);
|
|
526
|
+
return await apiUtil$2.restoreTokenData(tokenKey, expireTime).then(async function (data) {
|
|
527
|
+
req.userInfo = apiUtil$2.setUserIdNo(data, data._idNo);
|
|
526
528
|
if (req.tokenValidater) await req.tokenValidater(req.userInfo, req);
|
|
527
529
|
return true;
|
|
528
530
|
}, async function (e) {
|
|
529
531
|
// 如果给定的token不存在,看看是不是平台内部调用
|
|
530
|
-
return await apiUtil$
|
|
532
|
+
return await apiUtil$2.checkInternalToken(req);
|
|
531
533
|
});
|
|
532
534
|
}
|
|
533
535
|
/**
|
|
@@ -539,11 +541,11 @@ class apiUtil$1 {
|
|
|
539
541
|
|
|
540
542
|
static isDebugMode(req) {
|
|
541
543
|
if (req.__debug__ === undefined) {
|
|
542
|
-
let dbgToken = req.headers['__debug__'] || req.headers[apiUtil$
|
|
544
|
+
let dbgToken = req.headers['__debug__'] || req.headers[apiUtil$2.debugFlag];
|
|
543
545
|
|
|
544
546
|
if (dbgToken) {
|
|
545
547
|
let envId = process.env.ECS_DEPLOY_ID;
|
|
546
|
-
req.__debug__ = dbgToken && dbgToken === MD5(req.headers.timestamp, ppUtil$
|
|
548
|
+
req.__debug__ = dbgToken && dbgToken === MD5(req.headers.timestamp, ppUtil$4.commonHashDisturbing) && (envId === "florist_longdan" || envId === "shuzi");
|
|
547
549
|
} else {
|
|
548
550
|
req.__debug__ = false;
|
|
549
551
|
} // console.log("__debug__:", req.__debug__, "dbgToken:", dbgToken);
|
|
@@ -561,11 +563,11 @@ class apiUtil$1 {
|
|
|
561
563
|
|
|
562
564
|
static isTestMode(req) {
|
|
563
565
|
if (req.__postman__ === undefined) {
|
|
564
|
-
let dbgToken = req.headers["__postman__"] || req.headers[apiUtil$
|
|
566
|
+
let dbgToken = req.headers["__postman__"] || req.headers[apiUtil$2.testFlag];
|
|
565
567
|
|
|
566
568
|
if (dbgToken) {
|
|
567
569
|
let envId = process.env.ECS_DEPLOY_ID;
|
|
568
|
-
let testToken = MD5(req.headers.timestamp, apiUtil$
|
|
570
|
+
let testToken = MD5(req.headers.timestamp, apiUtil$2.extractToken(req, null, true) || req.headers.apikey);
|
|
569
571
|
req.__postman__ = dbgToken === testToken && (envId.indexOf("myfacesign.com") < 0 || envId.indexOf(".dev.") > 0);
|
|
570
572
|
} else {
|
|
571
573
|
req.__postman__ = false;
|
|
@@ -582,7 +584,7 @@ class apiUtil$1 {
|
|
|
582
584
|
|
|
583
585
|
|
|
584
586
|
static tokenExpireTime(req) {
|
|
585
|
-
return apiUtil$
|
|
587
|
+
return apiUtil$2.isDebugMode(req) ? 30 * 24 * 60 * 60 : apiUtil$2.isTestMode(req) ? 4 * 60 * 60 : appSetting$1.tokenExpireTime;
|
|
586
588
|
}
|
|
587
589
|
/**
|
|
588
590
|
* 获取用户令牌保存键
|
|
@@ -625,7 +627,7 @@ class apiUtil$1 {
|
|
|
625
627
|
static setUserIdNo(userInfo, idNum) {
|
|
626
628
|
if (userInfo && idNum) {
|
|
627
629
|
userInfo._idNo = idNum;
|
|
628
|
-
userInfo.isHKIC = apiUtil$
|
|
630
|
+
userInfo.isHKIC = apiUtil$2.checkIsHKIC(idNum);
|
|
629
631
|
}
|
|
630
632
|
|
|
631
633
|
return userInfo;
|
|
@@ -642,7 +644,7 @@ class apiUtil$1 {
|
|
|
642
644
|
|
|
643
645
|
static async storeToken(token, tokenData, dataId, req) {
|
|
644
646
|
// let timeout = tokenData.clientIp.substring(0, 8) == "192.168." ? 90 * 24 : 1;
|
|
645
|
-
let timeout = apiUtil$
|
|
647
|
+
let timeout = apiUtil$2.tokenExpireTime(req);
|
|
646
648
|
|
|
647
649
|
if (req.certPublicKey) {
|
|
648
650
|
tokenData.certPublicKey = req.certPublicKey;
|
|
@@ -723,7 +725,7 @@ class apiUtil$1 {
|
|
|
723
725
|
};
|
|
724
726
|
|
|
725
727
|
if (rec.secret !== "") {
|
|
726
|
-
rec.secret = ppUtil$
|
|
728
|
+
rec.secret = ppUtil$4.getEncAse192(rec.secret);
|
|
727
729
|
}
|
|
728
730
|
|
|
729
731
|
req.apiCallRec = rec;
|
|
@@ -790,7 +792,7 @@ class apiUtil$1 {
|
|
|
790
792
|
return certInfo;
|
|
791
793
|
}).catch(e => {
|
|
792
794
|
console.log('获取企业证书失败:\n', e);
|
|
793
|
-
throw [err$
|
|
795
|
+
throw [err$2.ACCESS_REFUSED, `获取企业证书失败:${err$2.ERROR(e).message}`];
|
|
794
796
|
});
|
|
795
797
|
}
|
|
796
798
|
/**
|
|
@@ -804,27 +806,27 @@ class apiUtil$1 {
|
|
|
804
806
|
static async verifyApiSignature(tokenData, req) {
|
|
805
807
|
try {
|
|
806
808
|
if (!req.headers.timestamp) {
|
|
807
|
-
throw [err$
|
|
809
|
+
throw [err$2.ACCESS_REFUSED, `必须在请求头中设置时戳`];
|
|
808
810
|
}
|
|
809
811
|
|
|
810
812
|
let timestamp = parseInt(req.headers.timestamp);
|
|
811
813
|
let currentTime = new Date().valueOf();
|
|
812
|
-
let maxTimeDiff = apiUtil$
|
|
814
|
+
let maxTimeDiff = apiUtil$2.isDebugMode(req) ? 7 * 24 * 3600 : apiUtil$2.isTestMode(req) ? 4 * 3600 : 100; // 100
|
|
813
815
|
|
|
814
816
|
if (timestamp.toString() == "NaN" || currentTime < timestamp - 5000 || currentTime - timestamp > maxTimeDiff * 1000) {
|
|
815
|
-
throw [err$
|
|
817
|
+
throw [err$2.ACCESS_REFUSED, `时戳(${timestamp})无效,当前时戳:${currentTime},时差 ${(currentTime - timestamp) / 1000}秒`];
|
|
816
818
|
}
|
|
817
819
|
|
|
818
820
|
let signature = req.headers.signature;
|
|
819
821
|
|
|
820
822
|
if (!signature) {
|
|
821
|
-
throw [err$
|
|
823
|
+
throw [err$2.ACCESS_REFUSED, `必须在请求头中提供签名`];
|
|
822
824
|
}
|
|
823
825
|
|
|
824
|
-
let signData = apiUtil$
|
|
826
|
+
let signData = apiUtil$2.extractToken(req, null, true) || tokenData.apiKey;
|
|
825
827
|
signData += timestamp;
|
|
826
828
|
|
|
827
|
-
if (apiUtil$
|
|
829
|
+
if (apiUtil$2.isDebugMode(req) || apiUtil$2.isTestMode(req)) {
|
|
828
830
|
let publicKey = req.headers.publickey || req.body.publicKey || req.query.publicKey;
|
|
829
831
|
|
|
830
832
|
if (publicKey) {
|
|
@@ -839,16 +841,16 @@ class apiUtil$1 {
|
|
|
839
841
|
return await verifyResult;
|
|
840
842
|
}
|
|
841
843
|
|
|
842
|
-
return apiUtil$
|
|
844
|
+
return apiUtil$2.getCompanyCertificate(tokenData.apiKey).then(info => {
|
|
843
845
|
tokenData.certPublicKey = info.certLiving;
|
|
844
846
|
tokenData.certPublicKeySpare = info.certSpare;
|
|
845
847
|
tokenData.certLivingId = info.certLivingId;
|
|
846
848
|
tokenData.certSpareId = info.certSpareId;
|
|
847
849
|
req.certPublicKey = info.certLiving;
|
|
848
|
-
let token = apiUtil$
|
|
850
|
+
let token = apiUtil$2.extractToken(req, null, true);
|
|
849
851
|
|
|
850
852
|
if (token) {
|
|
851
|
-
apiUtil$
|
|
853
|
+
apiUtil$2.storeToken(apiUtil$2.apiTokenStoreKey(token), tokenData, tokenData.apiKey, req);
|
|
852
854
|
}
|
|
853
855
|
}).then(() => {
|
|
854
856
|
return doVerify(signData, signature, tokenData.certPublicKey);
|
|
@@ -873,7 +875,7 @@ class apiUtil$1 {
|
|
|
873
875
|
|
|
874
876
|
if (!tokenData.certPublicKeySpare) {
|
|
875
877
|
throw {
|
|
876
|
-
eo: err$
|
|
878
|
+
eo: err$2.ACCESS_REFUSED,
|
|
877
879
|
msgArgv: "签名验证异常",
|
|
878
880
|
data: e
|
|
879
881
|
};
|
|
@@ -910,10 +912,10 @@ class apiUtil$1 {
|
|
|
910
912
|
delete tokenData.certLivingId;
|
|
911
913
|
delete tokenData.certSpareId;
|
|
912
914
|
delete tokenData.certPublicKeySpare;
|
|
913
|
-
let token = apiUtil$
|
|
915
|
+
let token = apiUtil$2.extractToken(req);
|
|
914
916
|
|
|
915
917
|
if (token) {
|
|
916
|
-
apiUtil$
|
|
918
|
+
apiUtil$2.storeToken(apiTokenStoreKey(token), tokenData, tokenData.apiKey, req);
|
|
917
919
|
}
|
|
918
920
|
|
|
919
921
|
console.log(`公司(${tokenData.apiKey})备用证书成功转换为正式证书`);
|
|
@@ -922,7 +924,7 @@ class apiUtil$1 {
|
|
|
922
924
|
} catch (e) {
|
|
923
925
|
console.log("SPO服务签名验证异常(备用证书), ", e);
|
|
924
926
|
throw {
|
|
925
|
-
eo: err$
|
|
927
|
+
eo: err$2.ACCESS_REFUSED,
|
|
926
928
|
msgArgv: "签名验证异常(spare)",
|
|
927
929
|
data: e
|
|
928
930
|
};
|
|
@@ -931,7 +933,7 @@ class apiUtil$1 {
|
|
|
931
933
|
|
|
932
934
|
if (!verifyOK) {
|
|
933
935
|
console.log("SPO服务签名验证失败, tokenData: ", tokenData);
|
|
934
|
-
throw [err$
|
|
936
|
+
throw [err$2.ACCESS_REFUSED, "签名验证未通过"];
|
|
935
937
|
}
|
|
936
938
|
|
|
937
939
|
return verifyOK;
|
|
@@ -947,32 +949,32 @@ class apiUtil$1 {
|
|
|
947
949
|
|
|
948
950
|
static async checkApiCallValid(tokenData, req) {
|
|
949
951
|
if (!tokenData.companyInfo) {
|
|
950
|
-
tokenData.companyInfo = await apiUtil$
|
|
952
|
+
tokenData.companyInfo = await apiUtil$2.queryCompanyInfo(tokenData.apiKey, true).catch(e => {
|
|
951
953
|
console.log("执行企业信息查询发生异常", e);
|
|
952
|
-
throw [err$
|
|
954
|
+
throw [err$2.API_KEY_INVALID, "执行企业信息查询发生异常:" + e.message || ""];
|
|
953
955
|
});
|
|
954
956
|
}
|
|
955
957
|
|
|
956
958
|
const companyInfo = tokenData.companyInfo;
|
|
957
959
|
|
|
958
960
|
if (companyInfo != null) {
|
|
959
|
-
let secret = apiUtil$
|
|
961
|
+
let secret = apiUtil$2._getApiSecret(tokenData.apiKey);
|
|
960
962
|
|
|
961
|
-
if (secret !== tokenData.apiSecret) throw err$
|
|
963
|
+
if (secret !== tokenData.apiSecret) throw err$2.API_SCREPT_INVALID; // 不再检查 IP 白名单,改为验证证书签名
|
|
962
964
|
// console.log("fromIp:", tokenData.clientIp, "ipWhiteList:", companyInfo.ipWhiteList);
|
|
963
965
|
// let whiteList = companyInfo.ipWhiteList || "";
|
|
964
966
|
// // 没有设置ip白名单的就不检查了
|
|
965
967
|
// if (whiteList == "" || ipMatched(tokenData.clientIp, whiteList + ",127.0.0.1,1"))
|
|
966
968
|
|
|
967
|
-
if (apiUtil$
|
|
968
|
-
return apiUtil$
|
|
969
|
+
if (apiUtil$2.signatureVerified()) return companyInfo;
|
|
970
|
+
return apiUtil$2.verifyApiSignature(tokenData, req).then(x => {
|
|
969
971
|
return companyInfo;
|
|
970
972
|
}, e => {
|
|
971
973
|
throw e;
|
|
972
974
|
});
|
|
973
975
|
}
|
|
974
976
|
|
|
975
|
-
throw [err$
|
|
977
|
+
throw [err$2.API_KEY_INVALID, tokenData.apiKey];
|
|
976
978
|
}
|
|
977
979
|
/**
|
|
978
980
|
* 检查令牌数据是否存在
|
|
@@ -1023,7 +1025,7 @@ class apiUtil$1 {
|
|
|
1023
1025
|
paramExists = typeof params[paramName] != 'undefined' || typeof params[paramName + paramSufix] != 'undefined';
|
|
1024
1026
|
}
|
|
1025
1027
|
|
|
1026
|
-
if (!paramExists) return ppUtil$
|
|
1028
|
+
if (!paramExists) return ppUtil$4.errorPormise(err$2.ERROR(err$2.PARAMETER_NEEDED, paramName));
|
|
1027
1029
|
}
|
|
1028
1030
|
|
|
1029
1031
|
return Promise.resolve(paramSufix);
|
|
@@ -1071,8 +1073,8 @@ class apiUtil$1 {
|
|
|
1071
1073
|
|
|
1072
1074
|
|
|
1073
1075
|
static async hostIsMySelf(host, req) {
|
|
1074
|
-
let clientIp = apiUtil$
|
|
1075
|
-
return ppUtil$
|
|
1076
|
+
let clientIp = apiUtil$2.getClientIp(req);
|
|
1077
|
+
return ppUtil$4.getMyIp({
|
|
1076
1078
|
hosts: [host, clientIp]
|
|
1077
1079
|
});
|
|
1078
1080
|
}
|
|
@@ -1086,13 +1088,13 @@ class apiUtil$1 {
|
|
|
1086
1088
|
static async checkForwardsHost(options) {
|
|
1087
1089
|
configNeeded();
|
|
1088
1090
|
const params = options.replacements;
|
|
1089
|
-
const myEnvHosts = apiUtil$
|
|
1090
|
-
const myIp = ppUtil$
|
|
1091
|
+
const myEnvHosts = apiUtil$2.getEnvHosts(params);
|
|
1092
|
+
const myIp = ppUtil$4.getMyIp();
|
|
1091
1093
|
const host = params.host || myIp;
|
|
1092
|
-
if (!myEnvHosts.hosts.contains(host)) throw [err$
|
|
1094
|
+
if (!myEnvHosts.hosts.contains(host)) throw [err$2.ACCESS_REFUSED, `环境${conf$3.envId}貌似无此主机:${params.host}`];
|
|
1093
1095
|
|
|
1094
|
-
if (!apiUtil$
|
|
1095
|
-
let result = await apiUtil$
|
|
1096
|
+
if (!apiUtil$2.hostIsMySelf(host, options._res.req)) {
|
|
1097
|
+
let result = await apiUtil$2.forwardsTo(host, myEnvHosts.port, params, options._res.req, myIp);
|
|
1096
1098
|
|
|
1097
1099
|
options._res.send(result);
|
|
1098
1100
|
|
|
@@ -1128,7 +1130,7 @@ class apiUtil$1 {
|
|
|
1128
1130
|
|
|
1129
1131
|
if (result.status !== 200) {
|
|
1130
1132
|
console.log(`访问 ${reqOptions.url} 出错`, result.status, result.res.statusMessage);
|
|
1131
|
-
throw [err$
|
|
1133
|
+
throw [err$2.EXCEPTION, `[${result.status}] - ${result.res.statusMessage}`];
|
|
1132
1134
|
}
|
|
1133
1135
|
|
|
1134
1136
|
return result.data;
|
|
@@ -1144,7 +1146,7 @@ class apiUtil$1 {
|
|
|
1144
1146
|
let keys = Array.isArray(keyPath) ? keyPath : keyPath.split(".");
|
|
1145
1147
|
let parentKey = "";
|
|
1146
1148
|
let key = "config";
|
|
1147
|
-
let value = conf$
|
|
1149
|
+
let value = conf$3;
|
|
1148
1150
|
let parent = null;
|
|
1149
1151
|
|
|
1150
1152
|
for (let i = 0; i < keys.length; i++) {
|
|
@@ -1154,7 +1156,7 @@ class apiUtil$1 {
|
|
|
1154
1156
|
value = parent[key];
|
|
1155
1157
|
|
|
1156
1158
|
if (value === undefined) {
|
|
1157
|
-
throw [err$
|
|
1159
|
+
throw [err$2.INVALID_PARAM, `无此配置项: ${key}`];
|
|
1158
1160
|
}
|
|
1159
1161
|
}
|
|
1160
1162
|
|
|
@@ -1174,10 +1176,10 @@ class apiUtil$1 {
|
|
|
1174
1176
|
|
|
1175
1177
|
static async $checkToken(req, res, next) {
|
|
1176
1178
|
try {
|
|
1177
|
-
await apiUtil$
|
|
1179
|
+
await apiUtil$2.checkRequestToken(req);
|
|
1178
1180
|
await next();
|
|
1179
1181
|
} catch (e) {
|
|
1180
|
-
res.send(err$
|
|
1182
|
+
res.send(err$2.ERROR(e));
|
|
1181
1183
|
}
|
|
1182
1184
|
|
|
1183
1185
|
return false;
|
|
@@ -1194,7 +1196,7 @@ class apiUtil$1 {
|
|
|
1194
1196
|
let token = req.headers["access_token"] || req.headers['x-access-token']; //向后兼容
|
|
1195
1197
|
|
|
1196
1198
|
if (!token) {
|
|
1197
|
-
let params = apiUtil$
|
|
1199
|
+
let params = apiUtil$2.extractParams(req);
|
|
1198
1200
|
token = params["access_token"];
|
|
1199
1201
|
|
|
1200
1202
|
if (token) {
|
|
@@ -1217,15 +1219,15 @@ class apiUtil$1 {
|
|
|
1217
1219
|
|
|
1218
1220
|
try {
|
|
1219
1221
|
if (extractToken(req, res)) {
|
|
1220
|
-
await apiUtil$
|
|
1221
|
-
req.userInfo = apiUtil$
|
|
1222
|
+
await apiUtil$2.restoreTokenData(apiUtil$2.userTokenStoreKey(req.accessToken), apiUtil$2.tokenExpireTime(req)).then(function (data) {
|
|
1223
|
+
req.userInfo = apiUtil$2.setUserIdNo(data, data._idNo);
|
|
1222
1224
|
}, function (e) {//no token
|
|
1223
1225
|
});
|
|
1224
1226
|
}
|
|
1225
1227
|
|
|
1226
1228
|
return true;
|
|
1227
1229
|
} catch (e) {
|
|
1228
|
-
res.send(err$
|
|
1230
|
+
res.send(err$2.ERROR(e));
|
|
1229
1231
|
return false;
|
|
1230
1232
|
}
|
|
1231
1233
|
}
|
|
@@ -1248,7 +1250,7 @@ class apiUtil$1 {
|
|
|
1248
1250
|
req.isMobile = true;
|
|
1249
1251
|
|
|
1250
1252
|
if (!req.signatureVerified) {
|
|
1251
|
-
let params = apiUtil$
|
|
1253
|
+
let params = apiUtil$2.extractParams(req);
|
|
1252
1254
|
moveProperty(params, req.headers, "access_token");
|
|
1253
1255
|
moveProperty(params, req.headers, "timestamp");
|
|
1254
1256
|
|
|
@@ -1269,25 +1271,25 @@ class apiUtil$1 {
|
|
|
1269
1271
|
|
|
1270
1272
|
static $checkApiKeyOld(req, res, next) {
|
|
1271
1273
|
//检查post的信息或者url查询参数或者头信息
|
|
1272
|
-
let tokenData = apiUtil$
|
|
1273
|
-
let params = apiUtil$
|
|
1274
|
-
apiUtil$
|
|
1274
|
+
let tokenData = apiUtil$2.extractTokenData(req);
|
|
1275
|
+
let params = apiUtil$2.extractParams(req);
|
|
1276
|
+
apiUtil$2.createApiCallRec(tokenData, req);
|
|
1275
1277
|
let errResponse = null;
|
|
1276
1278
|
|
|
1277
1279
|
if (!tokenData.clientIp) {
|
|
1278
|
-
errResponse = apiUtil$
|
|
1280
|
+
errResponse = apiUtil$2.spoApiFail(err$2.GET_CLIENTIP_FAIL, req);
|
|
1279
1281
|
} else if (!tokenData.apiKey) {
|
|
1280
|
-
errResponse = apiUtil$
|
|
1282
|
+
errResponse = apiUtil$2.spoApiFail([err$2.PARAMETER_NEEDED, "apiKey"], req);
|
|
1281
1283
|
} else if (!tokenData.apiSecret) {
|
|
1282
|
-
errResponse = apiUtil$
|
|
1284
|
+
errResponse = apiUtil$2.spoApiFail([err$2.PARAMETER_NEEDED, "apiSecret"], req);
|
|
1283
1285
|
}
|
|
1284
1286
|
|
|
1285
1287
|
if (errResponse != null) {
|
|
1286
|
-
apiUtil$
|
|
1288
|
+
apiUtil$2._saveApiCallRec(req.apiCallRec, errResponse);
|
|
1287
1289
|
|
|
1288
|
-
apiUtil$
|
|
1290
|
+
apiUtil$2.sendOrRedirect(req, res, errResponse);
|
|
1289
1291
|
} else {
|
|
1290
|
-
apiUtil$
|
|
1292
|
+
apiUtil$2.checkApiCallValid(tokenData, req).then(companyInfo => {
|
|
1291
1293
|
params.companyId = params.companyId || companyInfo.companyId;
|
|
1292
1294
|
req.companyInfo = companyInfo;
|
|
1293
1295
|
next();
|
|
@@ -1295,9 +1297,9 @@ class apiUtil$1 {
|
|
|
1295
1297
|
console.log('apiCallInvalid:', e);
|
|
1296
1298
|
let errResponse = spoApiFail(e, req);
|
|
1297
1299
|
|
|
1298
|
-
apiUtil$
|
|
1300
|
+
apiUtil$2._saveApiCallRec(req.apiCallRec, errResponse);
|
|
1299
1301
|
|
|
1300
|
-
apiUtil$
|
|
1302
|
+
apiUtil$2.sendOrRedirect(req, res, errResponse);
|
|
1301
1303
|
});
|
|
1302
1304
|
}
|
|
1303
1305
|
}
|
|
@@ -1312,31 +1314,31 @@ class apiUtil$1 {
|
|
|
1312
1314
|
return;
|
|
1313
1315
|
}
|
|
1314
1316
|
|
|
1315
|
-
let accessToken = apiUtil$
|
|
1317
|
+
let accessToken = apiUtil$2.extractToken(req);
|
|
1316
1318
|
|
|
1317
1319
|
if (!accessToken) {
|
|
1318
|
-
res.send(apiUtil$
|
|
1320
|
+
res.send(apiUtil$2.spoApiFail(err$2.TOKEN_NEEDED, req)); // apiUtil.sendOrRedirect(req, res, spoApiFail(err.TOKEN_NEEDED, req));
|
|
1319
1321
|
|
|
1320
1322
|
return;
|
|
1321
1323
|
}
|
|
1322
1324
|
|
|
1323
|
-
apiUtil$
|
|
1325
|
+
apiUtil$2.restoreTokenData(apiUtil$2.apiTokenStoreKey(accessToken)).then(p => {
|
|
1324
1326
|
// req.headers[hnApiKey] = p.apiKey || '';
|
|
1325
1327
|
// req.headers[hnApiSecret] = p.apiSecret || '';
|
|
1326
1328
|
if (req.isMobile) {
|
|
1327
1329
|
// GET 请求的应该都是H5页面,由手机前端发起,需要把headers中的请求方ip换成服务端的
|
|
1328
1330
|
// todo: 如何在API访问记录中记住请求者(手机端)的真实IP
|
|
1329
|
-
req.headers['x-phone-ip'] = apiUtil$
|
|
1331
|
+
req.headers['x-phone-ip'] = apiUtil$2.getClientIp(req);
|
|
1330
1332
|
req.headers['x-real-ip'] = p.clientIp;
|
|
1331
1333
|
} else {
|
|
1332
|
-
p.clientIp = apiUtil$
|
|
1334
|
+
p.clientIp = apiUtil$2.getClientIp(req);
|
|
1333
1335
|
}
|
|
1334
1336
|
|
|
1335
1337
|
req.isApiCall = true;
|
|
1336
1338
|
req.tokenData = p;
|
|
1337
|
-
return apiUtil$
|
|
1339
|
+
return apiUtil$2.$checkApiKeyOld(req, res, next);
|
|
1338
1340
|
}).catch(e => {
|
|
1339
|
-
apiUtil$
|
|
1341
|
+
apiUtil$2.sendOrRedirect(req, res, apiUtil$2.spoApiFail(err$2.TOKEN_INVALID, req));
|
|
1340
1342
|
});
|
|
1341
1343
|
}
|
|
1342
1344
|
/**
|
|
@@ -1349,24 +1351,24 @@ class apiUtil$1 {
|
|
|
1349
1351
|
|
|
1350
1352
|
|
|
1351
1353
|
static async $checkTokenOrApiKey(req, res, next) {
|
|
1352
|
-
let accessToken = apiUtil$
|
|
1354
|
+
let accessToken = apiUtil$2.extractToken(req, res);
|
|
1353
1355
|
|
|
1354
1356
|
if (accessToken) {
|
|
1355
|
-
let tokenExist = await apiUtil$
|
|
1357
|
+
let tokenExist = await apiUtil$2.tokenDataExist(apiUtil$2.userTokenStoreKey(accessToken));
|
|
1356
1358
|
|
|
1357
1359
|
if (tokenExist) {
|
|
1358
|
-
return await apiUtil$
|
|
1360
|
+
return await apiUtil$2.$checkToken(req, res, next);
|
|
1359
1361
|
}
|
|
1360
1362
|
|
|
1361
|
-
tokenExist = await apiUtil$
|
|
1363
|
+
tokenExist = await apiUtil$2.tokenDataExist(apiUtil$2.apiTokenStoreKey(accessToken));
|
|
1362
1364
|
|
|
1363
1365
|
if (tokenExist) {
|
|
1364
|
-
return apiUtil$
|
|
1366
|
+
return apiUtil$2.$checkApiKey(req, res, next);
|
|
1365
1367
|
} // 如果给定的token不存在,看看是不是平台内部调用
|
|
1366
1368
|
|
|
1367
1369
|
|
|
1368
|
-
return await apiUtil$
|
|
1369
|
-
res.send(apiUtil$
|
|
1370
|
+
return await apiUtil$2.checkInternalToken(req).catch(e => {
|
|
1371
|
+
res.send(apiUtil$2.apiFail(e, req));
|
|
1370
1372
|
return false;
|
|
1371
1373
|
});
|
|
1372
1374
|
}
|
|
@@ -1386,10 +1388,10 @@ class apiUtil$1 {
|
|
|
1386
1388
|
const params = options.replacements;
|
|
1387
1389
|
let item = params.item;
|
|
1388
1390
|
delete params.item;
|
|
1389
|
-
if (await apiUtil$
|
|
1390
|
-
let c = apiUtil$
|
|
1391
|
+
if (await apiUtil$2.checkForwardsHost(options)) return true;
|
|
1392
|
+
let c = apiUtil$2.parseCfgPath(item);
|
|
1391
1393
|
delete c.parent;
|
|
1392
|
-
c.host = ppUtil$
|
|
1394
|
+
c.host = ppUtil$4.getMyIp();
|
|
1393
1395
|
return c;
|
|
1394
1396
|
}
|
|
1395
1397
|
/**
|
|
@@ -1406,18 +1408,18 @@ class apiUtil$1 {
|
|
|
1406
1408
|
delete params.item; // if (await checkForwardsHost(options))
|
|
1407
1409
|
// return true;
|
|
1408
1410
|
|
|
1409
|
-
await apiUtil$
|
|
1410
|
-
let c = apiUtil$
|
|
1411
|
+
await apiUtil$2.parametersOK(params, "value");
|
|
1412
|
+
let c = apiUtil$2.parseCfgPath(item);
|
|
1411
1413
|
|
|
1412
1414
|
if (typeof c.value === "object") {
|
|
1413
|
-
throw [err$
|
|
1415
|
+
throw [err$2.ACCESS_REFUSED, `暂不支持修改复杂配置`];
|
|
1414
1416
|
} // c.oldValue = c.value;
|
|
1415
1417
|
|
|
1416
1418
|
|
|
1417
1419
|
c.newValue = params.value;
|
|
1418
1420
|
c.parent[c.key] = c.newValue;
|
|
1419
1421
|
delete c.parent;
|
|
1420
|
-
c.host = ppUtil$
|
|
1422
|
+
c.host = ppUtil$4.getMyIp();
|
|
1421
1423
|
return c; // 应用层自行处理多机同步
|
|
1422
1424
|
} //#endregion
|
|
1423
1425
|
|
|
@@ -1425,21 +1427,21 @@ class apiUtil$1 {
|
|
|
1425
1427
|
}
|
|
1426
1428
|
|
|
1427
1429
|
function configNeeded() {
|
|
1428
|
-
if (!conf$
|
|
1429
|
-
ppUtil$
|
|
1430
|
-
conf$
|
|
1431
|
-
appSetting$1 = conf$
|
|
1432
|
-
err$
|
|
1430
|
+
if (!conf$3 || !err$2) {
|
|
1431
|
+
ppUtil$4.configNeeded();
|
|
1432
|
+
conf$3 = ppUtil$4.appConfig;
|
|
1433
|
+
appSetting$1 = conf$3.appSetting;
|
|
1434
|
+
err$2 = ppUtil$4.appErrCfg;
|
|
1433
1435
|
}
|
|
1434
1436
|
}
|
|
1435
1437
|
|
|
1436
|
-
var ppUtilApi = apiUtil$
|
|
1438
|
+
var ppUtilApi = apiUtil$2;
|
|
1437
1439
|
|
|
1438
1440
|
const fs = require$$0__default$1["default"];
|
|
1439
1441
|
const path = require$$1__default$1["default"];
|
|
1440
|
-
const ppUtil$
|
|
1442
|
+
const ppUtil$3 = require$$1__default["default"].ppUtil;
|
|
1441
1443
|
const redisUtil = require$$2__default["default"].redisUtil;
|
|
1442
|
-
let conf$
|
|
1444
|
+
let conf$2, err$1; // const dbCheck = require('../dbupdate/dd-version');
|
|
1443
1445
|
|
|
1444
1446
|
/**
|
|
1445
1447
|
* API服务启动时前置条件检查
|
|
@@ -1458,10 +1460,10 @@ class preconditions$1 {
|
|
|
1458
1460
|
static checkPromises = [];
|
|
1459
1461
|
|
|
1460
1462
|
static setAppName(aName) {
|
|
1461
|
-
ppUtil$
|
|
1462
|
-
conf$
|
|
1463
|
-
err = ppUtil$
|
|
1464
|
-
preconditions$1.appName = aName || conf$
|
|
1463
|
+
ppUtil$3.configNeeded();
|
|
1464
|
+
conf$2 = ppUtil$3.appConfig;
|
|
1465
|
+
err$1 = ppUtil$3.appErrCfg;
|
|
1466
|
+
preconditions$1.appName = aName || conf$2.thisApp;
|
|
1465
1467
|
return preconditions$1;
|
|
1466
1468
|
}
|
|
1467
1469
|
|
|
@@ -1540,22 +1542,22 @@ class preconditions$1 {
|
|
|
1540
1542
|
|
|
1541
1543
|
async function createEnvSettingFile(fileName) {
|
|
1542
1544
|
try {
|
|
1543
|
-
const cfgText = await ppUtil$
|
|
1545
|
+
const cfgText = await ppUtil$3.doCreateEnvSettingFile(fileName);
|
|
1544
1546
|
|
|
1545
|
-
if (cfgText.indexOf(`cfgVersion: "${conf$
|
|
1547
|
+
if (cfgText.indexOf(`cfgVersion: "${conf$2._envSetting.cfgVersion}"`) > 0) {
|
|
1546
1548
|
console.log(`\n*** 已創建新的本機環境配置文件\n${fileName}\n请檢查各項內容是否正确(此项更新服务可正常运行)\n\n`);
|
|
1547
1549
|
return "";
|
|
1548
1550
|
}
|
|
1549
1551
|
|
|
1550
|
-
return `已創建新的本機環境配置文件\n${fileName}\n请檢查並正確設置各項內容,然後將配置版本號修改為${conf$
|
|
1552
|
+
return `已創建新的本機環境配置文件\n${fileName}\n请檢查並正確設置各項內容,然後將配置版本號修改為${conf$2._envSettings.default.cfgVersion}`;
|
|
1551
1553
|
} catch (e) {
|
|
1552
|
-
return `創建本機環境配置文件失敗\n《${fileName}》\n${err.ERROR(e).message}`;
|
|
1554
|
+
return `創建本機環境配置文件失敗\n《${fileName}》\n${err$1.ERROR(e).message}`;
|
|
1553
1555
|
}
|
|
1554
1556
|
}
|
|
1555
1557
|
|
|
1556
1558
|
async function checkExEnvSetting(loadjs) {
|
|
1557
|
-
if (!conf$
|
|
1558
|
-
let fileName = conf$
|
|
1559
|
+
if (!conf$2._envSetting.localSettingImported) {
|
|
1560
|
+
let fileName = conf$2.getEnvSettingFileName();
|
|
1559
1561
|
|
|
1560
1562
|
if (!fs.existsSync(fileName)) {
|
|
1561
1563
|
return await createEnvSettingFile(fileName);
|
|
@@ -1563,7 +1565,7 @@ async function checkExEnvSetting(loadjs) {
|
|
|
1563
1565
|
|
|
1564
1566
|
let envSettingEx = loadjs(fileName);
|
|
1565
1567
|
|
|
1566
|
-
if (envSettingEx.cfgVersion !== conf$
|
|
1568
|
+
if (envSettingEx.cfgVersion !== conf$2._envSettings.default.cfgVersion) {
|
|
1567
1569
|
if (envSettingEx.cfgVersion !== "0.0") {
|
|
1568
1570
|
let fp = path.parse(fileName);
|
|
1569
1571
|
let newFileName = path.join(fp.dir, fp.name + envSettingEx.cfgVersion + fp.ext);
|
|
@@ -1582,10 +1584,10 @@ async function checkExEnvSetting(loadjs) {
|
|
|
1582
1584
|
|
|
1583
1585
|
|
|
1584
1586
|
async function checkRedis() {
|
|
1585
|
-
if (!conf$
|
|
1587
|
+
if (!conf$2.redis.enabled) return "";
|
|
1586
1588
|
const redis = redisUtil.newClient("io"); // console.log(`checkRedis begin:`);
|
|
1587
1589
|
|
|
1588
|
-
await ppUtil$
|
|
1590
|
+
await ppUtil$3.wait(15 * 1000, param => {
|
|
1589
1591
|
if (redis.ready && redis.connected || redis.error) {
|
|
1590
1592
|
return true;
|
|
1591
1593
|
}
|
|
@@ -1607,39 +1609,39 @@ var ppPrecond = preconditions$1;
|
|
|
1607
1609
|
// 若 redis 不可用,则将消息转发到其它主机
|
|
1608
1610
|
|
|
1609
1611
|
const {
|
|
1610
|
-
ppUtil: ppUtil$
|
|
1612
|
+
ppUtil: ppUtil$2
|
|
1611
1613
|
} = require$$1__default["default"];
|
|
1612
1614
|
const RedisMessenger = require$$1__default$2["default"];
|
|
1613
1615
|
const {
|
|
1614
1616
|
netUtil
|
|
1615
1617
|
} = require$$3__default["default"];
|
|
1616
|
-
let conf;
|
|
1618
|
+
let conf$1;
|
|
1617
1619
|
|
|
1618
|
-
class commonMessenger$
|
|
1620
|
+
class commonMessenger$2 {
|
|
1619
1621
|
static myMsgAddr = "";
|
|
1620
1622
|
static redisMessenger = null;
|
|
1621
1623
|
static onMessage = [];
|
|
1622
1624
|
|
|
1623
1625
|
static initMessenger(appConfig, appErrCfg, msgChannel) {
|
|
1624
|
-
conf = appConfig;
|
|
1625
|
-
this.redisMessenger = conf.redis.enabled ? new RedisMessenger(appConfig, appErrCfg, msgChannel).subscribe(msgChannel) : null;
|
|
1626
|
-
this.myMsgAddr = commonMessenger$
|
|
1626
|
+
conf$1 = appConfig;
|
|
1627
|
+
this.redisMessenger = conf$1.redis.enabled ? new RedisMessenger(appConfig, appErrCfg, msgChannel).subscribe(msgChannel) : null;
|
|
1628
|
+
this.myMsgAddr = commonMessenger$2.getMyMsgAddr();
|
|
1627
1629
|
}
|
|
1628
1630
|
|
|
1629
1631
|
static getMyMsgAddr() {
|
|
1630
|
-
if (!conf.myMsgAddr) {
|
|
1631
|
-
conf.pm_id = process.env.pm_id || "0";
|
|
1632
|
-
let myIp = ppUtil$
|
|
1632
|
+
if (!conf$1.myMsgAddr) {
|
|
1633
|
+
conf$1.pm_id = process.env.pm_id || "0";
|
|
1634
|
+
let myIp = ppUtil$2.getMyIp();
|
|
1633
1635
|
|
|
1634
1636
|
if (this.redisMessenger) {
|
|
1635
|
-
myIp = `${conf.pm_id}@${myIp}`;
|
|
1637
|
+
myIp = `${conf$1.pm_id}@${myIp}`;
|
|
1636
1638
|
}
|
|
1637
1639
|
|
|
1638
|
-
conf.myMsgAddr = myIp;
|
|
1639
|
-
console.log(`myMsgAddr: `, conf.myMsgAddr);
|
|
1640
|
+
conf$1.myMsgAddr = myIp;
|
|
1641
|
+
console.log(`myMsgAddr: `, conf$1.myMsgAddr);
|
|
1640
1642
|
}
|
|
1641
1643
|
|
|
1642
|
-
return conf.myMsgAddr;
|
|
1644
|
+
return conf$1.myMsgAddr;
|
|
1643
1645
|
}
|
|
1644
1646
|
|
|
1645
1647
|
static setMessageHandle(messageHandle) {
|
|
@@ -1647,11 +1649,11 @@ class commonMessenger$1 {
|
|
|
1647
1649
|
return this.redisMessenger.setMessageHandle(messageHandle, msgChannel);
|
|
1648
1650
|
}
|
|
1649
1651
|
|
|
1650
|
-
if (commonMessenger$
|
|
1651
|
-
commonMessenger$
|
|
1652
|
+
if (commonMessenger$2.onMessage.indexOf(messageHandle) < 0) {
|
|
1653
|
+
commonMessenger$2.onMessage.push(messageHandle);
|
|
1652
1654
|
}
|
|
1653
1655
|
|
|
1654
|
-
return commonMessenger$
|
|
1656
|
+
return commonMessenger$2;
|
|
1655
1657
|
}
|
|
1656
1658
|
|
|
1657
1659
|
static async publishMessage(message) {
|
|
@@ -1662,10 +1664,10 @@ class commonMessenger$1 {
|
|
|
1662
1664
|
if (message.destAddr) {
|
|
1663
1665
|
await forwardMessage(message);
|
|
1664
1666
|
} else {
|
|
1665
|
-
for (let i = 0; i < conf.appSetting.serverHosts.length; i++) {
|
|
1666
|
-
message.destAddr = conf.appSetting.serverHosts[i];
|
|
1667
|
+
for (let i = 0; i < conf$1.appSetting.serverHosts.length; i++) {
|
|
1668
|
+
message.destAddr = conf$1.appSetting.serverHosts[i];
|
|
1667
1669
|
|
|
1668
|
-
if (message.destAddr !== conf.myMsgAddr) {
|
|
1670
|
+
if (message.destAddr !== conf$1.myMsgAddr) {
|
|
1669
1671
|
await forwardMessage(message);
|
|
1670
1672
|
}
|
|
1671
1673
|
}
|
|
@@ -1676,8 +1678,8 @@ class commonMessenger$1 {
|
|
|
1676
1678
|
static async handleInternalMessage(options) {
|
|
1677
1679
|
const message = options.replacements;
|
|
1678
1680
|
|
|
1679
|
-
for (let i = 0; i < commonMessenger$
|
|
1680
|
-
const appMsgHandle = commonMessenger$
|
|
1681
|
+
for (let i = 0; i < commonMessenger$2.onMessage.length; i++) {
|
|
1682
|
+
const appMsgHandle = commonMessenger$2.onMessage[i];
|
|
1681
1683
|
|
|
1682
1684
|
try {
|
|
1683
1685
|
await appMsgHandle(message);
|
|
@@ -1702,15 +1704,294 @@ async function forwardMessage(message) {
|
|
|
1702
1704
|
return res.data;
|
|
1703
1705
|
}
|
|
1704
1706
|
|
|
1705
|
-
var ppMessengerEx = commonMessenger$
|
|
1707
|
+
var ppMessengerEx = commonMessenger$2;
|
|
1708
|
+
|
|
1709
|
+
/**
|
|
1710
|
+
* CSCA 自动任务
|
|
1711
|
+
* ==============
|
|
1712
|
+
*/
|
|
1713
|
+
const CRON = require$$0__default$2["default"];
|
|
1714
|
+
const {
|
|
1715
|
+
ppUtil: ppUtil$1
|
|
1716
|
+
} = require$$1__default["default"];
|
|
1717
|
+
const apiUtil$1 = ppUtilApi;
|
|
1718
|
+
const commonMessenger$1 = ppMessengerEx;
|
|
1719
|
+
const MT_SCHEDULE_STATE = 'schedule-state',
|
|
1720
|
+
MT_SCHEDULE_STATE_REPLY = 'schedule-state-reply';
|
|
1721
|
+
let conf, err;
|
|
1722
|
+
|
|
1723
|
+
class schedule$1 {
|
|
1724
|
+
static tasks = {};
|
|
1725
|
+
/**
|
|
1726
|
+
* 注册一个计划任务
|
|
1727
|
+
* @param taskName
|
|
1728
|
+
* @param taskCaption
|
|
1729
|
+
* @param cronExp
|
|
1730
|
+
* @param taskFunc
|
|
1731
|
+
* @param autoStart
|
|
1732
|
+
* @returns {Promise<{}|{}|{cron: *, _message_: string}|any>}
|
|
1733
|
+
*/
|
|
1734
|
+
|
|
1735
|
+
static async registerTask(taskName, taskCaption, cronExp, taskFunc, autoStart) {
|
|
1736
|
+
if (!conf) {
|
|
1737
|
+
ppUtil$1.configNeeded();
|
|
1738
|
+
conf = ppUtil$1.appConfig;
|
|
1739
|
+
err = ppUtil$1.appErrCfg;
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
if (!this.envAllowed()) return {};
|
|
1743
|
+
let task = this.findTask(taskName);
|
|
1744
|
+
|
|
1745
|
+
if (task) {
|
|
1746
|
+
if (task.cronExp !== cronExp || task.taskFunc !== taskFunc) {
|
|
1747
|
+
this.stop(taskName);
|
|
1748
|
+
task = null;
|
|
1749
|
+
}
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1752
|
+
if (!task) {
|
|
1753
|
+
task = {
|
|
1754
|
+
name: taskName,
|
|
1755
|
+
caption: taskCaption,
|
|
1756
|
+
cronExp: cronExp,
|
|
1757
|
+
taskFunc: taskFunc,
|
|
1758
|
+
schedule: null,
|
|
1759
|
+
doScheduleTask: async function () {
|
|
1760
|
+
let self = this;
|
|
1761
|
+
if (this._pp_task) self = this._pp_task;
|
|
1762
|
+
console.log(new Date().format('[yyyy/MM/dd hh:mm:ss:S]'), `开始执行${self.caption}任务 ...`);
|
|
1763
|
+
await self.taskFunc();
|
|
1764
|
+
console.log(new Date().format('[yyyy/MM/dd hh:mm:ss:S]'), `${self.caption}任务执行结束`);
|
|
1765
|
+
}
|
|
1766
|
+
};
|
|
1767
|
+
this.tasks[taskName] = task;
|
|
1768
|
+
|
|
1769
|
+
if (autoStart) {
|
|
1770
|
+
return await this.start(task);
|
|
1771
|
+
}
|
|
1772
|
+
|
|
1773
|
+
return this.getTaskInfo(task, "任务已注册。");
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
return this.getTaskInfo(task, "任务已存在。");
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
static getTaskInfo(task, msg) {
|
|
1780
|
+
// return Object.assign({_message_: msg}, task);
|
|
1781
|
+
return {
|
|
1782
|
+
name: task.name,
|
|
1783
|
+
caption: task.caption,
|
|
1784
|
+
cronExp: task.cronExp,
|
|
1785
|
+
state: task.schedule ? "started" : "stopped",
|
|
1786
|
+
_message_: msg
|
|
1787
|
+
};
|
|
1788
|
+
}
|
|
1789
|
+
/**
|
|
1790
|
+
* 启动任务
|
|
1791
|
+
* @param taskOrName
|
|
1792
|
+
* @param cronExp
|
|
1793
|
+
* @returns {Promise<{}|{cron: *, _message_: string}>}
|
|
1794
|
+
*/
|
|
1795
|
+
|
|
1796
|
+
|
|
1797
|
+
static async start(taskOrName, cronExp) {
|
|
1798
|
+
if (!this.envAllowed()) return {};
|
|
1799
|
+
let task = taskOrName;
|
|
1800
|
+
|
|
1801
|
+
if (typeof task === "string") {
|
|
1802
|
+
task = this.findTask(taskOrName);
|
|
1803
|
+
}
|
|
1804
|
+
|
|
1805
|
+
if (!task) throw [err.INVALID_PARAM, `任务${taskOrName}不存在`];
|
|
1806
|
+
cronExp = cronExp || task.cronExp;
|
|
1807
|
+
|
|
1808
|
+
if (task.cronExp !== cronExp) {
|
|
1809
|
+
this.stop(task);
|
|
1810
|
+
task.cronExp = cronExp;
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
if (task.schedule) {
|
|
1814
|
+
return this.getTaskInfo(task, "任务已启动,无需重复启动。");
|
|
1815
|
+
}
|
|
1816
|
+
|
|
1817
|
+
task.schedule = CRON.schedule(cronExp, task.doScheduleTask);
|
|
1818
|
+
task.schedule._task._pp_task = task;
|
|
1819
|
+
return this.getTaskInfo(task, "任务已启动。");
|
|
1820
|
+
}
|
|
1821
|
+
/**
|
|
1822
|
+
* 停止任务
|
|
1823
|
+
* @param taskOrName
|
|
1824
|
+
* @returns {Promise<{}|{cron: *, _message_: string}|{_message_: string}>}
|
|
1825
|
+
*/
|
|
1826
|
+
|
|
1827
|
+
|
|
1828
|
+
static async stop(taskOrName) {
|
|
1829
|
+
if (!this.envAllowed()) return {};
|
|
1830
|
+
let task = taskOrName;
|
|
1831
|
+
|
|
1832
|
+
if (typeof task === "string") {
|
|
1833
|
+
task = this.findTask(taskOrName);
|
|
1834
|
+
}
|
|
1835
|
+
|
|
1836
|
+
if (!task) throw [err.INVALID_PARAM, `任务${taskOrName}不存在`];
|
|
1837
|
+
|
|
1838
|
+
if (task.schedule) {
|
|
1839
|
+
task.schedule.stop();
|
|
1840
|
+
task.schedule = null;
|
|
1841
|
+
return this.getTaskInfo(task, "任务已停止。");
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1844
|
+
return this.getTaskInfo(task, "任务未启动,无需停止。");
|
|
1845
|
+
}
|
|
1846
|
+
/**
|
|
1847
|
+
* 获取或设置当前状态(来自远程的API调用)
|
|
1848
|
+
* @param options
|
|
1849
|
+
* @returns {Promise<unknown>}
|
|
1850
|
+
*/
|
|
1851
|
+
|
|
1852
|
+
|
|
1853
|
+
static async state(options) {
|
|
1854
|
+
const params = options.replacements; // await commonMessenger.parametersOK(params, "taskName");
|
|
1855
|
+
|
|
1856
|
+
const req = options._res.req;
|
|
1857
|
+
|
|
1858
|
+
if (req) {
|
|
1859
|
+
if (req.method === 'GET') {
|
|
1860
|
+
delete params.state;
|
|
1861
|
+
} else {
|
|
1862
|
+
await apiUtil$1.parametersOK(params, 'taskName', "state");
|
|
1863
|
+
}
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
if (this.envAllowed()) {
|
|
1867
|
+
return this._state(params);
|
|
1868
|
+
} // 环境变量启用计划任务,但当前环境不能执行,
|
|
1869
|
+
// 说明收到此API请求的进程不是第一个进程,或者此前服务器不是第一台服务器,
|
|
1870
|
+
// 这种情况下,将此请求作为消息发布出去,
|
|
1871
|
+
// 第一台服务器的第一个进程收到消息后进行处理,再将结果作为消息发布,
|
|
1872
|
+
// 本进程收到处理结果后果作为响应发送回客户端
|
|
1873
|
+
|
|
1874
|
+
|
|
1875
|
+
if (process.env.SCHEDULE_ENABLED) {
|
|
1876
|
+
let replyId = ppUtil$1.newGuid();
|
|
1877
|
+
return await new Promise((resolve, reject) => {
|
|
1878
|
+
commonMessenger$1.setMessageHandle(message => {
|
|
1879
|
+
if (message._type === MT_SCHEDULE_STATE_REPLY && message.replyId === replyId) {
|
|
1880
|
+
replyId = '';
|
|
1881
|
+
resolve(message.result);
|
|
1882
|
+
return;
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
if (message._type === MT_SCHEDULE_STATE) {
|
|
1886
|
+
if (schedule$1.enabled()) {
|
|
1887
|
+
message.result = schedule$1._state(message.params);
|
|
1888
|
+
message._type = MT_SCHEDULE_STATE_REPLY;
|
|
1889
|
+
message.destAddr = message.replyAddr;
|
|
1890
|
+
commonMessenger$1.publishMessage(message);
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
});
|
|
1894
|
+
commonMessenger$1.publishMessage({
|
|
1895
|
+
_type: MT_SCHEDULE_STATE,
|
|
1896
|
+
replyId,
|
|
1897
|
+
replyAddr: conf.myMsgAddr,
|
|
1898
|
+
params
|
|
1899
|
+
}).catch(e => {
|
|
1900
|
+
replyId = '';
|
|
1901
|
+
reject(e);
|
|
1902
|
+
});
|
|
1903
|
+
setTimeout(() => {
|
|
1904
|
+
if (replyId) {
|
|
1905
|
+
reject("schedule.state: 等待处理结果超时");
|
|
1906
|
+
}
|
|
1907
|
+
}, 2 * 60 * 1000);
|
|
1908
|
+
});
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
return {
|
|
1912
|
+
_message_: "此环境无自动任务"
|
|
1913
|
+
};
|
|
1914
|
+
}
|
|
1915
|
+
|
|
1916
|
+
static async _state(params) {
|
|
1917
|
+
let apiResult = {};
|
|
1918
|
+
let task;
|
|
1919
|
+
|
|
1920
|
+
if (params.taskName) {
|
|
1921
|
+
task = this.findTask(params.taskName);
|
|
1922
|
+
if (!task) throw [err.INVALID_PARAM, `任务${params.taskName}不存在`];
|
|
1923
|
+
}
|
|
1924
|
+
|
|
1925
|
+
if (params.state) {
|
|
1926
|
+
if ("started" === params.state) {
|
|
1927
|
+
apiResult = await this.start(task, params.cron);
|
|
1928
|
+
} else if ("stopped" === params.state) {
|
|
1929
|
+
apiResult = await this.stop(task);
|
|
1930
|
+
} else {
|
|
1931
|
+
throw [err.INVALID_PARAM, `(${params.state}), 只能是 started/stopped`];
|
|
1932
|
+
}
|
|
1933
|
+
|
|
1934
|
+
if (params.runOnce) {
|
|
1935
|
+
task = this.findTask(params.taskName);
|
|
1936
|
+
apiResult._message_ += "\n正在手动执行任务"; // await
|
|
1937
|
+
|
|
1938
|
+
task.doScheduleTask();
|
|
1939
|
+
}
|
|
1940
|
+
|
|
1941
|
+
return this.getTaskInfo(task, apiResult._message_);
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
if (task) {
|
|
1945
|
+
return this.getTaskInfo(task);
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
const result = [];
|
|
1949
|
+
|
|
1950
|
+
for (let k in this.tasks) {
|
|
1951
|
+
result.push(this.getTaskInfo(this.tasks[k]));
|
|
1952
|
+
}
|
|
1953
|
+
|
|
1954
|
+
return result;
|
|
1955
|
+
}
|
|
1956
|
+
|
|
1957
|
+
static deleteTask(taskName) {
|
|
1958
|
+
delete this.tasks[taskName];
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1961
|
+
static findTask(taskName) {
|
|
1962
|
+
return this.tasks[taskName];
|
|
1963
|
+
}
|
|
1964
|
+
/**
|
|
1965
|
+
* 确定当前进程环境是否启用自动任务
|
|
1966
|
+
* @returns {Promise<void>}
|
|
1967
|
+
*/
|
|
1968
|
+
|
|
1969
|
+
|
|
1970
|
+
static envAllowed() {
|
|
1971
|
+
let enabled = // PM2配置中指定了环境变量 SCHEDULE_ENABLED
|
|
1972
|
+
!!process.env.SCHEDULE_ENABLED // 如果PM2启动了多个进程,则只在第一个进程执行
|
|
1973
|
+
&& process.env.NODE_APP_INSTANCE === '0'; // 如果有多台服务器,则只在第一台执行
|
|
1974
|
+
|
|
1975
|
+
if (enabled && conf.appSetting.serverHosts && conf.appSetting.serverHosts.length > 1) {
|
|
1976
|
+
enabled = conf.myMsgAddr.indexOf(conf.appSetting.serverHosts[0]) === 0;
|
|
1977
|
+
}
|
|
1978
|
+
|
|
1979
|
+
return enabled;
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1982
|
+
}
|
|
1983
|
+
|
|
1984
|
+
var ppSchedule = schedule$1;
|
|
1706
1985
|
|
|
1707
1986
|
const apiUtil = ppUtilApi;
|
|
1708
1987
|
const preconditions = ppPrecond;
|
|
1709
1988
|
const commonMessenger = ppMessengerEx;
|
|
1989
|
+
const schedule = ppSchedule;
|
|
1710
1990
|
var ppUtil = {
|
|
1711
1991
|
apiUtil,
|
|
1712
1992
|
preconditions,
|
|
1713
|
-
commonMessenger
|
|
1993
|
+
commonMessenger,
|
|
1994
|
+
schedule
|
|
1714
1995
|
};
|
|
1715
1996
|
|
|
1716
1997
|
module.exports = ppUtil;
|