-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathcreate-html-stream.tsx
29 lines (25 loc) · 1.1 KB
/
create-html-stream.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import ReactDOMServer from 'react-dom/server.browser';
import type {SSRManifest} from 'react-server-dom-webpack';
import ReactServerDOMClient from 'react-server-dom-webpack/client.edge';
import {createBufferedTransformStream} from './create-buffered-transform-stream.js';
import {createInitialRscResponseTransformStream} from './create-initial-rsc-response-transform-stream.js';
export interface CreateHtmlStreamOptions {
readonly reactSsrManifest: SSRManifest;
readonly bootstrapScripts?: string[];
}
export async function createHtmlStream(
rscStream: ReadableStream<Uint8Array>,
options: CreateHtmlStreamOptions,
): Promise<ReadableStream<Uint8Array>> {
const {reactSsrManifest, bootstrapScripts} = options;
const [rscStream1, rscStream2] = rscStream.tee();
const htmlStream = await ReactDOMServer.renderToReadableStream(
await ReactServerDOMClient.createFromReadableStream(rscStream1, {
moduleMap: reactSsrManifest,
}),
{bootstrapScripts},
);
return htmlStream
.pipeThrough(createBufferedTransformStream())
.pipeThrough(createInitialRscResponseTransformStream(rscStream2));
}