vite-plugin-react-server 1.4.1 → 1.4.3

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 (146) 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/configureReactServer.server.d.ts.map +1 -1
  11. package/dist/plugin/dev-server/configureReactServer.server.js +5 -8
  12. package/dist/plugin/dev-server/plugin.client.d.ts.map +1 -1
  13. package/dist/plugin/dev-server/plugin.client.js +2 -1
  14. package/dist/plugin/dev-server/plugin.server.d.ts.map +1 -1
  15. package/dist/plugin/dev-server/plugin.server.js +2 -36
  16. package/dist/plugin/dev-server/virtualRscHmrPlugin.js +23 -23
  17. package/dist/plugin/environments/createBuildEventPlugin.js +88 -98
  18. package/dist/plugin/environments/createEnvironmentPlugin.js +222 -250
  19. package/dist/plugin/error/index.d.ts +1 -2
  20. package/dist/plugin/error/index.d.ts.map +1 -1
  21. package/dist/plugin/error/index.js +2 -3
  22. package/dist/plugin/error/panicThresholdHandler.js +14 -3
  23. package/dist/plugin/error/setupGlobalErrorHandler.d.ts.map +1 -1
  24. package/dist/plugin/error/setupGlobalErrorHandler.js +23 -16
  25. package/dist/plugin/helpers/createRscRenderHelpers.d.ts +0 -5
  26. package/dist/plugin/helpers/createRscRenderHelpers.d.ts.map +1 -1
  27. package/dist/plugin/helpers/createRscRenderHelpers.js +32 -55
  28. package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -1
  29. package/dist/plugin/helpers/createSharedLoader.js +4 -2
  30. package/dist/plugin/helpers/headlessStreamReuseHandler.js +30 -22
  31. package/dist/plugin/helpers/headlessStreamState.d.ts +0 -38
  32. package/dist/plugin/helpers/headlessStreamState.d.ts.map +1 -1
  33. package/dist/plugin/helpers/headlessStreamState.js +15 -76
  34. package/dist/plugin/helpers/index.d.ts +0 -3
  35. package/dist/plugin/helpers/index.d.ts.map +1 -1
  36. package/dist/plugin/helpers/index.js +1 -4
  37. package/dist/plugin/helpers/requestInfo.d.ts.map +1 -1
  38. package/dist/plugin/helpers/requestInfo.js +3 -3
  39. package/dist/plugin/helpers/resolveComponent.d.ts.map +1 -1
  40. package/dist/plugin/helpers/resolveComponent.js +4 -2
  41. package/dist/plugin/helpers/workerCleanup.d.ts +1 -12
  42. package/dist/plugin/helpers/workerCleanup.d.ts.map +1 -1
  43. package/dist/plugin/helpers/workerCleanup.js +1 -1
  44. package/dist/plugin/index.client.d.ts +5 -0
  45. package/dist/plugin/index.client.d.ts.map +1 -0
  46. package/dist/plugin/index.client.js +4 -0
  47. package/dist/plugin/index.d.ts +4 -3
  48. package/dist/plugin/index.d.ts.map +1 -1
  49. package/dist/plugin/index.js +10 -5
  50. package/dist/plugin/index.server.d.ts +5 -0
  51. package/dist/plugin/index.server.d.ts.map +1 -0
  52. package/dist/plugin/index.server.js +4 -0
  53. package/dist/plugin/loader/directives/index.d.ts +0 -1
  54. package/dist/plugin/loader/directives/index.d.ts.map +1 -1
  55. package/dist/plugin/loader/directives/index.js +1 -2
  56. package/dist/plugin/metrics/createWorkerStartupMetrics.js +31 -13
  57. package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +41 -38
  58. package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +43 -46
  59. package/dist/plugin/plugin.client.js +2 -2
  60. package/dist/plugin/plugin.server.js +2 -2
  61. package/dist/plugin/react-static/createBuildLoader.client.js +12 -6
  62. package/dist/plugin/react-static/createBuildLoader.server.js +255 -235
  63. package/dist/plugin/react-static/plugin.client.js +684 -770
  64. package/dist/plugin/react-static/plugin.server.js +517 -603
  65. package/dist/plugin/react-static/processCssFilesForPages.js +103 -88
  66. package/dist/plugin/react-static/renderPage.client.js +455 -529
  67. package/dist/plugin/react-static/renderPage.server.js +485 -508
  68. package/dist/plugin/react-static/renderPagesBatched.js +277 -275
  69. package/dist/plugin/react-static/rscToHtmlStream.client.js +48 -29
  70. package/dist/plugin/react-static/rscToHtmlStream.server.js +62 -37
  71. package/dist/plugin/react-static/temporaryReferences.server.js +11 -2
  72. package/dist/plugin/stream/createMainThreadHandlers.js +40 -31
  73. package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -1
  74. package/dist/plugin/stream/renderRscStream.server.js +127 -144
  75. package/dist/plugin/transformer/createTransformerPlugin.js +226 -265
  76. package/dist/plugin/utils/checkReactVersion.d.ts +7 -0
  77. package/dist/plugin/utils/checkReactVersion.d.ts.map +1 -0
  78. package/dist/plugin/utils/checkReactVersion.js +23 -0
  79. package/dist/plugin/utils/envUrls.node.js +12 -11
  80. package/dist/plugin/vendor/vendor-alias.js +84 -114
  81. package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
  82. package/dist/plugin/vendor/vendor.client.js +1 -3
  83. package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -1
  84. package/dist/plugin/worker/rsc/handleRscRender.js +3 -1
  85. package/dist/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +123 -13
  87. package/plugin/config/autoDiscover/resolveAutoDiscover.ts +4 -0
  88. package/plugin/config/getCondition.ts +6 -4
  89. package/plugin/dev-server/configureReactServer.server.ts +7 -10
  90. package/plugin/dev-server/plugin.client.ts +2 -0
  91. package/plugin/dev-server/plugin.server.ts +2 -49
  92. package/plugin/error/index.ts +1 -2
  93. package/plugin/error/setupGlobalErrorHandler.ts +24 -25
  94. package/plugin/helpers/createRscRenderHelpers.ts +0 -29
  95. package/plugin/helpers/createSharedLoader.ts +6 -1
  96. package/plugin/helpers/headlessStreamState.ts +0 -69
  97. package/plugin/helpers/index.ts +0 -3
  98. package/plugin/helpers/requestInfo.ts +1 -2
  99. package/plugin/helpers/resolveComponent.ts +6 -1
  100. package/plugin/helpers/workerCleanup.ts +1 -38
  101. package/plugin/index.client.ts +4 -0
  102. package/plugin/index.server.ts +4 -0
  103. package/plugin/index.ts +12 -5
  104. package/plugin/loader/directives/index.ts +0 -1
  105. package/plugin/plugin.client.ts +1 -1
  106. package/plugin/plugin.server.ts +1 -1
  107. package/plugin/stream/renderRscStream.server.ts +3 -0
  108. package/plugin/transformer/README.md +1 -1
  109. package/plugin/utils/checkReactVersion.ts +28 -0
  110. package/plugin/vendor/vendor.client.ts +0 -2
  111. package/plugin/worker/html/README.md +1 -1
  112. package/plugin/worker/rsc/README.md +1 -1
  113. package/plugin/worker/rsc/handleRscRender.ts +2 -0
  114. package/scripts/generate-toc.mjs +27 -294
  115. package/dist/plugin/error/assertPanic.d.ts +0 -2
  116. package/dist/plugin/error/assertPanic.d.ts.map +0 -1
  117. package/dist/plugin/error/assertPanic.js +0 -15
  118. package/dist/plugin/error/directiveError.d.ts +0 -13
  119. package/dist/plugin/error/directiveError.d.ts.map +0 -1
  120. package/dist/plugin/error/directiveError.js +0 -21
  121. package/dist/plugin/error/enhanceError.d.ts +0 -14
  122. package/dist/plugin/error/enhanceError.d.ts.map +0 -1
  123. package/dist/plugin/error/enhanceError.js +0 -24
  124. package/dist/plugin/helpers/createSafePageComponent.d.ts +0 -36
  125. package/dist/plugin/helpers/createSafePageComponent.d.ts.map +0 -1
  126. package/dist/plugin/helpers/createSafePageComponent.js +0 -50
  127. package/dist/plugin/helpers/moduleResolver.d.ts +0 -25
  128. package/dist/plugin/helpers/moduleResolver.d.ts.map +0 -1
  129. package/dist/plugin/helpers/moduleResolver.js +0 -64
  130. package/dist/plugin/helpers/stashReturnValue.d.ts +0 -3
  131. package/dist/plugin/helpers/stashReturnValue.d.ts.map +0 -1
  132. package/dist/plugin/helpers/stashReturnValue.js +0 -23
  133. package/dist/plugin/helpers/workerManager.d.ts +0 -5
  134. package/dist/plugin/helpers/workerManager.d.ts.map +0 -1
  135. package/dist/plugin/helpers/workerManager.js +0 -18
  136. package/dist/plugin/loader/directives/collectExportsFromModule.d.ts +0 -6
  137. package/dist/plugin/loader/directives/collectExportsFromModule.d.ts.map +0 -1
  138. package/dist/plugin/loader/directives/collectExportsFromModule.js +0 -24
  139. package/plugin/error/assertPanic.ts +0 -9
  140. package/plugin/error/directiveError.ts +0 -29
  141. package/plugin/error/enhanceError.ts +0 -41
  142. package/plugin/helpers/createSafePageComponent.ts +0 -64
  143. package/plugin/helpers/moduleResolver.ts +0 -91
  144. package/plugin/helpers/stashReturnValue.ts +0 -19
  145. package/plugin/helpers/workerManager.ts +0 -16
  146. package/plugin/loader/directives/collectExportsFromModule.ts +0 -25
@@ -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/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmIChoYW5kbGVycz8ub25FcnJvcikge1xuICAgICAgICAgIGhhbmRsZXJzLm9uRXJyb3IoaWQsIG5ldyBFcnJvcihTdHJpbmcocmVhc29uIHx8IFwiU3RyZWFtIGFib3J0ZWRcIikpLCB7XG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiU3RyZWFtIEFib3J0ZWRcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByc2NTdHJlYW0uZW5kKCk7XG4gICAgICB9LFxuICAgICAgbWV0cmljcyxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseSAtIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBzdHJlYW1cbiAgICBoYW5kbGVycz8ub25FcnJvcj8uKGlkLCBlcnJvciwge1xuICAgICAgcm91dGUsXG4gICAgICBjb250ZXh0OiBcIlJTQyBSZW5kZXIgRXJyb3JcIixcbiAgICB9KTtcblxuICAgIC8vIFJldHVybiBlbXB0eSBzdHJlYW0gb24gZXJyb3IgLSBBUEkgcmVtYWlucyBjb25zaXN0ZW50XG4gICAgY29uc3QgZXJyb3JTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBlcnJvclN0cmVhbS5lbmQoKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzZXJ2ZXJcIiBhcyBjb25zdCxcbiAgICAgIHJzY1N0cmVhbTogZXJyb3JTdHJlYW0sXG4gICAgICBwaXBlOiAoZGVzdGluYXRpb246IGFueSkgPT4gZXJyb3JTdHJlYW0ucGlwZShkZXN0aW5hdGlvbiksXG4gICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICBtZXRyaWNzOiBjcmVhdGVTdHJlYW1NZXRyaWNzKCksXG4gICAgfTtcbiAgfVxufVxuXG5cblxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBMEJPLFNBQVMsZUFBQSxDQUNkLFNBQ0EsUUFDaUIsRUFBQTtBQUNqQixFQUFNLE1BQUEsRUFBQSxHQUFLLFFBQVEsRUFBTSxJQUFBLEVBQUE7QUFDekIsRUFBQSxNQUFNLFFBQVEsT0FBUSxDQUFBLEtBQUE7QUFDdEIsRUFBTSxNQUFBLE9BQUEsR0FBVSxRQUFRLE9BQVcsSUFBQSxLQUFBO0FBQ25DLEVBQUEsTUFBTSxTQUFTLE9BQVEsQ0FBQSxNQUFBO0FBRXZCLEVBQUksSUFBQTtBQUVGLElBQUksSUFBQSxZQUFBO0FBQ0osSUFBSSxJQUFBO0FBQ0YsTUFBQSxZQUFBLEdBQWUsbUJBQW1CLE9BQVMsRUFBQTtBQUFBLFFBQ3pDLEVBQUE7QUFBQSxRQUNBLEtBQUE7QUFBQSxRQUNBLE9BQUE7QUFBQSxRQUNBLE1BQUE7QUFBQSxRQUNBLHVCQUF3QixPQUFnQixDQUFBLHFCQUFBO0FBQUEsUUFDeEMsd0JBQXlCLE9BQWdCLENBQUEsc0JBQUE7QUFBQSxRQUN6QyxzQkFBdUIsT0FBZ0IsQ0FBQTtBQUFBLE9BQ3hDLENBQUE7QUFBQSxhQUNNLFlBQWMsRUFBQTtBQUVyQixNQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsUUFBQSxNQUFBLEVBQVEsS0FBTSxDQUFBLENBQUEsaUJBQUEsRUFBb0IsS0FBSyxDQUFBLGdDQUFBLEVBQW1DLFlBQVksQ0FBRSxDQUFBLENBQUE7QUFBQTtBQUkxRixNQUFVLFFBQUEsRUFBQSxPQUFBLEdBQVUsSUFBSSxZQUFjLEVBQUE7QUFBQSxRQUNwQyxLQUFBO0FBQUEsUUFDQSxPQUFTLEVBQUE7QUFBQSxPQUNWLENBQUE7QUFHRCxNQUFNLE1BQUEsV0FBQSxHQUFjLElBQUksV0FBWSxFQUFBO0FBQ3BDLE1BQUEsV0FBQSxDQUFZLEdBQUksRUFBQTtBQUVoQixNQUFPLE9BQUE7QUFBQSxRQUNMLElBQU0sRUFBQSxRQUFBO0FBQUEsUUFDTixTQUFXLEVBQUEsV0FBQTtBQUFBLFFBQ1gsSUFBTSxFQUFBLENBQUMsV0FBcUIsS0FBQSxXQUFBLENBQVksS0FBSyxXQUFXLENBQUE7QUFBQSxRQUN4RCxPQUFPLE1BQU07QUFBQSxTQUFDO0FBQUEsUUFDZCxTQUFTLG1CQUFvQjtBQUFBLE9BQy9CO0FBQUE7QUFJRixJQUFNLE1BQUEsU0FBQSxHQUFZLElBQUksV0FBWSxFQUFBO0FBQ2xDLElBQUEsTUFBTSxVQUFVLG1CQUFvQixFQUFBO0FBRXBDLElBQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxNQUFRLE1BQUEsRUFBQSxJQUFBLENBQUssQ0FBb0IsaUJBQUEsRUFBQSxLQUFLLENBQXFDLG1DQUFBLENBQUEsQ0FBQTtBQUFBO0FBRzdFLElBQXVCLHNCQUFBLEVBQUE7QUFHdkIsSUFBQSxNQUFNLGNBQWMsY0FBZSxDQUFBLHNCQUFBO0FBQUEsTUFDakMsWUFBQTtBQUFBLE1BQ0EsUUFBUSxjQUFrQixJQUFBLEVBQUE7QUFBQSxNQUMxQjtBQUFBLFFBQ0UsR0FBRyxPQUFRLENBQUEsMkJBQUE7QUFBQSxRQUNYLE9BQUEsRUFBUyxDQUFDLEtBQW1CLEtBQUE7QUFDM0IsVUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNYLFlBQUEsTUFBQSxFQUFRLEtBQU0sQ0FBQSxDQUFBLGlCQUFBLEVBQW9CLEtBQUssQ0FBQSxzQkFBQSxFQUF5QixLQUFLLENBQUUsQ0FBQSxDQUFBO0FBQUE7QUFJekUsVUFBVSxRQUFBLEVBQUEsT0FBQSxHQUFVLElBQUksS0FBTyxFQUFBO0FBQUEsWUFDN0IsS0FBQTtBQUFBLFlBQ0EsT0FBUyxFQUFBO0FBQUEsV0FDVixDQUFBO0FBR0QsVUFBQSxJQUFJLFFBQVEsT0FBUyxFQUFBO0FBQ25CLFlBQUEsT0FBQSxDQUFRLE9BQVEsQ0FBQTtBQUFBLGNBQ2QsSUFBTSxFQUFBLGFBQUE7QUFBQSxjQUNOLElBQU0sRUFBQTtBQUFBLGdCQUNKLEtBQUE7QUFBQSxnQkFDQSxLQUFBO0FBQUEsZ0JBQ0EsZ0JBQWdCLE9BQVEsQ0FBQTtBQUFBO0FBQzFCLGFBQ0QsQ0FBQTtBQUFBO0FBUUgsVUFBQSxZQUFBLENBQWEsTUFBTTtBQUNqQixZQUFJLElBQUEsQ0FBQyxVQUFVLFNBQVcsRUFBQTtBQUN4QixjQUFBLFNBQUEsQ0FBVSxHQUFJLEVBQUE7QUFBQTtBQUdoQixZQUFBLElBQUksV0FBZSxJQUFBLE9BQU8sV0FBWSxDQUFBLEtBQUEsS0FBVSxVQUFZLEVBQUE7QUFDMUQsY0FBQSxXQUFBLENBQVksS0FBTSxFQUFBO0FBQUE7QUFDcEIsV0FDRCxDQUFBO0FBQUEsU0FDSDtBQUFBLFFBQ0EsVUFBQSxFQUFZLENBQUMsTUFBbUIsS0FBQTtBQUM5QixVQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsWUFBQSxNQUFBLEVBQVEsSUFBSyxDQUFBLENBQUEsaUJBQUEsRUFBb0IsS0FBSyxDQUFBLG9CQUFBLEVBQXVCLE1BQU0sQ0FBRSxDQUFBLENBQUE7QUFBQTtBQUV2RSxVQUFVLFFBQUEsRUFBQSxVQUFBLEdBQWEsSUFBSSxNQUFNLENBQUE7QUFBQTtBQUNuQztBQUNGLEtBQ0Y7QUFHQSxJQUFBLFdBQUEsQ0FBWSxLQUFLLFNBQVMsQ0FBQTtBQUcxQixJQUFVLFNBQUEsQ0FBQSxFQUFBLENBQUcsT0FBUyxFQUFBLENBQUMsS0FBVSxLQUFBO0FBQy9CLE1BQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxRQUFBLE1BQUEsRUFBUSxLQUFNLENBQUEsQ0FBQSxpQkFBQSxFQUFvQixLQUFLLENBQUEsZ0JBQUEsRUFBbUIsS0FBSyxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBQ25FLEtBQ0QsQ0FBQTtBQUdELElBQU8sT0FBQTtBQUFBLE1BQ0wsSUFBTSxFQUFBLFFBQUE7QUFBQSxNQUNOLFNBQUE7QUFBQTtBQUFBLE1BQ0EsSUFBTSxFQUFBLENBQUMsV0FBcUIsS0FBQSxTQUFBLENBQVUsS0FBSyxXQUFXLENBQUE7QUFBQTtBQUFBLE1BQ3RELEtBQUEsRUFBTyxDQUFDLE1BQXFCLEtBQUE7QUFDM0IsUUFBQSxJQUFJLFVBQVUsT0FBUyxFQUFBO0FBQ3JCLFVBQVMsUUFBQSxDQUFBLE9BQUEsQ0FBUSxJQUFJLElBQUksS0FBQSxDQUFNLE9BQU8sTUFBVSxJQUFBLGdCQUFnQixDQUFDLENBQUcsRUFBQTtBQUFBLFlBQ2xFLEtBQUE7QUFBQSxZQUNBLE9BQVMsRUFBQTtBQUFBLFdBQ1YsQ0FBQTtBQUFBO0FBRUgsUUFBQSxTQUFBLENBQVUsR0FBSSxFQUFBO0FBQUEsT0FDaEI7QUFBQSxNQUNBO0FBQUEsS0FDRjtBQUFBLFdBQ08sS0FBTyxFQUFBO0FBRWQsSUFBVSxRQUFBLEVBQUEsT0FBQSxHQUFVLElBQUksS0FBTyxFQUFBO0FBQUEsTUFDN0IsS0FBQTtBQUFBLE1BQ0EsT0FBUyxFQUFBO0FBQUEsS0FDVixDQUFBO0FBR0QsSUFBTSxNQUFBLFdBQUEsR0FBYyxJQUFJLFdBQVksRUFBQTtBQUNwQyxJQUFBLFdBQUEsQ0FBWSxHQUFJLEVBQUE7QUFFaEIsSUFBTyxPQUFBO0FBQUEsTUFDTCxJQUFNLEVBQUEsUUFBQTtBQUFBLE1BQ04sU0FBVyxFQUFBLFdBQUE7QUFBQSxNQUNYLElBQU0sRUFBQSxDQUFDLFdBQXFCLEtBQUEsV0FBQSxDQUFZLEtBQUssV0FBVyxDQUFBO0FBQUEsTUFDeEQsT0FBTyxNQUFNO0FBQUEsT0FBQztBQUFBLE1BQ2QsU0FBUyxtQkFBb0I7QUFBQSxLQUMvQjtBQUFBO0FBRUo7Ozs7In0=