Skip to content

Commit 65134d6

Browse files
daeyeonRafaelGSS
authored andcommitted
stream: fix ReadableStreamReader.releaseLock()
Signed-off-by: Daeyeon Jeong daeyeon.dev@gmail.com PR-URL: #44292 Refs: https://streams.spec.whatwg.org/#default-reader-release-lock Refs: https://streams.spec.whatwg.org/#byob-reader-release-lock Refs: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/releaseLock Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
1 parent 21437f7 commit 65134d6

File tree

3 files changed

+36
-41
lines changed

3 files changed

+36
-41
lines changed

lib/internal/webstreams/readablestream.js

+32-10
Original file line numberDiff line numberDiff line change
@@ -809,11 +809,7 @@ class ReadableStreamDefaultReader {
809809
throw new ERR_INVALID_THIS('ReadableStreamDefaultReader');
810810
if (this[kState].stream === undefined)
811811
return;
812-
if (this[kState].readRequests.length) {
813-
throw new ERR_INVALID_STATE.TypeError(
814-
'Cannot release with pending read requests');
815-
}
816-
readableStreamReaderGenericRelease(this);
812+
readableStreamDefaultReaderRelease(this);
817813
}
818814

819815
/**
@@ -930,11 +926,7 @@ class ReadableStreamBYOBReader {
930926
throw new ERR_INVALID_THIS('ReadableStreamBYOBReader');
931927
if (this[kState].stream === undefined)
932928
return;
933-
if (this[kState].readIntoRequests.length) {
934-
throw new ERR_INVALID_STATE.TypeError(
935-
'Cannot release with pending read requests');
936-
}
937-
readableStreamReaderGenericRelease(this);
929+
readableStreamBYOBReaderRelease(this);
938930
}
939931

940932
/**
@@ -1730,6 +1722,36 @@ function readableStreamReaderGenericInitialize(reader, stream) {
17301722
}
17311723
}
17321724

1725+
function readableStreamDefaultReaderRelease(reader) {
1726+
readableStreamReaderGenericRelease(reader);
1727+
readableStreamDefaultReaderErrorReadRequests(
1728+
reader,
1729+
new ERR_INVALID_STATE.TypeError('Releasing reader')
1730+
);
1731+
}
1732+
1733+
function readableStreamDefaultReaderErrorReadRequests(reader, e) {
1734+
for (let n = 0; n < reader[kState].readRequests.length; ++n) {
1735+
reader[kState].readRequests[n][kError](e);
1736+
}
1737+
reader[kState].readRequests = [];
1738+
}
1739+
1740+
function readableStreamBYOBReaderRelease(reader) {
1741+
readableStreamReaderGenericRelease(reader);
1742+
readableStreamBYOBReaderErrorReadIntoRequests(
1743+
reader,
1744+
new ERR_INVALID_STATE.TypeError('Releasing reader')
1745+
);
1746+
}
1747+
1748+
function readableStreamBYOBReaderErrorReadIntoRequests(reader, e) {
1749+
for (let n = 0; n < reader[kState].readIntoRequests.length; ++n) {
1750+
reader[kState].readIntoRequests[n][kError](e);
1751+
}
1752+
reader[kState].readIntoRequests = [];
1753+
}
1754+
17331755
function readableStreamReaderGenericRelease(reader) {
17341756
const {
17351757
stream,

test/parallel/test-whatwg-readablestream.js

+4-14
Original file line numberDiff line numberDiff line change
@@ -328,28 +328,18 @@ assert.throws(() => {
328328
const read1 = reader.read();
329329
const read2 = reader.read();
330330

331-
// The stream is empty so the read will never settle.
332-
read1.then(
333-
common.mustNotCall(),
334-
common.mustNotCall()
335-
);
336-
337-
// The stream is empty so the read will never settle.
338-
read2.then(
339-
common.mustNotCall(),
340-
common.mustNotCall()
341-
);
331+
read1.then(common.mustNotCall(), common.mustCall());
332+
read2.then(common.mustNotCall(), common.mustCall());
342333

343334
assert.notStrictEqual(read1, read2);
344335

345336
assert.strictEqual(reader[kState].readRequests.length, 2);
346337

347338
delay().then(common.mustCall());
348339

349-
assert.throws(() => reader.releaseLock(), {
350-
code: 'ERR_INVALID_STATE',
351-
});
352340
assert(stream.locked);
341+
reader.releaseLock();
342+
assert(!stream.locked);
353343
}
354344

355345
{

test/wpt/status/streams.json

-17
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@
3131
"readable-byte-streams/general.any.js": {
3232
"fail": {
3333
"expected": [
34-
"ReadableStream with byte source: releaseLock() on ReadableStreamDefaultReader must reject pending read()",
35-
"ReadableStream with byte source: releaseLock() on ReadableStreamBYOBReader must reject pending read()",
36-
"pull() resolving should not resolve read()",
3734
"ReadableStream with byte source: enqueue() discards auto-allocated BYOB request",
3835
"ReadableStream with byte source: releaseLock() with pending read(view), read(view) on second reader, respond()",
3936
"ReadableStream with byte source: releaseLock() with pending read(view), read(view) on second reader with 1 element Uint16Array, respond(1)",
@@ -87,20 +84,6 @@
8784
"readable-streams/cross-realm-crash.window.js": {
8885
"skip": "Browser-specific test"
8986
},
90-
"readable-streams/default-reader.any.js": {
91-
"fail": {
92-
"expected": [
93-
"Second reader can read chunks after first reader was released with pending read requests"
94-
]
95-
}
96-
},
97-
"readable-streams/templated.any.js": {
98-
"fail": {
99-
"expected": [
100-
"ReadableStream (empty) reader: releasing the lock should reject all pending read requests"
101-
]
102-
}
103-
},
10487
"transferable/deserialize-error.window.js": {
10588
"skip": "Browser-specific test"
10689
},

0 commit comments

Comments
 (0)