diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index 3d8980b24e359b..a718e5404e94cb 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -809,11 +809,7 @@ class ReadableStreamDefaultReader { throw new ERR_INVALID_THIS('ReadableStreamDefaultReader'); if (this[kState].stream === undefined) return; - if (this[kState].readRequests.length) { - throw new ERR_INVALID_STATE.TypeError( - 'Cannot release with pending read requests'); - } - readableStreamReaderGenericRelease(this); + readableStreamDefaultReaderRelease(this); } /** @@ -930,11 +926,7 @@ class ReadableStreamBYOBReader { throw new ERR_INVALID_THIS('ReadableStreamBYOBReader'); if (this[kState].stream === undefined) return; - if (this[kState].readIntoRequests.length) { - throw new ERR_INVALID_STATE.TypeError( - 'Cannot release with pending read requests'); - } - readableStreamReaderGenericRelease(this); + readableStreamBYOBReaderRelease(this); } /** @@ -1730,6 +1722,36 @@ function readableStreamReaderGenericInitialize(reader, stream) { } } +function readableStreamDefaultReaderRelease(reader) { + readableStreamReaderGenericRelease(reader); + readableStreamDefaultReaderErrorReadRequests( + reader, + new ERR_INVALID_STATE.TypeError('Releasing reader') + ); +} + +function readableStreamDefaultReaderErrorReadRequests(reader, e) { + for (let n = 0; n < reader[kState].readRequests.length; ++n) { + reader[kState].readRequests[n][kError](e); + } + reader[kState].readRequests = []; +} + +function readableStreamBYOBReaderRelease(reader) { + readableStreamReaderGenericRelease(reader); + readableStreamBYOBReaderErrorReadIntoRequests( + reader, + new ERR_INVALID_STATE.TypeError('Releasing reader') + ); +} + +function readableStreamBYOBReaderErrorReadIntoRequests(reader, e) { + for (let n = 0; n < reader[kState].readIntoRequests.length; ++n) { + reader[kState].readIntoRequests[n][kError](e); + } + reader[kState].readIntoRequests = []; +} + function readableStreamReaderGenericRelease(reader) { const { stream, diff --git a/test/parallel/test-whatwg-readablestream.js b/test/parallel/test-whatwg-readablestream.js index 9f1cfc60e9a28b..7f5880939354f7 100644 --- a/test/parallel/test-whatwg-readablestream.js +++ b/test/parallel/test-whatwg-readablestream.js @@ -328,17 +328,8 @@ assert.throws(() => { const read1 = reader.read(); const read2 = reader.read(); - // The stream is empty so the read will never settle. - read1.then( - common.mustNotCall(), - common.mustNotCall() - ); - - // The stream is empty so the read will never settle. - read2.then( - common.mustNotCall(), - common.mustNotCall() - ); + read1.then(common.mustNotCall(), common.mustCall()); + read2.then(common.mustNotCall(), common.mustCall()); assert.notStrictEqual(read1, read2); @@ -346,10 +337,9 @@ assert.throws(() => { delay().then(common.mustCall()); - assert.throws(() => reader.releaseLock(), { - code: 'ERR_INVALID_STATE', - }); assert(stream.locked); + reader.releaseLock(); + assert(!stream.locked); } { diff --git a/test/wpt/status/streams.json b/test/wpt/status/streams.json index a0b258c4325b4a..7f76e697a648a9 100644 --- a/test/wpt/status/streams.json +++ b/test/wpt/status/streams.json @@ -31,9 +31,6 @@ "readable-byte-streams/general.any.js": { "fail": { "expected": [ - "ReadableStream with byte source: releaseLock() on ReadableStreamDefaultReader must reject pending read()", - "ReadableStream with byte source: releaseLock() on ReadableStreamBYOBReader must reject pending read()", - "pull() resolving should not resolve read()", "ReadableStream with byte source: enqueue() discards auto-allocated BYOB request", "ReadableStream with byte source: releaseLock() with pending read(view), read(view) on second reader, respond()", "ReadableStream with byte source: releaseLock() with pending read(view), read(view) on second reader with 1 element Uint16Array, respond(1)", @@ -87,20 +84,6 @@ "readable-streams/cross-realm-crash.window.js": { "skip": "Browser-specific test" }, - "readable-streams/default-reader.any.js": { - "fail": { - "expected": [ - "Second reader can read chunks after first reader was released with pending read requests" - ] - } - }, - "readable-streams/templated.any.js": { - "fail": { - "expected": [ - "ReadableStream (empty) reader: releasing the lock should reject all pending read requests" - ] - } - }, "transferable/deserialize-error.window.js": { "skip": "Browser-specific test" },