abler-api 0.1.27 → 0.1.28

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