@modern-js/prod-server 2.28.0 → 2.30.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 +42 -0
- package/dist/cjs/libs/context/context.js +16 -6
- 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/proxy.js +29 -11
- package/dist/cjs/libs/render/ssr.js +3 -20
- package/dist/cjs/libs/reporter.js +22 -0
- package/dist/cjs/libs/serverTiming.js +27 -0
- package/dist/cjs/server/index.js +14 -0
- package/dist/cjs/server/modernServer.js +27 -9
- package/dist/cjs/workerServer.js +12 -3
- package/dist/esm/libs/context/context.js +14 -4
- 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/proxy.js +80 -32
- package/dist/esm/libs/render/ssr.js +6 -30
- package/dist/esm/libs/reporter.js +12 -0
- package/dist/esm/libs/serverTiming.js +27 -0
- package/dist/esm/server/index.js +22 -2
- package/dist/esm/server/modernServer.js +56 -33
- package/dist/esm/workerServer.js +13 -4
- package/dist/esm-node/libs/context/context.js +14 -4
- 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/proxy.js +29 -11
- package/dist/esm-node/libs/render/ssr.js +3 -20
- package/dist/esm-node/libs/reporter.js +12 -0
- package/dist/esm-node/libs/serverTiming.js +17 -0
- package/dist/esm-node/server/index.js +14 -0
- package/dist/esm-node/server/modernServer.js +27 -9
- 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/proxy.d.ts +9 -2
- 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 -2
- package/dist/types/type.d.ts +1 -0
- package/dist/types/utils.d.ts +1 -1
- package/package.json +10 -8
|
@@ -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,
|
|
@@ -31,8 +25,7 @@ export var render = function() {
|
|
|
31
25
|
host: ctx.host,
|
|
32
26
|
query: ctx.query,
|
|
33
27
|
url: ctx.href,
|
|
34
|
-
headers: ctx.headers
|
|
35
|
-
body: body
|
|
28
|
+
headers: ctx.headers
|
|
36
29
|
},
|
|
37
30
|
response: {
|
|
38
31
|
setHeader: function(key, value) {
|
|
@@ -51,6 +44,8 @@ export var render = function() {
|
|
|
51
44
|
staticGenerate: staticGenerate,
|
|
52
45
|
logger: void 0,
|
|
53
46
|
metrics: void 0,
|
|
47
|
+
reporter: ctx.reporter,
|
|
48
|
+
serverTiming: ctx.serverTiming,
|
|
54
49
|
req: ctx.req,
|
|
55
50
|
res: ctx.res,
|
|
56
51
|
enableUnsafeCtx: enableUnsafeCtx,
|
|
@@ -63,14 +58,14 @@ export var render = function() {
|
|
|
63
58
|
4,
|
|
64
59
|
Promise.resolve(require(bundleJS))
|
|
65
60
|
];
|
|
66
|
-
case
|
|
61
|
+
case 1:
|
|
67
62
|
bundleJSContent = _state.sent();
|
|
68
63
|
serverRender = bundleJSContent[SERVER_RENDER_FUNCTION_NAME];
|
|
69
64
|
return [
|
|
70
65
|
4,
|
|
71
66
|
cache(serverRender, ctx)(context)
|
|
72
67
|
];
|
|
73
|
-
case
|
|
68
|
+
case 2:
|
|
74
69
|
content = _state.sent();
|
|
75
70
|
_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
71
|
if (url) {
|
|
@@ -112,22 +107,3 @@ export var render = function() {
|
|
|
112
107
|
return _ref.apply(this, arguments);
|
|
113
108
|
};
|
|
114
109
|
}();
|
|
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
|
+
}();
|
package/dist/esm/server/index.js
CHANGED
|
@@ -54,7 +54,7 @@ export var Server = /* @__PURE__ */ function() {
|
|
|
54
54
|
}, _ref_disableHttpServer = _ref.disableHttpServer, disableHttpServer = _ref_disableHttpServer === void 0 ? false : _ref_disableHttpServer;
|
|
55
55
|
var _this = this;
|
|
56
56
|
return _async_to_generator(function() {
|
|
57
|
-
var options;
|
|
57
|
+
var options, result, ref, ref1, result1, ref2, ref3;
|
|
58
58
|
return _ts_generator(this, function(_state) {
|
|
59
59
|
switch (_state.label) {
|
|
60
60
|
case 0:
|
|
@@ -112,10 +112,30 @@ export var Server = /* @__PURE__ */ function() {
|
|
|
112
112
|
case 8:
|
|
113
113
|
return [
|
|
114
114
|
4,
|
|
115
|
-
_this.
|
|
115
|
+
_this.runner.beforeServerInit({
|
|
116
|
+
app: _this.app,
|
|
117
|
+
server: _this.server
|
|
118
|
+
})
|
|
116
119
|
];
|
|
117
120
|
case 9:
|
|
121
|
+
result = _state.sent();
|
|
122
|
+
ref = result, ref1 = ref.app, _this.app = ref1 === void 0 ? _this.app : ref1, _this.server = ref.server, ref;
|
|
123
|
+
return [
|
|
124
|
+
4,
|
|
125
|
+
_this.server.onInit(_this.runner, _this.app)
|
|
126
|
+
];
|
|
127
|
+
case 10:
|
|
118
128
|
_state.sent();
|
|
129
|
+
return [
|
|
130
|
+
4,
|
|
131
|
+
_this.runner.afterServerInit({
|
|
132
|
+
app: _this.app,
|
|
133
|
+
server: _this.server
|
|
134
|
+
})
|
|
135
|
+
];
|
|
136
|
+
case 11:
|
|
137
|
+
result1 = _state.sent();
|
|
138
|
+
ref2 = result1, ref3 = ref2.app, _this.app = ref3 === void 0 ? _this.app : ref3, _this.server = ref2.server, ref2;
|
|
119
139
|
return [
|
|
120
140
|
2,
|
|
121
141
|
_this
|
|
@@ -8,6 +8,7 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
|
8
8
|
import { createServer } from "http";
|
|
9
9
|
import path from "path";
|
|
10
10
|
import { fs, isPromise, isWebOnly, mime, ROUTE_SPEC_FILE } from "@modern-js/utils";
|
|
11
|
+
import { time } from "@modern-js/utils/universal/time";
|
|
11
12
|
import { RouteMatchManager } from "../libs/route";
|
|
12
13
|
import { createRenderHandler } from "../libs/render";
|
|
13
14
|
import { createStaticFileHandler, faviconFallbackHandler } from "../libs/serveFile";
|
|
@@ -43,7 +44,6 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
43
44
|
_define_property(this, "loaderHandler", null);
|
|
44
45
|
_define_property(this, "frameWebHandler", null);
|
|
45
46
|
_define_property(this, "frameAPIHandler", null);
|
|
46
|
-
_define_property(this, "proxyHandler", null);
|
|
47
47
|
_define_property(this, "_handler", void 0);
|
|
48
48
|
require("ignore-styles");
|
|
49
49
|
this.pwd = pwd;
|
|
@@ -68,7 +68,7 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
68
68
|
function onInit(runner, app) {
|
|
69
69
|
var _this = this;
|
|
70
70
|
return _async_to_generator(function() {
|
|
71
|
-
var _conf_bff, _app, _this_conf_output, distDir, conf, usageRoutes;
|
|
71
|
+
var _conf_bff, _app, _this_conf_output, distDir, conf, proxyHandlers, usageRoutes;
|
|
72
72
|
return _ts_generator(this, function(_state) {
|
|
73
73
|
switch (_state.label) {
|
|
74
74
|
case 0:
|
|
@@ -76,12 +76,11 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
76
76
|
distDir = _this.distDir, conf = _this.conf;
|
|
77
77
|
_this.initReader();
|
|
78
78
|
debug("final server conf", _this.conf);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
79
|
+
proxyHandlers = createProxyHandler((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy);
|
|
80
|
+
app.on("upgrade", proxyHandlers.handleUpgrade);
|
|
81
|
+
proxyHandlers.handlers.forEach(function(handler) {
|
|
82
|
+
_this.addHandler(handler);
|
|
83
|
+
});
|
|
85
84
|
(_app = app) === null || _app === void 0 ? void 0 : _app.on("close", function() {
|
|
86
85
|
_this.reader.close();
|
|
87
86
|
});
|
|
@@ -164,7 +163,9 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
164
163
|
case 0:
|
|
165
164
|
req.logger = req.logger || _this.logger;
|
|
166
165
|
req.metrics = req.metrics || _this.metrics;
|
|
167
|
-
context = createContext(req, res
|
|
166
|
+
context = createContext(req, res, {
|
|
167
|
+
metaName: _this.metaName
|
|
168
|
+
});
|
|
168
169
|
matched = _this.router.match(url || context.path);
|
|
169
170
|
if (!matched) {
|
|
170
171
|
return [
|
|
@@ -666,11 +667,11 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
666
667
|
function routeHandler(context) {
|
|
667
668
|
var _this = this;
|
|
668
669
|
return _async_to_generator(function() {
|
|
669
|
-
var res, matched, route, afterMatchContext, _afterMatchContext_router, current, url, status, matched1, middlewareContext, renderResult, responseStream, response, afterRenderContext;
|
|
670
|
+
var res, reporter, matched, end, route, afterMatchContext, end1, cost, _afterMatchContext_router, current, url, status, matched1, middlewareContext, end2, cost1, renderResult, responseStream, response, afterRenderContext, end3, cost2;
|
|
670
671
|
return _ts_generator(this, function(_state) {
|
|
671
672
|
switch (_state.label) {
|
|
672
673
|
case 0:
|
|
673
|
-
res = context.res;
|
|
674
|
+
res = context.res, reporter = context.reporter;
|
|
674
675
|
matched = _this.router.match(context.path);
|
|
675
676
|
if (!matched) {
|
|
676
677
|
_this.render404(context);
|
|
@@ -678,43 +679,59 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
678
679
|
2
|
|
679
680
|
];
|
|
680
681
|
}
|
|
682
|
+
return [
|
|
683
|
+
4,
|
|
684
|
+
reporter.init({
|
|
685
|
+
match: matched
|
|
686
|
+
})
|
|
687
|
+
];
|
|
688
|
+
case 1:
|
|
689
|
+
_state.sent();
|
|
690
|
+
end = time();
|
|
691
|
+
res.on("finish", function() {
|
|
692
|
+
var cost3 = end();
|
|
693
|
+
reporter.reportTiming("server_handle_request", cost3);
|
|
694
|
+
});
|
|
681
695
|
route = matched.generate(context.url);
|
|
682
696
|
if (!route.isApi)
|
|
683
697
|
return [
|
|
684
698
|
3,
|
|
685
|
-
|
|
699
|
+
3
|
|
686
700
|
];
|
|
687
701
|
return [
|
|
688
702
|
4,
|
|
689
703
|
_this.handleAPI(context)
|
|
690
704
|
];
|
|
691
|
-
case
|
|
705
|
+
case 2:
|
|
692
706
|
_state.sent();
|
|
693
707
|
return [
|
|
694
708
|
2
|
|
695
709
|
];
|
|
696
|
-
case
|
|
710
|
+
case 3:
|
|
697
711
|
if (!route.entryName)
|
|
698
712
|
return [
|
|
699
713
|
3,
|
|
700
|
-
|
|
714
|
+
6
|
|
701
715
|
];
|
|
702
716
|
afterMatchContext = createAfterMatchContext(context, route.entryName);
|
|
703
717
|
if (!(_this.runMode === RUN_MODE.FULL))
|
|
704
718
|
return [
|
|
705
719
|
3,
|
|
706
|
-
|
|
720
|
+
5
|
|
707
721
|
];
|
|
722
|
+
end1 = time();
|
|
708
723
|
return [
|
|
709
724
|
4,
|
|
710
725
|
_this.runner.afterMatch(afterMatchContext, {
|
|
711
726
|
onLast: noop
|
|
712
727
|
})
|
|
713
728
|
];
|
|
714
|
-
case 3:
|
|
715
|
-
_state.sent();
|
|
716
|
-
_state.label = 4;
|
|
717
729
|
case 4:
|
|
730
|
+
_state.sent();
|
|
731
|
+
cost = end1();
|
|
732
|
+
reporter.reportTiming("server_hook_after_render", cost);
|
|
733
|
+
_state.label = 5;
|
|
734
|
+
case 5:
|
|
718
735
|
if (_this.isSend(res)) {
|
|
719
736
|
return [
|
|
720
737
|
2
|
|
@@ -737,34 +754,37 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
737
754
|
}
|
|
738
755
|
route = matched1.generate(context.url);
|
|
739
756
|
}
|
|
740
|
-
_state.label =
|
|
741
|
-
case
|
|
757
|
+
_state.label = 6;
|
|
758
|
+
case 6:
|
|
742
759
|
if (!_this.frameWebHandler)
|
|
743
760
|
return [
|
|
744
761
|
3,
|
|
745
|
-
|
|
762
|
+
8
|
|
746
763
|
];
|
|
747
764
|
res.locals = res.locals || {};
|
|
748
765
|
middlewareContext = createMiddlewareContext(context);
|
|
766
|
+
end2 = time();
|
|
749
767
|
return [
|
|
750
768
|
4,
|
|
751
769
|
_this.frameWebHandler(middlewareContext)
|
|
752
770
|
];
|
|
753
|
-
case
|
|
771
|
+
case 7:
|
|
754
772
|
_state.sent();
|
|
773
|
+
cost1 = end2();
|
|
774
|
+
reporter.reportTiming("server_middleware", cost1);
|
|
755
775
|
res.locals = _object_spread({}, res.locals, middlewareContext.response.locals);
|
|
756
776
|
if (_this.isSend(res)) {
|
|
757
777
|
return [
|
|
758
778
|
2
|
|
759
779
|
];
|
|
760
780
|
}
|
|
761
|
-
_state.label =
|
|
762
|
-
case
|
|
781
|
+
_state.label = 8;
|
|
782
|
+
case 8:
|
|
763
783
|
return [
|
|
764
784
|
4,
|
|
765
785
|
_this.handleWeb(context, route)
|
|
766
786
|
];
|
|
767
|
-
case
|
|
787
|
+
case 9:
|
|
768
788
|
renderResult = _state.sent();
|
|
769
789
|
if (!renderResult) {
|
|
770
790
|
return [
|
|
@@ -782,32 +802,35 @@ export var ModernServer = /* @__PURE__ */ function() {
|
|
|
782
802
|
if (!route.entryName)
|
|
783
803
|
return [
|
|
784
804
|
3,
|
|
785
|
-
|
|
805
|
+
12
|
|
786
806
|
];
|
|
787
807
|
afterRenderContext = createAfterRenderContext(context, response.toString());
|
|
788
808
|
if (!(_this.runMode === RUN_MODE.FULL))
|
|
789
809
|
return [
|
|
790
810
|
3,
|
|
791
|
-
|
|
811
|
+
11
|
|
792
812
|
];
|
|
813
|
+
end3 = time();
|
|
793
814
|
return [
|
|
794
815
|
4,
|
|
795
816
|
_this.runner.afterRender(afterRenderContext, {
|
|
796
817
|
onLast: noop
|
|
797
818
|
})
|
|
798
819
|
];
|
|
799
|
-
case 9:
|
|
800
|
-
_state.sent();
|
|
801
|
-
_state.label = 10;
|
|
802
820
|
case 10:
|
|
821
|
+
_state.sent();
|
|
822
|
+
cost2 = end3();
|
|
823
|
+
reporter.reportTiming("server_hook_after_render", cost2);
|
|
824
|
+
_state.label = 11;
|
|
825
|
+
case 11:
|
|
803
826
|
if (_this.isSend(res)) {
|
|
804
827
|
return [
|
|
805
828
|
2
|
|
806
829
|
];
|
|
807
830
|
}
|
|
808
831
|
response = afterRenderContext.template.get();
|
|
809
|
-
_state.label =
|
|
810
|
-
case
|
|
832
|
+
_state.label = 12;
|
|
833
|
+
case 12:
|
|
811
834
|
res.end(response);
|
|
812
835
|
return [
|
|
813
836
|
2
|
package/dist/esm/workerServer.js
CHANGED
|
@@ -9,6 +9,7 @@ import { createAfterMatchContext, createAfterRenderContext, createMiddlewareCont
|
|
|
9
9
|
import { Logger } from "./libs/logger";
|
|
10
10
|
import { RouteMatchManager } from "./libs/route";
|
|
11
11
|
import { metrics as defaultMetrics } from "./libs/metrics";
|
|
12
|
+
import { defaultReporter } from "./libs/reporter";
|
|
12
13
|
export var ReturnResponse = /* @__PURE__ */ function() {
|
|
13
14
|
"use strict";
|
|
14
15
|
function ReturnResponse2(body, status) {
|
|
@@ -91,7 +92,7 @@ export var createHandler = function(manifest) {
|
|
|
91
92
|
routeMgr.reset(routes);
|
|
92
93
|
return function() {
|
|
93
94
|
var _ref = _async_to_generator(function(options) {
|
|
94
|
-
var _page_serverHooks_afterMatch, _page_serverHooks, _page, request, loadableStats, routeManifest, url, pageMatch, entryName, page, logger, metrics, hookContext, afterMatchHookContext, _page_serverHooks1, _page_serverHooks_afterRender, _page_serverHooks2, middlewarsHookContext, responseLike, params, baseUrl, serverRenderContext, body, afterRenderHookContext, e;
|
|
95
|
+
var _page_serverHooks_afterMatch, _page_serverHooks, _page, request, loadableStats, routeManifest, url, pageMatch, entryName, page, logger, metrics, reporter, hookContext, afterMatchHookContext, _page_serverHooks1, _page_serverHooks_afterRender, _page_serverHooks2, middlewarsHookContext, responseLike, params, baseUrl, serverRenderContext, body, afterRenderHookContext, e;
|
|
95
96
|
function createServerRequest(url2, baseUrl2, request2, params2) {
|
|
96
97
|
var pathname = url2.pathname, host = url2.host, searchParams = url2.searchParams;
|
|
97
98
|
var rawHeaders = request2.headers;
|
|
@@ -128,7 +129,8 @@ export var createHandler = function(manifest) {
|
|
|
128
129
|
level: "warn"
|
|
129
130
|
});
|
|
130
131
|
metrics = defaultMetrics;
|
|
131
|
-
|
|
132
|
+
reporter = defaultReporter;
|
|
133
|
+
hookContext = createWorkerHookContext(request.url, logger, metrics, reporter);
|
|
132
134
|
afterMatchHookContext = createAfterMatchContext(hookContext, entryName);
|
|
133
135
|
(_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, function() {
|
|
134
136
|
return void 0;
|
|
@@ -182,9 +184,15 @@ export var createHandler = function(manifest) {
|
|
|
182
184
|
template: page.template,
|
|
183
185
|
entryName: page.entryName,
|
|
184
186
|
logger: logger,
|
|
187
|
+
reporter: defaultReporter,
|
|
185
188
|
metrics: metrics,
|
|
186
189
|
// FIXME: pass correctly req & res
|
|
187
190
|
req: request,
|
|
191
|
+
serverTiming: {
|
|
192
|
+
addServeTiming: function addServeTiming() {
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
},
|
|
188
196
|
res: responseLike
|
|
189
197
|
};
|
|
190
198
|
return [
|
|
@@ -236,7 +244,7 @@ function createResponse(template) {
|
|
|
236
244
|
return RESPONSE_NOTFOUND;
|
|
237
245
|
}
|
|
238
246
|
}
|
|
239
|
-
function createWorkerHookContext(url, logger, metrics) {
|
|
247
|
+
function createWorkerHookContext(url, logger, metrics, reporter) {
|
|
240
248
|
var _ref = [
|
|
241
249
|
{
|
|
242
250
|
headers: new Headers(),
|
|
@@ -250,7 +258,8 @@ function createWorkerHookContext(url, logger, metrics) {
|
|
|
250
258
|
res: res,
|
|
251
259
|
req: req,
|
|
252
260
|
logger: logger,
|
|
253
|
-
metrics: metrics
|
|
261
|
+
metrics: metrics,
|
|
262
|
+
reporter: reporter
|
|
254
263
|
};
|
|
255
264
|
}
|
|
256
265
|
function applyMiddlewares(ctx, middleware) {
|
|
@@ -4,6 +4,9 @@ import qs from "querystring";
|
|
|
4
4
|
import { Buffer } from "buffer";
|
|
5
5
|
import createEtag from "etag";
|
|
6
6
|
import fresh from "fresh";
|
|
7
|
+
import { cutNameByHyphen } from "@modern-js/utils";
|
|
8
|
+
import { ServerTiming } from "../serverTiming";
|
|
9
|
+
import { defaultReporter } from "../reporter";
|
|
7
10
|
import { headersWithoutCookie } from "../../utils";
|
|
8
11
|
const MOCK_URL_BASE = "https://modernjs.dev/";
|
|
9
12
|
export class ModernServerContext {
|
|
@@ -14,8 +17,12 @@ export class ModernServerContext {
|
|
|
14
17
|
return this.req.metrics;
|
|
15
18
|
}
|
|
16
19
|
get parsedURL() {
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
try {
|
|
21
|
+
return new URL(this.req.url, MOCK_URL_BASE);
|
|
22
|
+
} catch (e) {
|
|
23
|
+
this.logger.error("Parse URL error", e.stack || e.message);
|
|
24
|
+
return new URL("/_modern_mock_path", MOCK_URL_BASE);
|
|
25
|
+
}
|
|
19
26
|
}
|
|
20
27
|
bind() {
|
|
21
28
|
const { req, res } = this;
|
|
@@ -149,15 +156,18 @@ export class ModernServerContext {
|
|
|
149
156
|
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, headersWithoutCookie(this.headers));
|
|
150
157
|
}
|
|
151
158
|
constructor(req, res, options) {
|
|
159
|
+
var _options;
|
|
152
160
|
_define_property(this, "req", void 0);
|
|
153
161
|
_define_property(this, "res", void 0);
|
|
154
162
|
_define_property(this, "params", {});
|
|
155
|
-
_define_property(this, "
|
|
163
|
+
_define_property(this, "reporter", defaultReporter);
|
|
164
|
+
_define_property(this, "serverTiming", void 0);
|
|
165
|
+
_define_property(this, "serverData", {});
|
|
156
166
|
_define_property(this, "options", {});
|
|
157
167
|
this.req = req;
|
|
158
168
|
this.res = res;
|
|
159
169
|
this.options = options || {};
|
|
160
|
-
this.
|
|
170
|
+
this.serverTiming = new ServerTiming(res, cutNameByHyphen(((_options = options) === null || _options === void 0 ? void 0 : _options.metaName) || "modern-js"));
|
|
161
171
|
this.bind();
|
|
162
172
|
}
|
|
163
173
|
}
|
|
@@ -2,10 +2,11 @@ import { RouteAPI } from "./route";
|
|
|
2
2
|
import { TemplateAPI } from "./template";
|
|
3
3
|
import { BaseRequest, BaseResponse } from "./base";
|
|
4
4
|
export const base = (context) => {
|
|
5
|
-
const { res } = context;
|
|
5
|
+
const { res, reporter } = context;
|
|
6
6
|
return {
|
|
7
7
|
response: new BaseResponse(res),
|
|
8
8
|
request: new BaseRequest(context),
|
|
9
|
+
reporter,
|
|
9
10
|
logger: context.logger,
|
|
10
11
|
metrics: context.metrics
|
|
11
12
|
};
|
|
@@ -31,7 +31,7 @@ class ServerResponse {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
export const base = (context) => {
|
|
34
|
-
const { req, res, logger, metrics } = context;
|
|
34
|
+
const { req, res, logger, metrics, reporter } = context;
|
|
35
35
|
const serverResponse = new ServerResponse(res);
|
|
36
36
|
const { host, pathname, searchParams } = new URL(req.url);
|
|
37
37
|
const headers = {};
|
|
@@ -40,6 +40,7 @@ export const base = (context) => {
|
|
|
40
40
|
});
|
|
41
41
|
return {
|
|
42
42
|
response: new BaseResponse(serverResponse),
|
|
43
|
+
reporter,
|
|
43
44
|
request: new BaseRequest({
|
|
44
45
|
url: req.url,
|
|
45
46
|
host,
|
|
@@ -26,24 +26,42 @@ export function formatProxyOptions(proxyOptions) {
|
|
|
26
26
|
}
|
|
27
27
|
export const createProxyHandler = (proxyOptions) => {
|
|
28
28
|
debug("createProxyHandler", proxyOptions);
|
|
29
|
+
const middlewares = [];
|
|
30
|
+
const handlers = [];
|
|
31
|
+
const handleUpgrade = (req, socket, head) => {
|
|
32
|
+
for (const middleware of middlewares) {
|
|
33
|
+
if (typeof middleware.upgrade === "function") {
|
|
34
|
+
middleware.upgrade(req, socket, head);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
29
38
|
if (!proxyOptions) {
|
|
30
|
-
return
|
|
39
|
+
return {
|
|
40
|
+
handlers,
|
|
41
|
+
handleUpgrade
|
|
42
|
+
};
|
|
31
43
|
}
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const middleware = createProxyMiddleware(
|
|
35
|
-
|
|
44
|
+
const formattedOptionsList = formatProxyOptions(proxyOptions);
|
|
45
|
+
for (const options of formattedOptionsList) {
|
|
46
|
+
const middleware = createProxyMiddleware(options.context, options);
|
|
47
|
+
const handler = async (ctx, next) => {
|
|
36
48
|
const { req, res } = ctx;
|
|
37
|
-
const bypassUrl = typeof
|
|
49
|
+
const bypassUrl = typeof options.bypass === "function" ? options.bypass(req, res, options) : null;
|
|
38
50
|
if (typeof bypassUrl === "boolean") {
|
|
39
51
|
ctx.status = 404;
|
|
40
|
-
|
|
52
|
+
next();
|
|
41
53
|
} else if (typeof bypassUrl === "string") {
|
|
42
54
|
ctx.url = bypassUrl;
|
|
43
|
-
|
|
55
|
+
next();
|
|
56
|
+
} else {
|
|
57
|
+
middleware(req, res, next);
|
|
44
58
|
}
|
|
45
|
-
middleware(req, res, next);
|
|
46
59
|
};
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
middlewares.push(middleware);
|
|
61
|
+
handlers.push(handler);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
handlers,
|
|
65
|
+
handleUpgrade
|
|
66
|
+
};
|
|
49
67
|
};
|
|
@@ -11,7 +11,6 @@ export const render = async (ctx, renderOptions, runner) => {
|
|
|
11
11
|
const loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
|
|
12
12
|
const routesManifestUri = path.join(distDir, ROUTE_MANIFEST_FILE);
|
|
13
13
|
const routeManifest = fs.existsSync(routesManifestUri) ? require(routesManifestUri) : void 0;
|
|
14
|
-
const body = await getRequestBody(ctx.req);
|
|
15
14
|
const context = {
|
|
16
15
|
request: {
|
|
17
16
|
baseUrl: urlPath,
|
|
@@ -20,8 +19,7 @@ export const render = async (ctx, renderOptions, runner) => {
|
|
|
20
19
|
host: ctx.host,
|
|
21
20
|
query: ctx.query,
|
|
22
21
|
url: ctx.href,
|
|
23
|
-
headers: ctx.headers
|
|
24
|
-
body
|
|
22
|
+
headers: ctx.headers
|
|
25
23
|
},
|
|
26
24
|
response: {
|
|
27
25
|
setHeader: (key, value) => {
|
|
@@ -40,6 +38,8 @@ export const render = async (ctx, renderOptions, runner) => {
|
|
|
40
38
|
staticGenerate,
|
|
41
39
|
logger: void 0,
|
|
42
40
|
metrics: void 0,
|
|
41
|
+
reporter: ctx.reporter,
|
|
42
|
+
serverTiming: ctx.serverTiming,
|
|
43
43
|
req: ctx.req,
|
|
44
44
|
res: ctx.res,
|
|
45
45
|
enableUnsafeCtx,
|
|
@@ -73,20 +73,3 @@ export const render = async (ctx, renderOptions, runner) => {
|
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
|
-
const getRequestBody = (req) => new Promise((resolve, reject) => {
|
|
77
|
-
var _req;
|
|
78
|
-
if (((_req = req) === null || _req === void 0 ? void 0 : _req.method) && req.method.toLowerCase() !== "get") {
|
|
79
|
-
let body = "";
|
|
80
|
-
req.on("data", (chunk) => {
|
|
81
|
-
body += chunk.toString();
|
|
82
|
-
});
|
|
83
|
-
req.on("end", () => {
|
|
84
|
-
resolve(body);
|
|
85
|
-
});
|
|
86
|
-
req.on("error", (err) => {
|
|
87
|
-
reject(err);
|
|
88
|
-
});
|
|
89
|
-
} else {
|
|
90
|
-
resolve(void 0);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
+
const SERVER_TIMING = "Server-Timing";
|
|
3
|
+
export class ServerTiming {
|
|
4
|
+
addServeTiming(name, dur, desc) {
|
|
5
|
+
const _name = `bd-${this.meta}-${name}`;
|
|
6
|
+
const serverTiming = this.res.getHeader(SERVER_TIMING) || this.res.getHeader(SERVER_TIMING.toLocaleLowerCase());
|
|
7
|
+
const value = `${_name};${desc ? `decs="${desc}";` : ""} dur=${dur}`;
|
|
8
|
+
this.res.setHeader(SERVER_TIMING, serverTiming ? `${serverTiming}, ${value}` : value);
|
|
9
|
+
return this;
|
|
10
|
+
}
|
|
11
|
+
constructor(res, meta) {
|
|
12
|
+
_define_property(this, "meta", void 0);
|
|
13
|
+
_define_property(this, "res", void 0);
|
|
14
|
+
this.meta = meta;
|
|
15
|
+
this.res = res;
|
|
16
|
+
}
|
|
17
|
+
}
|