Web Streams API#

History
VersionChanges
v21.0.0

No longer experimental.

v18.0.0

Use of this API no longer emit a runtime warning.

v16.5.0

Added in: v16.5.0

Stability: 2 - Stable

An implementation of theWHATWG Streams Standard.

Overview#

TheWHATWG Streams Standard (or "web streams") defines an API for handlingstreaming data. It is similar to the Node.jsStreams API but emerged laterand has become the "standard" API for streaming data across many JavaScriptenvironments.

There are three primary types of objects:

  • ReadableStream - Represents a source of streaming data.
  • WritableStream - Represents a destination for streaming data.
  • TransformStream - Represents an algorithm for transforming streaming data.

ExampleReadableStream#

This example creates a simpleReadableStream that pushes the currentperformance.now() timestamp once every second forever. An async iterableis used to read the data from the stream.

import {ReadableStream,}from'node:stream/web';import {setIntervalas every,}from'node:timers/promises';import {  performance,}from'node:perf_hooks';constSECOND =1000;const stream =newReadableStream({asyncstart(controller) {forawait (const _ofevery(SECOND))      controller.enqueue(performance.now());  },});forawait (const valueof stream)console.log(value);const {ReadableStream,} =require('node:stream/web');const {setInterval: every,} =require('node:timers/promises');const {  performance,} =require('node:perf_hooks');constSECOND =1000;const stream =newReadableStream({asyncstart(controller) {forawait (const _ofevery(SECOND))      controller.enqueue(performance.now());  },});(async () => {forawait (const valueof stream)console.log(value);})();

Node.js streams interoperability#

Node.js streams can be converted to web streams and vice versa via thetoWeb andfromWeb methods present onstream.Readable,stream.Writable andstream.Duplex objects.

For more details refer to the relevant documentation:

API#

Class:ReadableStream#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

new ReadableStream([underlyingSource [, strategy]])#
Added in: v16.5.0
  • underlyingSource<Object>
    • start<Function> A user-defined function that is invoked immediately whentheReadableStream is created.
    • pull<Function> A user-defined function that is called repeatedly when theReadableStream internal queue is not full. The operation may be sync orasync. If async, the function will not be called again until the previouslyreturned promise is fulfilled.
    • cancel<Function> A user-defined function that is called when theReadableStream is canceled.
      • reason<any>
      • Returns: A promise fulfilled withundefined.
    • type<string> Must be'bytes' orundefined.
    • autoAllocateChunkSize<number> Used only whentype is equal to'bytes'. When set to a non-zero value a view buffer is automaticallyallocated toReadableByteStreamController.byobRequest. When not setone must use stream's internal queues to transfer data via the defaultreaderReadableStreamDefaultReader.
  • strategy<Object>
    • highWaterMark<number> The maximum internal queue size before backpressureis applied.
    • size<Function> A user-defined function used to identify the size of eachchunk of data.
readableStream.locked#
Added in: v16.5.0

ThereadableStream.locked property isfalse by default, and isswitched totrue while there is an active reader consuming thestream's data.

readableStream.cancel([reason])#
Added in: v16.5.0
  • reason<any>
  • Returns: A promise fulfilled withundefined once cancelation hasbeen completed.
readableStream.getReader([options])#
Added in: v16.5.0
import {ReadableStream }from'node:stream/web';const stream =newReadableStream();const reader = stream.getReader();console.log(await reader.read());const {ReadableStream } =require('node:stream/web');const stream =newReadableStream();const reader = stream.getReader();reader.read().then(console.log);

Causes thereadableStream.locked to betrue.

readableStream.pipeThrough(transform[, options])#
Added in: v16.5.0
  • transform<Object>
    • readable<ReadableStream> TheReadableStream to whichtransform.writable will push the potentially modified datait receives from thisReadableStream.
    • writable<WritableStream> TheWritableStream to which thisReadableStream's data will be written.
  • options<Object>
    • preventAbort<boolean> Whentrue, errors in thisReadableStreamwill not causetransform.writable to be aborted.
    • preventCancel<boolean> Whentrue, errors in the destinationtransform.writable do not cause thisReadableStream to becanceled.
    • preventClose<boolean> Whentrue, closing thisReadableStreamdoes not causetransform.writable to be closed.
    • signal<AbortSignal> Allows the transfer of data to be canceledusing an<AbortController>.
  • Returns:<ReadableStream> Fromtransform.readable.

Connects this<ReadableStream> to the pair of<ReadableStream> and<WritableStream> provided in thetransform argument such that thedata from this<ReadableStream> is written in totransform.writable,possibly transformed, then pushed totransform.readable. Once thepipeline is configured,transform.readable is returned.

Causes thereadableStream.locked to betrue while the pipe operationis active.

import {ReadableStream,TransformStream,}from'node:stream/web';const stream =newReadableStream({start(controller) {    controller.enqueue('a');  },});const transform =newTransformStream({transform(chunk, controller) {    controller.enqueue(chunk.toUpperCase());  },});const transformedStream = stream.pipeThrough(transform);forawait (const chunkof transformedStream)console.log(chunk);// Prints: Aconst {ReadableStream,TransformStream,} =require('node:stream/web');const stream =newReadableStream({start(controller) {    controller.enqueue('a');  },});const transform =newTransformStream({transform(chunk, controller) {    controller.enqueue(chunk.toUpperCase());  },});const transformedStream = stream.pipeThrough(transform);(async () => {forawait (const chunkof transformedStream)console.log(chunk);// Prints: A})();
readableStream.pipeTo(destination[, options])#
Added in: v16.5.0
  • destination<WritableStream> A<WritableStream> to which thisReadableStream's data will be written.
  • options<Object>
    • preventAbort<boolean> Whentrue, errors in thisReadableStreamwill not causedestination to be aborted.
    • preventCancel<boolean> Whentrue, errors in thedestinationwill not cause thisReadableStream to be canceled.
    • preventClose<boolean> Whentrue, closing thisReadableStreamdoes not causedestination to be closed.
    • signal<AbortSignal> Allows the transfer of data to be canceledusing an<AbortController>.
  • Returns: A promise fulfilled withundefined

Causes thereadableStream.locked to betrue while the pipe operationis active.

readableStream.tee()#
History
VersionChanges
v18.10.0, v16.18.0

Support teeing a readable byte stream.

v16.5.0

Added in: v16.5.0

Returns a pair of new<ReadableStream> instances to which thisReadableStream's data will be forwarded. Each will receive thesame data.

Causes thereadableStream.locked to betrue.

readableStream.values([options])#
Added in: v16.5.0

Creates and returns an async iterator usable for consuming thisReadableStream's data.

Causes thereadableStream.locked to betrue while the async iteratoris active.

import {Buffer }from'node:buffer';const stream =newReadableStream(getSomeSource());forawait (const chunkof stream.values({preventCancel:true }))console.log(Buffer.from(chunk).toString());
Async Iteration#

The<ReadableStream> object supports the async iterator protocol usingfor await syntax.

import {Buffer }from'node:buffer';const stream =newReadableStream(getSomeSource());forawait (const chunkof stream)console.log(Buffer.from(chunk).toString());

The async iterator will consume the<ReadableStream> until it terminates.

By default, if the async iterator exits early (via either abreak,return, or athrow), the<ReadableStream> will be closed. To preventautomatic closing of the<ReadableStream>, use thereadableStream.values()method to acquire the async iterator and set thepreventCancel option totrue.

The<ReadableStream> must not be locked (that is, it must not have an existingactive reader). During the async iteration, the<ReadableStream> will be locked.

Transferring withpostMessage()#

A<ReadableStream> instance can be transferred using a<MessagePort>.

const stream =newReadableStream(getReadableSourceSomehow());const { port1, port2 } =newMessageChannel();port1.onmessage =({ data }) => {  data.getReader().read().then((chunk) => {console.log(chunk);  });};port2.postMessage(stream, [stream]);

ReadableStream.from(iterable)#

Added in: v20.6.0
  • iterable<Iterable> Object implementing theSymbol.asyncIterator orSymbol.iterator iterable protocol.

A utility method that creates a new<ReadableStream> from an iterable.

import {ReadableStream }from'node:stream/web';asyncfunction*asyncIterableGenerator() {yield'a';yield'b';yield'c';}const stream =ReadableStream.from(asyncIterableGenerator());forawait (const chunkof stream)console.log(chunk);// Prints: 'a', 'b', 'c'const {ReadableStream } =require('node:stream/web');asyncfunction*asyncIterableGenerator() {yield'a';yield'b';yield'c';}(async () => {const stream =ReadableStream.from(asyncIterableGenerator());forawait (const chunkof stream)console.log(chunk);// Prints: 'a', 'b', 'c'})();

To pipe the resulting<ReadableStream> into a<WritableStream> the<Iterable>should yield a sequence of<Buffer>,<TypedArray>, or<DataView> objects.

import {ReadableStream }from'node:stream/web';import {Buffer }from'node:buffer';asyncfunction*asyncIterableGenerator() {yieldBuffer.from('a');yieldBuffer.from('b');yieldBuffer.from('c');}const stream =ReadableStream.from(asyncIterableGenerator());await stream.pipeTo(createWritableStreamSomehow());const {ReadableStream } =require('node:stream/web');const {Buffer } =require('node:buffer');asyncfunction*asyncIterableGenerator() {yieldBuffer.from('a');yieldBuffer.from('b');yieldBuffer.from('c');}const stream =ReadableStream.from(asyncIterableGenerator());(async () => {await stream.pipeTo(createWritableStreamSomehow());})();

Class:ReadableStreamDefaultReader#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

By default, callingreadableStream.getReader() with no argumentswill return an instance ofReadableStreamDefaultReader. The defaultreader treats the chunks of data passed through the stream as opaquevalues, which allows the<ReadableStream> to work with generally anyJavaScript value.

new ReadableStreamDefaultReader(stream)#
Added in: v16.5.0

Creates a new<ReadableStreamDefaultReader> that is locked to thegiven<ReadableStream>.

readableStreamDefaultReader.cancel([reason])#
Added in: v16.5.0
  • reason<any>
  • Returns: A promise fulfilled withundefined.

Cancels the<ReadableStream> and returns a promise that is fulfilledwhen the underlying stream has been canceled.

readableStreamDefaultReader.closed#
Added in: v16.5.0
  • Type:<Promise> Fulfilled withundefined when the associated<ReadableStream> is closed or rejected if the stream errors or the reader'slock is released before the stream finishes closing.
readableStreamDefaultReader.read()#
Added in: v16.5.0

Requests the next chunk of data from the underlying<ReadableStream>and returns a promise that is fulfilled with the data once it isavailable.

readableStreamDefaultReader.releaseLock()#
Added in: v16.5.0

Releases this reader's lock on the underlying<ReadableStream>.

Class:ReadableStreamBYOBReader#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

TheReadableStreamBYOBReader is an alternative consumer forbyte-oriented<ReadableStream>s (those that are created withunderlyingSource.type set equal to'bytes' when theReadableStream was created).

TheBYOB is short for "bring your own buffer". This is apattern that allows for more efficient reading of byte-orienteddata that avoids extraneous copying.

import {  open,}from'node:fs/promises';import {ReadableStream,}from'node:stream/web';import {Buffer }from'node:buffer';classSource {  type ='bytes';  autoAllocateChunkSize =1024;asyncstart(controller) {this.file =awaitopen(newURL(import.meta.url));this.controller = controller;  }asyncpull(controller) {const view = controller.byobRequest?.view;const {      bytesRead,    } =awaitthis.file.read({buffer: view,offset: view.byteOffset,length: view.byteLength,    });if (bytesRead ===0) {awaitthis.file.close();this.controller.close();    }    controller.byobRequest.respond(bytesRead);  }}const stream =newReadableStream(newSource());asyncfunctionread(stream) {const reader = stream.getReader({mode:'byob' });const chunks = [];let result;do {    result =await reader.read(Buffer.alloc(100));if (result.value !==undefined)      chunks.push(Buffer.from(result.value));  }while (!result.done);returnBuffer.concat(chunks);}const data =awaitread(stream);console.log(Buffer.from(data).toString());
new ReadableStreamBYOBReader(stream)#
Added in: v16.5.0

Creates a newReadableStreamBYOBReader that is locked to thegiven<ReadableStream>.

readableStreamBYOBReader.cancel([reason])#
Added in: v16.5.0
  • reason<any>
  • Returns: A promise fulfilled withundefined.

Cancels the<ReadableStream> and returns a promise that is fulfilledwhen the underlying stream has been canceled.

readableStreamBYOBReader.closed#
Added in: v16.5.0
  • Type:<Promise> Fulfilled withundefined when the associated<ReadableStream> is closed or rejected if the stream errors or the reader'slock is released before the stream finishes closing.
readableStreamBYOBReader.read(view[, options])#
History
VersionChanges
v21.7.0, v20.17.0

Addedmin option.

v16.5.0

Added in: v16.5.0

Requests the next chunk of data from the underlying<ReadableStream>and returns a promise that is fulfilled with the data once it isavailable.

Do not pass a pooled<Buffer> object instance in to this method.PooledBuffer objects are created usingBuffer.allocUnsafe(),orBuffer.from(), or are often returned by variousnode:fs modulecallbacks. These types ofBuffers use a shared underlying<ArrayBuffer> object that contains all of the data from all ofthe pooledBuffer instances. When aBuffer,<TypedArray>,or<DataView> is passed in toreadableStreamBYOBReader.read(),the view's underlyingArrayBuffer isdetached, invalidatingall existing views that may exist on thatArrayBuffer. Thiscan have disastrous consequences for your application.

readableStreamBYOBReader.releaseLock()#
Added in: v16.5.0

Releases this reader's lock on the underlying<ReadableStream>.

Class:ReadableStreamDefaultController#

Added in: v16.5.0

Every<ReadableStream> has a controller that is responsible forthe internal state and management of the stream's queue. TheReadableStreamDefaultController is the default controllerimplementation forReadableStreams that are not byte-oriented.

readableStreamDefaultController.close()#
Added in: v16.5.0

Closes the<ReadableStream> to which this controller is associated.

readableStreamDefaultController.desiredSize#
Added in: v16.5.0

Returns the amount of data remaining to fill the<ReadableStream>'squeue.

readableStreamDefaultController.enqueue([chunk])#
Added in: v16.5.0

Appends a new chunk of data to the<ReadableStream>'s queue.

readableStreamDefaultController.error([error])#
Added in: v16.5.0

Signals an error that causes the<ReadableStream> to error and close.

Class:ReadableByteStreamController#

History
VersionChanges
v18.10.0

Support handling a BYOB pull request from a released reader.

v16.5.0

Added in: v16.5.0

Every<ReadableStream> has a controller that is responsible forthe internal state and management of the stream's queue. TheReadableByteStreamController is for byte-orientedReadableStreams.

readableByteStreamController.byobRequest#
Added in: v16.5.0
readableByteStreamController.close()#
Added in: v16.5.0

Closes the<ReadableStream> to which this controller is associated.

readableByteStreamController.desiredSize#
Added in: v16.5.0

Returns the amount of data remaining to fill the<ReadableStream>'squeue.

readableByteStreamController.enqueue(chunk)#
Added in: v16.5.0

Appends a new chunk of data to the<ReadableStream>'s queue.

readableByteStreamController.error([error])#
Added in: v16.5.0

Signals an error that causes the<ReadableStream> to error and close.

Class:ReadableStreamBYOBRequest#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

When usingReadableByteStreamController in byte-orientedstreams, and when using theReadableStreamBYOBReader,thereadableByteStreamController.byobRequest propertyprovides access to aReadableStreamBYOBRequest instancethat represents the current read request. The objectis used to gain access to theArrayBuffer/TypedArraythat has been provided for the read request to fill,and provides methods for signaling that the data hasbeen provided.

readableStreamBYOBRequest.respond(bytesWritten)#
Added in: v16.5.0

Signals that abytesWritten number of bytes have been writtentoreadableStreamBYOBRequest.view.

readableStreamBYOBRequest.respondWithNewView(view)#
Added in: v16.5.0

Signals that the request has been fulfilled with bytes writtento a newBuffer,TypedArray, orDataView.

readableStreamBYOBRequest.view#
Added in: v16.5.0

Class:WritableStream#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

TheWritableStream is a destination to which stream data is sent.

import {WritableStream,}from'node:stream/web';const stream =newWritableStream({write(chunk) {console.log(chunk);  },});await stream.getWriter().write('Hello World');
new WritableStream([underlyingSink[, strategy]])#
Added in: v16.5.0
  • underlyingSink<Object>
    • start<Function> A user-defined function that is invoked immediately whentheWritableStream is created.
    • write<Function> A user-defined function that is invoked when a chunk ofdata has been written to theWritableStream.
    • close<Function> A user-defined function that is called when theWritableStream is closed.
      • Returns: A promise fulfilled withundefined.
    • abort<Function> A user-defined function that is called to abruptly closetheWritableStream.
      • reason<any>
      • Returns: A promise fulfilled withundefined.
    • type<any> Thetype option is reserved for future use andmust beundefined.
  • strategy<Object>
    • highWaterMark<number> The maximum internal queue size before backpressureis applied.
    • size<Function> A user-defined function used to identify the size of eachchunk of data.
writableStream.abort([reason])#
Added in: v16.5.0
  • reason<any>
  • Returns: A promise fulfilled withundefined.

Abruptly terminates theWritableStream. All queued writes will becanceled with their associated promises rejected.

writableStream.close()#
Added in: v16.5.0
  • Returns: A promise fulfilled withundefined.

Closes theWritableStream when no additional writes are expected.

writableStream.getWriter()#
Added in: v16.5.0

Creates and returns a new writer instance that can be used to writedata into theWritableStream.

writableStream.locked#
Added in: v16.5.0

ThewritableStream.locked property isfalse by default, and isswitched totrue while there is an active writer attached to thisWritableStream.

Transferring with postMessage()#

A<WritableStream> instance can be transferred using a<MessagePort>.

const stream =newWritableStream(getWritableSinkSomehow());const { port1, port2 } =newMessageChannel();port1.onmessage =({ data }) => {  data.getWriter().write('hello');};port2.postMessage(stream, [stream]);

Class:WritableStreamDefaultWriter#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

new WritableStreamDefaultWriter(stream)#
Added in: v16.5.0

Creates a newWritableStreamDefaultWriter that is locked to the givenWritableStream.

writableStreamDefaultWriter.abort([reason])#
Added in: v16.5.0
  • reason<any>
  • Returns: A promise fulfilled withundefined.

Abruptly terminates theWritableStream. All queued writes will becanceled with their associated promises rejected.

writableStreamDefaultWriter.close()#
Added in: v16.5.0
  • Returns: A promise fulfilled withundefined.

Closes theWritableStream when no additional writes are expected.

writableStreamDefaultWriter.closed#
Added in: v16.5.0
  • Type:<Promise> Fulfilled withundefined when the associated<WritableStream> is closed or rejected if the stream errors or the writer'slock is released before the stream finishes closing.
writableStreamDefaultWriter.desiredSize#
Added in: v16.5.0

The amount of data required to fill the<WritableStream>'s queue.

writableStreamDefaultWriter.ready#
Added in: v16.5.0
  • Type:<Promise> Fulfilled withundefined when the writer is readyto be used.
writableStreamDefaultWriter.releaseLock()#
Added in: v16.5.0

Releases this writer's lock on the underlying<ReadableStream>.

writableStreamDefaultWriter.write([chunk])#
Added in: v16.5.0
  • chunk<any>
  • Returns: A promise fulfilled withundefined.

Appends a new chunk of data to the<WritableStream>'s queue.

Class:WritableStreamDefaultController#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

TheWritableStreamDefaultController manages the<WritableStream>'sinternal state.

writableStreamDefaultController.error([error])#
Added in: v16.5.0

Called by user-code to signal that an error has occurred while processingtheWritableStream data. When called, the<WritableStream> will be aborted,with currently pending writes canceled.

writableStreamDefaultController.signal#

Class:TransformStream#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

ATransformStream consists of a<ReadableStream> and a<WritableStream> thatare connected such that the data written to theWritableStream is received,and potentially transformed, before being pushed into theReadableStream'squeue.

import {TransformStream,}from'node:stream/web';const transform =newTransformStream({transform(chunk, controller) {    controller.enqueue(chunk.toUpperCase());  },});awaitPromise.all([  transform.writable.getWriter().write('A'),  transform.readable.getReader().read(),]);
new TransformStream([transformer[, writableStrategy[, readableStrategy]]])#
Added in: v16.5.0
  • transformer<Object>
    • start<Function> A user-defined function that is invoked immediately whentheTransformStream is created.
    • transform<Function> A user-defined function that receives, andpotentially modifies, a chunk of data written totransformStream.writable,before forwarding that on totransformStream.readable.
    • flush<Function> A user-defined function that is called immediately beforethe writable side of theTransformStream is closed, signaling the end ofthe transformation process.
    • readableType<any> thereadableType option is reserved for future useandmust beundefined.
    • writableType<any> thewritableType option is reserved for future useandmust beundefined.
  • writableStrategy<Object>
    • highWaterMark<number> The maximum internal queue size before backpressureis applied.
    • size<Function> A user-defined function used to identify the size of eachchunk of data.
  • readableStrategy<Object>
    • highWaterMark<number> The maximum internal queue size before backpressureis applied.
    • size<Function> A user-defined function used to identify the size of eachchunk of data.
transformStream.readable#
Added in: v16.5.0
transformStream.writable#
Added in: v16.5.0
Transferring with postMessage()#

A<TransformStream> instance can be transferred using a<MessagePort>.

const stream =newTransformStream();const { port1, port2 } =newMessageChannel();port1.onmessage =({ data }) => {const { writable, readable } = data;// ...};port2.postMessage(stream, [stream]);

Class:TransformStreamDefaultController#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

TheTransformStreamDefaultController manages the internal stateof theTransformStream.

transformStreamDefaultController.desiredSize#
Added in: v16.5.0

The amount of data required to fill the readable side's queue.

transformStreamDefaultController.enqueue([chunk])#
Added in: v16.5.0

Appends a chunk of data to the readable side's queue.

transformStreamDefaultController.error([reason])#
Added in: v16.5.0

Signals to both the readable and writable side that an error has occurredwhile processing the transform data, causing both sides to be abruptlyclosed.

transformStreamDefaultController.terminate()#
Added in: v16.5.0

Closes the readable side of the transport and causes the writable sideto be abruptly closed with an error.

Class:ByteLengthQueuingStrategy#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

new ByteLengthQueuingStrategy(init)#
Added in: v16.5.0
byteLengthQueuingStrategy.highWaterMark#
Added in: v16.5.0
byteLengthQueuingStrategy.size#
Added in: v16.5.0

Class:CountQueuingStrategy#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.5.0

Added in: v16.5.0

new CountQueuingStrategy(init)#
Added in: v16.5.0
countQueuingStrategy.highWaterMark#
Added in: v16.5.0
countQueuingStrategy.size#
Added in: v16.5.0

Class:TextEncoderStream#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.6.0

Added in: v16.6.0

new TextEncoderStream()#
Added in: v16.6.0

Creates a newTextEncoderStream instance.

textEncoderStream.encoding#
Added in: v16.6.0

The encoding supported by theTextEncoderStream instance.

textEncoderStream.readable#
Added in: v16.6.0
textEncoderStream.writable#
Added in: v16.6.0

Class:TextDecoderStream#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v16.6.0

Added in: v16.6.0

new TextDecoderStream([encoding[, options]])#
Added in: v16.6.0
  • encoding<string> Identifies theencoding that thisTextDecoder instancesupports.Default:'utf-8'.
  • options<Object>
    • fatal<boolean>true if decoding failures are fatal.
    • ignoreBOM<boolean> Whentrue, theTextDecoderStream will include thebyte order mark in the decoded result. Whenfalse, the byte order markwill be removed from the output. This option is only used whenencoding is'utf-8','utf-16be', or'utf-16le'.Default:false.

Creates a newTextDecoderStream instance.

textDecoderStream.encoding#
Added in: v16.6.0

The encoding supported by theTextDecoderStream instance.

textDecoderStream.fatal#
Added in: v16.6.0

The value will betrue if decoding errors result in aTypeError beingthrown.

textDecoderStream.ignoreBOM#
Added in: v16.6.0

The value will betrue if the decoding result will include the byte ordermark.

textDecoderStream.readable#
Added in: v16.6.0
textDecoderStream.writable#
Added in: v16.6.0

Class:CompressionStream#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v17.0.0

Added in: v17.0.0

new CompressionStream(format)#
History
VersionChanges
v24.7.0, v22.20.0

format now acceptsbrotli value.

v21.2.0, v20.12.0

format now acceptsdeflate-raw value.

v17.0.0

Added in: v17.0.0

  • format<string> One of'deflate','deflate-raw','gzip', or'brotli'.
compressionStream.readable#
Added in: v17.0.0
compressionStream.writable#
Added in: v17.0.0

Class:DecompressionStream#

History
VersionChanges
v18.0.0

This class is now exposed on the global object.

v17.0.0

Added in: v17.0.0

new DecompressionStream(format)#
History
VersionChanges
v24.7.0, v22.20.0

format now acceptsbrotli value.

v21.2.0, v20.12.0

format now acceptsdeflate-raw value.

v17.0.0

Added in: v17.0.0

  • format<string> One of'deflate','deflate-raw','gzip', or'brotli'.
decompressionStream.readable#
Added in: v17.0.0
decompressionStream.writable#
Added in: v17.0.0

Utility Consumers#

Added in: v16.7.0

The utility consumer functions provide common options for consumingstreams.

They are accessed using:

import {  arrayBuffer,  blob,  buffer,  json,  text,}from'node:stream/consumers';const {  arrayBuffer,  blob,  buffer,  json,  text,} =require('node:stream/consumers');
streamConsumers.arrayBuffer(stream)#
Added in: v16.7.0
import { arrayBuffer }from'node:stream/consumers';import {Readable }from'node:stream';import {TextEncoder }from'node:util';const encoder =newTextEncoder();const dataArray = encoder.encode('hello world from consumers!');const readable =Readable.from(dataArray);const data =awaitarrayBuffer(readable);console.log(`from readable:${data.byteLength}`);// Prints: from readable: 76const { arrayBuffer } =require('node:stream/consumers');const {Readable } =require('node:stream');const {TextEncoder } =require('node:util');const encoder =newTextEncoder();const dataArray = encoder.encode('hello world from consumers!');const readable =Readable.from(dataArray);arrayBuffer(readable).then((data) => {console.log(`from readable:${data.byteLength}`);// Prints: from readable: 76});
streamConsumers.blob(stream)#
Added in: v16.7.0
import { blob }from'node:stream/consumers';const dataBlob =newBlob(['hello world from consumers!']);const readable = dataBlob.stream();const data =awaitblob(readable);console.log(`from readable:${data.size}`);// Prints: from readable: 27const { blob } =require('node:stream/consumers');const dataBlob =newBlob(['hello world from consumers!']);const readable = dataBlob.stream();blob(readable).then((data) => {console.log(`from readable:${data.size}`);// Prints: from readable: 27});
streamConsumers.buffer(stream)#
Added in: v16.7.0
import { buffer }from'node:stream/consumers';import {Readable }from'node:stream';import {Buffer }from'node:buffer';const dataBuffer =Buffer.from('hello world from consumers!');const readable =Readable.from(dataBuffer);const data =awaitbuffer(readable);console.log(`from readable:${data.length}`);// Prints: from readable: 27const { buffer } =require('node:stream/consumers');const {Readable } =require('node:stream');const {Buffer } =require('node:buffer');const dataBuffer =Buffer.from('hello world from consumers!');const readable =Readable.from(dataBuffer);buffer(readable).then((data) => {console.log(`from readable:${data.length}`);// Prints: from readable: 27});
streamConsumers.json(stream)#
Added in: v16.7.0
import { json }from'node:stream/consumers';import {Readable }from'node:stream';const items =Array.from(  {length:100,  },() => ({message:'hello world from consumers!',  }),);const readable =Readable.from(JSON.stringify(items));const data =awaitjson(readable);console.log(`from readable:${data.length}`);// Prints: from readable: 100const { json } =require('node:stream/consumers');const {Readable } =require('node:stream');const items =Array.from(  {length:100,  },() => ({message:'hello world from consumers!',  }),);const readable =Readable.from(JSON.stringify(items));json(readable).then((data) => {console.log(`from readable:${data.length}`);// Prints: from readable: 100});
streamConsumers.text(stream)#
Added in: v16.7.0
import { text }from'node:stream/consumers';import {Readable }from'node:stream';const readable =Readable.from('Hello world from consumers!');const data =awaittext(readable);console.log(`from readable:${data.length}`);// Prints: from readable: 27const { text } =require('node:stream/consumers');const {Readable } =require('node:stream');const readable =Readable.from('Hello world from consumers!');text(readable).then((data) => {console.log(`from readable:${data.length}`);// Prints: from readable: 27});