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