mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00
lib: allow byob reader for 'blob.stream()'
Fixes: https://github.com/nodejs/node/issues/47993 PR-URL: https://github.com/nodejs/node/pull/49713 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
parent
9718a9465c
commit
23a3410f9f
3 changed files with 52 additions and 11 deletions
|
@ -320,6 +320,7 @@ class Blob {
|
|||
|
||||
const reader = this[kHandle].getReader();
|
||||
return new lazyReadableStream({
|
||||
type: 'bytes',
|
||||
start(c) {
|
||||
// There really should only be one read at a time so using an
|
||||
// array here is purely defensive.
|
||||
|
@ -339,6 +340,9 @@ class Blob {
|
|||
if (status === 0) {
|
||||
// EOS
|
||||
c.close();
|
||||
// This is to signal the end for byob readers
|
||||
// see https://streams.spec.whatwg.org/#example-rbs-pull
|
||||
c.byobRequest?.respond(0);
|
||||
const pending = this.pendingPulls.shift();
|
||||
pending.resolve();
|
||||
return;
|
||||
|
@ -352,13 +356,15 @@ class Blob {
|
|||
pending.reject(error);
|
||||
return;
|
||||
}
|
||||
if (buffer !== undefined) {
|
||||
// ReadableByteStreamController.enqueue errors if we submit a 0-length
|
||||
// buffer. We need to check for that here.
|
||||
if (buffer !== undefined && buffer.byteLength !== 0) {
|
||||
c.enqueue(new Uint8Array(buffer));
|
||||
}
|
||||
// We keep reading until we either reach EOS, some error, or we
|
||||
// hit the flow rate of the stream (c.desiredSize).
|
||||
queueMicrotask(() => {
|
||||
if (c.desiredSize <= 0) {
|
||||
if (c.desiredSize < 0) {
|
||||
// A manual backpressure check.
|
||||
if (this.pendingPulls.length !== 0) {
|
||||
// A case of waiting pull finished (= not yet canceled)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue