From d3c56f9fa1320a1d7467967980bfef811d7beac6 Mon Sep 17 00:00:00 2001 From: Aurora Scharff Date: Thu, 20 Aug 2026 02:17:02 +0200 Subject: [PATCH] Fix stream demos on iOS Safari --- src/content/reference/react-dom/browser.md | 12 ++++++++-- .../reference/react-dom/server/resume.md | 14 ++++++++--- src/content/reference/react/Suspense.md | 24 +++++++++++++++---- src/content/reference/react/use.md | 12 ++++++++-- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/content/reference/react-dom/browser.md b/src/content/reference/react-dom/browser.md index 7ded671180d..88d3812837d 100644 --- a/src/content/reference/react-dom/browser.md +++ b/src/content/reference/react-dom/browser.md @@ -136,9 +136,17 @@ renderButton.addEventListener('click', () => { export async function flushReadableStreamToFrame(readable, frame) { const doc = frame.contentWindow.document; const decoder = new TextDecoder(); - for await (const chunk of readable) { - doc.write(decoder.decode(chunk, { stream: true })); + const reader = readable.getReader(); + + while (true) { + const {done, value} = await reader.read(); + if (done) { + break; + } + doc.write(decoder.decode(value, {stream: true})); } + + doc.write(decoder.decode()); doc.close(); } ``` diff --git a/src/content/reference/react-dom/server/resume.md b/src/content/reference/react-dom/server/resume.md index 4feb20d5434..52bc12ac932 100644 --- a/src/content/reference/react-dom/server/resume.md +++ b/src/content/reference/react-dom/server/resume.md @@ -202,10 +202,18 @@ main(document.getElementById("container")); export async function flushReadableStreamToFrame(readable, frame) { const document = frame.contentWindow.document; const decoder = new TextDecoder(); - for await (const chunk of readable) { - const partialHTML = decoder.decode(chunk); + const reader = readable.getReader(); + + while (true) { + const {done, value} = await reader.read(); + if (done) { + break; + } + const partialHTML = decoder.decode(value, {stream: true}); document.write(partialHTML); } + + document.write(decoder.decode()); } // This doesn't need to be an error. @@ -234,4 +242,4 @@ export function sleep(timeoutMS) { ### Further reading {/*further-reading*/} Resuming behaves like `renderToReadableStream`. For more examples, check out the [usage section of `renderToReadableStream`](/reference/react-dom/server/renderToReadableStream#usage). -The [usage section of `prerender`](/reference/react-dom/static/prerender#usage) includes examples of how to use `prerender` specifically. \ No newline at end of file +The [usage section of `prerender`](/reference/react-dom/static/prerender#usage) includes examples of how to use `prerender` specifically. diff --git a/src/content/reference/react/Suspense.md b/src/content/reference/react/Suspense.md index 7a2d161ed2d..debd74ce5f7 100644 --- a/src/content/reference/react/Suspense.md +++ b/src/content/reference/react/Suspense.md @@ -472,9 +472,17 @@ document.getElementById('render').addEventListener('click', () => { export async function flushReadableStreamToFrame(readable, frame) { const doc = frame.contentWindow.document; const decoder = new TextDecoder(); - for await (const chunk of readable) { - doc.write(decoder.decode(chunk, { stream: true })); + const reader = readable.getReader(); + + while (true) { + const {done, value} = await reader.read(); + if (done) { + break; + } + doc.write(decoder.decode(value, {stream: true})); } + + doc.write(decoder.decode()); doc.close(); } ``` @@ -2445,9 +2453,17 @@ renderButton.addEventListener('click', () => { export async function flushReadableStreamToFrame(readable, frame) { const doc = frame.contentWindow.document; const decoder = new TextDecoder(); - for await (const chunk of readable) { - doc.write(decoder.decode(chunk, { stream: true })); + const reader = readable.getReader(); + + while (true) { + const {done, value} = await reader.read(); + if (done) { + break; + } + doc.write(decoder.decode(value, {stream: true})); } + + doc.write(decoder.decode()); doc.close(); } ``` diff --git a/src/content/reference/react/use.md b/src/content/reference/react/use.md index a3bce6fd80d..d189d657c6a 100644 --- a/src/content/reference/react/use.md +++ b/src/content/reference/react/use.md @@ -1399,9 +1399,17 @@ renderButton.addEventListener('click', () => { export async function flushReadableStreamToFrame(readable, frame) { const doc = frame.contentWindow.document; const decoder = new TextDecoder(); - for await (const chunk of readable) { - doc.write(decoder.decode(chunk, { stream: true })); + const reader = readable.getReader(); + + while (true) { + const {done, value} = await reader.read(); + if (done) { + break; + } + doc.write(decoder.decode(value, {stream: true})); } + + doc.write(decoder.decode()); doc.close(); } ```