@doracli/express 0.0.3 → 0.0.4

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/lib/cjs/index.js CHANGED
@@ -1,15 +1,52 @@
1
1
  'use strict';
2
2
 
3
- var express = require('express');
3
+ var path = require('path');
4
+ var utils = require('@cclr/utils');
4
5
  var filePro = require('@dorabag/file-pro');
6
+ var express = require('express');
5
7
  var lang = require('@cclr/lang');
8
+ var crypto = require('crypto');
9
+ var fs = require('fs');
10
+ var zlib = require('zlib');
6
11
  var helper = require('@doracli/helper');
12
+ var path$1 = require('node:path');
13
+ var http = require('http');
14
+ var https = require('https');
15
+ var url = require('url');
7
16
 
8
- var createServer = function createServer(config) {
9
- var app = express();
10
- return app;
11
- };
12
-
17
+ function _arrayLikeToArray(r, a) {
18
+ (null == a || a > r.length) && (a = r.length);
19
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
20
+ return n;
21
+ }
22
+ function _arrayWithHoles(r) {
23
+ if (Array.isArray(r)) return r;
24
+ }
25
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
26
+ try {
27
+ var i = n[a](c),
28
+ u = i.value;
29
+ } catch (n) {
30
+ return void e(n);
31
+ }
32
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
33
+ }
34
+ function _asyncToGenerator(n) {
35
+ return function () {
36
+ var t = this,
37
+ e = arguments;
38
+ return new Promise(function (r, o) {
39
+ var a = n.apply(t, e);
40
+ function _next(n) {
41
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
42
+ }
43
+ function _throw(n) {
44
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
45
+ }
46
+ _next(void 0);
47
+ });
48
+ };
49
+ }
13
50
  function _classCallCheck(a, n) {
14
51
  if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
15
52
  }
@@ -32,6 +69,33 @@ function _defineProperty(e, r, t) {
32
69
  writable: true
33
70
  }) : e[r] = t, e;
34
71
  }
72
+ function _iterableToArrayLimit(r, l) {
73
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
74
+ if (null != t) {
75
+ var e,
76
+ n,
77
+ i,
78
+ u,
79
+ a = [],
80
+ f = true,
81
+ o = false;
82
+ try {
83
+ if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
84
+ } catch (r) {
85
+ o = true, n = r;
86
+ } finally {
87
+ try {
88
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
89
+ } finally {
90
+ if (o) throw n;
91
+ }
92
+ }
93
+ return a;
94
+ }
95
+ }
96
+ function _nonIterableRest() {
97
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
98
+ }
35
99
  function ownKeys(e, r) {
36
100
  var t = Object.keys(e);
37
101
  if (Object.getOwnPropertySymbols) {
@@ -53,6 +117,117 @@ function _objectSpread2(e) {
53
117
  }
54
118
  return e;
55
119
  }
120
+ function _regenerator() {
121
+ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
122
+ var e,
123
+ t,
124
+ r = "function" == typeof Symbol ? Symbol : {},
125
+ n = r.iterator || "@@iterator",
126
+ o = r.toStringTag || "@@toStringTag";
127
+ function i(r, n, o, i) {
128
+ var c = n && n.prototype instanceof Generator ? n : Generator,
129
+ u = Object.create(c.prototype);
130
+ return _regeneratorDefine(u, "_invoke", function (r, n, o) {
131
+ var i,
132
+ c,
133
+ u,
134
+ f = 0,
135
+ p = o || [],
136
+ y = false,
137
+ G = {
138
+ p: 0,
139
+ n: 0,
140
+ v: e,
141
+ a: d,
142
+ f: d.bind(e, 4),
143
+ d: function (t, r) {
144
+ return i = t, c = 0, u = e, G.n = r, a;
145
+ }
146
+ };
147
+ function d(r, n) {
148
+ for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {
149
+ var o,
150
+ i = p[t],
151
+ d = G.p,
152
+ l = i[2];
153
+ r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));
154
+ }
155
+ if (o || r > 1) return a;
156
+ throw y = true, n;
157
+ }
158
+ return function (o, p, l) {
159
+ if (f > 1) throw TypeError("Generator is already running");
160
+ for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {
161
+ i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);
162
+ try {
163
+ if (f = 2, i) {
164
+ if (c || (o = "next"), t = i[o]) {
165
+ if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");
166
+ if (!t.done) return t;
167
+ u = t.value, c < 2 && (c = 0);
168
+ } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);
169
+ i = e;
170
+ } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;
171
+ } catch (t) {
172
+ i = e, c = 1, u = t;
173
+ } finally {
174
+ f = 1;
175
+ }
176
+ }
177
+ return {
178
+ value: t,
179
+ done: y
180
+ };
181
+ };
182
+ }(r, o, i), true), u;
183
+ }
184
+ var a = {};
185
+ function Generator() {}
186
+ function GeneratorFunction() {}
187
+ function GeneratorFunctionPrototype() {}
188
+ t = Object.getPrototypeOf;
189
+ var c = [][n] ? t(t([][n]())) : (_regeneratorDefine(t = {}, n, function () {
190
+ return this;
191
+ }), t),
192
+ u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);
193
+ function f(e) {
194
+ return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;
195
+ }
196
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine(u), _regeneratorDefine(u, o, "Generator"), _regeneratorDefine(u, n, function () {
197
+ return this;
198
+ }), _regeneratorDefine(u, "toString", function () {
199
+ return "[object Generator]";
200
+ }), (_regenerator = function () {
201
+ return {
202
+ w: i,
203
+ m: f
204
+ };
205
+ })();
206
+ }
207
+ function _regeneratorDefine(e, r, n, t) {
208
+ var i = Object.defineProperty;
209
+ try {
210
+ i({}, "", {});
211
+ } catch (e) {
212
+ i = 0;
213
+ }
214
+ _regeneratorDefine = function (e, r, n, t) {
215
+ function o(r, n) {
216
+ _regeneratorDefine(e, r, function (e) {
217
+ return this._invoke(r, n, e);
218
+ });
219
+ }
220
+ r ? i ? i(e, r, {
221
+ value: n,
222
+ enumerable: !t,
223
+ configurable: !t,
224
+ writable: !t
225
+ }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
226
+ }, _regeneratorDefine(e, r, n, t);
227
+ }
228
+ function _slicedToArray(r, e) {
229
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
230
+ }
56
231
  function _toPrimitive(t, r) {
57
232
  if ("object" != typeof t || !t) return t;
58
233
  var e = t[Symbol.toPrimitive];
@@ -61,12 +236,121 @@ function _toPrimitive(t, r) {
61
236
  if ("object" != typeof i) return i;
62
237
  throw new TypeError("@@toPrimitive must return a primitive value.");
63
238
  }
64
- return (String )(t);
239
+ return ("string" === r ? String : Number)(t);
65
240
  }
66
241
  function _toPropertyKey(t) {
67
242
  var i = _toPrimitive(t, "string");
68
243
  return "symbol" == typeof i ? i : i + "";
69
244
  }
245
+ function _unsupportedIterableToArray(r, a) {
246
+ if (r) {
247
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
248
+ var t = {}.toString.call(r).slice(8, -1);
249
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
250
+ }
251
+ }
252
+
253
+ var serverCacheMw = function serverCacheMw(cacheDir) {
254
+ return function (ctx) {
255
+ return function (next) {
256
+ return /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
257
+ var serverCacheDir;
258
+ return _regenerator().w(function (_context) {
259
+ while (1) switch (_context.n) {
260
+ case 0:
261
+ serverCacheDir = path.join(ctx.envParams.workRootDir, cacheDir || './.cache/serverCache');
262
+ if (!filePro.isValidDirSync(serverCacheDir)) {
263
+ _context.n = 3;
264
+ break;
265
+ }
266
+ _context.n = 1;
267
+ return filePro.cleanTargets(serverCacheDir);
268
+ case 1:
269
+ _context.n = 2;
270
+ return utils.sleep(300);
271
+ case 2:
272
+ _context.n = 4;
273
+ break;
274
+ case 3:
275
+ filePro.mkdirRecursionSync(serverCacheDir);
276
+ case 4:
277
+ ctx.updateServerConfig({
278
+ cacheDir: serverCacheDir
279
+ });
280
+ return _context.a(2, next());
281
+ }
282
+ }, _callee);
283
+ }));
284
+ };
285
+ };
286
+ };
287
+
288
+ var envParamsMw = function envParamsMw(envParams) {
289
+ return function (ctx) {
290
+ return function (next) {
291
+ return /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
292
+ return _regenerator().w(function (_context) {
293
+ while (1) switch (_context.n) {
294
+ case 0:
295
+ ctx.updateEnvParams(envParams);
296
+ return _context.a(2, next());
297
+ }
298
+ }, _callee);
299
+ }));
300
+ };
301
+ };
302
+ };
303
+
304
+ var serverPlainMw = function serverPlainMw() {
305
+ return function (ctx) {
306
+ return function (next) {
307
+ return /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
308
+ var _ctx$configCtx$getDor, serviceConfig, _ref2, https, pathRouteMap, port, proxy;
309
+ return _regenerator().w(function (_context) {
310
+ while (1) switch (_context.n) {
311
+ case 0:
312
+ _ctx$configCtx$getDor = ctx.configCtx.getDoraConfig(), serviceConfig = _ctx$configCtx$getDor.serviceConfig;
313
+ _ref2 = serviceConfig, https = _ref2.https, pathRouteMap = _ref2.pathRouteMap, port = _ref2.port, proxy = _ref2.proxy;
314
+ ctx.updateServerConfig({
315
+ https: https,
316
+ pathRouteMap: pathRouteMap,
317
+ port: port,
318
+ proxy: proxy,
319
+ static: serviceConfig.static
320
+ });
321
+ return _context.a(2, next());
322
+ }
323
+ }, _callee);
324
+ }));
325
+ };
326
+ };
327
+ };
328
+
329
+ var serverScanMw = function serverScanMw(mainScan) {
330
+ return function (ctx) {
331
+ return function (next) {
332
+ return /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
333
+ var _ctx$configCtx$getDor, serviceConfig, _ref2, scan;
334
+ return _regenerator().w(function (_context) {
335
+ while (1) switch (_context.n) {
336
+ case 0:
337
+ _ctx$configCtx$getDor = ctx.configCtx.getDoraConfig(), serviceConfig = _ctx$configCtx$getDor.serviceConfig;
338
+ _ref2 = serviceConfig, scan = _ref2.scan;
339
+ ctx.updateServerConfig({
340
+ scan: mainScan || scan
341
+ });
342
+ return _context.a(2, next());
343
+ }
344
+ }, _callee);
345
+ }));
346
+ };
347
+ };
348
+ };
349
+
350
+ var createServer = function createServer(config) {
351
+ var app = express();
352
+ return app;
353
+ };
70
354
 
71
355
  var RouteManager = /*#__PURE__*/function () {
72
356
  function RouteManager(app) {
@@ -77,23 +361,23 @@ var RouteManager = /*#__PURE__*/function () {
77
361
  }
78
362
  return _createClass(RouteManager, [{
79
363
  key: "check",
80
- value: function check(route) {
81
- return !!this.routesMap[route];
364
+ value: function check(route, method) {
365
+ return !!lang.get(this.routesMap, "".concat(route, ".").concat(method));
82
366
  }
83
367
  }, {
84
368
  key: "add",
85
- value: function add(route, method, handler) {
86
- this.updateMap(route, method, handler);
369
+ value: function add(route, method, handler, options) {
370
+ this.updateMap(route, method, handler, 'added', options);
87
371
  this.app.route(route)[method](this.getProxyHandler(route, method));
88
372
  }
89
373
  }, {
90
374
  key: "update",
91
- value: function update(route, method, handler) {
92
- if (!this.check(route)) {
93
- this.add(route, method, handler);
375
+ value: function update(route, method, handler, options) {
376
+ if (!this.check(route, method)) {
377
+ this.add(route, method, handler, options);
94
378
  return;
95
379
  }
96
- this.updateMap(route, method, handler, 'updated');
380
+ this.updateMap(route, method, handler, 'updated', options);
97
381
  }
98
382
  }, {
99
383
  key: "remove",
@@ -112,23 +396,48 @@ var RouteManager = /*#__PURE__*/function () {
112
396
  key: "updateMap",
113
397
  value: function updateMap(route, method, handler) {
114
398
  var state = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'added';
399
+ var options = arguments.length > 4 ? arguments[4] : undefined;
115
400
  lang.set(this.routesMap, "".concat(route, ".").concat(method), {
116
401
  state: state,
117
- handler: handler
402
+ handler: handler,
403
+ handlerType: options === null || options === void 0 ? void 0 : options.handlerType
118
404
  });
119
405
  }
120
406
  }, {
121
407
  key: "getProxyHandler",
122
408
  value: function getProxyHandler(route, method) {
123
409
  var _this = this;
124
- return function (req, res) {
125
- var record = lang.get(_this.routesMap, "".concat(route, ".").concat(method), {});
126
- if (record.handler) {
127
- return record.handler(req, res);
128
- } else {
129
- return res.status(404).send("".concat(method, " ").concat(route, " route not found"));
130
- }
131
- };
410
+ return /*#__PURE__*/function () {
411
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(req, res) {
412
+ var record, r;
413
+ return _regenerator().w(function (_context) {
414
+ while (1) switch (_context.n) {
415
+ case 0:
416
+ record = lang.get(_this.routesMap, "".concat(route, ".").concat(method), {});
417
+ if (!record.handler) {
418
+ _context.n = 3;
419
+ break;
420
+ }
421
+ if (!(record.handlerType === 'REST')) {
422
+ _context.n = 2;
423
+ break;
424
+ }
425
+ _context.n = 1;
426
+ return record.handler(req, res);
427
+ case 1:
428
+ r = _context.v;
429
+ return _context.a(2, res.status(200).json(r));
430
+ case 2:
431
+ return _context.a(2, record.handler(req, res));
432
+ case 3:
433
+ return _context.a(2, res.status(404).send("".concat(method, " ").concat(route, " route not found")));
434
+ }
435
+ }, _callee);
436
+ }));
437
+ return function (_x, _x2) {
438
+ return _ref.apply(this, arguments);
439
+ };
440
+ }();
132
441
  }
133
442
  }]);
134
443
  }();
@@ -143,6 +452,7 @@ var Ctx = /*#__PURE__*/function () {
143
452
  scan: './',
144
453
  workRootDir: filePro.getCwd()
145
454
  });
455
+ _defineProperty(this, "serverConfig", {});
146
456
  this.configCtx = configCtx;
147
457
  this.app = app;
148
458
  this.routeManager = new RouteManager(app);
@@ -152,19 +462,310 @@ var Ctx = /*#__PURE__*/function () {
152
462
  value: function updateEnvParams(params) {
153
463
  this.envParams = _objectSpread2(_objectSpread2({}, this.envParams), params);
154
464
  }
465
+ }, {
466
+ key: "updateServerConfig",
467
+ value: function updateServerConfig(config) {
468
+ this.serverConfig = _objectSpread2(_objectSpread2({}, this.serverConfig), config);
469
+ }
470
+ }]);
471
+ }();
472
+
473
+ var fileListHtmlTemplate = "\n <html>\n <head>\n <title>File List</title>\n <style>\n .file-list {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n </style>\n </head>\n <body>\n <h1>File List</h1>\n </body>\n </html>\n";
474
+
475
+ // mime.ts
476
+ var MIME_MAP = {
477
+ '.html': 'text/html; charset=utf-8',
478
+ '.htm': 'text/html; charset=utf-8',
479
+ '.css': 'text/css; charset=utf-8',
480
+ '.js': 'application/javascript; charset=utf-8',
481
+ '.mjs': 'application/javascript; charset=utf-8',
482
+ '.json': 'application/json; charset=utf-8',
483
+ '.png': 'image/png',
484
+ '.jpg': 'image/jpeg',
485
+ '.jpeg': 'image/jpeg',
486
+ '.gif': 'image/gif',
487
+ '.svg': 'image/svg+xml',
488
+ '.ico': 'image/x-icon',
489
+ '.webp': 'image/webp',
490
+ '.mp4': 'video/mp4',
491
+ '.webm': 'video/webm',
492
+ '.woff': 'font/woff',
493
+ '.woff2': 'font/woff2',
494
+ '.ttf': 'font/ttf',
495
+ '.otf': 'font/otf',
496
+ '.txt': 'text/plain; charset=utf-8',
497
+ '.xml': 'application/xml; charset=utf-8',
498
+ '.pdf': 'application/pdf'
499
+ };
500
+ var DEFAULT_MIME = 'application/octet-stream';
501
+ function getMimeType(filePath) {
502
+ var ext = path$1.extname(filePath).toLowerCase();
503
+ return MIME_MAP[ext] || DEFAULT_MIME;
504
+ }
155
505
 
156
- // getServiceConfig() {
157
- // return this.configCtx.getDoraConfig().serviceConfig!;
158
- // }
506
+ var FileServer = /*#__PURE__*/function () {
507
+ function FileServer(directory, publicPath) {
508
+ _classCallCheck(this, FileServer);
509
+ this.directory = directory;
510
+ this.publicPath = publicPath;
511
+ _defineProperty(this, "htmlManage", new helper.HtmlManage(helper.HtmlManage.parseHtml(fileListHtmlTemplate)));
512
+ }
513
+
514
+ /**
515
+ * 请求入口
516
+ * @param {*} req
517
+ * @param {*} res
518
+ * @returns
519
+ */
520
+ return _createClass(FileServer, [{
521
+ key: "handleRequest",
522
+ value: (function () {
523
+ var _handleRequest = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(req, res) {
524
+ var pathname, requestFile, fsStat;
525
+ return _regenerator().w(function (_context) {
526
+ while (1) switch (_context.p = _context.n) {
527
+ case 0:
528
+ pathname = utils.uri.getPathStr(req.url) || ''; // 过滤ico文件请求
529
+ if (!(pathname === '/favicon.ico')) {
530
+ _context.n = 1;
531
+ break;
532
+ }
533
+ return _context.a(2, res.send('no file !!'));
534
+ case 1:
535
+ // 整合参数
536
+ pathname = decodeURIComponent(pathname || '');
537
+ // pathname 去掉 publicPath
538
+ pathname = pathname.replace(this.publicPath, '');
539
+ requestFile = path.join(this.directory, pathname);
540
+ /** 设计允许跨域 */
541
+ res.setHeader('Access-Control-Allow-Origin', '*');
542
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
543
+ res.setHeader('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS');
544
+ res.setHeader('Content-Type', 'text/html;charset=utf-8');
545
+
546
+ // 判断路径属性,--路径 or 文件
547
+ _context.p = 2;
548
+ _context.n = 3;
549
+ return fs.promises.stat(requestFile);
550
+ case 3:
551
+ fsStat = _context.v;
552
+ if (fsStat.isDirectory()) {
553
+ this.sendDir(requestFile, req, res);
554
+ } else {
555
+ this.sendFile(requestFile, req, res, fsStat);
556
+ }
557
+ _context.n = 5;
558
+ break;
559
+ case 4:
560
+ _context.p = 4;
561
+ _context.v;
562
+ helper.cLog.error('fs', 'not_found', pathname);
563
+ res.send('File not found');
564
+ case 5:
565
+ return _context.a(2);
566
+ }
567
+ }, _callee, this, [[2, 4]]);
568
+ }));
569
+ function handleRequest(_x, _x2) {
570
+ return _handleRequest.apply(this, arguments);
571
+ }
572
+ return handleRequest;
573
+ }()
574
+ /**
575
+ * 相应文件路径数据
576
+ * @param {*} dirPath 文件目录路径
577
+ */
578
+ )
579
+ }, {
580
+ key: "sendDir",
581
+ value: (function () {
582
+ var _sendDir = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(dirPath, req, res) {
583
+ var dirList, pathname, fileContent;
584
+ return _regenerator().w(function (_context2) {
585
+ while (1) switch (_context2.n) {
586
+ case 0:
587
+ _context2.n = 1;
588
+ return fs.promises.readdir(dirPath);
589
+ case 1:
590
+ dirList = _context2.v;
591
+ pathname = utils.uri.getPathStr(req.url) || ''; // 生成返回模板数据
592
+ fileContent = this.htmlManage.copy().addBody({
593
+ tagName: 'ul',
594
+ attrs: [{
595
+ name: 'class',
596
+ value: 'file-list'
597
+ }],
598
+ children: dirList.map(function (dir) {
599
+ return {
600
+ tagName: 'li',
601
+ children: [{
602
+ tagName: 'a',
603
+ attrs: [{
604
+ name: 'href',
605
+ value: path.join(pathname, dir)
606
+ }],
607
+ children: [dir]
608
+ }]
609
+ };
610
+ })
611
+ }).generateHtml();
612
+ res.end(fileContent);
613
+ case 2:
614
+ return _context2.a(2);
615
+ }
616
+ }, _callee2, this);
617
+ }));
618
+ function sendDir(_x3, _x4, _x5) {
619
+ return _sendDir.apply(this, arguments);
620
+ }
621
+ return sendDir;
622
+ }()
623
+ /**
624
+ * 发送文件
625
+ * @param {*} requestFile
626
+ * @param {*} reqCtx 请求上下文
627
+ * @returns
628
+ */
629
+ )
630
+ }, {
631
+ key: "sendFile",
632
+ value: function sendFile(requestFile, req, res, fsStat) {
633
+ // 看缓存
634
+ if (this.cacheFile(req, res, requestFile, fsStat)) {
635
+ res.statusCode = 304;
636
+ return res.end();
637
+ }
638
+ // 返回文件时,配置请求头
639
+ res.setHeader('Content-Type', getMimeType(requestFile) + ';charset=utf-8');
640
+ var createGzip;
641
+ if (createGzip = this.gzipFile(req, res)) {
642
+ return fs.createReadStream(requestFile).pipe(createGzip).pipe(res);
643
+ }
644
+ }
645
+ }, {
646
+ key: "cacheFile",
647
+ value: function cacheFile(req, res, requestFile, statObj) {
648
+ res.setHeader('Cache-Control', 'max-age=10000');
649
+ res.setHeader('Expires', new Date(Date.now() + 10 * 1000).toUTCString());
650
+ var lastMidfied = statObj.ctime.toUTCString();
651
+ var etag = crypto.createHash('md5').update(fs.readFileSync(requestFile)).digest('base64');
652
+ res.setHeader('Last-Modified', lastMidfied);
653
+ res.setHeader('Etag', etag);
654
+ var ifModifiedSince = req.headers['if-modified-since'];
655
+ var ifNoneMatch = req.headers['if-none-match'];
656
+ if (lastMidfied !== ifModifiedSince) {
657
+ // console.log("最后修改时间不同");
658
+ return false;
659
+ }
660
+ if (ifNoneMatch !== etag) {
661
+ // console.log("文件不同");
662
+ return false;
663
+ }
664
+ return true;
665
+ }
666
+
667
+ /**
668
+ * 文件压缩
669
+ * @param {*} req
670
+ * @param {*} res
671
+ * @returns
672
+ */
673
+ }, {
674
+ key: "gzipFile",
675
+ value: function gzipFile(req, res) {
676
+ var encodings = req.headers['accept-encoding'];
677
+ if (encodings) {
678
+ if (encodings.includes('gzip')) {
679
+ res.setHeader('Content-Encoding', 'gzip');
680
+ return zlib.createGzip();
681
+ } else if (encodings.includes('deflage')) {
682
+ res.setHeader('Content-Encoding', 'deflage');
683
+ return zlib.createDeflate();
684
+ }
685
+ }
686
+ return false;
687
+ }
159
688
  }]);
160
689
  }();
161
690
 
691
+ var fileServerMiddleware = function fileServerMiddleware(route, directory) {
692
+ var fileServer = new FileServer(directory, route);
693
+ return function (req, res, next) {
694
+ // 1. 判断是否是需要拦截的路径
695
+ var pathname = utils.uri.getPathStr(req.url) || '';
696
+ if (pathname.startsWith(route)) {
697
+ fileServer.handleRequest(req, res);
698
+ } else {
699
+ next();
700
+ }
701
+ };
702
+ };
703
+
162
704
  var loggerMiddleware = function loggerMiddleware(req, res, next) {
163
705
  helper.cLog.log('ser', 'request', "[".concat(req.method, "] ").concat(req.url));
164
706
  next();
165
707
  };
166
708
 
709
+ var proxyMiddleware = function proxyMiddleware(ctx) {
710
+ return function (req, res, next) {
711
+ var proxy = ctx.serverConfig.proxy;
712
+ var pathname = utils.uri.getPathStr(req.url) || '';
713
+ var findProxyPath = Object.keys(proxy || {}).find(function (key) {
714
+ return pathname.startsWith(key);
715
+ });
716
+ if (!findProxyPath) {
717
+ return next();
718
+ }
719
+ var _proxy$findProxyPath = proxy[findProxyPath],
720
+ router = _proxy$findProxyPath.router,
721
+ headers = _proxy$findProxyPath.headers,
722
+ pathRewrite = _proxy$findProxyPath.pathRewrite;
723
+ var routerStr = lang.isFunction(router) ? router() : router;
724
+
725
+ // 应用路径重写
726
+ var targetPath = pathname;
727
+ if (pathRewrite) {
728
+ for (var _i = 0, _Object$entries = Object.entries(pathRewrite); _i < _Object$entries.length; _i++) {
729
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
730
+ pattern = _Object$entries$_i[0],
731
+ replacement = _Object$entries$_i[1];
732
+ targetPath = targetPath.replace(new RegExp(pattern), replacement);
733
+ }
734
+ }
735
+ // 解析目标 URL
736
+ var targetUrl = new url.URL(targetPath, routerStr);
737
+ var requestFn = targetUrl.protocol === 'https:' ? https.request : http.request;
738
+ helper.cLog.log('ser', 'proxy', "".concat(pathname, " => ").concat(targetUrl));
739
+ var proxyReq = requestFn(targetUrl, {
740
+ method: req.method,
741
+ headers: _objectSpread2(_objectSpread2({}, req.headers), headers)
742
+ }, function (proxyRes) {
743
+ // 转发响应状态和头
744
+ res.writeHead(proxyRes.statusCode || 500, proxyRes.headers);
745
+ // 管道传输响应体
746
+ proxyRes.pipe(res);
747
+ });
748
+ proxyReq.on('error', function (err) {
749
+ helper.cLog.debug('ser', 'proxy', err);
750
+ res.status(500).json({
751
+ message: err.message,
752
+ code: err.code
753
+ });
754
+ });
755
+
756
+ // 管道传输请求体
757
+ req.pipe(proxyReq);
758
+ };
759
+ };
760
+
761
+ exports.express = express;
167
762
  exports.Ctx = Ctx;
168
763
  exports.RouteManager = RouteManager;
169
764
  exports.createServer = createServer;
765
+ exports.envParamsMw = envParamsMw;
766
+ exports.fileServerMiddleware = fileServerMiddleware;
170
767
  exports.loggerMiddleware = loggerMiddleware;
768
+ exports.proxyMiddleware = proxyMiddleware;
769
+ exports.serverCacheMw = serverCacheMw;
770
+ exports.serverPlainMw = serverPlainMw;
771
+ exports.serverScanMw = serverScanMw;