Web Streams API#
History
| Version | Changes |
|---|---|
| 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 |
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
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v16.5.0 | Added in: v16.5.0 |
new ReadableStream([underlyingSource [, strategy]])#
underlyingSource<Object>start<Function> A user-defined function that is invoked immediately whentheReadableStreamis created.controller<ReadableStreamDefaultController> |<ReadableByteStreamController>- Returns:
undefinedor a promise fulfilled withundefined.
pull<Function> A user-defined function that is called repeatedly when theReadableStreaminternal 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.controller<ReadableStreamDefaultController> |<ReadableByteStreamController>- Returns: A promise fulfilled with
undefined.
cancel<Function> A user-defined function that is called when theReadableStreamis canceled.reason<any>- Returns: A promise fulfilled with
undefined.
type<string> Must be'bytes'orundefined.autoAllocateChunkSize<number> Used only whentypeis 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#
- Type:<boolean> Set to
trueif there is an active reader for this<ReadableStream>.
ThereadableStream.locked property isfalse by default, and isswitched totrue while there is an active reader consuming thestream's data.
readableStream.cancel([reason])#
reason<any>- Returns: A promise fulfilled with
undefinedonce cancelation hasbeen completed.
readableStream.getReader([options])#
options<Object>mode<string>'byob'orundefined
- Returns:<ReadableStreamDefaultReader> |<ReadableStreamBYOBReader>
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])#
transform<Object>readable<ReadableStream> TheReadableStreamto whichtransform.writablewill push the potentially modified datait receives from thisReadableStream.writable<WritableStream> TheWritableStreamto which thisReadableStream's data will be written.
options<Object>preventAbort<boolean> Whentrue, errors in thisReadableStreamwill not causetransform.writableto be aborted.preventCancel<boolean> Whentrue, errors in the destinationtransform.writabledo not cause thisReadableStreamto becanceled.preventClose<boolean> Whentrue, closing thisReadableStreamdoes not causetransform.writableto be closed.signal<AbortSignal> Allows the transfer of data to be canceledusing an<AbortController>.
- Returns:<ReadableStream> From
transform.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])#
destination<WritableStream> A<WritableStream> to which thisReadableStream's data will be written.options<Object>preventAbort<boolean> Whentrue, errors in thisReadableStreamwill not causedestinationto be aborted.preventCancel<boolean> Whentrue, errors in thedestinationwill not cause thisReadableStreamto be canceled.preventClose<boolean> Whentrue, closing thisReadableStreamdoes not causedestinationto be closed.signal<AbortSignal> Allows the transfer of data to be canceledusing an<AbortController>.
- Returns: A promise fulfilled with
undefined
Causes thereadableStream.locked to betrue while the pipe operationis active.
readableStream.tee()#
History
| Version | Changes |
|---|---|
| v18.10.0, v16.18.0 | Support teeing a readable byte stream. |
| v16.5.0 | Added in: v16.5.0 |
- Returns:<ReadableStream[]>
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])#
options<Object>preventCancel<boolean> Whentrue, prevents the<ReadableStream>from being closed when the async iterator abruptly terminates.Default:false.
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)#
iterable<Iterable> Object implementing theSymbol.asyncIteratororSymbol.iteratoriterable 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
| Version | Changes |
|---|---|
| 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)#
stream<ReadableStream>
Creates a new<ReadableStreamDefaultReader> that is locked to thegiven<ReadableStream>.
readableStreamDefaultReader.cancel([reason])#
reason<any>- Returns: A promise fulfilled with
undefined.
Cancels the<ReadableStream> and returns a promise that is fulfilledwhen the underlying stream has been canceled.
readableStreamDefaultReader.closed#
- Type:<Promise> Fulfilled with
undefinedwhen the associated<ReadableStream> is closed or rejected if the stream errors or the reader'slock is released before the stream finishes closing.
readableStreamDefaultReader.read()#
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()#
Releases this reader's lock on the underlying<ReadableStream>.
Class:ReadableStreamBYOBReader#
History
| Version | Changes |
|---|---|
| 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)#
stream<ReadableStream>
Creates a newReadableStreamBYOBReader that is locked to thegiven<ReadableStream>.
readableStreamBYOBReader.cancel([reason])#
reason<any>- Returns: A promise fulfilled with
undefined.
Cancels the<ReadableStream> and returns a promise that is fulfilledwhen the underlying stream has been canceled.
readableStreamBYOBReader.closed#
- Type:<Promise> Fulfilled with
undefinedwhen 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
| Version | Changes |
|---|---|
| v21.7.0, v20.17.0 | Added |
| v16.5.0 | Added in: v16.5.0 |
view<Buffer> |<TypedArray> |<DataView>options<Object>min<number> When set, the returned promise will only befulfilled as soon asminnumber of elements are available.When not set, the promise fulfills when at least one elementis available.
- Returns: A promise fulfilled with an object:
value<TypedArray> |<DataView>done<boolean>
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()#
Releases this reader's lock on the underlying<ReadableStream>.
Class:ReadableStreamDefaultController#
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()#
Closes the<ReadableStream> to which this controller is associated.
readableStreamDefaultController.desiredSize#
- Type:<number>
Returns the amount of data remaining to fill the<ReadableStream>'squeue.
readableStreamDefaultController.enqueue([chunk])#
chunk<any>
Appends a new chunk of data to the<ReadableStream>'s queue.
readableStreamDefaultController.error([error])#
error<any>
Signals an error that causes the<ReadableStream> to error and close.
Class:ReadableByteStreamController#
History
| Version | Changes |
|---|---|
| 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.close()#
Closes the<ReadableStream> to which this controller is associated.
readableByteStreamController.desiredSize#
- Type:<number>
Returns the amount of data remaining to fill the<ReadableStream>'squeue.
readableByteStreamController.enqueue(chunk)#
chunk<Buffer> |<TypedArray> |<DataView>
Appends a new chunk of data to the<ReadableStream>'s queue.
readableByteStreamController.error([error])#
error<any>
Signals an error that causes the<ReadableStream> to error and close.
Class:ReadableStreamBYOBRequest#
History
| Version | Changes |
|---|---|
| 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)#
bytesWritten<number>
Signals that abytesWritten number of bytes have been writtentoreadableStreamBYOBRequest.view.
readableStreamBYOBRequest.respondWithNewView(view)#
view<Buffer> |<TypedArray> |<DataView>
Signals that the request has been fulfilled with bytes writtento a newBuffer,TypedArray, orDataView.
Class:WritableStream#
History
| Version | Changes |
|---|---|
| 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]])#
underlyingSink<Object>start<Function> A user-defined function that is invoked immediately whentheWritableStreamis created.controller<WritableStreamDefaultController>- Returns:
undefinedor a promise fulfilled withundefined.
write<Function> A user-defined function that is invoked when a chunk ofdata has been written to theWritableStream.chunk<any>controller<WritableStreamDefaultController>- Returns: A promise fulfilled with
undefined.
close<Function> A user-defined function that is called when theWritableStreamis closed.- Returns: A promise fulfilled with
undefined.
- Returns: A promise fulfilled with
abort<Function> A user-defined function that is called to abruptly closetheWritableStream.reason<any>- Returns: A promise fulfilled with
undefined.
type<any> Thetypeoption 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])#
reason<any>- Returns: A promise fulfilled with
undefined.
Abruptly terminates theWritableStream. All queued writes will becanceled with their associated promises rejected.
writableStream.close()#
- Returns: A promise fulfilled with
undefined.
Closes theWritableStream when no additional writes are expected.
writableStream.getWriter()#
- Returns:<WritableStreamDefaultWriter>
Creates and returns a new writer instance that can be used to writedata into theWritableStream.
writableStream.locked#
- Type:<boolean>
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
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v16.5.0 | Added in: v16.5.0 |
new WritableStreamDefaultWriter(stream)#
stream<WritableStream>
Creates a newWritableStreamDefaultWriter that is locked to the givenWritableStream.
writableStreamDefaultWriter.abort([reason])#
reason<any>- Returns: A promise fulfilled with
undefined.
Abruptly terminates theWritableStream. All queued writes will becanceled with their associated promises rejected.
writableStreamDefaultWriter.close()#
- Returns: A promise fulfilled with
undefined.
Closes theWritableStream when no additional writes are expected.
writableStreamDefaultWriter.closed#
- Type:<Promise> Fulfilled with
undefinedwhen the associated<WritableStream> is closed or rejected if the stream errors or the writer'slock is released before the stream finishes closing.
writableStreamDefaultWriter.desiredSize#
- Type:<number>
The amount of data required to fill the<WritableStream>'s queue.
writableStreamDefaultWriter.ready#
- Type:<Promise> Fulfilled with
undefinedwhen the writer is readyto be used.
writableStreamDefaultWriter.releaseLock()#
Releases this writer's lock on the underlying<ReadableStream>.
writableStreamDefaultWriter.write([chunk])#
chunk<any>- Returns: A promise fulfilled with
undefined.
Appends a new chunk of data to the<WritableStream>'s queue.
Class:WritableStreamDefaultController#
History
| Version | Changes |
|---|---|
| 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])#
error<any>
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#
- Type:<AbortSignal> An
AbortSignalthat can be used to cancel pendingwrite or close operations when a<WritableStream> is aborted.
Class:TransformStream#
History
| Version | Changes |
|---|---|
| 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]]])#
transformer<Object>start<Function> A user-defined function that is invoked immediately whentheTransformStreamis created.controller<TransformStreamDefaultController>- Returns:
undefinedor a promise fulfilled withundefined
transform<Function> A user-defined function that receives, andpotentially modifies, a chunk of data written totransformStream.writable,before forwarding that on totransformStream.readable.chunk<any>controller<TransformStreamDefaultController>- Returns: A promise fulfilled with
undefined.
flush<Function> A user-defined function that is called immediately beforethe writable side of theTransformStreamis closed, signaling the end ofthe transformation process.controller<TransformStreamDefaultController>- Returns: A promise fulfilled with
undefined.
readableType<any> thereadableTypeoption is reserved for future useandmust beundefined.writableType<any> thewritableTypeoption 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.
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
| Version | Changes |
|---|---|
| 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#
- Type:<number>
The amount of data required to fill the readable side's queue.
transformStreamDefaultController.enqueue([chunk])#
chunk<any>
Appends a chunk of data to the readable side's queue.
transformStreamDefaultController.error([reason])#
reason<any>
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()#
Closes the readable side of the transport and causes the writable sideto be abruptly closed with an error.
Class:ByteLengthQueuingStrategy#
History
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v16.5.0 | Added in: v16.5.0 |
Class:CountQueuingStrategy#
History
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v16.5.0 | Added in: v16.5.0 |
Class:TextEncoderStream#
History
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v16.6.0 | Added in: v16.6.0 |
Class:TextDecoderStream#
History
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v16.6.0 | Added in: v16.6.0 |
new TextDecoderStream([encoding[, options]])#
encoding<string> Identifies theencodingthat thisTextDecoderinstancesupports.Default:'utf-8'.options<Object>fatal<boolean>trueif decoding failures are fatal.ignoreBOM<boolean> Whentrue, theTextDecoderStreamwill include thebyte order mark in the decoded result. Whenfalse, the byte order markwill be removed from the output. This option is only used whenencodingis'utf-8','utf-16be', or'utf-16le'.Default:false.
Creates a newTextDecoderStream instance.
textDecoderStream.encoding#
- Type:<string>
The encoding supported by theTextDecoderStream instance.
textDecoderStream.fatal#
- Type:<boolean>
The value will betrue if decoding errors result in aTypeError beingthrown.
Class:CompressionStream#
History
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v17.0.0 | Added in: v17.0.0 |
Class:DecompressionStream#
History
| Version | Changes |
|---|---|
| v18.0.0 | This class is now exposed on the global object. |
| v17.0.0 | Added in: v17.0.0 |
Utility Consumers#
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)#
stream<ReadableStream> |<stream.Readable> |<AsyncIterator>- Returns:<Promise> Fulfills with an
ArrayBuffercontaining the fullcontents of the stream.
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)#
stream<ReadableStream> |<stream.Readable> |<AsyncIterator>- Returns:<Promise> Fulfills with a<Blob> containing the full contentsof the stream.
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)#
stream<ReadableStream> |<stream.Readable> |<AsyncIterator>- Returns:<Promise> Fulfills with a<Buffer> containing the fullcontents of the stream.
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)#
stream<ReadableStream> |<stream.Readable> |<AsyncIterator>- Returns:<Promise> Fulfills with the contents of the stream parsed as aUTF-8 encoded string that is then passed through
JSON.parse().
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)#
stream<ReadableStream> |<stream.Readable> |<AsyncIterator>- Returns:<Promise> Fulfills with the contents of the stream parsed as aUTF-8 encoded string.
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});