@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.
Files changed (40) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/cjs/libs/context/context.js +16 -6
  3. package/dist/cjs/libs/hook-api/index.js +2 -1
  4. package/dist/cjs/libs/hook-api/index.worker.js +2 -1
  5. package/dist/cjs/libs/proxy.js +29 -11
  6. package/dist/cjs/libs/render/ssr.js +3 -20
  7. package/dist/cjs/libs/reporter.js +22 -0
  8. package/dist/cjs/libs/serverTiming.js +27 -0
  9. package/dist/cjs/server/index.js +14 -0
  10. package/dist/cjs/server/modernServer.js +27 -9
  11. package/dist/cjs/workerServer.js +12 -3
  12. package/dist/esm/libs/context/context.js +14 -4
  13. package/dist/esm/libs/hook-api/index.js +2 -1
  14. package/dist/esm/libs/hook-api/index.worker.js +2 -1
  15. package/dist/esm/libs/proxy.js +80 -32
  16. package/dist/esm/libs/render/ssr.js +6 -30
  17. package/dist/esm/libs/reporter.js +12 -0
  18. package/dist/esm/libs/serverTiming.js +27 -0
  19. package/dist/esm/server/index.js +22 -2
  20. package/dist/esm/server/modernServer.js +56 -33
  21. package/dist/esm/workerServer.js +13 -4
  22. package/dist/esm-node/libs/context/context.js +14 -4
  23. package/dist/esm-node/libs/hook-api/index.js +2 -1
  24. package/dist/esm-node/libs/hook-api/index.worker.js +2 -1
  25. package/dist/esm-node/libs/proxy.js +29 -11
  26. package/dist/esm-node/libs/render/ssr.js +3 -20
  27. package/dist/esm-node/libs/reporter.js +12 -0
  28. package/dist/esm-node/libs/serverTiming.js +17 -0
  29. package/dist/esm-node/server/index.js +14 -0
  30. package/dist/esm-node/server/modernServer.js +27 -9
  31. package/dist/esm-node/workerServer.js +12 -3
  32. package/dist/types/libs/context/context.d.ts +5 -2
  33. package/dist/types/libs/hook-api/index.worker.d.ts +2 -1
  34. package/dist/types/libs/proxy.d.ts +9 -2
  35. package/dist/types/libs/reporter.d.ts +2 -0
  36. package/dist/types/libs/serverTiming.d.ts +12 -0
  37. package/dist/types/server/modernServer.d.ts +1 -2
  38. package/dist/types/type.d.ts +1 -0
  39. package/dist/types/utils.d.ts +1 -1
  40. 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, body, context, bundleJSContent, serverRender, content, _context_redirection, url, _context_redirection_status, status;
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 2:
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 3:
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,12 @@
1
+ export var defaultReporter = {
2
+ init: function init() {
3
+ },
4
+ reportError: function reportError() {
5
+ },
6
+ reportTiming: function reportTiming() {
7
+ },
8
+ reportInfo: function reportInfo() {
9
+ },
10
+ reportWarn: function reportWarn() {
11
+ }
12
+ };
@@ -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
+ }();
@@ -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.server.onInit(_this.runner, _this.app)
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
- _this.proxyHandler = createProxyHandler((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy);
80
- if (_this.proxyHandler) {
81
- _this.proxyHandler.forEach(function(handler) {
82
- _this.addHandler(handler);
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
- 2
699
+ 3
686
700
  ];
687
701
  return [
688
702
  4,
689
703
  _this.handleAPI(context)
690
704
  ];
691
- case 1:
705
+ case 2:
692
706
  _state.sent();
693
707
  return [
694
708
  2
695
709
  ];
696
- case 2:
710
+ case 3:
697
711
  if (!route.entryName)
698
712
  return [
699
713
  3,
700
- 5
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
- 4
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 = 5;
741
- case 5:
757
+ _state.label = 6;
758
+ case 6:
742
759
  if (!_this.frameWebHandler)
743
760
  return [
744
761
  3,
745
- 7
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 6:
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 = 7;
762
- case 7:
781
+ _state.label = 8;
782
+ case 8:
763
783
  return [
764
784
  4,
765
785
  _this.handleWeb(context, route)
766
786
  ];
767
- case 8:
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
- 11
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
- 10
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 = 11;
810
- case 11:
832
+ _state.label = 12;
833
+ case 12:
811
834
  res.end(response);
812
835
  return [
813
836
  2
@@ -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
- hookContext = createWorkerHookContext(request.url, logger, metrics);
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
- const url = new URL(this.req.url, MOCK_URL_BASE);
18
- return url;
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, "serverData", void 0);
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.serverData = {};
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 null;
39
+ return {
40
+ handlers,
41
+ handleUpgrade
42
+ };
31
43
  }
32
- const formattedProxy = formatProxyOptions(proxyOptions);
33
- const middlewares = formattedProxy.map((option) => {
34
- const middleware = createProxyMiddleware(option.context, option);
35
- return async (ctx, next) => {
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 option.bypass === "function" ? option.bypass(req, res, option) : null;
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
- return next();
52
+ next();
41
53
  } else if (typeof bypassUrl === "string") {
42
54
  ctx.url = bypassUrl;
43
- return next();
55
+ next();
56
+ } else {
57
+ middleware(req, res, next);
44
58
  }
45
- middleware(req, res, next);
46
59
  };
47
- });
48
- return middlewares;
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,12 @@
1
+ export const defaultReporter = {
2
+ init() {
3
+ },
4
+ reportError() {
5
+ },
6
+ reportTiming() {
7
+ },
8
+ reportInfo() {
9
+ },
10
+ reportWarn() {
11
+ }
12
+ };
@@ -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
+ }