diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx index 0249862b4b25894..dd53c1d13c9d290 100644 --- a/packages/next/server/render.tsx +++ b/packages/next/server/render.tsx @@ -62,6 +62,7 @@ import { import { DomainLocale } from './config' import RenderResult, { NodeWritablePiper } from './render-result' import isError from '../lib/is-error' +import { readableStreamTee } from './web/utils' let Writable: typeof import('stream').Writable let Buffer: typeof import('buffer').Buffer @@ -293,7 +294,7 @@ function createRSCHook() { ) => { let entry = rscCache.get(id) if (!entry) { - const [renderStream, forwardStream] = req.tee() + const [renderStream, forwardStream] = readableStreamTee(req) entry = createFromReadableStream(renderStream) rscCache.set(id, entry) @@ -301,29 +302,20 @@ function createRSCHook() { start(controller) { if (bootstrap) { controller.enqueue( - ReactDOMServer.renderToString( - ` ) } }, transform(chunk, controller) { controller.enqueue( - ReactDOMServer.renderToString( - ` ) }, }) diff --git a/packages/next/server/web/utils.ts b/packages/next/server/web/utils.ts index 7829d0136039ff1..2c5dae0e83dcde8 100644 --- a/packages/next/server/web/utils.ts +++ b/packages/next/server/web/utils.ts @@ -14,6 +14,32 @@ export async function* streamToIterator( reader.releaseLock() } +export function readableStreamTee( + readable: ReadableStream +): [ReadableStream, ReadableStream] { + const transformStream = new TransformStream() + const transformStream2 = new TransformStream() + const writer = transformStream.writable.getWriter() + const writer2 = transformStream2.writable.getWriter() + + const reader = readable.getReader() + function read() { + reader.read().then(({ done, value }) => { + if (done) { + writer.close() + writer2.close() + return + } + writer.write(value) + writer2.write(value) + read() + }) + } + read() + + return [transformStream.readable, transformStream2.readable] +} + export function notImplemented(name: string, method: string): any { throw new Error( `Failed to get the '${method}' property on '${name}': the property is not implemented`