abler-api 0.1.26 → 0.1.29

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.
@@ -1,29 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var require$$0$1 = require('crypto');
3
+ 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$$0$2 = require('fs');
7
+ var require$$4 = require('fs');
8
8
  var require$$1$1 = require('path');
9
+ var require$$1$2 = require('abler-messenger');
10
+ var require$$0$1 = require('node-cron');
9
11
 
10
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
13
 
12
- var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$1);
14
+ var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);
13
15
  var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);
14
16
  var require$$2__default = /*#__PURE__*/_interopDefaultLegacy(require$$2);
15
17
  var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3);
16
- var require$$0__default$2 = /*#__PURE__*/_interopDefaultLegacy(require$$0$2);
18
+ var require$$4__default = /*#__PURE__*/_interopDefaultLegacy(require$$4);
17
19
  var require$$1__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$1$1);
20
+ var require$$1__default$2 = /*#__PURE__*/_interopDefaultLegacy(require$$1$2);
21
+ var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$1);
18
22
 
19
- const crypto = require$$0__default$1["default"];
23
+ const crypto = require$$0__default["default"];
20
24
  const ppUtil$4 = require$$1__default["default"].ppUtil;
21
25
  const {
22
26
  dbUtil,
23
27
  kvStorage
24
28
  } = require$$2__default["default"];
25
29
  const netUtil$1 = require$$3__default["default"];
26
- let conf$2, appSetting$1, err$1, dbSql;
30
+ const fs$1 = require$$4__default["default"];
31
+ let conf$3, appSetting$1, err$2, dbSql;
27
32
  const pnToken = "access_token",
28
33
  hnToken = pnToken,
29
34
  pnApiKey = "apiKey",
@@ -34,7 +39,7 @@ pnApiSecret = "apiSecret",
34
39
  const MD5 = ppUtil$4.MD5,
35
40
  moveProperty = ppUtil$4.moveProperty;
36
41
 
37
- class apiUtil$1 {
42
+ class apiUtil$2 {
38
43
  static debugFlag = ppUtil$4.newGuid(); //应用必须设置,否则谁也不知道是啥
39
44
 
40
45
  static testFlag = ppUtil$4.newGuid();
@@ -42,11 +47,11 @@ class apiUtil$1 {
42
47
 
43
48
  static config(appConfig, appErrCfg, appDbSql) {
44
49
  ppUtil$4.config(appConfig, appErrCfg);
45
- conf$2 = appConfig;
46
- appSetting$1 = conf$2?.appSetting;
47
- err$1 = appErrCfg, dbSql = appDbSql;
48
- apiUtil$1.debugFlag = appSetting$1?.debugFlag || apiUtil$1.debugFlag;
49
- apiUtil$1.testFlag = appSetting$1?.testFlag || apiUtil$1.testFlag; // apiUtil.apiCallRecSaver = apiCallRecSaver;
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;
50
55
  } //#region ===== 需要应用系统重写的方法
51
56
 
52
57
  /**
@@ -134,7 +139,7 @@ class apiUtil$1 {
134
139
  req._requestParams = Object.assign(req.params, req._requestParams);
135
140
  }
136
141
 
137
- apiUtil$1.setParamsFunctions(req._requestParams);
142
+ apiUtil$2.setParamsFunctions(req._requestParams);
138
143
  }
139
144
 
140
145
  return req._requestParams;
@@ -145,11 +150,11 @@ class apiUtil$1 {
145
150
  return req.tokenData;
146
151
  }
147
152
 
148
- let params = apiUtil$1.extractParams(req);
153
+ let params = apiUtil$2.extractParams(req);
149
154
  let tokenData = {
150
155
  apiKey: req.headers[hnApiKey] || params[pnApiKey],
151
156
  apiSecret: req.headers[hnApiSecret] || params[pnApiSecret],
152
- clientIp: apiUtil$1.getClientIp(req)
157
+ clientIp: apiUtil$2.getClientIp(req)
153
158
  };
154
159
  return tokenData;
155
160
  }
@@ -166,7 +171,7 @@ class apiUtil$1 {
166
171
  let result = +this[name];
167
172
 
168
173
  if (typeof result !== "number" || result < minValue || result > maxValue) {
169
- throw [err$1.INVALID_PARAM, `参数 ${name} 必须是 ${minValue} ~ ${maxValue} 之间的数字`];
174
+ throw [err$2.INVALID_PARAM, `参数 ${name} 必须是 ${minValue} ~ ${maxValue} 之间的数字`];
170
175
  }
171
176
 
172
177
  return result;
@@ -236,7 +241,7 @@ class apiUtil$1 {
236
241
 
237
242
  static apiFail(error, req) {
238
243
  configNeeded();
239
- let response = err$1.ERROR(error, err$1.errorLangParamFlag + ppUtil$4.getMsgLang(req));
244
+ let response = err$2.ERROR(error, err$2.errorLangParamFlag + ppUtil$4.getMsgLang(req));
240
245
  response.datetime = new Date();
241
246
 
242
247
  if (req && req.headers) {
@@ -258,8 +263,8 @@ class apiUtil$1 {
258
263
 
259
264
 
260
265
  static spoApiSucc(data, req) {
261
- let params = apiUtil$1.extractParams(req);
262
- return apiUtil$1.apiSuccess(data, req, params.spOrderNum);
266
+ let params = apiUtil$2.extractParams(req);
267
+ return apiUtil$2.apiSuccess(data, req, params.spOrderNum);
263
268
  }
264
269
  /**
265
270
  * 生成面向服务商的API失败返回结果
@@ -270,8 +275,8 @@ class apiUtil$1 {
270
275
 
271
276
 
272
277
  static spoApiFail(error, req) {
273
- let params = apiUtil$1.extractParams(req);
274
- return apiUtil$1.apiFail(error, req, params.spOrderNum);
278
+ let params = apiUtil$2.extractParams(req);
279
+ return apiUtil$2.apiFail(error, req, params.spOrderNum);
275
280
  }
276
281
  /**
277
282
  * API 服务结束,发送响应
@@ -308,10 +313,10 @@ class apiUtil$1 {
308
313
  static async responseOf(response, promise) {
309
314
  promise.then(function (data) {
310
315
  // console.log('RES:', apiSuccess(data));
311
- if (!response.finished) response.send(apiUtil$1.apiSuccess(data, response.req));
316
+ if (!response.finished) response.send(apiUtil$2.apiSuccess(data, response.req));
312
317
  }, function (error) {
313
318
  console.log('ERROR:', error);
314
- if (!response.finished) response.send(apiUtil$1.apiFail(error, response.req));
319
+ if (!response.finished) response.send(apiUtil$2.apiFail(error, response.req));
315
320
  });
316
321
  }
317
322
  /**
@@ -323,16 +328,16 @@ class apiUtil$1 {
323
328
 
324
329
  static async spoApiResponse(response, promise) {
325
330
  promise.then(function (result) {
326
- let responseData = apiUtil$1.spoApiSucc(result, response.req);
331
+ let responseData = apiUtil$2.spoApiSucc(result, response.req);
327
332
 
328
- apiUtil$1._saveApiCallRec(response.req.apiCallRec, responseData);
333
+ apiUtil$2._saveApiCallRec(response.req.apiCallRec, responseData);
329
334
 
330
335
  if (!response.finished) response.send(responseData);
331
336
  }, function (error) {
332
337
  console.log('ERROR:', error);
333
- let responseData = apiUtil$1.spoApiFail(error, response.req);
338
+ let responseData = apiUtil$2.spoApiFail(error, response.req);
334
339
 
335
- apiUtil$1._saveApiCallRec(response.req.apiCallRec, responseData);
340
+ apiUtil$2._saveApiCallRec(response.req.apiCallRec, responseData);
336
341
 
337
342
  if (!response.finished) response.send(responseData);
338
343
  });
@@ -349,7 +354,7 @@ class apiUtil$1 {
349
354
  req.headers.timestamp = new Date().valueOf(); // let options = {replacements: {}};
350
355
 
351
356
  let options = {};
352
- let parameters = apiUtil$1.extractParams(req);
357
+ let parameters = apiUtil$2.extractParams(req);
353
358
 
354
359
  for (let qryParam in parameters) {
355
360
  if (qryParam !== 'token') {
@@ -381,7 +386,7 @@ class apiUtil$1 {
381
386
  // }
382
387
 
383
388
  options.userInfo = req.userInfo;
384
- return apiUtil$1.setOptionsPropFuncions(options, res);
389
+ return apiUtil$2.setOptionsPropFuncions(options, res);
385
390
  }
386
391
  /**
387
392
  * 为API请求 options 设置属性
@@ -446,7 +451,7 @@ class apiUtil$1 {
446
451
  let token = req.headers[hnToken] || req.headers['x-access-token']; //向后兼容
447
452
 
448
453
  if (!token) {
449
- let params = apiUtil$1.extractParams(req);
454
+ let params = apiUtil$2.extractParams(req);
450
455
  token = params[pnToken];
451
456
 
452
457
  if (token) {
@@ -457,12 +462,12 @@ class apiUtil$1 {
457
462
  delete params.token;
458
463
  } else {
459
464
  // 如果没有token,则返回错误
460
- console.log(err$1.TOKEN_NEEDED);
465
+ console.log(err$2.TOKEN_NEEDED);
461
466
 
462
467
  if (res) {
463
- res.send(err$1.ERROR(err$1.TOKEN_NEEDED));
468
+ res.send(err$2.ERROR(err$2.TOKEN_NEEDED));
464
469
  } else if (!noErr) {
465
- throw err$1.TOKEN_NEEDED;
470
+ throw err$2.TOKEN_NEEDED;
466
471
  }
467
472
  }
468
473
  }
@@ -481,8 +486,8 @@ class apiUtil$1 {
481
486
 
482
487
  static async checkInternalToken(req) {
483
488
  // return await checkInternalToken(req);
484
- const params = apiUtil$1.extractParams(req);
485
- req.accessToken = req.accessToken || apiUtil$1.extractToken(req);
489
+ const params = apiUtil$2.extractParams(req);
490
+ req.accessToken = req.accessToken || apiUtil$2.extractToken(req);
486
491
 
487
492
  if (req.accessToken === MD5(ppUtil$4.idNumDisturbing)) {
488
493
  //todo: 检查IP
@@ -505,7 +510,7 @@ class apiUtil$1 {
505
510
  return true;
506
511
  } else {
507
512
  // console.log('token error.', req.accessToken);
508
- throw err$1.TOKEN_INVALID;
513
+ throw err$2.TOKEN_INVALID;
509
514
  }
510
515
  }
511
516
  /**
@@ -516,16 +521,16 @@ class apiUtil$1 {
516
521
 
517
522
 
518
523
  static async checkRequestToken(req) {
519
- req.accessToken = req.accessToken || apiUtil$1.extractToken(req);
520
- const tokenKey = apiUtil$1.userTokenStoreKey(req.accessToken);
521
- const expireTime = apiUtil$1.tokenExpireTime(req);
522
- return await apiUtil$1.restoreTokenData(tokenKey, expireTime).then(async function (data) {
523
- req.userInfo = apiUtil$1.setUserIdNo(data, data._idNo);
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);
524
529
  if (req.tokenValidater) await req.tokenValidater(req.userInfo, req);
525
530
  return true;
526
531
  }, async function (e) {
527
532
  // 如果给定的token不存在,看看是不是平台内部调用
528
- return await apiUtil$1.checkInternalToken(req);
533
+ return await apiUtil$2.checkInternalToken(req);
529
534
  });
530
535
  }
531
536
  /**
@@ -537,7 +542,7 @@ class apiUtil$1 {
537
542
 
538
543
  static isDebugMode(req) {
539
544
  if (req.__debug__ === undefined) {
540
- let dbgToken = req.headers['__debug__'] || req.headers[apiUtil$1.debugFlag];
545
+ let dbgToken = req.headers['__debug__'] || req.headers[apiUtil$2.debugFlag];
541
546
 
542
547
  if (dbgToken) {
543
548
  let envId = process.env.ECS_DEPLOY_ID;
@@ -559,11 +564,11 @@ class apiUtil$1 {
559
564
 
560
565
  static isTestMode(req) {
561
566
  if (req.__postman__ === undefined) {
562
- let dbgToken = req.headers["__postman__"] || req.headers[apiUtil$1.testFlag];
567
+ let dbgToken = req.headers["__postman__"] || req.headers[apiUtil$2.testFlag];
563
568
 
564
569
  if (dbgToken) {
565
570
  let envId = process.env.ECS_DEPLOY_ID;
566
- let testToken = MD5(req.headers.timestamp, apiUtil$1.extractToken(req, null, true) || req.headers.apikey);
571
+ let testToken = MD5(req.headers.timestamp, apiUtil$2.extractToken(req, null, true) || req.headers.apikey);
567
572
  req.__postman__ = dbgToken === testToken && (envId.indexOf("myfacesign.com") < 0 || envId.indexOf(".dev.") > 0);
568
573
  } else {
569
574
  req.__postman__ = false;
@@ -580,7 +585,7 @@ class apiUtil$1 {
580
585
 
581
586
 
582
587
  static tokenExpireTime(req) {
583
- return apiUtil$1.isDebugMode(req) ? 30 * 24 * 60 * 60 : apiUtil$1.isTestMode(req) ? 4 * 60 * 60 : appSetting$1.tokenExpireTime;
588
+ return apiUtil$2.isDebugMode(req) ? 30 * 24 * 60 * 60 : apiUtil$2.isTestMode(req) ? 4 * 60 * 60 : appSetting$1.tokenExpireTime;
584
589
  }
585
590
  /**
586
591
  * 获取用户令牌保存键
@@ -623,7 +628,7 @@ class apiUtil$1 {
623
628
  static setUserIdNo(userInfo, idNum) {
624
629
  if (userInfo && idNum) {
625
630
  userInfo._idNo = idNum;
626
- userInfo.isHKIC = apiUtil$1.checkIsHKIC(idNum);
631
+ userInfo.isHKIC = apiUtil$2.checkIsHKIC(idNum);
627
632
  }
628
633
 
629
634
  return userInfo;
@@ -640,7 +645,7 @@ class apiUtil$1 {
640
645
 
641
646
  static async storeToken(token, tokenData, dataId, req) {
642
647
  // let timeout = tokenData.clientIp.substring(0, 8) == "192.168." ? 90 * 24 : 1;
643
- let timeout = apiUtil$1.tokenExpireTime(req);
648
+ let timeout = apiUtil$2.tokenExpireTime(req);
644
649
 
645
650
  if (req.certPublicKey) {
646
651
  tokenData.certPublicKey = req.certPublicKey;
@@ -788,7 +793,7 @@ class apiUtil$1 {
788
793
  return certInfo;
789
794
  }).catch(e => {
790
795
  console.log('获取企业证书失败:\n', e);
791
- throw [err$1.ACCESS_REFUSED, `获取企业证书失败:${err$1.ERROR(e).message}`];
796
+ throw [err$2.ACCESS_REFUSED, `获取企业证书失败:${err$2.ERROR(e).message}`];
792
797
  });
793
798
  }
794
799
  /**
@@ -802,27 +807,27 @@ class apiUtil$1 {
802
807
  static async verifyApiSignature(tokenData, req) {
803
808
  try {
804
809
  if (!req.headers.timestamp) {
805
- throw [err$1.ACCESS_REFUSED, `必须在请求头中设置时戳`];
810
+ throw [err$2.ACCESS_REFUSED, `必须在请求头中设置时戳`];
806
811
  }
807
812
 
808
813
  let timestamp = parseInt(req.headers.timestamp);
809
814
  let currentTime = new Date().valueOf();
810
- let maxTimeDiff = apiUtil$1.isDebugMode(req) ? 7 * 24 * 3600 : apiUtil$1.isTestMode(req) ? 4 * 3600 : 100; // 100
815
+ let maxTimeDiff = apiUtil$2.isDebugMode(req) ? 7 * 24 * 3600 : apiUtil$2.isTestMode(req) ? 4 * 3600 : 100; // 100
811
816
 
812
817
  if (timestamp.toString() == "NaN" || currentTime < timestamp - 5000 || currentTime - timestamp > maxTimeDiff * 1000) {
813
- throw [err$1.ACCESS_REFUSED, `时戳(${timestamp})无效,当前时戳:${currentTime},时差 ${(currentTime - timestamp) / 1000}秒`];
818
+ throw [err$2.ACCESS_REFUSED, `时戳(${timestamp})无效,当前时戳:${currentTime},时差 ${(currentTime - timestamp) / 1000}秒`];
814
819
  }
815
820
 
816
821
  let signature = req.headers.signature;
817
822
 
818
823
  if (!signature) {
819
- throw [err$1.ACCESS_REFUSED, `必须在请求头中提供签名`];
824
+ throw [err$2.ACCESS_REFUSED, `必须在请求头中提供签名`];
820
825
  }
821
826
 
822
- let signData = apiUtil$1.extractToken(req, null, true) || tokenData.apiKey;
827
+ let signData = apiUtil$2.extractToken(req, null, true) || tokenData.apiKey;
823
828
  signData += timestamp;
824
829
 
825
- if (apiUtil$1.isDebugMode(req) || apiUtil$1.isTestMode(req)) {
830
+ if (apiUtil$2.isDebugMode(req) || apiUtil$2.isTestMode(req)) {
826
831
  let publicKey = req.headers.publickey || req.body.publicKey || req.query.publicKey;
827
832
 
828
833
  if (publicKey) {
@@ -837,16 +842,16 @@ class apiUtil$1 {
837
842
  return await verifyResult;
838
843
  }
839
844
 
840
- return apiUtil$1.getCompanyCertificate(tokenData.apiKey).then(info => {
845
+ return apiUtil$2.getCompanyCertificate(tokenData.apiKey).then(info => {
841
846
  tokenData.certPublicKey = info.certLiving;
842
847
  tokenData.certPublicKeySpare = info.certSpare;
843
848
  tokenData.certLivingId = info.certLivingId;
844
849
  tokenData.certSpareId = info.certSpareId;
845
850
  req.certPublicKey = info.certLiving;
846
- let token = apiUtil$1.extractToken(req, null, true);
851
+ let token = apiUtil$2.extractToken(req, null, true);
847
852
 
848
853
  if (token) {
849
- apiUtil$1.storeToken(apiUtil$1.apiTokenStoreKey(token), tokenData, tokenData.apiKey, req);
854
+ apiUtil$2.storeToken(apiUtil$2.apiTokenStoreKey(token), tokenData, tokenData.apiKey, req);
850
855
  }
851
856
  }).then(() => {
852
857
  return doVerify(signData, signature, tokenData.certPublicKey);
@@ -871,7 +876,7 @@ class apiUtil$1 {
871
876
 
872
877
  if (!tokenData.certPublicKeySpare) {
873
878
  throw {
874
- eo: err$1.ACCESS_REFUSED,
879
+ eo: err$2.ACCESS_REFUSED,
875
880
  msgArgv: "签名验证异常",
876
881
  data: e
877
882
  };
@@ -908,10 +913,10 @@ class apiUtil$1 {
908
913
  delete tokenData.certLivingId;
909
914
  delete tokenData.certSpareId;
910
915
  delete tokenData.certPublicKeySpare;
911
- let token = apiUtil$1.extractToken(req);
916
+ let token = apiUtil$2.extractToken(req);
912
917
 
913
918
  if (token) {
914
- apiUtil$1.storeToken(apiTokenStoreKey(token), tokenData, tokenData.apiKey, req);
919
+ apiUtil$2.storeToken(apiTokenStoreKey(token), tokenData, tokenData.apiKey, req);
915
920
  }
916
921
 
917
922
  console.log(`公司(${tokenData.apiKey})备用证书成功转换为正式证书`);
@@ -920,7 +925,7 @@ class apiUtil$1 {
920
925
  } catch (e) {
921
926
  console.log("SPO服务签名验证异常(备用证书), ", e);
922
927
  throw {
923
- eo: err$1.ACCESS_REFUSED,
928
+ eo: err$2.ACCESS_REFUSED,
924
929
  msgArgv: "签名验证异常(spare)",
925
930
  data: e
926
931
  };
@@ -929,7 +934,7 @@ class apiUtil$1 {
929
934
 
930
935
  if (!verifyOK) {
931
936
  console.log("SPO服务签名验证失败, tokenData: ", tokenData);
932
- throw [err$1.ACCESS_REFUSED, "签名验证未通过"];
937
+ throw [err$2.ACCESS_REFUSED, "签名验证未通过"];
933
938
  }
934
939
 
935
940
  return verifyOK;
@@ -945,32 +950,32 @@ class apiUtil$1 {
945
950
 
946
951
  static async checkApiCallValid(tokenData, req) {
947
952
  if (!tokenData.companyInfo) {
948
- tokenData.companyInfo = await apiUtil$1.queryCompanyInfo(tokenData.apiKey, true).catch(e => {
953
+ tokenData.companyInfo = await apiUtil$2.queryCompanyInfo(tokenData.apiKey, true).catch(e => {
949
954
  console.log("执行企业信息查询发生异常", e);
950
- throw [err$1.API_KEY_INVALID, "执行企业信息查询发生异常:" + e.message || ""];
955
+ throw [err$2.API_KEY_INVALID, "执行企业信息查询发生异常:" + e.message || ""];
951
956
  });
952
957
  }
953
958
 
954
959
  const companyInfo = tokenData.companyInfo;
955
960
 
956
961
  if (companyInfo != null) {
957
- let secret = apiUtil$1._getApiSecret(tokenData.apiKey);
962
+ let secret = apiUtil$2._getApiSecret(tokenData.apiKey);
958
963
 
959
- if (secret !== tokenData.apiSecret) throw err$1.API_SCREPT_INVALID; // 不再检查 IP 白名单,改为验证证书签名
964
+ if (secret !== tokenData.apiSecret) throw err$2.API_SCREPT_INVALID; // 不再检查 IP 白名单,改为验证证书签名
960
965
  // console.log("fromIp:", tokenData.clientIp, "ipWhiteList:", companyInfo.ipWhiteList);
961
966
  // let whiteList = companyInfo.ipWhiteList || "";
962
967
  // // 没有设置ip白名单的就不检查了
963
968
  // if (whiteList == "" || ipMatched(tokenData.clientIp, whiteList + ",127.0.0.1,1"))
964
969
 
965
- if (apiUtil$1.signatureVerified()) return companyInfo;
966
- return apiUtil$1.verifyApiSignature(tokenData, req).then(x => {
970
+ if (apiUtil$2.signatureVerified()) return companyInfo;
971
+ return apiUtil$2.verifyApiSignature(tokenData, req).then(x => {
967
972
  return companyInfo;
968
973
  }, e => {
969
974
  throw e;
970
975
  });
971
976
  }
972
977
 
973
- throw [err$1.API_KEY_INVALID, tokenData.apiKey];
978
+ throw [err$2.API_KEY_INVALID, tokenData.apiKey];
974
979
  }
975
980
  /**
976
981
  * 检查令牌数据是否存在
@@ -1021,7 +1026,7 @@ class apiUtil$1 {
1021
1026
  paramExists = typeof params[paramName] != 'undefined' || typeof params[paramName + paramSufix] != 'undefined';
1022
1027
  }
1023
1028
 
1024
- if (!paramExists) return ppUtil$4.errorPormise(err$1.ERROR(err$1.PARAMETER_NEEDED, paramName));
1029
+ if (!paramExists) return ppUtil$4.errorPormise(err$2.ERROR(err$2.PARAMETER_NEEDED, paramName));
1025
1030
  }
1026
1031
 
1027
1032
  return Promise.resolve(paramSufix);
@@ -1069,7 +1074,7 @@ class apiUtil$1 {
1069
1074
 
1070
1075
 
1071
1076
  static async hostIsMySelf(host, req) {
1072
- let clientIp = apiUtil$1.getClientIp(req);
1077
+ let clientIp = apiUtil$2.getClientIp(req);
1073
1078
  return ppUtil$4.getMyIp({
1074
1079
  hosts: [host, clientIp]
1075
1080
  });
@@ -1084,13 +1089,13 @@ class apiUtil$1 {
1084
1089
  static async checkForwardsHost(options) {
1085
1090
  configNeeded();
1086
1091
  const params = options.replacements;
1087
- const myEnvHosts = apiUtil$1.getEnvHosts(params);
1092
+ const myEnvHosts = apiUtil$2.getEnvHosts(params);
1088
1093
  const myIp = ppUtil$4.getMyIp();
1089
1094
  const host = params.host || myIp;
1090
- if (!myEnvHosts.hosts.contains(host)) throw [err$1.ACCESS_REFUSED, `环境${conf$2.envId}貌似无此主机:${params.host}`];
1095
+ if (!myEnvHosts.hosts.contains(host)) throw [err$2.ACCESS_REFUSED, `环境${conf$3.envId}貌似无此主机:${params.host}`];
1091
1096
 
1092
- if (!apiUtil$1.hostIsMySelf(host, options._res.req)) {
1093
- let result = await apiUtil$1.forwardsTo(host, myEnvHosts.port, params, options._res.req, myIp);
1097
+ if (!apiUtil$2.hostIsMySelf(host, options._res.req)) {
1098
+ let result = await apiUtil$2.forwardsTo(host, myEnvHosts.port, params, options._res.req, myIp);
1094
1099
 
1095
1100
  options._res.send(result);
1096
1101
 
@@ -1126,7 +1131,7 @@ class apiUtil$1 {
1126
1131
 
1127
1132
  if (result.status !== 200) {
1128
1133
  console.log(`访问 ${reqOptions.url} 出错`, result.status, result.res.statusMessage);
1129
- throw [err$1.EXCEPTION, `[${result.status}] - ${result.res.statusMessage}`];
1134
+ throw [err$2.EXCEPTION, `[${result.status}] - ${result.res.statusMessage}`];
1130
1135
  }
1131
1136
 
1132
1137
  return result.data;
@@ -1142,7 +1147,7 @@ class apiUtil$1 {
1142
1147
  let keys = Array.isArray(keyPath) ? keyPath : keyPath.split(".");
1143
1148
  let parentKey = "";
1144
1149
  let key = "config";
1145
- let value = conf$2;
1150
+ let value = conf$3;
1146
1151
  let parent = null;
1147
1152
 
1148
1153
  for (let i = 0; i < keys.length; i++) {
@@ -1152,7 +1157,7 @@ class apiUtil$1 {
1152
1157
  value = parent[key];
1153
1158
 
1154
1159
  if (value === undefined) {
1155
- throw [err$1.INVALID_PARAM, `无此配置项: ${key}`];
1160
+ throw [err$2.INVALID_PARAM, `无此配置项: ${key}`];
1156
1161
  }
1157
1162
  }
1158
1163
 
@@ -1172,10 +1177,10 @@ class apiUtil$1 {
1172
1177
 
1173
1178
  static async $checkToken(req, res, next) {
1174
1179
  try {
1175
- await apiUtil$1.checkRequestToken(req);
1180
+ await apiUtil$2.checkRequestToken(req);
1176
1181
  await next();
1177
1182
  } catch (e) {
1178
- res.send(err$1.ERROR(e));
1183
+ res.send(err$2.ERROR(e));
1179
1184
  }
1180
1185
 
1181
1186
  return false;
@@ -1192,7 +1197,7 @@ class apiUtil$1 {
1192
1197
  let token = req.headers["access_token"] || req.headers['x-access-token']; //向后兼容
1193
1198
 
1194
1199
  if (!token) {
1195
- let params = apiUtil$1.extractParams(req);
1200
+ let params = apiUtil$2.extractParams(req);
1196
1201
  token = params["access_token"];
1197
1202
 
1198
1203
  if (token) {
@@ -1215,15 +1220,15 @@ class apiUtil$1 {
1215
1220
 
1216
1221
  try {
1217
1222
  if (extractToken(req, res)) {
1218
- await apiUtil$1.restoreTokenData(apiUtil$1.userTokenStoreKey(req.accessToken), apiUtil$1.tokenExpireTime(req)).then(function (data) {
1219
- req.userInfo = apiUtil$1.setUserIdNo(data, data._idNo);
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);
1220
1225
  }, function (e) {//no token
1221
1226
  });
1222
1227
  }
1223
1228
 
1224
1229
  return true;
1225
1230
  } catch (e) {
1226
- res.send(err$1.ERROR(e));
1231
+ res.send(err$2.ERROR(e));
1227
1232
  return false;
1228
1233
  }
1229
1234
  }
@@ -1246,7 +1251,7 @@ class apiUtil$1 {
1246
1251
  req.isMobile = true;
1247
1252
 
1248
1253
  if (!req.signatureVerified) {
1249
- let params = apiUtil$1.extractParams(req);
1254
+ let params = apiUtil$2.extractParams(req);
1250
1255
  moveProperty(params, req.headers, "access_token");
1251
1256
  moveProperty(params, req.headers, "timestamp");
1252
1257
 
@@ -1267,25 +1272,25 @@ class apiUtil$1 {
1267
1272
 
1268
1273
  static $checkApiKeyOld(req, res, next) {
1269
1274
  //检查post的信息或者url查询参数或者头信息
1270
- let tokenData = apiUtil$1.extractTokenData(req);
1271
- let params = apiUtil$1.extractParams(req);
1272
- apiUtil$1.createApiCallRec(tokenData, req);
1275
+ let tokenData = apiUtil$2.extractTokenData(req);
1276
+ let params = apiUtil$2.extractParams(req);
1277
+ apiUtil$2.createApiCallRec(tokenData, req);
1273
1278
  let errResponse = null;
1274
1279
 
1275
1280
  if (!tokenData.clientIp) {
1276
- errResponse = apiUtil$1.spoApiFail(err$1.GET_CLIENTIP_FAIL, req);
1281
+ errResponse = apiUtil$2.spoApiFail(err$2.GET_CLIENTIP_FAIL, req);
1277
1282
  } else if (!tokenData.apiKey) {
1278
- errResponse = apiUtil$1.spoApiFail([err$1.PARAMETER_NEEDED, "apiKey"], req);
1283
+ errResponse = apiUtil$2.spoApiFail([err$2.PARAMETER_NEEDED, "apiKey"], req);
1279
1284
  } else if (!tokenData.apiSecret) {
1280
- errResponse = apiUtil$1.spoApiFail([err$1.PARAMETER_NEEDED, "apiSecret"], req);
1285
+ errResponse = apiUtil$2.spoApiFail([err$2.PARAMETER_NEEDED, "apiSecret"], req);
1281
1286
  }
1282
1287
 
1283
1288
  if (errResponse != null) {
1284
- apiUtil$1._saveApiCallRec(req.apiCallRec, errResponse);
1289
+ apiUtil$2._saveApiCallRec(req.apiCallRec, errResponse);
1285
1290
 
1286
- apiUtil$1.sendOrRedirect(req, res, errResponse);
1291
+ apiUtil$2.sendOrRedirect(req, res, errResponse);
1287
1292
  } else {
1288
- apiUtil$1.checkApiCallValid(tokenData, req).then(companyInfo => {
1293
+ apiUtil$2.checkApiCallValid(tokenData, req).then(companyInfo => {
1289
1294
  params.companyId = params.companyId || companyInfo.companyId;
1290
1295
  req.companyInfo = companyInfo;
1291
1296
  next();
@@ -1293,9 +1298,9 @@ class apiUtil$1 {
1293
1298
  console.log('apiCallInvalid:', e);
1294
1299
  let errResponse = spoApiFail(e, req);
1295
1300
 
1296
- apiUtil$1._saveApiCallRec(req.apiCallRec, errResponse);
1301
+ apiUtil$2._saveApiCallRec(req.apiCallRec, errResponse);
1297
1302
 
1298
- apiUtil$1.sendOrRedirect(req, res, errResponse);
1303
+ apiUtil$2.sendOrRedirect(req, res, errResponse);
1299
1304
  });
1300
1305
  }
1301
1306
  }
@@ -1310,31 +1315,31 @@ class apiUtil$1 {
1310
1315
  return;
1311
1316
  }
1312
1317
 
1313
- let accessToken = apiUtil$1.extractToken(req);
1318
+ let accessToken = apiUtil$2.extractToken(req);
1314
1319
 
1315
1320
  if (!accessToken) {
1316
- res.send(apiUtil$1.spoApiFail(err$1.TOKEN_NEEDED, req)); // apiUtil.sendOrRedirect(req, res, spoApiFail(err.TOKEN_NEEDED, req));
1321
+ res.send(apiUtil$2.spoApiFail(err$2.TOKEN_NEEDED, req)); // apiUtil.sendOrRedirect(req, res, spoApiFail(err.TOKEN_NEEDED, req));
1317
1322
 
1318
1323
  return;
1319
1324
  }
1320
1325
 
1321
- apiUtil$1.restoreTokenData(apiUtil$1.apiTokenStoreKey(accessToken)).then(p => {
1326
+ apiUtil$2.restoreTokenData(apiUtil$2.apiTokenStoreKey(accessToken)).then(p => {
1322
1327
  // req.headers[hnApiKey] = p.apiKey || '';
1323
1328
  // req.headers[hnApiSecret] = p.apiSecret || '';
1324
1329
  if (req.isMobile) {
1325
1330
  // GET 请求的应该都是H5页面,由手机前端发起,需要把headers中的请求方ip换成服务端的
1326
1331
  // todo: 如何在API访问记录中记住请求者(手机端)的真实IP
1327
- req.headers['x-phone-ip'] = apiUtil$1.getClientIp(req);
1332
+ req.headers['x-phone-ip'] = apiUtil$2.getClientIp(req);
1328
1333
  req.headers['x-real-ip'] = p.clientIp;
1329
1334
  } else {
1330
- p.clientIp = apiUtil$1.getClientIp(req);
1335
+ p.clientIp = apiUtil$2.getClientIp(req);
1331
1336
  }
1332
1337
 
1333
1338
  req.isApiCall = true;
1334
1339
  req.tokenData = p;
1335
- return apiUtil$1.$checkApiKeyOld(req, res, next);
1340
+ return apiUtil$2.$checkApiKeyOld(req, res, next);
1336
1341
  }).catch(e => {
1337
- apiUtil$1.sendOrRedirect(req, res, apiUtil$1.spoApiFail(err$1.TOKEN_INVALID, req));
1342
+ apiUtil$2.sendOrRedirect(req, res, apiUtil$2.spoApiFail(err$2.TOKEN_INVALID, req));
1338
1343
  });
1339
1344
  }
1340
1345
  /**
@@ -1347,24 +1352,24 @@ class apiUtil$1 {
1347
1352
 
1348
1353
 
1349
1354
  static async $checkTokenOrApiKey(req, res, next) {
1350
- let accessToken = apiUtil$1.extractToken(req, res);
1355
+ let accessToken = apiUtil$2.extractToken(req, res);
1351
1356
 
1352
1357
  if (accessToken) {
1353
- let tokenExist = await apiUtil$1.tokenDataExist(apiUtil$1.userTokenStoreKey(accessToken));
1358
+ let tokenExist = await apiUtil$2.tokenDataExist(apiUtil$2.userTokenStoreKey(accessToken));
1354
1359
 
1355
1360
  if (tokenExist) {
1356
- return await apiUtil$1.$checkToken(req, res, next);
1361
+ return await apiUtil$2.$checkToken(req, res, next);
1357
1362
  }
1358
1363
 
1359
- tokenExist = await apiUtil$1.tokenDataExist(apiUtil$1.apiTokenStoreKey(accessToken));
1364
+ tokenExist = await apiUtil$2.tokenDataExist(apiUtil$2.apiTokenStoreKey(accessToken));
1360
1365
 
1361
1366
  if (tokenExist) {
1362
- return apiUtil$1.$checkApiKey(req, res, next);
1367
+ return apiUtil$2.$checkApiKey(req, res, next);
1363
1368
  } // 如果给定的token不存在,看看是不是平台内部调用
1364
1369
 
1365
1370
 
1366
- return await apiUtil$1.checkInternalToken(req).catch(e => {
1367
- res.send(apiUtil$1.apiFail(e, req));
1371
+ return await apiUtil$2.checkInternalToken(req).catch(e => {
1372
+ res.send(apiUtil$2.apiFail(e, req));
1368
1373
  return false;
1369
1374
  });
1370
1375
  }
@@ -1384,8 +1389,8 @@ class apiUtil$1 {
1384
1389
  const params = options.replacements;
1385
1390
  let item = params.item;
1386
1391
  delete params.item;
1387
- if (await apiUtil$1.checkForwardsHost(options)) return true;
1388
- let c = apiUtil$1.parseCfgPath(item);
1392
+ if (await apiUtil$2.checkForwardsHost(options)) return true;
1393
+ let c = apiUtil$2.parseCfgPath(item);
1389
1394
  delete c.parent;
1390
1395
  c.host = ppUtil$4.getMyIp();
1391
1396
  return c;
@@ -1404,11 +1409,11 @@ class apiUtil$1 {
1404
1409
  delete params.item; // if (await checkForwardsHost(options))
1405
1410
  // return true;
1406
1411
 
1407
- await apiUtil$1.parametersOK(params, "value");
1408
- let c = apiUtil$1.parseCfgPath(item);
1412
+ await apiUtil$2.parametersOK(params, "value");
1413
+ let c = apiUtil$2.parseCfgPath(item);
1409
1414
 
1410
1415
  if (typeof c.value === "object") {
1411
- throw [err$1.ACCESS_REFUSED, `暂不支持修改复杂配置`];
1416
+ throw [err$2.ACCESS_REFUSED, `暂不支持修改复杂配置`];
1412
1417
  } // c.oldValue = c.value;
1413
1418
 
1414
1419
 
@@ -1417,27 +1422,46 @@ class apiUtil$1 {
1417
1422
  delete c.parent;
1418
1423
  c.host = ppUtil$4.getMyIp();
1419
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;
1420
1444
  } //#endregion
1421
1445
 
1422
1446
 
1423
1447
  }
1424
1448
 
1425
1449
  function configNeeded() {
1426
- if (!conf$2 || !err$1) {
1450
+ if (!conf$3 || !err$2) {
1427
1451
  ppUtil$4.configNeeded();
1428
- conf$2 = ppUtil$4.appConfig;
1429
- appSetting$1 = conf$2.appSetting;
1430
- err$1 = ppUtil$4.appErrCfg;
1452
+ conf$3 = ppUtil$4.appConfig;
1453
+ appSetting$1 = conf$3.appSetting;
1454
+ err$2 = ppUtil$4.appErrCfg;
1431
1455
  }
1432
1456
  }
1433
1457
 
1434
- var ppUtilApi = apiUtil$1;
1458
+ var ppUtilApi = apiUtil$2;
1435
1459
 
1436
- const fs = require$$0__default$2["default"];
1460
+ const fs = require$$4__default["default"];
1437
1461
  const path = require$$1__default$1["default"];
1438
1462
  const ppUtil$3 = require$$1__default["default"].ppUtil;
1439
1463
  const redisUtil = require$$2__default["default"].redisUtil;
1440
- let conf$1, err; // const dbCheck = require('../dbupdate/dd-version');
1464
+ let conf$2, err$1; // const dbCheck = require('../dbupdate/dd-version');
1441
1465
 
1442
1466
  /**
1443
1467
  * API服务启动时前置条件检查
@@ -1457,9 +1481,9 @@ class preconditions$1 {
1457
1481
 
1458
1482
  static setAppName(aName) {
1459
1483
  ppUtil$3.configNeeded();
1460
- conf$1 = ppUtil$3.appConfig;
1461
- err = ppUtil$3.appErrCfg;
1462
- preconditions$1.appName = aName || conf$1.thisApp;
1484
+ conf$2 = ppUtil$3.appConfig;
1485
+ err$1 = ppUtil$3.appErrCfg;
1486
+ preconditions$1.appName = aName || conf$2.thisApp;
1463
1487
  return preconditions$1;
1464
1488
  }
1465
1489
 
@@ -1540,20 +1564,20 @@ async function createEnvSettingFile(fileName) {
1540
1564
  try {
1541
1565
  const cfgText = await ppUtil$3.doCreateEnvSettingFile(fileName);
1542
1566
 
1543
- if (cfgText.indexOf(`cfgVersion: "${conf$1._envSetting.cfgVersion}"`) > 0) {
1567
+ if (cfgText.indexOf(`cfgVersion: "${conf$2._envSetting.cfgVersion}"`) > 0) {
1544
1568
  console.log(`\n*** 已創建新的本機環境配置文件\n${fileName}\n请檢查各項內容是否正确(此项更新服务可正常运行)\n\n`);
1545
1569
  return "";
1546
1570
  }
1547
1571
 
1548
- return `已創建新的本機環境配置文件\n${fileName}\n请檢查並正確設置各項內容,然後將配置版本號修改為${conf$1._envSettings.default.cfgVersion}`;
1572
+ return `已創建新的本機環境配置文件\n${fileName}\n请檢查並正確設置各項內容,然後將配置版本號修改為${conf$2._envSettings.default.cfgVersion}`;
1549
1573
  } catch (e) {
1550
- return `創建本機環境配置文件失敗\n《${fileName}》\n${err.ERROR(e).message}`;
1574
+ return `創建本機環境配置文件失敗\n《${fileName}》\n${err$1.ERROR(e).message}`;
1551
1575
  }
1552
1576
  }
1553
1577
 
1554
1578
  async function checkExEnvSetting(loadjs) {
1555
- if (!conf$1._envSetting.localSettingImported) {
1556
- let fileName = conf$1.getEnvSettingFileName();
1579
+ if (!conf$2._envSetting.localSettingImported) {
1580
+ let fileName = conf$2.getEnvSettingFileName();
1557
1581
 
1558
1582
  if (!fs.existsSync(fileName)) {
1559
1583
  return await createEnvSettingFile(fileName);
@@ -1561,7 +1585,7 @@ async function checkExEnvSetting(loadjs) {
1561
1585
 
1562
1586
  let envSettingEx = loadjs(fileName);
1563
1587
 
1564
- if (envSettingEx.cfgVersion !== conf$1._envSettings.default.cfgVersion) {
1588
+ if (envSettingEx.cfgVersion !== conf$2._envSettings.default.cfgVersion) {
1565
1589
  if (envSettingEx.cfgVersion !== "0.0") {
1566
1590
  let fp = path.parse(fileName);
1567
1591
  let newFileName = path.join(fp.dir, fp.name + envSettingEx.cfgVersion + fp.ext);
@@ -1580,7 +1604,7 @@ async function checkExEnvSetting(loadjs) {
1580
1604
 
1581
1605
 
1582
1606
  async function checkRedis() {
1583
- if (!conf$1.redis.enabled) return "";
1607
+ if (!conf$2.redis.enabled) return "";
1584
1608
  const redis = redisUtil.newClient("io"); // console.log(`checkRedis begin:`);
1585
1609
 
1586
1610
  await ppUtil$3.wait(15 * 1000, param => {
@@ -1601,124 +1625,43 @@ async function checkRedis() {
1601
1625
 
1602
1626
  var ppPrecond = preconditions$1;
1603
1627
 
1604
- var require$$0 = require$$2__default["default"];
1605
-
1606
- function _interopDefaultLegacy$1(e) {
1607
- return e && typeof e === 'object' && 'default' in e ? e : {
1608
- 'default': e
1609
- };
1610
- }
1611
-
1612
- var require$$0__default = /*#__PURE__*/_interopDefaultLegacy$1(require$$0); // const logger = require("log4js").getLogger();
1613
-
1614
-
1615
- const redis = require$$0__default["default"].redisUtil;
1616
-
1617
- class Messenger {
1618
- constructor(appConfig, appErrCfg) {
1619
- if (appConfig) {
1620
- redis.config(appConfig, appErrCfg);
1621
- }
1622
-
1623
- this.channel = "ecs_messenger"; //default channel
1624
-
1625
- this.publisher = redis.newClient("publisher");
1626
- this.subscriber = redis.newClient("subscriber");
1627
- this.subscriber.on("subscribe", function (channel, count) {
1628
- console.log("chanel subscribed :", channel, count);
1629
- });
1630
- this.subscriber.on("message", this.handleMessage);
1631
- }
1632
-
1633
- setMessageHandle(handle, channel) {
1634
- channel = channel || this.channel;
1635
- Messenger.onmessage = Messenger.onmessage || {};
1636
- Messenger.onmessage[channel] = Messenger.onmessage[channel] || [];
1637
- const appMsgHandles = Messenger.onmessage[channel];
1638
-
1639
- for (let i = 0; i < appMsgHandles.length; i++) {
1640
- if (appMsgHandles[i] === handle) return this;
1641
- }
1642
-
1643
- appMsgHandles.push(handle);
1644
- return this;
1645
- }
1646
-
1647
- subscribe(channel) {
1648
- channel = channel || this.channel;
1649
- this.subscriber.subscribe(channel);
1650
- return this;
1651
- }
1652
-
1653
- async handleMessage(channel, message) {
1654
- console.log(`通道[${channel}]收到订阅消息:`, message);
1655
- let appMsgHandles = Messenger.onmessage[channel] || [];
1656
-
1657
- for (let i = 0; i < appMsgHandles.length; i++) {
1658
- const appMsgHandle = appMsgHandles[i];
1659
-
1660
- try {
1661
- let msgObj = JSON.parse(message); // await appMsgHandle(msgObj);
1662
-
1663
- appMsgHandle(msgObj);
1664
- } catch (e) {
1665
- console.log(e);
1666
- }
1667
- }
1668
- }
1669
-
1670
- async publish(message, channel) {
1671
- channel = channel || this.channel;
1672
- let msgStr = typeof message === "object" ? JSON.stringify(message) : message.toString();
1673
- console.log(`通道[${channel}]发布消息:`, message);
1674
- await this.publisher.publish(channel, msgStr);
1675
- return this;
1676
- }
1677
-
1678
- }
1679
-
1680
- var ppMessenger$1 = Messenger;
1681
- const ppMessenger = ppMessenger$1;
1682
- var ppUtil$2 = ppMessenger;
1683
- var ppUtil_1 = ppUtil$2;
1684
-
1685
1628
  // 若 redis 可用,则使用基于 redis 的消息订阅发布系统
1686
1629
  // 若 redis 不可用,则将消息转发到其它主机
1687
1630
 
1688
1631
  const {
1689
- ppUtil: ppUtil$1
1632
+ ppUtil: ppUtil$2
1690
1633
  } = require$$1__default["default"];
1691
- const RedisMessenger = ppUtil_1;
1634
+ const RedisMessenger = require$$1__default$2["default"];
1692
1635
  const {
1693
1636
  netUtil
1694
1637
  } = require$$3__default["default"];
1695
- let conf;
1638
+ let conf$1;
1696
1639
 
1697
- class commonMessenger$1 {
1640
+ class commonMessenger$2 {
1698
1641
  static myMsgAddr = "";
1699
1642
  static redisMessenger = null;
1700
1643
  static onMessage = [];
1701
1644
 
1702
1645
  static initMessenger(appConfig, appErrCfg, msgChannel) {
1703
- conf = appConfig;
1704
- this.redisMessenger = conf.redis.enabled ? new RedisMessenger(appConfig, appErrCfg, msgChannel).subscribe(msgChannel) : null;
1705
- this.myMsgAddr = commonMessenger$1.getMyMsgAddr();
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();
1706
1649
  }
1707
1650
 
1708
1651
  static getMyMsgAddr() {
1709
- if (!conf.myMsgAddr) {
1710
- conf.pm_id = process.env.pm_id || "0";
1711
- let myIp = ppUtil$1.getMyIp();
1652
+ if (!conf$1.myMsgAddr) {
1653
+ conf$1.pm_id = process.env.pm_id || "0";
1654
+ let myIp = ppUtil$2.getMyIp();
1712
1655
 
1713
1656
  if (this.redisMessenger) {
1714
- myIp = `${conf.pm_id}@${myIp}`;
1657
+ myIp = `${conf$1.pm_id}@${myIp}`;
1715
1658
  }
1716
1659
 
1717
- conf.myMsgAddr = myIp;
1718
- console.log(`myMsgAddr: `, conf.myMsgAddr);
1660
+ conf$1.myMsgAddr = myIp;
1661
+ console.log(`myMsgAddr: `, conf$1.myMsgAddr);
1719
1662
  }
1720
1663
 
1721
- return conf.myMsgAddr;
1664
+ return conf$1.myMsgAddr;
1722
1665
  }
1723
1666
 
1724
1667
  static setMessageHandle(messageHandle) {
@@ -1726,11 +1669,11 @@ class commonMessenger$1 {
1726
1669
  return this.redisMessenger.setMessageHandle(messageHandle, msgChannel);
1727
1670
  }
1728
1671
 
1729
- if (commonMessenger$1.onMessage.indexOf(messageHandle) < 0) {
1730
- commonMessenger$1.onMessage.push(messageHandle);
1672
+ if (commonMessenger$2.onMessage.indexOf(messageHandle) < 0) {
1673
+ commonMessenger$2.onMessage.push(messageHandle);
1731
1674
  }
1732
1675
 
1733
- return commonMessenger$1;
1676
+ return commonMessenger$2;
1734
1677
  }
1735
1678
 
1736
1679
  static async publishMessage(message) {
@@ -1741,10 +1684,10 @@ class commonMessenger$1 {
1741
1684
  if (message.destAddr) {
1742
1685
  await forwardMessage(message);
1743
1686
  } else {
1744
- for (let i = 0; i < conf.appSetting.serverHosts.length; i++) {
1745
- 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];
1746
1689
 
1747
- if (message.destAddr !== conf.myMsgAddr) {
1690
+ if (message.destAddr !== conf$1.myMsgAddr) {
1748
1691
  await forwardMessage(message);
1749
1692
  }
1750
1693
  }
@@ -1755,8 +1698,8 @@ class commonMessenger$1 {
1755
1698
  static async handleInternalMessage(options) {
1756
1699
  const message = options.replacements;
1757
1700
 
1758
- for (let i = 0; i < commonMessenger$1.onMessage.length; i++) {
1759
- const appMsgHandle = commonMessenger$1.onMessage[i];
1701
+ for (let i = 0; i < commonMessenger$2.onMessage.length; i++) {
1702
+ const appMsgHandle = commonMessenger$2.onMessage[i];
1760
1703
 
1761
1704
  try {
1762
1705
  await appMsgHandle(message);
@@ -1781,15 +1724,293 @@ async function forwardMessage(message) {
1781
1724
  return res.data;
1782
1725
  }
1783
1726
 
1784
- var ppMessengerEx = commonMessenger$1;
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;
1785
2004
 
1786
2005
  const apiUtil = ppUtilApi;
1787
2006
  const preconditions = ppPrecond;
1788
2007
  const commonMessenger = ppMessengerEx;
2008
+ const schedule = ppSchedule;
1789
2009
  var ppUtil = {
1790
2010
  apiUtil,
1791
2011
  preconditions,
1792
- commonMessenger
2012
+ commonMessenger,
2013
+ schedule
1793
2014
  };
1794
2015
 
1795
2016
  module.exports = ppUtil;