@modern-js/prod-server 2.28.0 → 2.29.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.
- package/CHANGELOG.md +22 -0
- package/dist/cjs/libs/context/context.js +10 -4
- package/dist/cjs/libs/hook-api/index.js +2 -1
- package/dist/cjs/libs/hook-api/index.worker.js +2 -1
- package/dist/cjs/libs/render/ssr.js +3 -19
- package/dist/cjs/libs/reporter.js +22 -0
- package/dist/cjs/libs/serverTiming.js +27 -0
- package/dist/cjs/server/modernServer.js +23 -2
- package/dist/cjs/utils.js +33 -0
- package/dist/cjs/workerServer.js +12 -3
- package/dist/esm/libs/context/context.js +8 -2
- package/dist/esm/libs/hook-api/index.js +2 -1
- package/dist/esm/libs/hook-api/index.worker.js +2 -1
- package/dist/esm/libs/render/ssr.js +6 -29
- package/dist/esm/libs/reporter.js +12 -0
- package/dist/esm/libs/serverTiming.js +27 -0
- package/dist/esm/server/modernServer.js +57 -26
- package/dist/esm/utils.js +57 -0
- package/dist/esm/workerServer.js +13 -4
- package/dist/esm-node/libs/context/context.js +8 -2
- package/dist/esm-node/libs/hook-api/index.js +2 -1
- package/dist/esm-node/libs/hook-api/index.worker.js +2 -1
- package/dist/esm-node/libs/render/ssr.js +3 -19
- package/dist/esm-node/libs/reporter.js +12 -0
- package/dist/esm-node/libs/serverTiming.js +17 -0
- package/dist/esm-node/server/modernServer.js +24 -3
- package/dist/esm-node/utils.js +30 -0
- package/dist/esm-node/workerServer.js +12 -3
- package/dist/types/libs/context/context.d.ts +5 -2
- package/dist/types/libs/hook-api/index.worker.d.ts +2 -1
- package/dist/types/libs/reporter.d.ts +2 -0
- package/dist/types/libs/serverTiming.d.ts +12 -0
- package/dist/types/server/modernServer.d.ts +1 -1
- package/dist/types/type.d.ts +1 -0
- package/dist/types/utils.d.ts +3 -2
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @modern-js/prod-server
|
|
2
2
|
|
|
3
|
+
## 2.29.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 16e5195: feat(prod-server): add body parser
|
|
8
|
+
feat(prod-server): 增加 body 解析器
|
|
9
|
+
- cba7675: feat: add a server reporter that report server cost, logger about error, info etc.
|
|
10
|
+
feat: 添加一个 server 端 reporter,来报告 server 端耗时,报错等
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 76ace5d: fix(prod-server): bff may run bodyParser by themself, so we need't to run
|
|
15
|
+
fix(prod-server): bff 可能会在内部运行, 所以我们不需要运行
|
|
16
|
+
- Updated dependencies [e6b5355]
|
|
17
|
+
- Updated dependencies [93db783]
|
|
18
|
+
- Updated dependencies [cba7675]
|
|
19
|
+
- Updated dependencies [99052ea]
|
|
20
|
+
- Updated dependencies [1d71d2e]
|
|
21
|
+
- @modern-js/utils@2.29.0
|
|
22
|
+
- @modern-js/server-core@2.29.0
|
|
23
|
+
- @modern-js/plugin@2.29.0
|
|
24
|
+
|
|
3
25
|
## 2.28.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
|
@@ -15,7 +15,10 @@ const _querystring = /* @__PURE__ */ _interop_require_default._(require("queryst
|
|
|
15
15
|
const _buffer = require("buffer");
|
|
16
16
|
const _etag = /* @__PURE__ */ _interop_require_default._(require("etag"));
|
|
17
17
|
const _fresh = /* @__PURE__ */ _interop_require_default._(require("fresh"));
|
|
18
|
-
const _utils = require("
|
|
18
|
+
const _utils = require("@modern-js/utils");
|
|
19
|
+
const _serverTiming = require("../serverTiming");
|
|
20
|
+
const _reporter = require("../reporter");
|
|
21
|
+
const _utils1 = require("../../utils");
|
|
19
22
|
const MOCK_URL_BASE = "https://modernjs.dev/";
|
|
20
23
|
class ModernServerContext {
|
|
21
24
|
get logger() {
|
|
@@ -157,18 +160,21 @@ class ModernServerContext {
|
|
|
157
160
|
return this.res.writableEnded;
|
|
158
161
|
}
|
|
159
162
|
error(dig, e = "") {
|
|
160
|
-
this.logger.error(`Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, this.path, (0,
|
|
163
|
+
this.logger.error(`Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, this.path, (0, _utils1.headersWithoutCookie)(this.headers));
|
|
161
164
|
}
|
|
162
165
|
constructor(req, res, options) {
|
|
166
|
+
var _options;
|
|
163
167
|
_define_property._(this, "req", void 0);
|
|
164
168
|
_define_property._(this, "res", void 0);
|
|
165
169
|
_define_property._(this, "params", {});
|
|
166
|
-
_define_property._(this, "
|
|
170
|
+
_define_property._(this, "reporter", _reporter.defaultReporter);
|
|
171
|
+
_define_property._(this, "serverTiming", void 0);
|
|
172
|
+
_define_property._(this, "serverData", {});
|
|
167
173
|
_define_property._(this, "options", {});
|
|
168
174
|
this.req = req;
|
|
169
175
|
this.res = res;
|
|
170
176
|
this.options = options || {};
|
|
171
|
-
this.
|
|
177
|
+
this.serverTiming = new _serverTiming.ServerTiming(res, (0, _utils.cutNameByHyphen)(((_options = options) === null || _options === void 0 ? void 0 : _options.metaName) || "modern-js"));
|
|
172
178
|
this.bind();
|
|
173
179
|
}
|
|
174
180
|
}
|
|
@@ -27,10 +27,11 @@ const _route = require("./route");
|
|
|
27
27
|
const _template = require("./template");
|
|
28
28
|
const _base = require("./base");
|
|
29
29
|
const base = (context) => {
|
|
30
|
-
const { res } = context;
|
|
30
|
+
const { res, reporter } = context;
|
|
31
31
|
return {
|
|
32
32
|
response: new _base.BaseResponse(res),
|
|
33
33
|
request: new _base.BaseRequest(context),
|
|
34
|
+
reporter,
|
|
34
35
|
logger: context.logger,
|
|
35
36
|
metrics: context.metrics
|
|
36
37
|
};
|
|
@@ -56,7 +56,7 @@ class ServerResponse {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
const base = (context) => {
|
|
59
|
-
const { req, res, logger, metrics } = context;
|
|
59
|
+
const { req, res, logger, metrics, reporter } = context;
|
|
60
60
|
const serverResponse = new ServerResponse(res);
|
|
61
61
|
const { host, pathname, searchParams } = new URL(req.url);
|
|
62
62
|
const headers = {};
|
|
@@ -65,6 +65,7 @@ const base = (context) => {
|
|
|
65
65
|
});
|
|
66
66
|
return {
|
|
67
67
|
response: new _base.BaseResponse(serverResponse),
|
|
68
|
+
reporter,
|
|
68
69
|
request: new _base.BaseRequest({
|
|
69
70
|
url: req.url,
|
|
70
71
|
host,
|
|
@@ -22,7 +22,6 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
22
22
|
const loadableStats = _utils.fs.existsSync(loadableUri) ? require(loadableUri) : "";
|
|
23
23
|
const routesManifestUri = _path.default.join(distDir, _utils.ROUTE_MANIFEST_FILE);
|
|
24
24
|
const routeManifest = _utils.fs.existsSync(routesManifestUri) ? require(routesManifestUri) : void 0;
|
|
25
|
-
const body = await getRequestBody(ctx.req);
|
|
26
25
|
const context = {
|
|
27
26
|
request: {
|
|
28
27
|
baseUrl: urlPath,
|
|
@@ -32,7 +31,7 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
32
31
|
query: ctx.query,
|
|
33
32
|
url: ctx.href,
|
|
34
33
|
headers: ctx.headers,
|
|
35
|
-
body
|
|
34
|
+
body: ctx.req.body
|
|
36
35
|
},
|
|
37
36
|
response: {
|
|
38
37
|
setHeader: (key, value) => {
|
|
@@ -51,6 +50,8 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
51
50
|
staticGenerate,
|
|
52
51
|
logger: void 0,
|
|
53
52
|
metrics: void 0,
|
|
53
|
+
reporter: ctx.reporter,
|
|
54
|
+
serverTiming: ctx.serverTiming,
|
|
54
55
|
req: ctx.req,
|
|
55
56
|
res: ctx.res,
|
|
56
57
|
enableUnsafeCtx,
|
|
@@ -84,20 +85,3 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
84
85
|
};
|
|
85
86
|
}
|
|
86
87
|
};
|
|
87
|
-
const getRequestBody = (req) => new Promise((resolve, reject) => {
|
|
88
|
-
var _req;
|
|
89
|
-
if (((_req = req) === null || _req === void 0 ? void 0 : _req.method) && req.method.toLowerCase() !== "get") {
|
|
90
|
-
let body = "";
|
|
91
|
-
req.on("data", (chunk) => {
|
|
92
|
-
body += chunk.toString();
|
|
93
|
-
});
|
|
94
|
-
req.on("end", () => {
|
|
95
|
-
resolve(body);
|
|
96
|
-
});
|
|
97
|
-
req.on("error", (err) => {
|
|
98
|
-
reject(err);
|
|
99
|
-
});
|
|
100
|
-
} else {
|
|
101
|
-
resolve(void 0);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "defaultReporter", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return defaultReporter;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const defaultReporter = {
|
|
12
|
+
init() {
|
|
13
|
+
},
|
|
14
|
+
reportError() {
|
|
15
|
+
},
|
|
16
|
+
reportTiming() {
|
|
17
|
+
},
|
|
18
|
+
reportInfo() {
|
|
19
|
+
},
|
|
20
|
+
reportWarn() {
|
|
21
|
+
}
|
|
22
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "ServerTiming", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return ServerTiming;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _define_property = require("@swc/helpers/_/_define_property");
|
|
12
|
+
const SERVER_TIMING = "Server-Timing";
|
|
13
|
+
class ServerTiming {
|
|
14
|
+
addServeTiming(name, dur, desc) {
|
|
15
|
+
const _name = `bd-${this.meta}-${name}`;
|
|
16
|
+
const serverTiming = this.res.getHeader(SERVER_TIMING) || this.res.getHeader(SERVER_TIMING.toLocaleLowerCase());
|
|
17
|
+
const value = `${_name};${desc ? `decs="${desc}";` : ""} dur=${dur}`;
|
|
18
|
+
this.res.setHeader(SERVER_TIMING, serverTiming ? `${serverTiming}, ${value}` : value);
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
constructor(res, meta) {
|
|
22
|
+
_define_property._(this, "meta", void 0);
|
|
23
|
+
_define_property._(this, "res", void 0);
|
|
24
|
+
this.meta = meta;
|
|
25
|
+
this.res = res;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -14,6 +14,7 @@ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildc
|
|
|
14
14
|
const _http = require("http");
|
|
15
15
|
const _path = /* @__PURE__ */ _interop_require_default._(require("path"));
|
|
16
16
|
const _utils = require("@modern-js/utils");
|
|
17
|
+
const _time = require("@modern-js/utils/universal/time");
|
|
17
18
|
const _route = require("../libs/route");
|
|
18
19
|
const _render = require("../libs/render");
|
|
19
20
|
const _serveFile = require("../libs/serveFile");
|
|
@@ -76,7 +77,9 @@ class ModernServer {
|
|
|
76
77
|
async render(req, res, url) {
|
|
77
78
|
req.logger = req.logger || this.logger;
|
|
78
79
|
req.metrics = req.metrics || this.metrics;
|
|
79
|
-
const context = (0, _context.createContext)(req, res
|
|
80
|
+
const context = (0, _context.createContext)(req, res, {
|
|
81
|
+
metaName: this.metaName
|
|
82
|
+
});
|
|
80
83
|
const matched = this.router.match(url || context.path);
|
|
81
84
|
if (!matched) {
|
|
82
85
|
return null;
|
|
@@ -277,23 +280,35 @@ class ModernServer {
|
|
|
277
280
|
/* —————————————————————— private function —————————————————————— */
|
|
278
281
|
// handler route.json, include api / csr / ssr
|
|
279
282
|
async routeHandler(context) {
|
|
280
|
-
const { res } = context;
|
|
283
|
+
const { res, req, reporter } = context;
|
|
281
284
|
const matched = this.router.match(context.path);
|
|
282
285
|
if (!matched) {
|
|
283
286
|
this.render404(context);
|
|
284
287
|
return;
|
|
285
288
|
}
|
|
289
|
+
await reporter.init({
|
|
290
|
+
match: matched
|
|
291
|
+
});
|
|
292
|
+
const end = (0, _time.time)();
|
|
293
|
+
res.on("finish", () => {
|
|
294
|
+
const cost = end();
|
|
295
|
+
reporter.reportTiming("server_handle_request", cost);
|
|
296
|
+
});
|
|
286
297
|
let route = matched.generate(context.url);
|
|
287
298
|
if (route.isApi) {
|
|
288
299
|
await this.handleAPI(context);
|
|
289
300
|
return;
|
|
290
301
|
}
|
|
302
|
+
await (0, _utils1.bodyParser)(req);
|
|
291
303
|
if (route.entryName) {
|
|
292
304
|
const afterMatchContext = (0, _hookapi.createAfterMatchContext)(context, route.entryName);
|
|
293
305
|
if (this.runMode === _constants.RUN_MODE.FULL) {
|
|
306
|
+
const end2 = (0, _time.time)();
|
|
294
307
|
await this.runner.afterMatch(afterMatchContext, {
|
|
295
308
|
onLast: _utils1.noop
|
|
296
309
|
});
|
|
310
|
+
const cost = end2();
|
|
311
|
+
reporter.reportTiming("server_hook_after_render", cost);
|
|
297
312
|
}
|
|
298
313
|
if (this.isSend(res)) {
|
|
299
314
|
return;
|
|
@@ -315,7 +330,10 @@ class ModernServer {
|
|
|
315
330
|
if (this.frameWebHandler) {
|
|
316
331
|
res.locals = res.locals || {};
|
|
317
332
|
const middlewareContext = (0, _hookapi.createMiddlewareContext)(context);
|
|
333
|
+
const end2 = (0, _time.time)();
|
|
318
334
|
await this.frameWebHandler(middlewareContext);
|
|
335
|
+
const cost = end2();
|
|
336
|
+
reporter.reportTiming("server_middleware", cost);
|
|
319
337
|
res.locals = {
|
|
320
338
|
...res.locals,
|
|
321
339
|
...middlewareContext.response.locals
|
|
@@ -337,9 +355,12 @@ class ModernServer {
|
|
|
337
355
|
if (route.entryName) {
|
|
338
356
|
const afterRenderContext = (0, _hookapi.createAfterRenderContext)(context, response.toString());
|
|
339
357
|
if (this.runMode === _constants.RUN_MODE.FULL) {
|
|
358
|
+
const end2 = (0, _time.time)();
|
|
340
359
|
await this.runner.afterRender(afterRenderContext, {
|
|
341
360
|
onLast: _utils1.noop
|
|
342
361
|
});
|
|
362
|
+
const cost = end2();
|
|
363
|
+
reporter.reportTiming("server_hook_after_render", cost);
|
|
343
364
|
}
|
|
344
365
|
if (this.isSend(res)) {
|
|
345
366
|
return;
|
package/dist/cjs/utils.js
CHANGED
|
@@ -36,6 +36,9 @@ _export(exports, {
|
|
|
36
36
|
},
|
|
37
37
|
isRedirect: function() {
|
|
38
38
|
return isRedirect;
|
|
39
|
+
},
|
|
40
|
+
bodyParser: function() {
|
|
41
|
+
return bodyParser;
|
|
39
42
|
}
|
|
40
43
|
});
|
|
41
44
|
const _utils = require("@modern-js/utils");
|
|
@@ -159,3 +162,33 @@ const isRedirect = (code) => {
|
|
|
159
162
|
308
|
|
160
163
|
].includes(code);
|
|
161
164
|
};
|
|
165
|
+
function parseBodyTypes(headers, body) {
|
|
166
|
+
switch (headers["content-type"]) {
|
|
167
|
+
case "application/json":
|
|
168
|
+
return JSON.parse(body);
|
|
169
|
+
default:
|
|
170
|
+
return body;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const getRequestBody = (req) => new Promise((resolve, reject) => {
|
|
174
|
+
var _req;
|
|
175
|
+
if (((_req = req) === null || _req === void 0 ? void 0 : _req.method) && req.method.toLowerCase() !== "get") {
|
|
176
|
+
let body = "";
|
|
177
|
+
req.on("data", (chunk) => {
|
|
178
|
+
body += chunk.toString();
|
|
179
|
+
});
|
|
180
|
+
req.on("end", () => {
|
|
181
|
+
resolve(parseBodyTypes(req.headers, body));
|
|
182
|
+
});
|
|
183
|
+
req.on("error", (err) => {
|
|
184
|
+
reject(err);
|
|
185
|
+
});
|
|
186
|
+
} else {
|
|
187
|
+
resolve(void 0);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
const bodyParser = async (req) => {
|
|
191
|
+
if (!req.body) {
|
|
192
|
+
req.body = await getRequestBody(req);
|
|
193
|
+
}
|
|
194
|
+
};
|
package/dist/cjs/workerServer.js
CHANGED
|
@@ -23,6 +23,7 @@ const _indexworker = require("./libs/hook-api/index.worker");
|
|
|
23
23
|
const _logger = require("./libs/logger");
|
|
24
24
|
const _route = require("./libs/route");
|
|
25
25
|
const _metrics = require("./libs/metrics");
|
|
26
|
+
const _reporter = require("./libs/reporter");
|
|
26
27
|
class ReturnResponse {
|
|
27
28
|
/**
|
|
28
29
|
* Iterate a Object
|
|
@@ -101,7 +102,8 @@ const createHandler = (manifest) => {
|
|
|
101
102
|
level: "warn"
|
|
102
103
|
});
|
|
103
104
|
const metrics = _metrics.metrics;
|
|
104
|
-
const
|
|
105
|
+
const reporter = _reporter.defaultReporter;
|
|
106
|
+
const hookContext = createWorkerHookContext(request.url, logger, metrics, reporter);
|
|
105
107
|
const afterMatchHookContext = (0, _indexworker.createAfterMatchContext)(hookContext, entryName);
|
|
106
108
|
(_page = page) === null || _page === void 0 ? void 0 : (_page_serverHooks = _page.serverHooks) === null || _page_serverHooks === void 0 ? void 0 : (_page_serverHooks_afterMatch = _page_serverHooks.afterMatch) === null || _page_serverHooks_afterMatch === void 0 ? void 0 : _page_serverHooks_afterMatch.call(_page_serverHooks, afterMatchHookContext, () => void 0);
|
|
107
109
|
if (checkIsSent(hookContext)) {
|
|
@@ -137,9 +139,15 @@ const createHandler = (manifest) => {
|
|
|
137
139
|
template: page.template,
|
|
138
140
|
entryName: page.entryName,
|
|
139
141
|
logger,
|
|
142
|
+
reporter: _reporter.defaultReporter,
|
|
140
143
|
metrics,
|
|
141
144
|
// FIXME: pass correctly req & res
|
|
142
145
|
req: request,
|
|
146
|
+
serverTiming: {
|
|
147
|
+
addServeTiming() {
|
|
148
|
+
return this;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
143
151
|
res: responseLike
|
|
144
152
|
};
|
|
145
153
|
const body = await page.serverRender(serverRenderContext);
|
|
@@ -184,7 +192,7 @@ function createResponse(template) {
|
|
|
184
192
|
return RESPONSE_NOTFOUND;
|
|
185
193
|
}
|
|
186
194
|
}
|
|
187
|
-
function createWorkerHookContext(url, logger, metrics) {
|
|
195
|
+
function createWorkerHookContext(url, logger, metrics, reporter) {
|
|
188
196
|
const [res, req] = [
|
|
189
197
|
{
|
|
190
198
|
headers: new Headers(),
|
|
@@ -198,7 +206,8 @@ function createWorkerHookContext(url, logger, metrics) {
|
|
|
198
206
|
res,
|
|
199
207
|
req,
|
|
200
208
|
logger,
|
|
201
|
-
metrics
|
|
209
|
+
metrics,
|
|
210
|
+
reporter
|
|
202
211
|
};
|
|
203
212
|
}
|
|
204
213
|
function applyMiddlewares(ctx, middleware) {
|
|
@@ -7,21 +7,27 @@ import qs from "querystring";
|
|
|
7
7
|
import { Buffer } from "buffer";
|
|
8
8
|
import createEtag from "etag";
|
|
9
9
|
import fresh from "fresh";
|
|
10
|
+
import { cutNameByHyphen } from "@modern-js/utils";
|
|
11
|
+
import { ServerTiming } from "../serverTiming";
|
|
12
|
+
import { defaultReporter } from "../reporter";
|
|
10
13
|
import { headersWithoutCookie } from "../../utils";
|
|
11
14
|
var MOCK_URL_BASE = "https://modernjs.dev/";
|
|
12
15
|
export var ModernServerContext = /* @__PURE__ */ function() {
|
|
13
16
|
"use strict";
|
|
14
17
|
function ModernServerContext2(req, res, options) {
|
|
15
18
|
_class_call_check(this, ModernServerContext2);
|
|
19
|
+
var _options;
|
|
16
20
|
_define_property(this, "req", void 0);
|
|
17
21
|
_define_property(this, "res", void 0);
|
|
18
22
|
_define_property(this, "params", {});
|
|
19
|
-
_define_property(this, "
|
|
23
|
+
_define_property(this, "reporter", defaultReporter);
|
|
24
|
+
_define_property(this, "serverTiming", void 0);
|
|
25
|
+
_define_property(this, "serverData", {});
|
|
20
26
|
_define_property(this, "options", {});
|
|
21
27
|
this.req = req;
|
|
22
28
|
this.res = res;
|
|
23
29
|
this.options = options || {};
|
|
24
|
-
this.
|
|
30
|
+
this.serverTiming = new ServerTiming(res, cutNameByHyphen(((_options = options) === null || _options === void 0 ? void 0 : _options.metaName) || "modern-js"));
|
|
25
31
|
this.bind();
|
|
26
32
|
}
|
|
27
33
|
_create_class(ModernServerContext2, [
|
|
@@ -4,10 +4,11 @@ import { RouteAPI } from "./route";
|
|
|
4
4
|
import { TemplateAPI } from "./template";
|
|
5
5
|
import { BaseRequest, BaseResponse } from "./base";
|
|
6
6
|
export var base = function(context) {
|
|
7
|
-
var res = context.res;
|
|
7
|
+
var res = context.res, reporter = context.reporter;
|
|
8
8
|
return {
|
|
9
9
|
response: new BaseResponse(res),
|
|
10
10
|
request: new BaseRequest(context),
|
|
11
|
+
reporter: reporter,
|
|
11
12
|
logger: context.logger,
|
|
12
13
|
metrics: context.metrics
|
|
13
14
|
};
|
|
@@ -55,7 +55,7 @@ var ServerResponse = /* @__PURE__ */ function() {
|
|
|
55
55
|
return ServerResponse2;
|
|
56
56
|
}();
|
|
57
57
|
export var base = function(context) {
|
|
58
|
-
var req = context.req, res = context.res, logger = context.logger, metrics = context.metrics;
|
|
58
|
+
var req = context.req, res = context.res, logger = context.logger, metrics = context.metrics, reporter = context.reporter;
|
|
59
59
|
var serverResponse = new ServerResponse(res);
|
|
60
60
|
var _ref = new URL(req.url), host = _ref.host, pathname = _ref.pathname, searchParams = _ref.searchParams;
|
|
61
61
|
var headers = {};
|
|
@@ -64,6 +64,7 @@ export var base = function(context) {
|
|
|
64
64
|
});
|
|
65
65
|
return {
|
|
66
66
|
response: new BaseResponse(serverResponse),
|
|
67
|
+
reporter: reporter,
|
|
67
68
|
request: new BaseRequest({
|
|
68
69
|
url: req.url,
|
|
69
70
|
host: host,
|
|
@@ -7,7 +7,7 @@ import { createLogger, createMetrics } from "./measure";
|
|
|
7
7
|
import { injectServerDataStream, injectServerData } from "./utils";
|
|
8
8
|
export var render = function() {
|
|
9
9
|
var _ref = _async_to_generator(function(ctx, renderOptions, runner) {
|
|
10
|
-
var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, _renderOptions_enableUnsafeCtx, enableUnsafeCtx, nonce, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest,
|
|
10
|
+
var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, _renderOptions_enableUnsafeCtx, enableUnsafeCtx, nonce, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest, context, bundleJSContent, serverRender, content, _context_redirection, url, _context_redirection_status, status;
|
|
11
11
|
return _ts_generator(this, function(_state) {
|
|
12
12
|
switch (_state.label) {
|
|
13
13
|
case 0:
|
|
@@ -17,12 +17,6 @@ export var render = function() {
|
|
|
17
17
|
loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
|
|
18
18
|
routesManifestUri = path.join(distDir, ROUTE_MANIFEST_FILE);
|
|
19
19
|
routeManifest = fs.existsSync(routesManifestUri) ? require(routesManifestUri) : void 0;
|
|
20
|
-
return [
|
|
21
|
-
4,
|
|
22
|
-
getRequestBody(ctx.req)
|
|
23
|
-
];
|
|
24
|
-
case 1:
|
|
25
|
-
body = _state.sent();
|
|
26
20
|
context = {
|
|
27
21
|
request: {
|
|
28
22
|
baseUrl: urlPath,
|
|
@@ -32,7 +26,7 @@ export var render = function() {
|
|
|
32
26
|
query: ctx.query,
|
|
33
27
|
url: ctx.href,
|
|
34
28
|
headers: ctx.headers,
|
|
35
|
-
body: body
|
|
29
|
+
body: ctx.req.body
|
|
36
30
|
},
|
|
37
31
|
response: {
|
|
38
32
|
setHeader: function(key, value) {
|
|
@@ -51,6 +45,8 @@ export var render = function() {
|
|
|
51
45
|
staticGenerate: staticGenerate,
|
|
52
46
|
logger: void 0,
|
|
53
47
|
metrics: void 0,
|
|
48
|
+
reporter: ctx.reporter,
|
|
49
|
+
serverTiming: ctx.serverTiming,
|
|
54
50
|
req: ctx.req,
|
|
55
51
|
res: ctx.res,
|
|
56
52
|
enableUnsafeCtx: enableUnsafeCtx,
|
|
@@ -63,14 +59,14 @@ export var render = function() {
|
|
|
63
59
|
4,
|
|
64
60
|
Promise.resolve(require(bundleJS))
|
|
65
61
|
];
|
|
66
|
-
case
|
|
62
|
+
case 1:
|
|
67
63
|
bundleJSContent = _state.sent();
|
|
68
64
|
serverRender = bundleJSContent[SERVER_RENDER_FUNCTION_NAME];
|
|
69
65
|
return [
|
|
70
66
|
4,
|
|
71
67
|
cache(serverRender, ctx)(context)
|
|
72
68
|
];
|
|
73
|
-
case
|
|
69
|
+
case 2:
|
|
74
70
|
content = _state.sent();
|
|
75
71
|
_context_redirection = context.redirection, url = _context_redirection.url, _context_redirection_status = _context_redirection.status, status = _context_redirection_status === void 0 ? 302 : _context_redirection_status;
|
|
76
72
|
if (url) {
|
|
@@ -112,22 +108,3 @@ export var render = function() {
|
|
|
112
108
|
return _ref.apply(this, arguments);
|
|
113
109
|
};
|
|
114
110
|
}();
|
|
115
|
-
var getRequestBody = function(req) {
|
|
116
|
-
return new Promise(function(resolve, reject) {
|
|
117
|
-
var _req;
|
|
118
|
-
if (((_req = req) === null || _req === void 0 ? void 0 : _req.method) && req.method.toLowerCase() !== "get") {
|
|
119
|
-
var body = "";
|
|
120
|
-
req.on("data", function(chunk) {
|
|
121
|
-
body += chunk.toString();
|
|
122
|
-
});
|
|
123
|
-
req.on("end", function() {
|
|
124
|
-
resolve(body);
|
|
125
|
-
});
|
|
126
|
-
req.on("error", function(err) {
|
|
127
|
-
reject(err);
|
|
128
|
-
});
|
|
129
|
-
} else {
|
|
130
|
-
resolve(void 0);
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
|
|
2
|
+
import { _ as _create_class } from "@swc/helpers/_/_create_class";
|
|
3
|
+
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
4
|
+
var SERVER_TIMING = "Server-Timing";
|
|
5
|
+
export var ServerTiming = /* @__PURE__ */ function() {
|
|
6
|
+
"use strict";
|
|
7
|
+
function ServerTiming2(res, meta) {
|
|
8
|
+
_class_call_check(this, ServerTiming2);
|
|
9
|
+
_define_property(this, "meta", void 0);
|
|
10
|
+
_define_property(this, "res", void 0);
|
|
11
|
+
this.meta = meta;
|
|
12
|
+
this.res = res;
|
|
13
|
+
}
|
|
14
|
+
_create_class(ServerTiming2, [
|
|
15
|
+
{
|
|
16
|
+
key: "addServeTiming",
|
|
17
|
+
value: function addServeTiming(name, dur, desc) {
|
|
18
|
+
var _name = "bd-".concat(this.meta, "-").concat(name);
|
|
19
|
+
var serverTiming = this.res.getHeader(SERVER_TIMING) || this.res.getHeader(SERVER_TIMING.toLocaleLowerCase());
|
|
20
|
+
var value = "".concat(_name, ";").concat(desc ? 'decs="'.concat(desc, '";') : "", " dur=").concat(dur);
|
|
21
|
+
this.res.setHeader(SERVER_TIMING, serverTiming ? "".concat(serverTiming, ", ").concat(value) : value);
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
]);
|
|
26
|
+
return ServerTiming2;
|
|
27
|
+
}();
|