From 9aacb4050e62a52ded87c73ce7c0db100ee879c2 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 13 Dec 2021 22:15:12 +0100 Subject: [PATCH 1/2] fix missing renderToString --- packages/next/server/render.tsx | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx index ce8044e05bea207..114d4c8bfb7b0e3 100644 --- a/packages/next/server/render.tsx +++ b/packages/next/server/render.tsx @@ -301,29 +301,20 @@ function createRSCHook() { start(controller) { if (bootstrap) { controller.enqueue( - ReactDOMServer.renderToString( - ` ) } }, transform(chunk, controller) { controller.enqueue( - ReactDOMServer.renderToString( - ` ) }, }) From f52ac0588fa4e16645e44630090e02391cbe211e Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 13 Dec 2021 22:58:52 +0100 Subject: [PATCH 2/2] workaround tee --- packages/next/server/render.tsx | 3 ++- packages/next/server/web/utils.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx index 114d4c8bfb7b0e3..b0c8ffdf77e7927 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) 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`