stream: fix ReadableStreamReader.releaseLock()
Signed-off-by: Daeyeon Jeong daeyeon.dev@gmail.com PR-URL: https://github.com/nodejs/node/pull/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>
This commit is contained in:
parent
5a40b074ab
commit
cc75a3c11e
@ -809,11 +809,7 @@ class ReadableStreamDefaultReader {
|
|||||||
throw new ERR_INVALID_THIS('ReadableStreamDefaultReader');
|
throw new ERR_INVALID_THIS('ReadableStreamDefaultReader');
|
||||||
if (this[kState].stream === undefined)
|
if (this[kState].stream === undefined)
|
||||||
return;
|
return;
|
||||||
if (this[kState].readRequests.length) {
|
readableStreamDefaultReaderRelease(this);
|
||||||
throw new ERR_INVALID_STATE.TypeError(
|
|
||||||
'Cannot release with pending read requests');
|
|
||||||
}
|
|
||||||
readableStreamReaderGenericRelease(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -930,11 +926,7 @@ class ReadableStreamBYOBReader {
|
|||||||
throw new ERR_INVALID_THIS('ReadableStreamBYOBReader');
|
throw new ERR_INVALID_THIS('ReadableStreamBYOBReader');
|
||||||
if (this[kState].stream === undefined)
|
if (this[kState].stream === undefined)
|
||||||
return;
|
return;
|
||||||
if (this[kState].readIntoRequests.length) {
|
readableStreamBYOBReaderRelease(this);
|
||||||
throw new ERR_INVALID_STATE.TypeError(
|
|
||||||
'Cannot release with pending read requests');
|
|
||||||
}
|
|
||||||
readableStreamReaderGenericRelease(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) {
|
function readableStreamReaderGenericRelease(reader) {
|
||||||
const {
|
const {
|
||||||
stream,
|
stream,
|
||||||
|
@ -328,17 +328,8 @@ assert.throws(() => {
|
|||||||
const read1 = reader.read();
|
const read1 = reader.read();
|
||||||
const read2 = reader.read();
|
const read2 = reader.read();
|
||||||
|
|
||||||
// The stream is empty so the read will never settle.
|
read1.then(common.mustNotCall(), common.mustCall());
|
||||||
read1.then(
|
read2.then(common.mustNotCall(), common.mustCall());
|
||||||
common.mustNotCall(),
|
|
||||||
common.mustNotCall()
|
|
||||||
);
|
|
||||||
|
|
||||||
// The stream is empty so the read will never settle.
|
|
||||||
read2.then(
|
|
||||||
common.mustNotCall(),
|
|
||||||
common.mustNotCall()
|
|
||||||
);
|
|
||||||
|
|
||||||
assert.notStrictEqual(read1, read2);
|
assert.notStrictEqual(read1, read2);
|
||||||
|
|
||||||
@ -346,10 +337,9 @@ assert.throws(() => {
|
|||||||
|
|
||||||
delay().then(common.mustCall());
|
delay().then(common.mustCall());
|
||||||
|
|
||||||
assert.throws(() => reader.releaseLock(), {
|
|
||||||
code: 'ERR_INVALID_STATE',
|
|
||||||
});
|
|
||||||
assert(stream.locked);
|
assert(stream.locked);
|
||||||
|
reader.releaseLock();
|
||||||
|
assert(!stream.locked);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -31,9 +31,6 @@
|
|||||||
"readable-byte-streams/general.any.js": {
|
"readable-byte-streams/general.any.js": {
|
||||||
"fail": {
|
"fail": {
|
||||||
"expected": [
|
"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: 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, respond()",
|
||||||
"ReadableStream with byte source: releaseLock() with pending read(view), read(view) on second reader with 1 element Uint16Array, respond(1)",
|
"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": {
|
"readable-streams/cross-realm-crash.window.js": {
|
||||||
"skip": "Browser-specific test"
|
"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": {
|
"transferable/deserialize-error.window.js": {
|
||||||
"skip": "Browser-specific test"
|
"skip": "Browser-specific test"
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user