@modern-js/prod-server 2.4.1-beta.0 → 2.5.1-alpha.0

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 (125) hide show
  1. package/CHANGELOG.md +18 -3
  2. package/dist/cjs/constants.js +62 -0
  3. package/dist/cjs/index.js +44 -0
  4. package/dist/cjs/libs/context/context.js +189 -0
  5. package/dist/cjs/libs/context/index.js +30 -0
  6. package/dist/cjs/libs/hook-api/index.js +151 -0
  7. package/dist/cjs/libs/hook-api/route.js +43 -0
  8. package/dist/cjs/libs/hook-api/template.js +97 -0
  9. package/dist/cjs/libs/loadConfig.js +76 -0
  10. package/dist/cjs/libs/logger.js +122 -0
  11. package/dist/cjs/libs/metrics.js +34 -0
  12. package/dist/cjs/libs/proxy.js +81 -0
  13. package/dist/cjs/libs/render/cache/__tests__/cache.fun.test.js +93 -0
  14. package/dist/cjs/libs/render/cache/__tests__/cache.test.js +210 -0
  15. package/dist/cjs/libs/render/cache/__tests__/cacheable.js +70 -0
  16. package/dist/cjs/libs/render/cache/__tests__/error-configuration.js +60 -0
  17. package/dist/cjs/libs/render/cache/__tests__/matched-cache.js +114 -0
  18. package/dist/cjs/libs/render/cache/index.js +97 -0
  19. package/dist/cjs/libs/render/cache/page-caches/index.js +33 -0
  20. package/dist/cjs/libs/render/cache/page-caches/lru.js +58 -0
  21. package/dist/cjs/libs/render/cache/spr.js +242 -0
  22. package/dist/cjs/libs/render/cache/type.js +15 -0
  23. package/dist/cjs/libs/render/cache/util.js +116 -0
  24. package/dist/cjs/libs/render/index.js +93 -0
  25. package/dist/cjs/libs/render/measure.js +75 -0
  26. package/dist/cjs/libs/render/reader.js +118 -0
  27. package/dist/cjs/libs/render/ssr.js +103 -0
  28. package/dist/cjs/libs/render/static.js +67 -0
  29. package/dist/cjs/libs/render/type.js +32 -0
  30. package/dist/cjs/libs/route/index.js +78 -0
  31. package/dist/cjs/libs/route/matcher.js +106 -0
  32. package/dist/cjs/libs/route/route.js +39 -0
  33. package/dist/cjs/libs/serve-file.js +77 -0
  34. package/dist/cjs/server/index.js +169 -0
  35. package/dist/cjs/server/modern-server-split.js +66 -0
  36. package/dist/cjs/server/modern-server.js +491 -0
  37. package/dist/cjs/type.js +15 -0
  38. package/dist/cjs/utils.js +152 -0
  39. package/dist/cjs/worker-server.js +93 -0
  40. package/dist/esm/constants.js +29 -0
  41. package/dist/esm/index.js +13 -0
  42. package/dist/esm/libs/context/context.js +274 -0
  43. package/dist/esm/libs/context/index.js +5 -0
  44. package/dist/esm/libs/hook-api/index.js +281 -0
  45. package/dist/esm/libs/hook-api/route.js +68 -0
  46. package/dist/esm/libs/hook-api/template.js +127 -0
  47. package/dist/esm/libs/loadConfig.js +82 -0
  48. package/dist/esm/libs/logger.js +205 -0
  49. package/dist/esm/libs/metrics.js +6 -0
  50. package/dist/esm/libs/proxy.js +244 -0
  51. package/dist/esm/libs/render/cache/__tests__/cache.fun.test.js +291 -0
  52. package/dist/esm/libs/render/cache/__tests__/cache.test.js +781 -0
  53. package/dist/esm/libs/render/cache/__tests__/cacheable.js +67 -0
  54. package/dist/esm/libs/render/cache/__tests__/error-configuration.js +45 -0
  55. package/dist/esm/libs/render/cache/__tests__/matched-cache.js +147 -0
  56. package/dist/esm/libs/render/cache/index.js +346 -0
  57. package/dist/esm/libs/render/cache/page-caches/index.js +154 -0
  58. package/dist/esm/libs/render/cache/page-caches/lru.js +84 -0
  59. package/dist/esm/libs/render/cache/spr.js +492 -0
  60. package/dist/esm/libs/render/cache/type.js +1 -0
  61. package/dist/esm/libs/render/cache/util.js +280 -0
  62. package/dist/esm/libs/render/index.js +234 -0
  63. package/dist/esm/libs/render/measure.js +146 -0
  64. package/dist/esm/libs/render/reader.js +339 -0
  65. package/dist/esm/libs/render/ssr.js +223 -0
  66. package/dist/esm/libs/render/static.js +216 -0
  67. package/dist/esm/libs/render/type.js +7 -0
  68. package/dist/esm/libs/route/index.js +130 -0
  69. package/dist/esm/libs/route/matcher.js +143 -0
  70. package/dist/esm/libs/route/route.js +40 -0
  71. package/dist/esm/libs/serve-file.js +184 -0
  72. package/dist/esm/server/index.js +505 -0
  73. package/dist/esm/server/modern-server-split.js +360 -0
  74. package/dist/esm/server/modern-server.js +1090 -0
  75. package/dist/esm/type.js +1 -0
  76. package/dist/esm/utils.js +147 -0
  77. package/dist/esm/worker-server.js +233 -0
  78. package/dist/esm-node/constants.js +35 -0
  79. package/dist/esm-node/index.js +18 -0
  80. package/dist/esm-node/libs/context/context.js +160 -0
  81. package/dist/esm-node/libs/context/index.js +6 -0
  82. package/dist/esm-node/libs/hook-api/index.js +119 -0
  83. package/dist/esm-node/libs/hook-api/route.js +20 -0
  84. package/dist/esm-node/libs/hook-api/template.js +73 -0
  85. package/dist/esm-node/libs/loadConfig.js +45 -0
  86. package/dist/esm-node/libs/logger.js +98 -0
  87. package/dist/esm-node/libs/metrics.js +11 -0
  88. package/dist/esm-node/libs/proxy.js +57 -0
  89. package/dist/esm-node/libs/render/cache/__tests__/cache.fun.test.js +83 -0
  90. package/dist/esm-node/libs/render/cache/__tests__/cache.test.js +210 -0
  91. package/dist/esm-node/libs/render/cache/__tests__/cacheable.js +47 -0
  92. package/dist/esm-node/libs/render/cache/__tests__/error-configuration.js +37 -0
  93. package/dist/esm-node/libs/render/cache/__tests__/matched-cache.js +91 -0
  94. package/dist/esm-node/libs/render/cache/index.js +76 -0
  95. package/dist/esm-node/libs/render/cache/page-caches/index.js +10 -0
  96. package/dist/esm-node/libs/render/cache/page-caches/lru.js +29 -0
  97. package/dist/esm-node/libs/render/cache/spr.js +220 -0
  98. package/dist/esm-node/libs/render/cache/type.js +0 -0
  99. package/dist/esm-node/libs/render/cache/util.js +80 -0
  100. package/dist/esm-node/libs/render/index.js +64 -0
  101. package/dist/esm-node/libs/render/measure.js +51 -0
  102. package/dist/esm-node/libs/render/reader.js +85 -0
  103. package/dist/esm-node/libs/render/ssr.js +80 -0
  104. package/dist/esm-node/libs/render/static.js +38 -0
  105. package/dist/esm-node/libs/render/type.js +9 -0
  106. package/dist/esm-node/libs/route/index.js +54 -0
  107. package/dist/esm-node/libs/route/matcher.js +87 -0
  108. package/dist/esm-node/libs/route/route.js +16 -0
  109. package/dist/esm-node/libs/serve-file.js +47 -0
  110. package/dist/esm-node/server/index.js +156 -0
  111. package/dist/esm-node/server/modern-server-split.js +43 -0
  112. package/dist/esm-node/server/modern-server.js +484 -0
  113. package/dist/esm-node/type.js +0 -0
  114. package/dist/esm-node/utils.js +120 -0
  115. package/dist/esm-node/worker-server.js +69 -0
  116. package/dist/js/modern/libs/render/index.js +4 -2
  117. package/dist/js/modern/server/modern-server.js +14 -8
  118. package/dist/js/node/libs/render/index.js +4 -2
  119. package/dist/js/node/server/modern-server.js +14 -8
  120. package/dist/js/treeshaking/libs/render/index.js +4 -3
  121. package/dist/js/treeshaking/server/modern-server.js +14 -8
  122. package/dist/types/libs/context/context.d.ts +1 -1
  123. package/dist/types/libs/render/index.d.ts +3 -1
  124. package/dist/types/utils.d.ts +1 -1
  125. package/package.json +17 -18
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,147 @@
1
+ function _arrayLikeToArray(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _arrayWithoutHoles(arr) {
7
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
8
+ }
9
+ function _defineProperty(obj, key, value) {
10
+ if (key in obj) {
11
+ Object.defineProperty(obj, key, {
12
+ value: value,
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true
16
+ });
17
+ } else {
18
+ obj[key] = value;
19
+ }
20
+ return obj;
21
+ }
22
+ function _iterableToArray(iter) {
23
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
24
+ }
25
+ function _nonIterableSpread() {
26
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
27
+ }
28
+ function _objectSpread(target) {
29
+ for(var i = 1; i < arguments.length; i++){
30
+ var source = arguments[i] != null ? arguments[i] : {};
31
+ var ownKeys = Object.keys(source);
32
+ if (typeof Object.getOwnPropertySymbols === "function") {
33
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
34
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
35
+ }));
36
+ }
37
+ ownKeys.forEach(function(key) {
38
+ _defineProperty(target, key, source[key]);
39
+ });
40
+ }
41
+ return target;
42
+ }
43
+ function _toConsumableArray(arr) {
44
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
45
+ }
46
+ function _unsupportedIterableToArray(o, minLen) {
47
+ if (!o) return;
48
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
49
+ var n = Object.prototype.toString.call(o).slice(8, -1);
50
+ if (n === "Object" && o.constructor) n = o.constructor.name;
51
+ if (n === "Map" || n === "Set") return Array.from(n);
52
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
53
+ }
54
+ import { createDebugger, isProd } from "@modern-js/utils";
55
+ var debug = createDebugger("prod-server");
56
+ var mergeExtension = function(users) {
57
+ var output = [];
58
+ return {
59
+ middleware: output.concat(users)
60
+ };
61
+ };
62
+ var noop = function() {};
63
+ var createErrorDocument = function(status, text) {
64
+ var title = "".concat(status, ": ").concat(text);
65
+ return '<!DOCTYPE html>\n <html lang="en">\n <head>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width">\n <title>'.concat(title, '</title>\n <style>\n html,body {\n margin: 0;\n }\n\n .page-container {\n color: #000;\n background: #fff;\n height: 100vh;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n </style>\n </head>\n <body>\n <div class="page-container">\n <h1>').concat(status, "</h1>\n <div>").concat(text, "</div>\n </body>\n </html>\n ");
66
+ };
67
+ var createMiddlewareCollecter = function() {
68
+ var webMiddlewares = [];
69
+ var apiMiddlewares = [];
70
+ var addWebMiddleware = function(input) {
71
+ webMiddlewares.push(input);
72
+ };
73
+ var addAPIMiddleware = function(input) {
74
+ apiMiddlewares.push(input);
75
+ };
76
+ var getMiddlewares = function() {
77
+ return {
78
+ web: webMiddlewares,
79
+ api: apiMiddlewares
80
+ };
81
+ };
82
+ return {
83
+ getMiddlewares: getMiddlewares,
84
+ addWebMiddleware: addWebMiddleware,
85
+ addAPIMiddleware: addAPIMiddleware
86
+ };
87
+ };
88
+ var useLocalPrefix = function(url) {
89
+ return isProd() && !url.includes(".");
90
+ };
91
+ var getStaticReg = function() {
92
+ var output = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, html = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
93
+ var tmp = output.distPath, _ref = tmp === void 0 ? {} : tmp, cssPath = _ref.css, jsPath = _ref.js, mediaPath = _ref.media, _output_assetPrefix = output.assetPrefix, assetPrefix = _output_assetPrefix === void 0 ? "/" : _output_assetPrefix;
94
+ var favicon = html.favicon, faviconByEntries = html.faviconByEntries;
95
+ var prefix = useLocalPrefix(assetPrefix) ? assetPrefix : "";
96
+ var favicons = prepareFavicons(favicon, faviconByEntries);
97
+ var staticFiles = [
98
+ cssPath,
99
+ jsPath,
100
+ mediaPath
101
+ ].filter(function(v) {
102
+ return Boolean(v);
103
+ });
104
+ var staticReg = [
105
+ "static/",
106
+ "upload/"
107
+ ].concat(_toConsumableArray(staticFiles));
108
+ var iconReg = [
109
+ "favicon.ico",
110
+ "icon.png"
111
+ ].concat(_toConsumableArray(favicons));
112
+ var regPrefix = prefix.endsWith("/") ? prefix : "".concat(prefix, "/");
113
+ var staticPathRegExp = new RegExp("^".concat(regPrefix, "(").concat(_toConsumableArray(staticReg).concat(_toConsumableArray(iconReg)).join("|"), ")"));
114
+ return staticPathRegExp;
115
+ };
116
+ var prepareFavicons = function(favicon, faviconByEntries) {
117
+ var faviconNames = [];
118
+ if (favicon) {
119
+ faviconNames.push(favicon.substring(favicon.lastIndexOf("/") + 1));
120
+ }
121
+ if (faviconByEntries) {
122
+ Object.keys(faviconByEntries).forEach(function(f) {
123
+ var curFavicon = faviconByEntries[f];
124
+ if (curFavicon) {
125
+ faviconNames.push(curFavicon.substring(curFavicon.lastIndexOf("/") + 1));
126
+ }
127
+ });
128
+ }
129
+ return faviconNames;
130
+ };
131
+ var headersWithoutCookie = function(headers) {
132
+ if (typeof headers.cookie !== "undefined") {
133
+ var safeHeaders = _objectSpread({}, headers);
134
+ delete safeHeaders.cookie;
135
+ return safeHeaders;
136
+ }
137
+ return headers;
138
+ };
139
+ var isRedirect = function(code) {
140
+ return [
141
+ 301,
142
+ 302,
143
+ 307,
144
+ 308
145
+ ].includes(code);
146
+ };
147
+ export { createErrorDocument, createMiddlewareCollecter, debug, getStaticReg, headersWithoutCookie, isRedirect, mergeExtension, noop, prepareFavicons, useLocalPrefix };
@@ -0,0 +1,233 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _asyncToGenerator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ var __generator = this && this.__generator || function(thisArg, body) {
31
+ var f, y, t, g, _ = {
32
+ label: 0,
33
+ sent: function() {
34
+ if (t[0] & 1) throw t[1];
35
+ return t[1];
36
+ },
37
+ trys: [],
38
+ ops: []
39
+ };
40
+ return(g = {
41
+ next: verb(0),
42
+ "throw": verb(1),
43
+ "return": verb(2)
44
+ }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
45
+ return this;
46
+ }), g);
47
+ function verb(n) {
48
+ return function(v) {
49
+ return step([
50
+ n,
51
+ v
52
+ ]);
53
+ };
54
+ }
55
+ function step(op) {
56
+ if (f) throw new TypeError("Generator is already executing.");
57
+ while(_)try {
58
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
59
+ if (y = 0, t) op = [
60
+ op[0] & 2,
61
+ t.value
62
+ ];
63
+ switch(op[0]){
64
+ case 0:
65
+ case 1:
66
+ t = op;
67
+ break;
68
+ case 4:
69
+ _.label++;
70
+ return {
71
+ value: op[1],
72
+ done: false
73
+ };
74
+ case 5:
75
+ _.label++;
76
+ y = op[1];
77
+ op = [
78
+ 0
79
+ ];
80
+ continue;
81
+ case 7:
82
+ op = _.ops.pop();
83
+ _.trys.pop();
84
+ continue;
85
+ default:
86
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
87
+ _ = 0;
88
+ continue;
89
+ }
90
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
91
+ _.label = op[1];
92
+ break;
93
+ }
94
+ if (op[0] === 6 && _.label < t[1]) {
95
+ _.label = t[1];
96
+ t = op;
97
+ break;
98
+ }
99
+ if (t && _.label < t[2]) {
100
+ _.label = t[2];
101
+ _.ops.push(op);
102
+ break;
103
+ }
104
+ if (t[2]) _.ops.pop();
105
+ _.trys.pop();
106
+ continue;
107
+ }
108
+ op = body.call(thisArg, _);
109
+ } catch (e) {
110
+ op = [
111
+ 6,
112
+ e
113
+ ];
114
+ y = 0;
115
+ } finally{
116
+ f = t = 0;
117
+ }
118
+ if (op[0] & 5) throw op[1];
119
+ return {
120
+ value: op[0] ? op[1] : void 0,
121
+ done: true
122
+ };
123
+ }
124
+ };
125
+ var _ctx_request, _ctx_request1, _ctx_request2;
126
+ import { Logger } from "./libs/logger";
127
+ import { RouteMatchManager } from "./libs/route";
128
+ import { metrics as defaultMetrics } from "./libs/metrics";
129
+ var handleUrl = function(url) {
130
+ return url.replace(/^https?:\/\/.*?\//gi, "/");
131
+ };
132
+ var createHandler = function(manifest) {
133
+ var routeMgr = new RouteMatchManager();
134
+ var pages = manifest.pages, routes = manifest.routes;
135
+ routeMgr.reset(routes);
136
+ return function() {
137
+ var _ref = _asyncToGenerator(function(ctx) {
138
+ var pageMatch, page, _query, _pathname, _params, params, e;
139
+ return __generator(this, function(_state) {
140
+ switch(_state.label){
141
+ case 0:
142
+ pageMatch = routeMgr.match(ctx.url);
143
+ if (!pageMatch) {
144
+ ctx.body = "404: Page not found";
145
+ ctx.status = 404;
146
+ return [
147
+ 2
148
+ ];
149
+ }
150
+ page = pages[pageMatch.spec.urlPath];
151
+ (_query = (_ctx_request = ctx.request).query) !== null && _query !== void 0 ? _query : _ctx_request.query = ctx.query;
152
+ (_pathname = (_ctx_request1 = ctx.request).pathname) !== null && _pathname !== void 0 ? _pathname : _ctx_request1.pathname = ctx.pathname;
153
+ (_params = (_ctx_request2 = ctx.request).params) !== null && _params !== void 0 ? _params : _ctx_request2.params = ctx.params;
154
+ params = pageMatch.parseURLParams(ctx.url);
155
+ if (!page.serverRender) return [
156
+ 3,
157
+ 4
158
+ ];
159
+ _state.label = 1;
160
+ case 1:
161
+ _state.trys.push([
162
+ 1,
163
+ 3,
164
+ ,
165
+ 4
166
+ ]);
167
+ return [
168
+ 4,
169
+ page.serverRender({
170
+ entryName: page.entryName,
171
+ template: page.template,
172
+ query: ctx.query,
173
+ request: ctx.request,
174
+ response: ctx.response,
175
+ pathname: ctx.pathname,
176
+ req: ctx.request,
177
+ res: ctx.response,
178
+ params: ctx.params || params || {},
179
+ logger: ctx.logger || new Logger({
180
+ level: "warn"
181
+ }),
182
+ metrics: ctx.metrics || defaultMetrics,
183
+ loadableStats: ctx.loadableStats,
184
+ routeManifest: ctx.routeManifest
185
+ })
186
+ ];
187
+ case 2:
188
+ ctx.body = _state.sent();
189
+ ctx.status = 200;
190
+ return [
191
+ 2
192
+ ];
193
+ case 3:
194
+ e = _state.sent();
195
+ if (page.template) {
196
+ ctx.body = page.template;
197
+ ctx.status = 200;
198
+ return [
199
+ 2
200
+ ];
201
+ } else {
202
+ ctx.body = "404: not found";
203
+ ctx.status = 404;
204
+ return [
205
+ 2
206
+ ];
207
+ }
208
+ return [
209
+ 3,
210
+ 4
211
+ ];
212
+ case 4:
213
+ if (page.template) {
214
+ ctx.body = page.template;
215
+ ctx.status = 200;
216
+ return [
217
+ 2
218
+ ];
219
+ }
220
+ ctx.body = "404: not found";
221
+ ctx.status = 404;
222
+ return [
223
+ 2
224
+ ];
225
+ }
226
+ });
227
+ });
228
+ return function(ctx) {
229
+ return _ref.apply(this, arguments);
230
+ };
231
+ }();
232
+ };
233
+ export { createHandler, handleUrl };
@@ -0,0 +1,35 @@
1
+ const AGGRED_DIR = {
2
+ mock: "config/mock",
3
+ server: "server",
4
+ api: "api",
5
+ shared: "shared",
6
+ lambda: "lambda"
7
+ };
8
+ var ApiServerMode = /* @__PURE__ */ ((ApiServerMode2) => {
9
+ ApiServerMode2["func"] = "function";
10
+ ApiServerMode2["frame"] = "framework";
11
+ return ApiServerMode2;
12
+ })(ApiServerMode || {});
13
+ const ERROR_DIGEST = {
14
+ INIT: "Server init error",
15
+ ENOTF: "Page could not be found",
16
+ WARMUP: "SSR warmup failed",
17
+ EINTER: "Internal server error",
18
+ ERENDER: "SSR render failed",
19
+ EMICROINJ: "Get micro-frontend info failed"
20
+ };
21
+ const ERROR_PAGE_TEXT = {
22
+ 404: "This page could not be found.",
23
+ 500: "Internal Server Error."
24
+ };
25
+ const RUN_MODE = {
26
+ FULL: "full",
27
+ TYPE: "type"
28
+ };
29
+ export {
30
+ AGGRED_DIR,
31
+ ApiServerMode,
32
+ ERROR_DIGEST,
33
+ ERROR_PAGE_TEXT,
34
+ RUN_MODE
35
+ };
@@ -0,0 +1,18 @@
1
+ import { Server } from "./server";
2
+ import { ModernServer } from "./server/modern-server";
3
+ import { createProxyHandler } from "./libs/proxy";
4
+ export * from "./type";
5
+ export * from "./constants";
6
+ var src_default = (options) => {
7
+ if (options == null) {
8
+ throw new Error("can not start mserver without options");
9
+ }
10
+ const server = new Server(options);
11
+ return server.init();
12
+ };
13
+ export {
14
+ ModernServer,
15
+ Server,
16
+ createProxyHandler,
17
+ src_default as default
18
+ };
@@ -0,0 +1,160 @@
1
+ import { URL } from "url";
2
+ import qs from "querystring";
3
+ import { Buffer } from "buffer";
4
+ import createEtag from "etag";
5
+ import fresh from "fresh";
6
+ import { headersWithoutCookie } from "../../utils";
7
+ class ModernServerContext {
8
+ constructor(req, res, options) {
9
+ this.params = {};
10
+ this.options = {};
11
+ this.req = req;
12
+ this.res = res;
13
+ this.options = options || {};
14
+ this.serverData = {};
15
+ this.bind();
16
+ }
17
+ get logger() {
18
+ return this.req.logger;
19
+ }
20
+ get metrics() {
21
+ return this.req.metrics;
22
+ }
23
+ bind() {
24
+ const { req, res } = this;
25
+ req.get = (key) => this.getReqHeader(key);
26
+ res.set = (key, value) => this.res.setHeader(key, value);
27
+ res.send = (body) => {
28
+ this.send(body);
29
+ };
30
+ }
31
+ send(body) {
32
+ try {
33
+ const generateETag = !this.res.getHeader("ETag") && this.options.etag;
34
+ if (body !== void 0 && generateETag) {
35
+ const encoding = typeof body === "string" ? "utf-8" : void 0;
36
+ const buf = !Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body;
37
+ const etag = createEtag(buf, { weak: true });
38
+ if (etag) {
39
+ this.res.setHeader("ETag", etag);
40
+ }
41
+ }
42
+ if (this.fresh) {
43
+ this.status = 304;
44
+ }
45
+ } catch (e) {
46
+ this.logger.error(e.message);
47
+ }
48
+ this.res.end(body);
49
+ }
50
+ setParams(params) {
51
+ this.params = params;
52
+ }
53
+ setServerData(key, value) {
54
+ this.serverData[key] = value;
55
+ }
56
+ getReqHeader(key) {
57
+ const { req } = this;
58
+ const field = key.toLowerCase();
59
+ switch (field) {
60
+ case "referer":
61
+ case "referrer":
62
+ return req.headers.referrer || req.headers.referer || "";
63
+ default:
64
+ return req.headers[field] || "";
65
+ }
66
+ }
67
+ get fresh() {
68
+ const { status, res, method } = this;
69
+ if ("GET" !== method && "HEAD" !== method) {
70
+ return false;
71
+ }
72
+ if (status >= 200 && status < 300 || 304 === status) {
73
+ return fresh(this.headers, {
74
+ etag: res.getHeader("ETag"),
75
+ "last-modified": res.getHeader("Last-Modified")
76
+ });
77
+ }
78
+ return false;
79
+ }
80
+ get headers() {
81
+ return this.req.headers;
82
+ }
83
+ get method() {
84
+ return this.req.method;
85
+ }
86
+ get url() {
87
+ return this.req.url || "";
88
+ }
89
+ set url(val) {
90
+ this.req.url = val;
91
+ }
92
+ get host() {
93
+ let host = this.getReqHeader("X-Forwarded-Host");
94
+ if (!host) {
95
+ host = this.getReqHeader("Host");
96
+ }
97
+ return host.split(/\s*,\s*/, 1)[0] || "";
98
+ }
99
+ get protocol() {
100
+ if (this.req.socket.encrypted) {
101
+ return "https";
102
+ }
103
+ const proto = this.getReqHeader("X-Forwarded-Proto");
104
+ return proto ? proto.split(/\s*,\s*/, 1)[0] : "http";
105
+ }
106
+ get origin() {
107
+ return `${this.protocol}://${this.host}`;
108
+ }
109
+ get href() {
110
+ return this.origin + this.url;
111
+ }
112
+ get parsedURL() {
113
+ const url = new URL(this.req.url, this.origin);
114
+ return url;
115
+ }
116
+ get path() {
117
+ return this.parsedURL.pathname;
118
+ }
119
+ set path(p) {
120
+ const url = new URL(this.req.url, this.origin);
121
+ if (!url || !p) {
122
+ return;
123
+ }
124
+ if (url.pathname === p) {
125
+ return;
126
+ }
127
+ url.pathname = p;
128
+ this.url = url.toString();
129
+ }
130
+ get querystring() {
131
+ if (!this.req) {
132
+ return "";
133
+ }
134
+ return this.parsedURL.search.replace(/^\?/, "") || "";
135
+ }
136
+ get query() {
137
+ const str = this.querystring;
138
+ return qs.parse(str);
139
+ }
140
+ get status() {
141
+ return this.res.statusCode;
142
+ }
143
+ set status(statusCode) {
144
+ this.res.statusCode = statusCode;
145
+ }
146
+ resHasHandled() {
147
+ return this.res.writableEnded;
148
+ }
149
+ error(dig, e = "") {
150
+ this.logger.error(
151
+ `Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`,
152
+ e instanceof Error ? e.stack || e.message : e,
153
+ this.path,
154
+ headersWithoutCookie(this.headers)
155
+ );
156
+ }
157
+ }
158
+ export {
159
+ ModernServerContext
160
+ };
@@ -0,0 +1,6 @@
1
+ import { ModernServerContext } from "./context";
2
+ const createContext = (req, res, options) => new ModernServerContext(req, res, options);
3
+ export {
4
+ ModernServerContext,
5
+ createContext
6
+ };