@modern-js/server-core 2.54.5 → 2.55.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 (39) hide show
  1. package/dist/cjs/index.js +3 -1
  2. package/dist/cjs/plugins/render/dataHandler.js +3 -2
  3. package/dist/cjs/plugins/render/index.js +1 -1
  4. package/dist/cjs/plugins/render/render.js +37 -13
  5. package/dist/cjs/plugins/render/serverTiming.js +6 -4
  6. package/dist/cjs/plugins/render/ssrCache.js +72 -83
  7. package/dist/cjs/plugins/render/ssrRender.js +40 -145
  8. package/dist/cjs/types/requestHandler.js +16 -0
  9. package/dist/cjs/utils/transformStream.js +1 -1
  10. package/dist/esm/index.js +1 -0
  11. package/dist/esm/plugins/render/dataHandler.js +4 -3
  12. package/dist/esm/plugins/render/index.js +1 -1
  13. package/dist/esm/plugins/render/render.js +56 -22
  14. package/dist/esm/plugins/render/serverTiming.js +12 -4
  15. package/dist/esm/plugins/render/ssrCache.js +101 -131
  16. package/dist/esm/plugins/render/ssrRender.js +55 -175
  17. package/dist/esm/types/requestHandler.js +0 -0
  18. package/dist/esm/utils/transformStream.js +16 -2
  19. package/dist/esm-node/index.js +1 -0
  20. package/dist/esm-node/plugins/render/dataHandler.js +3 -2
  21. package/dist/esm-node/plugins/render/index.js +1 -1
  22. package/dist/esm-node/plugins/render/render.js +38 -14
  23. package/dist/esm-node/plugins/render/serverTiming.js +6 -4
  24. package/dist/esm-node/plugins/render/ssrCache.js +73 -74
  25. package/dist/esm-node/plugins/render/ssrRender.js +43 -137
  26. package/dist/esm-node/types/requestHandler.js +0 -0
  27. package/dist/esm-node/utils/transformStream.js +1 -1
  28. package/dist/types/index.d.ts +1 -0
  29. package/dist/types/plugins/render/dataHandler.d.ts +1 -1
  30. package/dist/types/plugins/render/render.d.ts +3 -2
  31. package/dist/types/plugins/render/serverTiming.d.ts +3 -2
  32. package/dist/types/plugins/render/ssrCache.d.ts +7 -11
  33. package/dist/types/plugins/render/ssrRender.d.ts +10 -10
  34. package/dist/types/types/config/html.d.ts +11 -0
  35. package/dist/types/types/config/output.d.ts +8 -0
  36. package/dist/types/types/requestHandler.d.ts +43 -0
  37. package/dist/types/types/server.d.ts +7 -2
  38. package/dist/types/utils/transformStream.d.ts +1 -1
  39. package/package.json +7 -8
@@ -208,7 +208,7 @@ function _getRenderHandler() {
208
208
  render = createRender({
209
209
  routes,
210
210
  pwd,
211
- // TODO: need static Genrate
211
+ config,
212
212
  staticGenerate,
213
213
  cacheConfig,
214
214
  forceCSR,
@@ -1,14 +1,18 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
3
+ import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
4
+ import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
5
+ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
3
6
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
4
7
  import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
5
8
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
6
9
  import { cutNameByHyphen } from "@modern-js/utils/universal";
7
10
  import { TrieRouter } from "hono/router/trie-router";
8
- import { parseQuery, getPathname, createErrorHtml, sortRoutes, transformResponse, onError as onErrorFn, ErrorDigest } from "../../utils";
11
+ import { parseQuery, getPathname, createErrorHtml, sortRoutes, transformResponse, onError as onErrorFn, ErrorDigest, parseHeaders } from "../../utils";
9
12
  import { REPLACE_REG, X_MODERNJS_RENDER } from "../../constants";
10
13
  import { dataHandler } from "./dataHandler";
11
14
  import { ssrRender } from "./ssrRender";
15
+ import { ServerTiming } from "./serverTiming";
12
16
  var DYNAMIC_ROUTE_REG = /\/:./;
13
17
  function getRouter(routes) {
14
18
  var dynamicRoutes = [];
@@ -52,20 +56,28 @@ function matchRoute(router, request) {
52
56
  var result = matched[0][0];
53
57
  return result || [];
54
58
  }
59
+ function getHeadersWithoutCookie(headers) {
60
+ var _headers = _object_spread_props(_object_spread({}, headers), {
61
+ cookie: void 0
62
+ });
63
+ delete _headers.cookie;
64
+ return _headers;
65
+ }
66
+ var SERVER_TIMING = "Server-Timing";
55
67
  function createRender(_) {
56
68
  return _createRender.apply(this, arguments);
57
69
  }
58
70
  function _createRender() {
59
71
  _createRender = _async_to_generator(function(param) {
60
- var routes, pwd, metaName, staticGenerate, cacheConfig, forceCSR, nonce, onFallbackFn, router;
72
+ var routes, pwd, metaName, staticGenerate, cacheConfig, forceCSR, config, onFallbackFn, router;
61
73
  return _ts_generator(this, function(_state) {
62
- routes = param.routes, pwd = param.pwd, metaName = param.metaName, staticGenerate = param.staticGenerate, cacheConfig = param.cacheConfig, forceCSR = param.forceCSR, nonce = param.nonce, onFallbackFn = param.onFallback;
74
+ routes = param.routes, pwd = param.pwd, metaName = param.metaName, staticGenerate = param.staticGenerate, cacheConfig = param.cacheConfig, forceCSR = param.forceCSR, config = param.config, onFallbackFn = param.onFallback;
63
75
  router = getRouter(routes);
64
76
  return [
65
77
  2,
66
78
  function() {
67
79
  var _ref = _async_to_generator(function(req, param2) {
68
- var logger, nodeReq, reporter, templates, serverManifest, locals, metrics, loaderContext, _matchRoute, routeInfo, params, onFallback, html, renderMode, onError, renderOptions, response;
80
+ var logger, nodeReq, reporter, templates, serverManifest, locals, metrics, loaderContext, _matchRoute, routeInfo, params, onFallback, html, renderMode, pathname, headerData, serverTimingInstance, onError, onTiming, onBoundError, renderOptions, response, _tmp;
69
81
  return _ts_generator(this, function(_state2) {
70
82
  switch (_state2.label) {
71
83
  case 0:
@@ -117,7 +129,17 @@ function _createRender() {
117
129
  ];
118
130
  case 1:
119
131
  renderMode = _state2.sent();
120
- onError = function() {
132
+ pathname = getPathname(req);
133
+ headerData = parseHeaders(req);
134
+ serverTimingInstance = new ServerTiming(metaName || "modern");
135
+ onError = function(e) {
136
+ logger.error("SSR Error - ".concat(_instanceof(e, Error) ? e.name : e, ", error = %s, req.url = %s, req.headers = %o"), _instanceof(e, Error) ? e.stack || e.message : e, pathname, getHeadersWithoutCookie(headerData));
137
+ };
138
+ onTiming = function(name, dur) {
139
+ logger.debug("SSR Debug - ".concat(name, ", cost = %s, req.url = %s"), dur, pathname);
140
+ serverTimingInstance.addServeTiming(name, dur);
141
+ };
142
+ onBoundError = function() {
121
143
  var _ref2 = _async_to_generator(function(e) {
122
144
  return _ts_generator(this, function(_state3) {
123
145
  switch (_state3.label) {
@@ -135,7 +157,7 @@ function _createRender() {
135
157
  }
136
158
  });
137
159
  });
138
- return function onError2(e) {
160
+ return function onBoundError2(e) {
139
161
  return _ref2.apply(this, arguments);
140
162
  };
141
163
  }();
@@ -144,18 +166,19 @@ function _createRender() {
144
166
  html,
145
167
  routeInfo,
146
168
  staticGenerate: staticGenerate || false,
147
- metaName: metaName || "modern-js",
148
- nonce,
149
- logger,
169
+ config,
150
170
  nodeReq,
151
171
  cacheConfig,
152
172
  reporter,
153
173
  serverRoutes: routes,
154
174
  params,
175
+ logger,
176
+ metrics,
155
177
  locals,
156
178
  serverManifest,
157
- metrics,
158
- loaderContext: loaderContext || /* @__PURE__ */ new Map()
179
+ loaderContext: loaderContext || /* @__PURE__ */ new Map(),
180
+ onError,
181
+ onTiming
159
182
  };
160
183
  switch (renderMode) {
161
184
  case "data":
@@ -176,7 +199,7 @@ function _createRender() {
176
199
  }
177
200
  return [
178
201
  3,
179
- 7
202
+ 8
180
203
  ];
181
204
  case 2:
182
205
  return [
@@ -184,34 +207,45 @@ function _createRender() {
184
207
  dataHandler(req, renderOptions)
185
208
  ];
186
209
  case 3:
187
- response = _state2.sent();
188
- if (!!response)
210
+ _tmp = _state2.sent();
211
+ if (_tmp)
189
212
  return [
190
213
  3,
191
214
  5
192
215
  ];
193
216
  return [
194
217
  4,
195
- renderHandler(req, renderOptions, "ssr", onError)
218
+ renderHandler(req, renderOptions, "ssr", onBoundError)
196
219
  ];
197
220
  case 4:
198
- response = _state2.sent();
221
+ _tmp = _state2.sent();
199
222
  _state2.label = 5;
200
223
  case 5:
224
+ response = _tmp;
201
225
  return [
202
- 2,
203
- response
226
+ 3,
227
+ 9
204
228
  ];
205
229
  case 6:
206
230
  return [
207
- 2,
208
- renderHandler(req, renderOptions, renderMode, onError)
231
+ 4,
232
+ renderHandler(req, renderOptions, renderMode, onBoundError)
209
233
  ];
210
234
  case 7:
211
- throw new Error("Unknown render mode: ".concat(renderMode));
235
+ response = _state2.sent();
236
+ return [
237
+ 3,
238
+ 9
239
+ ];
212
240
  case 8:
241
+ throw new Error("Unknown render mode: ".concat(renderMode));
242
+ case 9:
243
+ serverTimingInstance.headers.forEach(function(value) {
244
+ response.headers.append(SERVER_TIMING, value);
245
+ });
213
246
  return [
214
- 2
247
+ 2,
248
+ response
215
249
  ];
216
250
  }
217
251
  });
@@ -1,19 +1,27 @@
1
1
  import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
2
- var SERVER_TIMING = "Server-Timing";
2
+ import { _ as _create_class } from "@swc/helpers/_/_create_class";
3
3
  var ServerTiming = /* @__PURE__ */ function() {
4
4
  "use strict";
5
- function ServerTiming2(headers, meta) {
5
+ function ServerTiming2(meta) {
6
6
  _class_call_check(this, ServerTiming2);
7
+ this.headerList = [];
7
8
  this.meta = meta;
8
- this.headers = headers;
9
9
  }
10
10
  var _proto = ServerTiming2.prototype;
11
11
  _proto.addServeTiming = function addServeTiming(name, dur, desc) {
12
12
  var _name = "bd-".concat(this.meta, "-").concat(name);
13
13
  var value = "".concat(_name, ";").concat(desc ? 'decs="'.concat(desc, '";') : "", " dur=").concat(dur);
14
- this.headers.append(SERVER_TIMING, value);
14
+ this.headerList.push(value);
15
15
  return this;
16
16
  };
17
+ _create_class(ServerTiming2, [
18
+ {
19
+ key: "headers",
20
+ get: function get() {
21
+ return this.headerList;
22
+ }
23
+ }
24
+ ]);
17
25
  return ServerTiming2;
18
26
  }();
19
27
  export {
@@ -1,139 +1,66 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
- import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
2
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
3
3
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
4
4
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
5
5
  import { createMemoryStorage } from "@modern-js/runtime-utils/storer";
6
- import { createTransformStream, getPathname, getRuntimeEnv } from "../../utils";
7
- function processCache(key, render, ssrContext, ttl, container, status) {
6
+ import { X_RENDER_CACHE } from "../../constants";
7
+ import { createTransformStream, getPathname } from "../../utils";
8
+ function processCache(_) {
8
9
  return _processCache.apply(this, arguments);
9
10
  }
10
11
  function _processCache() {
11
- _processCache = _async_to_generator(function(key, render, ssrContext, ttl, container, status) {
12
- var renderResult, current, cache, Readable, runtimeEnv, streamModule, createReadableStreamFromReadable, _tmp, body, html, stream, reader, writer, push;
12
+ _processCache = _async_to_generator(function(param) {
13
+ var request, key, requestHandler, requestHandlerOptions, ttl, container, cacheStatus, response, decoder, stream, reader, writer, html, push;
13
14
  return _ts_generator(this, function(_state) {
14
15
  switch (_state.label) {
15
16
  case 0:
17
+ request = param.request, key = param.key, requestHandler = param.requestHandler, requestHandlerOptions = param.requestHandlerOptions, ttl = param.ttl, container = param.container, cacheStatus = param.cacheStatus;
16
18
  return [
17
19
  4,
18
- render(ssrContext)
20
+ requestHandler(request, requestHandlerOptions)
19
21
  ];
20
22
  case 1:
21
- renderResult = _state.sent();
22
- if (!!renderResult)
23
- return [
24
- 3,
25
- 2
26
- ];
27
- return [
28
- 2,
29
- {
30
- data: ""
31
- }
32
- ];
33
- case 2:
34
- if (!(typeof renderResult === "string"))
35
- return [
36
- 3,
37
- 4
38
- ];
39
- current = Date.now();
40
- cache = {
41
- val: renderResult,
42
- cursor: current
43
- };
44
- return [
45
- 4,
46
- container.set(key, JSON.stringify(cache), {
47
- ttl
48
- })
49
- ];
50
- case 3:
51
- _state.sent();
52
- return [
53
- 2,
54
- {
55
- data: renderResult,
56
- status
57
- }
58
- ];
59
- case 4:
60
- return [
61
- 4,
62
- import("stream").catch(function(_) {
63
- return {
64
- Readable: void 0
65
- };
66
- })
67
- ];
68
- case 5:
69
- Readable = _state.sent().Readable;
70
- runtimeEnv = getRuntimeEnv();
71
- streamModule = "../../adapters/node/polyfills/stream";
72
- if (!(runtimeEnv === "node"))
23
+ response = _state.sent();
24
+ decoder = new TextDecoder();
25
+ if (response.body) {
26
+ stream = createTransformStream();
27
+ reader = response.body.getReader();
28
+ writer = stream.writable.getWriter();
29
+ html = "";
30
+ push = function() {
31
+ return reader.read().then(function(param2) {
32
+ var done = param2.done, value = param2.value;
33
+ if (done) {
34
+ var current = Date.now();
35
+ var cache = {
36
+ val: html,
37
+ cursor: current
38
+ };
39
+ container.set(key, JSON.stringify(cache), {
40
+ ttl
41
+ });
42
+ writer.close();
43
+ return;
44
+ }
45
+ var content = decoder.decode(value);
46
+ html += content;
47
+ writer.write(value);
48
+ push();
49
+ });
50
+ };
51
+ push();
52
+ cacheStatus && response.headers.set(X_RENDER_CACHE, cacheStatus);
73
53
  return [
74
- 3,
75
- 7
54
+ 2,
55
+ new Response(stream.readable, {
56
+ status: response.status,
57
+ headers: response.headers
58
+ })
76
59
  ];
77
- return [
78
- 4,
79
- import(streamModule).catch(function(_) {
80
- return {
81
- createReadableStreamFromReadable: void 0
82
- };
83
- })
84
- ];
85
- case 6:
86
- _tmp = _state.sent();
87
- return [
88
- 3,
89
- 8
90
- ];
91
- case 7:
92
- _tmp = {
93
- createReadableStreamFromReadable: void 0
94
- };
95
- _state.label = 8;
96
- case 8:
97
- createReadableStreamFromReadable = _tmp.createReadableStreamFromReadable;
98
- body = // TODO: remove node:stream, move it to ssr entry.
99
- Readable && _instanceof(renderResult, Readable) ? createReadableStreamFromReadable === null || createReadableStreamFromReadable === void 0 ? void 0 : createReadableStreamFromReadable(renderResult) : renderResult;
100
- html = "";
101
- stream = createTransformStream(function(chunk) {
102
- html += chunk;
103
- return chunk;
104
- });
105
- reader = body.getReader();
106
- writer = stream.writable.getWriter();
107
- push = function() {
108
- reader.read().then(function(param) {
109
- var done = param.done, value = param.value;
110
- if (done) {
111
- var current2 = Date.now();
112
- var cache2 = {
113
- val: html,
114
- cursor: current2
115
- };
116
- container.set(key, JSON.stringify(cache2), {
117
- ttl
118
- });
119
- writer.close();
120
- return;
121
- }
122
- writer.write(value);
123
- push();
124
- });
125
- };
126
- push();
60
+ }
127
61
  return [
128
62
  2,
129
- {
130
- data: stream.readable,
131
- status
132
- }
133
- ];
134
- case 9:
135
- return [
136
- 2
63
+ response
137
64
  ];
138
65
  }
139
66
  });
@@ -206,11 +133,11 @@ function getCacheResult(request, options) {
206
133
  }
207
134
  function _getCacheResult() {
208
135
  _getCacheResult = _async_to_generator(function(request, options) {
209
- var cacheControl, render, ssrContext, _options_container, container, key, value, maxAge, staleWhileRevalidate, ttl, cache, interval;
136
+ var cacheControl, _options_container, container, requestHandler, requestHandlerOptions, key, value, maxAge, staleWhileRevalidate, ttl, cache, interval, cacheStatus, cacheStatus1;
210
137
  return _ts_generator(this, function(_state) {
211
138
  switch (_state.label) {
212
139
  case 0:
213
- cacheControl = options.cacheControl, render = options.render, ssrContext = options.ssrContext, _options_container = options.container, container = _options_container === void 0 ? storage : _options_container;
140
+ cacheControl = options.cacheControl, _options_container = options.container, container = _options_container === void 0 ? storage : _options_container, requestHandler = options.requestHandler, requestHandlerOptions = options.requestHandlerOptions;
214
141
  key = computedKey(request, cacheControl);
215
142
  return [
216
143
  4,
@@ -224,32 +151,75 @@ function _getCacheResult() {
224
151
  cache = JSON.parse(value);
225
152
  interval = Date.now() - cache.cursor;
226
153
  if (interval <= maxAge) {
154
+ cacheStatus = "hit";
227
155
  return [
228
156
  2,
229
- {
230
- data: cache.val,
231
- status: "hit"
232
- }
157
+ new Response(cache.val, {
158
+ headers: _define_property({}, X_RENDER_CACHE, cacheStatus)
159
+ })
233
160
  ];
234
161
  } else if (interval <= staleWhileRevalidate + maxAge) {
235
- processCache(key, render, ssrContext, ttl, container);
162
+ processCache({
163
+ key,
164
+ request,
165
+ requestHandler,
166
+ requestHandlerOptions,
167
+ ttl,
168
+ container
169
+ }).then(function() {
170
+ var _ref = _async_to_generator(function(response) {
171
+ return _ts_generator(this, function(_state2) {
172
+ switch (_state2.label) {
173
+ case 0:
174
+ return [
175
+ 4,
176
+ response.text()
177
+ ];
178
+ case 1:
179
+ _state2.sent();
180
+ return [
181
+ 2
182
+ ];
183
+ }
184
+ });
185
+ });
186
+ return function(response) {
187
+ return _ref.apply(this, arguments);
188
+ };
189
+ }());
190
+ cacheStatus1 = "stale";
236
191
  return [
237
192
  2,
238
- {
239
- data: cache.val,
240
- status: "stale"
241
- }
193
+ new Response(cache.val, {
194
+ headers: _define_property({}, X_RENDER_CACHE, cacheStatus1)
195
+ })
242
196
  ];
243
197
  } else {
244
198
  return [
245
199
  2,
246
- processCache(key, render, ssrContext, ttl, container, "expired")
200
+ processCache({
201
+ key,
202
+ request,
203
+ requestHandler,
204
+ requestHandlerOptions,
205
+ ttl,
206
+ container,
207
+ cacheStatus: "expired"
208
+ })
247
209
  ];
248
210
  }
249
211
  } else {
250
212
  return [
251
213
  2,
252
- processCache(key, render, ssrContext, ttl, container, "miss")
214
+ processCache({
215
+ key,
216
+ request,
217
+ requestHandler,
218
+ requestHandlerOptions,
219
+ ttl,
220
+ container,
221
+ cacheStatus: "miss"
222
+ })
253
223
  ];
254
224
  }
255
225
  return [