abler-api 0.1.16 → 0.1.17

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.
Files changed (2) hide show
  1. package/dist/cjs/pp-util.js +194 -20
  2. package/package.json +3 -2
@@ -3,12 +3,14 @@
3
3
  var require$$0 = require('crypto');
4
4
  var require$$1 = require('abler-util');
5
5
  var require$$2 = require('abler-db');
6
+ var require$$3 = require('abler-net');
6
7
 
7
8
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
9
 
9
10
  var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);
10
11
  var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);
11
12
  var require$$2__default = /*#__PURE__*/_interopDefaultLegacy(require$$2);
13
+ var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3);
12
14
 
13
15
  const crypto = require$$0__default["default"];
14
16
  const ppUtil$1 = require$$1__default["default"].ppUtil;
@@ -16,6 +18,7 @@ const {
16
18
  dbUtil,
17
19
  kvStorage
18
20
  } = require$$2__default["default"];
21
+ const netUtil = require$$3__default["default"];
19
22
  let conf, appSetting, err, dbSql;
20
23
  const pnToken = "access_token",
21
24
  hnToken = pnToken,
@@ -74,26 +77,6 @@ class apiUtil$1 {
74
77
  } //#endregion
75
78
  //#region ===== API服务相关工具
76
79
 
77
- /**
78
- * 获取客户端IP地址
79
- * @param req
80
- * @returns {*|string|string}
81
- */
82
-
83
-
84
- static getClientIp(req) {
85
- let ip = req.headers["x-real-ip"] || req.headers["x-true-ip"] || req.headers['x-forwarded-for'] || req.headers['x-forward-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.headers['host'] || ""; // console.log("Request IP:", ip, "req: ", req);
86
-
87
- if (ip.indexOf(",") >= 0) {
88
- ip = ip.split(',')[0];
89
- }
90
-
91
- if (ip.indexOf(":") >= 0) {
92
- ip = ip.substring(ip.lastIndexOf(':') + 1);
93
- }
94
-
95
- return ip;
96
- }
97
80
  /**
98
81
  * 从请求中解出数据,包括路径参数、查询参数和Body
99
82
  * @param req
@@ -1038,6 +1021,148 @@ class apiUtil$1 {
1038
1021
  }
1039
1022
 
1040
1023
  return Promise.resolve(paramSufix);
1024
+ }
1025
+ /**
1026
+ * 获取客户端IP地址
1027
+ * @param req
1028
+ * @returns {*|string|string}
1029
+ */
1030
+
1031
+
1032
+ static getClientIp(req) {
1033
+ let ip = req.headers["x-real-ip"] || req.headers["x-true-ip"] || req.headers['x-forwarded-for'] || req.headers['x-forward-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.headers['host'] || ""; // console.log("Request IP:", ip, "req: ", req);
1034
+
1035
+ if (ip.indexOf(",") >= 0) {
1036
+ ip = ip.split(',')[0];
1037
+ }
1038
+
1039
+ if (ip.indexOf(":") >= 0) {
1040
+ ip = ip.substring(ip.lastIndexOf(':') + 1);
1041
+ }
1042
+
1043
+ return ip;
1044
+ }
1045
+ /**
1046
+ * 获取与本机一起提供服务的所有主机
1047
+ * @param params
1048
+ * @returns {{port: (number|number), hosts: [string]}}
1049
+ */
1050
+
1051
+
1052
+ static getEnvHosts(params) {
1053
+ configNeeded();
1054
+ let envType = ppUtil$1.getEnvType();
1055
+ let x = conf.envHosts[envType] || {
1056
+ hosts: ["localhost"]
1057
+ };
1058
+ let port = +params.port || 8443;
1059
+ return {
1060
+ hosts: x.hosts,
1061
+ port: x.port || port
1062
+ };
1063
+ }
1064
+ /**
1065
+ * 检查指定的host和发送请求的ip是不是自己的ip
1066
+ * @param host
1067
+ * @param req
1068
+ * @returns {Promise<*>}
1069
+ */
1070
+
1071
+
1072
+ static async hostIsMySelf(host, req) {
1073
+ let clientIp = apiUtil$1.getClientIp(req);
1074
+ return getMyIp({
1075
+ hosts: [host, clientIp]
1076
+ });
1077
+ }
1078
+ /**
1079
+ * 检查是否应该把请求转发到其它服务器,若是则转发
1080
+ * @param options
1081
+ * @returns {Promise<boolean>}
1082
+ */
1083
+
1084
+
1085
+ static async checkForwardsHost(options) {
1086
+ configNeeded();
1087
+ const params = options.replacements;
1088
+ const myEnvHosts = apiUtil$1.getEnvHosts(params);
1089
+ const myIp = ppUtil$1.getMyIp();
1090
+ const host = params.host || myIp;
1091
+ if (!myEnvHosts.hosts.contains(host)) throw [err.ACCESS_REFUSED, `环境${conf.envId}貌似无此主机:${params.host}`];
1092
+
1093
+ if (!apiUtil$1.hostIsMySelf(host, options._res.req)) {
1094
+ let result = await apiUtil$1.forwardsTo(host, myEnvHosts.port, params, options._res.req, myIp);
1095
+
1096
+ options._res.send(result);
1097
+
1098
+ return true;
1099
+ }
1100
+
1101
+ return false;
1102
+ }
1103
+ /**
1104
+ * 将收到的请求转发到另一台主机
1105
+ * @param anotherIp
1106
+ * @param port
1107
+ * @param params
1108
+ * @param req
1109
+ * @param lanClient
1110
+ * @returns {Promise<*>}
1111
+ */
1112
+
1113
+
1114
+ static async forwardsTo(anotherIp, port, params, req, lanClient) {
1115
+ let url = anotherIp.indexOf("://") > 0 ? anotherIp : `${port === 443 ? "https" : "http"}://${anotherIp}:${port}${req.originalUrl}`;
1116
+
1117
+ if (url.indexOf("?") > 0) {
1118
+ url = url.substring(0, url.indexOf("?"));
1119
+ }
1120
+
1121
+ let reqOptions = {
1122
+ method: req.method,
1123
+ url: url,
1124
+ data: params
1125
+ };
1126
+ let result = await netUtil.apiRequest(reqOptions);
1127
+
1128
+ if (result.status !== 200) {
1129
+ console.log(`访问 ${reqOptions.url} 出错`, result.status, result.res.statusMessage);
1130
+ throw [err.EXCEPTION, `[${result.status}] - ${result.res.statusMessage}`];
1131
+ }
1132
+
1133
+ return result.data;
1134
+ }
1135
+ /**
1136
+ * 解析配置项路径
1137
+ * @param keyPath
1138
+ * @returns {{parent: null, parentKey: string, value, key: string}}
1139
+ */
1140
+
1141
+
1142
+ static parseCfgPath(keyPath) {
1143
+ let keys = Array.isArray(keyPath) ? keyPath : keyPath.split(".");
1144
+ let parentKey = "";
1145
+ let key = "config";
1146
+ let value = conf;
1147
+ let parent = null;
1148
+
1149
+ for (let i = 0; i < keys.length; i++) {
1150
+ parent = value;
1151
+ parentKey += (parentKey ? "." : "") + key;
1152
+ key = keys[i];
1153
+ value = parent[key];
1154
+
1155
+ if (value === undefined) {
1156
+ throw [err.INVALID_PARAM, `无此配置项: ${key}`];
1157
+ }
1158
+ }
1159
+
1160
+ return {
1161
+ parent,
1162
+ parentKey,
1163
+ key,
1164
+ value
1165
+ };
1041
1166
  } //#endregion
1042
1167
  //region ====中间件
1043
1168
 
@@ -1245,6 +1370,55 @@ class apiUtil$1 {
1245
1370
  });
1246
1371
  }
1247
1372
  } //#endregion
1373
+ //region ====一些通用服务功能
1374
+
1375
+ /**
1376
+ * 获取配置数据
1377
+ * @param options
1378
+ * @returns {Promise<boolean|*>}
1379
+ */
1380
+ // api/config/appSetting.ossEnabled
1381
+
1382
+
1383
+ static async getConfigValue(options) {
1384
+ configNeeded();
1385
+ const params = options.replacements;
1386
+ let item = params.item;
1387
+ delete params.item;
1388
+ if (await apiUtil$1.checkForwardsHost(options)) return true;
1389
+ let c = apiUtil$1.parseCfgPath(item);
1390
+ delete c.parent;
1391
+ c.host = ppUtil$1.getMyIp();
1392
+ return c;
1393
+ }
1394
+ /**
1395
+ * 设置配置数据
1396
+ * @param options
1397
+ * @returns {Promise<*>}
1398
+ */
1399
+
1400
+
1401
+ static async setConfigValue(options) {
1402
+ configNeeded();
1403
+ const params = options.replacements;
1404
+ let item = params.item;
1405
+ delete params.item; // if (await checkForwardsHost(options))
1406
+ // return true;
1407
+
1408
+ await apiUtil$1.parametersOK(params, "value");
1409
+ let c = apiUtil$1.parseCfgPath(item);
1410
+
1411
+ if (typeof c.value === "object") {
1412
+ throw [err.ACCESS_REFUSED, `暂不支持修改复杂配置`];
1413
+ } // c.oldValue = c.value;
1414
+
1415
+
1416
+ c.newValue = params.value;
1417
+ c.parent[c.key] = c.newValue;
1418
+ delete c.parent;
1419
+ c.host = ppUtil$1.getMyIp();
1420
+ return c; // 应用层自行处理多机同步
1421
+ } //#endregion
1248
1422
 
1249
1423
 
1250
1424
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abler-api",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "description": "API服务相关工具",
5
5
  "main": "./dist/cjs/pp-util.js",
6
6
  "-module": "./dist/es/pp-util.js",
@@ -16,7 +16,8 @@
16
16
  "dependencies": {
17
17
  "q": "^1.5.1",
18
18
  "abler-util": ">=0.1.1",
19
- "abler-db": ">=0.1.1"
19
+ "abler-db": ">=0.1.1",
20
+ "abler-net": ">=0.1.1"
20
21
  },
21
22
  "devDependencies": {
22
23
  "@babel/core": "^7.18.5",