Skip to content

Commit a99c230

Browse files
committed
stream: implement streams to webstreams adapters
Experimental adapters for the webstreams API Signed-off-by: James M Snell <jasnell@gmail.com> PR-URL: #39134 Reviewed-By: Robert Nagy <ronagy@icloud.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
1 parent 09b57f7 commit a99c230

13 files changed

+2358
-0
lines changed

doc/api/stream.md

+81
Original file line numberDiff line numberDiff line change
@@ -1892,6 +1892,87 @@ Calling `Readable.from(string)` or `Readable.from(buffer)` will not have
18921892
the strings or buffers be iterated to match the other streams semantics
18931893
for performance reasons.
18941894

1895+
### `stream.Readable.fromWeb(readableStream[, options])`
1896+
<!-- YAML
1897+
added: REPLACEME
1898+
-->
1899+
1900+
> Stability: 1 - Experimental
1901+
1902+
* `readableStream` {ReadableStream}
1903+
* `options` {Object}
1904+
* `encoding` {string}
1905+
* `highWaterMark` {number}
1906+
* `objectModel` {boolean}
1907+
* `signal` {AbortSignal}
1908+
* Returns: {stream.Readable}
1909+
1910+
### `stream.Readable.toWeb(streamReadable)`
1911+
<!-- YAML
1912+
added: REPLACEME
1913+
-->
1914+
1915+
> Stability: 1 - Experimental
1916+
1917+
* `streamReadable` {stream.Readable}
1918+
* Returns: {ReadableStream}
1919+
1920+
### `stream.Writable.fromWeb(writableStream[, options])`
1921+
<!-- YAML
1922+
added: REPLACEME
1923+
-->
1924+
1925+
> Stability: 1 - Experimental
1926+
1927+
* `writableStream` {WritableStream}
1928+
* `options` {Object}
1929+
* `decodeStrings` {boolean}
1930+
* `highWaterMark` {number}
1931+
* `objectMode` {boolean}
1932+
* `signal` {AbortSignal}
1933+
* Returns: {stream.Writable}
1934+
1935+
### `stream.Writable.toWeb(streamWritable)`
1936+
<!-- YAML
1937+
added: REPLACEME
1938+
-->
1939+
1940+
> Stability: 1 - Experimental
1941+
1942+
* `streamWritable` {stream.Writable}
1943+
* Returns: {WritableStream}
1944+
1945+
### `stream.Duplex.fromWeb(pair[, options])`
1946+
<!-- YAML
1947+
added: REPLACEME
1948+
-->
1949+
1950+
> Stability: 1 - Experimental
1951+
1952+
* `pair` {Object}
1953+
* `readable` {ReadableStream}
1954+
* `writable` {WritableStream}
1955+
* `options` {Object}
1956+
* `allowHalfOpen` {boolean}
1957+
* `decodeStrings` {boolean}
1958+
* `encoding` {string}
1959+
* `highWaterMark` {number}
1960+
* `objectMode` {boolean}
1961+
* `signal` {AbortSignal}
1962+
* Returns: {stream.Duplex}
1963+
1964+
### `stream.Duplex.toWeb(streamDuplex)`
1965+
<!-- YAML
1966+
added: REPLACEME
1967+
-->
1968+
1969+
> Stability: 1 - Experimental
1970+
1971+
* `streamDuplex` {stream.Duplex}
1972+
* Returns: {Object}
1973+
* `readable` {ReadableStream}
1974+
* `writable` {WritableStream}
1975+
18951976
### `stream.addAbortSignal(signal, stream)`
18961977
<!-- YAML
18971978
added: v15.4.0

lib/internal/fs/promises.js

+2
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,8 @@ module.exports = {
788788
appendFile,
789789
readFile,
790790
watch,
791+
792+
kHandle,
791793
},
792794

793795
FileHandle,

lib/internal/streams/duplex.js

+19
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,22 @@ ObjectDefineProperties(Duplex.prototype, {
114114
}
115115
}
116116
});
117+
118+
let webStreamsAdapters;
119+
120+
// Lazy to avoid circular references
121+
function lazyWebStreams() {
122+
if (webStreamsAdapters === undefined)
123+
webStreamsAdapters = require('internal/webstreams/adapters');
124+
return webStreamsAdapters;
125+
}
126+
127+
Duplex.fromWeb = function(pair, options) {
128+
return lazyWebStreams().newStreamDuplexFromReadableWritablePair(
129+
pair,
130+
options);
131+
};
132+
133+
Duplex.toWeb = function(duplex) {
134+
return lazyWebStreams().newReadableWritablePairFromDuplex(duplex);
135+
};

lib/internal/streams/readable.js

+19
Original file line numberDiff line numberDiff line change
@@ -1355,3 +1355,22 @@ function endWritableNT(state, stream) {
13551355
Readable.from = function(iterable, opts) {
13561356
return from(Readable, iterable, opts);
13571357
};
1358+
1359+
let webStreamsAdapters;
1360+
1361+
// Lazy to avoid circular references
1362+
function lazyWebStreams() {
1363+
if (webStreamsAdapters === undefined)
1364+
webStreamsAdapters = require('internal/webstreams/adapters');
1365+
return webStreamsAdapters;
1366+
}
1367+
1368+
Readable.fromWeb = function(readableStream, options) {
1369+
return lazyWebStreams().newStreamReadableFromReadableStream(
1370+
readableStream,
1371+
options);
1372+
};
1373+
1374+
Readable.toWeb = function(streamReadable) {
1375+
return lazyWebStreams().newStreamReadableFromReadableStream(streamReadable);
1376+
};

lib/internal/streams/writable.js

+19
Original file line numberDiff line numberDiff line change
@@ -872,3 +872,22 @@ Writable.prototype._destroy = function(err, cb) {
872872
Writable.prototype[EE.captureRejectionSymbol] = function(err) {
873873
this.destroy(err);
874874
};
875+
876+
let webStreamsAdapters;
877+
878+
// Lazy to avoid circular references
879+
function lazyWebStreams() {
880+
if (webStreamsAdapters === undefined)
881+
webStreamsAdapters = require('internal/webstreams/adapters');
882+
return webStreamsAdapters;
883+
}
884+
885+
Writable.fromWeb = function(writableStream, options) {
886+
return lazyWebStreams().newStreamWritableFromWritableStream(
887+
writableStream,
888+
options);
889+
};
890+
891+
Writable.toWeb = function(streamWritable) {
892+
return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable);
893+
};

0 commit comments

Comments
 (0)