abler-api 0.1.17 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,7 +5,7 @@ API服务相关工具
5
5
  安装
6
6
 
7
7
  ```
8
- npm i abler-api-util@latest -s
8
+ npm i abler-api@latest -s
9
9
  ```
10
10
 
11
11
 
@@ -13,8 +13,13 @@ npm i abler-api-util@latest -s
13
13
  引用
14
14
 
15
15
  ```
16
- const {apiUtil} = require("abler-api");
16
+ const {apiUtil, preconditions} = require("abler-api");
17
17
  apiUtil.config(conf,errCfg,dbSql);
18
18
  ...
19
19
  ```
20
20
 
21
+
22
+
23
+ ### preconditions
24
+
25
+ API服务启动时前置条件检查,使用
@@ -4,6 +4,8 @@ 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');
8
+ var require$$1$1 = require('path');
7
9
 
8
10
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
9
11
 
@@ -11,15 +13,17 @@ var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);
11
13
  var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);
12
14
  var require$$2__default = /*#__PURE__*/_interopDefaultLegacy(require$$2);
13
15
  var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3);
16
+ var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$1);
17
+ var require$$1__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$1$1);
14
18
 
15
19
  const crypto = require$$0__default["default"];
16
- const ppUtil$1 = require$$1__default["default"].ppUtil;
20
+ const ppUtil$2 = require$$1__default["default"].ppUtil;
17
21
  const {
18
22
  dbUtil,
19
23
  kvStorage
20
24
  } = require$$2__default["default"];
21
25
  const netUtil = require$$3__default["default"];
22
- let conf, appSetting, err, dbSql;
26
+ let conf$1, appSetting, err$1, dbSql;
23
27
  const pnToken = "access_token",
24
28
  hnToken = pnToken,
25
29
  pnApiKey = "apiKey",
@@ -27,20 +31,20 @@ const pnToken = "access_token",
27
31
  // 我们接收到的 headers 中的字段名总是全小写的
28
32
  pnApiSecret = "apiSecret",
29
33
  hnApiSecret = pnApiSecret.toLowerCase();
30
- const MD5 = ppUtil$1.MD5,
31
- moveProperty = ppUtil$1.moveProperty;
34
+ const MD5 = ppUtil$2.MD5,
35
+ moveProperty = ppUtil$2.moveProperty;
32
36
 
33
37
  class apiUtil$1 {
34
- static debugFlag = ppUtil$1.newGuid(); //应用必须设置,否则谁也不知道是啥
38
+ static debugFlag = ppUtil$2.newGuid(); //应用必须设置,否则谁也不知道是啥
35
39
 
36
- static testFlag = ppUtil$1.newGuid();
40
+ static testFlag = ppUtil$2.newGuid();
37
41
  static envId_dev = "?"; // static apiCallRecSaver;
38
42
 
39
43
  static config(appConfig, appErrCfg, appDbSql) {
40
- ppUtil$1.config(appConfig, appErrCfg);
41
- conf = appConfig;
42
- appSetting = conf?.appSetting;
43
- err = appErrCfg, dbSql = appDbSql;
44
+ ppUtil$2.config(appConfig, appErrCfg);
45
+ conf$1 = appConfig;
46
+ appSetting = conf$1?.appSetting;
47
+ err$1 = appErrCfg, dbSql = appDbSql;
44
48
  apiUtil$1.debugFlag = appSetting?.debugFlag || apiUtil$1.debugFlag;
45
49
  apiUtil$1.testFlag = appSetting?.testFlag || apiUtil$1.testFlag; // apiUtil.apiCallRecSaver = apiCallRecSaver;
46
50
  } //#region ===== 需要应用系统重写的方法
@@ -53,7 +57,7 @@ class apiUtil$1 {
53
57
 
54
58
 
55
59
  static _getApiSecret(companyId) {
56
- return ppUtil$1.newGuid();
60
+ return ppUtil$2.newGuid();
57
61
  }
58
62
  /**
59
63
  * 保存 API 调用记录,应用系统必须重写此方法
@@ -156,18 +160,18 @@ class apiUtil$1 {
156
160
 
157
161
 
158
162
  static setParamsFunctions(params) {
159
- ppUtil$1.defUnenumProp(params, "asNumber", function (name, minValue, maxValue, defaultValue) {
163
+ ppUtil$2.defUnenumProp(params, "asNumber", function (name, minValue, maxValue, defaultValue) {
160
164
  // if (!this.hasOwnProperty(name)) // {} 定义的对象没有 hasOwnProperty 函数
161
165
  if (this[name] === undefined) return defaultValue;
162
166
  let result = +this[name];
163
167
 
164
168
  if (typeof result !== "number" || result < minValue || result > maxValue) {
165
- throw [err.INVALID_PARAM, `参数 ${name} 必须是 ${minValue} ~ ${maxValue} 之间的数字`];
169
+ throw [err$1.INVALID_PARAM, `参数 ${name} 必须是 ${minValue} ~ ${maxValue} 之间的数字`];
166
170
  }
167
171
 
168
172
  return result;
169
173
  });
170
- ppUtil$1.defUnenumProp(params, "asBool", function (name, defaultValue) {
174
+ ppUtil$2.defUnenumProp(params, "asBool", function (name, defaultValue) {
171
175
  if (this[name] === undefined) return defaultValue;
172
176
  let result = JSON.parse(this[name]);
173
177
  return !!result;
@@ -232,7 +236,7 @@ class apiUtil$1 {
232
236
 
233
237
  static apiFail(error, req) {
234
238
  configNeeded();
235
- let response = err.ERROR(error, err.errorLangParamFlag + ppUtil$1.getMsgLang(req));
239
+ let response = err$1.ERROR(error, err$1.errorLangParamFlag + ppUtil$2.getMsgLang(req));
236
240
  response.datetime = new Date();
237
241
 
238
242
  if (req && req.headers) {
@@ -453,12 +457,12 @@ class apiUtil$1 {
453
457
  delete params.token;
454
458
  } else {
455
459
  // 如果没有token,则返回错误
456
- console.log(err.TOKEN_NEEDED);
460
+ console.log(err$1.TOKEN_NEEDED);
457
461
 
458
462
  if (res) {
459
- res.send(err.ERROR(err.TOKEN_NEEDED));
463
+ res.send(err$1.ERROR(err$1.TOKEN_NEEDED));
460
464
  } else if (!noErr) {
461
- throw err.TOKEN_NEEDED;
465
+ throw err$1.TOKEN_NEEDED;
462
466
  }
463
467
  }
464
468
  }
@@ -480,7 +484,7 @@ class apiUtil$1 {
480
484
  const params = apiUtil$1.extractParams(req);
481
485
  req.accessToken = req.accessToken || apiUtil$1.extractToken(req);
482
486
 
483
- if (req.accessToken === MD5(ppUtil$1.idNumDisturbing)) {
487
+ if (req.accessToken === MD5(ppUtil$2.idNumDisturbing)) {
484
488
  //todo: 检查IP
485
489
  params.__internal__ = true;
486
490
  req.ignoreToken = true; // if (params.idNum || params.personId) {
@@ -501,7 +505,7 @@ class apiUtil$1 {
501
505
  return true;
502
506
  } else {
503
507
  // console.log('token error.', req.accessToken);
504
- throw err.TOKEN_INVALID;
508
+ throw err$1.TOKEN_INVALID;
505
509
  }
506
510
  }
507
511
  /**
@@ -537,7 +541,7 @@ class apiUtil$1 {
537
541
 
538
542
  if (dbgToken) {
539
543
  let envId = process.env.ECS_DEPLOY_ID;
540
- req.__debug__ = dbgToken && dbgToken === MD5(req.headers.timestamp, ppUtil$1.commonHashDisturbing) && (envId === "florist_longdan" || envId === "shuzi");
544
+ req.__debug__ = dbgToken && dbgToken === MD5(req.headers.timestamp, ppUtil$2.commonHashDisturbing) && (envId === "florist_longdan" || envId === "shuzi");
541
545
  } else {
542
546
  req.__debug__ = false;
543
547
  } // console.log("__debug__:", req.__debug__, "dbgToken:", dbgToken);
@@ -717,7 +721,7 @@ class apiUtil$1 {
717
721
  };
718
722
 
719
723
  if (rec.secret !== "") {
720
- rec.secret = ppUtil$1.getEncAse192(rec.secret);
724
+ rec.secret = ppUtil$2.getEncAse192(rec.secret);
721
725
  }
722
726
 
723
727
  req.apiCallRec = rec;
@@ -784,7 +788,7 @@ class apiUtil$1 {
784
788
  return certInfo;
785
789
  }).catch(e => {
786
790
  console.log('获取企业证书失败:\n', e);
787
- throw [err.ACCESS_REFUSED, `获取企业证书失败:${err.ERROR(e).message}`];
791
+ throw [err$1.ACCESS_REFUSED, `获取企业证书失败:${err$1.ERROR(e).message}`];
788
792
  });
789
793
  }
790
794
  /**
@@ -798,7 +802,7 @@ class apiUtil$1 {
798
802
  static async verifyApiSignature(tokenData, req) {
799
803
  try {
800
804
  if (!req.headers.timestamp) {
801
- throw [err.ACCESS_REFUSED, `必须在请求头中设置时戳`];
805
+ throw [err$1.ACCESS_REFUSED, `必须在请求头中设置时戳`];
802
806
  }
803
807
 
804
808
  let timestamp = parseInt(req.headers.timestamp);
@@ -806,13 +810,13 @@ class apiUtil$1 {
806
810
  let maxTimeDiff = apiUtil$1.isDebugMode(req) ? 7 * 24 * 3600 : apiUtil$1.isTestMode(req) ? 4 * 3600 : 100; // 100
807
811
 
808
812
  if (timestamp.toString() == "NaN" || currentTime < timestamp - 5000 || currentTime - timestamp > maxTimeDiff * 1000) {
809
- throw [err.ACCESS_REFUSED, `时戳(${timestamp})无效,当前时戳:${currentTime},时差 ${(currentTime - timestamp) / 1000}秒`];
813
+ throw [err$1.ACCESS_REFUSED, `时戳(${timestamp})无效,当前时戳:${currentTime},时差 ${(currentTime - timestamp) / 1000}秒`];
810
814
  }
811
815
 
812
816
  let signature = req.headers.signature;
813
817
 
814
818
  if (!signature) {
815
- throw [err.ACCESS_REFUSED, `必须在请求头中提供签名`];
819
+ throw [err$1.ACCESS_REFUSED, `必须在请求头中提供签名`];
816
820
  }
817
821
 
818
822
  let signData = apiUtil$1.extractToken(req, null, true) || tokenData.apiKey;
@@ -867,7 +871,7 @@ class apiUtil$1 {
867
871
 
868
872
  if (!tokenData.certPublicKeySpare) {
869
873
  throw {
870
- eo: err.ACCESS_REFUSED,
874
+ eo: err$1.ACCESS_REFUSED,
871
875
  msgArgv: "签名验证异常",
872
876
  data: e
873
877
  };
@@ -916,7 +920,7 @@ class apiUtil$1 {
916
920
  } catch (e) {
917
921
  console.log("SPO服务签名验证异常(备用证书), ", e);
918
922
  throw {
919
- eo: err.ACCESS_REFUSED,
923
+ eo: err$1.ACCESS_REFUSED,
920
924
  msgArgv: "签名验证异常(spare)",
921
925
  data: e
922
926
  };
@@ -925,7 +929,7 @@ class apiUtil$1 {
925
929
 
926
930
  if (!verifyOK) {
927
931
  console.log("SPO服务签名验证失败, tokenData: ", tokenData);
928
- throw [err.ACCESS_REFUSED, "签名验证未通过"];
932
+ throw [err$1.ACCESS_REFUSED, "签名验证未通过"];
929
933
  }
930
934
 
931
935
  return verifyOK;
@@ -943,7 +947,7 @@ class apiUtil$1 {
943
947
  if (!tokenData.companyInfo) {
944
948
  tokenData.companyInfo = await apiUtil$1.queryCompanyInfo(tokenData.apiKey, true).catch(e => {
945
949
  console.log("执行企业信息查询发生异常", e);
946
- throw [err.API_KEY_INVALID, "执行企业信息查询发生异常:" + e.message || ""];
950
+ throw [err$1.API_KEY_INVALID, "执行企业信息查询发生异常:" + e.message || ""];
947
951
  });
948
952
  }
949
953
 
@@ -952,7 +956,7 @@ class apiUtil$1 {
952
956
  if (companyInfo != null) {
953
957
  let secret = apiUtil$1._getApiSecret(tokenData.apiKey);
954
958
 
955
- if (secret !== tokenData.apiSecret) throw err.API_SCREPT_INVALID; // 不再检查 IP 白名单,改为验证证书签名
959
+ if (secret !== tokenData.apiSecret) throw err$1.API_SCREPT_INVALID; // 不再检查 IP 白名单,改为验证证书签名
956
960
  // console.log("fromIp:", tokenData.clientIp, "ipWhiteList:", companyInfo.ipWhiteList);
957
961
  // let whiteList = companyInfo.ipWhiteList || "";
958
962
  // // 没有设置ip白名单的就不检查了
@@ -966,7 +970,7 @@ class apiUtil$1 {
966
970
  });
967
971
  }
968
972
 
969
- throw [err.API_KEY_INVALID, tokenData.apiKey];
973
+ throw [err$1.API_KEY_INVALID, tokenData.apiKey];
970
974
  }
971
975
  /**
972
976
  * 检查令牌数据是否存在
@@ -1017,7 +1021,7 @@ class apiUtil$1 {
1017
1021
  paramExists = typeof params[paramName] != 'undefined' || typeof params[paramName + paramSufix] != 'undefined';
1018
1022
  }
1019
1023
 
1020
- if (!paramExists) return ppUtil$1.errorPormise(err.ERROR(err.PARAMETER_NEEDED, paramName));
1024
+ if (!paramExists) return ppUtil$2.errorPormise(err$1.ERROR(err$1.PARAMETER_NEEDED, paramName));
1021
1025
  }
1022
1026
 
1023
1027
  return Promise.resolve(paramSufix);
@@ -1051,8 +1055,8 @@ class apiUtil$1 {
1051
1055
 
1052
1056
  static getEnvHosts(params) {
1053
1057
  configNeeded();
1054
- let envType = ppUtil$1.getEnvType();
1055
- let x = conf.envHosts[envType] || {
1058
+ let envType = ppUtil$2.getEnvType();
1059
+ let x = conf$1.envHosts[envType] || {
1056
1060
  hosts: ["localhost"]
1057
1061
  };
1058
1062
  let port = +params.port || 8443;
@@ -1086,9 +1090,9 @@ class apiUtil$1 {
1086
1090
  configNeeded();
1087
1091
  const params = options.replacements;
1088
1092
  const myEnvHosts = apiUtil$1.getEnvHosts(params);
1089
- const myIp = ppUtil$1.getMyIp();
1093
+ const myIp = ppUtil$2.getMyIp();
1090
1094
  const host = params.host || myIp;
1091
- if (!myEnvHosts.hosts.contains(host)) throw [err.ACCESS_REFUSED, `环境${conf.envId}貌似无此主机:${params.host}`];
1095
+ if (!myEnvHosts.hosts.contains(host)) throw [err$1.ACCESS_REFUSED, `环境${conf$1.envId}貌似无此主机:${params.host}`];
1092
1096
 
1093
1097
  if (!apiUtil$1.hostIsMySelf(host, options._res.req)) {
1094
1098
  let result = await apiUtil$1.forwardsTo(host, myEnvHosts.port, params, options._res.req, myIp);
@@ -1112,7 +1116,7 @@ class apiUtil$1 {
1112
1116
 
1113
1117
 
1114
1118
  static async forwardsTo(anotherIp, port, params, req, lanClient) {
1115
- let url = anotherIp.indexOf("://") > 0 ? anotherIp : `${port === 443 ? "https" : "http"}://${anotherIp}:${port}${req.originalUrl}`;
1119
+ let url = anotherIp.indexOf("://") > 0 ? anotherIp : `${req.headers.scheme}://${anotherIp}:${port}${req.originalUrl}`;
1116
1120
 
1117
1121
  if (url.indexOf("?") > 0) {
1118
1122
  url = url.substring(0, url.indexOf("?"));
@@ -1127,7 +1131,7 @@ class apiUtil$1 {
1127
1131
 
1128
1132
  if (result.status !== 200) {
1129
1133
  console.log(`访问 ${reqOptions.url} 出错`, result.status, result.res.statusMessage);
1130
- throw [err.EXCEPTION, `[${result.status}] - ${result.res.statusMessage}`];
1134
+ throw [err$1.EXCEPTION, `[${result.status}] - ${result.res.statusMessage}`];
1131
1135
  }
1132
1136
 
1133
1137
  return result.data;
@@ -1143,7 +1147,7 @@ class apiUtil$1 {
1143
1147
  let keys = Array.isArray(keyPath) ? keyPath : keyPath.split(".");
1144
1148
  let parentKey = "";
1145
1149
  let key = "config";
1146
- let value = conf;
1150
+ let value = conf$1;
1147
1151
  let parent = null;
1148
1152
 
1149
1153
  for (let i = 0; i < keys.length; i++) {
@@ -1153,7 +1157,7 @@ class apiUtil$1 {
1153
1157
  value = parent[key];
1154
1158
 
1155
1159
  if (value === undefined) {
1156
- throw [err.INVALID_PARAM, `无此配置项: ${key}`];
1160
+ throw [err$1.INVALID_PARAM, `无此配置项: ${key}`];
1157
1161
  }
1158
1162
  }
1159
1163
 
@@ -1176,7 +1180,7 @@ class apiUtil$1 {
1176
1180
  await apiUtil$1.checkRequestToken(req);
1177
1181
  await next();
1178
1182
  } catch (e) {
1179
- res.send(err.ERROR(e));
1183
+ res.send(err$1.ERROR(e));
1180
1184
  }
1181
1185
 
1182
1186
  return false;
@@ -1224,7 +1228,7 @@ class apiUtil$1 {
1224
1228
 
1225
1229
  return true;
1226
1230
  } catch (e) {
1227
- res.send(err.ERROR(e));
1231
+ res.send(err$1.ERROR(e));
1228
1232
  return false;
1229
1233
  }
1230
1234
  }
@@ -1274,11 +1278,11 @@ class apiUtil$1 {
1274
1278
  let errResponse = null;
1275
1279
 
1276
1280
  if (!tokenData.clientIp) {
1277
- errResponse = apiUtil$1.spoApiFail(err.GET_CLIENTIP_FAIL, req);
1281
+ errResponse = apiUtil$1.spoApiFail(err$1.GET_CLIENTIP_FAIL, req);
1278
1282
  } else if (!tokenData.apiKey) {
1279
- errResponse = apiUtil$1.spoApiFail([err.PARAMETER_NEEDED, "apiKey"], req);
1283
+ errResponse = apiUtil$1.spoApiFail([err$1.PARAMETER_NEEDED, "apiKey"], req);
1280
1284
  } else if (!tokenData.apiSecret) {
1281
- errResponse = apiUtil$1.spoApiFail([err.PARAMETER_NEEDED, "apiSecret"], req);
1285
+ errResponse = apiUtil$1.spoApiFail([err$1.PARAMETER_NEEDED, "apiSecret"], req);
1282
1286
  }
1283
1287
 
1284
1288
  if (errResponse != null) {
@@ -1314,7 +1318,7 @@ class apiUtil$1 {
1314
1318
  let accessToken = apiUtil$1.extractToken(req);
1315
1319
 
1316
1320
  if (!accessToken) {
1317
- res.send(apiUtil$1.spoApiFail(err.TOKEN_NEEDED, req)); // apiUtil.sendOrRedirect(req, res, spoApiFail(err.TOKEN_NEEDED, req));
1321
+ res.send(apiUtil$1.spoApiFail(err$1.TOKEN_NEEDED, req)); // apiUtil.sendOrRedirect(req, res, spoApiFail(err.TOKEN_NEEDED, req));
1318
1322
 
1319
1323
  return;
1320
1324
  }
@@ -1335,7 +1339,7 @@ class apiUtil$1 {
1335
1339
  req.tokenData = p;
1336
1340
  return apiUtil$1.$checkApiKeyOld(req, res, next);
1337
1341
  }).catch(e => {
1338
- apiUtil$1.sendOrRedirect(req, res, apiUtil$1.spoApiFail(err.TOKEN_INVALID, req));
1342
+ apiUtil$1.sendOrRedirect(req, res, apiUtil$1.spoApiFail(err$1.TOKEN_INVALID, req));
1339
1343
  });
1340
1344
  }
1341
1345
  /**
@@ -1388,7 +1392,7 @@ class apiUtil$1 {
1388
1392
  if (await apiUtil$1.checkForwardsHost(options)) return true;
1389
1393
  let c = apiUtil$1.parseCfgPath(item);
1390
1394
  delete c.parent;
1391
- c.host = ppUtil$1.getMyIp();
1395
+ c.host = ppUtil$2.getMyIp();
1392
1396
  return c;
1393
1397
  }
1394
1398
  /**
@@ -1409,14 +1413,14 @@ class apiUtil$1 {
1409
1413
  let c = apiUtil$1.parseCfgPath(item);
1410
1414
 
1411
1415
  if (typeof c.value === "object") {
1412
- throw [err.ACCESS_REFUSED, `暂不支持修改复杂配置`];
1416
+ throw [err$1.ACCESS_REFUSED, `暂不支持修改复杂配置`];
1413
1417
  } // c.oldValue = c.value;
1414
1418
 
1415
1419
 
1416
1420
  c.newValue = params.value;
1417
1421
  c.parent[c.key] = c.newValue;
1418
1422
  delete c.parent;
1419
- c.host = ppUtil$1.getMyIp();
1423
+ c.host = ppUtil$2.getMyIp();
1420
1424
  return c; // 应用层自行处理多机同步
1421
1425
  } //#endregion
1422
1426
 
@@ -1424,19 +1428,193 @@ class apiUtil$1 {
1424
1428
  }
1425
1429
 
1426
1430
  function configNeeded() {
1427
- if (!conf || !err) {
1431
+ if (!conf$1 || !err$1) {
1432
+ ppUtil$2.configNeeded();
1433
+ conf$1 = ppUtil$2.appConfig;
1434
+ appSetting = conf$1.appSetting;
1435
+ err$1 = ppUtil$2.appErrCfg;
1436
+ }
1437
+ }
1438
+
1439
+ var ppUtilApi = apiUtil$1;
1440
+
1441
+ function commonjsRequire(path) {
1442
+ throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
1443
+ }
1444
+
1445
+ const fs = require$$0__default$1["default"];
1446
+ const path = require$$1__default$1["default"];
1447
+ const ppUtil$1 = require$$1__default["default"].ppUtil;
1448
+ const redisUtil = require$$2__default["default"].redisUtil;
1449
+ let conf, err; // const dbCheck = require('../dbupdate/dd-version');
1450
+
1451
+ /**
1452
+ * API服务启动时前置条件检查
1453
+ * ok = await preconditions
1454
+ * .setAppName(conf.thisApp)
1455
+ * .addCheckPromise(preconditions.checkExEnvSetting())
1456
+ * .addCheckPromise(preconditions.checkRedis())
1457
+ * .addCheckPromise(checkDatabase())
1458
+ * .addChecker(myChecker, args)
1459
+ * .checkAll()
1460
+ */
1461
+
1462
+ class preconditions$1 {
1463
+ static appName;
1464
+ static checkFunctions = [];
1465
+ static checkPromises = [];
1466
+
1467
+ static setAppName(aName) {
1428
1468
  ppUtil$1.configNeeded();
1429
1469
  conf = ppUtil$1.appConfig;
1430
- appSetting = conf.appSetting;
1431
1470
  err = ppUtil$1.appErrCfg;
1471
+ preconditions$1.appName = aName || conf.thisApp;
1472
+ return preconditions$1;
1432
1473
  }
1474
+
1475
+ static addCheckPromise(p) {
1476
+ preconditions$1.checkPromises.push(p);
1477
+ return preconditions$1;
1478
+ }
1479
+
1480
+ static addChecker(checkFunc, args) {
1481
+ preconditions$1.checkFunctions.push({
1482
+ check: checkFunc,
1483
+ args: args
1484
+ });
1485
+ return preconditions$1;
1486
+ }
1487
+
1488
+ static async checkAll() {
1489
+ for (let i = 0; i < preconditions$1.checkFunctions.length; i++) {
1490
+ const f = preconditions$1.checkFunctions[i];
1491
+ preconditions$1.addCheckPromise(f.check(f.args));
1492
+ }
1493
+
1494
+ for (let i = 0; i < preconditions$1.checkPromises.length; i++) {
1495
+ let msg = await preconditions$1.checkPromises[i];
1496
+
1497
+ if (msg) {
1498
+ if (!preconditions$1.messages) {
1499
+ preconditions$1.messages = [];
1500
+ }
1501
+
1502
+ preconditions$1.messages.push(`${preconditions$1.messages.length + 1}. ${msg}`);
1503
+ }
1504
+ }
1505
+
1506
+ let text = "";
1507
+
1508
+ if (preconditions$1.messages) {
1509
+ text = `*** 由于以下原因,${preconditions$1.appName} 尚不能正常提供服务:\n\n` + preconditions$1.messages.join("\n\n") + "\n\n*** 请检查以上各项条件,修复后重新启动服务";
1510
+ console.log("\n" + text); // for (let i = 0; i < preconditions.messages.length; i++) {
1511
+ // console.log(preconditions.messages[i]);
1512
+ // }
1513
+ }
1514
+
1515
+ if (!(await fs.async_exists("../log"))) {
1516
+ await fs.async_mkdir("../log");
1517
+ }
1518
+
1519
+ await fs.async_writeFile(`../log/preconditions`, text);
1520
+ return text === " ";
1521
+ } // 检查器
1522
+
1523
+ /**
1524
+ * 检查本机外部配置文件版本
1525
+ */
1526
+
1527
+
1528
+ static async checkExEnvSetting() {
1529
+ return await checkExEnvSetting();
1530
+ }
1531
+ /**
1532
+ * redis 可用性检查
1533
+ */
1534
+
1535
+
1536
+ static async checkRedis() {
1537
+ return await checkRedis();
1538
+ } // /**
1539
+ // * 数据库可用性及业务数据版本版本检查
1540
+ // */
1541
+ // static async checkDatabase() {
1542
+ // return await checkDatabase();
1543
+ // }
1544
+
1545
+
1433
1546
  }
1434
1547
 
1435
- var ppUtilApi = apiUtil$1;
1548
+ async function createEnvSettingFile(fileName) {
1549
+ try {
1550
+ const cfgText = await ppUtil$1.doCreateEnvSettingFile(fileName);
1551
+
1552
+ if (cfgText.indexOf(`cfgVersion: "${conf._envSetting.cfgVersion}"`) > 0) {
1553
+ console.log(`\n*** 已創建新的本機環境配置文件\n${fileName}\n请檢查各項內容是否正确(此项更新服务可正常运行)\n\n`);
1554
+ return "";
1555
+ }
1556
+
1557
+ return `已創建新的本機環境配置文件\n${fileName}\n请檢查並正確設置各項內容,然後將配置版本號修改為${conf._envSettings.default.cfgVersion}`;
1558
+ } catch (e) {
1559
+ return `創建本機環境配置文件失敗\n《${fileName}》\n${err.ERROR(e).message}`;
1560
+ }
1561
+ }
1562
+
1563
+ async function checkExEnvSetting() {
1564
+ if (!conf._envSetting.localSettingImported) {
1565
+ let fileName = conf.getEnvSettingFileName();
1566
+
1567
+ if (!fs.existsSync(fileName)) {
1568
+ return await createEnvSettingFile(fileName);
1569
+ }
1570
+
1571
+ let envSettingEx = commonjsRequire(fileName);
1572
+
1573
+ if (envSettingEx.cfgVersion !== conf._envSettings.default.cfgVersion) {
1574
+ if (envSettingEx.cfgVersion !== "0.0") {
1575
+ let fp = path.parse(fileName);
1576
+ let newFileName = path.join(fp.dir, fp.name + envSettingEx.cfgVersion + fp.ext);
1577
+
1578
+ if (!fs.existsSync(newFileName)) {
1579
+ fs.renameSync(fileName, newFileName);
1580
+ }
1581
+ }
1582
+
1583
+ return await createEnvSettingFile(fileName);
1584
+ }
1585
+ }
1586
+ } // async function checkDatabase() {
1587
+ // return dbCheck.check().then(info => info.updateMessage);
1588
+ // }
1589
+
1590
+
1591
+ async function checkRedis() {
1592
+ if (!conf.redis.enabled) return "";
1593
+ const redis = redisUtil.newClient("io"); // console.log(`checkRedis begin:`);
1594
+
1595
+ await ppUtil$1.wait(15 * 1000, param => {
1596
+ if (redis.ready && redis.connected || redis.error) {
1597
+ return true;
1598
+ }
1599
+ }).catch(e => {
1600
+ redis.error = e;
1601
+ });
1602
+
1603
+ if (redis.error) {
1604
+ console.log(`未能成功連接 redis: ${redis.error},請檢查相關設置`);
1605
+ return `未能成功連接 redis: ${redis.error},請檢查相關設置`;
1606
+ } // console.log(`checkRedis done:`);
1607
+ // console.log(redis);
1608
+
1609
+ }
1610
+
1611
+ var ppPrecond = preconditions$1;
1436
1612
 
1437
1613
  const apiUtil = ppUtilApi;
1614
+ const preconditions = ppPrecond;
1438
1615
  var ppUtil = {
1439
- apiUtil
1616
+ apiUtil,
1617
+ preconditions
1440
1618
  };
1441
1619
 
1442
1620
  module.exports = ppUtil;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abler-api",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "description": "API服务相关工具",
5
5
  "main": "./dist/cjs/pp-util.js",
6
6
  "-module": "./dist/es/pp-util.js",