Skip to content

Commit

Permalink
Remove hacky stream.locked check, declare as byte stream instead (fac…
Browse files Browse the repository at this point in the history
…ebook#23387)

We used to check for stream.locked in pull to see if we've been passed to
something that reads yet.

This was a bad hack because it won't actually call pull again if that changes.

The source of this is because the default for "highWaterMark" is 1 on some
streams. So it always wants to add one "chunk" (of size 1).

If we leave our high water mark as 0, we won't fill up any buffers unless we're
asked for more.

This web API is somewhat odd because it would be way more efficient if it
just told us how much the recipient wants instead of calling us once per
chunk.

Anyway, I turns out that if we define ourselves as a "bytes" type of
stream, the default also happens to be a high water mark of 0 so we can
just use that instead.
  • Loading branch information
sebmarkbage authored and zhengjitf committed Apr 15, 2022
1 parent 7717c23 commit 81a5beb
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 14 deletions.
9 changes: 2 additions & 7 deletions packages/react-dom/src/server/ReactDOMFizzServerBrowser.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,9 @@ function renderToReadableStream(
return new Promise((resolve, reject) => {
function onCompleteShell() {
const stream = new ReadableStream({
type: 'bytes',
pull(controller) {
// Pull is called immediately even if the stream is not passed to anything.
// That's buffering too early. We want to start buffering once the stream
// is actually used by something so we can give it the best result possible
// at that point.
if (stream.locked) {
startFlowing(request, controller);
}
startFlowing(request, controller);
},
cancel(reason) {},
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,12 @@ function renderToReadableStream(
options ? options.onError : undefined,
);
const stream = new ReadableStream({
type: 'bytes',
start(controller) {
startWork(request);
},
pull(controller) {
// Pull is called immediately even if the stream is not passed to anything.
// That's buffering too early. We want to start buffering once the stream
// is actually used by something so we can give it the best result possible
// at that point.
if (stream.locked) {
startFlowing(request, controller);
}
startFlowing(request, controller);
},
cancel(reason) {},
});
Expand Down

0 comments on commit 81a5beb

Please sign in to comment.