@modern-js/prod-server 2.0.0-beta.2 → 2.0.0-beta.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/CHANGELOG.md +132 -0
- package/dist/js/modern/constants.js +32 -25
- package/dist/js/modern/index.js +11 -6
- package/dist/js/modern/libs/context/context.js +52 -84
- package/dist/js/modern/libs/context/index.js +5 -2
- package/dist/js/modern/libs/hook-api/index.js +42 -35
- package/dist/js/modern/libs/hook-api/route.js +6 -7
- package/dist/js/modern/libs/hook-api/template.js +20 -34
- package/dist/js/modern/libs/loadConfig.js +45 -24
- package/dist/js/modern/libs/metrics.js +3 -4
- package/dist/js/modern/libs/proxy.js +68 -37
- package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +112 -67
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +246 -216
- package/dist/js/modern/libs/render/cache/__tests__/cacheable.js +43 -49
- package/dist/js/modern/libs/render/cache/__tests__/error-configuration.js +36 -34
- package/dist/js/modern/libs/render/cache/__tests__/matched-cache.js +83 -113
- package/dist/js/modern/libs/render/cache/index.js +88 -54
- package/dist/js/modern/libs/render/cache/page-caches/index.js +31 -8
- package/dist/js/modern/libs/render/cache/page-caches/lru.js +6 -6
- package/dist/js/modern/libs/render/cache/spr.js +133 -117
- package/dist/js/modern/libs/render/cache/type.js +0 -1
- package/dist/js/modern/libs/render/cache/util.js +71 -39
- package/dist/js/modern/libs/render/index.js +76 -56
- package/dist/js/modern/libs/render/measure.js +38 -27
- package/dist/js/modern/libs/render/reader.js +65 -62
- package/dist/js/modern/libs/render/ssr.js +50 -32
- package/dist/js/modern/libs/render/static.js +50 -33
- package/dist/js/modern/libs/render/type.js +9 -6
- package/dist/js/modern/libs/route/index.js +8 -15
- package/dist/js/modern/libs/route/matcher.js +20 -34
- package/dist/js/modern/libs/route/route.js +9 -18
- package/dist/js/modern/libs/serve-file.js +33 -20
- package/dist/js/modern/server/index.js +144 -145
- package/dist/js/modern/server/modern-server-split.js +46 -12
- package/dist/js/modern/server/modern-server.js +377 -419
- package/dist/js/modern/type.js +0 -1
- package/dist/js/modern/utils.js +62 -43
- package/dist/js/modern/worker-server.js +34 -14
- package/dist/js/node/constants.js +45 -30
- package/dist/js/node/index.js +31 -57
- package/dist/js/node/libs/context/context.js +79 -94
- package/dist/js/node/libs/context/index.js +23 -13
- package/dist/js/node/libs/hook-api/index.js +69 -48
- package/dist/js/node/libs/hook-api/route.js +22 -11
- package/dist/js/node/libs/hook-api/template.js +36 -39
- package/dist/js/node/libs/loadConfig.js +69 -35
- package/dist/js/node/libs/metrics.js +21 -9
- package/dist/js/node/libs/proxy.js +86 -44
- package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +132 -70
- package/dist/js/node/libs/render/cache/__tests__/cache.test.js +268 -218
- package/dist/js/node/libs/render/cache/__tests__/cacheable.js +61 -55
- package/dist/js/node/libs/render/cache/__tests__/error-configuration.js +54 -40
- package/dist/js/node/libs/render/cache/__tests__/matched-cache.js +101 -119
- package/dist/js/node/libs/render/cache/index.js +110 -64
- package/dist/js/node/libs/render/cache/page-caches/index.js +50 -14
- package/dist/js/node/libs/render/cache/page-caches/lru.js +29 -12
- package/dist/js/node/libs/render/cache/spr.js +156 -129
- package/dist/js/node/libs/render/cache/type.js +0 -5
- package/dist/js/node/libs/render/cache/util.js +88 -45
- package/dist/js/node/libs/render/index.js +102 -67
- package/dist/js/node/libs/render/measure.js +55 -31
- package/dist/js/node/libs/render/reader.js +87 -70
- package/dist/js/node/libs/render/ssr.js +76 -47
- package/dist/js/node/libs/render/static.js +75 -40
- package/dist/js/node/libs/render/type.js +27 -12
- package/dist/js/node/libs/route/index.js +26 -26
- package/dist/js/node/libs/route/matcher.js +36 -41
- package/dist/js/node/libs/route/route.js +25 -22
- package/dist/js/node/libs/serve-file.js +61 -32
- package/dist/js/node/server/index.js +160 -160
- package/dist/js/node/server/modern-server-split.js +68 -22
- package/dist/js/node/server/modern-server.js +395 -443
- package/dist/js/node/type.js +0 -3
- package/dist/js/node/utils.js +74 -52
- package/dist/js/node/worker-server.js +53 -21
- package/dist/js/treeshaking/constants.js +26 -25
- package/dist/js/treeshaking/index.js +10 -10
- package/dist/js/treeshaking/libs/context/context.js +268 -237
- package/dist/js/treeshaking/libs/context/index.js +3 -3
- package/dist/js/treeshaking/libs/hook-api/index.js +265 -143
- package/dist/js/treeshaking/libs/hook-api/route.js +65 -30
- package/dist/js/treeshaking/libs/hook-api/template.js +121 -85
- package/dist/js/treeshaking/libs/loadConfig.js +80 -37
- package/dist/js/treeshaking/libs/metrics.js +4 -10
- package/dist/js/treeshaking/libs/proxy.js +240 -76
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +288 -121
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +772 -455
- package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +65 -51
- package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +45 -35
- package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +144 -118
- package/dist/js/treeshaking/libs/render/cache/index.js +337 -175
- package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +151 -27
- package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +80 -42
- package/dist/js/treeshaking/libs/render/cache/spr.js +470 -340
- package/dist/js/treeshaking/libs/render/cache/type.js +1 -1
- package/dist/js/treeshaking/libs/render/cache/util.js +271 -92
- package/dist/js/treeshaking/libs/render/index.js +228 -95
- package/dist/js/treeshaking/libs/render/measure.js +142 -57
- package/dist/js/treeshaking/libs/render/reader.js +325 -177
- package/dist/js/treeshaking/libs/render/ssr.js +220 -95
- package/dist/js/treeshaking/libs/render/static.js +210 -78
- package/dist/js/treeshaking/libs/render/type.js +7 -6
- package/dist/js/treeshaking/libs/route/index.js +125 -89
- package/dist/js/treeshaking/libs/route/matcher.js +132 -107
- package/dist/js/treeshaking/libs/route/route.js +40 -26
- package/dist/js/treeshaking/libs/serve-file.js +177 -68
- package/dist/js/treeshaking/server/index.js +468 -327
- package/dist/js/treeshaking/server/modern-server-split.js +352 -144
- package/dist/js/treeshaking/server/modern-server.js +1046 -911
- package/dist/js/treeshaking/type.js +1 -1
- package/dist/js/treeshaking/utils.js +138 -81
- package/dist/js/treeshaking/worker-server.js +176 -55
- package/dist/types/index.d.ts +2 -0
- package/dist/types/libs/context/context.d.ts +4 -1
- package/dist/types/libs/loadConfig.d.ts +1 -0
- package/dist/types/libs/render/cache/index.d.ts +2 -0
- package/dist/types/libs/render/cache/spr.d.ts +2 -0
- package/dist/types/libs/route/route.d.ts +0 -1
- package/dist/types/server/index.d.ts +3 -0
- package/dist/types/utils.d.ts +1 -1
- package/dist/types/worker-server.d.ts +1 -2
- package/package.json +7 -14
- package/dist/js/modern/libs/render/modern/browser-list.js +0 -7
- package/dist/js/modern/libs/render/modern/index.js +0 -37
- package/dist/js/node/libs/render/modern/browser-list.js +0 -14
- package/dist/js/node/libs/render/modern/index.js +0 -46
- package/dist/js/treeshaking/libs/render/modern/browser-list.js +0 -7
- package/dist/js/treeshaking/libs/render/modern/index.js +0 -39
- package/dist/types/libs/render/modern/browser-list.d.ts +0 -1
- package/dist/types/libs/render/modern/index.d.ts +0 -3
|
@@ -1,41 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.
|
|
4
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
+
mod
|
|
22
|
+
));
|
|
23
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
24
|
+
var stdin_exports = {};
|
|
25
|
+
__export(stdin_exports, {
|
|
26
|
+
ModernServer: () => ModernServer
|
|
5
27
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var reader =
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
module.exports = __toCommonJS(stdin_exports);
|
|
29
|
+
var import_http = require("http");
|
|
30
|
+
var import_util = __toESM(require("util"));
|
|
31
|
+
var import_path = __toESM(require("path"));
|
|
32
|
+
var import_utils = require("@modern-js/utils");
|
|
33
|
+
var import_route = require("../libs/route");
|
|
34
|
+
var import_render = require("../libs/render");
|
|
35
|
+
var import_serve_file = require("../libs/serve-file");
|
|
36
|
+
var import_utils2 = require("../utils");
|
|
37
|
+
var reader = __toESM(require("../libs/render/reader"));
|
|
38
|
+
var import_proxy = require("../libs/proxy");
|
|
39
|
+
var import_context = require("../libs/context");
|
|
40
|
+
var import_template = require("../libs/hook-api/template");
|
|
41
|
+
var import_constants = require("../constants");
|
|
42
|
+
var import_hook_api = require("../libs/hook-api");
|
|
43
|
+
var __defProp2 = Object.defineProperty;
|
|
44
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
45
|
+
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
|
46
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
47
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
48
|
+
var __spreadValues = (a, b) => {
|
|
49
|
+
for (var prop in b || (b = {}))
|
|
50
|
+
if (__hasOwnProp2.call(b, prop))
|
|
51
|
+
__defNormalProp(a, prop, b[prop]);
|
|
52
|
+
if (__getOwnPropSymbols)
|
|
53
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
54
|
+
if (__propIsEnum.call(b, prop))
|
|
55
|
+
__defNormalProp(a, prop, b[prop]);
|
|
56
|
+
}
|
|
57
|
+
return a;
|
|
58
|
+
};
|
|
59
|
+
var __objRest = (source, exclude) => {
|
|
60
|
+
var target = {};
|
|
61
|
+
for (var prop in source)
|
|
62
|
+
if (__hasOwnProp2.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
63
|
+
target[prop] = source[prop];
|
|
64
|
+
if (source != null && __getOwnPropSymbols)
|
|
65
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
66
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
67
|
+
target[prop] = source[prop];
|
|
68
|
+
}
|
|
69
|
+
return target;
|
|
70
|
+
};
|
|
71
|
+
var __async = (__this, __arguments, generator) => {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
var fulfilled = (value) => {
|
|
74
|
+
try {
|
|
75
|
+
step(generator.next(value));
|
|
76
|
+
} catch (e) {
|
|
77
|
+
reject(e);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var rejected = (value) => {
|
|
81
|
+
try {
|
|
82
|
+
step(generator.throw(value));
|
|
83
|
+
} catch (e) {
|
|
84
|
+
reject(e);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
88
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
const API_DIR = "./api";
|
|
92
|
+
const SERVER_DIR = "./server";
|
|
32
93
|
class ModernServer {
|
|
33
|
-
// appDirectory
|
|
34
|
-
|
|
35
|
-
// product dist dir
|
|
36
|
-
|
|
37
|
-
// work on src or dist
|
|
38
|
-
|
|
39
94
|
constructor({
|
|
40
95
|
pwd,
|
|
41
96
|
config,
|
|
@@ -46,471 +101,377 @@ class ModernServer {
|
|
|
46
101
|
runMode,
|
|
47
102
|
proxyTarget
|
|
48
103
|
}) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
_defineProperty(this, "runner", void 0);
|
|
57
|
-
_defineProperty(this, "logger", void 0);
|
|
58
|
-
_defineProperty(this, "metrics", void 0);
|
|
59
|
-
_defineProperty(this, "runMode", void 0);
|
|
60
|
-
_defineProperty(this, "reader", reader);
|
|
61
|
-
_defineProperty(this, "proxyTarget", void 0);
|
|
62
|
-
_defineProperty(this, "staticFileHandler", void 0);
|
|
63
|
-
_defineProperty(this, "routeRenderHandler", void 0);
|
|
64
|
-
_defineProperty(this, "beforeRouteHandler", null);
|
|
65
|
-
_defineProperty(this, "frameWebHandler", null);
|
|
66
|
-
_defineProperty(this, "frameAPIHandler", null);
|
|
67
|
-
_defineProperty(this, "proxyHandler", null);
|
|
68
|
-
_defineProperty(this, "_handler", void 0);
|
|
69
|
-
_defineProperty(this, "staticGenerate", void 0);
|
|
70
|
-
require('ignore-styles');
|
|
104
|
+
this.handlers = [];
|
|
105
|
+
this.reader = reader;
|
|
106
|
+
this.beforeRouteHandler = null;
|
|
107
|
+
this.frameWebHandler = null;
|
|
108
|
+
this.frameAPIHandler = null;
|
|
109
|
+
this.proxyHandler = null;
|
|
110
|
+
require("ignore-styles");
|
|
71
111
|
this.pwd = pwd;
|
|
72
|
-
this.distDir =
|
|
112
|
+
this.distDir = import_path.default.join(pwd, config.output.path || "dist");
|
|
73
113
|
this.workDir = this.distDir;
|
|
74
114
|
this.conf = config;
|
|
75
|
-
(0,
|
|
115
|
+
(0, import_utils2.debug)("server conf", this.conf);
|
|
76
116
|
this.logger = logger;
|
|
77
117
|
this.metrics = metrics;
|
|
78
|
-
this.router = new
|
|
118
|
+
this.router = new import_route.RouteMatchManager();
|
|
79
119
|
this.presetRoutes = routes;
|
|
80
120
|
this.proxyTarget = proxyTarget;
|
|
81
121
|
this.staticGenerate = staticGenerate || false;
|
|
82
|
-
this.runMode = runMode ||
|
|
83
|
-
// process.env.BUILD_TYPE = `${this.staticGenerate ? 'ssg' : 'ssr'}`;
|
|
122
|
+
this.runMode = runMode || import_constants.RUN_MODE.FULL;
|
|
84
123
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
this.addHandler(handler);
|
|
124
|
+
onInit(runner, app) {
|
|
125
|
+
return __async(this, null, function* () {
|
|
126
|
+
var _a;
|
|
127
|
+
this.runner = runner;
|
|
128
|
+
const { distDir, staticGenerate, conf } = this;
|
|
129
|
+
(0, import_utils2.debug)("final server conf", this.conf);
|
|
130
|
+
this.proxyHandler = (0, import_proxy.createProxyHandler)((_a = conf.bff) == null ? void 0 : _a.proxy);
|
|
131
|
+
if (this.proxyHandler) {
|
|
132
|
+
this.proxyHandler.forEach((handler) => {
|
|
133
|
+
this.addHandler(handler);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
this.reader.init();
|
|
137
|
+
app.on("close", () => {
|
|
138
|
+
this.reader.close();
|
|
101
139
|
});
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
staticGenerate
|
|
140
|
+
const usageRoutes = this.filterRoutes(this.getRoutes());
|
|
141
|
+
this.router.reset(usageRoutes);
|
|
142
|
+
this.warmupSSRBundle();
|
|
143
|
+
yield this.prepareFrameHandler();
|
|
144
|
+
yield this.prepareBeforeRouteHandler(usageRoutes, distDir);
|
|
145
|
+
const staticPathRegExp = (0, import_utils2.getStaticReg)(
|
|
146
|
+
this.conf.output || {},
|
|
147
|
+
this.conf.html
|
|
148
|
+
);
|
|
149
|
+
this.staticFileHandler = (0, import_serve_file.createStaticFileHandler)(
|
|
150
|
+
[
|
|
151
|
+
{
|
|
152
|
+
path: staticPathRegExp,
|
|
153
|
+
target: distDir
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
this.conf.output
|
|
157
|
+
);
|
|
158
|
+
this.routeRenderHandler = (0, import_render.createRenderHandler)({
|
|
159
|
+
distDir,
|
|
160
|
+
staticGenerate
|
|
161
|
+
});
|
|
162
|
+
yield this.setupBeforeProdMiddleware();
|
|
163
|
+
this.addHandler(this.staticFileHandler);
|
|
164
|
+
this.addHandler(import_serve_file.faviconFallbackHandler);
|
|
165
|
+
this.addBeforeRouteHandler();
|
|
166
|
+
this.addHandler(this.routeHandler.bind(this));
|
|
167
|
+
this.compose();
|
|
131
168
|
});
|
|
132
|
-
await this.setupBeforeProdMiddleware();
|
|
133
|
-
this.addHandler(this.staticFileHandler);
|
|
134
|
-
|
|
135
|
-
// execute after staticFileHandler, can rename to staticFallbackHandler if needed.
|
|
136
|
-
this.addHandler(_serveFile.faviconFallbackHandler);
|
|
137
|
-
this.addBeforeRouteHandler();
|
|
138
|
-
this.addHandler(this.routeHandler.bind(this));
|
|
139
|
-
|
|
140
|
-
// compose middlewares to http handler
|
|
141
|
-
this.compose();
|
|
142
169
|
}
|
|
143
|
-
|
|
144
|
-
// server ready
|
|
145
170
|
onRepack(_) {
|
|
146
|
-
// empty
|
|
147
171
|
}
|
|
148
172
|
addBeforeRouteHandler() {
|
|
149
|
-
this.addHandler(
|
|
173
|
+
this.addHandler((context, next) => __async(this, null, function* () {
|
|
150
174
|
if (this.beforeRouteHandler) {
|
|
151
|
-
|
|
175
|
+
yield this.beforeRouteHandler(context);
|
|
152
176
|
if (this.isSend(context.res)) {
|
|
153
177
|
return;
|
|
154
178
|
}
|
|
155
179
|
}
|
|
156
|
-
// eslint-disable-next-line consistent-return
|
|
157
180
|
return next();
|
|
158
|
-
});
|
|
181
|
+
}));
|
|
159
182
|
}
|
|
160
|
-
onServerChange({
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
} = this;
|
|
166
|
-
const {
|
|
167
|
-
api,
|
|
168
|
-
server
|
|
169
|
-
} = _constants.AGGRED_DIR;
|
|
170
|
-
const apiPath = _path.default.normalize(_path.default.join(pwd, api));
|
|
171
|
-
const serverPath = _path.default.normalize(_path.default.join(pwd, server));
|
|
183
|
+
onServerChange({ filepath }) {
|
|
184
|
+
const { pwd } = this;
|
|
185
|
+
const { api, server } = import_constants.AGGRED_DIR;
|
|
186
|
+
const apiPath = import_path.default.normalize(import_path.default.join(pwd, api));
|
|
187
|
+
const serverPath = import_path.default.normalize(import_path.default.join(pwd, server));
|
|
172
188
|
const onlyApi = filepath.startsWith(apiPath);
|
|
173
189
|
const onlyWeb = filepath.startsWith(serverPath);
|
|
174
|
-
this.prepareFrameHandler({
|
|
175
|
-
onlyWeb,
|
|
176
|
-
onlyApi
|
|
177
|
-
});
|
|
190
|
+
this.prepareFrameHandler({ onlyWeb, onlyApi });
|
|
178
191
|
}
|
|
179
|
-
|
|
180
|
-
// exposed requestHandler
|
|
181
192
|
getRequestHandler() {
|
|
182
193
|
return this.requestHandler.bind(this);
|
|
183
194
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
195
|
+
render(req, res, url) {
|
|
196
|
+
return __async(this, null, function* () {
|
|
197
|
+
req.logger = this.logger;
|
|
198
|
+
req.metrics = this.metrics;
|
|
199
|
+
const context = (0, import_context.createContext)(req, res);
|
|
200
|
+
const matched = this.router.match(url || context.path);
|
|
201
|
+
if (!matched) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
const route = matched.generate(context.url);
|
|
205
|
+
const result = yield this.handleWeb(context, route);
|
|
206
|
+
if (!result) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
return result.content.toString();
|
|
210
|
+
});
|
|
198
211
|
}
|
|
199
|
-
|
|
200
|
-
return (
|
|
212
|
+
createHTTPServer(handler) {
|
|
213
|
+
return __async(this, null, function* () {
|
|
214
|
+
return (0, import_http.createServer)(handler);
|
|
215
|
+
});
|
|
201
216
|
}
|
|
202
|
-
|
|
203
|
-
/* —————————————————————— function will be overwrite —————————————————————— */
|
|
204
|
-
// get routes info
|
|
205
217
|
getRoutes() {
|
|
206
|
-
// Preferred to use preset routes
|
|
207
218
|
if (this.presetRoutes) {
|
|
208
219
|
return this.presetRoutes;
|
|
209
220
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
if (_utils.fs.existsSync(file)) {
|
|
214
|
-
const content = _utils.fs.readJSONSync(file);
|
|
221
|
+
const file = import_path.default.join(this.distDir, import_utils.ROUTE_SPEC_FILE);
|
|
222
|
+
if (import_utils.fs.existsSync(file)) {
|
|
223
|
+
const content = import_utils.fs.readJSONSync(file);
|
|
215
224
|
return content.routes;
|
|
216
225
|
}
|
|
217
226
|
return [];
|
|
218
227
|
}
|
|
219
|
-
|
|
220
|
-
// add promisify request handler to server
|
|
221
|
-
// handler should do not do more things after invoke next
|
|
222
228
|
addHandler(handler) {
|
|
223
|
-
if (handler[Symbol.toStringTag] ===
|
|
229
|
+
if (handler[Symbol.toStringTag] === "AsyncFunction") {
|
|
224
230
|
this.handlers.push(handler);
|
|
225
231
|
} else {
|
|
226
|
-
this.handlers.push(
|
|
232
|
+
this.handlers.push(import_util.default.promisify(handler));
|
|
227
233
|
}
|
|
228
234
|
}
|
|
229
|
-
|
|
230
|
-
// return 404 page
|
|
231
235
|
render404(context) {
|
|
232
|
-
context.error(
|
|
236
|
+
context.error(import_constants.ERROR_DIGEST.ENOTF, "404 Not Found");
|
|
233
237
|
this.renderErrorPage(context, 404);
|
|
234
238
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
runner
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
239
|
+
prepareBeforeRouteHandler(specs, distDir) {
|
|
240
|
+
return __async(this, null, function* () {
|
|
241
|
+
const { runner } = this;
|
|
242
|
+
const handler = yield runner.preparebeforeRouteHandler(
|
|
243
|
+
{
|
|
244
|
+
serverRoutes: specs,
|
|
245
|
+
distDir
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
onLast: () => null
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
this.beforeRouteHandler = handler;
|
|
244
252
|
});
|
|
245
|
-
this.beforeRouteHandler = handler;
|
|
246
253
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
runner
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
await runner.gather(collector);
|
|
266
|
-
const {
|
|
267
|
-
api: pluginAPIExt,
|
|
268
|
-
web: pluginWebExt
|
|
269
|
-
} = getMiddlewares();
|
|
270
|
-
const apiDir = _path.default.join(workDir, API_DIR);
|
|
271
|
-
const serverDir = _path.default.join(workDir, SERVER_DIR);
|
|
272
|
-
|
|
273
|
-
// get api or web server handler from server-framework plugin
|
|
274
|
-
if ((await _utils.fs.pathExists(_path.default.join(serverDir))) && !onlyApi) {
|
|
275
|
-
const webExtension = (0, _utils2.mergeExtension)(pluginWebExt);
|
|
276
|
-
this.frameWebHandler = await this.prepareWebHandler(webExtension);
|
|
277
|
-
}
|
|
278
|
-
if (_utils.fs.existsSync(apiDir) && !onlyWeb) {
|
|
279
|
-
const apiExtension = (0, _utils2.mergeExtension)(pluginAPIExt);
|
|
280
|
-
this.frameAPIHandler = await this.prepareAPIHandler(apiExtension);
|
|
281
|
-
}
|
|
254
|
+
prepareFrameHandler(options) {
|
|
255
|
+
return __async(this, null, function* () {
|
|
256
|
+
const { workDir, runner } = this;
|
|
257
|
+
const { onlyApi, onlyWeb } = options || {};
|
|
258
|
+
const _a = (0, import_utils2.createMiddlewareCollecter)(), { getMiddlewares } = _a, collector = __objRest(_a, ["getMiddlewares"]);
|
|
259
|
+
yield runner.gather(collector);
|
|
260
|
+
const { api: pluginAPIExt, web: pluginWebExt } = getMiddlewares();
|
|
261
|
+
const apiDir = import_path.default.join(workDir, API_DIR);
|
|
262
|
+
const serverDir = import_path.default.join(workDir, SERVER_DIR);
|
|
263
|
+
if ((yield import_utils.fs.pathExists(import_path.default.join(serverDir))) && !onlyApi) {
|
|
264
|
+
const webExtension = (0, import_utils2.mergeExtension)(pluginWebExt);
|
|
265
|
+
this.frameWebHandler = yield this.prepareWebHandler(webExtension);
|
|
266
|
+
}
|
|
267
|
+
if (import_utils.fs.existsSync(apiDir) && !onlyWeb) {
|
|
268
|
+
const apiExtension = (0, import_utils2.mergeExtension)(pluginAPIExt);
|
|
269
|
+
this.frameAPIHandler = yield this.prepareAPIHandler(apiExtension);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
282
272
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
workDir,
|
|
286
|
-
runner
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
273
|
+
prepareWebHandler(extension) {
|
|
274
|
+
return __async(this, null, function* () {
|
|
275
|
+
const { workDir, runner } = this;
|
|
276
|
+
const handler = yield runner.prepareWebServer(
|
|
277
|
+
{
|
|
278
|
+
pwd: workDir,
|
|
279
|
+
config: extension
|
|
280
|
+
},
|
|
281
|
+
{ onLast: () => null }
|
|
282
|
+
);
|
|
283
|
+
return handler;
|
|
293
284
|
});
|
|
294
|
-
return handler;
|
|
295
285
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
workDir,
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
prefix: Array.isArray(prefix) ? prefix[0] : prefix
|
|
310
|
-
}, {
|
|
311
|
-
onLast: () => null
|
|
286
|
+
prepareAPIHandler(extension) {
|
|
287
|
+
return __async(this, null, function* () {
|
|
288
|
+
const { workDir, runner, conf } = this;
|
|
289
|
+
const { bff } = conf;
|
|
290
|
+
const prefix = (bff == null ? void 0 : bff.prefix) || "/api";
|
|
291
|
+
return runner.prepareApiServer(
|
|
292
|
+
{
|
|
293
|
+
pwd: workDir,
|
|
294
|
+
config: extension,
|
|
295
|
+
prefix: Array.isArray(prefix) ? prefix[0] : prefix
|
|
296
|
+
},
|
|
297
|
+
{ onLast: () => null }
|
|
298
|
+
);
|
|
312
299
|
});
|
|
313
300
|
}
|
|
314
301
|
filterRoutes(routes) {
|
|
315
302
|
return routes;
|
|
316
303
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
conf,
|
|
320
|
-
runner
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
this.addHandler(mid);
|
|
304
|
+
setupBeforeProdMiddleware() {
|
|
305
|
+
return __async(this, null, function* () {
|
|
306
|
+
const { conf, runner } = this;
|
|
307
|
+
const preMiddleware = yield runner.beforeProdServer(conf);
|
|
308
|
+
preMiddleware.flat().forEach((mid) => {
|
|
309
|
+
this.addHandler(mid);
|
|
310
|
+
});
|
|
325
311
|
});
|
|
326
312
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
req,
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
await this.frameAPIHandler(req, res);
|
|
313
|
+
handleAPI(context) {
|
|
314
|
+
return __async(this, null, function* () {
|
|
315
|
+
const { req, res } = context;
|
|
316
|
+
if (!this.frameAPIHandler) {
|
|
317
|
+
throw new Error("can not found api handler");
|
|
318
|
+
}
|
|
319
|
+
yield this.frameAPIHandler(req, res);
|
|
320
|
+
});
|
|
336
321
|
}
|
|
337
|
-
|
|
338
|
-
return this
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
322
|
+
handleWeb(context, route) {
|
|
323
|
+
return __async(this, null, function* () {
|
|
324
|
+
return this.routeRenderHandler({
|
|
325
|
+
ctx: context,
|
|
326
|
+
route,
|
|
327
|
+
runner: this.runner
|
|
328
|
+
});
|
|
342
329
|
});
|
|
343
330
|
}
|
|
344
|
-
|
|
345
|
-
return null
|
|
331
|
+
proxy() {
|
|
332
|
+
return __async(this, null, function* () {
|
|
333
|
+
return null;
|
|
334
|
+
});
|
|
346
335
|
}
|
|
347
|
-
|
|
348
|
-
// warmup ssr function
|
|
349
336
|
warmupSSRBundle() {
|
|
350
|
-
const {
|
|
351
|
-
distDir
|
|
352
|
-
} = this;
|
|
337
|
+
const { distDir } = this;
|
|
353
338
|
const bundles = this.router.getBundles();
|
|
354
|
-
bundles.forEach(bundle => {
|
|
355
|
-
const filepath =
|
|
356
|
-
// if error, just throw and let process die
|
|
339
|
+
bundles.forEach((bundle) => {
|
|
340
|
+
const filepath = import_path.default.join(distDir, bundle);
|
|
357
341
|
require(filepath);
|
|
358
342
|
});
|
|
359
343
|
}
|
|
360
344
|
createContext(req, res, options = {}) {
|
|
361
|
-
return (0,
|
|
345
|
+
return (0, import_context.createContext)(req, res, options);
|
|
362
346
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
const {
|
|
368
|
-
res
|
|
369
|
-
} = context;
|
|
370
|
-
|
|
371
|
-
// match routes in the route spec
|
|
372
|
-
const matched = this.router.match(context.path);
|
|
373
|
-
if (!matched) {
|
|
374
|
-
this.render404(context);
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// route is api service
|
|
379
|
-
let route = matched.generate(context.url);
|
|
380
|
-
if (route.isApi) {
|
|
381
|
-
await this.handleAPI(context);
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
const afterMatchContext = (0, _hookApi.createAfterMatchContext)(context, route.entryName);
|
|
385
|
-
|
|
386
|
-
// only full mode run server hook
|
|
387
|
-
if (this.runMode === _constants.RUN_MODE.FULL) {
|
|
388
|
-
await this.runner.afterMatch(afterMatchContext, {
|
|
389
|
-
onLast: _utils2.noop
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
if (this.isSend(res)) {
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
const {
|
|
396
|
-
current,
|
|
397
|
-
url,
|
|
398
|
-
status
|
|
399
|
-
} = afterMatchContext.router;
|
|
400
|
-
// redirect to another url
|
|
401
|
-
if (url) {
|
|
402
|
-
this.redirect(res, url, status);
|
|
403
|
-
return;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// rewrite to another entry
|
|
407
|
-
if (route.entryName !== current) {
|
|
408
|
-
const matched = this.router.matchEntry(current);
|
|
347
|
+
routeHandler(context) {
|
|
348
|
+
return __async(this, null, function* () {
|
|
349
|
+
const { res } = context;
|
|
350
|
+
const matched = this.router.match(context.path);
|
|
409
351
|
if (!matched) {
|
|
410
352
|
this.render404(context);
|
|
411
353
|
return;
|
|
412
354
|
}
|
|
413
|
-
route = matched.generate(context.url);
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
context.res.setHeader(key, value);
|
|
355
|
+
let route = matched.generate(context.url);
|
|
356
|
+
if (route.isApi) {
|
|
357
|
+
yield this.handleAPI(context);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
const afterMatchContext = (0, import_hook_api.createAfterMatchContext)(context, route.entryName);
|
|
361
|
+
if (this.runMode === import_constants.RUN_MODE.FULL) {
|
|
362
|
+
yield this.runner.afterMatch(afterMatchContext, { onLast: import_utils2.noop });
|
|
363
|
+
}
|
|
364
|
+
if (this.isSend(res)) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const { current, url, status } = afterMatchContext.router;
|
|
368
|
+
if (url) {
|
|
369
|
+
this.redirect(res, url, status);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
if (route.entryName !== current) {
|
|
373
|
+
const matched2 = this.router.matchEntry(current);
|
|
374
|
+
if (!matched2) {
|
|
375
|
+
this.render404(context);
|
|
376
|
+
return;
|
|
436
377
|
}
|
|
378
|
+
route = matched2.generate(context.url);
|
|
379
|
+
}
|
|
380
|
+
context.setParams(route.params);
|
|
381
|
+
context.setServerData("router", {
|
|
382
|
+
baseUrl: route.urlPath,
|
|
383
|
+
params: route.params
|
|
437
384
|
});
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
res.setHeader('content-type', renderResult.contentType);
|
|
454
|
-
const {
|
|
455
|
-
contentStream
|
|
456
|
-
} = renderResult;
|
|
457
|
-
if (contentStream) {
|
|
458
|
-
contentStream.pipe((0, _template.templateInjectableStream)({
|
|
459
|
-
prependHead: route.entryName ? `<script>window._SERVER_DATA=${JSON.stringify(context.serverData)}</script>` : undefined
|
|
460
|
-
})).pipe(res);
|
|
461
|
-
return;
|
|
462
|
-
}
|
|
463
|
-
let response = renderResult.content;
|
|
464
|
-
if (route.entryName) {
|
|
465
|
-
const afterRenderContext = (0, _hookApi.createAfterRenderContext)(context, response.toString());
|
|
466
|
-
|
|
467
|
-
// only full mode run server hook
|
|
468
|
-
// FIXME: how to run server hook in streaming
|
|
469
|
-
if (this.runMode === _constants.RUN_MODE.FULL) {
|
|
470
|
-
await this.runner.afterRender(afterRenderContext, {
|
|
471
|
-
onLast: _utils2.noop
|
|
385
|
+
if (this.frameWebHandler) {
|
|
386
|
+
res.locals = res.locals || {};
|
|
387
|
+
const middlewareContext = (0, import_hook_api.createMiddlewareContext)(context);
|
|
388
|
+
yield this.frameWebHandler(middlewareContext);
|
|
389
|
+
res.locals = __spreadValues(__spreadValues({}, res.locals), middlewareContext.response.locals);
|
|
390
|
+
}
|
|
391
|
+
if (this.isSend(res)) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
if (route.responseHeaders) {
|
|
395
|
+
Object.keys(route.responseHeaders).forEach((key) => {
|
|
396
|
+
const value = route.responseHeaders[key];
|
|
397
|
+
if (value) {
|
|
398
|
+
context.res.setHeader(key, value);
|
|
399
|
+
}
|
|
472
400
|
});
|
|
473
401
|
}
|
|
402
|
+
const renderResult = yield this.handleWeb(context, route);
|
|
403
|
+
if (!renderResult) {
|
|
404
|
+
this.render404(context);
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
if (renderResult.redirect) {
|
|
408
|
+
this.redirect(
|
|
409
|
+
res,
|
|
410
|
+
renderResult.content,
|
|
411
|
+
renderResult.statusCode
|
|
412
|
+
);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
474
415
|
if (this.isSend(res)) {
|
|
475
416
|
return;
|
|
476
417
|
}
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
418
|
+
res.setHeader("content-type", renderResult.contentType);
|
|
419
|
+
const { contentStream } = renderResult;
|
|
420
|
+
if (contentStream) {
|
|
421
|
+
contentStream.pipe(
|
|
422
|
+
(0, import_template.templateInjectableStream)({
|
|
423
|
+
prependHead: route.entryName ? `<script>window._SERVER_DATA=${JSON.stringify(
|
|
424
|
+
context.serverData
|
|
425
|
+
)}<\/script>` : void 0
|
|
426
|
+
})
|
|
427
|
+
).pipe(res);
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
let response = renderResult.content;
|
|
431
|
+
if (route.entryName) {
|
|
432
|
+
const afterRenderContext = (0, import_hook_api.createAfterRenderContext)(
|
|
433
|
+
context,
|
|
434
|
+
response.toString()
|
|
435
|
+
);
|
|
436
|
+
if (this.runMode === import_constants.RUN_MODE.FULL) {
|
|
437
|
+
yield this.runner.afterRender(afterRenderContext, { onLast: import_utils2.noop });
|
|
438
|
+
}
|
|
439
|
+
if (this.isSend(res)) {
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
afterRenderContext.template.prependHead(
|
|
443
|
+
`<script>window._SERVER_DATA=${JSON.stringify(
|
|
444
|
+
context.serverData
|
|
445
|
+
)}<\/script>`
|
|
446
|
+
);
|
|
447
|
+
response = afterRenderContext.template.get();
|
|
448
|
+
}
|
|
449
|
+
res.end(response);
|
|
450
|
+
});
|
|
486
451
|
}
|
|
487
452
|
isSend(res) {
|
|
488
453
|
if (res.headersSent) {
|
|
489
454
|
return true;
|
|
490
455
|
}
|
|
491
|
-
if (res.getHeader(
|
|
456
|
+
if (res.getHeader("Location") && (0, import_utils2.isRedirect)(res.statusCode)) {
|
|
492
457
|
res.end();
|
|
493
458
|
return true;
|
|
494
459
|
}
|
|
495
460
|
return false;
|
|
496
461
|
}
|
|
497
|
-
|
|
498
|
-
// compose handlers and create the final handler
|
|
499
462
|
compose() {
|
|
500
|
-
const {
|
|
501
|
-
handlers
|
|
502
|
-
} = this;
|
|
463
|
+
const { handlers } = this;
|
|
503
464
|
if (!Array.isArray(handlers)) {
|
|
504
|
-
throw new TypeError(
|
|
465
|
+
throw new TypeError("Middleware stack must be an array!");
|
|
505
466
|
}
|
|
506
467
|
for (const fn of handlers) {
|
|
507
|
-
if (typeof fn !==
|
|
508
|
-
throw new TypeError(
|
|
468
|
+
if (typeof fn !== "function") {
|
|
469
|
+
throw new TypeError("Middleware must be composed of functions!");
|
|
509
470
|
}
|
|
510
471
|
}
|
|
511
472
|
this._handler = (context, next) => {
|
|
512
473
|
let i = 0;
|
|
513
|
-
const dispatch = error => {
|
|
474
|
+
const dispatch = (error) => {
|
|
514
475
|
if (error) {
|
|
515
476
|
return this.onError(context, error);
|
|
516
477
|
}
|
|
@@ -520,14 +481,13 @@ class ModernServer {
|
|
|
520
481
|
}
|
|
521
482
|
return handler(context, dispatch).catch(onError);
|
|
522
483
|
};
|
|
523
|
-
const onError = err => {
|
|
484
|
+
const onError = (err) => {
|
|
524
485
|
this.onError(context, err);
|
|
525
486
|
};
|
|
526
487
|
return dispatch();
|
|
527
488
|
};
|
|
528
489
|
}
|
|
529
490
|
requestHandler(req, res, next = () => {
|
|
530
|
-
// empty
|
|
531
491
|
}) {
|
|
532
492
|
res.statusCode = 200;
|
|
533
493
|
req.logger = this.logger;
|
|
@@ -538,8 +498,8 @@ class ModernServer {
|
|
|
538
498
|
} catch (e) {
|
|
539
499
|
this.logger.error(e);
|
|
540
500
|
res.statusCode = 500;
|
|
541
|
-
res.setHeader(
|
|
542
|
-
return res.end((0,
|
|
501
|
+
res.setHeader("content-type", import_utils.mime.contentType("html"));
|
|
502
|
+
return res.end((0, import_utils2.createErrorDocument)(500, import_constants.ERROR_PAGE_TEXT[500]));
|
|
543
503
|
}
|
|
544
504
|
try {
|
|
545
505
|
return this._handler(context, next);
|
|
@@ -548,50 +508,42 @@ class ModernServer {
|
|
|
548
508
|
}
|
|
549
509
|
}
|
|
550
510
|
redirect(res, url, status = 302) {
|
|
551
|
-
res.setHeader(
|
|
511
|
+
res.setHeader("Location", url);
|
|
552
512
|
res.statusCode = status;
|
|
553
513
|
res.end();
|
|
554
514
|
}
|
|
555
515
|
onError(context, err) {
|
|
556
|
-
context.error(
|
|
516
|
+
context.error(import_constants.ERROR_DIGEST.EINTER, err);
|
|
557
517
|
this.renderErrorPage(context, 500);
|
|
558
518
|
}
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
res
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
});
|
|
583
|
-
if (file) {
|
|
584
|
-
context.res.end(file.content);
|
|
585
|
-
return;
|
|
519
|
+
renderErrorPage(context, status) {
|
|
520
|
+
return __async(this, null, function* () {
|
|
521
|
+
const { res } = context;
|
|
522
|
+
context.status = status;
|
|
523
|
+
res.setHeader("content-type", import_utils.mime.contentType("html"));
|
|
524
|
+
const statusPage = `/${status}`;
|
|
525
|
+
const customErrorPage = `/_error`;
|
|
526
|
+
const matched = this.router.match(statusPage) || this.router.match(customErrorPage);
|
|
527
|
+
if (matched) {
|
|
528
|
+
const route = matched.generate(context.url);
|
|
529
|
+
const { entryName } = route;
|
|
530
|
+
if (entryName === status.toString() || entryName === "_error") {
|
|
531
|
+
try {
|
|
532
|
+
const file = yield this.routeRenderHandler({
|
|
533
|
+
route,
|
|
534
|
+
ctx: context,
|
|
535
|
+
runner: this.runner
|
|
536
|
+
});
|
|
537
|
+
if (file) {
|
|
538
|
+
context.res.end(file.content);
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
} catch (e) {
|
|
586
542
|
}
|
|
587
|
-
} catch (e) {
|
|
588
|
-
// just catch error when the rendering error occurred in the custom error page.
|
|
589
543
|
}
|
|
590
544
|
}
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
545
|
+
const text = import_constants.ERROR_PAGE_TEXT[status] || import_constants.ERROR_PAGE_TEXT[500];
|
|
546
|
+
context.res.end((0, import_utils2.createErrorDocument)(status, text));
|
|
547
|
+
});
|
|
594
548
|
}
|
|
595
549
|
}
|
|
596
|
-
/* eslint-enable max-lines */
|
|
597
|
-
exports.ModernServer = ModernServer;
|