@x-9lab/xlab 1.0.0 → 1.0.4-alpha.1

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 (37) hide show
  1. package/@types/components/{common.d.ts → common/index.d.ts} +6 -35
  2. package/@types/components/{cron.d.ts → cron/index.d.ts} +0 -0
  3. package/@types/components/html-processor/index.d.ts +1 -1
  4. package/@types/components/index.d.ts +42 -0
  5. package/@types/components/{log.d.ts → log/index.d.ts} +0 -0
  6. package/@types/components/request/index.d.ts +51 -0
  7. package/@types/components/request/resolve-uri.d.ts +6 -0
  8. package/@types/components/{return-code.d.ts → return-code/index.d.ts} +0 -0
  9. package/@types/components/uuid/index.d.ts +2 -0
  10. package/@types/default-x-config.d.ts +6 -0
  11. package/@types/global.d.ts +15 -22
  12. package/README.md +45 -0
  13. package/dist/bin/watch.js +2 -1
  14. package/dist/bin/xlab +35 -26
  15. package/dist/components/{common.js → common/index.js} +22 -86
  16. package/dist/components/{cron.js → cron/index.js} +0 -0
  17. package/dist/components/html-processor/index.js +4 -4
  18. package/dist/components/index.js +4 -0
  19. package/dist/components/{log.js → log/index.js} +0 -0
  20. package/dist/components/request/index.js +157 -0
  21. package/dist/components/request/resolve-uri.js +28 -0
  22. package/dist/components/{return-code.js → return-code/index.js} +0 -0
  23. package/dist/components/uuid/index.js +14 -7
  24. package/dist/config/process-custom-config-files.js +4 -3
  25. package/dist/config/process-def-config-file.js +6 -4
  26. package/dist/custom.js +2 -1
  27. package/dist/default-x-config.js +21 -0
  28. package/dist/global.js +3 -2
  29. package/dist/middleware/service-mark.js +7 -3
  30. package/dist/middlewares.js +7 -1
  31. package/dist/router.js +2 -1
  32. package/dist/server.js +2 -1
  33. package/package.json +12 -14
  34. package/@types/components/combo/index.d.ts +0 -4
  35. package/@types/middleware/combo.d.ts +0 -2
  36. package/dist/components/combo/index.js +0 -170
  37. package/dist/middleware/combo.js +0 -13
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ setRandomStr: ()=>setRandomStr,
13
+ setDefHeaders: ()=>setDefHeaders,
14
+ fetch: ()=>httpFetch,
15
+ get: ()=>requsetGet,
16
+ post: ()=>requestPost
17
+ });
18
+ const _utils = require("@x-drive/utils");
19
+ const _resolveUri = /*#__PURE__*/ _interopRequireDefault(require("./resolve-uri"));
20
+ const _common = require("../common");
21
+ const _nodeFetch = /*#__PURE__*/ _interopRequireDefault(require("node-fetch"));
22
+ function _interopRequireDefault(obj) {
23
+ return obj && obj.__esModule ? obj : {
24
+ default: obj
25
+ };
26
+ }
27
+ const reqLog = log.getLogger("Request");
28
+ /**给指定对象增加一个随机字符串 */ function setRandomStr(query) {
29
+ if ((0, _utils.isObject)(query) && (0, _utils.isUndefined)(query._)) {
30
+ query._ = Date.now().toString(16);
31
+ }
32
+ }
33
+ /**
34
+ * 处理请求地址上的参数
35
+ * @param uri 待处理地址
36
+ * @param params 地址 param 参数
37
+ */ function processParams(uri, params) {
38
+ if ((0, _utils.isObject)(params)) {
39
+ uri = (0, _utils.labelReplace)(uri, params, true, true);
40
+ }
41
+ return uri;
42
+ }
43
+ /**
44
+ * 处理请求上的 search 参数
45
+ * @param uri 待处理地址
46
+ * @param query 参数对象
47
+ */ function processQuery(uri, query) {
48
+ if ((0, _utils.isObject)(query)) {
49
+ uri = (0, _utils.addQuery)(uri, query);
50
+ }
51
+ return uri;
52
+ }
53
+ /**
54
+ * 预处理请求地址
55
+ * @param uri 请求地址
56
+ * @param query 请求参数
57
+ */ function preProcessor(uri, query, random = false) {
58
+ if (random === true) {
59
+ setRandomStr(query);
60
+ }
61
+ return processQuery(processParams(uri, query), query);
62
+ }
63
+ /**默认 Headers */ const DEF_HEADERS = {};
64
+ /**设置默认 Headers */ function setDefHeaders(headers) {
65
+ if ((0, _utils.isObject)(headers)) {
66
+ Object.keys(headers).forEach((key)=>DEF_HEADERS[key] = headers[key]);
67
+ }
68
+ }
69
+ /**获取待发送的请求的 headers */ function getHeaders(headers, uri) {
70
+ headers = (0, _utils.extend)((0, _utils.copy)(DEF_HEADERS), headers || {});
71
+ if ((0, _utils.isString)(uri)) {
72
+ const url = new URL(uri);
73
+ headers.Host = url.host;
74
+ headers.Origin = url.origin;
75
+ }
76
+ return headers;
77
+ }
78
+ const DEF_CONFIG = {
79
+ "type": "json",
80
+ "sameOrigin": false
81
+ };
82
+ /**
83
+ * 获取数据
84
+ * @param type 请求类型
85
+ * @param uri 请求地址
86
+ * @param query 请求参数
87
+ * @param data 发送数据
88
+ * @param config 请求配置
89
+ * @param needProcessConfig 是否需要处理配置
90
+ */ async function httpFetch(type, uri, query, data, config, retry, needProcessConfig = true) {
91
+ if (needProcessConfig) {
92
+ config = (0, _utils.extend)((0, _utils.copy)(DEF_CONFIG), config || {});
93
+ if ((0, _utils.isNumber)(config.retry) && config.retry > 0) {
94
+ retry = config.retry;
95
+ }
96
+ }
97
+ try {
98
+ const method = type.toUpperCase();
99
+ const options = {
100
+ method
101
+ };
102
+ Object.keys(config).forEach((key)=>{
103
+ if (key !== "headers") {
104
+ options[key] = config[key];
105
+ }
106
+ });
107
+ options.headers = getHeaders(config.headers, config.sameOrigin ? uri : null);
108
+ const url = preProcessor((0, _resolveUri.default)(uri), query, config === null || config === void 0 ? void 0 : config.random);
109
+ if (data) {
110
+ options.body = data;
111
+ }
112
+ const resp = await (0, _nodeFetch.default)(url, options);
113
+ if (resp) {
114
+ if ((0, _utils.isExecutable)(config.onResponse)) {
115
+ await config.onResponse(resp);
116
+ }
117
+ const data1 = await resp[config.type]();
118
+ return data1;
119
+ }
120
+ return null;
121
+ } catch (e) {
122
+ reqLog.error(e);
123
+ if (retry && retry > 0) {
124
+ if ((0, _utils.isNumber)(config.retryDelay) && config.retryDelay > 0) {
125
+ await (0, _common.sleep)(config.retryDelay, reqLog);
126
+ }
127
+ retry -= 1;
128
+ return await httpFetch(type, uri, query, data, config, retry, false);
129
+ }
130
+ return null;
131
+ }
132
+ }
133
+ /**
134
+ * 发起一个 get 请求
135
+ * @param uri 请求地址
136
+ * @param query 请求参数
137
+ */ async function requsetGet(uri, query, config) {
138
+ return await httpFetch("get", uri, query, null, config);
139
+ }
140
+ /**
141
+ * 发起一个 post 请求
142
+ * @param uri 请求地址
143
+ * @param query 请求参数
144
+ * @param data 请求数据
145
+ */ async function requestPost(uri, query, data, config) {
146
+ if (query && (0, _utils.isUndefined)(data)) {
147
+ data = query;
148
+ query = {};
149
+ }
150
+ if ((0, _utils.isUndefined)(query)) {
151
+ query = {};
152
+ }
153
+ if ((0, _utils.isUndefined)(data)) {
154
+ data = {};
155
+ }
156
+ return await httpFetch("post", uri, query, data, config);
157
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: ()=>_default
8
+ });
9
+ const _utils = require("@x-drive/utils");
10
+ const internalServers = getSysConfig("internalServers");
11
+ const Apis = getSysConfig("internalApis");
12
+ const ApiMap = new Map();
13
+ Object.keys(Apis).forEach((key)=>{
14
+ let url = Apis[key];
15
+ url = (0, _utils.labelReplace)(url, internalServers, true);
16
+ ApiMap.set(key, url);
17
+ });
18
+ /**
19
+ * 解析请求别名
20
+ * @param uri 请求地址
21
+ */ function resolve(uri) {
22
+ var url = ApiMap.get(uri);
23
+ if (url) {
24
+ return url;
25
+ }
26
+ return uri;
27
+ }
28
+ const _default = resolve;
@@ -2,17 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "uuid", {
6
- enumerable: true,
7
- get: ()=>uuid
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ X_MAC: ()=>X_MAC,
13
+ uuid: ()=>uuid
8
14
  });
9
15
  const _utils = require("@x-drive/utils");
10
16
  const _os = require("os");
11
17
  const _md5 = require("../md5");
18
+ var ref;
12
19
  var netInterfaces = (0, _os.networkInterfaces)();
13
- const MAC = ((netInterfaces && netInterfaces.en0 || []).find((en)=>en.mac !== "00:00:00:00:00:00") || {
14
- "mac": "99:00:99:00:99:00"
15
- }).mac;
20
+ const X_MAC = ((ref = Object.keys(netInterfaces).sort().map((key)=>netInterfaces[key]).flat(1).find((en)=>{
21
+ return en && en.family && en.family.toLowerCase() === "ipv4" && en.mac !== "00:00:00:00:00:00" ? true : false;
22
+ })) === null || ref === void 0 ? void 0 : ref.mac) || null;
16
23
  netInterfaces = null;
17
24
  /**
18
25
  * 生成一个 uuid
@@ -24,7 +31,7 @@ netInterfaces = null;
24
31
  return [
25
32
  (0, _md5.md5)([
26
33
  one,
27
- MAC,
34
+ X_MAC,
28
35
  tow
29
36
  ].join("&")),
30
37
  Date.now().toString(16),
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "default", {
7
7
  get: ()=>_default
8
8
  });
9
9
  const _common = require("../components/common");
10
+ const _defaultXConfig = /*#__PURE__*/ _interopRequireDefault(require("../default-x-config"));
10
11
  const _utils = require("@x-drive/utils");
11
12
  const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
12
13
  const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
@@ -17,7 +18,7 @@ function _interopRequireDefault(obj) {
17
18
  }
18
19
  function customConfigProcessor(conf, env, envAddConfPath) {
19
20
  // 业务自定义服务端业务文件夹
20
- const customDir = _path.default.resolve(process.cwd(), "@server");
21
+ const customDir = _path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir);
21
22
  // 是否存在业务自定义服务端业务文件夹
22
23
  const hasCustom = (0, _common.checkFileStat)(customDir);
23
24
  if (hasCustom) {
@@ -49,11 +50,11 @@ function customConfigProcessor(conf, env, envAddConfPath) {
49
50
  }
50
51
  // apis文件夹配置处理
51
52
  if (hasCustom) {
52
- const APIS_PATH = _path.default.resolve(process.cwd(), "@server", "@config", "@apis");
53
+ const APIS_PATH = _path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir, "@config", "@apis");
53
54
  if ((0, _common.checkFileStat)(APIS_PATH) && conf.passExtApis !== true) {
54
55
  let apis = [];
55
56
  _fs.default.readdirSync(APIS_PATH).forEach((file)=>{
56
- if (_path.default.extname(file) === ".js") {
57
+ if (!file.startsWith(".") && _path.default.extname(file) === ".js") {
57
58
  apis.push((0, _common.getRealDefaultMod)(require(`${APIS_PATH}/${file}`)));
58
59
  }
59
60
  });
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "default", {
8
8
  });
9
9
  const _common = require("../components/common");
10
10
  const _config = /*#__PURE__*/ _interopRequireDefault(require("../@config/config"));
11
+ const _path = require("path");
11
12
  function _interopRequireDefault(obj) {
12
13
  return obj && obj.__esModule ? obj : {
13
14
  default: obj
@@ -18,12 +19,13 @@ function defConfigProcessor(argv) {
18
19
  // 绑定 IP
19
20
  (_config.default).ip = argv.IP;
20
21
  }
22
+ const apiPath = (0, _path.resolve)("..", "@config", "@apis", "index.js");
21
23
  // api 配置文件处理
22
- var hasCustomApiConf = (0, _common.checkFileStat)("../@config/@apis/index.js", true);
23
- if (hasCustomApiConf) {
24
- _config.default.apis = Object.assign(_config.default.apis || {}, (0, _common.getRealDefaultMod)(require("../conf/@conf/index.js")));
24
+ var hasDefApiConf = (0, _common.checkFileStat)(apiPath, true);
25
+ if (hasDefApiConf) {
26
+ _config.default.apis = Object.assign(_config.default.apis || {}, (0, _common.getRealDefaultMod)(require(apiPath)));
25
27
  }
26
- hasCustomApiConf = null;
28
+ hasDefApiConf = null;
27
29
  return _config.default;
28
30
  }
29
31
  const _default = defConfigProcessor;
package/dist/custom.js CHANGED
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "default", {
8
8
  });
9
9
  const _utils = require("@x-drive/utils");
10
10
  const _common = require("./components/common");
11
+ const _defaultXConfig = /*#__PURE__*/ _interopRequireDefault(require("./default-x-config"));
11
12
  const _config = require("./config");
12
13
  const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
13
14
  function _interopRequireDefault(obj) {
@@ -17,7 +18,7 @@ function _interopRequireDefault(obj) {
17
18
  }
18
19
  /**处理自定义业务 */ function processCustom() {
19
20
  const config = (0, _config.get)();
20
- const CustomPath = _path.default.resolve(process.cwd(), "@server", "custom");
21
+ const CustomPath = _path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir, "custom");
21
22
  const hasCustom = (0, _common.checkFileStat)(CustomPath);
22
23
  if (!hasCustom) {
23
24
  return;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: ()=>_default
8
+ });
9
+ const _utils = require("@x-drive/utils");
10
+ /**默认业务目录 */ var businessDir = "@server";
11
+ let Config = class Config {
12
+ get businessDir() {
13
+ return businessDir;
14
+ }
15
+ set businessDir(val) {
16
+ if ((0, _utils.isString)(val)) {
17
+ businessDir = val;
18
+ }
19
+ }
20
+ };
21
+ const _default = new Config;
package/dist/global.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ const _defaultXConfig = /*#__PURE__*/ _interopRequireDefault(require("./default-x-config"));
5
6
  const _config = require("./config");
6
7
  const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
7
8
  function _interopRequireDefault(obj) {
@@ -27,7 +28,7 @@ function _interopRequireDefault(obj) {
27
28
  global.requireMod = requireMod;
28
29
  /**
29
30
  * model 存放路径
30
- */ const MODEL_PATH = _path.default.resolve(process.cwd(), "@server", "business", "@models");
31
+ */ const MODEL_PATH = _path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir, "business", "@models");
31
32
  /**
32
33
  * 全局获取 model 的方法
33
34
  * @param name model 名称
@@ -38,7 +39,7 @@ global.requireMod = requireMod;
38
39
  global.requireModel = requireModel;
39
40
  /**
40
41
  * services 存放目录
41
- */ const SERVICES_PATH = _path.default.resolve(process.cwd(), "@server", "business", "@services");
42
+ */ const SERVICES_PATH = _path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir, "business", "@services");
42
43
  /**
43
44
  * 全局获取 service 的方法
44
45
  * @param name service 名称
@@ -6,18 +6,22 @@ Object.defineProperty(exports, "default", {
6
6
  enumerable: true,
7
7
  get: ()=>_default
8
8
  });
9
+ const serverPackge = require("../../package.json");
9
10
  var info = {};
10
11
  // 业务名称
11
12
  info.mark = getSysConfig("mark") || getSysConfig("name");
12
13
  // 业务版本
13
14
  info.version = getSysConfig("version");
14
15
  // 服务端版本
15
- info.serverVer = require("../../package.json").version;
16
+ info.serverVer = serverPackge.version;
17
+ info.serverName = serverPackge.name;
16
18
  // 业务启动时间
17
19
  // FIX ME : 服务器不是北京时间的时候这个数据跟实际启动的时间存在时差
18
- info.date = requireMod("common").date("Y-m-d h:i:s", Date.now());
20
+ info.date = requireMod("common").date("Y-m-d H:i:s", new Date());
19
21
  // 模块版本信息
20
- const MARK = `${info.mark}@${info.version}&${info.serverVer} (${info.date})`;
22
+ const CLIENT_MARK = `${info.mark}@${info.version}`;
23
+ const SERVER_MARK = `${info.serverName}@${info.serverVer}`;
24
+ const MARK = `${CLIENT_MARK},${SERVER_MARK};Startup@${info.date}`;
21
25
  info = null;
22
26
  /**
23
27
  * 处理函数
@@ -8,6 +8,12 @@ Object.defineProperty(exports, "default", {
8
8
  });
9
9
  const _common = require("./components/common");
10
10
  const _utils = require("@x-drive/utils");
11
+ const _defaultXConfig = /*#__PURE__*/ _interopRequireDefault(require("./default-x-config"));
12
+ function _interopRequireDefault(obj) {
13
+ return obj && obj.__esModule ? obj : {
14
+ default: obj
15
+ };
16
+ }
11
17
  const cwd = process.cwd();
12
18
  /**内部中间件 */ const INTERNAL_MIDDLEWARE = {
13
19
  "combo": true,
@@ -30,7 +36,7 @@ const cwd = process.cwd();
30
36
  if (INTERNAL_MIDDLEWARE[name]) {
31
37
  app.use((0, _common.getRealDefaultMod)(require(`./middleware/${name}`))(conf));
32
38
  } else {
33
- app.use((0, _common.getRealDefaultMod)(require(`${cwd}/@server/middleware/${name}`))(conf));
39
+ app.use((0, _common.getRealDefaultMod)(require(`${cwd}/${_defaultXConfig.default.businessDir}/middleware/${name}`))(conf));
34
40
  }
35
41
  masterLog(`MIDDLEWARE >>> [${name}] launch`);
36
42
  });
package/dist/router.js CHANGED
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "default", {
8
8
  });
9
9
  const _utils = require("@x-drive/utils");
10
10
  const _common = require("./components/common");
11
+ const _defaultXConfig = /*#__PURE__*/ _interopRequireDefault(require("./default-x-config"));
11
12
  const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
12
13
  function _interopRequireDefault(obj) {
13
14
  return obj && obj.__esModule ? obj : {
@@ -91,7 +92,7 @@ function _interopRequireDefault(obj) {
91
92
  var _p = _path.default.resolve(__dirname, "business");
92
93
  (0, _common.walk)(_p, 0, processBusiness);
93
94
  // 支持自定义 api
94
- _p = _path.default.resolve(process.cwd(), "@server", "business");
95
+ _p = _path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir, "business");
95
96
  if (process.cwd() !== __dirname && (0, _common.checkFileStat)(_p)) {
96
97
  (0, _common.walk)(_p, 0, processBusiness);
97
98
  }
package/dist/server.js CHANGED
@@ -16,6 +16,7 @@ _export(exports, {
16
16
  require("./global");
17
17
  const _log = require("./components/log");
18
18
  const _cron = require("./components/cron");
19
+ const _defaultXConfig = /*#__PURE__*/ _interopRequireDefault(require("./default-x-config"));
19
20
  const _koaStatic = /*#__PURE__*/ _interopRequireDefault(require("koa-static"));
20
21
  const _koaRouter = /*#__PURE__*/ _interopRequireDefault(require("koa-router"));
21
22
  const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
@@ -113,7 +114,7 @@ app.use((0, _koaStatic.default)(_path.default.resolve(process.cwd(), _config.def
113
114
  app.use(_badRequest.default);
114
115
  if (_config.default.enableCron) {
115
116
  // 定时任务
116
- (0, _cron.on)(_path.default.resolve(process.cwd(), "@server", "cron"));
117
+ (0, _cron.on)(_path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir, "cron"));
117
118
  }
118
119
  /**启动服务 */ function boot() {
119
120
  (0, _cluster.default)();
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@x-9lab/xlab",
3
- "version": "1.0.0",
3
+ "version": "1.0.4-alpha.1",
4
4
  "description": "9lab 服务端模块",
5
- "versionDesc": "",
5
+ "versionDesc": "修改配置文件名称, 修改服务端主要业务目录",
6
6
  "scripts": {
7
7
  "dev": "swc src -D ./src/bin --config-file .swcrc -d dist -w",
8
8
  "compile": "swc src -D ./src/bin --config-file .swcrc -d dist",
@@ -20,21 +20,20 @@
20
20
  "@types"
21
21
  ],
22
22
  "dependencies": {
23
- "koa": "2.13.1",
23
+ "koa": "2.13.4",
24
24
  "cron": "1.8.2",
25
- "redis": "4.0.3",
26
- "log4js": "1.1.1",
27
- "liftoff": "3.1.0",
25
+ "log4js": "^1.1.1",
26
+ "liftoff": "4.0.0",
28
27
  "koa-ejs": "4.3.0",
29
- "minimist": "1.2.5",
30
- "request": "2.86.0",
31
- "koa-body": "4.2.0",
32
- "lru-cache": "6.0.0",
28
+ "minimist": "1.2.6",
29
+ "koa-body": "5.0.0",
30
+ "lru-cache": "^6.0.0",
31
+ "node-fetch": "3.0.0",
33
32
  "koa-static": "5.0.0",
34
- "koa-router": "10.0.0",
33
+ "koa-router": "11.0.1",
35
34
  "http-proxy": "1.18.1",
36
- "koa-compress": "5.0.1",
37
- "@x-drive/utils": "1.1.19"
35
+ "koa-compress": "5.1.0",
36
+ "@x-drive/utils": "1.1.22"
38
37
  },
39
38
  "devDependencies": {
40
39
  "co": "4.6.0",
@@ -43,7 +42,6 @@
43
42
  "colors": "1.4.0",
44
43
  "should": "11.2.1",
45
44
  "nodemon": "2.0.12",
46
- "socket.io": "2.0.3",
47
45
  "chokidar": "3.5.3",
48
46
  "typescript": "4.3.4",
49
47
  "@types/node": "16.11.40",
@@ -1,4 +0,0 @@
1
- import type Koa from "koa";
2
- declare function handle(ctx: Koa.Context, next: Koa.Next): Promise<void>;
3
- declare function init(): typeof handle;
4
- export { init };
@@ -1,2 +0,0 @@
1
- declare function handler(): (ctx: import("koa").Context, next: import("koa").Next) => Promise<void>;
2
- export default handler;
@@ -1,170 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "init", {
6
- enumerable: true,
7
- get: ()=>init
8
- });
9
- const _cache = require("../cache");
10
- const _header = /*#__PURE__*/ _interopRequireWildcard(require("../header"));
11
- const _mime = require("../mime");
12
- const _md5 = require("../md5");
13
- const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
14
- const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
15
- function _interopRequireDefault(obj) {
16
- return obj && obj.__esModule ? obj : {
17
- default: obj
18
- };
19
- }
20
- function _getRequireWildcardCache(nodeInterop) {
21
- if (typeof WeakMap !== "function") return null;
22
- var cacheBabelInterop = new WeakMap();
23
- var cacheNodeInterop = new WeakMap();
24
- return (_getRequireWildcardCache = function(nodeInterop) {
25
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
26
- })(nodeInterop);
27
- }
28
- function _interopRequireWildcard(obj, nodeInterop) {
29
- if (!nodeInterop && obj && obj.__esModule) {
30
- return obj;
31
- }
32
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
33
- return {
34
- default: obj
35
- };
36
- }
37
- var cache = _getRequireWildcardCache(nodeInterop);
38
- if (cache && cache.has(obj)) {
39
- return cache.get(obj);
40
- }
41
- var newObj = {};
42
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
43
- for(var key in obj){
44
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
45
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
46
- if (desc && (desc.get || desc.set)) {
47
- Object.defineProperty(newObj, key, desc);
48
- } else {
49
- newObj[key] = obj[key];
50
- }
51
- }
52
- }
53
- newObj.default = obj;
54
- if (cache) {
55
- cache.set(obj, newObj);
56
- }
57
- return newObj;
58
- }
59
- var conf;
60
- // combo 文件缓存时间单位
61
- // 默认一周
62
- // @todo 上 cdn 的话需要根据 cdn 的情况调整这个时间
63
- const COMBO_CACHE_TIME = 1000 * 60 * 60 * 24 * 7;
64
- // combo 组合缓存
65
- const comboCache = (0, _cache.local)("JS_CACHE", {
66
- "maxAge": COMBO_CACHE_TIME,
67
- "max": 200
68
- });
69
- // 单独的文件缓存
70
- // 因为会存在大量公共组件,且有多个入口,当用户从不同的入口进来时会因为组合问题多次调用文件读取
71
- // 增加单独缓存用于减少应用启动初期或 dns 回源时的瞬间压力
72
- const fileCache = (0, _cache.local)("JS_FILE_CACHE", {
73
- "maxAge": COMBO_CACHE_TIME,
74
- "max": 500
75
- });
76
- var logger;
77
- // 扩展名对应的 mime 头
78
- const extMap = {};
79
- Object.keys(_mime.MIME).forEach((ext)=>{
80
- extMap["." + ext] = _mime.MIME[ext];
81
- });
82
- // 处理合并请求,合并请求以两个问号开头
83
- // 请求示例:http://127.0.0.1:5000/??page-manager/1.0.0/page-manager.js,router/1.0.0/router.js,event/1.0.0/event.js,mobile/1.0.0/message/message.js,envi/1.0.0/envi.js,underscore/1.5.2/underscore.js
84
- async function handle(ctx, next) {
85
- let parsedUrl = ctx.url;
86
- let search = ctx.query;
87
- // combo 请求对应的缓存 key
88
- let cacheKey;
89
- // combo 返回内入
90
- let content;
91
- // 如果不是合并请求,则不进行处理,交给下一步
92
- if (!search || parsedUrl.indexOf("??") < 0) {
93
- await next();
94
- return;
95
- }
96
- let filesStr = Object.keys(search)[0].substr(1);
97
- // 设置文件类型,以便正确返回
98
- if (filesStr.indexOf(".js") > -1) {
99
- ctx.set("Content-Type", extMap[".js"]);
100
- } else {
101
- for(let ext in extMap){
102
- if (filesStr.indexOf(ext) > -1) {
103
- ctx.set("Content-Type", extMap[ext]);
104
- break;
105
- }
106
- }
107
- }
108
- // 生成缓存 key
109
- cacheKey = (0, _md5.md5)(filesStr);
110
- // 检查是否有缓存
111
- content = comboCache.get(cacheKey);
112
- // 没有缓存内容,需要读取并且拼接
113
- if (!content) {
114
- // 按照逗号拆分成模块 uri
115
- let uris = filesStr.split(",");
116
- uris = uris.map((uri)=>{
117
- let searchIndex = uri.indexOf("?");
118
- if (searchIndex > -1) {
119
- uri = uri.substring(0, searchIndex);
120
- }
121
- return uri;
122
- });
123
- // 根据 uri 查找文件并拼合
124
- var files = [];
125
- // 读取相关文件
126
- uris.forEach((uri)=>{
127
- // 优先从文件缓存中读
128
- let file = fileCache.get(uri);
129
- if (file) {
130
- files.push(file);
131
- } else {
132
- try {
133
- file = _fs.default.readFileSync(_path.default.resolve(conf.root, "c", uri), "utf8");
134
- } catch (e) {
135
- logger.error("READ COMBO FILE ERROR", uri, e);
136
- }
137
- if (file) {
138
- files.push(file);
139
- fileCache.set(uri, file);
140
- }
141
- }
142
- });
143
- // 合并文件
144
- content = files.join("\n");
145
- // 设置缓存
146
- comboCache.set(cacheKey, content);
147
- } else {
148
- ctx.set("Hit-Combo", cacheKey);
149
- }
150
- // 无法正确读取文件
151
- // 交给后续的 404 处理
152
- if (content === undefined || content === null) {
153
- await next();
154
- return;
155
- }
156
- if (conf.enableComboCache) {
157
- // 生产环境默认开启缓存
158
- // 缓存时间固定为 6 天
159
- _header.cacheControl("6d", ctx);
160
- _header.expire("6d", ctx);
161
- _header.lastModified(null, ctx);
162
- }
163
- // 返回数据
164
- ctx.body = content;
165
- }
166
- function init() {
167
- conf = getSysConfig();
168
- logger = log.getLogger("common");
169
- return handle;
170
- }