@bleedingdev/modern-js-server-core 3.9.0-ultramodern.2 → 3.9.0-ultramodern.21

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 (65) hide show
  1. package/dist/cjs/adapters/node/hono.js +15 -5
  2. package/dist/cjs/adapters/node/index.js +4 -0
  3. package/dist/cjs/adapters/node/plugins/static.js +107 -29
  4. package/dist/cjs/helper.js +1 -1
  5. package/dist/cjs/index.js +10 -34
  6. package/dist/cjs/plugins/compat/index.js +1 -0
  7. package/dist/cjs/plugins/render/render.js +3 -4
  8. package/dist/cjs/plugins/render/ssrCache.js +63 -42
  9. package/dist/cjs/serverBase.js +60 -19
  10. package/dist/cjs/utils/error.js +0 -10
  11. package/dist/cjs/utils/transformStream.js +1 -1
  12. package/dist/esm/adapters/node/hono.mjs +15 -5
  13. package/dist/esm/adapters/node/index.mjs +1 -0
  14. package/dist/esm/adapters/node/plugins/static.mjs +107 -32
  15. package/dist/esm/helper.mjs +1 -1
  16. package/dist/esm/index.mjs +1 -1
  17. package/dist/esm/plugins/compat/index.mjs +1 -0
  18. package/dist/esm/plugins/render/render.mjs +4 -11
  19. package/dist/esm/plugins/render/ssrCache.mjs +63 -42
  20. package/dist/esm/serverBase.mjs +60 -19
  21. package/dist/esm/utils/error.mjs +0 -1
  22. package/dist/esm/utils/transformStream.mjs +1 -1
  23. package/dist/esm-node/adapters/node/hono.mjs +15 -5
  24. package/dist/esm-node/adapters/node/index.mjs +1 -0
  25. package/dist/esm-node/adapters/node/plugins/static.mjs +107 -32
  26. package/dist/esm-node/helper.mjs +1 -1
  27. package/dist/esm-node/index.mjs +1 -1
  28. package/dist/esm-node/plugins/compat/index.mjs +1 -0
  29. package/dist/esm-node/plugins/render/render.mjs +4 -11
  30. package/dist/esm-node/plugins/render/ssrCache.mjs +63 -42
  31. package/dist/esm-node/serverBase.mjs +60 -19
  32. package/dist/esm-node/utils/error.mjs +0 -1
  33. package/dist/esm-node/utils/transformStream.mjs +1 -1
  34. package/dist/types/adapters/node/index.d.ts +2 -0
  35. package/dist/types/adapters/node/plugins/static.d.ts +42 -4
  36. package/dist/types/index.d.ts +1 -2
  37. package/dist/types/serverBase.d.ts +6 -0
  38. package/dist/types/types/config/bff.d.ts +4 -15
  39. package/dist/types/types/config/server.d.ts +1 -3
  40. package/dist/types/types/plugins/plugin.d.ts +15 -1
  41. package/dist/types/types/requestHandler.d.ts +2 -3
  42. package/dist/types/utils/error.d.ts +0 -2
  43. package/package.json +9 -10
  44. package/dist/cjs/adapters/node/plugins/staticModuleFederation.js +0 -173
  45. package/dist/cjs/adapters/node/plugins/staticPrecompressed.js +0 -152
  46. package/dist/cjs/adapters/node/plugins/staticServing.js +0 -206
  47. package/dist/cjs/types/config/bffRuntime.js +0 -18
  48. package/dist/cjs/types/config/serverTelemetry.js +0 -18
  49. package/dist/esm/adapters/node/plugins/staticModuleFederation.mjs +0 -104
  50. package/dist/esm/adapters/node/plugins/staticPrecompressed.mjs +0 -111
  51. package/dist/esm/adapters/node/plugins/staticServing.mjs +0 -152
  52. package/dist/esm/rslib-runtime~1.mjs +0 -18
  53. package/dist/esm/types/config/bffRuntime.mjs +0 -0
  54. package/dist/esm/types/config/serverTelemetry.mjs +0 -0
  55. package/dist/esm-node/adapters/node/plugins/staticModuleFederation.mjs +0 -105
  56. package/dist/esm-node/adapters/node/plugins/staticPrecompressed.mjs +0 -112
  57. package/dist/esm-node/adapters/node/plugins/staticServing.mjs +0 -153
  58. package/dist/esm-node/rslib-runtime~0.mjs +0 -19
  59. package/dist/esm-node/types/config/bffRuntime.mjs +0 -1
  60. package/dist/esm-node/types/config/serverTelemetry.mjs +0 -1
  61. package/dist/types/adapters/node/plugins/staticModuleFederation.d.ts +0 -13
  62. package/dist/types/adapters/node/plugins/staticPrecompressed.d.ts +0 -13
  63. package/dist/types/adapters/node/plugins/staticServing.d.ts +0 -25
  64. package/dist/types/types/config/bffRuntime.d.ts +0 -116
  65. package/dist/types/types/config/serverTelemetry.d.ts +0 -319
@@ -64,12 +64,22 @@ const httpCallBack2HonoMid = (handler)=>async (context, next)=>{
64
64
  };
65
65
  const noop = ()=>{};
66
66
  const connectMid2HonoMid = (handler)=>async (context, next)=>new Promise((resolve, reject)=>{
67
- const { req, res } = context.env.node;
67
+ const { req, res: rawRes } = context.env.node;
68
+ const res = rawRes;
68
69
  if (handler.length < 3) resolve(handler(req, res, noop));
69
- else handler(req, res, (err)=>{
70
- if (err) reject(err);
71
- else resolve(next());
72
- });
70
+ else {
71
+ const onFinish = ()=>{
72
+ context.res;
73
+ context.finalized = true;
74
+ resolve();
75
+ };
76
+ res.once?.('finish', onFinish);
77
+ handler(req, res, (err)=>{
78
+ res.removeListener?.('finish', onFinish);
79
+ if (err) reject(err);
80
+ else resolve(next());
81
+ });
82
+ }
73
83
  });
74
84
  const connectMockMid2HonoMid = (handler)=>async (context, next)=>new Promise((resolve, reject)=>{
75
85
  const { req, res: rawRes } = context.env.node;
@@ -44,12 +44,14 @@ __webpack_require__.d(__webpack_exports__, {
44
44
  loadServerPlugins: ()=>index_js_namespaceObject.loadServerPlugins,
45
45
  loadServerRuntimeConfig: ()=>index_js_namespaceObject.loadServerRuntimeConfig,
46
46
  sendResponse: ()=>external_node_js_namespaceObject.sendResponse,
47
+ serveStaticAsset: ()=>static_js_namespaceObject.serveStaticAsset,
47
48
  serverStaticPlugin: ()=>external_plugins_index_js_namespaceObject.serverStaticPlugin
48
49
  });
49
50
  const index_js_namespaceObject = require("./helper/index.js");
50
51
  const external_hono_js_namespaceObject = require("./hono.js");
51
52
  const external_node_js_namespaceObject = require("./node.js");
52
53
  const external_plugins_index_js_namespaceObject = require("./plugins/index.js");
54
+ const static_js_namespaceObject = require("./plugins/static.js");
53
55
  exports.connectMid2HonoMid = __webpack_exports__.connectMid2HonoMid;
54
56
  exports.connectMockMid2HonoMid = __webpack_exports__.connectMockMid2HonoMid;
55
57
  exports.createNodeServer = __webpack_exports__.createNodeServer;
@@ -66,6 +68,7 @@ exports.loadServerEnv = __webpack_exports__.loadServerEnv;
66
68
  exports.loadServerPlugins = __webpack_exports__.loadServerPlugins;
67
69
  exports.loadServerRuntimeConfig = __webpack_exports__.loadServerRuntimeConfig;
68
70
  exports.sendResponse = __webpack_exports__.sendResponse;
71
+ exports.serveStaticAsset = __webpack_exports__.serveStaticAsset;
69
72
  exports.serverStaticPlugin = __webpack_exports__.serverStaticPlugin;
70
73
  for(var __rspack_i in __webpack_exports__)if (-1 === [
71
74
  "connectMid2HonoMid",
@@ -84,6 +87,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
84
87
  "loadServerPlugins",
85
88
  "loadServerRuntimeConfig",
86
89
  "sendResponse",
90
+ "serveStaticAsset",
87
91
  "serverStaticPlugin"
88
92
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
89
93
  Object.defineProperty(exports, '__esModule', {
@@ -39,14 +39,62 @@ __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
40
  createPublicMiddleware: ()=>createPublicMiddleware,
41
41
  createStaticMiddleware: ()=>createStaticMiddleware,
42
+ serveStaticAsset: ()=>serveStaticAsset,
42
43
  serverStaticPlugin: ()=>serverStaticPlugin
43
44
  });
45
+ const fileReader_namespaceObject = require("@modern-js/runtime-utils/fileReader");
46
+ const utils_namespaceObject = require("@modern-js/utils");
47
+ const mime_namespaceObject = require("hono/utils/mime");
44
48
  const external_path_namespaceObject = require("path");
45
49
  var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
46
50
  const index_js_namespaceObject = require("../../../utils/index.js");
47
51
  const publicDir_js_namespaceObject = require("../../../utils/publicDir.js");
48
- const external_staticServing_js_namespaceObject = require("./staticServing.js");
49
- const serverStaticPlugin = ()=>({
52
+ const isPathInside = (target, root)=>{
53
+ const relative = external_path_default().relative(external_path_default().resolve(root), external_path_default().resolve(target));
54
+ return '' === relative || !relative.startsWith(`..${external_path_default().sep}`) && '..' !== relative && !external_path_default().isAbsolute(relative);
55
+ };
56
+ async function serveStaticAsset(context, asset, respond) {
57
+ let { filename } = asset;
58
+ const { kind } = asset;
59
+ if (asset.root && !isPathInside(filename, asset.root)) return null;
60
+ if (asset.realpath) try {
61
+ const [realFilename, realRoot, stat] = await Promise.all([
62
+ utils_namespaceObject.fs.realpath(filename),
63
+ asset.root ? utils_namespaceObject.fs.realpath(asset.root) : Promise.resolve(void 0),
64
+ utils_namespaceObject.fs.stat(filename)
65
+ ]);
66
+ if (!stat.isFile() || realRoot && !isPathInside(realFilename, realRoot)) return null;
67
+ filename = realFilename;
68
+ asset = {
69
+ ...asset,
70
+ filename,
71
+ root: realRoot
72
+ };
73
+ } catch {
74
+ return null;
75
+ }
76
+ if ('static' === kind && !await utils_namespaceObject.fs.pathExists(filename)) return null;
77
+ if (respond) return respond(asset, (representation)=>serveStaticAsset(context, {
78
+ ...asset,
79
+ ...representation,
80
+ filename: representation?.filename ?? asset.filename,
81
+ mimeFilename: asset.mimeFilename ?? filename
82
+ }));
83
+ const mimeType = (0, mime_namespaceObject.getMimeType)(asset.mimeFilename ?? filename);
84
+ if ('static' === kind && mimeType) context.header('Content-Type', mimeType);
85
+ const size = 'static' === kind ? (await utils_namespaceObject.fs.lstat(filename)).size : void 0;
86
+ const data = 'static' === kind ? await fileReader_namespaceObject.fileReader.readFileFromSystem(filename, 'buffer') : await fileReader_namespaceObject.fileReader.readFile(filename, 'buffer');
87
+ if ('static' === kind && (asset.contentLength ?? true)) context.header('Content-Length', String(true === asset.contentLength && data ? data.byteLength : size));
88
+ if (null === data) return null;
89
+ if ('public' === kind && mimeType) context.header('Content-Type', mimeType);
90
+ Object.entries(asset.responseHeaders || {}).forEach(([key, value])=>{
91
+ context.header(key, value);
92
+ });
93
+ if ('public' === kind && asset.contentLength) context.header('Content-Length', String(data.byteLength));
94
+ const body = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
95
+ return context.body(body, 200);
96
+ }
97
+ const serverStaticPlugin = (options = {})=>({
50
98
  name: '@modern-js/plugin-server-static',
51
99
  setup (api) {
52
100
  api.onPrepare(()=>{
@@ -57,7 +105,9 @@ const serverStaticPlugin = ()=>({
57
105
  routes,
58
106
  output: config.output || {},
59
107
  html: config.html || {},
60
- server: config.server || {}
108
+ server: config.server || {},
109
+ ...api.getServerContext().staticAssetResponders,
110
+ ...options
61
111
  });
62
112
  middlewares.push({
63
113
  name: 'server-static',
@@ -66,16 +116,33 @@ const serverStaticPlugin = ()=>({
66
116
  });
67
117
  }
68
118
  });
69
- function createPublicMiddleware({ pwd, routes }) {
119
+ function createPublicMiddleware({ pwd, routes, pathPrefix = '/', respondAsset, respondPublicFallback }) {
70
120
  return async (c, next)=>{
71
- const route = matchPublicRoute(c.req, routes);
72
- if (route) {
73
- const response = await (0, external_staticServing_js_namespaceObject.servePreCompressedPublicRouteAsset)(c, pwd, route);
74
- if (null !== response) return response;
75
- }
76
- const generatedPublicAsset = await (0, external_staticServing_js_namespaceObject.servePublicDirectoryAsset)(c, pwd);
77
- if (null !== generatedPublicAsset) return generatedPublicAsset;
78
- return await next();
121
+ const respondPublic = async ()=>{
122
+ const route = matchPublicRoute(c.req, routes);
123
+ if (!route) return null;
124
+ const asset = {
125
+ filename: external_path_default().join(pwd, route.entryPath),
126
+ kind: 'public',
127
+ responseHeaders: route.responseHeaders
128
+ };
129
+ const serve = (representation)=>serveStaticAsset(c, {
130
+ ...asset,
131
+ ...representation,
132
+ filename: representation?.filename ?? asset.filename,
133
+ mimeFilename: asset.filename
134
+ });
135
+ const response = respondAsset ? await respondAsset(c, asset, serve, {
136
+ root: pwd,
137
+ pathPrefix
138
+ }) : void 0;
139
+ return void 0 === response ? serve() : response;
140
+ };
141
+ const response = respondPublicFallback ? await respondPublicFallback(c, respondPublic, {
142
+ root: pwd,
143
+ pathPrefix
144
+ }) : await respondPublic();
145
+ return response ?? next();
79
146
  };
80
147
  }
81
148
  function matchPublicRoute(req, routes) {
@@ -120,29 +187,38 @@ function createStaticMiddleware(options) {
120
187
  ...staticReg,
121
188
  ...iconReg
122
189
  ].join('|')})`);
123
- const publicMiddleware = createPublicMiddleware({
124
- pwd,
125
- routes: routes || []
126
- });
127
- const moduleFederationStaticServing = (0, external_staticServing_js_namespaceObject.createModuleFederationStaticServing)({
128
- pwd,
129
- pathPrefix
130
- });
131
190
  return async (c, next)=>{
132
191
  const pageRoute = c.get('route');
133
192
  const pathname = c.req.path;
134
193
  if (pageRoute && '' === external_path_default().extname(pathname)) return next();
135
194
  const hit = staticPathRegExp.test(pathname);
136
- const staticServingRequest = await moduleFederationStaticServing.resolveRequest(pathname);
137
- if (null === staticServingRequest) return next();
138
- if (hit) {
139
- const response = await moduleFederationStaticServing.serveStaticHit(c, staticServingRequest);
140
- if (null !== response) return response;
141
- return next();
195
+ if (!hit) return createPublicMiddleware({
196
+ pwd,
197
+ routes: routes || [],
198
+ pathPrefix,
199
+ respondAsset: options.respondAsset,
200
+ respondPublicFallback: options.respondPublicFallback
201
+ })(c, next);
202
+ else {
203
+ const filepath = external_path_default().join(pwd, pathname.replace(pathPrefix, ()=>''));
204
+ if (!isPathInside(filepath, pwd)) return next();
205
+ if (!await utils_namespaceObject.fs.pathExists(filepath)) return next();
206
+ const asset = {
207
+ filename: filepath,
208
+ kind: 'static'
209
+ };
210
+ const serve = (representation)=>serveStaticAsset(c, {
211
+ ...asset,
212
+ ...representation,
213
+ filename: representation?.filename ?? asset.filename,
214
+ mimeFilename: filepath
215
+ });
216
+ const response = options.respondAsset ? await options.respondAsset(c, asset, serve, {
217
+ root: pwd,
218
+ pathPrefix
219
+ }) : void 0;
220
+ return (void 0 === response ? await serve() : response) ?? next();
142
221
  }
143
- const moduleFederationResponse = await moduleFederationStaticServing.serveModuleFederationAsset(c, staticServingRequest);
144
- if (null !== moduleFederationResponse) return moduleFederationResponse;
145
- return publicMiddleware(c, next);
146
222
  };
147
223
  }
148
224
  const prepareFavicons = (favicon)=>{
@@ -152,10 +228,12 @@ const prepareFavicons = (favicon)=>{
152
228
  };
153
229
  exports.createPublicMiddleware = __webpack_exports__.createPublicMiddleware;
154
230
  exports.createStaticMiddleware = __webpack_exports__.createStaticMiddleware;
231
+ exports.serveStaticAsset = __webpack_exports__.serveStaticAsset;
155
232
  exports.serverStaticPlugin = __webpack_exports__.serverStaticPlugin;
156
233
  for(var __rspack_i in __webpack_exports__)if (-1 === [
157
234
  "createPublicMiddleware",
158
235
  "createStaticMiddleware",
236
+ "serveStaticAsset",
159
237
  "serverStaticPlugin"
160
238
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
161
239
  Object.defineProperty(exports, '__esModule', {
@@ -31,7 +31,7 @@ const LOADER_CONTEXT = 'loaderContext';
31
31
  function getLoaderCtx(c) {
32
32
  const loaderContext = c.get(LOADER_CONTEXT);
33
33
  if (loaderContext) return loaderContext;
34
- {
34
+ else {
35
35
  const loaderContext = new Map();
36
36
  c.set(LOADER_CONTEXT, loaderContext);
37
37
  return loaderContext;
package/dist/cjs/index.js CHANGED
@@ -92,22 +92,19 @@ var __webpack_exports__ = {};
92
92
  var __rspack_reexport = {};
93
93
  for(const __rspack_import_key in _plugins__rspack_import_4)if ([
94
94
  "Hono",
95
- "createSafeJsonFailureResponse",
96
95
  "createErrorHtml",
97
96
  "useHonoContext",
98
- "createServerBase",
99
97
  "normalizePublicDir",
98
+ "createServerBase",
100
99
  "resolvePublicDirPaths",
101
- "getSafeFailureStatus",
102
100
  "default",
103
101
  "normalizePublicDirPath",
104
102
  "onError",
105
- "createSafeFailureHttpResult",
106
103
  "ErrorDigest",
107
104
  "getPublicDirConfig",
108
105
  "getPublicDirPatterns",
109
- "getLoaderCtx",
110
106
  "getPublicDirRoutePrefixes",
107
+ "getLoaderCtx",
111
108
  "run",
112
109
  "AGGRED_DIR"
113
110
  ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_plugins__rspack_import_4[__rspack_import_key];
@@ -117,22 +114,19 @@ var __webpack_exports__ = {};
117
114
  var __rspack_reexport = {};
118
115
  for(const __rspack_import_key in _types_config__rspack_import_6)if ([
119
116
  "Hono",
120
- "createSafeJsonFailureResponse",
121
117
  "createErrorHtml",
122
118
  "useHonoContext",
123
- "createServerBase",
124
119
  "normalizePublicDir",
120
+ "createServerBase",
125
121
  "resolvePublicDirPaths",
126
- "getSafeFailureStatus",
127
122
  "default",
128
123
  "normalizePublicDirPath",
129
124
  "onError",
130
- "createSafeFailureHttpResult",
131
125
  "ErrorDigest",
132
126
  "getPublicDirConfig",
133
127
  "getPublicDirPatterns",
134
- "getLoaderCtx",
135
128
  "getPublicDirRoutePrefixes",
129
+ "getLoaderCtx",
136
130
  "run",
137
131
  "AGGRED_DIR"
138
132
  ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types_config__rspack_import_6[__rspack_import_key];
@@ -141,22 +135,19 @@ var __webpack_exports__ = {};
141
135
  var __rspack_reexport = {};
142
136
  for(const __rspack_import_key in _types_plugins__rspack_import_7)if ([
143
137
  "Hono",
144
- "createSafeJsonFailureResponse",
145
138
  "createErrorHtml",
146
139
  "useHonoContext",
147
- "createServerBase",
148
140
  "normalizePublicDir",
141
+ "createServerBase",
149
142
  "resolvePublicDirPaths",
150
- "getSafeFailureStatus",
151
143
  "default",
152
144
  "normalizePublicDirPath",
153
145
  "onError",
154
- "createSafeFailureHttpResult",
155
146
  "ErrorDigest",
156
147
  "getPublicDirConfig",
157
148
  "getPublicDirPatterns",
158
- "getLoaderCtx",
159
149
  "getPublicDirRoutePrefixes",
150
+ "getLoaderCtx",
160
151
  "run",
161
152
  "AGGRED_DIR"
162
153
  ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types_plugins__rspack_import_7[__rspack_import_key];
@@ -165,22 +156,19 @@ var __webpack_exports__ = {};
165
156
  var __rspack_reexport = {};
166
157
  for(const __rspack_import_key in _types_render__rspack_import_8)if ([
167
158
  "Hono",
168
- "createSafeJsonFailureResponse",
169
159
  "createErrorHtml",
170
160
  "useHonoContext",
171
- "createServerBase",
172
161
  "normalizePublicDir",
162
+ "createServerBase",
173
163
  "resolvePublicDirPaths",
174
- "getSafeFailureStatus",
175
164
  "default",
176
165
  "normalizePublicDirPath",
177
166
  "onError",
178
- "createSafeFailureHttpResult",
179
167
  "ErrorDigest",
180
168
  "getPublicDirConfig",
181
169
  "getPublicDirPatterns",
182
- "getLoaderCtx",
183
170
  "getPublicDirRoutePrefixes",
171
+ "getLoaderCtx",
184
172
  "run",
185
173
  "AGGRED_DIR"
186
174
  ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types_render__rspack_import_8[__rspack_import_key];
@@ -189,22 +177,19 @@ var __webpack_exports__ = {};
189
177
  var __rspack_reexport = {};
190
178
  for(const __rspack_import_key in _types_requestHandler__rspack_import_9)if ([
191
179
  "Hono",
192
- "createSafeJsonFailureResponse",
193
180
  "createErrorHtml",
194
181
  "useHonoContext",
195
- "createServerBase",
196
182
  "normalizePublicDir",
183
+ "createServerBase",
197
184
  "resolvePublicDirPaths",
198
- "getSafeFailureStatus",
199
185
  "default",
200
186
  "normalizePublicDirPath",
201
187
  "onError",
202
- "createSafeFailureHttpResult",
203
188
  "ErrorDigest",
204
189
  "getPublicDirConfig",
205
190
  "getPublicDirPatterns",
206
- "getLoaderCtx",
207
191
  "getPublicDirRoutePrefixes",
192
+ "getLoaderCtx",
208
193
  "run",
209
194
  "AGGRED_DIR"
210
195
  ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types_requestHandler__rspack_import_9[__rspack_import_key];
@@ -216,14 +201,11 @@ var __webpack_exports__ = {};
216
201
  ErrorDigest: ()=>_utils__rspack_import_10.ErrorDigest,
217
202
  Hono: ()=>hono__rspack_import_0.Hono,
218
203
  createErrorHtml: ()=>_utils__rspack_import_10.createErrorHtml,
219
- createSafeFailureHttpResult: ()=>_utils__rspack_import_10.createSafeFailureHttpResult,
220
- createSafeJsonFailureResponse: ()=>_utils__rspack_import_10.createSafeJsonFailureResponse,
221
204
  createServerBase: ()=>_serverBase__rspack_import_5.createServerBase,
222
205
  getLoaderCtx: ()=>_helper__rspack_import_3.getLoaderCtx,
223
206
  getPublicDirConfig: ()=>_utils_publicDir__rspack_import_11.getPublicDirConfig,
224
207
  getPublicDirPatterns: ()=>_utils_publicDir__rspack_import_11.getPublicDirPatterns,
225
208
  getPublicDirRoutePrefixes: ()=>_utils_publicDir__rspack_import_11.getPublicDirRoutePrefixes,
226
- getSafeFailureStatus: ()=>_utils__rspack_import_10.getSafeFailureStatus,
227
209
  normalizePublicDir: ()=>_utils_publicDir__rspack_import_11.normalizePublicDir,
228
210
  normalizePublicDirPath: ()=>_utils_publicDir__rspack_import_11.normalizePublicDirPath,
229
211
  onError: ()=>_utils__rspack_import_10.onError,
@@ -236,14 +218,11 @@ exports.AGGRED_DIR = __webpack_exports__.AGGRED_DIR;
236
218
  exports.ErrorDigest = __webpack_exports__.ErrorDigest;
237
219
  exports.Hono = __webpack_exports__.Hono;
238
220
  exports.createErrorHtml = __webpack_exports__.createErrorHtml;
239
- exports.createSafeFailureHttpResult = __webpack_exports__.createSafeFailureHttpResult;
240
- exports.createSafeJsonFailureResponse = __webpack_exports__.createSafeJsonFailureResponse;
241
221
  exports.createServerBase = __webpack_exports__.createServerBase;
242
222
  exports.getLoaderCtx = __webpack_exports__.getLoaderCtx;
243
223
  exports.getPublicDirConfig = __webpack_exports__.getPublicDirConfig;
244
224
  exports.getPublicDirPatterns = __webpack_exports__.getPublicDirPatterns;
245
225
  exports.getPublicDirRoutePrefixes = __webpack_exports__.getPublicDirRoutePrefixes;
246
- exports.getSafeFailureStatus = __webpack_exports__.getSafeFailureStatus;
247
226
  exports.normalizePublicDir = __webpack_exports__.normalizePublicDir;
248
227
  exports.normalizePublicDirPath = __webpack_exports__.normalizePublicDirPath;
249
228
  exports.onError = __webpack_exports__.onError;
@@ -255,14 +234,11 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
255
234
  "ErrorDigest",
256
235
  "Hono",
257
236
  "createErrorHtml",
258
- "createSafeFailureHttpResult",
259
- "createSafeJsonFailureResponse",
260
237
  "createServerBase",
261
238
  "getLoaderCtx",
262
239
  "getPublicDirConfig",
263
240
  "getPublicDirPatterns",
264
241
  "getPublicDirRoutePrefixes",
265
- "getSafeFailureStatus",
266
242
  "normalizePublicDir",
267
243
  "normalizePublicDirPath",
268
244
  "onError",
@@ -36,6 +36,7 @@ const external_hooks_js_namespaceObject = require("./hooks.js");
36
36
  const compatPlugin = ()=>({
37
37
  name: '@modern-js/server-compat',
38
38
  registryHooks: {
39
+ handleError: (0, plugin_namespaceObject.createAsyncPipelineHook)(),
39
40
  prepareWebServer: (0, plugin_namespaceObject.createAsyncPipelineHook)(),
40
41
  prepareApiServer: (0, plugin_namespaceObject.createAsyncPipelineHook)(),
41
42
  afterMatch: (0, plugin_namespaceObject.createAsyncPipelineHook)(),
@@ -87,8 +87,7 @@ var __webpack_exports__ = {};
87
87
  void 0,
88
88
  {}
89
89
  ];
90
- }
91
- {
90
+ } else {
92
91
  const result = matchedRoutes[0];
93
92
  if (!result) return [
94
93
  void 0,
@@ -243,7 +242,7 @@ var __webpack_exports__ = {};
243
242
  if (req.headers.get('x-rsc-action')) return 'rsc-action';
244
243
  if (req.headers.get('x-rsc-tree')) return 'rsc-tree';
245
244
  if (!isSSR) return 'csr';
246
- {
245
+ else {
247
246
  if (query.__loader) return 'data';
248
247
  const fallbackHeaderValue = req.headers.get(fallbackHeader) || nodeReq?.headers[fallbackHeader];
249
248
  if (forceCSR && (query.csr || fallbackHeaderValue || contextForceCSR)) {
@@ -272,7 +271,7 @@ var __webpack_exports__ = {};
272
271
  [external_constants_js_namespaceObject.X_MODERNJS_RENDER]: 'client'
273
272
  })
274
273
  });
275
- return (0, external_csrRscRender_js_namespaceObject.csrRscRender)(request, options);
274
+ else return (0, external_csrRscRender_js_namespaceObject.csrRscRender)(request, options);
276
275
  }
277
276
  })();
278
277
  exports.createRender = __webpack_exports__.createRender;
@@ -35,54 +35,67 @@ __webpack_require__.d(__webpack_exports__, {
35
35
  const storer_namespaceObject = require("@modern-js/runtime-utils/storer");
36
36
  const external_constants_js_namespaceObject = require("../../constants.js");
37
37
  const index_js_namespaceObject = require("../../utils/index.js");
38
+ const preventsSharedCaching = (headers)=>/(?:^|,)\s*(?:private|no-store|no-cache)\s*(?:[=,]|$)/i.test(headers.get('cache-control') || '');
39
+ const isCacheableResponse = (response)=>200 === response.status && !preventsSharedCaching(response.headers) && !response.headers.has('set-cookie') && !response.headers.get('vary');
38
40
  const removeTailSlash = (s)=>s.replace(/\/+$/, '');
39
41
  const ZERO_RENDER_LEVEL = /"renderLevel":0/;
40
42
  const NO_SSR_CACHE = /<meta\s+[^>]*name=["']no-ssr-cache["'][^>]*>/i;
41
43
  async function processCache({ request, key, requestHandler, requestHandlerOptions, ttl, container, cacheStatus }) {
42
44
  const response = await requestHandler(request, requestHandlerOptions);
43
45
  const { onError } = requestHandlerOptions;
44
- const nonCacheableStatusCodes = [
45
- 204,
46
- 305,
47
- 404,
48
- 405,
49
- 500,
50
- 501,
51
- 502,
52
- 503,
53
- 504
54
- ];
55
- if (nonCacheableStatusCodes.includes(response.status)) return response;
46
+ const deleteCache = async ()=>{
47
+ try {
48
+ await container.delete(key);
49
+ } catch {
50
+ (onError || console.error)('[render-cache] delete cache failed');
51
+ }
52
+ };
53
+ if (!isCacheableResponse(response) || !response.body) {
54
+ await deleteCache();
55
+ return response;
56
+ }
57
+ const headers = Object.fromEntries(response.headers);
56
58
  const decoder = new TextDecoder();
57
59
  if (response.body) {
58
60
  const stream = (0, index_js_namespaceObject.createTransformStream)();
59
61
  const reader = response.body.getReader();
60
62
  const writer = stream.writable.getWriter();
61
63
  let html = '';
62
- const push = ()=>reader.read().then(({ done, value })=>{
64
+ const push = ()=>reader.read().then(async ({ done, value })=>{
63
65
  if (done) {
66
+ html += decoder.decode();
64
67
  const match = ZERO_RENDER_LEVEL.test(html) || NO_SSR_CACHE.test(html);
65
- if (match) return void writer.close();
68
+ if (match) {
69
+ await deleteCache();
70
+ return writer.close();
71
+ }
66
72
  const current = Date.now();
67
73
  const cache = {
68
74
  val: html,
69
- cursor: current
75
+ cursor: current,
76
+ headers
70
77
  };
71
78
  container.set(key, JSON.stringify(cache), {
72
79
  ttl
73
80
  }).catch(()=>{
74
- if (onError) onError(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
75
- else console.error(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
81
+ (onError || console.error)('[render-cache] set cache failed');
76
82
  });
77
- writer.close();
78
- return;
83
+ return writer.close();
79
84
  }
80
- const content = decoder.decode(value);
85
+ const content = decoder.decode(value, {
86
+ stream: true
87
+ });
81
88
  html += content;
82
- writer.write(value);
83
- push();
89
+ await writer.write(value);
90
+ return push();
84
91
  });
85
- push();
92
+ push().catch(async (error)=>{
93
+ await Promise.allSettled([
94
+ writer.abort(error),
95
+ reader.cancel(error)
96
+ ]);
97
+ (onError || console.error)('[render-cache] response stream failed');
98
+ });
86
99
  cacheStatus && response.headers.set(external_constants_js_namespaceObject.X_RENDER_CACHE, cacheStatus);
87
100
  return new Response(stream.readable, {
88
101
  status: response.status,
@@ -97,9 +110,12 @@ function computedKey(req, cacheControl) {
97
110
  const pathname = (0, index_js_namespaceObject.getPathname)(req);
98
111
  const { customKey } = cacheControl;
99
112
  const defaultKey = '/' === pathname ? pathname : removeTailSlash(pathname);
100
- if (!customKey) return defaultKey;
101
- if ('string' == typeof customKey) return customKey;
102
- return customKey(defaultKey);
113
+ if (customKey) if ('string' == typeof customKey) return customKey;
114
+ else return customKey(defaultKey);
115
+ else {
116
+ const url = new URL(req.url);
117
+ return `${url.origin}${defaultKey}${url.search}`;
118
+ }
103
119
  }
104
120
  function shouldUseCache(request) {
105
121
  const url = new URL(request.url);
@@ -110,7 +126,7 @@ function shouldUseCache(request) {
110
126
  }
111
127
  function matchCacheControl(cacheOption, req) {
112
128
  if (!cacheOption || !req) return;
113
- {
129
+ else {
114
130
  if (isCacheControl(cacheOption)) return cacheOption;
115
131
  if (isCacheOptionProvider(cacheOption)) return cacheOption(req);
116
132
  const url = req.url;
@@ -129,13 +145,15 @@ function matchCacheControl(cacheOption, req) {
129
145
  async function getCacheResult(request, options) {
130
146
  const { cacheControl, container = storage, requestHandler, requestHandlerOptions } = options;
131
147
  const { onError } = requestHandlerOptions;
132
- const key = computedKey(request, cacheControl);
148
+ const hasCredentials = request.headers.has('cookie') || request.headers.has('authorization');
149
+ if ('GET' !== request.method || !shouldUseCache(request) || preventsSharedCaching(request.headers) || hasCredentials && !cacheControl.customKey) return requestHandler(request, requestHandlerOptions);
150
+ const key = `${CACHE_NAMESPACE}:v2:${computedKey(request, cacheControl)}`;
133
151
  let value;
134
152
  try {
135
153
  value = await container.get(key);
136
154
  } catch (_) {
137
- if (onError) onError(`[render-cache] get cache failed, key: ${key}`);
138
- else console.error(`[render-cache] get cache failed, key: ${key}`);
155
+ if (onError) onError('[render-cache] get cache failed');
156
+ else console.error('[render-cache] get cache failed');
139
157
  value = void 0;
140
158
  }
141
159
  const { maxAge, staleWhileRevalidate } = cacheControl;
@@ -149,27 +167,27 @@ async function getCacheResult(request, options) {
149
167
  container,
150
168
  cacheStatus: 'miss'
151
169
  });
152
- {
170
+ else {
153
171
  const cache = JSON.parse(value);
154
172
  const interval = Date.now() - cache.cursor;
155
173
  if (interval <= maxAge) {
156
174
  const cacheStatus = 'hit';
157
175
  return new Response(cache.val, {
158
176
  headers: {
177
+ ...cache.headers,
159
178
  [external_constants_js_namespaceObject.X_RENDER_CACHE]: cacheStatus
160
179
  }
161
180
  });
162
- }
163
- if (!(interval <= staleWhileRevalidate + maxAge)) return processCache({
164
- key,
165
- request,
166
- requestHandler,
167
- requestHandlerOptions,
168
- ttl,
169
- container,
170
- cacheStatus: 'expired'
171
- });
172
- {
181
+ } else {
182
+ if (!(interval <= staleWhileRevalidate + maxAge)) return processCache({
183
+ key,
184
+ request,
185
+ requestHandler,
186
+ requestHandlerOptions,
187
+ ttl,
188
+ container,
189
+ cacheStatus: 'expired'
190
+ });
173
191
  processCache({
174
192
  key,
175
193
  request,
@@ -179,10 +197,13 @@ async function getCacheResult(request, options) {
179
197
  container
180
198
  }).then(async (response)=>{
181
199
  await response.text();
200
+ }).catch(()=>{
201
+ (onError || console.error)('[render-cache] revalidation failed');
182
202
  });
183
203
  const cacheStatus = 'stale';
184
204
  return new Response(cache.val, {
185
205
  headers: {
206
+ ...cache.headers,
186
207
  [external_constants_js_namespaceObject.X_RENDER_CACHE]: cacheStatus
187
208
  }
188
209
  });