| 100 | } |
| 101 | |
| 102 | async function prerenderHTML( |
| 103 | root: any, |
| 104 | options?: RSCToHTMLOptions |
| 105 | ): Promise<{html: Readable; rsc: Readable}> { |
| 106 | let stream = renderToReadableStream(root, options); |
| 107 | |
| 108 | // Use client react to render the RSC payload to HTML. |
| 109 | let [s1, renderStream] = stream.tee(); |
| 110 | let [injectStream, rscStream] = s1.tee(); |
| 111 | let data: Promise<ReactNode>; |
| 112 | function Content() { |
| 113 | data ??= createFromReadableStream<ReactNode>(renderStream); |
| 114 | return data; |
| 115 | } |
| 116 | |
| 117 | let {prelude} = await prerender(<Content />, { |
| 118 | ...options, |
| 119 | bootstrapScriptContent: (options?.component as any)?.bootstrapScript |
| 120 | }); |
| 121 | |
| 122 | return { |
| 123 | html: Readable.fromWeb(prelude.pipeThrough(injectRSCPayload(injectStream)) as any), |
| 124 | rsc: Readable.fromWeb(rscStream) |
| 125 | }; |
| 126 | } |