abler-api 0.1.27 → 0.1.30

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