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`