@bleedingdev/modern-js-runtime 3.9.0-ultramodern.9 → 3.9.3-ultramodern.2

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 (130) hide show
  1. package/dist/cjs/cli/code.js +2 -2
  2. package/dist/cjs/cli/index.js +0 -7
  3. package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +2 -0
  4. package/dist/cjs/cli/template.server.js +1 -2
  5. package/dist/cjs/core/browser/hydrate.js +3 -9
  6. package/dist/cjs/core/browser/index.js +4 -5
  7. package/dist/cjs/core/context/index.js +8 -2
  8. package/dist/cjs/core/context/public.js +4 -4
  9. package/dist/cjs/core/context/runtime.js +3 -9
  10. package/dist/cjs/core/index.js +3 -3
  11. package/dist/cjs/core/plugin/index.js +2 -2
  12. package/dist/cjs/core/react/index.js +3 -3
  13. package/dist/cjs/core/react/wrapper.js +7 -8
  14. package/dist/cjs/core/server/requestHandler.js +253 -25
  15. package/dist/cjs/core/server/stream/beforeTemplate.js +3 -3
  16. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +2 -2
  17. package/dist/cjs/core/server/stream/createReadableStream.js +51 -19
  18. package/dist/cjs/core/server/stream/createReadableStream.worker.js +54 -27
  19. package/dist/cjs/core/server/stream/deferredScript.js +12 -6
  20. package/dist/cjs/core/server/stream/deferredScriptOutputCoordinator.js +370 -0
  21. package/dist/cjs/core/server/stream/shared.js +4 -0
  22. package/dist/cjs/core/server/string/index.js +6 -4
  23. package/dist/cjs/core/server/string/loadable.js +4 -4
  24. package/dist/cjs/document/cli/index.js +14 -5
  25. package/dist/cjs/exports/head.js +2 -2
  26. package/dist/cjs/internal.js +2 -2
  27. package/dist/cjs/router/cli/code/nestedRoutes.js +1 -2
  28. package/dist/cjs/router/cli/code/templates.js +2 -2
  29. package/dist/cjs/router/cli/code/utils.js +5 -4
  30. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +13 -10
  31. package/dist/cjs/router/runtime/PrefetchLink.js +4 -4
  32. package/dist/cjs/router/runtime/hooks.js +6 -7
  33. package/dist/cjs/router/runtime/plugin.js +22 -27
  34. package/dist/cjs/router/runtime/plugin.node.js +8 -9
  35. package/dist/esm/cli/code.mjs +2 -2
  36. package/dist/esm/cli/index.mjs +0 -7
  37. package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  38. package/dist/esm/cli/template.server.mjs +1 -2
  39. package/dist/esm/core/browser/hydrate.mjs +3 -9
  40. package/dist/esm/core/browser/index.mjs +1 -2
  41. package/dist/esm/core/context/index.mjs +1 -1
  42. package/dist/esm/core/context/public.mjs +1 -1
  43. package/dist/esm/core/context/runtime.mjs +3 -9
  44. package/dist/esm/core/index.mjs +1 -1
  45. package/dist/esm/core/plugin/index.mjs +1 -1
  46. package/dist/esm/core/react/index.mjs +1 -1
  47. package/dist/esm/core/react/wrapper.mjs +1 -2
  48. package/dist/esm/core/server/requestHandler.mjs +223 -19
  49. package/dist/esm/core/server/stream/beforeTemplate.mjs +3 -3
  50. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +2 -2
  51. package/dist/esm/core/server/stream/createReadableStream.mjs +48 -16
  52. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +53 -26
  53. package/dist/esm/core/server/stream/deferredScript.mjs +12 -6
  54. package/dist/esm/core/server/stream/deferredScriptOutputCoordinator.mjs +332 -0
  55. package/dist/esm/core/server/stream/shared.mjs +2 -1
  56. package/dist/esm/core/server/string/index.mjs +3 -1
  57. package/dist/esm/core/server/string/loadable.mjs +4 -4
  58. package/dist/esm/document/cli/index.mjs +12 -6
  59. package/dist/esm/exports/head.mjs +1 -1
  60. package/dist/esm/internal.mjs +1 -1
  61. package/dist/esm/router/cli/code/nestedRoutes.mjs +1 -2
  62. package/dist/esm/router/cli/code/templates.mjs +2 -2
  63. package/dist/esm/router/cli/code/utils.mjs +6 -5
  64. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +13 -10
  65. package/dist/esm/router/runtime/PrefetchLink.mjs +1 -1
  66. package/dist/esm/router/runtime/hooks.mjs +6 -7
  67. package/dist/esm/router/runtime/plugin.mjs +14 -19
  68. package/dist/esm/router/runtime/plugin.node.mjs +3 -4
  69. package/dist/esm-node/cli/code.mjs +2 -2
  70. package/dist/esm-node/cli/index.mjs +1 -9
  71. package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  72. package/dist/esm-node/cli/template.server.mjs +1 -2
  73. package/dist/esm-node/core/browser/hydrate.mjs +3 -9
  74. package/dist/esm-node/core/browser/index.mjs +1 -2
  75. package/dist/esm-node/core/context/index.mjs +1 -1
  76. package/dist/esm-node/core/context/public.mjs +1 -1
  77. package/dist/esm-node/core/context/runtime.mjs +3 -9
  78. package/dist/esm-node/core/index.mjs +1 -1
  79. package/dist/esm-node/core/plugin/index.mjs +1 -1
  80. package/dist/esm-node/core/react/index.mjs +1 -1
  81. package/dist/esm-node/core/react/wrapper.mjs +1 -2
  82. package/dist/esm-node/core/server/requestHandler.mjs +223 -19
  83. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +3 -3
  84. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +2 -2
  85. package/dist/esm-node/core/server/stream/createReadableStream.mjs +48 -16
  86. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +53 -26
  87. package/dist/esm-node/core/server/stream/deferredScript.mjs +12 -6
  88. package/dist/esm-node/core/server/stream/deferredScriptOutputCoordinator.mjs +333 -0
  89. package/dist/esm-node/core/server/stream/shared.mjs +2 -1
  90. package/dist/esm-node/core/server/string/index.mjs +3 -1
  91. package/dist/esm-node/core/server/string/loadable.mjs +4 -4
  92. package/dist/esm-node/document/cli/index.mjs +12 -6
  93. package/dist/esm-node/exports/head.mjs +1 -1
  94. package/dist/esm-node/internal.mjs +1 -1
  95. package/dist/esm-node/router/cli/code/nestedRoutes.mjs +1 -2
  96. package/dist/esm-node/router/cli/code/templates.mjs +2 -2
  97. package/dist/esm-node/router/cli/code/utils.mjs +6 -5
  98. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +13 -10
  99. package/dist/esm-node/router/runtime/PrefetchLink.mjs +1 -1
  100. package/dist/esm-node/router/runtime/hooks.mjs +6 -7
  101. package/dist/esm-node/router/runtime/plugin.mjs +14 -19
  102. package/dist/esm-node/router/runtime/plugin.node.mjs +3 -4
  103. package/dist/types/common.d.ts +2 -8
  104. package/dist/types/core/context/index.d.ts +1 -1
  105. package/dist/types/core/context/public.d.ts +1 -1
  106. package/dist/types/core/index.d.ts +1 -1
  107. package/dist/types/core/react/wrapper.d.ts +1 -1
  108. package/dist/types/core/server/requestHandler.d.ts +30 -1
  109. package/dist/types/core/server/stream/deferredScript.d.ts +1 -1
  110. package/dist/types/core/server/stream/deferredScriptOutputCoordinator.d.ts +72 -0
  111. package/dist/types/core/server/stream/shared.d.ts +14 -0
  112. package/dist/types/document/cli/index.d.ts +1 -0
  113. package/dist/types/internal.d.ts +1 -1
  114. package/dist/types/router/cli/code/utils.d.ts +1 -1
  115. package/dist/types/router/runtime/hooks.d.ts +12 -16
  116. package/package.json +32 -26
  117. package/rslib.config.mts +3 -0
  118. package/rstest.config.mts +0 -4
  119. package/dist/cjs/core/server/requestResponse.js +0 -107
  120. package/dist/cjs/core/server/routerCleanup.js +0 -129
  121. package/dist/cjs/rsc/server.worker.js +0 -62
  122. package/dist/esm/core/server/requestResponse.mjs +0 -63
  123. package/dist/esm/core/server/routerCleanup.mjs +0 -82
  124. package/dist/esm/rsc/server.worker.mjs +0 -1
  125. package/dist/esm-node/core/server/requestResponse.mjs +0 -64
  126. package/dist/esm-node/core/server/routerCleanup.mjs +0 -83
  127. package/dist/esm-node/rsc/server.worker.mjs +0 -2
  128. package/dist/types/core/server/requestResponse.d.ts +0 -15
  129. package/dist/types/core/server/routerCleanup.d.ts +0 -31
  130. package/dist/types/rsc/server.worker.d.ts +0 -1
@@ -1,129 +0,0 @@
1
- "use strict";
2
- var __webpack_require__ = {};
3
- (()=>{
4
- __webpack_require__.d = (exports1, getters, values)=>{
5
- var define = (defs, kind)=>{
6
- for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
- enumerable: true,
8
- [kind]: defs[key]
9
- });
10
- };
11
- define(getters, "get");
12
- define(values, "value");
13
- };
14
- })();
15
- (()=>{
16
- __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
- })();
18
- (()=>{
19
- __webpack_require__.r = (exports1)=>{
20
- if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
- value: 'Module'
22
- });
23
- Object.defineProperty(exports1, '__esModule', {
24
- value: true
25
- });
26
- };
27
- })();
28
- var __webpack_exports__ = {};
29
- __webpack_require__.r(__webpack_exports__);
30
- __webpack_require__.d(__webpack_exports__, {
31
- ROUTER_CLEANUP_ERROR: ()=>ROUTER_CLEANUP_ERROR,
32
- createRouterCleanup: ()=>createRouterCleanup,
33
- finishWithRouterCleanup: ()=>finishWithRouterCleanup,
34
- runWithRouterCleanupOnError: ()=>runWithRouterCleanupOnError
35
- });
36
- const router_state_namespaceObject = require("@modern-js/runtime-extensions/router-state");
37
- const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
38
- async function runWithRouterCleanupOnError(routerCleanup, callback) {
39
- try {
40
- return await callback();
41
- } catch (error) {
42
- await routerCleanup.run();
43
- throw error;
44
- }
45
- }
46
- async function finishWithRouterCleanup(routerCleanup, callback) {
47
- try {
48
- return await callback();
49
- } finally{
50
- if (!routerCleanup.deferred) await routerCleanup.run();
51
- }
52
- }
53
- function createRouterCleanup(runtimeContext, onError) {
54
- let deferred = false;
55
- let finished = false;
56
- const run = async ()=>{
57
- if (finished) return;
58
- finished = true;
59
- try {
60
- await (0, router_state_namespaceObject.getRouterRuntimeState)(runtimeContext)?.cleanup?.();
61
- } catch (error) {
62
- onError(error, ROUTER_CLEANUP_ERROR);
63
- }
64
- };
65
- const deferUntilBodyDone = (response)=>{
66
- const { body } = response;
67
- if (!body || body.locked) return response;
68
- deferred = true;
69
- const reader = body.getReader();
70
- const wrappedBody = new ReadableStream({
71
- async pull (controller) {
72
- let result;
73
- try {
74
- result = await reader.read();
75
- } catch (error) {
76
- controller.error(error);
77
- await run();
78
- return;
79
- }
80
- if (result.done) {
81
- controller.close();
82
- await run();
83
- return;
84
- }
85
- controller.enqueue(result.value);
86
- },
87
- async cancel (reason) {
88
- try {
89
- await reader.cancel(reason);
90
- } catch {}
91
- await run();
92
- }
93
- });
94
- return new Response(wrappedBody, {
95
- status: response.status,
96
- statusText: response.statusText,
97
- headers: response.headers
98
- });
99
- };
100
- const discardBody = async (response)=>{
101
- const { body } = response;
102
- if (!body) return void await run();
103
- deferred = true;
104
- if (body.locked) throw new TypeError('Cannot discard a locked response body before router cleanup');
105
- await body.cancel('Response body discarded during finalization');
106
- await run();
107
- };
108
- return {
109
- get deferred () {
110
- return deferred;
111
- },
112
- run,
113
- deferUntilBodyDone,
114
- discardBody
115
- };
116
- }
117
- exports.ROUTER_CLEANUP_ERROR = __webpack_exports__.ROUTER_CLEANUP_ERROR;
118
- exports.createRouterCleanup = __webpack_exports__.createRouterCleanup;
119
- exports.finishWithRouterCleanup = __webpack_exports__.finishWithRouterCleanup;
120
- exports.runWithRouterCleanupOnError = __webpack_exports__.runWithRouterCleanupOnError;
121
- for(var __rspack_i in __webpack_exports__)if (-1 === [
122
- "ROUTER_CLEANUP_ERROR",
123
- "createRouterCleanup",
124
- "finishWithRouterCleanup",
125
- "runWithRouterCleanupOnError"
126
- ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
127
- Object.defineProperty(exports, '__esModule', {
128
- value: true
129
- });
@@ -1,62 +0,0 @@
1
- "use strict";
2
- var __webpack_modules__ = {
3
- "@modern-js/render/rsc-worker" (module) {
4
- module.exports = require("@modern-js/render/rsc-worker");
5
- }
6
- };
7
- var __webpack_module_cache__ = {};
8
- function __webpack_require__(moduleId) {
9
- var cachedModule = __webpack_module_cache__[moduleId];
10
- if (void 0 !== cachedModule) return cachedModule.exports;
11
- var module = __webpack_module_cache__[moduleId] = {
12
- exports: {}
13
- };
14
- __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
15
- return module.exports;
16
- }
17
- (()=>{
18
- __webpack_require__.n = (module)=>{
19
- var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
20
- __webpack_require__.d(getter, {
21
- a: getter
22
- });
23
- return getter;
24
- };
25
- })();
26
- (()=>{
27
- __webpack_require__.d = (exports1, getters, values)=>{
28
- var define = (defs, kind)=>{
29
- for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
30
- enumerable: true,
31
- [kind]: defs[key]
32
- });
33
- };
34
- define(getters, "get");
35
- define(values, "value");
36
- };
37
- })();
38
- (()=>{
39
- __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
40
- })();
41
- (()=>{
42
- __webpack_require__.r = (exports1)=>{
43
- if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
44
- value: 'Module'
45
- });
46
- Object.defineProperty(exports1, '__esModule', {
47
- value: true
48
- });
49
- };
50
- })();
51
- var __webpack_exports__ = {};
52
- (()=>{
53
- __webpack_require__.r(__webpack_exports__);
54
- var _modern_js_render_rsc_worker__rspack_import_0 = __webpack_require__("@modern-js/render/rsc-worker");
55
- var __rspack_reexport = {};
56
- for(const __rspack_import_key in _modern_js_render_rsc_worker__rspack_import_0)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_modern_js_render_rsc_worker__rspack_import_0[__rspack_import_key];
57
- __webpack_require__.d(__webpack_exports__, __rspack_reexport);
58
- })();
59
- for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
60
- Object.defineProperty(exports, '__esModule', {
61
- value: true
62
- });
@@ -1,63 +0,0 @@
1
- import { getRouterServerSnapshot } from "@modern-js/runtime-extensions/router-state";
2
- import { handleRSCRedirect } from "../../router/runtime/redirect.mjs";
3
- import { SSRErrors } from "./tracer.mjs";
4
- const isRedirectStatus = (status)=>301 === status || 302 === status || 303 === status || 307 === status || 308 === status;
5
- const isNullBodyStatus = (status)=>204 === status || 205 === status || 304 === status;
6
- const getRedirectLocation = (headers)=>{
7
- const location = headers.get('Location');
8
- return null !== location && '' !== location && URL.canParse(location, 'http://localhost') ? location : void 0;
9
- };
10
- const processRedirect = (headers, status, ctx)=>{
11
- headers.delete('content-length');
12
- headers.delete('transfer-encoding');
13
- if (ctx.enableRsc && ctx.isRSCNavigation) return handleRSCRedirect(headers, ctx.basename, status);
14
- return new Response(null, {
15
- status,
16
- headers
17
- });
18
- };
19
- const applyRouterSnapshotResult = (context, onError)=>{
20
- const routerServerSnapshot = getRouterServerSnapshot(context);
21
- const routerStatusCode = routerServerSnapshot?.statusCode ?? context.routerContext?.statusCode;
22
- if (void 0 !== routerStatusCode && 0 !== routerStatusCode && !Number.isNaN(routerStatusCode) && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
23
- const errors = Object.values(routerServerSnapshot?.errors || context.routerContext?.errors || {});
24
- if (errors.length > 0) onError(errors[0], SSRErrors.LOADER_ERROR);
25
- };
26
- const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
27
- if (void 0 === beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
28
- if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
29
- const redirectUrl = getRedirectLocation(beforeRenderResult.headers);
30
- if (void 0 === redirectUrl) return;
31
- return processRedirect(new Headers(beforeRenderResult.headers), beforeRenderResult.status, redirectCtx);
32
- };
33
- const finalizeRenderResponse = async (response, responseProxy, redirectCtx, routerCleanup)=>{
34
- const proxyHeaders = new Headers(responseProxy.headers);
35
- if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && void 0 !== getRedirectLocation(proxyHeaders)) {
36
- await routerCleanup.discardBody(response);
37
- return processRedirect(proxyHeaders, responseProxy.status, redirectCtx);
38
- }
39
- const headers = new Headers(response.headers);
40
- Object.entries(responseProxy.headers).forEach(([key, value])=>{
41
- headers.set(key, value);
42
- });
43
- if (-1 !== responseProxy.status) {
44
- if (isNullBodyStatus(responseProxy.status)) {
45
- await routerCleanup.discardBody(response);
46
- headers.delete('content-length');
47
- headers.delete('transfer-encoding');
48
- return new Response(null, {
49
- status: responseProxy.status,
50
- headers
51
- });
52
- }
53
- return routerCleanup.deferUntilBodyDone(new Response(response.body, {
54
- status: responseProxy.status,
55
- headers
56
- }));
57
- }
58
- Object.entries(responseProxy.headers).forEach(([key, value])=>{
59
- response.headers.set(key, value);
60
- });
61
- return routerCleanup.deferUntilBodyDone(response);
62
- };
63
- export { applyRouterSnapshotResult, createLoaderRedirectResponse, finalizeRenderResponse };
@@ -1,82 +0,0 @@
1
- import { getRouterRuntimeState } from "@modern-js/runtime-extensions/router-state";
2
- const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
3
- async function runWithRouterCleanupOnError(routerCleanup, callback) {
4
- try {
5
- return await callback();
6
- } catch (error) {
7
- await routerCleanup.run();
8
- throw error;
9
- }
10
- }
11
- async function finishWithRouterCleanup(routerCleanup, callback) {
12
- try {
13
- return await callback();
14
- } finally{
15
- if (!routerCleanup.deferred) await routerCleanup.run();
16
- }
17
- }
18
- function createRouterCleanup(runtimeContext, onError) {
19
- let deferred = false;
20
- let finished = false;
21
- const run = async ()=>{
22
- if (finished) return;
23
- finished = true;
24
- try {
25
- await getRouterRuntimeState(runtimeContext)?.cleanup?.();
26
- } catch (error) {
27
- onError(error, ROUTER_CLEANUP_ERROR);
28
- }
29
- };
30
- const deferUntilBodyDone = (response)=>{
31
- const { body } = response;
32
- if (!body || body.locked) return response;
33
- deferred = true;
34
- const reader = body.getReader();
35
- const wrappedBody = new ReadableStream({
36
- async pull (controller) {
37
- let result;
38
- try {
39
- result = await reader.read();
40
- } catch (error) {
41
- controller.error(error);
42
- await run();
43
- return;
44
- }
45
- if (result.done) {
46
- controller.close();
47
- await run();
48
- return;
49
- }
50
- controller.enqueue(result.value);
51
- },
52
- async cancel (reason) {
53
- try {
54
- await reader.cancel(reason);
55
- } catch {}
56
- await run();
57
- }
58
- });
59
- return new Response(wrappedBody, {
60
- status: response.status,
61
- statusText: response.statusText,
62
- headers: response.headers
63
- });
64
- };
65
- const discardBody = async (response)=>{
66
- const { body } = response;
67
- if (!body) return void await run();
68
- deferred = true;
69
- if (body.locked) throw new TypeError('Cannot discard a locked response body before router cleanup');
70
- await body.cancel('Response body discarded during finalization');
71
- await run();
72
- };
73
- return {
74
- get deferred () {
75
- return deferred;
76
- },
77
- run,
78
- deferUntilBodyDone,
79
- discardBody
80
- };
81
- }
82
- export { ROUTER_CLEANUP_ERROR, createRouterCleanup, finishWithRouterCleanup, runWithRouterCleanupOnError };
@@ -1 +0,0 @@
1
- export * from "@modern-js/render/rsc-worker";
@@ -1,64 +0,0 @@
1
- import "node:module";
2
- import { getRouterServerSnapshot } from "@modern-js/runtime-extensions/router-state";
3
- import { handleRSCRedirect } from "../../router/runtime/redirect.mjs";
4
- import { SSRErrors } from "./tracer.mjs";
5
- const isRedirectStatus = (status)=>301 === status || 302 === status || 303 === status || 307 === status || 308 === status;
6
- const isNullBodyStatus = (status)=>204 === status || 205 === status || 304 === status;
7
- const getRedirectLocation = (headers)=>{
8
- const location = headers.get('Location');
9
- return null !== location && '' !== location && URL.canParse(location, 'http://localhost') ? location : void 0;
10
- };
11
- const processRedirect = (headers, status, ctx)=>{
12
- headers.delete('content-length');
13
- headers.delete('transfer-encoding');
14
- if (ctx.enableRsc && ctx.isRSCNavigation) return handleRSCRedirect(headers, ctx.basename, status);
15
- return new Response(null, {
16
- status,
17
- headers
18
- });
19
- };
20
- const applyRouterSnapshotResult = (context, onError)=>{
21
- const routerServerSnapshot = getRouterServerSnapshot(context);
22
- const routerStatusCode = routerServerSnapshot?.statusCode ?? context.routerContext?.statusCode;
23
- if (void 0 !== routerStatusCode && 0 !== routerStatusCode && !Number.isNaN(routerStatusCode) && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
24
- const errors = Object.values(routerServerSnapshot?.errors || context.routerContext?.errors || {});
25
- if (errors.length > 0) onError(errors[0], SSRErrors.LOADER_ERROR);
26
- };
27
- const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
28
- if (void 0 === beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
29
- if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
30
- const redirectUrl = getRedirectLocation(beforeRenderResult.headers);
31
- if (void 0 === redirectUrl) return;
32
- return processRedirect(new Headers(beforeRenderResult.headers), beforeRenderResult.status, redirectCtx);
33
- };
34
- const finalizeRenderResponse = async (response, responseProxy, redirectCtx, routerCleanup)=>{
35
- const proxyHeaders = new Headers(responseProxy.headers);
36
- if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && void 0 !== getRedirectLocation(proxyHeaders)) {
37
- await routerCleanup.discardBody(response);
38
- return processRedirect(proxyHeaders, responseProxy.status, redirectCtx);
39
- }
40
- const headers = new Headers(response.headers);
41
- Object.entries(responseProxy.headers).forEach(([key, value])=>{
42
- headers.set(key, value);
43
- });
44
- if (-1 !== responseProxy.status) {
45
- if (isNullBodyStatus(responseProxy.status)) {
46
- await routerCleanup.discardBody(response);
47
- headers.delete('content-length');
48
- headers.delete('transfer-encoding');
49
- return new Response(null, {
50
- status: responseProxy.status,
51
- headers
52
- });
53
- }
54
- return routerCleanup.deferUntilBodyDone(new Response(response.body, {
55
- status: responseProxy.status,
56
- headers
57
- }));
58
- }
59
- Object.entries(responseProxy.headers).forEach(([key, value])=>{
60
- response.headers.set(key, value);
61
- });
62
- return routerCleanup.deferUntilBodyDone(response);
63
- };
64
- export { applyRouterSnapshotResult, createLoaderRedirectResponse, finalizeRenderResponse };
@@ -1,83 +0,0 @@
1
- import "node:module";
2
- import { getRouterRuntimeState } from "@modern-js/runtime-extensions/router-state";
3
- const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
4
- async function runWithRouterCleanupOnError(routerCleanup, callback) {
5
- try {
6
- return await callback();
7
- } catch (error) {
8
- await routerCleanup.run();
9
- throw error;
10
- }
11
- }
12
- async function finishWithRouterCleanup(routerCleanup, callback) {
13
- try {
14
- return await callback();
15
- } finally{
16
- if (!routerCleanup.deferred) await routerCleanup.run();
17
- }
18
- }
19
- function createRouterCleanup(runtimeContext, onError) {
20
- let deferred = false;
21
- let finished = false;
22
- const run = async ()=>{
23
- if (finished) return;
24
- finished = true;
25
- try {
26
- await getRouterRuntimeState(runtimeContext)?.cleanup?.();
27
- } catch (error) {
28
- onError(error, ROUTER_CLEANUP_ERROR);
29
- }
30
- };
31
- const deferUntilBodyDone = (response)=>{
32
- const { body } = response;
33
- if (!body || body.locked) return response;
34
- deferred = true;
35
- const reader = body.getReader();
36
- const wrappedBody = new ReadableStream({
37
- async pull (controller) {
38
- let result;
39
- try {
40
- result = await reader.read();
41
- } catch (error) {
42
- controller.error(error);
43
- await run();
44
- return;
45
- }
46
- if (result.done) {
47
- controller.close();
48
- await run();
49
- return;
50
- }
51
- controller.enqueue(result.value);
52
- },
53
- async cancel (reason) {
54
- try {
55
- await reader.cancel(reason);
56
- } catch {}
57
- await run();
58
- }
59
- });
60
- return new Response(wrappedBody, {
61
- status: response.status,
62
- statusText: response.statusText,
63
- headers: response.headers
64
- });
65
- };
66
- const discardBody = async (response)=>{
67
- const { body } = response;
68
- if (!body) return void await run();
69
- deferred = true;
70
- if (body.locked) throw new TypeError('Cannot discard a locked response body before router cleanup');
71
- await body.cancel('Response body discarded during finalization');
72
- await run();
73
- };
74
- return {
75
- get deferred () {
76
- return deferred;
77
- },
78
- run,
79
- deferUntilBodyDone,
80
- discardBody
81
- };
82
- }
83
- export { ROUTER_CLEANUP_ERROR, createRouterCleanup, finishWithRouterCleanup, runWithRouterCleanupOnError };
@@ -1,2 +0,0 @@
1
- import "node:module";
2
- export * from "@modern-js/render/rsc-worker";
@@ -1,15 +0,0 @@
1
- import type { OnError } from '@modern-js/types';
2
- import type { TInternalRuntimeContext } from '../context/index.js';
3
- import type { RouterCleanup } from './routerCleanup.js';
4
- export type ResponseProxy = {
5
- headers: Record<string, string>;
6
- status: number;
7
- };
8
- export type RedirectContext = {
9
- enableRsc: boolean;
10
- isRSCNavigation: boolean;
11
- basename: string;
12
- };
13
- export declare const applyRouterSnapshotResult: (context: TInternalRuntimeContext, onError: OnError) => void;
14
- export declare const createLoaderRedirectResponse: (beforeRenderResult: Response | undefined, redirectCtx: RedirectContext) => Response | undefined;
15
- export declare const finalizeRenderResponse: (response: Response, responseProxy: ResponseProxy, redirectCtx: RedirectContext, routerCleanup: RouterCleanup) => Promise<Response>;
@@ -1,31 +0,0 @@
1
- /**
2
- * Fork-owned helper for the per-request router runtime cleanup.
3
- *
4
- * Router providers (react-router, @modern-js/plugin-tanstack, ...) register a
5
- * `cleanup` callback in the router runtime state. For streamed SSR the
6
- * Response is returned at shell-ready while React is still rendering into the
7
- * body, so the cleanup must not run until the body finishes — otherwise it
8
- * can dispose router state that the in-flight render is still using. Cleanup
9
- * failures are reported through the request's `onError` instead of being
10
- * swallowed.
11
- */
12
- import type { OnError } from '@modern-js/types';
13
- import type { TInternalRuntimeContext } from '../context/index.js';
14
- export declare const ROUTER_CLEANUP_ERROR = "An error occurs during router runtime cleanup";
15
- export type RouterCleanup = {
16
- /** True once the cleanup has been tied to a streamed response body. */
17
- readonly deferred: boolean;
18
- /** Runs the router cleanup at most once; reports failures via `onError`. */
19
- run: () => Promise<void>;
20
- /**
21
- * Ties the cleanup to the completion (close, error or cancellation) of the
22
- * response body when it is a stream. Responses without a streaming body are
23
- * returned as-is and the caller is expected to invoke `run()` itself.
24
- */
25
- deferUntilBodyDone: (response: Response) => Response;
26
- /** Cancels a discarded body before running router cleanup. */
27
- discardBody: (response: Response) => Promise<void>;
28
- };
29
- export declare function runWithRouterCleanupOnError<T>(routerCleanup: RouterCleanup, callback: () => Promise<T> | T): Promise<T>;
30
- export declare function finishWithRouterCleanup<T>(routerCleanup: RouterCleanup, callback: () => Promise<T> | T): Promise<T>;
31
- export declare function createRouterCleanup(runtimeContext: TInternalRuntimeContext, onError: OnError): RouterCleanup;
@@ -1 +0,0 @@
1
- export * from '@modern-js/render/rsc-worker';