@modern-js/prod-server 2.48.0 → 2.48.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 (47) hide show
  1. package/dist/cjs/libs/context/context.js +4 -8
  2. package/dist/cjs/libs/hook-api/base.js +0 -11
  3. package/dist/cjs/libs/hook-api/index.worker.js +0 -3
  4. package/dist/cjs/libs/hook-api/route.js +0 -4
  5. package/dist/cjs/libs/hook-api/template.js +0 -2
  6. package/dist/cjs/libs/render/ssrCache/cacheMod.js +0 -5
  7. package/dist/cjs/libs/render/ssrCache/manager.js +2 -3
  8. package/dist/cjs/libs/route/index.js +1 -3
  9. package/dist/cjs/libs/route/matcher.js +1 -5
  10. package/dist/cjs/libs/route/route.js +1 -10
  11. package/dist/cjs/libs/serverTiming.js +0 -3
  12. package/dist/cjs/renderHtml.js +0 -7
  13. package/dist/cjs/server/index.js +1 -7
  14. package/dist/cjs/server/modernServer.js +4 -20
  15. package/dist/cjs/workerServer.js +4 -8
  16. package/dist/esm/libs/context/context.js +66 -98
  17. package/dist/esm/libs/hook-api/base.js +36 -71
  18. package/dist/esm/libs/hook-api/index.worker.js +15 -29
  19. package/dist/esm/libs/hook-api/route.js +12 -27
  20. package/dist/esm/libs/hook-api/template.js +33 -61
  21. package/dist/esm/libs/render/ssrCache/cacheMod.js +10 -18
  22. package/dist/esm/libs/render/ssrCache/manager.js +145 -157
  23. package/dist/esm/libs/route/index.js +62 -96
  24. package/dist/esm/libs/route/matcher.js +58 -94
  25. package/dist/esm/libs/route/route.js +1 -10
  26. package/dist/esm/libs/serverTiming.js +8 -16
  27. package/dist/esm/renderHtml.js +22 -39
  28. package/dist/esm/server/index.js +307 -383
  29. package/dist/esm/server/modernServer.js +802 -942
  30. package/dist/esm/server/modernServerSplit.js +61 -86
  31. package/dist/esm/workerServer.js +87 -82
  32. package/dist/esm-node/libs/context/context.js +4 -8
  33. package/dist/esm-node/libs/hook-api/base.js +0 -11
  34. package/dist/esm-node/libs/hook-api/index.worker.js +0 -3
  35. package/dist/esm-node/libs/hook-api/route.js +0 -4
  36. package/dist/esm-node/libs/hook-api/template.js +0 -2
  37. package/dist/esm-node/libs/render/ssrCache/cacheMod.js +0 -5
  38. package/dist/esm-node/libs/render/ssrCache/manager.js +2 -3
  39. package/dist/esm-node/libs/route/index.js +1 -3
  40. package/dist/esm-node/libs/route/matcher.js +1 -5
  41. package/dist/esm-node/libs/route/route.js +1 -10
  42. package/dist/esm-node/libs/serverTiming.js +0 -3
  43. package/dist/esm-node/renderHtml.js +0 -7
  44. package/dist/esm-node/server/index.js +1 -7
  45. package/dist/esm-node/server/modernServer.js +4 -20
  46. package/dist/esm-node/workerServer.js +4 -8
  47. package/package.json +8 -8
@@ -1,7 +1,5 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
3
- import { _ as _create_class } from "@swc/helpers/_/_create_class";
4
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
5
3
  import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
6
4
  import { _ as _object_without_properties } from "@swc/helpers/_/_object_without_properties";
7
5
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
@@ -24,25 +22,10 @@ var ModernServer = /* @__PURE__ */ function() {
24
22
  function ModernServer2(param) {
25
23
  var pwd = param.pwd, config = param.config, routes = param.routes, staticGenerate = param.staticGenerate, logger = param.logger, metrics = param.metrics, runMode = param.runMode, proxyTarget = param.proxyTarget, appContext = param.appContext;
26
24
  _class_call_check(this, ModernServer2);
27
- _define_property(this, "pwd", void 0);
28
- _define_property(this, "distDir", void 0);
29
- _define_property(this, "workDir", void 0);
30
- _define_property(this, "router", void 0);
31
- _define_property(this, "conf", void 0);
32
- _define_property(this, "handlers", []);
33
- _define_property(this, "presetRoutes", void 0);
34
- _define_property(this, "runner", void 0);
35
- _define_property(this, "logger", void 0);
36
- _define_property(this, "metrics", void 0);
37
- _define_property(this, "runMode", void 0);
38
- _define_property(this, "proxyTarget", void 0);
39
- _define_property(this, "routeRenderHandler", void 0);
40
- _define_property(this, "staticGenerate", void 0);
41
- _define_property(this, "metaName", void 0);
42
- _define_property(this, "loaderHandler", null);
43
- _define_property(this, "frameWebHandler", null);
44
- _define_property(this, "frameAPIHandler", null);
45
- _define_property(this, "_handler", void 0);
25
+ this.handlers = [];
26
+ this.loaderHandler = null;
27
+ this.frameWebHandler = null;
28
+ this.frameAPIHandler = null;
46
29
  require("ignore-styles");
47
30
  this.pwd = pwd;
48
31
  this.distDir = path.resolve(pwd, config.output.path || "dist");
@@ -58,965 +41,842 @@ var ModernServer = /* @__PURE__ */ function() {
58
41
  this.runMode = runMode || RUN_MODE.FULL;
59
42
  this.metaName = appContext === null || appContext === void 0 ? void 0 : appContext.metaName;
60
43
  }
61
- _create_class(ModernServer2, [
62
- {
63
- key: "onInit",
64
- value: (
65
- // server prepare
66
- function onInit(runner, app) {
67
- var _this = this;
68
- return _async_to_generator(function() {
69
- var _conf_bff, _this_conf_output, distDir, conf, _createProxyHandler, handlers, handleUpgrade, usageRoutes;
70
- return _ts_generator(this, function(_state) {
71
- switch (_state.label) {
72
- case 0:
73
- _this.runner = runner;
74
- distDir = _this.distDir, conf = _this.conf;
75
- debug("final server conf", _this.conf);
76
- if ((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy) {
77
- _createProxyHandler = createProxyHandler(conf.bff.proxy), handlers = _createProxyHandler.handlers, handleUpgrade = _createProxyHandler.handleUpgrade;
78
- app && handleUpgrade(app);
79
- handlers.forEach(function(handler) {
80
- _this.addHandler(handler);
81
- });
82
- }
83
- usageRoutes = _this.filterRoutes(_this.getRoutes());
84
- _this.router.reset(usageRoutes);
85
- _this.warmupSSRBundle();
86
- cacheMod.loadServerCacheMod(isProd() ? distDir : _this.pwd);
87
- return [
88
- 4,
89
- _this.prepareFrameHandler()
90
- ];
91
- case 1:
92
- _state.sent();
93
- return [
94
- 4,
95
- _this.prepareLoaderHandler(usageRoutes, distDir)
96
- ];
97
- case 2:
98
- _state.sent();
99
- _this.routeRenderHandler = _this.getRenderHandler();
100
- return [
101
- 4,
102
- _this.setupBeforeProdMiddleware()
103
- ];
104
- case 3:
105
- _state.sent();
106
- _this.addHandler(_this.setupStaticMiddleware((_this_conf_output = _this.conf.output) === null || _this_conf_output === void 0 ? void 0 : _this_conf_output.assetPrefix));
107
- _this.addHandler(faviconFallbackHandler);
108
- _this.addHandler(_this.routeHandler.bind(_this));
109
- _this.compose();
110
- return [
111
- 2
112
- ];
113
- }
114
- });
115
- })();
44
+ var _proto = ModernServer2.prototype;
45
+ _proto.onInit = function onInit(runner, app) {
46
+ var _this = this;
47
+ return _async_to_generator(function() {
48
+ var _conf_bff, _this_conf_output, distDir, conf, _createProxyHandler, handlers, handleUpgrade, usageRoutes;
49
+ return _ts_generator(this, function(_state) {
50
+ switch (_state.label) {
51
+ case 0:
52
+ _this.runner = runner;
53
+ distDir = _this.distDir, conf = _this.conf;
54
+ debug("final server conf", _this.conf);
55
+ if ((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy) {
56
+ _createProxyHandler = createProxyHandler(conf.bff.proxy), handlers = _createProxyHandler.handlers, handleUpgrade = _createProxyHandler.handleUpgrade;
57
+ app && handleUpgrade(app);
58
+ handlers.forEach(function(handler) {
59
+ _this.addHandler(handler);
60
+ });
61
+ }
62
+ usageRoutes = _this.filterRoutes(_this.getRoutes());
63
+ _this.router.reset(usageRoutes);
64
+ _this.warmupSSRBundle();
65
+ cacheMod.loadServerCacheMod(isProd() ? distDir : _this.pwd);
66
+ return [
67
+ 4,
68
+ _this.prepareFrameHandler()
69
+ ];
70
+ case 1:
71
+ _state.sent();
72
+ return [
73
+ 4,
74
+ _this.prepareLoaderHandler(usageRoutes, distDir)
75
+ ];
76
+ case 2:
77
+ _state.sent();
78
+ _this.routeRenderHandler = _this.getRenderHandler();
79
+ return [
80
+ 4,
81
+ _this.setupBeforeProdMiddleware()
82
+ ];
83
+ case 3:
84
+ _state.sent();
85
+ _this.addHandler(_this.setupStaticMiddleware((_this_conf_output = _this.conf.output) === null || _this_conf_output === void 0 ? void 0 : _this_conf_output.assetPrefix));
86
+ _this.addHandler(faviconFallbackHandler);
87
+ _this.addHandler(_this.routeHandler.bind(_this));
88
+ _this.compose();
89
+ return [
90
+ 2
91
+ ];
116
92
  }
117
- )
118
- },
119
- {
120
- key: "getRenderHandler",
121
- value: function getRenderHandler() {
122
- var _this_conf_server, _conf_security;
123
- var _this = this, distDir = _this.distDir, staticGenerate = _this.staticGenerate, conf = _this.conf, metaName = _this.metaName;
124
- var ssrConfig = (_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.ssr;
125
- var forceCSR = typeof ssrConfig === "object" ? ssrConfig.forceCSR : false;
126
- return createRenderHandler({
127
- distDir,
128
- staticGenerate,
129
- forceCSR,
130
- conf: this.conf,
131
- nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce,
132
- metaName
133
- });
134
- }
135
- },
136
- {
137
- key: "onRepack",
138
- value: (
139
- // server ready
140
- function onRepack(_) {
93
+ });
94
+ })();
95
+ };
96
+ _proto.getRenderHandler = function getRenderHandler() {
97
+ var _this_conf_server, _conf_security;
98
+ var _this = this, distDir = _this.distDir, staticGenerate = _this.staticGenerate, conf = _this.conf, metaName = _this.metaName;
99
+ var ssrConfig = (_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.ssr;
100
+ var forceCSR = typeof ssrConfig === "object" ? ssrConfig.forceCSR : false;
101
+ return createRenderHandler({
102
+ distDir,
103
+ staticGenerate,
104
+ forceCSR,
105
+ conf: this.conf,
106
+ nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce,
107
+ metaName
108
+ });
109
+ };
110
+ _proto.onRepack = function onRepack(_) {
111
+ };
112
+ _proto.getRequestHandler = function getRequestHandler() {
113
+ return this.requestHandler.bind(this);
114
+ };
115
+ _proto.render = function render(req, res, url) {
116
+ var _this = this;
117
+ return _async_to_generator(function() {
118
+ var context, matched, route, result;
119
+ return _ts_generator(this, function(_state) {
120
+ switch (_state.label) {
121
+ case 0:
122
+ req.logger = req.logger || _this.logger;
123
+ req.metrics = req.metrics || _this.metrics;
124
+ context = createContext(req, res, {
125
+ metaName: _this.metaName
126
+ });
127
+ matched = _this.router.match(url || context.path);
128
+ if (!matched) {
129
+ return [
130
+ 2,
131
+ null
132
+ ];
133
+ }
134
+ res.statusCode = 200;
135
+ route = matched.generate(context.url);
136
+ return [
137
+ 4,
138
+ _this.handleWeb(context, route)
139
+ ];
140
+ case 1:
141
+ result = _state.sent();
142
+ if (!result) {
143
+ return [
144
+ 2,
145
+ null
146
+ ];
147
+ }
148
+ if (result.contentStream) {
149
+ return [
150
+ 2,
151
+ result.contentStream
152
+ ];
153
+ }
154
+ return [
155
+ 2,
156
+ result.content.toString()
157
+ ];
141
158
  }
142
- )
143
- },
144
- {
145
- key: "getRequestHandler",
146
- value: (
147
- // exposed requestHandler
148
- function getRequestHandler() {
149
- return this.requestHandler.bind(this);
159
+ });
160
+ })();
161
+ };
162
+ _proto.createHTTPServer = function createHTTPServer(handler) {
163
+ return _async_to_generator(function() {
164
+ return _ts_generator(this, function(_state) {
165
+ return [
166
+ 2,
167
+ createServer(handler)
168
+ ];
169
+ });
170
+ })();
171
+ };
172
+ _proto.onServerChange = function onServerChange(param) {
173
+ var filepath = param.filepath;
174
+ var _this = this;
175
+ return _async_to_generator(function() {
176
+ var pwd, api, server, apiPath, serverPath, onlyApi, onlyWeb;
177
+ return _ts_generator(this, function(_state) {
178
+ switch (_state.label) {
179
+ case 0:
180
+ pwd = _this.pwd;
181
+ api = AGGRED_DIR.api, server = AGGRED_DIR.server;
182
+ apiPath = path.normalize(path.join(pwd, api));
183
+ serverPath = path.normalize(path.join(pwd, server));
184
+ onlyApi = filepath.startsWith(apiPath);
185
+ onlyWeb = filepath.startsWith(serverPath);
186
+ return [
187
+ 4,
188
+ _this.prepareFrameHandler({
189
+ onlyWeb,
190
+ onlyApi
191
+ })
192
+ ];
193
+ case 1:
194
+ _state.sent();
195
+ return [
196
+ 2
197
+ ];
150
198
  }
151
- )
152
- },
153
- {
154
- key: "render",
155
- value: function render(req, res, url) {
156
- var _this = this;
157
- return _async_to_generator(function() {
158
- var context, matched, route, result;
159
- return _ts_generator(this, function(_state) {
160
- switch (_state.label) {
161
- case 0:
162
- req.logger = req.logger || _this.logger;
163
- req.metrics = req.metrics || _this.metrics;
164
- context = createContext(req, res, {
165
- metaName: _this.metaName
166
- });
167
- matched = _this.router.match(url || context.path);
168
- if (!matched) {
169
- return [
170
- 2,
171
- null
172
- ];
199
+ });
200
+ })();
201
+ };
202
+ _proto.getRoutes = function getRoutes() {
203
+ if (this.presetRoutes) {
204
+ return this.presetRoutes;
205
+ }
206
+ var file = path.join(this.distDir, ROUTE_SPEC_FILE);
207
+ if (fs.existsSync(file)) {
208
+ var content = fs.readJSONSync(file);
209
+ return content.routes;
210
+ }
211
+ return [];
212
+ };
213
+ _proto.addHandler = function addHandler(handler) {
214
+ this.handlers.push(handler);
215
+ };
216
+ _proto.render404 = function render404(context) {
217
+ context.error(ERROR_DIGEST.ENOTF, "404 Not Found");
218
+ this.renderErrorPage(context, 404);
219
+ };
220
+ _proto.prepareLoaderHandler = function prepareLoaderHandler(specs, distDir) {
221
+ var _this = this;
222
+ return _async_to_generator(function() {
223
+ var runner, handler;
224
+ return _ts_generator(this, function(_state) {
225
+ switch (_state.label) {
226
+ case 0:
227
+ runner = _this.runner;
228
+ return [
229
+ 4,
230
+ runner.prepareLoaderHandler({
231
+ serverRoutes: specs,
232
+ distDir
233
+ }, {
234
+ onLast: function() {
235
+ return null;
173
236
  }
174
- res.statusCode = 200;
175
- route = matched.generate(context.url);
176
- return [
177
- 4,
178
- _this.handleWeb(context, route)
179
- ];
180
- case 1:
181
- result = _state.sent();
182
- if (!result) {
183
- return [
184
- 2,
185
- null
186
- ];
237
+ })
238
+ ];
239
+ case 1:
240
+ handler = _state.sent();
241
+ _this.loaderHandler = handler;
242
+ return [
243
+ 2
244
+ ];
245
+ }
246
+ });
247
+ })();
248
+ };
249
+ _proto.prepareFrameHandler = function prepareFrameHandler(options) {
250
+ var _this = this;
251
+ return _async_to_generator(function() {
252
+ var workDir, runner, _ref, onlyApi, onlyWeb, _createMiddlewareCollecter, getMiddlewares, collector, _getMiddlewares, pluginAPIExt, pluginWebExt, serverDir, webExtension, apiExtension;
253
+ return _ts_generator(this, function(_state) {
254
+ switch (_state.label) {
255
+ case 0:
256
+ workDir = _this.workDir, runner = _this.runner;
257
+ _ref = options || {}, onlyApi = _ref.onlyApi, onlyWeb = _ref.onlyWeb;
258
+ _createMiddlewareCollecter = createMiddlewareCollecter(), getMiddlewares = _createMiddlewareCollecter.getMiddlewares, collector = _object_without_properties(_createMiddlewareCollecter, [
259
+ "getMiddlewares"
260
+ ]);
261
+ return [
262
+ 4,
263
+ runner.gather(collector)
264
+ ];
265
+ case 1:
266
+ _state.sent();
267
+ _getMiddlewares = getMiddlewares(), pluginAPIExt = _getMiddlewares.api, pluginWebExt = _getMiddlewares.web;
268
+ serverDir = path.join(workDir, SERVER_DIR);
269
+ return [
270
+ 4,
271
+ fs.pathExists(path.join(serverDir))
272
+ ];
273
+ case 2:
274
+ if (!(_state.sent() && !onlyApi))
275
+ return [
276
+ 3,
277
+ 4
278
+ ];
279
+ webExtension = mergeExtension(pluginWebExt);
280
+ return [
281
+ 4,
282
+ _this.prepareWebHandler(webExtension)
283
+ ];
284
+ case 3:
285
+ _this.frameWebHandler = _state.sent();
286
+ _state.label = 4;
287
+ case 4:
288
+ if (!!onlyWeb)
289
+ return [
290
+ 3,
291
+ 6
292
+ ];
293
+ apiExtension = mergeExtension(pluginAPIExt);
294
+ return [
295
+ 4,
296
+ _this.prepareAPIHandler(apiExtension)
297
+ ];
298
+ case 5:
299
+ _this.frameAPIHandler = _state.sent();
300
+ _state.label = 6;
301
+ case 6:
302
+ return [
303
+ 2
304
+ ];
305
+ }
306
+ });
307
+ })();
308
+ };
309
+ _proto.prepareWebHandler = function prepareWebHandler(extension) {
310
+ var _this = this;
311
+ return _async_to_generator(function() {
312
+ var workDir, runner, handler;
313
+ return _ts_generator(this, function(_state) {
314
+ switch (_state.label) {
315
+ case 0:
316
+ workDir = _this.workDir, runner = _this.runner;
317
+ return [
318
+ 4,
319
+ runner.prepareWebServer({
320
+ pwd: workDir,
321
+ config: extension
322
+ }, {
323
+ onLast: function() {
324
+ return null;
187
325
  }
188
- if (result.contentStream) {
189
- return [
190
- 2,
191
- result.contentStream
192
- ];
326
+ })
327
+ ];
328
+ case 1:
329
+ handler = _state.sent();
330
+ return [
331
+ 2,
332
+ handler
333
+ ];
334
+ }
335
+ });
336
+ })();
337
+ };
338
+ _proto.prepareAPIHandler = function prepareAPIHandler(extension) {
339
+ var _this = this;
340
+ return _async_to_generator(function() {
341
+ var workDir, runner, conf, bff, prefix, webOnly;
342
+ return _ts_generator(this, function(_state) {
343
+ switch (_state.label) {
344
+ case 0:
345
+ workDir = _this.workDir, runner = _this.runner, conf = _this.conf;
346
+ bff = conf.bff;
347
+ prefix = (bff === null || bff === void 0 ? void 0 : bff.prefix) || "/api";
348
+ return [
349
+ 4,
350
+ isWebOnly()
351
+ ];
352
+ case 1:
353
+ webOnly = _state.sent();
354
+ if (webOnly && process.env.NODE_ENV === "development") {
355
+ return [
356
+ 2,
357
+ function(req, res) {
358
+ res.setHeader("Content-Type", "text/plain");
359
+ res.end(JSON.stringify(""));
193
360
  }
194
- return [
195
- 2,
196
- result.content.toString()
197
- ];
361
+ ];
198
362
  }
199
- });
200
- })();
201
- }
202
- },
203
- {
204
- key: "createHTTPServer",
205
- value: function createHTTPServer(handler) {
206
- return _async_to_generator(function() {
207
- return _ts_generator(this, function(_state) {
208
363
  return [
209
364
  2,
210
- createServer(handler)
365
+ runner.prepareApiServer({
366
+ pwd: workDir,
367
+ config: extension,
368
+ prefix: Array.isArray(prefix) ? prefix[0] : prefix,
369
+ httpMethodDecider: bff === null || bff === void 0 ? void 0 : bff.httpMethodDecider,
370
+ render: _this.render.bind(_this)
371
+ }, {
372
+ onLast: function() {
373
+ return null;
374
+ }
375
+ })
211
376
  ];
212
- });
213
- })();
214
- }
215
- },
216
- {
217
- key: "onServerChange",
218
- value: (
219
- /* —————————————————————— function will be overwrite —————————————————————— */
220
- function onServerChange(param) {
221
- var filepath = param.filepath;
222
- var _this = this;
223
- return _async_to_generator(function() {
224
- var pwd, api, server, apiPath, serverPath, onlyApi, onlyWeb;
225
- return _ts_generator(this, function(_state) {
226
- switch (_state.label) {
227
- case 0:
228
- pwd = _this.pwd;
229
- api = AGGRED_DIR.api, server = AGGRED_DIR.server;
230
- apiPath = path.normalize(path.join(pwd, api));
231
- serverPath = path.normalize(path.join(pwd, server));
232
- onlyApi = filepath.startsWith(apiPath);
233
- onlyWeb = filepath.startsWith(serverPath);
234
- return [
235
- 4,
236
- _this.prepareFrameHandler({
237
- onlyWeb,
238
- onlyApi
239
- })
240
- ];
241
- case 1:
242
- _state.sent();
243
- return [
244
- 2
245
- ];
246
- }
247
- });
248
- })();
249
- }
250
- )
251
- },
252
- {
253
- key: "getRoutes",
254
- value: (
255
- // get routes info
256
- function getRoutes() {
257
- if (this.presetRoutes) {
258
- return this.presetRoutes;
259
- }
260
- var file = path.join(this.distDir, ROUTE_SPEC_FILE);
261
- if (fs.existsSync(file)) {
262
- var content = fs.readJSONSync(file);
263
- return content.routes;
264
- }
265
- return [];
266
- }
267
- )
268
- },
269
- {
270
- key: "addHandler",
271
- value: (
272
- // add promisify request handler to server
273
- // handler should do not do more things after invoke next
274
- function addHandler(handler) {
275
- this.handlers.push(handler);
276
377
  }
277
- )
278
- },
279
- {
280
- key: "render404",
281
- value: (
282
- // return 404 page
283
- function render404(context) {
284
- context.error(ERROR_DIGEST.ENOTF, "404 Not Found");
285
- this.renderErrorPage(context, 404);
378
+ });
379
+ })();
380
+ };
381
+ _proto.filterRoutes = function filterRoutes(routes) {
382
+ return routes;
383
+ };
384
+ _proto.setupBeforeProdMiddleware = function setupBeforeProdMiddleware() {
385
+ var _this = this;
386
+ return _async_to_generator(function() {
387
+ var conf, runner, preMiddleware;
388
+ return _ts_generator(this, function(_state) {
389
+ switch (_state.label) {
390
+ case 0:
391
+ conf = _this.conf, runner = _this.runner;
392
+ return [
393
+ 4,
394
+ runner.beforeProdServer(conf)
395
+ ];
396
+ case 1:
397
+ preMiddleware = _state.sent();
398
+ preMiddleware.flat().forEach(function(mid) {
399
+ _this.addHandler(mid);
400
+ });
401
+ return [
402
+ 2
403
+ ];
286
404
  }
287
- )
288
- },
289
- {
290
- key: "prepareLoaderHandler",
291
- value: function prepareLoaderHandler(specs, distDir) {
292
- var _this = this;
293
- return _async_to_generator(function() {
294
- var runner, handler;
295
- return _ts_generator(this, function(_state) {
296
- switch (_state.label) {
297
- case 0:
298
- runner = _this.runner;
299
- return [
300
- 4,
301
- runner.prepareLoaderHandler({
302
- serverRoutes: specs,
303
- distDir
304
- }, {
305
- onLast: function() {
306
- return null;
307
- }
308
- })
309
- ];
310
- case 1:
311
- handler = _state.sent();
312
- _this.loaderHandler = handler;
313
- return [
314
- 2
315
- ];
316
- }
317
- });
318
- })();
405
+ });
406
+ })();
407
+ };
408
+ _proto.setupStaticMiddleware = function setupStaticMiddleware(prefix) {
409
+ var staticPathRegExp = getStaticReg(this.conf.output, this.conf.html, prefix);
410
+ return createStaticFileHandler([
411
+ {
412
+ path: staticPathRegExp,
413
+ target: this.distDir
319
414
  }
320
- },
321
- {
322
- key: "prepareFrameHandler",
323
- value: (
324
- // gather frame extension and get framework handler
325
- function prepareFrameHandler(options) {
326
- var _this = this;
327
- return _async_to_generator(function() {
328
- var workDir, runner, _ref, onlyApi, onlyWeb, _createMiddlewareCollecter, getMiddlewares, collector, _getMiddlewares, pluginAPIExt, pluginWebExt, serverDir, webExtension, apiExtension;
329
- return _ts_generator(this, function(_state) {
330
- switch (_state.label) {
331
- case 0:
332
- workDir = _this.workDir, runner = _this.runner;
333
- _ref = options || {}, onlyApi = _ref.onlyApi, onlyWeb = _ref.onlyWeb;
334
- _createMiddlewareCollecter = createMiddlewareCollecter(), getMiddlewares = _createMiddlewareCollecter.getMiddlewares, collector = _object_without_properties(_createMiddlewareCollecter, [
335
- "getMiddlewares"
336
- ]);
337
- return [
338
- 4,
339
- runner.gather(collector)
340
- ];
341
- case 1:
342
- _state.sent();
343
- _getMiddlewares = getMiddlewares(), pluginAPIExt = _getMiddlewares.api, pluginWebExt = _getMiddlewares.web;
344
- serverDir = path.join(workDir, SERVER_DIR);
345
- return [
346
- 4,
347
- fs.pathExists(path.join(serverDir))
348
- ];
349
- case 2:
350
- if (!(_state.sent() && !onlyApi))
351
- return [
352
- 3,
353
- 4
354
- ];
355
- webExtension = mergeExtension(pluginWebExt);
356
- return [
357
- 4,
358
- _this.prepareWebHandler(webExtension)
359
- ];
360
- case 3:
361
- _this.frameWebHandler = _state.sent();
362
- _state.label = 4;
363
- case 4:
364
- if (!!onlyWeb)
365
- return [
366
- 3,
367
- 6
368
- ];
369
- apiExtension = mergeExtension(pluginAPIExt);
370
- return [
371
- 4,
372
- _this.prepareAPIHandler(apiExtension)
373
- ];
374
- case 5:
375
- _this.frameAPIHandler = _state.sent();
376
- _state.label = 6;
377
- case 6:
378
- return [
379
- 2
380
- ];
381
- }
382
- });
383
- })();
415
+ ], prefix);
416
+ };
417
+ _proto.handleAPI = function handleAPI(context) {
418
+ var _this = this;
419
+ return _async_to_generator(function() {
420
+ var req, res;
421
+ return _ts_generator(this, function(_state) {
422
+ switch (_state.label) {
423
+ case 0:
424
+ req = context.req, res = context.res;
425
+ if (!_this.frameAPIHandler) {
426
+ throw new Error("can not found api handler");
427
+ }
428
+ return [
429
+ 4,
430
+ _this.frameAPIHandler(req, res)
431
+ ];
432
+ case 1:
433
+ _state.sent();
434
+ return [
435
+ 2
436
+ ];
384
437
  }
385
- )
386
- },
387
- {
388
- key: "prepareWebHandler",
389
- value: function prepareWebHandler(extension) {
390
- var _this = this;
391
- return _async_to_generator(function() {
392
- var workDir, runner, handler;
393
- return _ts_generator(this, function(_state) {
394
- switch (_state.label) {
395
- case 0:
396
- workDir = _this.workDir, runner = _this.runner;
397
- return [
398
- 4,
399
- runner.prepareWebServer({
400
- pwd: workDir,
401
- config: extension
402
- }, {
403
- onLast: function() {
404
- return null;
405
- }
406
- })
407
- ];
408
- case 1:
409
- handler = _state.sent();
410
- return [
411
- 2,
412
- handler
413
- ];
438
+ });
439
+ })();
440
+ };
441
+ _proto.handleWeb = function handleWeb(context, route) {
442
+ var _this = this;
443
+ return _async_to_generator(function() {
444
+ var res, renderResult;
445
+ return _ts_generator(this, function(_state) {
446
+ switch (_state.label) {
447
+ case 0:
448
+ res = context.res;
449
+ if (!_this.loaderHandler)
450
+ return [
451
+ 3,
452
+ 2
453
+ ];
454
+ return [
455
+ 4,
456
+ _this.loaderHandler(context)
457
+ ];
458
+ case 1:
459
+ _state.sent();
460
+ if (_this.isSend(res)) {
461
+ return [
462
+ 2,
463
+ null
464
+ ];
414
465
  }
415
- });
416
- })();
417
- }
418
- },
419
- {
420
- key: "prepareAPIHandler",
421
- value: function prepareAPIHandler(extension) {
422
- var _this = this;
423
- return _async_to_generator(function() {
424
- var workDir, runner, conf, bff, prefix, webOnly;
425
- return _ts_generator(this, function(_state) {
426
- switch (_state.label) {
427
- case 0:
428
- workDir = _this.workDir, runner = _this.runner, conf = _this.conf;
429
- bff = conf.bff;
430
- prefix = (bff === null || bff === void 0 ? void 0 : bff.prefix) || "/api";
431
- return [
432
- 4,
433
- isWebOnly()
434
- ];
435
- case 1:
436
- webOnly = _state.sent();
437
- if (webOnly && process.env.NODE_ENV === "development") {
438
- return [
439
- 2,
440
- function(req, res) {
441
- res.setHeader("Content-Type", "text/plain");
442
- res.end(JSON.stringify(""));
443
- }
444
- ];
466
+ _state.label = 2;
467
+ case 2:
468
+ context.setParams(route.params);
469
+ context.setServerData("router", {
470
+ baseUrl: route.urlPath,
471
+ params: route.params
472
+ });
473
+ if (route.responseHeaders) {
474
+ Object.keys(route.responseHeaders).forEach(function(key) {
475
+ var value = route.responseHeaders[key];
476
+ if (value) {
477
+ context.res.setHeader(key, value);
445
478
  }
446
- return [
447
- 2,
448
- runner.prepareApiServer({
449
- pwd: workDir,
450
- config: extension,
451
- prefix: Array.isArray(prefix) ? prefix[0] : prefix,
452
- httpMethodDecider: bff === null || bff === void 0 ? void 0 : bff.httpMethodDecider,
453
- render: _this.render.bind(_this)
454
- }, {
455
- onLast: function() {
456
- return null;
457
- }
458
- })
459
- ];
479
+ });
460
480
  }
461
- });
462
- })();
463
- }
464
- },
465
- {
466
- key: "filterRoutes",
467
- value: function filterRoutes(routes) {
468
- return routes;
469
- }
470
- },
471
- {
472
- key: "setupBeforeProdMiddleware",
473
- value: function setupBeforeProdMiddleware() {
474
- var _this = this;
475
- return _async_to_generator(function() {
476
- var conf, runner, preMiddleware;
477
- return _ts_generator(this, function(_state) {
478
- switch (_state.label) {
479
- case 0:
480
- conf = _this.conf, runner = _this.runner;
481
- return [
482
- 4,
483
- runner.beforeProdServer(conf)
484
- ];
485
- case 1:
486
- preMiddleware = _state.sent();
487
- preMiddleware.flat().forEach(function(mid) {
488
- _this.addHandler(mid);
489
- });
490
- return [
491
- 2
492
- ];
481
+ return [
482
+ 4,
483
+ _this.routeRenderHandler({
484
+ ctx: context,
485
+ route,
486
+ runner: _this.runner
487
+ })
488
+ ];
489
+ case 3:
490
+ renderResult = _state.sent();
491
+ if (!renderResult) {
492
+ _this.render404(context);
493
+ return [
494
+ 2,
495
+ null
496
+ ];
493
497
  }
494
- });
495
- })();
496
- }
497
- },
498
- {
499
- key: "setupStaticMiddleware",
500
- value: function setupStaticMiddleware(prefix) {
501
- var staticPathRegExp = getStaticReg(this.conf.output, this.conf.html, prefix);
502
- return createStaticFileHandler([
503
- {
504
- path: staticPathRegExp,
505
- target: this.distDir
506
- }
507
- ], prefix);
498
+ if (renderResult.redirect) {
499
+ _this.redirect(res, renderResult.content, renderResult.statusCode);
500
+ return [
501
+ 2,
502
+ null
503
+ ];
504
+ }
505
+ if (_this.isSend(res)) {
506
+ return [
507
+ 2,
508
+ null
509
+ ];
510
+ }
511
+ res.set("content-type", renderResult.contentType);
512
+ return [
513
+ 2,
514
+ renderResult
515
+ ];
516
+ }
517
+ });
518
+ })();
519
+ };
520
+ _proto.proxy = function proxy() {
521
+ return _async_to_generator(function() {
522
+ return _ts_generator(this, function(_state) {
523
+ return [
524
+ 2,
525
+ null
526
+ ];
527
+ });
528
+ })();
529
+ };
530
+ _proto.warmupSSRBundle = function warmupSSRBundle() {
531
+ var distDir = this.distDir;
532
+ var bundles = this.router.getBundles();
533
+ bundles.forEach(function(bundle) {
534
+ var filepath = path.join(distDir, bundle);
535
+ if (fs.existsSync(filepath)) {
536
+ require(filepath);
508
537
  }
509
- },
510
- {
511
- key: "handleAPI",
512
- value: function handleAPI(context) {
513
- var _this = this;
514
- return _async_to_generator(function() {
515
- var req, res;
516
- return _ts_generator(this, function(_state) {
517
- switch (_state.label) {
518
- case 0:
519
- req = context.req, res = context.res;
520
- if (!_this.frameAPIHandler) {
521
- throw new Error("can not found api handler");
522
- }
523
- return [
524
- 4,
525
- _this.frameAPIHandler(req, res)
526
- ];
527
- case 1:
528
- _state.sent();
538
+ });
539
+ };
540
+ _proto.createContext = function createContext1(req, res) {
541
+ var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
542
+ return createContext(req, res, options);
543
+ };
544
+ _proto.routeHandler = function routeHandler(context) {
545
+ var _this = this;
546
+ return _async_to_generator(function() {
547
+ var res, reporter, matched, end, route, afterMatchContext, end1, cost, _afterMatchContext_router, current, url, status, matched1, middlewareContext, end2, cost1, renderResult, responseStream, headers, name, value, response, afterRenderContext, end3, cost2;
548
+ return _ts_generator(this, function(_state) {
549
+ switch (_state.label) {
550
+ case 0:
551
+ res = context.res, reporter = context.reporter;
552
+ matched = _this.router.match(context.path);
553
+ if (!matched) {
554
+ _this.render404(context);
555
+ return [
556
+ 2
557
+ ];
558
+ }
559
+ return [
560
+ 4,
561
+ reporter.init({
562
+ match: matched
563
+ })
564
+ ];
565
+ case 1:
566
+ _state.sent();
567
+ end = time();
568
+ res.on("finish", function() {
569
+ var cost3 = end();
570
+ reporter.reportTiming(ServerReportTimings.SERVER_HANDLE_REQUEST, cost3);
571
+ });
572
+ route = matched.generate(context.url);
573
+ if (!route.isApi)
574
+ return [
575
+ 3,
576
+ 3
577
+ ];
578
+ return [
579
+ 4,
580
+ _this.handleAPI(context)
581
+ ];
582
+ case 2:
583
+ _state.sent();
584
+ return [
585
+ 2
586
+ ];
587
+ case 3:
588
+ if (!(route.entryName && _this.runMode === RUN_MODE.FULL))
589
+ return [
590
+ 3,
591
+ 5
592
+ ];
593
+ afterMatchContext = createAfterMatchContext(context, route.entryName);
594
+ end1 = time();
595
+ return [
596
+ 4,
597
+ _this.runner.afterMatch(afterMatchContext, {
598
+ onLast: noop
599
+ })
600
+ ];
601
+ case 4:
602
+ _state.sent();
603
+ cost = end1();
604
+ cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
605
+ if (_this.isSend(res)) {
606
+ return [
607
+ 2
608
+ ];
609
+ }
610
+ _afterMatchContext_router = afterMatchContext.router, current = _afterMatchContext_router.current, url = _afterMatchContext_router.url, status = _afterMatchContext_router.status;
611
+ if (url) {
612
+ _this.redirect(res, url, status);
613
+ return [
614
+ 2
615
+ ];
616
+ }
617
+ if (route.entryName !== current) {
618
+ matched1 = _this.router.matchEntry(current);
619
+ if (!matched1) {
620
+ _this.render404(context);
529
621
  return [
530
622
  2
531
623
  ];
624
+ }
625
+ route = matched1.generate(context.url);
532
626
  }
533
- });
534
- })();
535
- }
536
- },
537
- {
538
- key: "handleWeb",
539
- value: function handleWeb(context, route) {
540
- var _this = this;
541
- return _async_to_generator(function() {
542
- var res, renderResult;
543
- return _ts_generator(this, function(_state) {
544
- switch (_state.label) {
545
- case 0:
546
- res = context.res;
547
- if (!_this.loaderHandler)
548
- return [
549
- 3,
550
- 2
551
- ];
552
- return [
553
- 4,
554
- _this.loaderHandler(context)
555
- ];
556
- case 1:
557
- _state.sent();
558
- if (_this.isSend(res)) {
559
- return [
560
- 2,
561
- null
562
- ];
563
- }
564
- _state.label = 2;
565
- case 2:
566
- context.setParams(route.params);
567
- context.setServerData("router", {
568
- baseUrl: route.urlPath,
569
- params: route.params
570
- });
571
- if (route.responseHeaders) {
572
- Object.keys(route.responseHeaders).forEach(function(key) {
573
- var value = route.responseHeaders[key];
574
- if (value) {
575
- context.res.setHeader(key, value);
576
- }
577
- });
578
- }
579
- return [
580
- 4,
581
- _this.routeRenderHandler({
582
- ctx: context,
583
- route,
584
- runner: _this.runner
585
- })
586
- ];
587
- case 3:
588
- renderResult = _state.sent();
589
- if (!renderResult) {
590
- _this.render404(context);
591
- return [
592
- 2,
593
- null
594
- ];
595
- }
596
- if (renderResult.redirect) {
597
- _this.redirect(res, renderResult.content, renderResult.statusCode);
598
- return [
599
- 2,
600
- null
601
- ];
602
- }
603
- if (_this.isSend(res)) {
604
- return [
605
- 2,
606
- null
607
- ];
608
- }
609
- res.set("content-type", renderResult.contentType);
610
- return [
611
- 2,
612
- renderResult
613
- ];
627
+ _state.label = 5;
628
+ case 5:
629
+ if (!_this.frameWebHandler)
630
+ return [
631
+ 3,
632
+ 7
633
+ ];
634
+ res.locals = res.locals || {};
635
+ middlewareContext = createMiddlewareContext(context);
636
+ end2 = time();
637
+ return [
638
+ 4,
639
+ _this.frameWebHandler(middlewareContext)
640
+ ];
641
+ case 6:
642
+ _state.sent();
643
+ cost1 = end2();
644
+ cost1 && reporter.reportTiming(ServerReportTimings.SERVER_MIDDLEWARE, cost1);
645
+ res.locals = _object_spread({}, res.locals, middlewareContext.response.locals);
646
+ if (_this.isSend(res)) {
647
+ return [
648
+ 2
649
+ ];
614
650
  }
615
- });
616
- })();
617
- }
618
- },
619
- {
620
- key: "proxy",
621
- value: function proxy() {
622
- return _async_to_generator(function() {
623
- return _ts_generator(this, function(_state) {
651
+ _state.label = 7;
652
+ case 7:
624
653
  return [
625
- 2,
626
- null
654
+ 4,
655
+ _this.handleWeb(context, route)
627
656
  ];
628
- });
629
- })();
630
- }
631
- },
632
- {
633
- key: "warmupSSRBundle",
634
- value: (
635
- // warmup ssr function
636
- function warmupSSRBundle() {
637
- var distDir = this.distDir;
638
- var bundles = this.router.getBundles();
639
- bundles.forEach(function(bundle) {
640
- var filepath = path.join(distDir, bundle);
641
- if (fs.existsSync(filepath)) {
642
- require(filepath);
657
+ case 8:
658
+ renderResult = _state.sent();
659
+ if (!renderResult) {
660
+ return [
661
+ 2
662
+ ];
663
+ }
664
+ responseStream = renderResult.contentStream, headers = renderResult.headers;
665
+ if (headers) {
666
+ for (var name2 in headers) {
667
+ value = headers[name2];
668
+ res.setHeader(name2, value);
669
+ }
670
+ }
671
+ response = renderResult.content;
672
+ if (route.entryName && responseStream) {
673
+ responseStream.pipe(res);
674
+ return [
675
+ 2
676
+ ];
677
+ }
678
+ if (!(route.entryName && _this.runMode === RUN_MODE.FULL))
679
+ return [
680
+ 3,
681
+ 10
682
+ ];
683
+ afterRenderContext = createAfterRenderContext(context, route, response.toString());
684
+ end3 = time();
685
+ return [
686
+ 4,
687
+ _this.runner.afterRender(afterRenderContext, {
688
+ onLast: noop
689
+ })
690
+ ];
691
+ case 9:
692
+ _state.sent();
693
+ cost2 = end3();
694
+ cost2 && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost2);
695
+ if (_this.isSend(res)) {
696
+ return [
697
+ 2
698
+ ];
643
699
  }
644
- });
700
+ response = afterRenderContext.template.get();
701
+ _state.label = 10;
702
+ case 10:
703
+ res.end(response);
704
+ return [
705
+ 2
706
+ ];
645
707
  }
646
- )
647
- },
648
- {
649
- key: "createContext",
650
- value: function createContext1(req, res) {
651
- var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
652
- return createContext(req, res, options);
708
+ });
709
+ })();
710
+ };
711
+ _proto.isSend = function isSend(res) {
712
+ if (res.modernFlushedHeaders) {
713
+ if (res.writableFinished) {
714
+ return true;
653
715
  }
654
- },
655
- {
656
- key: "routeHandler",
657
- value: (
658
- /* —————————————————————— private function —————————————————————— */
659
- // handler route.json, include api / csr / ssr
660
- function routeHandler(context) {
661
- var _this = this;
662
- return _async_to_generator(function() {
663
- var res, reporter, matched, end, route, afterMatchContext, end1, cost, _afterMatchContext_router, current, url, status, matched1, middlewareContext, end2, cost1, renderResult, responseStream, headers, name, value, response, afterRenderContext, end3, cost2;
664
- return _ts_generator(this, function(_state) {
665
- switch (_state.label) {
666
- case 0:
667
- res = context.res, reporter = context.reporter;
668
- matched = _this.router.match(context.path);
669
- if (!matched) {
670
- _this.render404(context);
671
- return [
672
- 2
673
- ];
674
- }
675
- return [
676
- 4,
677
- reporter.init({
678
- match: matched
679
- })
680
- ];
681
- case 1:
682
- _state.sent();
683
- end = time();
684
- res.on("finish", function() {
685
- var cost3 = end();
686
- reporter.reportTiming(ServerReportTimings.SERVER_HANDLE_REQUEST, cost3);
687
- });
688
- route = matched.generate(context.url);
689
- if (!route.isApi)
690
- return [
691
- 3,
692
- 3
693
- ];
694
- return [
695
- 4,
696
- _this.handleAPI(context)
697
- ];
698
- case 2:
699
- _state.sent();
700
- return [
701
- 2
702
- ];
703
- case 3:
704
- if (!(route.entryName && _this.runMode === RUN_MODE.FULL))
705
- return [
706
- 3,
707
- 5
708
- ];
709
- afterMatchContext = createAfterMatchContext(context, route.entryName);
710
- end1 = time();
711
- return [
712
- 4,
713
- _this.runner.afterMatch(afterMatchContext, {
714
- onLast: noop
715
- })
716
- ];
717
- case 4:
718
- _state.sent();
719
- cost = end1();
720
- cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
721
- if (_this.isSend(res)) {
722
- return [
723
- 2
724
- ];
725
- }
726
- _afterMatchContext_router = afterMatchContext.router, current = _afterMatchContext_router.current, url = _afterMatchContext_router.url, status = _afterMatchContext_router.status;
727
- if (url) {
728
- _this.redirect(res, url, status);
729
- return [
730
- 2
731
- ];
732
- }
733
- if (route.entryName !== current) {
734
- matched1 = _this.router.matchEntry(current);
735
- if (!matched1) {
736
- _this.render404(context);
737
- return [
738
- 2
739
- ];
740
- }
741
- route = matched1.generate(context.url);
742
- }
743
- _state.label = 5;
744
- case 5:
745
- if (!_this.frameWebHandler)
746
- return [
747
- 3,
748
- 7
749
- ];
750
- res.locals = res.locals || {};
751
- middlewareContext = createMiddlewareContext(context);
752
- end2 = time();
753
- return [
754
- 4,
755
- _this.frameWebHandler(middlewareContext)
756
- ];
757
- case 6:
758
- _state.sent();
759
- cost1 = end2();
760
- cost1 && reporter.reportTiming(ServerReportTimings.SERVER_MIDDLEWARE, cost1);
761
- res.locals = _object_spread({}, res.locals, middlewareContext.response.locals);
762
- if (_this.isSend(res)) {
763
- return [
764
- 2
765
- ];
766
- }
767
- _state.label = 7;
768
- case 7:
769
- return [
770
- 4,
771
- _this.handleWeb(context, route)
772
- ];
773
- case 8:
774
- renderResult = _state.sent();
775
- if (!renderResult) {
776
- return [
777
- 2
778
- ];
779
- }
780
- responseStream = renderResult.contentStream, headers = renderResult.headers;
781
- if (headers) {
782
- for (var name2 in headers) {
783
- value = headers[name2];
784
- res.setHeader(name2, value);
785
- }
786
- }
787
- response = renderResult.content;
788
- if (route.entryName && responseStream) {
789
- responseStream.pipe(res);
790
- return [
791
- 2
792
- ];
793
- }
794
- if (!(route.entryName && _this.runMode === RUN_MODE.FULL))
795
- return [
796
- 3,
797
- 10
798
- ];
799
- afterRenderContext = createAfterRenderContext(context, route, response.toString());
800
- end3 = time();
801
- return [
802
- 4,
803
- _this.runner.afterRender(afterRenderContext, {
804
- onLast: noop
805
- })
806
- ];
807
- case 9:
808
- _state.sent();
809
- cost2 = end3();
810
- cost2 && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost2);
811
- if (_this.isSend(res)) {
812
- return [
813
- 2
814
- ];
815
- }
816
- response = afterRenderContext.template.get();
817
- _state.label = 10;
818
- case 10:
819
- res.end(response);
820
- return [
821
- 2
822
- ];
823
- }
824
- });
825
- })();
716
+ } else if (res.headersSent) {
717
+ return true;
718
+ }
719
+ if (res.getHeader("Location") && isRedirect(res.statusCode)) {
720
+ res.end();
721
+ return true;
722
+ }
723
+ return false;
724
+ };
725
+ _proto.compose = function compose() {
726
+ var _this = this;
727
+ var handlers = this.handlers;
728
+ if (!Array.isArray(handlers)) {
729
+ throw new TypeError("Middleware stack must be an array!");
730
+ }
731
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
732
+ try {
733
+ for (var _iterator = handlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
734
+ var fn = _step.value;
735
+ if (typeof fn !== "function") {
736
+ throw new TypeError("Middleware must be composed of functions!");
826
737
  }
827
- )
828
- },
829
- {
830
- key: "isSend",
831
- value: function isSend(res) {
832
- if (res.modernFlushedHeaders) {
833
- if (res.writableFinished) {
834
- return true;
835
- }
836
- } else if (res.headersSent) {
837
- return true;
738
+ }
739
+ } catch (err) {
740
+ _didIteratorError = true;
741
+ _iteratorError = err;
742
+ } finally {
743
+ try {
744
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
745
+ _iterator.return();
838
746
  }
839
- if (res.getHeader("Location") && isRedirect(res.statusCode)) {
840
- res.end();
841
- return true;
747
+ } finally {
748
+ if (_didIteratorError) {
749
+ throw _iteratorError;
842
750
  }
843
- return false;
844
751
  }
845
- },
846
- {
847
- key: "compose",
848
- value: (
849
- // compose handlers and create the final handler
850
- function compose() {
851
- var _this = this;
852
- var handlers = this.handlers;
853
- if (!Array.isArray(handlers)) {
854
- throw new TypeError("Middleware stack must be an array!");
855
- }
856
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
857
- try {
858
- for (var _iterator = handlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
859
- var fn = _step.value;
860
- if (typeof fn !== "function") {
861
- throw new TypeError("Middleware must be composed of functions!");
862
- }
863
- }
864
- } catch (err) {
865
- _didIteratorError = true;
866
- _iteratorError = err;
867
- } finally {
868
- try {
869
- if (!_iteratorNormalCompletion && _iterator.return != null) {
870
- _iterator.return();
871
- }
872
- } finally {
873
- if (_didIteratorError) {
874
- throw _iteratorError;
875
- }
876
- }
877
- }
878
- this._handler = function(context, next) {
879
- var i = 0;
880
- var dispatch = function(error) {
881
- if (error) {
882
- return _this.onError(context, error);
883
- }
884
- var handler = handlers[i++];
885
- if (!handler) {
886
- return next();
887
- }
888
- try {
889
- var result = handler(context, dispatch);
890
- if (isPromise(result)) {
891
- return result.catch(onError);
892
- }
893
- } catch (e) {
894
- return onError(e);
895
- }
896
- };
897
- var onError = function(err) {
898
- _this.onError(context, err);
899
- };
900
- return dispatch();
901
- };
752
+ }
753
+ this._handler = function(context, next) {
754
+ var i = 0;
755
+ var dispatch = function(error) {
756
+ if (error) {
757
+ return _this.onError(context, error);
902
758
  }
903
- )
904
- },
905
- {
906
- key: "requestHandler",
907
- value: function requestHandler(req, res) {
908
- var next = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function() {
909
- };
910
- res.statusCode = 200;
911
- req.logger = req.logger || this.logger;
912
- req.metrics = req.metrics || this.metrics;
913
- var context;
914
- try {
915
- context = this.createContext(req, res, {
916
- metaName: this.metaName
917
- });
918
- } catch (e) {
919
- this.logger.error(e);
920
- res.statusCode = 500;
921
- res.setHeader("content-type", mime.contentType("html"));
922
- return res.end(createErrorDocument(500, ERROR_PAGE_TEXT[500]));
759
+ var handler = handlers[i++];
760
+ if (!handler) {
761
+ return next();
923
762
  }
924
763
  try {
925
- return this._handler(context, next);
926
- } catch (err) {
927
- return this.onError(context, err);
764
+ var result = handler(context, dispatch);
765
+ if (isPromise(result)) {
766
+ return result.catch(onError);
767
+ }
768
+ } catch (e) {
769
+ return onError(e);
928
770
  }
929
- }
930
- },
931
- {
932
- key: "redirect",
933
- value: function redirect(res, url) {
934
- var status = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 302;
935
- res.set("Location", url);
936
- res.statusCode = status;
937
- res.end();
938
- }
939
- },
940
- {
941
- key: "onError",
942
- value: function onError(context, err) {
943
- context.error(ERROR_DIGEST.EINTER, err);
944
- this.renderErrorPage(context, 500);
945
- }
946
- },
947
- {
948
- key: "renderErrorPage",
949
- value: function renderErrorPage(context, status) {
950
- var _this = this;
951
- return _async_to_generator(function() {
952
- var res, statusPage, customErrorPage, matched, route, entryName, file, e, text;
953
- return _ts_generator(this, function(_state) {
954
- switch (_state.label) {
955
- case 0:
956
- res = context.res;
957
- context.status = status;
958
- res.set("content-type", mime.contentType("html"));
959
- statusPage = "/".concat(status);
960
- customErrorPage = "/_error";
961
- matched = _this.router.match(statusPage) || _this.router.match(customErrorPage);
962
- if (!matched)
963
- return [
964
- 3,
965
- 4
966
- ];
967
- route = matched.generate(context.url);
968
- entryName = route.entryName;
969
- if (!(entryName === status.toString() || entryName === "_error"))
970
- return [
971
- 3,
972
- 4
973
- ];
974
- _state.label = 1;
975
- case 1:
976
- _state.trys.push([
977
- 1,
978
- 3,
979
- ,
980
- 4
981
- ]);
982
- return [
983
- 4,
984
- _this.routeRenderHandler({
985
- route,
986
- ctx: context,
987
- runner: _this.runner
988
- })
989
- ];
990
- case 2:
991
- file = _state.sent();
992
- if (file) {
993
- context.res.end(file.content);
994
- return [
995
- 2
996
- ];
997
- }
998
- return [
999
- 3,
1000
- 4
1001
- ];
1002
- case 3:
1003
- e = _state.sent();
1004
- return [
1005
- 3,
1006
- 4
1007
- ];
1008
- case 4:
1009
- text = ERROR_PAGE_TEXT[status] || ERROR_PAGE_TEXT[500];
1010
- context.res.end(createErrorDocument(status, text));
1011
- return [
1012
- 2
1013
- ];
1014
- }
1015
- });
1016
- })();
1017
- }
771
+ };
772
+ var onError = function(err) {
773
+ _this.onError(context, err);
774
+ };
775
+ return dispatch();
776
+ };
777
+ };
778
+ _proto.requestHandler = function requestHandler(req, res) {
779
+ var next = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function() {
780
+ };
781
+ res.statusCode = 200;
782
+ req.logger = req.logger || this.logger;
783
+ req.metrics = req.metrics || this.metrics;
784
+ var context;
785
+ try {
786
+ context = this.createContext(req, res, {
787
+ metaName: this.metaName
788
+ });
789
+ } catch (e) {
790
+ this.logger.error(e);
791
+ res.statusCode = 500;
792
+ res.setHeader("content-type", mime.contentType("html"));
793
+ return res.end(createErrorDocument(500, ERROR_PAGE_TEXT[500]));
794
+ }
795
+ try {
796
+ return this._handler(context, next);
797
+ } catch (err) {
798
+ return this.onError(context, err);
1018
799
  }
1019
- ]);
800
+ };
801
+ _proto.redirect = function redirect(res, url) {
802
+ var status = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 302;
803
+ res.set("Location", url);
804
+ res.statusCode = status;
805
+ res.end();
806
+ };
807
+ _proto.onError = function onError(context, err) {
808
+ context.error(ERROR_DIGEST.EINTER, err);
809
+ this.renderErrorPage(context, 500);
810
+ };
811
+ _proto.renderErrorPage = function renderErrorPage(context, status) {
812
+ var _this = this;
813
+ return _async_to_generator(function() {
814
+ var res, statusPage, customErrorPage, matched, route, entryName, file, e, text;
815
+ return _ts_generator(this, function(_state) {
816
+ switch (_state.label) {
817
+ case 0:
818
+ res = context.res;
819
+ context.status = status;
820
+ res.set("content-type", mime.contentType("html"));
821
+ statusPage = "/".concat(status);
822
+ customErrorPage = "/_error";
823
+ matched = _this.router.match(statusPage) || _this.router.match(customErrorPage);
824
+ if (!matched)
825
+ return [
826
+ 3,
827
+ 4
828
+ ];
829
+ route = matched.generate(context.url);
830
+ entryName = route.entryName;
831
+ if (!(entryName === status.toString() || entryName === "_error"))
832
+ return [
833
+ 3,
834
+ 4
835
+ ];
836
+ _state.label = 1;
837
+ case 1:
838
+ _state.trys.push([
839
+ 1,
840
+ 3,
841
+ ,
842
+ 4
843
+ ]);
844
+ return [
845
+ 4,
846
+ _this.routeRenderHandler({
847
+ route,
848
+ ctx: context,
849
+ runner: _this.runner
850
+ })
851
+ ];
852
+ case 2:
853
+ file = _state.sent();
854
+ if (file) {
855
+ context.res.end(file.content);
856
+ return [
857
+ 2
858
+ ];
859
+ }
860
+ return [
861
+ 3,
862
+ 4
863
+ ];
864
+ case 3:
865
+ e = _state.sent();
866
+ return [
867
+ 3,
868
+ 4
869
+ ];
870
+ case 4:
871
+ text = ERROR_PAGE_TEXT[status] || ERROR_PAGE_TEXT[500];
872
+ context.res.end(createErrorDocument(status, text));
873
+ return [
874
+ 2
875
+ ];
876
+ }
877
+ });
878
+ })();
879
+ };
1020
880
  return ModernServer2;
1021
881
  }();
1022
882
  export {