Skip to content

Commit 0e52836

Browse files
authored
stream: set stream prototype to closest transferable superclass
PR-URL: #55067 Fixes: #54603 Refs: #50107 Reviewed-By: Mattias Buelens <mattias@buelens.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
1 parent 0257102 commit 0e52836

File tree

4 files changed

+20
-0
lines changed

4 files changed

+20
-0
lines changed

lib/internal/webstreams/readablestream.js

+3
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,7 @@ ObjectDefineProperties(ReadableStream, {
639639
});
640640

641641
function InternalTransferredReadableStream() {
642+
ObjectSetPrototypeOf(this, ReadableStream.prototype);
642643
markTransferMode(this, false, true);
643644
this[kType] = 'ReadableStream';
644645
this[kState] = createReadableStreamState();
@@ -1226,6 +1227,7 @@ ObjectDefineProperties(ReadableByteStreamController.prototype, {
12261227
});
12271228

12281229
function InternalReadableStream(start, pull, cancel, highWaterMark, size) {
1230+
ObjectSetPrototypeOf(this, ReadableStream.prototype);
12291231
markTransferMode(this, false, true);
12301232
this[kType] = 'ReadableStream';
12311233
this[kState] = createReadableStreamState();
@@ -1253,6 +1255,7 @@ function createReadableStream(start, pull, cancel, highWaterMark = 1, size = ()
12531255
}
12541256

12551257
function InternalReadableByteStream(start, pull, cancel) {
1258+
ObjectSetPrototypeOf(this, ReadableStream.prototype);
12561259
markTransferMode(this, false, true);
12571260
this[kType] = 'ReadableStream';
12581261
this[kState] = createReadableStreamState();

lib/internal/webstreams/transformstream.js

+1
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ ObjectDefineProperties(TransformStream.prototype, {
256256
});
257257

258258
function InternalTransferredTransformStream() {
259+
ObjectSetPrototypeOf(this, TransformStream.prototype);
259260
markTransferMode(this, false, true);
260261
this[kType] = 'TransformStream';
261262
this[kState] = {

lib/internal/webstreams/writablestream.js

+2
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ ObjectDefineProperties(WritableStream.prototype, {
300300
});
301301

302302
function InternalTransferredWritableStream() {
303+
ObjectSetPrototypeOf(this, WritableStream.prototype);
303304
markTransferMode(this, false, true);
304305
this[kType] = 'WritableStream';
305306
this[kState] = createWritableStreamState();
@@ -516,6 +517,7 @@ ObjectDefineProperties(WritableStreamDefaultController.prototype, {
516517
});
517518

518519
function InternalWritableStream(start, write, close, abort, highWaterMark, size) {
520+
ObjectSetPrototypeOf(this, WritableStream.prototype);
519521
markTransferMode(this, false, true);
520522
this[kType] = 'WritableStream';
521523
this[kState] = createWritableStreamState();

test/parallel/test-structuredClone-global.js

+14
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ assert.strictEqual(structuredClone(undefined, null), undefined);
1616
assert.strictEqual(structuredClone(undefined, { transfer: null }), undefined);
1717
assert.strictEqual(structuredClone(undefined, { }), undefined);
1818

19+
// Transferables or its subclasses should be received with its closest transferable superclass
20+
for (const StreamClass of [ReadableStream, WritableStream, TransformStream]) {
21+
const original = new StreamClass();
22+
const transfer = structuredClone(original, { transfer: [original] });
23+
assert.strictEqual(Object.getPrototypeOf(transfer), StreamClass.prototype);
24+
assert.ok(transfer instanceof StreamClass);
25+
26+
const extended = class extends StreamClass {};
27+
const extendedOriginal = new extended();
28+
const extendedTransfer = structuredClone(extendedOriginal, { transfer: [extendedOriginal] });
29+
assert.strictEqual(Object.getPrototypeOf(extendedTransfer), StreamClass.prototype);
30+
assert.ok(extendedTransfer instanceof StreamClass);
31+
}
32+
1933
{
2034
// See: https://github.com/nodejs/node/issues/49940
2135
const cloned = structuredClone({}, {

0 commit comments

Comments
 (0)