Remove hacky stream.locked check, declare as byte stream instead (#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.
This commit is contained in:
Sebastian Markbåge
2022-02-28 21:35:00 -05:00
committed by GitHub
parent 086fa8ee2f
commit 75662d6a7d
2 changed files with 4 additions and 14 deletions
+2 -7
View File
@@ -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) {},
});
@@ -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) {},
});