Skip to content

Commit 2dfabed

Browse files
committed
PipeTo initial implementation
1 parent e5c3a24 commit 2dfabed

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

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

Lines changed: 11 additions & 0 deletions
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

Lines changed: 2 additions & 2 deletions
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 });

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ 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 } = require('./miscellaneous.js');
1010
const { EnqueueValueWithSize, ResetQueue } = require('./queue-with-sizes.js');
1111
const { AcquireWritableStreamDefaultWriter, IsWritableStreamLocked, WritableStreamAbort,
1212
WritableStreamDefaultWriterCloseWithErrorPropagation, WritableStreamDefaultWriterRelease,
@@ -136,6 +136,7 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
136136

137137
const reader = AcquireReadableStreamDefaultReader(source);
138138
const writer = AcquireWritableStreamDefaultWriter(dest);
139+
writer._stream._controller._isPipeToOptimizedTransfer = source._controller._isOwning && dest._controller._isOwning;
139140

140141
source._disturbed = true;
141142

@@ -206,7 +207,11 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
206207
{
207208
chunkSteps: chunk => {
208209
currentWrite = transformPromiseWith(
209-
WritableStreamDefaultWriterWrite(writer, chunk), undefined, () => {}
210+
WritableStreamDefaultWriterWrite(writer, chunk), undefined, () => {
211+
if (reader._stream._controller._isOwning) {
212+
RunCloseSteps(chunk);
213+
}
214+
}
210215
);
211216
resolveRead(false);
212217
},
@@ -319,6 +324,7 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
319324
}
320325

321326
function finalize(isError, error) {
327+
writer._stream._controller._isPipeToOptimizedTransfer = undefined;
322328
WritableStreamDefaultWriterRelease(writer);
323329
ReadableStreamDefaultReaderRelease(reader);
324330

0 commit comments

Comments
 (0)