@bleedingdev/modern-js-runtime 3.9.0-ultramodern.9 → 3.9.3-ultramodern.10
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.
- package/dist/cjs/cli/code.js +2 -2
- package/dist/cjs/cli/index.js +0 -7
- package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +2 -0
- package/dist/cjs/cli/template.server.js +1 -2
- package/dist/cjs/core/browser/hydrate.js +3 -9
- package/dist/cjs/core/browser/index.js +4 -5
- package/dist/cjs/core/context/index.js +8 -2
- package/dist/cjs/core/context/public.js +4 -4
- package/dist/cjs/core/context/runtime.js +3 -9
- package/dist/cjs/core/index.js +3 -3
- package/dist/cjs/core/plugin/index.js +2 -2
- package/dist/cjs/core/react/index.js +3 -3
- package/dist/cjs/core/react/wrapper.js +7 -8
- package/dist/cjs/core/server/requestHandler.js +253 -25
- package/dist/cjs/core/server/stream/beforeTemplate.js +3 -3
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +2 -2
- package/dist/cjs/core/server/stream/createReadableStream.js +51 -19
- package/dist/cjs/core/server/stream/createReadableStream.worker.js +54 -27
- package/dist/cjs/core/server/stream/deferredScript.js +12 -6
- package/dist/cjs/core/server/stream/deferredScriptOutputCoordinator.js +370 -0
- package/dist/cjs/core/server/stream/shared.js +4 -0
- package/dist/cjs/core/server/string/index.js +6 -4
- package/dist/cjs/core/server/string/loadable.js +4 -4
- package/dist/cjs/document/cli/index.js +14 -5
- package/dist/cjs/exports/head.js +2 -2
- package/dist/cjs/internal.js +2 -2
- package/dist/cjs/router/cli/code/nestedRoutes.js +1 -2
- package/dist/cjs/router/cli/code/templates.js +2 -2
- package/dist/cjs/router/cli/code/utils.js +5 -4
- package/dist/cjs/router/runtime/DeferredDataScripts.node.js +13 -10
- package/dist/cjs/router/runtime/PrefetchLink.js +4 -4
- package/dist/cjs/router/runtime/hooks.js +6 -7
- package/dist/cjs/router/runtime/plugin.js +22 -27
- package/dist/cjs/router/runtime/plugin.node.js +8 -9
- package/dist/esm/cli/code.mjs +2 -2
- package/dist/esm/cli/index.mjs +0 -7
- package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +2 -0
- package/dist/esm/cli/template.server.mjs +1 -2
- package/dist/esm/core/browser/hydrate.mjs +3 -9
- package/dist/esm/core/browser/index.mjs +1 -2
- package/dist/esm/core/context/index.mjs +1 -1
- package/dist/esm/core/context/public.mjs +1 -1
- package/dist/esm/core/context/runtime.mjs +3 -9
- package/dist/esm/core/index.mjs +1 -1
- package/dist/esm/core/plugin/index.mjs +1 -1
- package/dist/esm/core/react/index.mjs +1 -1
- package/dist/esm/core/react/wrapper.mjs +1 -2
- package/dist/esm/core/server/requestHandler.mjs +223 -19
- package/dist/esm/core/server/stream/beforeTemplate.mjs +3 -3
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +2 -2
- package/dist/esm/core/server/stream/createReadableStream.mjs +48 -16
- package/dist/esm/core/server/stream/createReadableStream.worker.mjs +53 -26
- package/dist/esm/core/server/stream/deferredScript.mjs +12 -6
- package/dist/esm/core/server/stream/deferredScriptOutputCoordinator.mjs +332 -0
- package/dist/esm/core/server/stream/shared.mjs +2 -1
- package/dist/esm/core/server/string/index.mjs +3 -1
- package/dist/esm/core/server/string/loadable.mjs +4 -4
- package/dist/esm/document/cli/index.mjs +12 -6
- package/dist/esm/exports/head.mjs +1 -1
- package/dist/esm/internal.mjs +1 -1
- package/dist/esm/router/cli/code/nestedRoutes.mjs +1 -2
- package/dist/esm/router/cli/code/templates.mjs +2 -2
- package/dist/esm/router/cli/code/utils.mjs +6 -5
- package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +13 -10
- package/dist/esm/router/runtime/PrefetchLink.mjs +1 -1
- package/dist/esm/router/runtime/hooks.mjs +6 -7
- package/dist/esm/router/runtime/plugin.mjs +14 -19
- package/dist/esm/router/runtime/plugin.node.mjs +3 -4
- package/dist/esm-node/cli/code.mjs +2 -2
- package/dist/esm-node/cli/index.mjs +1 -9
- package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +2 -0
- package/dist/esm-node/cli/template.server.mjs +1 -2
- package/dist/esm-node/core/browser/hydrate.mjs +3 -9
- package/dist/esm-node/core/browser/index.mjs +1 -2
- package/dist/esm-node/core/context/index.mjs +1 -1
- package/dist/esm-node/core/context/public.mjs +1 -1
- package/dist/esm-node/core/context/runtime.mjs +3 -9
- package/dist/esm-node/core/index.mjs +1 -1
- package/dist/esm-node/core/plugin/index.mjs +1 -1
- package/dist/esm-node/core/react/index.mjs +1 -1
- package/dist/esm-node/core/react/wrapper.mjs +1 -2
- package/dist/esm-node/core/server/requestHandler.mjs +223 -19
- package/dist/esm-node/core/server/stream/beforeTemplate.mjs +3 -3
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +2 -2
- package/dist/esm-node/core/server/stream/createReadableStream.mjs +48 -16
- package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +53 -26
- package/dist/esm-node/core/server/stream/deferredScript.mjs +12 -6
- package/dist/esm-node/core/server/stream/deferredScriptOutputCoordinator.mjs +333 -0
- package/dist/esm-node/core/server/stream/shared.mjs +2 -1
- package/dist/esm-node/core/server/string/index.mjs +3 -1
- package/dist/esm-node/core/server/string/loadable.mjs +4 -4
- package/dist/esm-node/document/cli/index.mjs +12 -6
- package/dist/esm-node/exports/head.mjs +1 -1
- package/dist/esm-node/internal.mjs +1 -1
- package/dist/esm-node/router/cli/code/nestedRoutes.mjs +1 -2
- package/dist/esm-node/router/cli/code/templates.mjs +2 -2
- package/dist/esm-node/router/cli/code/utils.mjs +6 -5
- package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +13 -10
- package/dist/esm-node/router/runtime/PrefetchLink.mjs +1 -1
- package/dist/esm-node/router/runtime/hooks.mjs +6 -7
- package/dist/esm-node/router/runtime/plugin.mjs +14 -19
- package/dist/esm-node/router/runtime/plugin.node.mjs +3 -4
- package/dist/types/common.d.ts +2 -8
- package/dist/types/core/context/index.d.ts +1 -1
- package/dist/types/core/context/public.d.ts +1 -1
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/react/wrapper.d.ts +1 -1
- package/dist/types/core/server/requestHandler.d.ts +30 -1
- package/dist/types/core/server/stream/deferredScript.d.ts +1 -1
- package/dist/types/core/server/stream/deferredScriptOutputCoordinator.d.ts +72 -0
- package/dist/types/core/server/stream/shared.d.ts +14 -0
- package/dist/types/document/cli/index.d.ts +1 -0
- package/dist/types/internal.d.ts +1 -1
- package/dist/types/router/cli/code/utils.d.ts +1 -1
- package/dist/types/router/runtime/hooks.d.ts +12 -16
- package/package.json +34 -29
- package/rslib.config.mts +3 -0
- package/rstest.config.mts +0 -4
- package/dist/cjs/core/server/requestResponse.js +0 -107
- package/dist/cjs/core/server/routerCleanup.js +0 -129
- package/dist/cjs/rsc/server.worker.js +0 -62
- package/dist/esm/core/server/requestResponse.mjs +0 -63
- package/dist/esm/core/server/routerCleanup.mjs +0 -82
- package/dist/esm/rsc/server.worker.mjs +0 -1
- package/dist/esm-node/core/server/requestResponse.mjs +0 -64
- package/dist/esm-node/core/server/routerCleanup.mjs +0 -83
- package/dist/esm-node/rsc/server.worker.mjs +0 -2
- package/dist/types/core/server/requestResponse.d.ts +0 -15
- package/dist/types/core/server/routerCleanup.d.ts +0 -31
- 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,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';
|