Skip to content

Commit b374345

Browse files
Fix stream demos on iOS Safari (#8613)
1 parent 5b3692a commit b374345

4 files changed

Lines changed: 51 additions & 11 deletions

File tree

src/content/reference/react-dom/browser.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,17 @@ renderButton.addEventListener('click', () => {
136136
export async function flushReadableStreamToFrame(readable, frame) {
137137
const doc = frame.contentWindow.document;
138138
const decoder = new TextDecoder();
139-
for await (const chunk of readable) {
140-
doc.write(decoder.decode(chunk, { stream: true }));
139+
const reader = readable.getReader();
140+
141+
while (true) {
142+
const {done, value} = await reader.read();
143+
if (done) {
144+
break;
145+
}
146+
doc.write(decoder.decode(value, {stream: true}));
141147
}
148+
149+
doc.write(decoder.decode());
142150
doc.close();
143151
}
144152
```

src/content/reference/react-dom/server/resume.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,18 @@ main(document.getElementById("container"));
202202
export async function flushReadableStreamToFrame(readable, frame) {
203203
const document = frame.contentWindow.document;
204204
const decoder = new TextDecoder();
205-
for await (const chunk of readable) {
206-
const partialHTML = decoder.decode(chunk);
205+
const reader = readable.getReader();
206+
207+
while (true) {
208+
const {done, value} = await reader.read();
209+
if (done) {
210+
break;
211+
}
212+
const partialHTML = decoder.decode(value, {stream: true});
207213
document.write(partialHTML);
208214
}
215+
216+
document.write(decoder.decode());
209217
}
210218

211219
// This doesn't need to be an error.
@@ -234,4 +242,4 @@ export function sleep(timeoutMS) {
234242
### Further reading {/*further-reading*/}
235243
236244
Resuming behaves like `renderToReadableStream`. For more examples, check out the [usage section of `renderToReadableStream`](/reference/react-dom/server/renderToReadableStream#usage).
237-
The [usage section of `prerender`](/reference/react-dom/static/prerender#usage) includes examples of how to use `prerender` specifically.
245+
The [usage section of `prerender`](/reference/react-dom/static/prerender#usage) includes examples of how to use `prerender` specifically.

src/content/reference/react/Suspense.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -472,9 +472,17 @@ document.getElementById('render').addEventListener('click', () => {
472472
export async function flushReadableStreamToFrame(readable, frame) {
473473
const doc = frame.contentWindow.document;
474474
const decoder = new TextDecoder();
475-
for await (const chunk of readable) {
476-
doc.write(decoder.decode(chunk, { stream: true }));
475+
const reader = readable.getReader();
476+
477+
while (true) {
478+
const {done, value} = await reader.read();
479+
if (done) {
480+
break;
481+
}
482+
doc.write(decoder.decode(value, {stream: true}));
477483
}
484+
485+
doc.write(decoder.decode());
478486
doc.close();
479487
}
480488
```
@@ -2445,9 +2453,17 @@ renderButton.addEventListener('click', () => {
24452453
export async function flushReadableStreamToFrame(readable, frame) {
24462454
const doc = frame.contentWindow.document;
24472455
const decoder = new TextDecoder();
2448-
for await (const chunk of readable) {
2449-
doc.write(decoder.decode(chunk, { stream: true }));
2456+
const reader = readable.getReader();
2457+
2458+
while (true) {
2459+
const {done, value} = await reader.read();
2460+
if (done) {
2461+
break;
2462+
}
2463+
doc.write(decoder.decode(value, {stream: true}));
24502464
}
2465+
2466+
doc.write(decoder.decode());
24512467
doc.close();
24522468
}
24532469
```

src/content/reference/react/use.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,9 +1399,17 @@ renderButton.addEventListener('click', () => {
13991399
export async function flushReadableStreamToFrame(readable, frame) {
14001400
const doc = frame.contentWindow.document;
14011401
const decoder = new TextDecoder();
1402-
for await (const chunk of readable) {
1403-
doc.write(decoder.decode(chunk, { stream: true }));
1402+
const reader = readable.getReader();
1403+
1404+
while (true) {
1405+
const {done, value} = await reader.read();
1406+
if (done) {
1407+
break;
1408+
}
1409+
doc.write(decoder.decode(value, {stream: true}));
14041410
}
1411+
1412+
doc.write(decoder.decode());
14051413
doc.close();
14061414
}
14071415
```

0 commit comments

Comments
 (0)