Skip to content

Commit c585a6c

Browse files
committed
PipeTo initial implementation
1 parent 5993860 commit c585a6c

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

reference-implementation/lib/abstract-ops/miscellaneous.js

+11
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,14 @@ exports.CloneAsUint8Array = O => {
2424
exports.StructuredTransferOrClone = (value, transferList) => {
2525
return globalThis.structuredClone(value, { transfer: transferList });
2626
};
27+
28+
exports.RunCloseSteps = value => {
29+
if (typeof value.close === 'function') {
30+
return;
31+
}
32+
try {
33+
value.close();
34+
} catch (closeException) {
35+
// Nothing to do.
36+
}
37+
};

reference-implementation/lib/abstract-ops/queue-with-sizes.js

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
const assert = require('assert');
3-
const { IsNonNegativeNumber, StructuredTransferOrClone } = require('./miscellaneous.js');
3+
const { IsNonNegativeNumber, RunCloseSteps, StructuredTransferOrClone } = require('./miscellaneous.js');
44

55
exports.DequeueValue = container => {
66
assert('_queue' in container && '_queueTotalSize' in container);
@@ -24,7 +24,7 @@ exports.EnqueueValueWithSize = (container, value, size, transferList) => {
2424
if (size === Infinity) {
2525
throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
2626
}
27-
if (container._isOwning) {
27+
if (container._isOwning && !container._isPipeToOptimizedTransfer) {
2828
value = StructuredTransferOrClone(value, transferList);
2929
}
3030
container._queue.push({ value, size });
@@ -45,13 +45,7 @@ exports.ResetQueue = container => {
4545
if (container._isOwning) {
4646
while (container._queue.length > 0) {
4747
const value = exports.DequeueValue(container);
48-
if (typeof value.close === 'function') {
49-
try {
50-
value.close();
51-
} catch (closeException) {
52-
// Nothing to do.
53-
}
54-
}
48+
RunCloseSteps(value);
5549
}
5650
}
5751
container._queue = [];

reference-implementation/lib/abstract-ops/readable-streams.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ const { promiseResolvedWith, promiseRejectedWith, newPromise, resolvePromise, re
66
require('../helpers/webidl.js');
77
const { CanTransferArrayBuffer, CopyDataBlockBytes, CreateArrayFromList, IsDetachedBuffer, TransferArrayBuffer } =
88
require('./ecmascript.js');
9-
const { CloneAsUint8Array, IsNonNegativeNumber, StructuredTransferOrClone } = require('./miscellaneous.js');
9+
const { CloneAsUint8Array, IsNonNegativeNumber, RunCloseSteps, StructuredTransferOrClone } =
10+
require('./miscellaneous.js');
1011
const { EnqueueValueWithSize, ResetQueue } = require('./queue-with-sizes.js');
1112
const { AcquireWritableStreamDefaultWriter, IsWritableStreamLocked, WritableStreamAbort,
1213
WritableStreamDefaultWriterCloseWithErrorPropagation, WritableStreamDefaultWriterRelease,
@@ -136,6 +137,7 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
136137

137138
const reader = AcquireReadableStreamDefaultReader(source);
138139
const writer = AcquireWritableStreamDefaultWriter(dest);
140+
writer._stream._controller._isPipeToOptimizedTransfer = source._controller._isOwning && dest._controller._isOwning;
139141

140142
source._disturbed = true;
141143

@@ -206,7 +208,11 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
206208
{
207209
chunkSteps: chunk => {
208210
currentWrite = transformPromiseWith(
209-
WritableStreamDefaultWriterWrite(writer, chunk), undefined, () => {}
211+
WritableStreamDefaultWriterWrite(writer, chunk), undefined, () => {
212+
if (reader._stream._controller._isOwning) {
213+
RunCloseSteps(chunk);
214+
}
215+
}
210216
);
211217
resolveRead(false);
212218
},
@@ -319,6 +325,7 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
319325
}
320326

321327
function finalize(isError, error) {
328+
writer._stream._controller._isPipeToOptimizedTransfer = undefined;
322329
WritableStreamDefaultWriterRelease(writer);
323330
ReadableStreamDefaultReaderRelease(reader);
324331

0 commit comments

Comments
 (0)