vite-plugin-react-server 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +48 -313
  2. package/dist/package.json +123 -13
  3. package/dist/plugin/bundle/deferredStaticGeneration.js +14 -39
  4. package/dist/plugin/bundle/manifests.js +30 -48
  5. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
  6. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +4 -1
  7. package/dist/plugin/config/envPrefixFromConfig.js +12 -7
  8. package/dist/plugin/config/getCondition.d.ts.map +1 -1
  9. package/dist/plugin/config/getCondition.js +7 -5
  10. package/dist/plugin/dev-server/virtualRscHmrPlugin.js +23 -23
  11. package/dist/plugin/environments/createBuildEventPlugin.js +88 -98
  12. package/dist/plugin/environments/createEnvironmentPlugin.js +222 -250
  13. package/dist/plugin/helpers/createRscRenderHelpers.js +33 -34
  14. package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -1
  15. package/dist/plugin/helpers/createSharedLoader.js +4 -2
  16. package/dist/plugin/helpers/headlessStreamReuseHandler.js +30 -22
  17. package/dist/plugin/helpers/headlessStreamState.js +15 -28
  18. package/dist/plugin/helpers/resolveComponent.d.ts.map +1 -1
  19. package/dist/plugin/helpers/resolveComponent.js +4 -2
  20. package/dist/plugin/index.client.d.ts +5 -0
  21. package/dist/plugin/index.client.d.ts.map +1 -0
  22. package/dist/plugin/index.client.js +4 -0
  23. package/dist/plugin/index.d.ts +4 -3
  24. package/dist/plugin/index.d.ts.map +1 -1
  25. package/dist/plugin/index.js +10 -5
  26. package/dist/plugin/index.server.d.ts +5 -0
  27. package/dist/plugin/index.server.d.ts.map +1 -0
  28. package/dist/plugin/index.server.js +4 -0
  29. package/dist/plugin/metrics/createWorkerStartupMetrics.js +31 -13
  30. package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +41 -38
  31. package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +43 -46
  32. package/dist/plugin/plugin.client.js +2 -2
  33. package/dist/plugin/plugin.server.js +2 -2
  34. package/dist/plugin/react-static/createBuildLoader.client.js +12 -6
  35. package/dist/plugin/react-static/createBuildLoader.server.js +255 -235
  36. package/dist/plugin/react-static/plugin.client.js +684 -770
  37. package/dist/plugin/react-static/plugin.server.js +517 -603
  38. package/dist/plugin/react-static/processCssFilesForPages.js +103 -88
  39. package/dist/plugin/react-static/renderPage.client.js +455 -529
  40. package/dist/plugin/react-static/renderPage.server.js +485 -508
  41. package/dist/plugin/react-static/renderPagesBatched.js +277 -275
  42. package/dist/plugin/react-static/rscToHtmlStream.client.js +48 -29
  43. package/dist/plugin/react-static/rscToHtmlStream.server.js +62 -37
  44. package/dist/plugin/react-static/temporaryReferences.server.js +11 -2
  45. package/dist/plugin/stream/createMainThreadHandlers.js +40 -31
  46. package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -1
  47. package/dist/plugin/stream/renderRscStream.server.js +127 -144
  48. package/dist/plugin/transformer/createTransformerPlugin.js +226 -265
  49. package/dist/plugin/utils/checkReactVersion.d.ts +7 -0
  50. package/dist/plugin/utils/checkReactVersion.d.ts.map +1 -0
  51. package/dist/plugin/utils/checkReactVersion.js +23 -0
  52. package/dist/plugin/utils/envUrls.node.js +12 -11
  53. package/dist/plugin/vendor/vendor-alias.js +84 -114
  54. package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
  55. package/dist/plugin/vendor/vendor.client.js +1 -3
  56. package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -1
  57. package/dist/plugin/worker/rsc/handleRscRender.js +3 -1
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +123 -13
  60. package/plugin/config/autoDiscover/resolveAutoDiscover.ts +4 -0
  61. package/plugin/config/getCondition.ts +6 -4
  62. package/plugin/helpers/createRscRenderHelpers.ts +1 -1
  63. package/plugin/helpers/createSharedLoader.ts +6 -1
  64. package/plugin/helpers/resolveComponent.ts +6 -1
  65. package/plugin/index.client.ts +4 -0
  66. package/plugin/index.server.ts +4 -0
  67. package/plugin/index.ts +12 -5
  68. package/plugin/plugin.client.ts +1 -1
  69. package/plugin/plugin.server.ts +1 -1
  70. package/plugin/stream/renderRscStream.server.ts +3 -0
  71. package/plugin/utils/checkReactVersion.ts +28 -0
  72. package/plugin/vendor/vendor.client.ts +0 -2
  73. package/plugin/worker/rsc/handleRscRender.ts +2 -0
  74. package/scripts/generate-toc.mjs +27 -294
@@ -1,32 +1,51 @@
1
- import { createHtmlStream } from "../stream/createHtmlStream.client.js";
2
- export const createRscToHtmlStream = function _createRscToHtmlStream(options) {
3
- const { route, verbose, signal, logger, rscStream,
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { createHtmlStream } from '../stream/createHtmlStream.client.js';
7
+
8
+ const createRscToHtmlStream = function _createRscToHtmlStream(options) {
9
+ const {
10
+ route,
11
+ verbose,
12
+ signal,
13
+ logger,
14
+ rscStream,
4
15
  // Only pass the props the HTML stream actually needs
5
- moduleRootPath, moduleBasePath, moduleBaseURL, clientPipeableStreamOptions, ...otherOptions } = options;
6
- if (verbose) {
7
- logger?.info(`[createRscToHtmlStream:${route}] Creating RSC to HTML transform stream (client-side, using createHtmlStream)`);
8
- }
9
- // Use the existing client-side createHtmlStream which handles RSC to HTML conversion
10
- const htmlStream = createHtmlStream({
11
- route,
12
- rscStream,
13
- logger,
14
- verbose,
15
- // Only pass the essential props
16
- moduleRootPath,
17
- moduleBasePath,
18
- moduleBaseURL,
19
- clientPipeableStreamOptions,
20
- ...otherOptions,
16
+ moduleRootPath,
17
+ moduleBasePath,
18
+ moduleBaseURL,
19
+ clientPipeableStreamOptions,
20
+ ...otherOptions
21
+ } = options;
22
+ if (verbose) {
23
+ logger?.info(
24
+ `[createRscToHtmlStream:${route}] Creating RSC to HTML transform stream (client-side, using createHtmlStream)`
25
+ );
26
+ }
27
+ const htmlStream = createHtmlStream({
28
+ route,
29
+ rscStream,
30
+ logger,
31
+ verbose,
32
+ // Only pass the essential props
33
+ moduleRootPath,
34
+ moduleBasePath,
35
+ moduleBaseURL,
36
+ clientPipeableStreamOptions,
37
+ ...otherOptions
38
+ });
39
+ if (signal) {
40
+ signal.addEventListener("abort", () => {
41
+ if (verbose) {
42
+ logger?.info(`[createRscToHtmlStream:${route}] Abort signal received`);
43
+ }
44
+ htmlStream.abort();
21
45
  });
22
- // Handle abort signal
23
- if (signal) {
24
- signal.addEventListener("abort", () => {
25
- if (verbose) {
26
- logger?.info(`[createRscToHtmlStream:${route}] Abort signal received`);
27
- }
28
- htmlStream.abort();
29
- });
30
- }
31
- return htmlStream;
46
+ }
47
+ return htmlStream;
32
48
  };
49
+
50
+ export { createRscToHtmlStream };
51
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNjVG9IdG1sU3RyZWFtLmNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3JlYWN0LXN0YXRpYy9yc2NUb0h0bWxTdHJlYW0uY2xpZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcnNjVG9IdG1sU3RyZWFtLmNsaWVudC50c1xuICpcbiAqIFBVUlBPU0U6IFRyYW5zZm9ybXMgUlNDIHN0cmVhbSB0byBIVE1MIHN0cmVhbSBvbiBjbGllbnQgc2lkZVxuICogXG4gKiBUaGlzIGZvbGxvd3MgdGhlIGNsaWVudC1zaWRlIHBhdHRlcm4gd2hlcmUgdGhlIG1haW4gdGhyZWFkIHJ1bnMgUmVhY3QgQ2xpZW50IENvbXBvbmVudHM6XG4gKiBcbiAqIENsaWVudC1zaWRlIHBhdHRlcm46IFJTQyBjaHVua3Mg4oaSIE1haW4gdGhyZWFkIEhUTUwgY29udmVyc2lvbiAobWFpbiB0aHJlYWQgaXMgdGhlIEhUTUwgd29ya2VyKVxuICovXG5pbXBvcnQgdHlwZSB7IFJzY1RvSHRtbFN0cmVhbUZuIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUh0bWxTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtL2NyZWF0ZUh0bWxTdHJlYW0uY2xpZW50LmpzXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSc2NUb0h0bWxTdHJlYW06IFJzY1RvSHRtbFN0cmVhbUZuID0gZnVuY3Rpb24gX2NyZWF0ZVJzY1RvSHRtbFN0cmVhbShcbiAgb3B0aW9uc1xuKSB7XG4gIGNvbnN0IHtcbiAgICByb3V0ZSxcbiAgICB2ZXJib3NlLFxuICAgIHNpZ25hbCxcbiAgICBsb2dnZXIsXG4gICAgcnNjU3RyZWFtLFxuICAgIC8vIE9ubHkgcGFzcyB0aGUgcHJvcHMgdGhlIEhUTUwgc3RyZWFtIGFjdHVhbGx5IG5lZWRzXG4gICAgbW9kdWxlUm9vdFBhdGgsXG4gICAgbW9kdWxlQmFzZVBhdGgsXG4gICAgbW9kdWxlQmFzZVVSTCxcbiAgICBjbGllbnRQaXBlYWJsZVN0cmVhbU9wdGlvbnMsXG4gICAgLi4ub3RoZXJPcHRpb25zXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgYFtjcmVhdGVSc2NUb0h0bWxTdHJlYW06JHtyb3V0ZX1dIENyZWF0aW5nIFJTQyB0byBIVE1MIHRyYW5zZm9ybSBzdHJlYW0gKGNsaWVudC1zaWRlLCB1c2luZyBjcmVhdGVIdG1sU3RyZWFtKWBcbiAgICApO1xuICB9XG5cbiAgLy8gVXNlIHRoZSBleGlzdGluZyBjbGllbnQtc2lkZSBjcmVhdGVIdG1sU3RyZWFtIHdoaWNoIGhhbmRsZXMgUlNDIHRvIEhUTUwgY29udmVyc2lvblxuICBjb25zdCBodG1sU3RyZWFtID0gY3JlYXRlSHRtbFN0cmVhbSh7XG4gICAgcm91dGUsXG4gICAgcnNjU3RyZWFtLFxuICAgIGxvZ2dlcixcbiAgICB2ZXJib3NlLFxuICAgIC8vIE9ubHkgcGFzcyB0aGUgZXNzZW50aWFsIHByb3BzXG4gICAgbW9kdWxlUm9vdFBhdGgsXG4gICAgbW9kdWxlQmFzZVBhdGgsXG4gICAgbW9kdWxlQmFzZVVSTCxcbiAgICBjbGllbnRQaXBlYWJsZVN0cmVhbU9wdGlvbnMsXG4gICAgLi4ub3RoZXJPcHRpb25zLFxuICB9KTtcblxuICAvLyBIYW5kbGUgYWJvcnQgc2lnbmFsXG4gIGlmIChzaWduYWwpIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uaW5mbyhgW2NyZWF0ZVJzY1RvSHRtbFN0cmVhbToke3JvdXRlfV0gQWJvcnQgc2lnbmFsIHJlY2VpdmVkYCk7XG4gICAgICB9XG4gICAgICBodG1sU3RyZWFtLmFib3J0KCk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gaHRtbFN0cmVhbTtcbn07Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFZYSxNQUFBLHFCQUFBLEdBQTJDLFNBQVMsc0JBQUEsQ0FDL0QsT0FDQSxFQUFBO0FBQ0EsRUFBTSxNQUFBO0FBQUEsSUFDSixLQUFBO0FBQUEsSUFDQSxPQUFBO0FBQUEsSUFDQSxNQUFBO0FBQUEsSUFDQSxNQUFBO0FBQUEsSUFDQSxTQUFBO0FBQUE7QUFBQSxJQUVBLGNBQUE7QUFBQSxJQUNBLGNBQUE7QUFBQSxJQUNBLGFBQUE7QUFBQSxJQUNBLDJCQUFBO0FBQUEsSUFDQSxHQUFHO0FBQUEsR0FDRCxHQUFBLE9BQUE7QUFFSixFQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsSUFBUSxNQUFBLEVBQUEsSUFBQTtBQUFBLE1BQ04sMEJBQTBCLEtBQUssQ0FBQSw2RUFBQTtBQUFBLEtBQ2pDO0FBQUE7QUFJRixFQUFBLE1BQU0sYUFBYSxnQkFBaUIsQ0FBQTtBQUFBLElBQ2xDLEtBQUE7QUFBQSxJQUNBLFNBQUE7QUFBQSxJQUNBLE1BQUE7QUFBQSxJQUNBLE9BQUE7QUFBQTtBQUFBLElBRUEsY0FBQTtBQUFBLElBQ0EsY0FBQTtBQUFBLElBQ0EsYUFBQTtBQUFBLElBQ0EsMkJBQUE7QUFBQSxJQUNBLEdBQUc7QUFBQSxHQUNKLENBQUE7QUFHRCxFQUFBLElBQUksTUFBUSxFQUFBO0FBQ1YsSUFBTyxNQUFBLENBQUEsZ0JBQUEsQ0FBaUIsU0FBUyxNQUFNO0FBQ3JDLE1BQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxRQUFRLE1BQUEsRUFBQSxJQUFBLENBQUssQ0FBMEIsdUJBQUEsRUFBQSxLQUFLLENBQXlCLHVCQUFBLENBQUEsQ0FBQTtBQUFBO0FBRXZFLE1BQUEsVUFBQSxDQUFXLEtBQU0sRUFBQTtBQUFBLEtBQ2xCLENBQUE7QUFBQTtBQUdILEVBQU8sT0FBQSxVQUFBO0FBQ1Q7Ozs7In0=
@@ -1,39 +1,64 @@
1
- import { createHtmlStream } from "../stream/createHtmlStream.server.js";
2
- export const createRscToHtmlStream = function _createRscToHtmlStream(options) {
3
- const { id, worker, htmlWorker, route, url, moduleBasePath, moduleBaseURL, moduleRootPath, projectRoot, verbose, panicThreshold, clientPipeableStreamOptions, signal, logger, build, } = options;
4
- if (!worker) {
5
- throw new Error("HTML worker is required for RSC to HTML stream");
6
- }
7
- if (verbose) {
8
- logger?.info(`[createRscToHtmlStream:${route}] Creating RSC to HTML transform stream`);
9
- }
10
- // Use createHtmlStream which works correctly with the HTML worker
11
- const htmlStream = createHtmlStream({
12
- id,
13
- url,
14
- route,
15
- rscStream: options.rscStream,
16
- htmlWorker: htmlWorker || worker,
17
- logger,
18
- verbose,
19
- moduleRootPath,
20
- moduleBasePath,
21
- moduleBaseURL,
22
- projectRoot,
23
- panicThreshold,
24
- clientPipeableStreamOptions,
25
- build,
26
- onMetrics: options.onMetrics,
27
- onError: options.onError,
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { createHtmlStream } from '../stream/createHtmlStream.server.js';
7
+
8
+ const createRscToHtmlStream = function _createRscToHtmlStream(options) {
9
+ const {
10
+ id,
11
+ worker,
12
+ htmlWorker,
13
+ route,
14
+ url,
15
+ moduleBasePath,
16
+ moduleBaseURL,
17
+ moduleRootPath,
18
+ projectRoot,
19
+ verbose,
20
+ panicThreshold,
21
+ clientPipeableStreamOptions,
22
+ signal,
23
+ logger,
24
+ build
25
+ } = options;
26
+ if (!worker) {
27
+ throw new Error("HTML worker is required for RSC to HTML stream");
28
+ }
29
+ if (verbose) {
30
+ logger?.info(
31
+ `[createRscToHtmlStream:${route}] Creating RSC to HTML transform stream`
32
+ );
33
+ }
34
+ const htmlStream = createHtmlStream({
35
+ id,
36
+ url,
37
+ route,
38
+ rscStream: options.rscStream,
39
+ htmlWorker: htmlWorker || worker,
40
+ logger,
41
+ verbose,
42
+ moduleRootPath,
43
+ moduleBasePath,
44
+ moduleBaseURL,
45
+ projectRoot,
46
+ panicThreshold,
47
+ clientPipeableStreamOptions,
48
+ build,
49
+ onMetrics: options.onMetrics,
50
+ onError: options.onError
51
+ });
52
+ if (signal) {
53
+ signal.addEventListener("abort", () => {
54
+ if (verbose) {
55
+ logger?.info(`[createRscToHtmlStream:${route}] Abort signal received`);
56
+ }
57
+ htmlStream.abort();
28
58
  });
29
- // Handle abort signal
30
- if (signal) {
31
- signal.addEventListener("abort", () => {
32
- if (verbose) {
33
- logger?.info(`[createRscToHtmlStream:${route}] Abort signal received`);
34
- }
35
- htmlStream.abort();
36
- });
37
- }
38
- return htmlStream;
59
+ }
60
+ return htmlStream;
39
61
  };
62
+
63
+ export { createRscToHtmlStream };
64
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNjVG9IdG1sU3RyZWFtLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3JlYWN0LXN0YXRpYy9yc2NUb0h0bWxTdHJlYW0uc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnNjVG9IdG1sU3RyZWFtRm4gfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlSHRtbFN0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW0vY3JlYXRlSHRtbFN0cmVhbS5zZXJ2ZXIuanNcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJzY1RvSHRtbFN0cmVhbTogUnNjVG9IdG1sU3RyZWFtRm4gPSBmdW5jdGlvbiBfY3JlYXRlUnNjVG9IdG1sU3RyZWFtKFxuICBvcHRpb25zXG4pIHtcbiAgY29uc3Qge1xuICAgIGlkLFxuICAgIHdvcmtlcixcbiAgICBodG1sV29ya2VyLFxuICAgIHJvdXRlLFxuICAgIHVybCxcbiAgICBtb2R1bGVCYXNlUGF0aCxcbiAgICBtb2R1bGVCYXNlVVJMLFxuICAgIG1vZHVsZVJvb3RQYXRoLFxuICAgIHByb2plY3RSb290LFxuICAgIHZlcmJvc2UsXG4gICAgcGFuaWNUaHJlc2hvbGQsXG4gICAgY2xpZW50UGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIHNpZ25hbCxcbiAgICBsb2dnZXIsXG4gICAgYnVpbGQsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICghd29ya2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSFRNTCB3b3JrZXIgaXMgcmVxdWlyZWQgZm9yIFJTQyB0byBIVE1MIHN0cmVhbVwiKTtcbiAgfVxuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgYFtjcmVhdGVSc2NUb0h0bWxTdHJlYW06JHtyb3V0ZX1dIENyZWF0aW5nIFJTQyB0byBIVE1MIHRyYW5zZm9ybSBzdHJlYW1gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVzZSBjcmVhdGVIdG1sU3RyZWFtIHdoaWNoIHdvcmtzIGNvcnJlY3RseSB3aXRoIHRoZSBIVE1MIHdvcmtlclxuICBjb25zdCBodG1sU3RyZWFtID0gY3JlYXRlSHRtbFN0cmVhbSh7XG4gICAgaWQsXG4gICAgdXJsLFxuICAgIHJvdXRlLFxuICAgIHJzY1N0cmVhbTogb3B0aW9ucy5yc2NTdHJlYW0sXG4gICAgaHRtbFdvcmtlcjogaHRtbFdvcmtlciB8fCB3b3JrZXIsXG4gICAgbG9nZ2VyLFxuICAgIHZlcmJvc2UsXG4gICAgbW9kdWxlUm9vdFBhdGgsXG4gICAgbW9kdWxlQmFzZVBhdGgsXG4gICAgbW9kdWxlQmFzZVVSTCxcbiAgICBwcm9qZWN0Um9vdCxcbiAgICBwYW5pY1RocmVzaG9sZCxcbiAgICBjbGllbnRQaXBlYWJsZVN0cmVhbU9wdGlvbnMsXG4gICAgYnVpbGQsXG4gICAgb25NZXRyaWNzOiBvcHRpb25zLm9uTWV0cmljcyxcbiAgICBvbkVycm9yOiBvcHRpb25zLm9uRXJyb3IsXG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBhYm9ydCBzaWduYWxcbiAgaWYgKHNpZ25hbCkge1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKGBbY3JlYXRlUnNjVG9IdG1sU3RyZWFtOiR7cm91dGV9XSBBYm9ydCBzaWduYWwgcmVjZWl2ZWRgKTtcbiAgICAgIH1cbiAgICAgIGh0bWxTdHJlYW0uYWJvcnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBodG1sU3RyZWFtO1xufTsiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdhLE1BQUEscUJBQUEsR0FBMkMsU0FBUyxzQkFBQSxDQUMvRCxPQUNBLEVBQUE7QUFDQSxFQUFNLE1BQUE7QUFBQSxJQUNKLEVBQUE7QUFBQSxJQUNBLE1BQUE7QUFBQSxJQUNBLFVBQUE7QUFBQSxJQUNBLEtBQUE7QUFBQSxJQUNBLEdBQUE7QUFBQSxJQUNBLGNBQUE7QUFBQSxJQUNBLGFBQUE7QUFBQSxJQUNBLGNBQUE7QUFBQSxJQUNBLFdBQUE7QUFBQSxJQUNBLE9BQUE7QUFBQSxJQUNBLGNBQUE7QUFBQSxJQUNBLDJCQUFBO0FBQUEsSUFDQSxNQUFBO0FBQUEsSUFDQSxNQUFBO0FBQUEsSUFDQTtBQUFBLEdBQ0UsR0FBQSxPQUFBO0FBRUosRUFBQSxJQUFJLENBQUMsTUFBUSxFQUFBO0FBQ1gsSUFBTSxNQUFBLElBQUksTUFBTSxnREFBZ0QsQ0FBQTtBQUFBO0FBR2xFLEVBQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxJQUFRLE1BQUEsRUFBQSxJQUFBO0FBQUEsTUFDTiwwQkFBMEIsS0FBSyxDQUFBLHVDQUFBO0FBQUEsS0FDakM7QUFBQTtBQUlGLEVBQUEsTUFBTSxhQUFhLGdCQUFpQixDQUFBO0FBQUEsSUFDbEMsRUFBQTtBQUFBLElBQ0EsR0FBQTtBQUFBLElBQ0EsS0FBQTtBQUFBLElBQ0EsV0FBVyxPQUFRLENBQUEsU0FBQTtBQUFBLElBQ25CLFlBQVksVUFBYyxJQUFBLE1BQUE7QUFBQSxJQUMxQixNQUFBO0FBQUEsSUFDQSxPQUFBO0FBQUEsSUFDQSxjQUFBO0FBQUEsSUFDQSxjQUFBO0FBQUEsSUFDQSxhQUFBO0FBQUEsSUFDQSxXQUFBO0FBQUEsSUFDQSxjQUFBO0FBQUEsSUFDQSwyQkFBQTtBQUFBLElBQ0EsS0FBQTtBQUFBLElBQ0EsV0FBVyxPQUFRLENBQUEsU0FBQTtBQUFBLElBQ25CLFNBQVMsT0FBUSxDQUFBO0FBQUEsR0FDbEIsQ0FBQTtBQUdELEVBQUEsSUFBSSxNQUFRLEVBQUE7QUFDVixJQUFPLE1BQUEsQ0FBQSxnQkFBQSxDQUFpQixTQUFTLE1BQU07QUFDckMsTUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNYLFFBQVEsTUFBQSxFQUFBLElBQUEsQ0FBSyxDQUEwQix1QkFBQSxFQUFBLEtBQUssQ0FBeUIsdUJBQUEsQ0FBQSxDQUFBO0FBQUE7QUFFdkUsTUFBQSxVQUFBLENBQVcsS0FBTSxFQUFBO0FBQUEsS0FDbEIsQ0FBQTtBQUFBO0FBR0gsRUFBTyxPQUFBLFVBQUE7QUFDVDs7OzsifQ==
@@ -1,3 +1,12 @@
1
- import { ReactDOMServer } from "../vendor/vendor.server.js";
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { ReactDOMServer } from '../vendor/vendor.server.js';
7
+
2
8
  const { createTemporaryReferenceSet } = ReactDOMServer;
3
- export const temporaryReferences = createTemporaryReferenceSet();
9
+ const temporaryReferences = createTemporaryReferenceSet();
10
+
11
+ export { temporaryReferences };
12
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG9yYXJ5UmVmZXJlbmNlcy5zZXJ2ZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9yZWFjdC1zdGF0aWMvdGVtcG9yYXJ5UmVmZXJlbmNlcy5zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhY3RET01TZXJ2ZXIgfSBmcm9tIFwiLi4vdmVuZG9yL3ZlbmRvci5zZXJ2ZXIuanNcIjtcblxuY29uc3QgeyBjcmVhdGVUZW1wb3JhcnlSZWZlcmVuY2VTZXQgfSA9IFJlYWN0RE9NU2VydmVyO1xuXG5leHBvcnQgY29uc3QgdGVtcG9yYXJ5UmVmZXJlbmNlcyA9IGNyZWF0ZVRlbXBvcmFyeVJlZmVyZW5jZVNldCgpO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQSxNQUFNLEVBQUUsNkJBQWdDLEdBQUEsY0FBQTtBQUVqQyxNQUFNLHNCQUFzQiwyQkFBNEI7Ozs7In0=
@@ -1,32 +1,41 @@
1
- import { handleError } from "../error/handleError.js";
2
- export function createMainThreadHandlers(handlerOptions, onError) {
3
- return {
4
- onError: (_id, error, context) => {
5
- if (handlerOptions.verbose) {
6
- handlerOptions.logger?.info(`[createMainThreadHandlers] onError called for route ${handlerOptions.route}: ${error}`);
7
- }
8
- const originalError = error instanceof Error ? error : new Error(String(error ?? "Unknown error"));
9
- const panicError = handleError({
10
- error: originalError,
11
- critical: false,
12
- logger: handlerOptions.logger,
13
- panicThreshold: handlerOptions.panicThreshold,
14
- context: `${context?.context || "Unknown"} for route ${handlerOptions.route}`,
15
- });
16
- if (handlerOptions.verbose) {
17
- handlerOptions.logger?.info(`[createMainThreadHandlers] Calling onError callback for route ${handlerOptions.route} with panicError: ${!!panicError}`);
18
- }
19
- // Call the callback with the error and panic status
20
- onError?.(panicError || originalError, !!panicError);
21
- },
22
- onData: (_id, _data) => {
23
- // No-op for main thread
24
- },
25
- onEnd: (_id) => {
26
- // No-op for main thread
27
- },
28
- onPostpone: (_id, _reason) => {
29
- // No-op for main thread
30
- },
31
- };
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { handleError } from '../error/handleError.js';
7
+
8
+ function createMainThreadHandlers(handlerOptions, onError) {
9
+ return {
10
+ onError: (_id, error, context) => {
11
+ if (handlerOptions.verbose) {
12
+ handlerOptions.logger?.info(
13
+ `[createMainThreadHandlers] onError called for route ${handlerOptions.route}: ${error}`
14
+ );
15
+ }
16
+ const originalError = error instanceof Error ? error : new Error(String(error ?? "Unknown error"));
17
+ const panicError = handleError({
18
+ error: originalError,
19
+ critical: false,
20
+ logger: handlerOptions.logger,
21
+ panicThreshold: handlerOptions.panicThreshold,
22
+ context: `${context?.context || "Unknown"} for route ${handlerOptions.route}`
23
+ });
24
+ if (handlerOptions.verbose) {
25
+ handlerOptions.logger?.info(
26
+ `[createMainThreadHandlers] Calling onError callback for route ${handlerOptions.route} with panicError: ${!!panicError}`
27
+ );
28
+ }
29
+ onError?.(panicError || originalError, !!panicError);
30
+ },
31
+ onData: (_id, _data) => {
32
+ },
33
+ onEnd: (_id) => {
34
+ },
35
+ onPostpone: (_id, _reason) => {
36
+ }
37
+ };
32
38
  }
39
+
40
+ export { createMainThreadHandlers };
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlTWFpblRocmVhZEhhbmRsZXJzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vc3RyZWFtL2NyZWF0ZU1haW5UaHJlYWRIYW5kbGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENyZWF0ZUhhbmRsZXJPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gXCIuLi9lcnJvci9oYW5kbGVFcnJvci5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWFpblRocmVhZEhhbmRsZXJzKFxuICBoYW5kbGVyT3B0aW9uczogQ3JlYXRlSGFuZGxlck9wdGlvbnMsXG4gIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBpc1BhbmljOiBib29sZWFuKSA9PiB2b2lkXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBvbkVycm9yOiAoX2lkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duLCBjb250ZXh0PzogeyByb3V0ZT86IHN0cmluZzsgY29udGV4dD86IHN0cmluZyB9KSA9PiB7XG4gICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgYFtjcmVhdGVNYWluVGhyZWFkSGFuZGxlcnNdIG9uRXJyb3IgY2FsbGVkIGZvciByb3V0ZSAke2hhbmRsZXJPcHRpb25zLnJvdXRlfTogJHtlcnJvcn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yID8/IFwiVW5rbm93biBlcnJvclwiKSk7XG4gICAgICBjb25zdCBwYW5pY0Vycm9yID0gaGFuZGxlRXJyb3Ioe1xuICAgICAgICBlcnJvcjogb3JpZ2luYWxFcnJvcixcbiAgICAgICAgY3JpdGljYWw6IGZhbHNlLFxuICAgICAgICBsb2dnZXI6IGhhbmRsZXJPcHRpb25zLmxvZ2dlcixcbiAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IGhhbmRsZXJPcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgICAgICBjb250ZXh0OiBgJHtjb250ZXh0Py5jb250ZXh0IHx8IFwiVW5rbm93blwifSBmb3Igcm91dGUgJHtoYW5kbGVyT3B0aW9ucy5yb3V0ZX1gLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICBgW2NyZWF0ZU1haW5UaHJlYWRIYW5kbGVyc10gQ2FsbGluZyBvbkVycm9yIGNhbGxiYWNrIGZvciByb3V0ZSAke2hhbmRsZXJPcHRpb25zLnJvdXRlfSB3aXRoIHBhbmljRXJyb3I6ICR7ISFwYW5pY0Vycm9yfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2FsbCB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgZXJyb3IgYW5kIHBhbmljIHN0YXR1c1xuICAgICAgb25FcnJvcj8uKHBhbmljRXJyb3IgfHwgb3JpZ2luYWxFcnJvciwgISFwYW5pY0Vycm9yKTtcbiAgICB9LFxuICAgIG9uRGF0YTogKF9pZDogc3RyaW5nLCBfZGF0YTogVWludDhBcnJheSkgPT4ge1xuICAgICAgLy8gTm8tb3AgZm9yIG1haW4gdGhyZWFkXG4gICAgfSxcbiAgICBvbkVuZDogKF9pZDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBOby1vcCBmb3IgbWFpbiB0aHJlYWRcbiAgICB9LFxuICAgIG9uUG9zdHBvbmU6IChfaWQ6IHN0cmluZywgX3JlYXNvbjogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBOby1vcCBmb3IgbWFpbiB0aHJlYWRcbiAgICB9LFxuICB9O1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHTyxTQUFTLHdCQUFBLENBQ2QsZ0JBQ0EsT0FDQSxFQUFBO0FBQ0EsRUFBTyxPQUFBO0FBQUEsSUFDTCxPQUFTLEVBQUEsQ0FBQyxHQUFhLEVBQUEsS0FBQSxFQUFnQixPQUFtRCxLQUFBO0FBQ3hGLE1BQUEsSUFBSSxlQUFlLE9BQVMsRUFBQTtBQUMxQixRQUFBLGNBQUEsQ0FBZSxNQUFRLEVBQUEsSUFBQTtBQUFBLFVBQ3JCLENBQXVELG9EQUFBLEVBQUEsY0FBQSxDQUFlLEtBQUssQ0FBQSxFQUFBLEVBQUssS0FBSyxDQUFBO0FBQUEsU0FDdkY7QUFBQTtBQUdGLE1BQU0sTUFBQSxhQUFBLEdBQWdCLGlCQUFpQixLQUFRLEdBQUEsS0FBQSxHQUFRLElBQUksS0FBTSxDQUFBLE1BQUEsQ0FBTyxLQUFTLElBQUEsZUFBZSxDQUFDLENBQUE7QUFDakcsTUFBQSxNQUFNLGFBQWEsV0FBWSxDQUFBO0FBQUEsUUFDN0IsS0FBTyxFQUFBLGFBQUE7QUFBQSxRQUNQLFFBQVUsRUFBQSxLQUFBO0FBQUEsUUFDVixRQUFRLGNBQWUsQ0FBQSxNQUFBO0FBQUEsUUFDdkIsZ0JBQWdCLGNBQWUsQ0FBQSxjQUFBO0FBQUEsUUFDL0IsU0FBUyxDQUFHLEVBQUEsT0FBQSxFQUFTLFdBQVcsU0FBUyxDQUFBLFdBQUEsRUFBYyxlQUFlLEtBQUssQ0FBQTtBQUFBLE9BQzVFLENBQUE7QUFFRCxNQUFBLElBQUksZUFBZSxPQUFTLEVBQUE7QUFDMUIsUUFBQSxjQUFBLENBQWUsTUFBUSxFQUFBLElBQUE7QUFBQSxVQUNyQixpRUFBaUUsY0FBZSxDQUFBLEtBQUssQ0FBcUIsa0JBQUEsRUFBQSxDQUFDLENBQUMsVUFBVSxDQUFBO0FBQUEsU0FDeEg7QUFBQTtBQUlGLE1BQUEsT0FBQSxHQUFVLFVBQWMsSUFBQSxhQUFBLEVBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtBQUFBLEtBQ3JEO0FBQUEsSUFDQSxNQUFBLEVBQVEsQ0FBQyxHQUFBLEVBQWEsS0FBc0IsS0FBQTtBQUFBLEtBRTVDO0FBQUEsSUFDQSxLQUFBLEVBQU8sQ0FBQyxHQUFnQixLQUFBO0FBQUEsS0FFeEI7QUFBQSxJQUNBLFVBQUEsRUFBWSxDQUFDLEdBQUEsRUFBYSxPQUFvQixLQUFBO0FBQUE7QUFFOUMsR0FDRjtBQUNGOzs7OyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"renderRscStream.server.d.ts","sourceRoot":"","sources":["../../../plugin/stream/renderRscStream.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC,GACvF,eAAe,CAsJjB"}
1
+ {"version":3,"file":"renderRscStream.server.d.ts","sourceRoot":"","sources":["../../../plugin/stream/renderRscStream.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC,GACvF,eAAe,CAwJjB"}
@@ -1,153 +1,136 @@
1
- import { PassThrough } from "node:stream";
2
- import { createStreamMetrics } from "../metrics/createStreamMetrics.js";
3
- import { createReactElement } from "../helpers/createRscRenderHelpers.js";
4
- import { ReactDOMServer } from "../vendor/vendor.server.js";
5
1
  /**
6
- * Intuitive RSC stream renderer that works on both client and server
7
- *
8
- * Usage:
9
- * const result = renderRscStream(options, handlers);
10
- *
11
- * // Pipe to any destination
12
- * result.rscStream.pipe(fileStream);
13
- * result.pipe(response); // convenience method
14
- *
15
- * // Access the stream directly
16
- * result.stream.on('data', (chunk) => console.log(chunk));
17
- *
18
- * // Abort if needed
19
- * result.abort('User cancelled');
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
20
5
  */
21
- export function renderRscStream(options, handlers) {
22
- const id = options.id || "";
23
- const route = options.route;
24
- const verbose = options.verbose || false;
25
- const logger = options.logger;
6
+ import { PassThrough } from 'node:stream';
7
+ import { createStreamMetrics } from '../metrics/createStreamMetrics.js';
8
+ import { createReactElement } from '../helpers/createRscRenderHelpers.js';
9
+ import { checkReactExperimental } from '../utils/checkReactVersion.js';
10
+ import { ReactDOMServer } from '../vendor/vendor.server.js';
11
+
12
+ function renderRscStream(options, handlers) {
13
+ const id = options.id || "";
14
+ const route = options.route;
15
+ const verbose = options.verbose || false;
16
+ const logger = options.logger;
17
+ try {
18
+ let reactElement;
26
19
  try {
27
- // Create React element from options - wrap in try-catch to handle errors during element creation
28
- let reactElement;
29
- try {
30
- reactElement = createReactElement(options, {
31
- id,
20
+ reactElement = createReactElement(options, {
21
+ id,
22
+ route,
23
+ verbose,
24
+ logger,
25
+ reuseHeadlessStreamId: options.reuseHeadlessStreamId,
26
+ headlessStreamElements: options.headlessStreamElements,
27
+ headlessStreamErrors: options.headlessStreamErrors
28
+ });
29
+ } catch (elementError) {
30
+ if (verbose) {
31
+ logger?.error(`[renderRscStream:${route}] Error creating React element: ${elementError}`);
32
+ }
33
+ handlers?.onError?.(id, elementError, {
34
+ route,
35
+ context: "React Element Creation Error"
36
+ });
37
+ const errorStream = new PassThrough();
38
+ errorStream.end();
39
+ return {
40
+ type: "server",
41
+ rscStream: errorStream,
42
+ pipe: (destination) => errorStream.pipe(destination),
43
+ abort: () => {
44
+ },
45
+ metrics: createStreamMetrics()
46
+ };
47
+ }
48
+ const rscStream = new PassThrough();
49
+ const metrics = createStreamMetrics();
50
+ if (verbose) {
51
+ logger?.info(`[renderRscStream:${route}] Creating React stream for element`);
52
+ }
53
+ checkReactExperimental();
54
+ const reactStream = ReactDOMServer.renderToPipeableStream(
55
+ reactElement,
56
+ options.moduleBasePath || "",
57
+ {
58
+ ...options.serverPipeableStreamOptions,
59
+ onError: (error) => {
60
+ if (verbose) {
61
+ logger?.error(`[renderRscStream:${route}] React stream error: ${error}`);
62
+ }
63
+ handlers?.onError?.(id, error, {
64
+ route,
65
+ context: "React Stream Error"
66
+ });
67
+ if (options.onEvent) {
68
+ options.onEvent({
69
+ type: "route.error",
70
+ data: {
71
+ error,
32
72
  route,
33
- verbose,
34
- logger,
35
- reuseHeadlessStreamId: options.reuseHeadlessStreamId,
36
- headlessStreamElements: options.headlessStreamElements,
37
- headlessStreamErrors: options.headlessStreamErrors,
73
+ panicThreshold: options.panicThreshold
74
+ }
38
75
  });
39
- }
40
- catch (elementError) {
41
- // Handle errors during React element creation
42
- if (verbose) {
43
- logger?.error(`[renderRscStream:${route}] Error creating React element: ${elementError}`);
76
+ }
77
+ setImmediate(() => {
78
+ if (!rscStream.destroyed) {
79
+ rscStream.end();
44
80
  }
45
- // Call our error handler to process the error
46
- handlers?.onError?.(id, elementError, {
47
- route,
48
- context: "React Element Creation Error",
49
- });
50
- // Return empty stream on error - API remains consistent
51
- const errorStream = new PassThrough();
52
- errorStream.end();
53
- return {
54
- type: "server",
55
- rscStream: errorStream,
56
- pipe: (destination) => errorStream.pipe(destination),
57
- abort: () => { },
58
- metrics: createStreamMetrics(),
59
- };
60
- }
61
- // Create the output stream - this is what users will pipe to destinations
62
- const rscStream = new PassThrough();
63
- const metrics = createStreamMetrics();
64
- if (verbose) {
65
- logger?.info(`[renderRscStream:${route}] Creating React stream for element`);
66
- }
67
- // Render React to stream - let it flow naturally like the RSC worker
68
- const reactStream = ReactDOMServer.renderToPipeableStream(reactElement, options.moduleBasePath || "", {
69
- ...options.serverPipeableStreamOptions,
70
- onError: (error) => {
71
- if (verbose) {
72
- logger?.error(`[renderRscStream:${route}] React stream error: ${error}`);
73
- }
74
- // Call our error handler to process the error
75
- handlers?.onError?.(id, error, {
76
- route,
77
- context: "React Stream Error",
78
- });
79
- // Emit route.error event to allow main thread to handle panic threshold logic (like client)
80
- if (options.onEvent) {
81
- options.onEvent({
82
- type: "route.error",
83
- data: {
84
- error: error,
85
- route: route,
86
- panicThreshold: options.panicThreshold
87
- }
88
- });
89
- }
90
- // CRITICAL: Don't let the error propagate further - this prevents uncaught exceptions
91
- // The error has been handled by our error handler, so we don't need to re-throw it
92
- // Ensure stream is ended when error occurs to prevent hanging (like RSC worker does)
93
- // Use setImmediate to ensure the error handler completes before ending the stream
94
- setImmediate(() => {
95
- if (!rscStream.destroyed) {
96
- rscStream.end();
97
- }
98
- // Also abort the React stream to ensure it stops producing data
99
- if (reactStream && typeof reactStream.abort === 'function') {
100
- reactStream.abort();
101
- }
102
- });
103
- },
104
- onPostpone: (reason) => {
105
- if (verbose) {
106
- logger?.info(`[renderRscStream:${route}] Stream postponed: ${reason}`);
107
- }
108
- handlers?.onPostpone?.(id, reason);
109
- },
110
- });
111
- // Pipe React output to our stream - let streams end naturally like the RSC worker does
112
- reactStream.pipe(rscStream);
113
- // Handle stream errors naturally - don't force completion
114
- rscStream.on("error", (error) => {
115
- if (verbose) {
116
- logger?.error(`[renderRscStream:${route}] Stream error: ${error}`);
81
+ if (reactStream && typeof reactStream.abort === "function") {
82
+ reactStream.abort();
117
83
  }
118
- });
119
- // Return intuitive interface that works the same on client and server
120
- return {
121
- type: "server",
122
- rscStream: rscStream, // Alias for compatibility with existing code
123
- pipe: (destination) => rscStream.pipe(destination), // Convenience method
124
- abort: (reason) => {
125
- if (handlers?.onError) {
126
- handlers.onError(id, new Error(String(reason || "Stream aborted")), {
127
- route,
128
- context: "Stream Aborted",
129
- });
130
- }
131
- rscStream.end();
132
- },
133
- metrics,
134
- };
135
- }
136
- catch (error) {
137
- // Handle errors gracefully - always return a valid stream
138
- handlers?.onError?.(id, error, {
84
+ });
85
+ },
86
+ onPostpone: (reason) => {
87
+ if (verbose) {
88
+ logger?.info(`[renderRscStream:${route}] Stream postponed: ${reason}`);
89
+ }
90
+ handlers?.onPostpone?.(id, reason);
91
+ }
92
+ }
93
+ );
94
+ reactStream.pipe(rscStream);
95
+ rscStream.on("error", (error) => {
96
+ if (verbose) {
97
+ logger?.error(`[renderRscStream:${route}] Stream error: ${error}`);
98
+ }
99
+ });
100
+ return {
101
+ type: "server",
102
+ rscStream,
103
+ // Alias for compatibility with existing code
104
+ pipe: (destination) => rscStream.pipe(destination),
105
+ // Convenience method
106
+ abort: (reason) => {
107
+ if (handlers?.onError) {
108
+ handlers.onError(id, new Error(String(reason || "Stream aborted")), {
139
109
  route,
140
- context: "RSC Render Error",
141
- });
142
- // Return empty stream on error - API remains consistent
143
- const errorStream = new PassThrough();
144
- errorStream.end();
145
- return {
146
- type: "server",
147
- rscStream: errorStream,
148
- pipe: (destination) => errorStream.pipe(destination),
149
- abort: () => { },
150
- metrics: createStreamMetrics(),
151
- };
152
- }
110
+ context: "Stream Aborted"
111
+ });
112
+ }
113
+ rscStream.end();
114
+ },
115
+ metrics
116
+ };
117
+ } catch (error) {
118
+ handlers?.onError?.(id, error, {
119
+ route,
120
+ context: "RSC Render Error"
121
+ });
122
+ const errorStream = new PassThrough();
123
+ errorStream.end();
124
+ return {
125
+ type: "server",
126
+ rscStream: errorStream,
127
+ pipe: (destination) => errorStream.pipe(destination),
128
+ abort: () => {
129
+ },
130
+ metrics: createStreamMetrics()
131
+ };
132
+ }
153
133
  }
134
+
135
+ export { renderRscStream };
136
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyUnNjU3RyZWFtLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3N0cmVhbS9yZW5kZXJSc2NTdHJlYW0uc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZUhhbmRsZXJPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJzY1JlbmRlclJlc3VsdCB9IGZyb20gXCIuL3JlbmRlclJzY1N0cmVhbS50eXBlcy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlU3RyZWFtTWV0cmljcyB9IGZyb20gXCIuLi9tZXRyaWNzL2NyZWF0ZVN0cmVhbU1ldHJpY3MuanNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWN0RWxlbWVudCB9IGZyb20gXCIuLi9oZWxwZXJzL2NyZWF0ZVJzY1JlbmRlckhlbHBlcnMuanNcIjtcbmltcG9ydCB7IGNoZWNrUmVhY3RFeHBlcmltZW50YWwgfSBmcm9tIFwiLi4vdXRpbHMvY2hlY2tSZWFjdFZlcnNpb24uanNcIjtcbmltcG9ydCB7IFJlYWN0RE9NU2VydmVyIH0gZnJvbSBcIi4uL3ZlbmRvci92ZW5kb3Iuc2VydmVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN0cmVhbUhhbmRsZXJzIH0gZnJvbSBcIi4uL3dvcmtlci90eXBlcy5qc1wiO1xuXG5cbi8qKlxuICogSW50dWl0aXZlIFJTQyBzdHJlYW0gcmVuZGVyZXIgdGhhdCB3b3JrcyBvbiBib3RoIGNsaWVudCBhbmQgc2VydmVyXG4gKiBcbiAqIFVzYWdlOlxuICogY29uc3QgcmVzdWx0ID0gcmVuZGVyUnNjU3RyZWFtKG9wdGlvbnMsIGhhbmRsZXJzKTtcbiAqIFxuICogLy8gUGlwZSB0byBhbnkgZGVzdGluYXRpb25cbiAqIHJlc3VsdC5yc2NTdHJlYW0ucGlwZShmaWxlU3RyZWFtKTtcbiAqIHJlc3VsdC5waXBlKHJlc3BvbnNlKTsgLy8gY29udmVuaWVuY2UgbWV0aG9kXG4gKiBcbiAqIC8vIEFjY2VzcyB0aGUgc3RyZWFtIGRpcmVjdGx5XG4gKiByZXN1bHQuc3RyZWFtLm9uKCdkYXRhJywgKGNodW5rKSA9PiBjb25zb2xlLmxvZyhjaHVuaykpO1xuICogXG4gKiAvLyBBYm9ydCBpZiBuZWVkZWRcbiAqIHJlc3VsdC5hYm9ydCgnVXNlciBjYW5jZWxsZWQnKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclJzY1N0cmVhbShcbiAgb3B0aW9uczogQ3JlYXRlSGFuZGxlck9wdGlvbnMsXG4gIGhhbmRsZXJzPzogUGljazxTdHJlYW1IYW5kbGVyczxcInNlcnZlclwiPiwgXCJvbkVycm9yXCIgfCBcIm9uUG9zdHBvbmVcIiB8IFwib25FbmRcIiB8IFwib25EYXRhXCI+XG4pOiBSc2NSZW5kZXJSZXN1bHQge1xuICBjb25zdCBpZCA9IG9wdGlvbnMuaWQgfHwgXCJcIjtcbiAgY29uc3Qgcm91dGUgPSBvcHRpb25zLnJvdXRlO1xuICBjb25zdCB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlIHx8IGZhbHNlO1xuICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlcjtcblxuICB0cnkge1xuICAgIC8vIENyZWF0ZSBSZWFjdCBlbGVtZW50IGZyb20gb3B0aW9ucyAtIHdyYXAgaW4gdHJ5LWNhdGNoIHRvIGhhbmRsZSBlcnJvcnMgZHVyaW5nIGVsZW1lbnQgY3JlYXRpb25cbiAgICBsZXQgcmVhY3RFbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICByZWFjdEVsZW1lbnQgPSBjcmVhdGVSZWFjdEVsZW1lbnQob3B0aW9ucywge1xuICAgICAgICBpZCxcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHZlcmJvc2UsXG4gICAgICAgIGxvZ2dlcixcbiAgICAgICAgcmV1c2VIZWFkbGVzc1N0cmVhbUlkOiAob3B0aW9ucyBhcyBhbnkpLnJldXNlSGVhZGxlc3NTdHJlYW1JZCxcbiAgICAgICAgaGVhZGxlc3NTdHJlYW1FbGVtZW50czogKG9wdGlvbnMgYXMgYW55KS5oZWFkbGVzc1N0cmVhbUVsZW1lbnRzLFxuICAgICAgICBoZWFkbGVzc1N0cmVhbUVycm9yczogKG9wdGlvbnMgYXMgYW55KS5oZWFkbGVzc1N0cmVhbUVycm9ycyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVsZW1lbnRFcnJvcikge1xuICAgICAgLy8gSGFuZGxlIGVycm9ycyBkdXJpbmcgUmVhY3QgZWxlbWVudCBjcmVhdGlvblxuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5lcnJvcihgW3JlbmRlclJzY1N0cmVhbToke3JvdXRlfV0gRXJyb3IgY3JlYXRpbmcgUmVhY3QgZWxlbWVudDogJHtlbGVtZW50RXJyb3J9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENhbGwgb3VyIGVycm9yIGhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgZXJyb3JcbiAgICAgIGhhbmRsZXJzPy5vbkVycm9yPy4oaWQsIGVsZW1lbnRFcnJvciwge1xuICAgICAgICByb3V0ZSxcbiAgICAgICAgY29udGV4dDogXCJSZWFjdCBFbGVtZW50IENyZWF0aW9uIEVycm9yXCIsXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIGVtcHR5IHN0cmVhbSBvbiBlcnJvciAtIEFQSSByZW1haW5zIGNvbnNpc3RlbnRcbiAgICAgIGNvbnN0IGVycm9yU3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICBlcnJvclN0cmVhbS5lbmQoKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJzZXJ2ZXJcIiBhcyBjb25zdCxcbiAgICAgICAgcnNjU3RyZWFtOiBlcnJvclN0cmVhbSxcbiAgICAgICAgcGlwZTogKGRlc3RpbmF0aW9uOiBhbnkpID0+IGVycm9yU3RyZWFtLnBpcGUoZGVzdGluYXRpb24pLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICAgIG1ldHJpY3M6IGNyZWF0ZVN0cmVhbU1ldHJpY3MoKSxcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSB0aGUgb3V0cHV0IHN0cmVhbSAtIHRoaXMgaXMgd2hhdCB1c2VycyB3aWxsIHBpcGUgdG8gZGVzdGluYXRpb25zXG4gICAgY29uc3QgcnNjU3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgY29uc3QgbWV0cmljcyA9IGNyZWF0ZVN0cmVhbU1ldHJpY3MoKTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXI/LmluZm8oYFtyZW5kZXJSc2NTdHJlYW06JHtyb3V0ZX1dIENyZWF0aW5nIFJlYWN0IHN0cmVhbSBmb3IgZWxlbWVudGApO1xuICAgIH1cbiAgICBcbiAgICBjaGVja1JlYWN0RXhwZXJpbWVudGFsKCk7XG5cbiAgICAvLyBSZW5kZXIgUmVhY3QgdG8gc3RyZWFtIC0gbGV0IGl0IGZsb3cgbmF0dXJhbGx5IGxpa2UgdGhlIFJTQyB3b3JrZXJcbiAgICBjb25zdCByZWFjdFN0cmVhbSA9IFJlYWN0RE9NU2VydmVyLnJlbmRlclRvUGlwZWFibGVTdHJlYW0oXG4gICAgICByZWFjdEVsZW1lbnQsXG4gICAgICBvcHRpb25zLm1vZHVsZUJhc2VQYXRoIHx8IFwiXCIsXG4gICAgICB7XG4gICAgICAgIC4uLm9wdGlvbnMuc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgICAgICBvbkVycm9yOiAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5lcnJvcihgW3JlbmRlclJzY1N0cmVhbToke3JvdXRlfV0gUmVhY3Qgc3RyZWFtIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDYWxsIG91ciBlcnJvciBoYW5kbGVyIHRvIHByb2Nlc3MgdGhlIGVycm9yXG4gICAgICAgICAgaGFuZGxlcnM/Lm9uRXJyb3I/LihpZCwgZXJyb3IsIHtcbiAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgY29udGV4dDogXCJSZWFjdCBTdHJlYW0gRXJyb3JcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbWl0IHJvdXRlLmVycm9yIGV2ZW50IHRvIGFsbG93IG1haW4gdGhyZWFkIHRvIGhhbmRsZSBwYW5pYyB0aHJlc2hvbGQgbG9naWMgKGxpa2UgY2xpZW50KVxuICAgICAgICAgIGlmIChvcHRpb25zLm9uRXZlbnQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25FdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwicm91dGUuZXJyb3JcIixcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgICAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IG9wdGlvbnMucGFuaWNUaHJlc2hvbGRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIENSSVRJQ0FMOiBEb24ndCBsZXQgdGhlIGVycm9yIHByb3BhZ2F0ZSBmdXJ0aGVyIC0gdGhpcyBwcmV2ZW50cyB1bmNhdWdodCBleGNlcHRpb25zXG4gICAgICAgICAgLy8gVGhlIGVycm9yIGhhcyBiZWVuIGhhbmRsZWQgYnkgb3VyIGVycm9yIGhhbmRsZXIsIHNvIHdlIGRvbid0IG5lZWQgdG8gcmUtdGhyb3cgaXRcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbnN1cmUgc3RyZWFtIGlzIGVuZGVkIHdoZW4gZXJyb3Igb2NjdXJzIHRvIHByZXZlbnQgaGFuZ2luZyAobGlrZSBSU0Mgd29ya2VyIGRvZXMpXG4gICAgICAgICAgLy8gVXNlIHNldEltbWVkaWF0ZSB0byBlbnN1cmUgdGhlIGVycm9yIGhhbmRsZXIgY29tcGxldGVzIGJlZm9yZSBlbmRpbmcgdGhlIHN0cmVhbVxuICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJzY1N0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgcnNjU3RyZWFtLmVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWxzbyBhYm9ydCB0aGUgUmVhY3Qgc3RyZWFtIHRvIGVuc3VyZSBpdCBzdG9wcyBwcm9kdWNpbmcgZGF0YVxuICAgICAgICAgICAgaWYgKHJlYWN0U3RyZWFtICYmIHR5cGVvZiByZWFjdFN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZWFjdFN0cmVhbS5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvblBvc3Rwb25lOiAocmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcmVuZGVyUnNjU3RyZWFtOiR7cm91dGV9XSBTdHJlYW0gcG9zdHBvbmVkOiAke3JlYXNvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFuZGxlcnM/Lm9uUG9zdHBvbmU/LihpZCwgcmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGlwZSBSZWFjdCBvdXRwdXQgdG8gb3VyIHN0cmVhbSAtIGxldCBzdHJlYW1zIGVuZCBuYXR1cmFsbHkgbGlrZSB0aGUgUlNDIHdvcmtlciBkb2VzXG4gICAgcmVhY3RTdHJlYW0ucGlwZShyc2NTdHJlYW0pO1xuICAgIFxuICAgIC8vIEhhbmRsZSBzdHJlYW0gZXJyb3JzIG5hdHVyYWxseSAtIGRvbid0IGZvcmNlIGNvbXBsZXRpb25cbiAgICByc2NTdHJlYW0ub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uZXJyb3IoYFtyZW5kZXJSc2NTdHJlYW06JHtyb3V0ZX1dIFN0cmVhbSBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFJldHVybiBpbnR1aXRpdmUgaW50ZXJmYWNlIHRoYXQgd29ya3MgdGhlIHNhbWUgb24gY2xpZW50IGFuZCBzZXJ2ZXJcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzZXJ2ZXJcIiBhcyBjb25zdCxcbiAgICAgIHJzY1N0cmVhbTogcnNjU3RyZWFtLCAvLyBBbGlhcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgIHBpcGU6IChkZXN0aW5hdGlvbjogYW55KSA9PiByc2NTdHJlYW0ucGlwZShkZXN0aW5hdGlvbiksIC8vIENvbnZlbmllbmNlIG1ldGhvZFxuICAgICAgYWJvcnQ6IChyZWFzb24/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmIChoYW5kbGVycz8ub25FcnJvcikge1xuICAgICAgICAgIGhhbmRsZXJzLm9uRXJyb3IoaWQsIG5ldyBFcnJvcihTdHJpbmcocmVhc29uIHx8IFwiU3RyZWFtIGFib3J0ZWRcIikpLCB7XG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiU3RyZWFtIEFib3J0ZWRcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByc2NTdHJlYW0uZW5kKCk7XG4gICAgICB9LFxuICAgICAgbWV0cmljcyxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseSAtIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBzdHJlYW1cbiAgICBoYW5kbGVycz8ub25FcnJvcj8uKGlkLCBlcnJvciwge1xuICAgICAgcm91dGUsXG4gICAgICBjb250ZXh0OiBcIlJTQyBSZW5kZXIgRXJyb3JcIixcbiAgICB9KTtcblxuICAgIC8vIFJldHVybiBlbXB0eSBzdHJlYW0gb24gZXJyb3IgLSBBUEkgcmVtYWlucyBjb25zaXN0ZW50XG4gICAgY29uc3QgZXJyb3JTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBlcnJvclN0cmVhbS5lbmQoKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzZXJ2ZXJcIiBhcyBjb25zdCxcbiAgICAgIHJzY1N0cmVhbTogZXJyb3JTdHJlYW0sXG4gICAgICBwaXBlOiAoZGVzdGluYXRpb246IGFueSkgPT4gZXJyb3JTdHJlYW0ucGlwZShkZXN0aW5hdGlvbiksXG4gICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICBtZXRyaWNzOiBjcmVhdGVTdHJlYW1NZXRyaWNzKCksXG4gICAgfTtcbiAgfVxufVxuXG5cblxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBMEJPLFNBQVMsZUFBQSxDQUNkLFNBQ0EsUUFDaUIsRUFBQTtBQUNqQixFQUFNLE1BQUEsRUFBQSxHQUFLLFFBQVEsRUFBTSxJQUFBLEVBQUE7QUFDekIsRUFBQSxNQUFNLFFBQVEsT0FBUSxDQUFBLEtBQUE7QUFDdEIsRUFBTSxNQUFBLE9BQUEsR0FBVSxRQUFRLE9BQVcsSUFBQSxLQUFBO0FBQ25DLEVBQUEsTUFBTSxTQUFTLE9BQVEsQ0FBQSxNQUFBO0FBRXZCLEVBQUksSUFBQTtBQUVGLElBQUksSUFBQSxZQUFBO0FBQ0osSUFBSSxJQUFBO0FBQ0YsTUFBQSxZQUFBLEdBQWUsbUJBQW1CLE9BQVMsRUFBQTtBQUFBLFFBQ3pDLEVBQUE7QUFBQSxRQUNBLEtBQUE7QUFBQSxRQUNBLE9BQUE7QUFBQSxRQUNBLE1BQUE7QUFBQSxRQUNBLHVCQUF3QixPQUFnQixDQUFBLHFCQUFBO0FBQUEsUUFDeEMsd0JBQXlCLE9BQWdCLENBQUEsc0JBQUE7QUFBQSxRQUN6QyxzQkFBdUIsT0FBZ0IsQ0FBQTtBQUFBLE9BQ3hDLENBQUE7QUFBQSxhQUNNLFlBQWMsRUFBQTtBQUVyQixNQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsUUFBQSxNQUFBLEVBQVEsS0FBTSxDQUFBLENBQUEsaUJBQUEsRUFBb0IsS0FBSyxDQUFBLGdDQUFBLEVBQW1DLFlBQVksQ0FB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