@modern-js/prod-server 2.47.1 → 2.48.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/cjs/libs/context/context.js +4 -8
  2. package/dist/cjs/libs/hook-api/base.js +0 -11
  3. package/dist/cjs/libs/hook-api/index.worker.js +0 -3
  4. package/dist/cjs/libs/hook-api/route.js +0 -4
  5. package/dist/cjs/libs/hook-api/template.js +0 -2
  6. package/dist/cjs/libs/render/ssr.js +7 -3
  7. package/dist/cjs/libs/render/ssrCache/cacheMod.js +0 -5
  8. package/dist/cjs/libs/render/ssrCache/index.js +10 -3
  9. package/dist/cjs/libs/render/ssrCache/manager.js +25 -11
  10. package/dist/cjs/libs/route/index.js +1 -3
  11. package/dist/cjs/libs/route/matcher.js +1 -5
  12. package/dist/cjs/libs/route/route.js +1 -10
  13. package/dist/cjs/libs/serverTiming.js +0 -3
  14. package/dist/cjs/renderHtml.js +0 -7
  15. package/dist/cjs/server/index.js +1 -7
  16. package/dist/cjs/server/modernServer.js +11 -21
  17. package/dist/cjs/workerServer.js +4 -8
  18. package/dist/esm/libs/context/context.js +66 -98
  19. package/dist/esm/libs/hook-api/base.js +36 -71
  20. package/dist/esm/libs/hook-api/index.worker.js +15 -29
  21. package/dist/esm/libs/hook-api/route.js +12 -27
  22. package/dist/esm/libs/hook-api/template.js +33 -61
  23. package/dist/esm/libs/render/ssr.js +8 -4
  24. package/dist/esm/libs/render/ssrCache/cacheMod.js +10 -18
  25. package/dist/esm/libs/render/ssrCache/index.js +40 -21
  26. package/dist/esm/libs/render/ssrCache/manager.js +149 -141
  27. package/dist/esm/libs/route/index.js +62 -96
  28. package/dist/esm/libs/route/matcher.js +58 -94
  29. package/dist/esm/libs/route/route.js +1 -10
  30. package/dist/esm/libs/serverTiming.js +8 -16
  31. package/dist/esm/renderHtml.js +22 -39
  32. package/dist/esm/server/index.js +307 -383
  33. package/dist/esm/server/modernServer.js +802 -936
  34. package/dist/esm/server/modernServerSplit.js +61 -86
  35. package/dist/esm/workerServer.js +87 -82
  36. package/dist/esm-node/libs/context/context.js +4 -8
  37. package/dist/esm-node/libs/hook-api/base.js +0 -11
  38. package/dist/esm-node/libs/hook-api/index.worker.js +0 -3
  39. package/dist/esm-node/libs/hook-api/route.js +0 -4
  40. package/dist/esm-node/libs/hook-api/template.js +0 -2
  41. package/dist/esm-node/libs/render/ssr.js +7 -3
  42. package/dist/esm-node/libs/render/ssrCache/cacheMod.js +0 -5
  43. package/dist/esm-node/libs/render/ssrCache/index.js +10 -3
  44. package/dist/esm-node/libs/render/ssrCache/manager.js +25 -11
  45. package/dist/esm-node/libs/route/index.js +1 -3
  46. package/dist/esm-node/libs/route/matcher.js +1 -5
  47. package/dist/esm-node/libs/route/route.js +1 -10
  48. package/dist/esm-node/libs/serverTiming.js +0 -3
  49. package/dist/esm-node/renderHtml.js +0 -7
  50. package/dist/esm-node/server/index.js +1 -7
  51. package/dist/esm-node/server/modernServer.js +11 -21
  52. package/dist/esm-node/workerServer.js +4 -8
  53. package/dist/types/libs/render/ssrCache/index.d.ts +2 -3
  54. package/dist/types/libs/render/ssrCache/manager.d.ts +7 -1
  55. package/dist/types/type.d.ts +1 -0
  56. package/package.json +8 -8
@@ -1,6 +1,5 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
3
- import { _ as _create_class } from "@swc/helpers/_/_create_class";
4
3
  import { _ as _get } from "@swc/helpers/_/_get";
5
4
  import { _ as _get_prototype_of } from "@swc/helpers/_/_get_prototype_of";
6
5
  import { _ as _inherits } from "@swc/helpers/_/_inherits";
@@ -15,28 +14,21 @@ var ModernSSRServer = /* @__PURE__ */ function(ModernServer2) {
15
14
  _class_call_check(this, ModernSSRServer2);
16
15
  return _super.apply(this, arguments);
17
16
  }
18
- _create_class(ModernSSRServer2, [
19
- {
20
- key: "prepareAPIHandler",
21
- value: function prepareAPIHandler(_) {
22
- return null;
23
- }
24
- },
25
- {
26
- key: "handleAPI",
27
- value: function handleAPI(context) {
28
- var _this = this;
29
- return _async_to_generator(function() {
30
- return _ts_generator(this, function(_state) {
31
- return [
32
- 2,
33
- _this.render404(context)
34
- ];
35
- });
36
- })();
37
- }
38
- }
39
- ]);
17
+ var _proto = ModernSSRServer2.prototype;
18
+ _proto.prepareAPIHandler = function prepareAPIHandler(_) {
19
+ return null;
20
+ };
21
+ _proto.handleAPI = function handleAPI(context) {
22
+ var _this = this;
23
+ return _async_to_generator(function() {
24
+ return _ts_generator(this, function(_state) {
25
+ return [
26
+ 2,
27
+ _this.render404(context)
28
+ ];
29
+ });
30
+ })();
31
+ };
40
32
  return ModernSSRServer2;
41
33
  }(ModernServer);
42
34
  var ModernAPIServer = /* @__PURE__ */ function(ModernServer2) {
@@ -47,22 +39,15 @@ var ModernAPIServer = /* @__PURE__ */ function(ModernServer2) {
47
39
  _class_call_check(this, ModernAPIServer2);
48
40
  return _super.apply(this, arguments);
49
41
  }
50
- _create_class(ModernAPIServer2, [
51
- {
52
- key: "prepareWebHandler",
53
- value: function prepareWebHandler(_) {
54
- return null;
55
- }
56
- },
57
- {
58
- key: "filterRoutes",
59
- value: function filterRoutes(routes) {
60
- return routes.filter(function(route) {
61
- return route.isApi;
62
- });
63
- }
64
- }
65
- ]);
42
+ var _proto = ModernAPIServer2.prototype;
43
+ _proto.prepareWebHandler = function prepareWebHandler(_) {
44
+ return null;
45
+ };
46
+ _proto.filterRoutes = function filterRoutes(routes) {
47
+ return routes.filter(function(route) {
48
+ return route.isApi;
49
+ });
50
+ };
66
51
  return ModernAPIServer2;
67
52
  }(ModernServer);
68
53
  var ModernWebServer = /* @__PURE__ */ function(ModernServer2) {
@@ -73,53 +58,43 @@ var ModernWebServer = /* @__PURE__ */ function(ModernServer2) {
73
58
  _class_call_check(this, ModernWebServer2);
74
59
  return _super.apply(this, arguments);
75
60
  }
76
- _create_class(ModernWebServer2, [
77
- {
78
- key: "warmupSSRBundle",
79
- value: function warmupSSRBundle() {
80
- return _async_to_generator(function() {
81
- return _ts_generator(this, function(_state) {
82
- return [
83
- 2,
84
- null
85
- ];
86
- });
87
- })();
88
- }
89
- },
90
- {
91
- key: "handleAPI",
92
- value: function handleAPI(context) {
93
- var _this = this;
94
- return _async_to_generator(function() {
95
- return _ts_generator(this, function(_state) {
96
- return [
97
- 2,
98
- _this.render404(context)
99
- ];
100
- });
101
- })();
102
- }
103
- },
104
- {
105
- key: "handleWeb",
106
- value: function handleWeb(context, route) {
107
- var _this = this;
108
- var _this1 = this, _superprop_get_handleWeb = function() {
109
- return _get(_get_prototype_of(ModernWebServer2.prototype), "handleWeb", _this);
110
- };
111
- return _async_to_generator(function() {
112
- return _ts_generator(this, function(_state) {
113
- route.isSSR = false;
114
- return [
115
- 2,
116
- _superprop_get_handleWeb().call(_this1, context, route)
117
- ];
118
- });
119
- })();
120
- }
121
- }
122
- ]);
61
+ var _proto = ModernWebServer2.prototype;
62
+ _proto.warmupSSRBundle = function warmupSSRBundle() {
63
+ return _async_to_generator(function() {
64
+ return _ts_generator(this, function(_state) {
65
+ return [
66
+ 2,
67
+ null
68
+ ];
69
+ });
70
+ })();
71
+ };
72
+ _proto.handleAPI = function handleAPI(context) {
73
+ var _this = this;
74
+ return _async_to_generator(function() {
75
+ return _ts_generator(this, function(_state) {
76
+ return [
77
+ 2,
78
+ _this.render404(context)
79
+ ];
80
+ });
81
+ })();
82
+ };
83
+ _proto.handleWeb = function handleWeb(context, route) {
84
+ var _this = this;
85
+ var _this1 = this, _superprop_get_handleWeb = function() {
86
+ return _get(_get_prototype_of(ModernWebServer2.prototype), "handleWeb", _this);
87
+ };
88
+ return _async_to_generator(function() {
89
+ return _ts_generator(this, function(_state) {
90
+ route.isSSR = false;
91
+ return [
92
+ 2,
93
+ _superprop_get_handleWeb().call(_this1, context, route)
94
+ ];
95
+ });
96
+ })();
97
+ };
123
98
  return ModernWebServer2;
124
99
  }(ModernServer);
125
100
  var createProdServer = function(options) {
@@ -1,7 +1,5 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
3
- import { _ as _create_class } from "@swc/helpers/_/_create_class";
4
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
5
3
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
6
4
  import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
7
5
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
@@ -58,56 +56,28 @@ var ReturnResponse = /* @__PURE__ */ function() {
58
56
  function ReturnResponse2(body, status) {
59
57
  var headers = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
60
58
  _class_call_check(this, ReturnResponse2);
61
- _define_property(this, "body", void 0);
62
- _define_property(this, "status", void 0);
63
- _define_property(this, "headers", void 0);
64
59
  this.body = body;
65
60
  this.status = status;
66
61
  this.headers = new Headers(headers);
67
62
  this.headers.set("content-type", "text/html;charset=UTF-8");
68
63
  }
69
- _create_class(ReturnResponse2, [
70
- {
71
- /**
72
- * Iterate a Object
73
- * 1. adds the value if the key does not already exist.
74
- * 2. append the value if the key does already exist.
75
- *
76
- * more detail follow: https://developer.mozilla.org/en-US/docs/Web/API/Headers/append
77
- * @param headers
78
- * @returns
79
- */
80
- key: "appendHeaders",
81
- value: function appendHeaders(headers) {
82
- var _this = this;
83
- Object.entries(headers).forEach(function(param) {
84
- var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
85
- _this.headers.append(key, value.toString());
86
- });
87
- return this;
88
- }
89
- },
90
- {
91
- /**
92
- * Iterate a Object
93
- * 1. adds the value if the key does not already exist.
94
- * 2. modify the value if the key does already exist.
95
- *
96
- * more detail follow: https://developer.mozilla.org/en-US/docs/Web/API/Headers/set
97
- * @param headers
98
- * @returns
99
- */
100
- key: "setHeaders",
101
- value: function setHeaders(headers) {
102
- var _this = this;
103
- Object.entries(headers).forEach(function(param) {
104
- var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
105
- _this.headers.set(key, value.toString());
106
- });
107
- return this;
108
- }
109
- }
110
- ]);
64
+ var _proto = ReturnResponse2.prototype;
65
+ _proto.appendHeaders = function appendHeaders(headers) {
66
+ var _this = this;
67
+ Object.entries(headers).forEach(function(param) {
68
+ var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
69
+ _this.headers.append(key, value.toString());
70
+ });
71
+ return this;
72
+ };
73
+ _proto.setHeaders = function setHeaders(headers) {
74
+ var _this = this;
75
+ Object.entries(headers).forEach(function(param) {
76
+ var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
77
+ _this.headers.set(key, value.toString());
78
+ });
79
+ return this;
80
+ };
111
81
  return ReturnResponse2;
112
82
  }();
113
83
  var RESPONSE_NOTFOUND = new ReturnResponse("404: Page not found", 404);
@@ -181,9 +151,14 @@ var createHandler = function(manifest) {
181
151
  route = pageMatch.generate(url.pathname);
182
152
  hookContext = createWorkerHookContext(request.url, logger, metrics, reporter);
183
153
  afterMatchHookContext = createAfterMatchContext(hookContext, entryName);
184
- 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() {
185
- return void 0;
186
- });
154
+ return [
155
+ 4,
156
+ 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() {
157
+ return void 0;
158
+ })
159
+ ];
160
+ case 1:
161
+ _state.sent();
187
162
  if (checkIsSent(hookContext)) {
188
163
  return [
189
164
  2,
@@ -193,15 +168,15 @@ var createHandler = function(manifest) {
193
168
  if (!page.serverRender)
194
169
  return [
195
170
  3,
196
- 4
171
+ 6
197
172
  ];
198
- _state.label = 1;
199
- case 1:
173
+ _state.label = 2;
174
+ case 2:
200
175
  _state.trys.push([
201
- 1,
202
- 3,
176
+ 2,
177
+ 5,
203
178
  ,
204
- 4
179
+ 6
205
180
  ]);
206
181
  middlewarsHookContext = createMiddlewareContext(hookContext);
207
182
  applyMiddlewares(middlewarsHookContext, (_page_serverHooks1 = page.serverHooks) === null || _page_serverHooks1 === void 0 ? void 0 : _page_serverHooks1.middleware);
@@ -253,12 +228,17 @@ var createHandler = function(manifest) {
253
228
  4,
254
229
  page.serverRender(serverRenderContext)
255
230
  ];
256
- case 2:
231
+ case 3:
257
232
  body = _state.sent();
258
233
  afterRenderHookContext = createAfterRenderContext(hookContext, route, body);
259
- (_page_serverHooks2 = page.serverHooks) === null || _page_serverHooks2 === void 0 ? void 0 : (_page_serverHooks_afterRender = _page_serverHooks2.afterRender) === null || _page_serverHooks_afterRender === void 0 ? void 0 : _page_serverHooks_afterRender.call(_page_serverHooks2, afterRenderHookContext, function() {
260
- return void 0;
261
- });
234
+ return [
235
+ 4,
236
+ (_page_serverHooks2 = page.serverHooks) === null || _page_serverHooks2 === void 0 ? void 0 : (_page_serverHooks_afterRender = _page_serverHooks2.afterRender) === null || _page_serverHooks_afterRender === void 0 ? void 0 : _page_serverHooks_afterRender.call(_page_serverHooks2, afterRenderHookContext, function() {
237
+ return void 0;
238
+ })
239
+ ];
240
+ case 4:
241
+ _state.sent();
262
242
  if (checkIsSent(hookContext)) {
263
243
  return [
264
244
  2,
@@ -269,7 +249,7 @@ var createHandler = function(manifest) {
269
249
  2,
270
250
  new ReturnResponse(afterRenderHookContext.template.get(), responseLike.statusCode, responseLike.headers)
271
251
  ];
272
- case 3:
252
+ case 5:
273
253
  e = _state.sent();
274
254
  console.warn("page(".concat(pageMatch.spec.urlPath, ") serverRender occur error: "));
275
255
  console.warn(e);
@@ -277,7 +257,7 @@ var createHandler = function(manifest) {
277
257
  2,
278
258
  createResponse(page.template)
279
259
  ];
280
- case 4:
260
+ case 6:
281
261
  console.warn("Can't not page(".concat(entryName, ") serverRender"));
282
262
  return [
283
263
  2,
@@ -318,28 +298,53 @@ function createWorkerHookContext(url, logger, metrics, reporter) {
318
298
  }
319
299
  var appliedMiddlewares = false;
320
300
  function applyMiddlewares(ctx, middleware) {
321
- if (middleware) {
322
- var middlewares = function() {
323
- if (Array.isArray(middleware)) {
324
- return middleware;
325
- } else {
326
- return [
327
- middleware
328
- ];
329
- }
330
- }();
331
- if (!appliedMiddlewares) {
332
- middlewares.forEach(function(middleware2) {
333
- middlewarePipeline.use(middleware2);
334
- });
335
- appliedMiddlewares = true;
336
- }
337
- middlewarePipeline.run(ctx, {
338
- onLast: function() {
339
- return void 0;
301
+ return _applyMiddlewares.apply(this, arguments);
302
+ }
303
+ function _applyMiddlewares() {
304
+ _applyMiddlewares = _async_to_generator(function(ctx, middleware) {
305
+ var middlewares;
306
+ return _ts_generator(this, function(_state) {
307
+ switch (_state.label) {
308
+ case 0:
309
+ if (!middleware)
310
+ return [
311
+ 3,
312
+ 2
313
+ ];
314
+ middlewares = function() {
315
+ if (Array.isArray(middleware)) {
316
+ return middleware;
317
+ } else {
318
+ return [
319
+ middleware
320
+ ];
321
+ }
322
+ }();
323
+ if (!appliedMiddlewares) {
324
+ middlewares.forEach(function(middleware2) {
325
+ middlewarePipeline.use(middleware2);
326
+ });
327
+ appliedMiddlewares = true;
328
+ }
329
+ return [
330
+ 4,
331
+ middlewarePipeline.run(ctx, {
332
+ onLast: function() {
333
+ return void 0;
334
+ }
335
+ })
336
+ ];
337
+ case 1:
338
+ _state.sent();
339
+ _state.label = 2;
340
+ case 2:
341
+ return [
342
+ 2
343
+ ];
340
344
  }
341
345
  });
342
- }
346
+ });
347
+ return _applyMiddlewares.apply(this, arguments);
343
348
  }
344
349
  export {
345
350
  ReturnResponse,
@@ -1,7 +1,6 @@
1
1
  import { _ as _class_private_field_get } from "@swc/helpers/_/_class_private_field_get";
2
2
  import { _ as _class_private_field_init } from "@swc/helpers/_/_class_private_field_init";
3
3
  import { _ as _class_private_field_set } from "@swc/helpers/_/_class_private_field_set";
4
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
5
4
  import { URL } from "url";
6
5
  import qs from "querystring";
7
6
  import { Buffer } from "buffer";
@@ -176,13 +175,6 @@ class ModernServerContext {
176
175
  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));
177
176
  }
178
177
  constructor(req, res, options) {
179
- _define_property(this, "req", void 0);
180
- _define_property(this, "res", void 0);
181
- _define_property(this, "params", {});
182
- _define_property(this, "reporter", defaultReporter);
183
- _define_property(this, "serverTiming", void 0);
184
- _define_property(this, "serverData", {});
185
- _define_property(this, "options", {});
186
178
  _class_private_field_init(this, _urls, {
187
179
  writable: true,
188
180
  value: void 0
@@ -191,6 +183,10 @@ class ModernServerContext {
191
183
  writable: true,
192
184
  value: void 0
193
185
  });
186
+ this.params = {};
187
+ this.reporter = defaultReporter;
188
+ this.serverData = {};
189
+ this.options = {};
194
190
  this.req = req;
195
191
  this.res = res;
196
192
  this.options = options || {};
@@ -1,4 +1,3 @@
1
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
1
  import cookie from "cookie";
3
2
  class BaseResponse {
4
3
  get(key) {
@@ -32,8 +31,6 @@ class BaseResponse {
32
31
  this.res.end(body);
33
32
  }
34
33
  constructor(res) {
35
- _define_property(this, "cookies", void 0);
36
- _define_property(this, "res", void 0);
37
34
  this.res = res;
38
35
  this.cookies = {
39
36
  set: this.setCookie.bind(this),
@@ -46,14 +43,6 @@ class BaseRequest {
46
43
  return this._cookie[key];
47
44
  }
48
45
  constructor(request) {
49
- _define_property(this, "url", void 0);
50
- _define_property(this, "host", void 0);
51
- _define_property(this, "pathname", void 0);
52
- _define_property(this, "query", void 0);
53
- _define_property(this, "headers", void 0);
54
- _define_property(this, "cookie", void 0);
55
- _define_property(this, "cookies", void 0);
56
- _define_property(this, "_cookie", void 0);
57
46
  this.url = request.url;
58
47
  this.host = request.host;
59
48
  this.pathname = request.path;
@@ -1,4 +1,3 @@
1
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
1
  import { BaseRequest, BaseResponse } from "./base";
3
2
  import { RouteAPI } from "./route";
4
3
  import { TemplateAPI } from "./template";
@@ -24,8 +23,6 @@ class ServerResponse {
24
23
  this.res.isSent = true;
25
24
  }
26
25
  constructor(res) {
27
- _define_property(this, "locals", void 0);
28
- _define_property(this, "res", void 0);
29
26
  this.res = res;
30
27
  this.locals = res.locals;
31
28
  }
@@ -1,4 +1,3 @@
1
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
1
  class RouteAPI {
3
2
  redirect(url, status = 302) {
4
3
  this.url = url;
@@ -11,9 +10,6 @@ class RouteAPI {
11
10
  this.rewrite(entryName);
12
11
  }
13
12
  constructor(entryName) {
14
- _define_property(this, "current", void 0);
15
- _define_property(this, "status", void 0);
16
- _define_property(this, "url", void 0);
17
13
  this.current = entryName;
18
14
  this.status = 200;
19
15
  this.url = "";
@@ -1,4 +1,3 @@
1
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
1
  const RegList = {
3
2
  before: {
4
3
  head: "<head[^>]*>",
@@ -39,7 +38,6 @@ class TemplateAPI {
39
38
  this.content = this.content.replace(reg, text);
40
39
  }
41
40
  constructor(content) {
42
- _define_property(this, "content", void 0);
43
41
  this.content = content;
44
42
  }
45
43
  }
@@ -56,7 +56,7 @@ const render = async (ctx, renderOptions, runner) => {
56
56
  runner.extendSSRContext(context);
57
57
  const bundleJSContent = await Promise.resolve(require(bundleJS));
58
58
  const serverRender = bundleJSContent[SERVER_RENDER_FUNCTION_NAME];
59
- const content = await ssrCache(ctx.req, serverRender, context);
59
+ const { data: content, status: cacheStatus } = await ssrCache(ctx.req, serverRender, context);
60
60
  const { url, status = 302 } = context.redirection;
61
61
  if (url) {
62
62
  return {
@@ -66,10 +66,13 @@ const render = async (ctx, renderOptions, runner) => {
66
66
  redirect: true
67
67
  };
68
68
  }
69
+ const headers = {};
70
+ cacheStatus && (headers["x-render-cache"] = cacheStatus);
69
71
  if (typeof content === "string") {
70
72
  return {
71
73
  content: injectServerData(content, ctx),
72
- contentType: mime.contentType("html")
74
+ contentType: mime.contentType("html"),
75
+ headers
73
76
  };
74
77
  } else {
75
78
  let contentStream = injectServerDataStream(content, ctx);
@@ -83,7 +86,8 @@ const render = async (ctx, renderOptions, runner) => {
83
86
  return {
84
87
  content: "",
85
88
  contentStream,
86
- contentType: mime.contentType("html")
89
+ contentType: mime.contentType("html"),
90
+ headers
87
91
  };
88
92
  }
89
93
  };
@@ -1,4 +1,3 @@
1
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
1
  import path from "path";
3
2
  import { SERVER_DIR, requireExistModule } from "@modern-js/utils";
4
3
  const CACHE_FILENAME = "cache";
@@ -11,10 +10,6 @@ class ServerCacheMod {
11
10
  this.customContainer = mod === null || mod === void 0 ? void 0 : mod.customContainer;
12
11
  this.cacheOption = mod === null || mod === void 0 ? void 0 : mod.cacheOption;
13
12
  }
14
- constructor() {
15
- _define_property(this, "customContainer", void 0);
16
- _define_property(this, "cacheOption", void 0);
17
- }
18
13
  }
19
14
  const cacheMod = new ServerCacheMod();
20
15
  export {
@@ -12,9 +12,13 @@ async function ssrCache(req, render, ssrContext) {
12
12
  } else {
13
13
  const renderResult = await render(ssrContext);
14
14
  if (!renderResult) {
15
- return "";
15
+ return {
16
+ data: ""
17
+ };
16
18
  } else if (typeof renderResult === "string") {
17
- return renderResult;
19
+ return {
20
+ data: renderResult
21
+ };
18
22
  } else {
19
23
  const stream = new Transform({
20
24
  write(chunk, _, callback) {
@@ -22,7 +26,10 @@ async function ssrCache(req, render, ssrContext) {
22
26
  callback();
23
27
  }
24
28
  });
25
- return renderResult(stream);
29
+ const data = await renderResult(stream);
30
+ return {
31
+ data
32
+ };
26
33
  }
27
34
  }
28
35
  }
@@ -1,5 +1,5 @@
1
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
1
  import { Transform } from "stream";
2
+ import { normalizePathname } from "@modern-js/runtime-utils/url";
3
3
  class CacheManager {
4
4
  async getCacheResult(req, cacheControl, render, ssrContext) {
5
5
  const key = this.computedKey(req, cacheControl);
@@ -10,21 +10,29 @@ class CacheManager {
10
10
  const cache = JSON.parse(value);
11
11
  const interval = Date.now() - cache.cursor;
12
12
  if (interval <= maxAge) {
13
- return cache.val;
13
+ return {
14
+ data: cache.val,
15
+ status: "hit"
16
+ };
14
17
  } else if (interval <= staleWhileRevalidate + maxAge) {
15
18
  this.processCache(key, render, ssrContext, ttl);
16
- return cache.val;
19
+ return {
20
+ data: cache.val,
21
+ status: "stale"
22
+ };
17
23
  } else {
18
- return this.processCache(key, render, ssrContext, ttl);
24
+ return this.processCache(key, render, ssrContext, ttl, "expired");
19
25
  }
20
26
  } else {
21
- return this.processCache(key, render, ssrContext, ttl);
27
+ return this.processCache(key, render, ssrContext, ttl, "miss");
22
28
  }
23
29
  }
24
- async processCache(key, render, ssrContext, ttl) {
30
+ async processCache(key, render, ssrContext, ttl, status) {
25
31
  const renderResult = await render(ssrContext);
26
32
  if (!renderResult) {
27
- return "";
33
+ return {
34
+ data: ""
35
+ };
28
36
  } else if (typeof renderResult === "string") {
29
37
  const current = Date.now();
30
38
  const cache = {
@@ -34,7 +42,10 @@ class CacheManager {
34
42
  await this.container.set(key, JSON.stringify(cache), {
35
43
  ttl
36
44
  });
37
- return renderResult;
45
+ return {
46
+ data: renderResult,
47
+ status
48
+ };
38
49
  } else {
39
50
  let html = "";
40
51
  const stream = new Transform({
@@ -54,14 +65,18 @@ class CacheManager {
54
65
  ttl
55
66
  });
56
67
  });
57
- return renderResult(stream);
68
+ const readable = await renderResult(stream);
69
+ return {
70
+ data: readable,
71
+ status
72
+ };
58
73
  }
59
74
  }
60
75
  computedKey(req, cacheControl) {
61
76
  const { url } = req;
62
77
  const [pathname] = url.split("?");
63
78
  const { customKey } = cacheControl;
64
- const defaultKey = pathname.replace(/.+\/+$/, "");
79
+ const defaultKey = normalizePathname(pathname);
65
80
  if (customKey) {
66
81
  if (typeof customKey === "string") {
67
82
  return customKey;
@@ -73,7 +88,6 @@ class CacheManager {
73
88
  }
74
89
  }
75
90
  constructor(container) {
76
- _define_property(this, "container", void 0);
77
91
  this.container = container;
78
92
  }
79
93
  }