vite-plugin-react-server 1.1.9 → 1.1.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/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/plugin/config/defaults.d.ts +2 -1
- package/dist/plugin/config/defaults.d.ts.map +1 -1
- package/dist/plugin/config/defaults.js +3 -1
- package/dist/plugin/config/defaults.js.map +1 -1
- package/dist/plugin/config/resolveDevServerConfig.d.ts +2 -0
- package/dist/plugin/config/resolveDevServerConfig.d.ts.map +1 -0
- package/dist/plugin/config/resolveDevServerConfig.js +1 -0
- package/dist/plugin/config/resolveEnv.d.ts +3 -0
- package/dist/plugin/config/resolveEnv.d.ts.map +1 -0
- package/dist/plugin/config/resolveEnv.js +21 -0
- package/dist/plugin/config/resolveEnv.js.map +1 -0
- package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
- package/dist/plugin/config/resolveOptions.js +25 -9
- package/dist/plugin/config/resolveOptions.js.map +1 -1
- package/dist/plugin/config/resolveUrlOption.js.map +1 -1
- package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
- package/dist/plugin/config/resolveUserConfig.js +44 -58
- package/dist/plugin/config/resolveUserConfig.js.map +1 -1
- package/dist/plugin/helpers/collectManifestCss.js.map +1 -1
- package/dist/plugin/helpers/createCssProps.d.ts.map +1 -1
- package/dist/plugin/helpers/createCssProps.js +10 -2
- package/dist/plugin/helpers/createCssProps.js.map +1 -1
- package/dist/plugin/helpers/getRouteFiles.js +18 -35
- package/dist/plugin/helpers/inputNormalizer.d.ts +2 -1
- package/dist/plugin/helpers/inputNormalizer.d.ts.map +1 -1
- package/dist/plugin/helpers/inputNormalizer.js +34 -9
- package/dist/plugin/helpers/inputNormalizer.js.map +1 -1
- package/dist/plugin/helpers/requestInfo.d.ts +16 -0
- package/dist/plugin/helpers/requestInfo.d.ts.map +1 -0
- package/dist/plugin/helpers/requestInfo.js +66 -0
- package/dist/plugin/helpers/requestInfo.js.map +1 -0
- package/dist/plugin/helpers/requestToRoute.js +14 -22
- package/dist/plugin/helpers/serializeUserOptions.js.map +1 -1
- package/dist/plugin/loader/css-loader.development.d.ts.map +1 -1
- package/dist/plugin/loader/css-loader.development.js +1 -7
- package/dist/plugin/loader/css-loader.development.js.map +1 -1
- package/dist/plugin/loader/css-loader.production.js.map +1 -1
- package/dist/plugin/loader/react-loader.d.ts.map +1 -1
- package/dist/plugin/loader/react-loader.js +1 -8
- package/dist/plugin/loader/react-loader.js.map +1 -1
- package/dist/plugin/metrics/formatMetrics.d.ts +6 -1
- package/dist/plugin/metrics/formatMetrics.d.ts.map +1 -1
- package/dist/plugin/metrics/formatMetrics.js +21 -3
- package/dist/plugin/metrics/formatMetrics.js.map +1 -1
- package/dist/plugin/metrics.js +1 -1
- package/dist/plugin/plugin.client.js.map +1 -1
- package/dist/plugin/plugin.server.js.map +1 -1
- package/dist/plugin/preserver/plugin.js.map +1 -1
- package/dist/plugin/react-client/createMessageHandlers.d.ts +10 -0
- package/dist/plugin/react-client/createMessageHandlers.d.ts.map +1 -0
- package/dist/plugin/react-client/createMessageHandlers.js +36 -0
- package/dist/plugin/react-client/createMessageHandlers.js.map +1 -0
- package/dist/plugin/react-client/createWorkerStream.d.ts +3 -3
- package/dist/plugin/react-client/createWorkerStream.d.ts.map +1 -1
- package/dist/plugin/react-client/createWorkerStream.js +60 -69
- package/dist/plugin/react-client/createWorkerStream.js.map +1 -1
- package/dist/plugin/react-client/plugin.d.ts.map +1 -1
- package/dist/plugin/react-client/plugin.js +1 -3
- package/dist/plugin/react-client/plugin.js.map +1 -1
- package/dist/plugin/react-client/restartWorker.js +2 -2
- package/dist/plugin/react-client/restartWorker.js.map +1 -1
- package/dist/plugin/react-client/server.d.ts.map +1 -1
- package/dist/plugin/react-client/server.js +29 -40
- package/dist/plugin/react-client/server.js.map +1 -1
- package/dist/plugin/react-server/server.d.ts.map +1 -1
- package/dist/plugin/react-server/server.js +17 -19
- package/dist/plugin/react-server/server.js.map +1 -1
- package/dist/plugin/react-static/collectHtmlWorkerContent.js.map +1 -1
- package/dist/plugin/react-static/collectRscContent.js.map +1 -1
- package/dist/plugin/react-static/configurePreviewServer.d.ts.map +1 -1
- package/dist/plugin/react-static/configurePreviewServer.js +58 -54
- package/dist/plugin/react-static/configurePreviewServer.js.map +1 -1
- package/dist/plugin/react-static/fileWriter.js.map +1 -1
- package/dist/plugin/react-static/plugin.d.ts.map +1 -1
- package/dist/plugin/react-static/plugin.js +12 -6
- package/dist/plugin/react-static/plugin.js.map +1 -1
- package/dist/plugin/react-static/renderPages.js.map +1 -1
- package/dist/plugin/transformer/plugin.client.d.ts.map +1 -1
- package/dist/plugin/transformer/plugin.client.js +3 -12
- package/dist/plugin/transformer/plugin.client.js.map +1 -1
- package/dist/plugin/transformer/plugin.js.map +1 -1
- package/dist/plugin/transformer/plugin.server.d.ts.map +1 -1
- package/dist/plugin/transformer/plugin.server.js +17 -24
- package/dist/plugin/transformer/plugin.server.js.map +1 -1
- package/dist/plugin/types.d.ts +4 -1
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/utils/callServer.d.ts.map +1 -1
- package/dist/plugin/utils/callServer.js +2 -2
- package/dist/plugin/utils/callServer.js.map +1 -1
- package/dist/plugin/utils/createReactFetcher.d.ts +1 -1
- package/dist/plugin/utils/createReactFetcher.d.ts.map +1 -1
- package/dist/plugin/utils/createReactFetcher.js +6 -8
- package/dist/plugin/utils/createReactFetcher.js.map +1 -1
- package/dist/plugin/utils/env.d.ts +2 -0
- package/dist/plugin/utils/env.d.ts.map +1 -0
- package/dist/plugin/utils/env.js +9 -0
- package/dist/plugin/utils/env.js.map +1 -0
- package/dist/plugin/utils/index.d.ts +1 -0
- package/dist/plugin/utils/index.d.ts.map +1 -1
- package/dist/plugin/utils/index.js +1 -0
- package/dist/plugin/utils/pageURL.d.ts +4 -1
- package/dist/plugin/utils/pageURL.d.ts.map +1 -1
- package/dist/plugin/utils/pageURL.js +23 -11
- package/dist/plugin/utils/pageURL.js.map +1 -1
- package/dist/plugin/utils.js +1 -0
- package/dist/plugin/utils.js.map +1 -1
- package/dist/plugin/worker/createWorker.d.ts.map +1 -1
- package/dist/plugin/worker/createWorker.js +4 -3
- package/dist/plugin/worker/createWorker.js.map +1 -1
- package/dist/plugin/worker/html/createHtmlWorkerRenderState.d.ts.map +1 -1
- package/dist/plugin/worker/html/createHtmlWorkerRenderState.js +3 -0
- package/dist/plugin/worker/html/createHtmlWorkerRenderState.js.map +1 -1
- package/dist/plugin/worker/rsc/handleRender.d.ts +2 -7
- package/dist/plugin/worker/rsc/handleRender.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/handleRender.js.map +1 -1
- package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/messageHandler.js +1 -1
- package/dist/plugin/worker/rsc/messageHandler.js.map +1 -1
- package/dist/plugin/worker/rsc/rsc-worker.development.js.map +1 -1
- package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/state.js.map +1 -1
- package/dist/plugin/worker/types.d.ts +6 -0
- package/dist/plugin/worker/types.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/plugin/config/defaults.tsx +2 -1
- package/plugin/config/resolveDevServerConfig.tsx +0 -0
- package/plugin/config/resolveEnv.ts +37 -0
- package/plugin/config/resolveOptions.ts +49 -24
- package/plugin/config/resolveUserConfig.ts +73 -77
- package/plugin/helpers/createCssProps.tsx +14 -6
- package/plugin/helpers/inputNormalizer.ts +66 -17
- package/plugin/helpers/requestInfo.ts +81 -0
- package/plugin/loader/css-loader.development.ts +2 -8
- package/plugin/loader/react-loader.ts +1 -10
- package/plugin/metrics/formatMetrics.ts +29 -4
- package/plugin/preserver/plugin.ts +1 -0
- package/plugin/react-client/createMessageHandlers.ts +37 -0
- package/plugin/react-client/createWorkerStream.ts +76 -83
- package/plugin/react-client/plugin.ts +1 -4
- package/plugin/react-client/restartWorker.ts +2 -2
- package/plugin/react-client/server.ts +36 -62
- package/plugin/react-server/server.ts +17 -30
- package/plugin/react-static/configurePreviewServer.ts +75 -62
- package/plugin/react-static/plugin.ts +17 -11
- package/plugin/transformer/plugin.client.ts +4 -12
- package/plugin/transformer/plugin.server.ts +18 -25
- package/plugin/types.ts +12 -9
- package/plugin/utils/callServer.ts +20 -19
- package/plugin/utils/createReactFetcher.ts +6 -8
- package/plugin/utils/env.ts +1 -0
- package/plugin/utils/index.ts +2 -1
- package/plugin/utils/pageURL.ts +29 -24
- package/plugin/worker/createWorker.ts +4 -9
- package/plugin/worker/html/createHtmlWorkerRenderState.tsx +3 -0
- package/plugin/worker/rsc/handleRender.ts +2 -7
- package/plugin/worker/rsc/messageHandler.tsx +4 -7
- package/plugin/worker/rsc/rsc-worker.development.ts +1 -1
- package/plugin/worker/types.ts +7 -0
- package/dist/plugin/helpers/getRouteFiles.js.map +0 -1
- package/dist/plugin/helpers/requestToRoute.js.map +0 -1
|
@@ -3,84 +3,75 @@
|
|
|
3
3
|
* Copyright (c) Nico Brinkkemper
|
|
4
4
|
* MIT License
|
|
5
5
|
*/
|
|
6
|
-
import '
|
|
6
|
+
import { createMessageHandler } from './createMessageHandlers.js';
|
|
7
7
|
|
|
8
8
|
async function* createWorkerStream(worker, message, logger, onMetrics) {
|
|
9
|
-
let messageHandler;
|
|
10
|
-
let
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
9
|
+
let messageHandler = null;
|
|
10
|
+
let currentResolve = null;
|
|
11
|
+
const handlers = {
|
|
12
|
+
onError: (error, errorInfo) => {
|
|
13
|
+
logger.error(error.message + error.stack, {
|
|
14
|
+
error
|
|
15
|
+
});
|
|
16
|
+
if (errorInfo) {
|
|
17
|
+
logger.error(errorInfo.componentStack);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
onData: (chunk) => {
|
|
21
|
+
currentResolve?.(chunk);
|
|
22
|
+
},
|
|
23
|
+
onEnd: () => {
|
|
24
|
+
currentResolve?.(new Uint8Array());
|
|
25
|
+
if (messageHandler) {
|
|
26
|
+
worker.removeListener("message", messageHandler);
|
|
27
|
+
messageHandler = null;
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
onMetrics: (metrics) => {
|
|
31
|
+
onMetrics?.(metrics);
|
|
25
32
|
}
|
|
26
|
-
return new TextEncoder().encode(`0:E{"digest":"","name":"Error","message":"${err.message}","stack":${JSON.stringify(err.stack)},"env":"Server"}`);
|
|
27
33
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
break;
|
|
34
|
-
case "RSC_END":
|
|
35
|
-
resolve(new Uint8Array());
|
|
36
|
-
break;
|
|
37
|
-
case "ERROR":
|
|
38
|
-
const errorResponse = onError(message2.error);
|
|
39
|
-
resolve(errorResponse);
|
|
40
|
-
break;
|
|
41
|
-
default:
|
|
42
|
-
logger.warn(`Unknown initial message type: ${message2.type}`);
|
|
43
|
-
resolve(new Uint8Array());
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
cleanup = () => {
|
|
48
|
-
worker.off("message", messageHandler);
|
|
49
|
-
};
|
|
50
|
-
worker.on("message", messageHandler);
|
|
34
|
+
try {
|
|
35
|
+
if (messageHandler) {
|
|
36
|
+
worker.removeListener("message", messageHandler);
|
|
37
|
+
messageHandler = null;
|
|
38
|
+
}
|
|
51
39
|
worker.postMessage({
|
|
40
|
+
...message,
|
|
52
41
|
type: "RSC_RENDER",
|
|
53
|
-
id:
|
|
54
|
-
...message
|
|
42
|
+
id: Math.random().toString(36).slice(2)
|
|
55
43
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
resolve(new Uint8Array());
|
|
64
|
-
return;
|
|
65
|
-
case "RSC_CHUNK":
|
|
66
|
-
resolve(message2.chunk);
|
|
67
|
-
return;
|
|
68
|
-
case "RSC_METRICS":
|
|
69
|
-
onMetrics?.(message2.metrics);
|
|
70
|
-
break;
|
|
71
|
-
case "ERROR":
|
|
72
|
-
cleanup();
|
|
73
|
-
const errorResponse = onError(message2.error);
|
|
74
|
-
resolve(errorResponse);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
worker.once("message", messageHandler);
|
|
44
|
+
yield await new Promise((resolve) => {
|
|
45
|
+
currentResolve = resolve;
|
|
46
|
+
messageHandler = createMessageHandler({
|
|
47
|
+
handlers,
|
|
48
|
+
logger
|
|
49
|
+
});
|
|
50
|
+
worker.on("message", messageHandler);
|
|
79
51
|
});
|
|
80
|
-
|
|
81
|
-
|
|
52
|
+
while (true) {
|
|
53
|
+
const chunk = await new Promise((resolve) => {
|
|
54
|
+
currentResolve = resolve;
|
|
55
|
+
if (messageHandler) {
|
|
56
|
+
worker.removeListener("message", messageHandler);
|
|
57
|
+
}
|
|
58
|
+
messageHandler = createMessageHandler({
|
|
59
|
+
handlers,
|
|
60
|
+
logger
|
|
61
|
+
});
|
|
62
|
+
worker.on("message", messageHandler);
|
|
63
|
+
});
|
|
64
|
+
if (chunk.length === 0) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
yield chunk;
|
|
68
|
+
}
|
|
69
|
+
} finally {
|
|
70
|
+
if (messageHandler) {
|
|
71
|
+
worker.removeListener("message", messageHandler);
|
|
72
|
+
messageHandler = null;
|
|
82
73
|
}
|
|
83
|
-
|
|
74
|
+
handlers.onEnd();
|
|
84
75
|
}
|
|
85
76
|
}
|
|
86
77
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createWorkerStream.js","sources":["../../../plugin/react-client/createWorkerStream.ts"],"sourcesContent":["import type { Logger } from \"vite\";\nimport type {
|
|
1
|
+
{"version":3,"file":"createWorkerStream.js","sources":["../../../plugin/react-client/createWorkerStream.ts"],"sourcesContent":["import type { Logger } from \"vite\";\nimport type { RscWorkerOutputMessage, RscRenderMessage } from \"../worker/types.js\";\nimport type { StreamMetrics } from \"../types.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\nimport type { StreamHandlers } from \"../worker/types.js\";\nimport { createMessageHandler } from \"./createMessageHandlers.js\";\n\n/**\n * Creates an async generator that yields RSC chunks from the worker.\n * Handles both module requests and RSC streaming.\n *\n * @param worker - The worker thread\n * @param server - The Vite dev server\n * @param message - The RSC render message\n * @param rscWorkerLoaderPort - Optional loader port for module loading\n * @returns An async generator that yields RSC chunks\n */\nexport async function* createWorkerStream(\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">,\n logger: Logger,\n onMetrics?: (metrics: StreamMetrics) => void\n): AsyncGenerator<Uint8Array> {\n let messageHandler: ((message: RscWorkerOutputMessage | undefined) => void) | null = null;\n let currentResolve: ((chunk: Uint8Array) => void) | null = null;\n const handlers: StreamHandlers = {\n onError: (error: any, errorInfo?: any) => {\n logger.error(error.message + error.stack, {\n error,\n });\n if (errorInfo) {\n logger.error(errorInfo.componentStack);\n }\n },\n onData: (chunk: Uint8Array) => {\n currentResolve?.(chunk);\n },\n onEnd: () => {\n currentResolve?.(new Uint8Array());\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n },\n onMetrics: (metrics: StreamMetrics) => {\n onMetrics?.(metrics);\n },\n };\n\n try {\n // Remove any existing message handler before starting\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n\n worker.postMessage({\n ...message,\n type: \"RSC_RENDER\",\n id: Math.random().toString(36).slice(2),\n });\n\n yield await new Promise<Uint8Array>((resolve) => {\n currentResolve = resolve;\n messageHandler = createMessageHandler({\n handlers,\n logger,\n });\n worker.on(\"message\", messageHandler);\n });\n\n while (true) {\n const chunk = await new Promise<Uint8Array>((resolve) => {\n currentResolve = resolve;\n // Create new message handler for each iteration\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n }\n messageHandler = createMessageHandler({\n handlers,\n logger,\n });\n worker.on(\"message\", messageHandler);\n });\n\n if (chunk.length === 0) {\n break;\n }\n\n yield chunk;\n }\n } finally {\n // Clean up message handler in finally block\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n handlers.onEnd();\n }\n}\n"],"names":[],"mappings":";;;;;;;AAiBA,gBAAuB,kBACrB,CAAA,MAAA,EACA,OACA,EAAA,MAAA,EACA,SAC4B,EAAA;AAC5B,EAAA,IAAI,cAAiF,GAAA,IAAA;AACrF,EAAA,IAAI,cAAuD,GAAA,IAAA;AAC3D,EAAA,MAAM,QAA2B,GAAA;AAAA,IAC/B,OAAA,EAAS,CAAC,KAAA,EAAY,SAAoB,KAAA;AACxC,MAAA,MAAA,CAAO,KAAM,CAAA,KAAA,CAAM,OAAU,GAAA,KAAA,CAAM,KAAO,EAAA;AAAA,QACxC;AAAA,OACD,CAAA;AACD,MAAA,IAAI,SAAW,EAAA;AACb,QAAO,MAAA,CAAA,KAAA,CAAM,UAAU,cAAc,CAAA;AAAA;AACvC,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,KAAsB,KAAA;AAC7B,MAAA,cAAA,GAAiB,KAAK,CAAA;AAAA,KACxB;AAAA,IACA,OAAO,MAAM;AACX,MAAiB,cAAA,GAAA,IAAI,YAAY,CAAA;AACjC,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAO,MAAA,CAAA,cAAA,CAAe,WAAW,cAAc,CAAA;AAC/C,QAAiB,cAAA,GAAA,IAAA;AAAA;AACnB,KACF;AAAA,IACA,SAAA,EAAW,CAAC,OAA2B,KAAA;AACrC,MAAA,SAAA,GAAY,OAAO,CAAA;AAAA;AACrB,GACF;AAEA,EAAI,IAAA;AAEF,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAO,MAAA,CAAA,cAAA,CAAe,WAAW,cAAc,CAAA;AAC/C,MAAiB,cAAA,GAAA,IAAA;AAAA;AAGnB,IAAA,MAAA,CAAO,WAAY,CAAA;AAAA,MACjB,GAAG,OAAA;AAAA,MACH,IAAM,EAAA,YAAA;AAAA,MACN,EAAA,EAAI,KAAK,MAAO,EAAA,CAAE,SAAS,EAAE,CAAA,CAAE,MAAM,CAAC;AAAA,KACvC,CAAA;AAED,IAAA,MAAM,MAAM,IAAI,OAAoB,CAAA,CAAC,OAAY,KAAA;AAC/C,MAAiB,cAAA,GAAA,OAAA;AACjB,MAAA,cAAA,GAAiB,oBAAqB,CAAA;AAAA,QACpC,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAO,MAAA,CAAA,EAAA,CAAG,WAAW,cAAc,CAAA;AAAA,KACpC,CAAA;AAED,IAAA,OAAO,IAAM,EAAA;AACX,MAAA,MAAM,KAAQ,GAAA,MAAM,IAAI,OAAA,CAAoB,CAAC,OAAY,KAAA;AACvD,QAAiB,cAAA,GAAA,OAAA;AAEjB,QAAA,IAAI,cAAgB,EAAA;AAClB,UAAO,MAAA,CAAA,cAAA,CAAe,WAAW,cAAc,CAAA;AAAA;AAEjD,QAAA,cAAA,GAAiB,oBAAqB,CAAA;AAAA,UACpC,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAO,MAAA,CAAA,EAAA,CAAG,WAAW,cAAc,CAAA;AAAA,OACpC,CAAA;AAED,MAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,QAAA;AAAA;AAGF,MAAM,MAAA,KAAA;AAAA;AACR,GACA,SAAA;AAEA,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAO,MAAA,CAAA,cAAA,CAAe,WAAW,cAAc,CAAA;AAC/C,MAAiB,cAAA,GAAA,IAAA;AAAA;AAEnB,IAAA,QAAA,CAAS,KAAM,EAAA;AAAA;AAEnB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAIV,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAcrB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAIV,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAcrB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA+GtE"}
|
|
@@ -66,9 +66,7 @@ function reactClientPlugin(options) {
|
|
|
66
66
|
autoDiscoveredFiles,
|
|
67
67
|
userOptions,
|
|
68
68
|
hmrChannel,
|
|
69
|
-
onMetrics: userOptions.onMetrics
|
|
70
|
-
userOptions.onMetrics?.(metrics);
|
|
71
|
-
} : undefined
|
|
69
|
+
onMetrics: userOptions.onMetrics
|
|
72
70
|
});
|
|
73
71
|
},
|
|
74
72
|
async handleHotUpdate({ file, server, read, timestamp, ...ctx }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../plugin/react-client/plugin.ts"],"sourcesContent":["import { type Plugin } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n ResolvedUserConfig,\n ResolvedUserOptions,\n StreamPluginOptions,\n} from \"../types.js\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { resolveAutoDiscover } from \"../config/resolveAutoDiscover.js\";\nimport { configureWorkerRequestHandler } from \"./server.js\";\nimport { configurePreviewServer } from \"../react-static/configurePreviewServer.js\";\nimport { MessageChannel } from \"node:worker_threads\";\n\nlet userOptions: ResolvedUserOptions;\nlet userConfig: ResolvedUserConfig;\nlet root: string;\nlet autoDiscoveredFiles: AutoDiscoveredFiles;\nlet hmrChannel: MessageChannel | null = null;\n\nexport function reactClientPlugin(options: StreamPluginOptions): Plugin {\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n root = userOptions.projectRoot;\n\n return {\n name: \"vite:react-client\",\n\n async config(config, configEnv) {\n if (\n typeof config.root === \"string\" &&\n config.root !== root &&\n config.root !== process.cwd() &&\n config.root !== \"\"\n ) {\n root = config.root;\n }\n\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-client\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n\n const resolvedConfig = resolveUserConfig({\n condition: \"react-client\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n return userConfig;\n },\n
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../../plugin/react-client/plugin.ts"],"sourcesContent":["import { type Plugin } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n ResolvedUserConfig,\n ResolvedUserOptions,\n StreamPluginOptions,\n} from \"../types.js\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { resolveAutoDiscover } from \"../config/resolveAutoDiscover.js\";\nimport { configureWorkerRequestHandler } from \"./server.js\";\nimport { configurePreviewServer } from \"../react-static/configurePreviewServer.js\";\nimport { MessageChannel } from \"node:worker_threads\";\n\nlet userOptions: ResolvedUserOptions;\nlet userConfig: ResolvedUserConfig;\nlet root: string;\nlet autoDiscoveredFiles: AutoDiscoveredFiles;\nlet hmrChannel: MessageChannel | null = null;\n\nexport function reactClientPlugin(options: StreamPluginOptions): Plugin {\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n root = userOptions.projectRoot;\n\n return {\n name: \"vite:react-client\",\n\n async config(config, configEnv) {\n if (\n typeof config.root === \"string\" &&\n config.root !== root &&\n config.root !== process.cwd() &&\n config.root !== \"\"\n ) {\n root = config.root;\n }\n\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-client\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n\n const resolvedConfig = resolveUserConfig({\n condition: \"react-client\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n return userConfig;\n },\n async configurePreviewServer(server) {\n await configurePreviewServer({\n server,\n userOptions,\n });\n },\n // setup dev server\n async configureServer(server) {\n // Create HMR message channel\n hmrChannel = new MessageChannel();\n\n await configureWorkerRequestHandler({\n server,\n autoDiscoveredFiles,\n userOptions,\n hmrChannel,\n onMetrics: userOptions.onMetrics,\n });\n },\n\n async handleHotUpdate({ file, server, read, timestamp, ...ctx }) {\n try {\n // Check if the file is a page or props file\n const isPageFile = userOptions.autoDiscover.modulePattern(file);\n if (!isPageFile) return;\n\n // Get the route for this file\n const [, value] = userOptions.normalizer(file);\n \n // Find all routes affected by this file change\n const affectedRoutes = autoDiscoveredFiles.routeMap.get(value) || [];\n\n // Send HMR update directly to worker through MessageChannel\n if (hmrChannel?.port1) {\n hmrChannel.port1.postMessage({\n type: 'HMR_UPDATE',\n path: file,\n timestamp,\n routes: affectedRoutes\n });\n\n // Trigger a full page refresh for affected routes\n for (const route of affectedRoutes) {\n server.ws.send({\n type: 'full-reload',\n path: route\n });\n }\n }\n\n // Let Vite handle the HMR update\n return ctx.modules;\n } catch (error) {\n if (hmrChannel?.port1) {\n hmrChannel.port1.postMessage({\n type: 'HMR_ERROR',\n path: file,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n return ctx.modules;\n }\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,8 @@ async function restartWorker(server, autoDiscoveredFiles, userOptions, hmrChanne
|
|
|
13
13
|
isRestarting = true;
|
|
14
14
|
try {
|
|
15
15
|
if (currentWorker) {
|
|
16
|
-
currentWorker.
|
|
17
|
-
currentWorker
|
|
16
|
+
currentWorker.removeAllListeners();
|
|
17
|
+
return currentWorker;
|
|
18
18
|
}
|
|
19
19
|
const routeCount = autoDiscoveredFiles.urlMap.size;
|
|
20
20
|
const hmrBuffer = 20;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restartWorker.js","sources":["../../../plugin/react-client/restartWorker.ts"],"sourcesContent":["import type { ResolvedUserOptions } from \"../../types.js\";\n\nimport type { ViteDevServer } from \"vite\";\nimport type { AutoDiscoveredFiles } from \"../../types.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { serializedDevServerConfig } from \"../helpers/serializeUserOptions.js\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport type { MessageChannel, Worker } from \"node:worker_threads\";\n\nlet currentWorker: Worker | null = null;\nlet isRestarting = false;\n\nexport async function restartWorker(\n server: ViteDevServer,\n autoDiscoveredFiles: AutoDiscoveredFiles,\n userOptions: ResolvedUserOptions,\n hmrChannel: MessageChannel\n ) {\n if (isRestarting) return;\n isRestarting = true;\n \n try {\n // Terminate the current worker if it exists\n if (currentWorker) {\n currentWorker.
|
|
1
|
+
{"version":3,"file":"restartWorker.js","sources":["../../../plugin/react-client/restartWorker.ts"],"sourcesContent":["import type { ResolvedUserOptions } from \"../../types.js\";\n\nimport type { ViteDevServer } from \"vite\";\nimport type { AutoDiscoveredFiles } from \"../../types.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { serializedDevServerConfig } from \"../helpers/serializeUserOptions.js\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport type { MessageChannel, Worker } from \"node:worker_threads\";\n\nlet currentWorker: Worker | null = null;\nlet isRestarting = false;\n\nexport async function restartWorker(\n server: ViteDevServer,\n autoDiscoveredFiles: AutoDiscoveredFiles,\n userOptions: ResolvedUserOptions,\n hmrChannel: MessageChannel\n ) {\n if (isRestarting) return;\n isRestarting = true;\n \n try {\n // Terminate the current worker if it exists\n if (currentWorker) {\n currentWorker.removeAllListeners();\n return currentWorker;\n }\n const routeCount = autoDiscoveredFiles.urlMap.size;\n const hmrBuffer = 20; // Buffer for HMR and other operations\n const maxListeners = routeCount + hmrBuffer;\n const workerResult = await createWorker({\n projectRoot: server.config.root,\n workerPath: userOptions.rscWorkerPath,\n reverseCondition: \"react-server\",\n currentCondition: \"react-client\",\n maxListeners: maxListeners,\n envPrefix:\n typeof server.config.envPrefix === \"string\"\n ? server.config.envPrefix\n : Array.isArray(server.config.envPrefix)\n ? server.config.envPrefix[0]\n : \"VITE_\",\n workerData: {\n hmrPort: hmrChannel.port2,\n resolvedConfig: serializedDevServerConfig(server.config),\n userOptions: serializedOptions(userOptions, autoDiscoveredFiles),\n },\n transferList: [hmrChannel.port2],\n });\n \n if (workerResult.type === \"success\") {\n currentWorker = workerResult.worker;\n server.config.logger.info(\n `[react-client] Set max listeners to ${maxListeners} for ${routeCount} routes`\n );\n } else if (workerResult.type === \"error\") {\n server.config.logger.error(\"Failed to start rsc-worker\", {\n error: workerResult.error,\n });\n }\n } finally {\n isRestarting = false;\n }\n return currentWorker;\n }"],"names":[],"mappings":";;;;;;;;AASA,IAAI,aAA+B,GAAA,IAAA;AACnC,IAAI,YAAe,GAAA,KAAA;AAEnB,eAAsB,aAClB,CAAA,MAAA,EACA,mBACA,EAAA,WAAA,EACA,UACA,EAAA;AACA,EAAA,IAAI,YAAc,EAAA;AAClB,EAAe,YAAA,GAAA,IAAA;AAEf,EAAI,IAAA;AAEF,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,aAAA,CAAc,kBAAmB,EAAA;AACjC,MAAO,OAAA,aAAA;AAAA;AAET,IAAM,MAAA,UAAA,GAAa,oBAAoB,MAAO,CAAA,IAAA;AAC9C,IAAA,MAAM,SAAY,GAAA,EAAA;AAClB,IAAA,MAAM,eAAe,UAAa,GAAA,SAAA;AAClC,IAAM,MAAA,YAAA,GAAe,MAAM,YAAa,CAAA;AAAA,MACtC,WAAA,EAAa,OAAO,MAAO,CAAA,IAAA;AAAA,MAC3B,YAAY,WAAY,CAAA,aAAA;AAAA,MACxB,gBAAkB,EAAA,cAAA;AAAA,MAClB,gBAAkB,EAAA,cAAA;AAAA,MAClB,YAAA;AAAA,MACA,WACE,OAAO,MAAA,CAAO,OAAO,SAAc,KAAA,QAAA,GAC/B,OAAO,MAAO,CAAA,SAAA,GACd,MAAM,OAAQ,CAAA,MAAA,CAAO,OAAO,SAAS,CAAA,GACrC,OAAO,MAAO,CAAA,SAAA,CAAU,CAAC,CACzB,GAAA,OAAA;AAAA,MACN,UAAY,EAAA;AAAA,QACV,SAAS,UAAW,CAAA,KAAA;AAAA,QACpB,cAAA,EAAgB,yBAA0B,CAAA,MAAA,CAAO,MAAM,CAAA;AAAA,QACvD,WAAA,EAAa,iBAAkB,CAAA,WAAA,EAAa,mBAAmB;AAAA,OACjE;AAAA,MACA,YAAA,EAAc,CAAC,UAAA,CAAW,KAAK;AAAA,KAChC,CAAA;AAED,IAAI,IAAA,YAAA,CAAa,SAAS,SAAW,EAAA;AACnC,MAAA,aAAA,GAAgB,YAAa,CAAA,MAAA;AAC7B,MAAA,MAAA,CAAO,OAAO,MAAO,CAAA,IAAA;AAAA,QACnB,CAAA,oCAAA,EAAuC,YAAY,CAAA,KAAA,EAAQ,UAAU,CAAA,OAAA;AAAA,OACvE;AAAA,KACF,MAAA,IAAW,YAAa,CAAA,IAAA,KAAS,OAAS,EAAA;AACxC,MAAO,MAAA,CAAA,MAAA,CAAO,MAAO,CAAA,KAAA,CAAM,4BAA8B,EAAA;AAAA,QACvD,OAAO,YAAa,CAAA;AAAA,OACrB,CAAA;AAAA;AACH,GACA,SAAA;AACA,IAAe,YAAA,GAAA,KAAA;AAAA;AAEjB,EAAO,OAAA,aAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEb,mBAAmB,EACnB,aAAa,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEb,mBAAmB,EACnB,aAAa,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAC3C,cAAc,CAAC,UAAU,CAAC,CAwC5B;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,EAClD,MAAM,EACN,mBAAmB,EACnB,WAAW,EAAE,YAAY,EACzB,UAAU,EACV,SAAS,GACV,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C,iBAoIA"}
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import 'node:worker_threads';
|
|
7
7
|
import { serializedOptions } from '../helpers/serializeUserOptions.js';
|
|
8
|
-
import {
|
|
9
|
-
import { requestToRoute } from '../helpers/requestToRoute.js';
|
|
8
|
+
import { requestInfo } from '../helpers/requestInfo.js';
|
|
10
9
|
import { performance } from 'node:perf_hooks';
|
|
11
10
|
import { createWorkerStream } from './createWorkerStream.js';
|
|
12
11
|
import { restartWorker } from './restartWorker.js';
|
|
@@ -58,43 +57,33 @@ async function configureWorkerRequestHandler({
|
|
|
58
57
|
...handlerUserOptions
|
|
59
58
|
} = _userOptions;
|
|
60
59
|
const handlerOptions = Object.assign({}, handlerUserOptions, {
|
|
61
|
-
moduleBaseURL:
|
|
62
|
-
moduleBasePath:
|
|
60
|
+
moduleBaseURL: server.config.base,
|
|
61
|
+
moduleBasePath: _moduleBasePath,
|
|
63
62
|
projectRoot: server.config.root
|
|
64
63
|
});
|
|
65
|
-
const currentWorker = await restartWorker(
|
|
64
|
+
const currentWorker = await restartWorker(
|
|
65
|
+
server,
|
|
66
|
+
autoDiscoveredFiles,
|
|
67
|
+
handlerOptions,
|
|
68
|
+
hmrChannel
|
|
69
|
+
);
|
|
66
70
|
const handler = async (req, res, next) => {
|
|
67
|
-
if (!req.url
|
|
71
|
+
if (!req.url) return next();
|
|
72
|
+
const info = requestInfo(req, handlerOptions, "");
|
|
73
|
+
if (!info.isRscRequest) return next();
|
|
74
|
+
if (!currentWorker) {
|
|
75
|
+
server.config.logger.warn("[react-client] No worker available");
|
|
76
|
+
return next();
|
|
77
|
+
}
|
|
78
|
+
if (!autoDiscoveredFiles.urlMap.has(info.route)) {
|
|
79
|
+
server.config.logger.warn(`[react-client] No route found for route: ${info.route}`);
|
|
80
|
+
return next();
|
|
81
|
+
}
|
|
68
82
|
try {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
let route = requestToRoute(req, {
|
|
74
|
-
moduleBasePath: handlerOptions.moduleBasePath,
|
|
75
|
-
build: handlerOptions.build
|
|
76
|
-
});
|
|
77
|
-
if (!route) {
|
|
78
|
-
return next();
|
|
79
|
-
}
|
|
80
|
-
const routeFiles = await getRouteFiles(
|
|
81
|
-
route,
|
|
82
|
-
autoDiscoveredFiles,
|
|
83
|
-
handlerOptions
|
|
84
|
-
);
|
|
85
|
-
if (routeFiles.type === "error") {
|
|
86
|
-
server.config.logger.error(
|
|
87
|
-
`[react-client] Error fetching route files for ${route}`,
|
|
88
|
-
{
|
|
89
|
-
error: routeFiles.error,
|
|
90
|
-
timestamp: true,
|
|
91
|
-
environment: "server"
|
|
92
|
-
}
|
|
93
|
-
);
|
|
94
|
-
return next();
|
|
95
|
-
}
|
|
96
|
-
const { page, props } = routeFiles;
|
|
97
|
-
res.setHeader("Content-Type", "text/x-component; charset=utf-8");
|
|
83
|
+
const routeFiles = autoDiscoveredFiles.urlMap.get(info.route);
|
|
84
|
+
const pagePath = routeFiles.page;
|
|
85
|
+
const propsPath = routeFiles.props;
|
|
86
|
+
res.setHeader("Content-Type", info.contentType);
|
|
98
87
|
res.setHeader("Transfer-Encoding", "chunked");
|
|
99
88
|
res.setHeader("Connection", "keep-alive");
|
|
100
89
|
const serializedUserOptions = serializedOptions(
|
|
@@ -107,9 +96,9 @@ async function configureWorkerRequestHandler({
|
|
|
107
96
|
{
|
|
108
97
|
...serializedUserOptions,
|
|
109
98
|
// we make the worker stream aware of the route, pagePath, propsPath
|
|
110
|
-
route,
|
|
111
|
-
pagePath
|
|
112
|
-
propsPath
|
|
99
|
+
route: info.route,
|
|
100
|
+
pagePath,
|
|
101
|
+
propsPath,
|
|
113
102
|
// override these at all times to ensure the settings will work for the dev server
|
|
114
103
|
projectRoot: server.config.root,
|
|
115
104
|
build: serializedUserOptions.build,
|
|
@@ -121,7 +110,7 @@ async function configureWorkerRequestHandler({
|
|
|
121
110
|
typeof onMetrics === "function" ? (metrics) => {
|
|
122
111
|
const elapsedTime = performance.now() - startTime;
|
|
123
112
|
const formattedMetrics = {
|
|
124
|
-
route,
|
|
113
|
+
route: info.route,
|
|
125
114
|
htmlSize: 0,
|
|
126
115
|
rscSize: metrics.bytes,
|
|
127
116
|
processingTime: elapsedTime,
|
|
@@ -133,7 +122,7 @@ async function configureWorkerRequestHandler({
|
|
|
133
122
|
duration: elapsedTime
|
|
134
123
|
},
|
|
135
124
|
htmlSizes: /* @__PURE__ */ new Map(),
|
|
136
|
-
rscSizes: /* @__PURE__ */ new Map([[route, metrics.bytes]])
|
|
125
|
+
rscSizes: /* @__PURE__ */ new Map([[info.route, metrics.bytes]])
|
|
137
126
|
};
|
|
138
127
|
onMetrics(formattedMetrics);
|
|
139
128
|
} : void 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../../../plugin/react-client/server.ts"],"sourcesContent":["import type { Logger, ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n RenderMetrics,\n RequestHandler,\n ResolvedUserOptions,\n StreamMetrics,\n} from \"../types.js\";\nimport type {\n RscRenderMessage,\n} from \"../worker/types.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\nimport { MessageChannel } from \"node:worker_threads\";\nimport {\n serializedOptions,\n} from \"../helpers/serializeUserOptions.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport { requestToRoute } from \"../helpers/requestToRoute.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { createWorkerStream } from \"./createWorkerStream.js\";\nimport { restartWorker } from \"./restartWorker.js\";\n\n\n/**\n * Handles the RSC stream from the worker.\n * Creates a ReadableStream that pipes RSC chunks to the response.\n *\n * @param worker - The worker thread\n * @param message - The RSC render message\n * @returns A ReadableStream that yields RSC chunks\n */\nexport function handleWorkerRscStream(\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">,\n logger: Logger,\n onMetrics?: (metrics: StreamMetrics) => void\n): ReadableStream<Uint8Array> {\n // Create a ReadableStream from the async generator\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n for await (const chunk of createWorkerStream(\n worker,\n message,\n logger,\n onMetrics\n )) {\n controller.enqueue(chunk);\n }\n } catch (error) {\n const err =\n error instanceof Error\n ? error\n : typeof error === \"string\"\n ? new Error(error)\n : typeof error === \"object\" && error != null\n ? {\n message:\n \"message\" in error ? String(error.message) : \"Unknown error\",\n stack: \"stack\" in error ? String(error.stack) : \"\",\n name: \"name\" in error ? String(error.name) : \"Error\",\n }\n : {\n message: \"Unknown error\",\n stack: \"\",\n name: \"Error\",\n };\n logger.error(err.message, {\n error: err,\n });\n controller.error(err);\n } finally {\n controller.close();\n }\n },\n });\n}\n\n/**\n * Configures the worker request handler.\n * @param server - The Vite dev server\n * @param autoDiscoveredFiles - The auto discovered files\n * @param userOptions - The user options\n */\nexport async function configureWorkerRequestHandler({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n hmrChannel,\n onMetrics,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n hmrChannel: MessageChannel;\n onMetrics?: (metrics: RenderMetrics) => void;\n}) {\n let {\n // remove these\n projectRoot: _projectRoot,\n moduleBaseURL: _moduleBaseURL,\n moduleBasePath: _moduleBasePath,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL:\n typeof server.config.server.host === \"string\"\n ? `${server.config.server.https ? \"https\" : \"http\"}://${\n server.config.server.host\n }:${server.config.server.port}`\n : _moduleBaseURL,\n moduleBasePath:\n server.config.base === \"/\"\n ? \"\"\n : server.config.base.endsWith(\"/\")\n ? server.config.base.slice(0, -1)\n : server.config.base,\n projectRoot: server.config.root,\n });\n\n // Start the worker\n const currentWorker = await restartWorker(server, autoDiscoveredFiles, handlerOptions, hmrChannel);\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url || req.headers.accept !== \"text/x-component\") return next();\n try {\n if (!currentWorker) {\n server.config.logger.error(\"[react-client] No worker available\");\n return next();\n }\n\n // Get the route from the request\n let route = requestToRoute(req, {\n moduleBasePath: handlerOptions.moduleBasePath,\n build: handlerOptions.build,\n });\n if (!route) {\n return next();\n }\n // in the case of the no build.pages and a async Page and or props userOption, we need to await those\n // if they are already autoDiscovered then the promise will resolve immediately\n const routeFiles = await getRouteFiles(\n route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n server.config.logger.error(\n `[react-client] Error fetching route files for ${route}`,\n {\n error: routeFiles.error,\n timestamp: true,\n environment: \"server\",\n }\n );\n return next();\n }\n const { page, props } = routeFiles;\n\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n const serializedUserOptions = serializedOptions(\n handlerOptions,\n autoDiscoveredFiles\n );\n const startTime = performance.now();\n const stream = handleWorkerRscStream(\n currentWorker,\n {\n ...serializedUserOptions,\n // we make the worker stream aware of the route, pagePath, propsPath\n route,\n pagePath: page,\n propsPath: props,\n // override these at all times to ensure the settings will work for the dev server\n projectRoot: server.config.root,\n build: serializedUserOptions.build,\n manifest: autoDiscoveredFiles.staticManifest,\n cssFiles: new Map(),\n globalCss: new Map(),\n },\n server.config.logger,\n typeof onMetrics === \"function\"\n ? (metrics) => {\n const elapsedTime = performance.now() - startTime;\n const formattedMetrics = {\n route,\n htmlSize: 0,\n rscSize: metrics.bytes,\n processingTime: elapsedTime,\n chunks: metrics.chunks,\n chunkRate: metrics.chunks / (elapsedTime / 1000),\n memoryUsage: process.memoryUsage(),\n streamMetrics: {\n ...metrics,\n duration: elapsedTime\n },\n htmlSizes: new Map(),\n rscSizes: new Map([[route, metrics.bytes]]),\n } satisfies RenderMetrics;\n onMetrics(formattedMetrics);\n }\n : undefined\n );\n const writeStream = new WritableStream({\n write(chunk) {\n res.write(chunk);\n },\n\n close() {\n clearTimeout(timeout);\n res.end();\n },\n abort() {\n clearTimeout(timeout);\n // Restart worker on error\n restartWorker(\n server,\n autoDiscoveredFiles,\n handlerOptions,\n hmrChannel\n );\n res.end();\n },\n });\n let timeout: NodeJS.Timeout;\n\n // Pipe the stream to the response\n stream.pipeTo(writeStream);\n // wait for timeout\n timeout = setTimeout(() => {\n server.config.logger.error(\"RSC render timeout\");\n res.end();\n }, 5000);\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message, {\n error,\n });\n }\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // done\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../../../plugin/react-client/server.ts"],"sourcesContent":["import type { Logger, ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n RenderMetrics,\n RequestHandler,\n ResolvedUserOptions,\n StreamMetrics,\n} from \"../types.js\";\nimport type { RscRenderMessage } from \"../worker/types.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\nimport { MessageChannel } from \"node:worker_threads\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { createWorkerStream } from \"./createWorkerStream.js\";\nimport { restartWorker } from \"./restartWorker.js\";\n\n/**\n * Handles the RSC stream from the worker.\n * Creates a ReadableStream that pipes RSC chunks to the response.\n *\n * @param worker - The worker thread\n * @param message - The RSC render message\n * @returns A ReadableStream that yields RSC chunks\n */\nexport function handleWorkerRscStream(\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">,\n logger: Logger,\n onMetrics?: (metrics: StreamMetrics) => void\n): ReadableStream<Uint8Array> {\n // Create a ReadableStream from the async generator\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n for await (const chunk of createWorkerStream(\n worker,\n message,\n logger,\n onMetrics\n )) {\n controller.enqueue(chunk);\n }\n } catch (error) {\n const err =\n error instanceof Error\n ? error\n : typeof error === \"string\"\n ? new Error(error)\n : typeof error === \"object\" && error != null\n ? {\n message:\n \"message\" in error ? String(error.message) : \"Unknown error\",\n stack: \"stack\" in error ? String(error.stack) : \"\",\n name: \"name\" in error ? String(error.name) : \"Error\",\n }\n : {\n message: \"Unknown error\",\n stack: \"\",\n name: \"Error\",\n };\n logger.error(err.message, {\n error: err,\n });\n controller.error(err);\n } finally {\n controller.close();\n }\n },\n });\n}\n\n/**\n * Configures the worker request handler.\n * @param server - The Vite dev server\n * @param autoDiscoveredFiles - The auto discovered files\n * @param userOptions - The user options\n */\nexport async function configureWorkerRequestHandler({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n hmrChannel,\n onMetrics,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n hmrChannel: MessageChannel;\n onMetrics?: (metrics: RenderMetrics) => void;\n}) {\n let {\n // remove these\n projectRoot: _projectRoot,\n moduleBaseURL: _moduleBaseURL,\n moduleBasePath: _moduleBasePath,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL: server.config.base,\n moduleBasePath: _moduleBasePath,\n projectRoot: server.config.root,\n });\n\n // Start the worker\n const currentWorker = await restartWorker(\n server,\n autoDiscoveredFiles,\n handlerOptions,\n hmrChannel\n );\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url) return next();\n\n const info = requestInfo(req, handlerOptions, \"\");\n if (!info.isRscRequest) return next();\n\n if (!currentWorker) {\n server.config.logger.warn(\"[react-client] No worker available\");\n return next();\n }\n\n if (!autoDiscoveredFiles.urlMap.has(info.route)) {\n server.config.logger.warn(`[react-client] No route found for route: ${info.route}`);\n return next();\n }\n try {\n const routeFiles = autoDiscoveredFiles.urlMap.get(info.route)!;\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", info.contentType);\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n const serializedUserOptions = serializedOptions(\n handlerOptions,\n autoDiscoveredFiles\n );\n const startTime = performance.now();\n const stream = handleWorkerRscStream(\n currentWorker,\n {\n ...serializedUserOptions,\n // we make the worker stream aware of the route, pagePath, propsPath\n route: info.route,\n pagePath: pagePath,\n propsPath: propsPath,\n // override these at all times to ensure the settings will work for the dev server\n projectRoot: server.config.root,\n build: serializedUserOptions.build,\n manifest: autoDiscoveredFiles.staticManifest,\n cssFiles: new Map(),\n globalCss: new Map(),\n },\n server.config.logger,\n typeof onMetrics === \"function\"\n ? (metrics) => {\n const elapsedTime = performance.now() - startTime;\n const formattedMetrics = {\n route: info.route,\n htmlSize: 0,\n rscSize: metrics.bytes,\n processingTime: elapsedTime,\n chunks: metrics.chunks,\n chunkRate: metrics.chunks / (elapsedTime / 1000),\n memoryUsage: process.memoryUsage(),\n streamMetrics: {\n ...metrics,\n duration: elapsedTime,\n },\n htmlSizes: new Map(),\n rscSizes: new Map([[info.route, metrics.bytes]]),\n } satisfies RenderMetrics;\n onMetrics(formattedMetrics);\n }\n : undefined\n );\n const writeStream = new WritableStream({\n write(chunk) {\n res.write(chunk);\n },\n\n close() {\n clearTimeout(timeout);\n res.end();\n },\n abort() {\n clearTimeout(timeout);\n // Restart worker on error\n restartWorker(\n server,\n autoDiscoveredFiles,\n handlerOptions,\n hmrChannel\n );\n res.end();\n },\n });\n let timeout: NodeJS.Timeout;\n\n // Pipe the stream to the response\n stream.pipeTo(writeStream);\n // wait for timeout\n timeout = setTimeout(() => {\n server.config.logger.error(\"RSC render timeout\");\n res.end();\n }, 5000);\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message, {\n error,\n });\n }\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // done\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQ5E,wBAAsB,oBAAoB,CAAC,EACzC,MAAM,EACN,mBAAmB,EACnB,WAAW,EAAE,YAAY,EACzB,cAAc,GACf,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IACjC,cAAc,EAAE,QAAQ,CAAC;CAC1B,iBAoHA"}
|
|
@@ -8,6 +8,7 @@ import { collectViteModuleGraphCss } from '../helpers/collectViteModuleGraphCss.
|
|
|
8
8
|
import { resolvePageAndProps } from '../helpers/resolvePageAndProps.js';
|
|
9
9
|
import { createHandler } from '../helpers/createHandler.js';
|
|
10
10
|
import React__default from 'react';
|
|
11
|
+
import { requestInfo } from '../helpers/requestInfo.js';
|
|
11
12
|
|
|
12
13
|
async function configureReactServer({
|
|
13
14
|
server,
|
|
@@ -26,8 +27,8 @@ async function configureReactServer({
|
|
|
26
27
|
...handlerUserOptions
|
|
27
28
|
} = _userOptions;
|
|
28
29
|
const handlerOptions = Object.assign({}, handlerUserOptions, {
|
|
29
|
-
moduleBaseURL:
|
|
30
|
-
moduleBasePath:
|
|
30
|
+
moduleBaseURL: server.config.base,
|
|
31
|
+
moduleBasePath: _moduleBasePath,
|
|
31
32
|
projectRoot: server.config.root
|
|
32
33
|
});
|
|
33
34
|
server.ws.on("restart", (path) => {
|
|
@@ -45,30 +46,27 @@ async function configureReactServer({
|
|
|
45
46
|
activeStreams.clear();
|
|
46
47
|
});
|
|
47
48
|
server.middlewares.use(async (req, res, next) => {
|
|
49
|
+
if (!req.url) {
|
|
50
|
+
return next();
|
|
51
|
+
}
|
|
52
|
+
const info = requestInfo(req, handlerOptions, "");
|
|
53
|
+
if (!info.isRscRequest) return next();
|
|
48
54
|
try {
|
|
49
|
-
if (
|
|
50
|
-
let route = req.url?.replace("/" + handlerOptions.build.rscOutputPath, "");
|
|
51
|
-
if (handlerOptions.moduleBasePath !== "" && !route?.startsWith(handlerOptions.moduleBasePath)) {
|
|
52
|
-
next();
|
|
53
|
-
} else if (route && handlerOptions.moduleBasePath.length) {
|
|
54
|
-
route = route.slice(handlerOptions.moduleBasePath.length);
|
|
55
|
-
}
|
|
56
|
-
if (!route || route === "") {
|
|
57
|
-
route = "/";
|
|
58
|
-
}
|
|
59
|
-
if (!route.startsWith("/")) {
|
|
60
|
-
route = "/" + route;
|
|
61
|
-
}
|
|
62
|
-
if (!autoDiscoveredFiles.urlMap.has(route)) {
|
|
55
|
+
if (!autoDiscoveredFiles.urlMap.has(info.route)) {
|
|
63
56
|
return next();
|
|
64
57
|
}
|
|
65
|
-
const routeFiles = autoDiscoveredFiles.urlMap.get(route);
|
|
58
|
+
const routeFiles = autoDiscoveredFiles.urlMap.get(info.route);
|
|
66
59
|
const pagePath = routeFiles.page;
|
|
67
60
|
const propsPath = routeFiles.props;
|
|
61
|
+
const port = server.config.server.port ?? 5173;
|
|
62
|
+
const host = server.config.server.host ?? "localhost";
|
|
63
|
+
const protocol = server.config.server.https ? "https" : "http";
|
|
64
|
+
process.env["VITE_BASE_URL"] = `${server.config.base}${server.config.base.endsWith("/") ? "" : "/"}`;
|
|
65
|
+
process.env["VITE_PUBLIC_ORIGIN"] = `${protocol}://${host}:${port}`;
|
|
68
66
|
const pageAndPropsResult = await resolvePageAndProps({
|
|
69
67
|
pagePath,
|
|
70
68
|
propsPath,
|
|
71
|
-
route,
|
|
69
|
+
route: info.route,
|
|
72
70
|
loader: server.ssrLoadModule,
|
|
73
71
|
pageExportName: handlerOptions.pageExportName ?? "default",
|
|
74
72
|
propsExportName: handlerOptions.propsExportName ?? "default"
|
|
@@ -108,7 +106,7 @@ async function configureReactServer({
|
|
|
108
106
|
onEvent: eventHandler,
|
|
109
107
|
manifest: serverManifest,
|
|
110
108
|
worker: server,
|
|
111
|
-
route,
|
|
109
|
+
route: info.route,
|
|
112
110
|
pagePath,
|
|
113
111
|
propsPath,
|
|
114
112
|
cssFiles: cssFilesResult.cssFiles ?? /* @__PURE__ */ new Map(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../../../plugin/react-server/server.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type { AutoDiscoveredFiles, ResolvedUserOptions } from \"../types.js\";\nimport { createEventHandler } from \"../helpers/createEventHandler.js\";\nimport { collectViteModuleGraphCss } from \"../helpers/collectViteModuleGraphCss.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport { createHandler } from \"../helpers/createHandler.js\";\nimport React from \"react\";\n\nexport async function configureReactServer({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n moduleBaseURL: _moduleBaseURL,\n moduleBasePath: _moduleBasePath,\n projectRoot: _projectRoot,\n ...handlerUserOptions\n } = _userOptions;\n\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../../../plugin/react-server/server.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type { AutoDiscoveredFiles, ResolvedUserOptions } from \"../types.js\";\nimport { createEventHandler } from \"../helpers/createEventHandler.js\";\nimport { collectViteModuleGraphCss } from \"../helpers/collectViteModuleGraphCss.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport { createHandler } from \"../helpers/createHandler.js\";\nimport React from \"react\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\n\nexport async function configureReactServer({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n moduleBaseURL: _moduleBaseURL,\n moduleBasePath: _moduleBasePath,\n projectRoot: _projectRoot,\n ...handlerUserOptions\n } = _userOptions;\n\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL: server.config.base,\n moduleBasePath: _moduleBasePath,\n projectRoot: server.config.root,\n });\n // Handle Vite server restarts\n server.ws.on(\"restart\", (path) => {\n server.config.logger.info(\n \"[vite-plugin-react-server] 🔧 Plugin changed, preparing for restart:\",\n path\n );\n\n // Close streams with restart message\n for (const res of activeStreams) {\n res.writeHead(503, {\n \"Content-Type\": \"text/x-component\",\n \"Retry-After\": \"1\",\n });\n res.end(`0:E{\"digest\":\"\",\"name\":\"Error\",\"message\":\"Server restarting...\",\"stack\":\"\",\"env\":\"Server\"}`);\n }\n activeStreams.clear();\n });\n\n server.middlewares.use(async (req, res, next) => {\n if(!req.url) {\n return next();\n }\n const info = requestInfo(req, handlerOptions, \"\");\n if (!info.isRscRequest) return next();\n try {\n if (!autoDiscoveredFiles.urlMap.has(info.route)) {\n return next();\n }\n const routeFiles = autoDiscoveredFiles.urlMap.get(info.route)!;\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n const port = server.config.server.port ?? 5173;\n const host = server.config.server.host ?? 'localhost';\n const protocol = server.config.server.https ? 'https' : 'http'; \n process.env['VITE_BASE_URL'] = `${server.config.base}${server.config.base.endsWith('/') ? '' : '/'}`;\n process.env['VITE_PUBLIC_ORIGIN'] = `${protocol}://${host}:${port}`;\n // first load the page and props\n const pageAndPropsResult = await resolvePageAndProps({\n pagePath,\n propsPath,\n route: info.route,\n loader: server.ssrLoadModule,\n pageExportName: handlerOptions.pageExportName ?? \"default\",\n propsExportName: handlerOptions.propsExportName ?? \"default\",\n });\n if (pageAndPropsResult.type === \"error\") {\n throw pageAndPropsResult.error;\n }\n if (pageAndPropsResult.type === \"skip\") {\n return next();\n }\n\n const eventHandler = createEventHandler(onEvent);\n const cssFilesResult = await collectViteModuleGraphCss({\n moduleGraph: server.moduleGraph, // by having loaded the page and props, we can get them from the module graph\n parentUrl: pagePath,\n handlerOptions: {\n pagePath,\n loader: server.ssrLoadModule,\n // explicitly set for development server\n ...handlerOptions,\n },\n });\n if (cssFilesResult.type === \"skip\") {\n return next();\n }\n if (cssFilesResult.type === \"error\") {\n throw cssFilesResult.error;\n }\n const { PageComponent, pageProps } = pageAndPropsResult;\n // Create the headless RSC stream directly;\n const rscResult = await createHandler({\n ...handlerOptions,\n PageComponent: PageComponent,\n pageProps: pageProps,\n logger: server.config.logger,\n loader: server.ssrLoadModule,\n Html: React.Fragment,\n onEvent: eventHandler,\n manifest: serverManifest,\n worker: server as any,\n route: info.route,\n pagePath,\n propsPath,\n cssFiles: cssFilesResult.cssFiles ?? new Map(),\n globalCss: new Map(),\n });\n if (rscResult.type === \"success\") {\n rscResult.stream!.pipe(res);\n }\n activeStreams.add(res);\n res.on(\"close\", () => {\n activeStreams.delete(res);\n });\n } catch (error) {\n res.end();\n }\n });\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectHtmlWorkerContent.js","sources":["../../../plugin/react-static/collectHtmlWorkerContent.ts"],"sourcesContent":["/**\n * rscHandler.ts\n *\n * PURPOSE: Handles collecting HTML content from the htmlCompact stream\n *\n * This module:\n * 1. Collects HTML content from the rscFull stream (which includes <html> and <body> tags)\n * 2. Returns the complete HTML content when the stream is done\n * 3. Provides a clean interface for HTML handling\n */\n\nimport { PassThrough, Transform } from \"node:stream\";\nimport type { CreateHandlerOptions, StreamMetrics } from \"../types.js\";\nimport { createStreamMetrics } from \"../helpers/metrics.js\";\nimport { createRscToHtmlStream } from \"./rscToHtmlStream.js\";\nimport { fileWriter } from \"./fileWriter.js\";\n\n/**\n * Collects RSC content from the rscFull stream\n *\n * @param rscFull The stream containing the RSC content\n * @returns A promise that resolves with the complete RSC content\n */\nexport async function collectHtmlWorkerContent(\n rscStream: PassThrough,\n handlerOptions: CreateHandlerOptions\n): Promise<{ stream: PassThrough; metrics: StreamMetrics }> {\n const metrics = createStreamMetrics();\n const startTime = performance.now();\n\n // Create RSC to HTML transform stream\n const rscToHtmlStream = createRscToHtmlStream({\n worker: handlerOptions.worker,\n route: handlerOptions.route,\n moduleRootPath: handlerOptions.moduleRootPath,\n moduleBaseURL: handlerOptions.moduleBaseURL,\n pipeableStreamOptions: handlerOptions.pipeableStreamOptions,\n build: handlerOptions.build,\n cssFiles: handlerOptions.cssFiles,\n projectRoot: handlerOptions.projectRoot,\n });\n\n // Create transform stream to handle HTML chunks and file writing\n const htmlTransform = new Transform({\n transform(chunk, _encoding, callback) {\n metrics.chunks++;\n callback(null, chunk);\n },\n flush(callback) {\n metrics.duration = performance.now() - startTime;\n callback();\n },\n });\n\n let isComplete = false;\n\n // Create a promise that resolves when the route is complete\n const routeComplete = new Promise<void>((resolve, reject) => {\n const messageHandler = (msg: any) => {\n switch (msg.type) {\n case \"HTML_CHUNK\":\n if (!isComplete) {\n htmlTransform.write(msg.chunk);\n }\n break;\n case \"HTML_COMPLETE\":\n isComplete = true;\n // End the transform stream\n htmlTransform.end();\n // Send cleanup message to worker\n handlerOptions.worker.postMessage({\n type: \"CLEANUP\",\n id: handlerOptions.route,\n });\n break;\n case \"CLEANUP_COMPLETE\":\n resolve();\n break;\n case \"ERROR\":\n handlerOptions.worker.removeListener(\"message\", messageHandler);\n reject(msg.error);\n break;\n }\n };\n handlerOptions.worker.on(\"message\", messageHandler);\n });\n\n try {\n // Set up event handler to capture content length\n if (handlerOptions.onEvent) {\n const originalOnEvent = handlerOptions.onEvent;\n handlerOptions.onEvent = (event) => {\n if (event.type === \"file.write.done\" && event.data.fileType === \"html\") {\n metrics.bytes = event.data.content.length;\n }\n originalOnEvent(event);\n };\n }\n\n // Pipe RSC through transform to HTML\n rscStream.pipe(rscToHtmlStream);\n\n // Set up file writing using fileWriter\n const writePromise = fileWriter(htmlTransform, \"html\", handlerOptions);\n\n // Wait for route to complete\n await routeComplete;\n\n // Wait for file writing to complete\n await writePromise;\n\n rscToHtmlStream.destroy();\n\n return { stream: rscStream, metrics };\n } catch (error) {\n // Clean up streams on error\n rscToHtmlStream.destroy();\n throw error;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"collectHtmlWorkerContent.js","sources":["../../../plugin/react-static/collectHtmlWorkerContent.ts"],"sourcesContent":["/**\n * rscHandler.ts\n *\n * PURPOSE: Handles collecting HTML content from the htmlCompact stream\n *\n * This module:\n * 1. Collects HTML content from the rscFull stream (which includes <html> and <body> tags)\n * 2. Returns the complete HTML content when the stream is done\n * 3. Provides a clean interface for HTML handling\n */\n\nimport { PassThrough, Transform } from \"node:stream\";\nimport type { CreateHandlerOptions, StreamMetrics } from \"../types.js\";\nimport { createStreamMetrics } from \"../helpers/metrics.js\";\nimport { createRscToHtmlStream } from \"./rscToHtmlStream.js\";\nimport { fileWriter } from \"./fileWriter.js\";\n\n/**\n * Collects RSC content from the rscFull stream\n *\n * @param rscFull The stream containing the RSC content\n * @returns A promise that resolves with the complete RSC content\n */\nexport async function collectHtmlWorkerContent(\n rscStream: PassThrough,\n handlerOptions: CreateHandlerOptions\n): Promise<{ stream: PassThrough; metrics: StreamMetrics }> {\n const metrics = createStreamMetrics();\n const startTime = performance.now();\n\n // Create RSC to HTML transform stream\n const rscToHtmlStream = createRscToHtmlStream({\n worker: handlerOptions.worker,\n route: handlerOptions.route,\n moduleRootPath: handlerOptions.moduleRootPath,\n moduleBaseURL: handlerOptions.moduleBaseURL,\n pipeableStreamOptions: handlerOptions.pipeableStreamOptions,\n build: handlerOptions.build,\n cssFiles: handlerOptions.cssFiles,\n projectRoot: handlerOptions.projectRoot,\n });\n\n // Create transform stream to handle HTML chunks and file writing\n const htmlTransform = new Transform({\n transform(chunk, _encoding, callback) {\n metrics.chunks++;\n callback(null, chunk);\n },\n flush(callback) {\n metrics.duration = performance.now() - startTime;\n callback();\n },\n });\n\n let isComplete = false;\n\n // Create a promise that resolves when the route is complete\n const routeComplete = new Promise<void>((resolve, reject) => {\n const messageHandler = (msg: any) => {\n switch (msg.type) {\n case \"HTML_CHUNK\":\n if (!isComplete) {\n htmlTransform.write(msg.chunk);\n }\n break;\n case \"HTML_COMPLETE\":\n isComplete = true;\n // End the transform stream\n htmlTransform.end();\n // Send cleanup message to worker\n handlerOptions.worker.postMessage({\n type: \"CLEANUP\",\n id: handlerOptions.route,\n });\n break;\n case \"CLEANUP_COMPLETE\":\n resolve();\n break;\n case \"ERROR\":\n handlerOptions.worker.removeListener(\"message\", messageHandler);\n reject(msg.error);\n break;\n }\n };\n handlerOptions.worker.on(\"message\", messageHandler);\n });\n\n try {\n // Set up event handler to capture content length\n if (handlerOptions.onEvent) {\n const originalOnEvent = handlerOptions.onEvent;\n handlerOptions.onEvent = (event) => {\n if (event.type === \"file.write.done\" && event.data.fileType === \"html\") {\n metrics.bytes = event.data.content.length;\n }\n originalOnEvent(event);\n };\n }\n\n // Pipe RSC through transform to HTML\n rscStream.pipe(rscToHtmlStream);\n\n // Set up file writing using fileWriter\n const writePromise = fileWriter(htmlTransform, \"html\", handlerOptions);\n\n // Wait for route to complete\n await routeComplete;\n\n // Wait for file writing to complete\n await writePromise;\n\n rscToHtmlStream.destroy();\n\n return { stream: rscStream, metrics };\n } catch (error) {\n // Clean up streams on error\n rscToHtmlStream.destroy();\n throw error;\n }\n}\n"],"names":[],"mappings":"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"}
|