diff --git a/benchmark/webstreams/adapters.js b/benchmark/webstreams/adapters.js index ae97e4928f88..f3a9be0ecd2e 100644 --- a/benchmark/webstreams/adapters.js +++ b/benchmark/webstreams/adapters.js @@ -15,6 +15,7 @@ const bench = common.createBenchmark(main, { 'readable-to-web', 'readable-from-web', 'writable-to-web', + 'writable-to-web-async-writev', 'writable-from-web', ], }); @@ -68,6 +69,26 @@ async function writableToWeb(n) { bench.end(n); } +async function writableToWebAsyncWritev(n) { + const chunk = Buffer.alloc(1024); + const streamWritable = new Writable({ + highWaterMark: 64 * 1024, + // Defer completion so subsequent writes can be batched in writev(). + write(chunk, encoding, callback) { + setImmediate(callback); + }, + writev(chunks, callback) { + setImmediate(callback); + }, + }); + const writer = Writable.toWeb(streamWritable).getWriter(); + bench.start(); + for (let i = 0; i < n; i++) + await writer.write(chunk); + await writer.close(); + bench.end(n); +} + function writableFromWeb(n) { const chunk = Buffer.alloc(1024); const writableStream = new WritableStream({ @@ -99,6 +120,9 @@ function main({ n, kind }) { case 'writable-to-web': writableToWeb(n); break; + case 'writable-to-web-async-writev': + writableToWebAsyncWritev(n); + break; case 'writable-from-web': writableFromWeb(n); break; diff --git a/doc/api/stream.md b/doc/api/stream.md index 1e8a2bd1ef93..6d2cd0fe05d6 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -3339,6 +3339,14 @@ changes: * `streamWritable` {stream.Writable} * Returns: {WritableStream} +For streams not operating in object mode, a mutable {Buffer}, {TypedArray}, +{DataView}, {ArrayBuffer}, or {SharedArrayBuffer} passed to the returned stream's +writer can be reused after the promise returned by `writer.write()` is +fulfilled. Do not modify the chunk or its underlying bytes while that promise +is pending. The adapter may copy the chunk, so the underlying Node.js stream is +not guaranteed to receive the same object. Chunks written to streams operating +in object mode are passed by reference without copying. + ### `stream.Duplex.from(src)`