@bleedingdev/modern-js-runtime-extensions 3.9.0-ultramodern.3 → 3.9.0-ultramodern.5

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 (200) hide show
  1. package/dist/cjs/buildIdentity.js +73 -0
  2. package/dist/cjs/contextExtensions.js +74 -0
  3. package/dist/cjs/headRuntime.js +91 -0
  4. package/dist/cjs/helmetContext.js +54 -0
  5. package/dist/cjs/index.js +18 -4
  6. package/dist/cjs/localisedLoaderIdentity.js +51 -0
  7. package/dist/cjs/prefetchPolicy.js +52 -0
  8. package/dist/cjs/reactContext.js +45 -0
  9. package/dist/cjs/request-policy/browser.js +139 -0
  10. package/dist/cjs/request-policy/client.js +234 -0
  11. package/dist/cjs/request-policy/node.js +149 -0
  12. package/dist/cjs/request-policy/policyCore.js +266 -0
  13. package/dist/cjs/request-policy/requestContext.js +137 -0
  14. package/dist/cjs/request-policy/traceparent.js +56 -0
  15. package/dist/cjs/request-policy/transport.js +234 -0
  16. package/dist/cjs/request-policy/types.js +57 -0
  17. package/dist/cjs/routeHydration.js +127 -0
  18. package/dist/cjs/routerPrefetchPolicy.js +153 -0
  19. package/dist/cjs/routerProvider.js +170 -0
  20. package/dist/cjs/routerState.js +167 -0
  21. package/dist/cjs/routerStatePlugin.js +86 -0
  22. package/dist/cjs/routerStateTypes.js +18 -0
  23. package/dist/cjs/rsc-disabled/rscDisabledClientBrowserRuntime.js +69 -0
  24. package/dist/cjs/rsc-disabled/rscDisabledClientEdgeRuntime.js +61 -0
  25. package/dist/cjs/rsc-disabled/rscDisabledClientNodeRuntime.js +65 -0
  26. package/dist/cjs/rsc-disabled/rscDisabledRuntimeError.js +42 -0
  27. package/dist/cjs/rsc-disabled/rscDisabledServerEdgeRuntime.js +93 -0
  28. package/dist/cjs/rsc-disabled/rscDisabledServerNodeRuntime.js +101 -0
  29. package/dist/cjs/runtimeContextProjection.js +112 -0
  30. package/dist/cjs/server-config/bffRuntime.js +18 -0
  31. package/dist/cjs/server-config/index.js +18 -0
  32. package/dist/cjs/server-config/serverTelemetry.js +18 -0
  33. package/dist/cjs/shellStream.js +34 -2
  34. package/dist/cjs/workspaceEvents.js +159 -0
  35. package/dist/esm/buildIdentity.mjs +35 -0
  36. package/dist/esm/contextExtensions.mjs +33 -0
  37. package/dist/esm/headRuntime.mjs +43 -0
  38. package/dist/esm/helmetContext.mjs +13 -0
  39. package/dist/esm/index.mjs +2 -0
  40. package/dist/esm/localisedLoaderIdentity.mjs +13 -0
  41. package/dist/esm/prefetchPolicy.mjs +11 -0
  42. package/dist/esm/reactContext.mjs +7 -0
  43. package/dist/esm/request-policy/browser.mjs +11 -0
  44. package/dist/esm/request-policy/client.mjs +195 -0
  45. package/dist/esm/request-policy/policyCore.mjs +171 -0
  46. package/dist/esm/request-policy/requestContext.mjs +75 -0
  47. package/dist/esm/request-policy/traceparent.mjs +18 -0
  48. package/dist/esm/request-policy/transport.mjs +196 -0
  49. package/dist/esm/request-policy/types.mjs +10 -0
  50. package/dist/esm/routeHydration.mjs +77 -0
  51. package/dist/esm/routerPrefetchPolicy.mjs +115 -0
  52. package/dist/esm/routerProvider.mjs +117 -0
  53. package/dist/esm/routerState.mjs +105 -0
  54. package/dist/esm/routerStatePlugin.mjs +48 -0
  55. package/dist/esm/routerStateTypes.mjs +0 -0
  56. package/dist/esm/rsc-disabled/rscDisabledClientBrowserRuntime.mjs +10 -0
  57. package/dist/esm/rsc-disabled/rscDisabledClientEdgeRuntime.mjs +8 -0
  58. package/dist/esm/rsc-disabled/rscDisabledClientNodeRuntime.mjs +9 -0
  59. package/dist/esm/rsc-disabled/rscDisabledRuntimeError.mjs +4 -0
  60. package/dist/esm/rsc-disabled/rscDisabledServerEdgeRuntime.mjs +16 -0
  61. package/dist/esm/rsc-disabled/rscDisabledServerNodeRuntime.mjs +18 -0
  62. package/dist/esm/runtimeContextProjection.mjs +74 -0
  63. package/dist/esm/server-config/bffRuntime.mjs +0 -0
  64. package/dist/esm/server-config/index.mjs +0 -0
  65. package/dist/esm/server-config/serverTelemetry.mjs +0 -0
  66. package/dist/esm/shellStream.mjs +34 -2
  67. package/dist/esm/workspaceEvents.mjs +66 -0
  68. package/dist/esm-node/buildIdentity.mjs +36 -0
  69. package/dist/esm-node/contextExtensions.mjs +34 -0
  70. package/dist/esm-node/headRuntime.mjs +44 -0
  71. package/dist/esm-node/helmetContext.mjs +14 -0
  72. package/dist/esm-node/index.mjs +2 -0
  73. package/dist/esm-node/localisedLoaderIdentity.mjs +14 -0
  74. package/dist/esm-node/prefetchPolicy.mjs +12 -0
  75. package/dist/esm-node/reactContext.mjs +8 -0
  76. package/dist/esm-node/request-policy/browser.mjs +12 -0
  77. package/dist/esm-node/request-policy/client.mjs +196 -0
  78. package/dist/esm-node/request-policy/node.mjs +22 -0
  79. package/dist/esm-node/request-policy/policyCore.mjs +172 -0
  80. package/dist/esm-node/request-policy/requestContext.mjs +76 -0
  81. package/dist/esm-node/request-policy/traceparent.mjs +19 -0
  82. package/dist/esm-node/request-policy/transport.mjs +197 -0
  83. package/dist/esm-node/request-policy/types.mjs +11 -0
  84. package/dist/esm-node/routeHydration.mjs +78 -0
  85. package/dist/esm-node/routerPrefetchPolicy.mjs +116 -0
  86. package/dist/esm-node/routerProvider.mjs +118 -0
  87. package/dist/esm-node/routerState.mjs +106 -0
  88. package/dist/esm-node/routerStatePlugin.mjs +49 -0
  89. package/dist/esm-node/routerStateTypes.mjs +1 -0
  90. package/dist/esm-node/rsc-disabled/rscDisabledClientBrowserRuntime.mjs +11 -0
  91. package/dist/esm-node/rsc-disabled/rscDisabledClientEdgeRuntime.mjs +9 -0
  92. package/dist/esm-node/rsc-disabled/rscDisabledClientNodeRuntime.mjs +10 -0
  93. package/dist/esm-node/rsc-disabled/rscDisabledRuntimeError.mjs +5 -0
  94. package/dist/esm-node/rsc-disabled/rscDisabledServerEdgeRuntime.mjs +17 -0
  95. package/dist/esm-node/rsc-disabled/rscDisabledServerNodeRuntime.mjs +19 -0
  96. package/dist/esm-node/runtimeContextProjection.mjs +75 -0
  97. package/dist/esm-node/server-config/bffRuntime.mjs +1 -0
  98. package/dist/esm-node/server-config/index.mjs +1 -0
  99. package/dist/esm-node/server-config/serverTelemetry.mjs +1 -0
  100. package/dist/esm-node/shellStream.mjs +34 -2
  101. package/dist/esm-node/workspaceEvents.mjs +67 -0
  102. package/dist/types/buildIdentity.d.ts +37 -0
  103. package/dist/types/contextExtensions.d.ts +34 -0
  104. package/dist/types/headRuntime.d.ts +12 -0
  105. package/dist/types/helmetContext.d.ts +10 -0
  106. package/dist/types/index.d.ts +2 -0
  107. package/dist/types/localisedLoaderIdentity.d.ts +10 -0
  108. package/dist/types/prefetchPolicy.d.ts +4 -0
  109. package/dist/types/reactContext.d.ts +6 -0
  110. package/dist/types/request-policy/browser.d.ts +10 -0
  111. package/dist/types/request-policy/client.d.ts +14 -0
  112. package/dist/types/request-policy/node.d.ts +10 -0
  113. package/dist/types/request-policy/policyCore.d.ts +107 -0
  114. package/dist/types/request-policy/requestContext.d.ts +22 -0
  115. package/dist/types/request-policy/traceparent.d.ts +10 -0
  116. package/dist/types/request-policy/transport.d.ts +12 -0
  117. package/dist/types/request-policy/types.d.ts +144 -0
  118. package/dist/types/routeHydration.d.ts +24 -0
  119. package/dist/types/routerPrefetchPolicy.d.ts +28 -0
  120. package/dist/types/routerProvider.d.ts +77 -0
  121. package/dist/types/routerState.d.ts +12 -0
  122. package/dist/types/routerStatePlugin.d.ts +19 -0
  123. package/dist/types/routerStateTypes.d.ts +40 -0
  124. package/dist/types/rsc-disabled/rscDisabledClientBrowserRuntime.d.ts +9 -0
  125. package/dist/types/rsc-disabled/rscDisabledClientEdgeRuntime.d.ts +7 -0
  126. package/dist/types/rsc-disabled/rscDisabledClientNodeRuntime.d.ts +8 -0
  127. package/dist/types/rsc-disabled/rscDisabledRuntimeError.d.ts +1 -0
  128. package/dist/types/rsc-disabled/rscDisabledServerEdgeRuntime.d.ts +15 -0
  129. package/dist/types/rsc-disabled/rscDisabledServerNodeRuntime.d.ts +17 -0
  130. package/dist/types/runtimeContextProjection.d.ts +30 -0
  131. package/dist/types/server-config/bffRuntime.d.ts +122 -0
  132. package/dist/types/server-config/index.d.ts +2 -0
  133. package/dist/types/server-config/serverTelemetry.d.ts +322 -0
  134. package/dist/types/workspaceEvents.d.ts +62 -0
  135. package/package.json +238 -13
  136. package/rslib.config.mts +17 -2
  137. package/rstest.config.mts +33 -2
  138. package/src/buildIdentity.ts +61 -0
  139. package/src/contextExtensions.ts +81 -0
  140. package/src/headRuntime.tsx +77 -0
  141. package/src/helmetContext.ts +31 -0
  142. package/src/index.ts +2 -0
  143. package/src/localisedLoaderIdentity.ts +30 -0
  144. package/src/prefetchPolicy.ts +33 -0
  145. package/src/reactContext.ts +16 -0
  146. package/src/request-policy/browser.ts +22 -0
  147. package/src/request-policy/client.ts +404 -0
  148. package/src/request-policy/node.ts +41 -0
  149. package/src/request-policy/policyCore.ts +424 -0
  150. package/src/request-policy/requestContext.ts +149 -0
  151. package/src/request-policy/traceparent.ts +43 -0
  152. package/src/request-policy/transport.ts +349 -0
  153. package/src/request-policy/types.ts +229 -0
  154. package/src/routeHydration.ts +208 -0
  155. package/src/routerPrefetchPolicy.ts +195 -0
  156. package/src/routerProvider.ts +340 -0
  157. package/src/routerState.ts +208 -0
  158. package/src/routerStatePlugin.ts +86 -0
  159. package/src/routerStateTypes.ts +46 -0
  160. package/src/rsc-disabled/rscDisabledClientBrowserRuntime.ts +10 -0
  161. package/src/rsc-disabled/rscDisabledClientEdgeRuntime.ts +8 -0
  162. package/src/rsc-disabled/rscDisabledClientNodeRuntime.ts +9 -0
  163. package/src/rsc-disabled/rscDisabledRuntimeError.ts +3 -0
  164. package/src/rsc-disabled/rscDisabledServerEdgeRuntime.ts +16 -0
  165. package/src/rsc-disabled/rscDisabledServerNodeRuntime.ts +18 -0
  166. package/src/runtimeContextProjection.ts +105 -0
  167. package/src/server-config/bffRuntime.ts +136 -0
  168. package/src/server-config/index.ts +2 -0
  169. package/src/server-config/serverTelemetry.ts +337 -0
  170. package/src/shellStream.ts +55 -25
  171. package/src/workspaceEvents.ts +324 -0
  172. package/tests/buildIdentity.test.ts +70 -0
  173. package/tests/contextExtensions.test.ts +71 -0
  174. package/tests/headRuntime.test.tsx +369 -0
  175. package/tests/nativeSafeFailureCompatibility.test.ts +117 -0
  176. package/tests/prefetchPolicy.test.ts +51 -0
  177. package/tests/rendererHead.test.ts +1 -72
  178. package/tests/request-policy/browser-policy.test.ts +608 -0
  179. package/tests/request-policy/client-isolation.test.ts +149 -0
  180. package/tests/request-policy/identityBinding.test.ts +75 -0
  181. package/tests/request-policy/node-policy.test.ts +741 -0
  182. package/tests/request-policy/policyCore.test.ts +250 -0
  183. package/tests/request-policy/requestContext.test.ts +80 -0
  184. package/tests/request-policy/requestFactory.outbound-contract.test.ts +691 -0
  185. package/tests/request-policy/traceparent.test.ts +55 -0
  186. package/tests/request-policy/transport-retry.test.ts +370 -0
  187. package/tests/routeHydration.test.ts +180 -0
  188. package/tests/routerPrefetchPolicy.test.ts +102 -0
  189. package/tests/routerProvider.test.ts +38 -0
  190. package/tests/routerState.test.ts +157 -0
  191. package/tests/routerStatePlugin.test.ts +108 -0
  192. package/tests/runtimeContextProjection.test.ts +135 -0
  193. package/tests/shellStream.test.ts +37 -0
  194. package/tests/workspaceEvents.test.ts +391 -0
  195. package/dist/cjs/rscHtmlStream.js +0 -128
  196. package/dist/esm/rscHtmlStream.mjs +0 -86
  197. package/dist/esm-node/rscHtmlStream.mjs +0 -87
  198. package/dist/types/rscHtmlStream.d.ts +0 -4
  199. package/src/rscHtmlStream.ts +0 -142
  200. package/tests/rscHtmlStream.test.ts +0 -153
@@ -1,4 +0,0 @@
1
- export declare const RSC_HTML_CLOSING_TAIL_LIMIT: number;
2
- export declare function injectRSCPayload(rscStream: ReadableStream<Uint8Array>, { injectClosingTags }?: {
3
- injectClosingTags?: boolean;
4
- }): TransformStream<Uint8Array, Uint8Array>;
@@ -1,142 +0,0 @@
1
- /**
2
- * Forked and modified from https://github.com/devongovett/rsc-html-stream.
3
- * License: https://github.com/devongovett/rsc-html-stream/blob/main/LICENSE
4
- */
5
- const encoder = new TextEncoder();
6
- const closingTagsPattern = /<\/body>\s*<\/html>\s*$/i;
7
- const closingTagsPrefixPattern =
8
- /(?:<\/body>\s*(?:<\/html>\s*|<\/h(?:t(?:m(?:l>?)?)?)?|<\/?|<)?|<\/b(?:o(?:d(?:y>?)?)?)?|<\/?|<[^>]*)$/i;
9
-
10
- export const RSC_HTML_CLOSING_TAIL_LIMIT = 8 * 1024;
11
-
12
- export function injectRSCPayload(
13
- rscStream: ReadableStream<Uint8Array>,
14
- { injectClosingTags = true }: { injectClosingTags?: boolean } = {},
15
- ): TransformStream<Uint8Array, Uint8Array> {
16
- const decoder = new TextDecoder();
17
- let retainedTail = '';
18
- let committedClosingBody = false;
19
- let committedHtmlClose = false;
20
- let committedProbe = '';
21
- let flightPromise: Promise<void> | undefined;
22
-
23
- const startFlight = (
24
- controller: TransformStreamDefaultController<Uint8Array>,
25
- ) => {
26
- if (!flightPromise) {
27
- flightPromise = writeRSCStream(rscStream, controller);
28
- void flightPromise.catch(error => controller.error(error));
29
- }
30
- return flightPromise;
31
- };
32
-
33
- const enqueueHtml = (
34
- value: string,
35
- controller: TransformStreamDefaultController<Uint8Array>,
36
- ) => {
37
- if (value) {
38
- controller.enqueue(encoder.encode(value));
39
- }
40
- };
41
-
42
- const processHtml = async (
43
- value: string,
44
- controller: TransformStreamDefaultController<Uint8Array>,
45
- ) => {
46
- if (!value) {
47
- return;
48
- }
49
-
50
- if (committedClosingBody) {
51
- const probe = committedProbe + value;
52
- committedHtmlClose ||= /<\/html>/i.test(probe);
53
- committedProbe = probe.slice(-6);
54
- enqueueHtml(value, controller);
55
- return;
56
- }
57
-
58
- const html = retainedTail + value;
59
- retainedTail = '';
60
- const suffix = html.match(closingTagsPrefixPattern)?.[0] ?? '';
61
- const prefix = suffix ? html.slice(0, -suffix.length) : html;
62
- enqueueHtml(prefix, controller);
63
-
64
- if (!suffix) {
65
- void startFlight(controller);
66
- return;
67
- }
68
- if (suffix.length <= RSC_HTML_CLOSING_TAIL_LIMIT) {
69
- retainedTail = suffix;
70
- return;
71
- }
72
-
73
- await startFlight(controller);
74
- if (/<\/body>/i.test(suffix)) {
75
- committedClosingBody = true;
76
- committedHtmlClose = /<\/html>/i.test(suffix);
77
- committedProbe = suffix.slice(-6);
78
- }
79
- enqueueHtml(suffix, controller);
80
- };
81
-
82
- return new TransformStream({
83
- async transform(chunk, controller) {
84
- await processHtml(decoder.decode(chunk, { stream: true }), controller);
85
- },
86
- async flush(controller) {
87
- await processHtml(decoder.decode(), controller);
88
- await startFlight(controller);
89
-
90
- const retainedClosingTags = closingTagsPattern.test(retainedTail);
91
- enqueueHtml(retainedTail, controller);
92
- if (!injectClosingTags) {
93
- return;
94
- }
95
- if (committedClosingBody) {
96
- if (!committedHtmlClose) {
97
- enqueueHtml('</html>', controller);
98
- }
99
- } else if (!retainedClosingTags) {
100
- enqueueHtml('</body></html>', controller);
101
- }
102
- },
103
- });
104
- }
105
-
106
- async function writeRSCStream(
107
- rscStream: ReadableStream<Uint8Array>,
108
- controller: TransformStreamDefaultController<Uint8Array>,
109
- ): Promise<void> {
110
- const decoder = new TextDecoder('utf-8', { fatal: true });
111
- for await (const chunk of rscStream) {
112
- try {
113
- writeChunk(
114
- JSON.stringify(decoder.decode(chunk, { stream: true })),
115
- controller,
116
- );
117
- } catch {
118
- const base64 = JSON.stringify(btoa(String.fromCodePoint(...chunk)));
119
- writeChunk(
120
- `Uint8Array.from(atob(${base64}), m => m.codePointAt(0))`,
121
- controller,
122
- );
123
- }
124
- }
125
-
126
- const remaining = decoder.decode();
127
- if (remaining) {
128
- writeChunk(JSON.stringify(remaining), controller);
129
- }
130
- }
131
-
132
- function writeChunk(
133
- chunk: string,
134
- controller: TransformStreamDefaultController<Uint8Array>,
135
- ) {
136
- const script = `(self.__FLIGHT_DATA||=[]).push(${chunk})`;
137
- controller.enqueue(
138
- encoder.encode(
139
- `<script>${script.replace(/<!--/g, '<\\!--').replace(/<\/(script)/gi, '</\\$1')}</script>`,
140
- ),
141
- );
142
- }
@@ -1,153 +0,0 @@
1
- import {
2
- injectRSCPayload,
3
- RSC_HTML_CLOSING_TAIL_LIMIT,
4
- } from '../src/rscHtmlStream';
5
-
6
- const encoder = new TextEncoder();
7
- const flight = '<script>(self.__FLIGHT_DATA||=[]).push("payload")</script>';
8
-
9
- async function readStream(stream: ReadableStream<Uint8Array>) {
10
- const reader = stream.getReader();
11
- const decoder = new TextDecoder();
12
- let value = '';
13
- for (;;) {
14
- const result = await reader.read();
15
- if (result.done) {
16
- return value + decoder.decode();
17
- }
18
- value += decoder.decode(result.value, { stream: true });
19
- }
20
- }
21
-
22
- describe('injectRSCPayload', () => {
23
- test('backpressures at the retained-tail limit and conserves the trailer', async () => {
24
- let rscController!: ReadableStreamDefaultController<Uint8Array>;
25
- const rscStream = new ReadableStream<Uint8Array>({
26
- start(controller) {
27
- rscController = controller;
28
- },
29
- });
30
- const transform = injectRSCPayload(rscStream);
31
- const output = readStream(transform.readable);
32
- const writer = transform.writable.getWriter();
33
-
34
- const retainedWhitespace = ' '.repeat(
35
- RSC_HTML_CLOSING_TAIL_LIMIT - '</body>'.length,
36
- );
37
- await writer.write(encoder.encode(`<body>x</body>${retainedWhitespace}`));
38
-
39
- let overflowSettled = false;
40
- const overflow = writer.write(encoder.encode(' ')).then(() => {
41
- overflowSettled = true;
42
- });
43
- await new Promise(resolve => setTimeout(resolve, 20));
44
- expect(overflowSettled).toBe(false);
45
-
46
- rscController.enqueue(encoder.encode('payload'));
47
- rscController.close();
48
- await overflow;
49
- await writer.write(encoder.encode('</html>'));
50
- await writer.close();
51
-
52
- const spaces = `${retainedWhitespace} `;
53
- expect(await output).toBe(`<body>x${flight}</body>${spaces}</html>`);
54
- });
55
-
56
- test('does not let flight overtake any split of an ordinary html tag', async () => {
57
- const tag = '<span class="ordinary">';
58
-
59
- for (let split = 1; split < tag.length; split++) {
60
- const rscStream = new ReadableStream<Uint8Array>({
61
- start(controller) {
62
- controller.enqueue(encoder.encode('payload'));
63
- controller.close();
64
- },
65
- });
66
- const transform = injectRSCPayload(rscStream);
67
- const output = readStream(transform.readable);
68
- const writer = transform.writable.getWriter();
69
-
70
- await writer.write(encoder.encode(`<body>x${tag.slice(0, split)}`));
71
- await writer.write(
72
- encoder.encode(`${tag.slice(split)}y</span></body></html>`),
73
- );
74
- await writer.close();
75
-
76
- expect(await output, `split after ${tag.slice(0, split)}`).toBe(
77
- `<body>x${tag}y</span>${flight}</body></html>`,
78
- );
79
- }
80
- });
81
-
82
- test('conserves multi-chunk html and orders every flight chunk before the trailer', async () => {
83
- let rscController!: ReadableStreamDefaultController<Uint8Array>;
84
- const rscStream = new ReadableStream<Uint8Array>({
85
- start(controller) {
86
- rscController = controller;
87
- },
88
- });
89
- const transform = injectRSCPayload(rscStream);
90
- const output = readStream(transform.readable);
91
- const writer = transform.writable.getWriter();
92
- const unicode = encoder.encode('–');
93
-
94
- await writer.write(encoder.encode('<html><body><main>first'));
95
- await writer.write(unicode.slice(0, 1));
96
- await writer.write(unicode.slice(1));
97
- await writer.write(encoder.encode('middle</main></bo'));
98
- await writer.write(encoder.encode('dy></ht'));
99
- await writer.write(encoder.encode('ml>'));
100
-
101
- rscController.enqueue(encoder.encode('first'));
102
- rscController.enqueue(encoder.encode('second'));
103
- rscController.close();
104
- await writer.close();
105
-
106
- expect(await output).toBe(
107
- '<html><body><main>first–middle</main>' +
108
- '<script>(self.__FLIGHT_DATA||=[]).push("first")</script>' +
109
- '<script>(self.__FLIGHT_DATA||=[]).push("second")</script>' +
110
- '</body></html>',
111
- );
112
- });
113
-
114
- test('does not truncate or inject inside an over-limit ordinary tag', async () => {
115
- const attribute = 'x'.repeat(RSC_HTML_CLOSING_TAIL_LIMIT);
116
- const partialTag = `<div data-value="${attribute}"`;
117
- const rscStream = new ReadableStream<Uint8Array>({
118
- start(controller) {
119
- controller.enqueue(encoder.encode('payload'));
120
- controller.close();
121
- },
122
- });
123
- const transform = injectRSCPayload(rscStream);
124
- const output = readStream(transform.readable);
125
- const writer = transform.writable.getWriter();
126
-
127
- await writer.write(encoder.encode(`<body>x${partialTag}`));
128
- await writer.write(encoder.encode('>y</div></body></html>'));
129
- await writer.close();
130
-
131
- expect(await output).toBe(
132
- `<body>x${flight}${partialTag}>y</div></body></html>`,
133
- );
134
- });
135
-
136
- test('propagates flight errors without publishing a synthetic trailer', async () => {
137
- let rscController!: ReadableStreamDefaultController<Uint8Array>;
138
- const failure = new Error('flight failed');
139
- const rscStream = new ReadableStream<Uint8Array>({
140
- start(controller) {
141
- rscController = controller;
142
- },
143
- });
144
- const transform = injectRSCPayload(rscStream);
145
- const output = readStream(transform.readable);
146
- const writer = transform.writable.getWriter();
147
-
148
- await writer.write(encoder.encode('<body>html</body></html>'));
149
- rscController.error(failure);
150
-
151
- await expect(Promise.all([writer.close(), output])).rejects.toBe(failure);
152
- });
153
- });