Spec-Zone.ru › Deno 2

stream

Поток — это абстрактный интерфейс для работы с потоковыми данными в Node.js. Модуль node:stream предоставляет API для реализации интерфейса потоков.

Node.js предоставляет множество объектов потоков. Например, запрос к HTTP-серверу и process.stdout являются экземплярами потоков.

Потоки могут быть читаемыми, записываемыми или одновременно и теми и другими. Все потоки являются экземплярами EventEmitter.

Чтобы получить доступ к модулю node:stream:

import stream from 'node:stream';

Модуль node:stream полезен для создания новых типов экземпляров потоков. Обычно для работы с потоками не требуется использовать модуль node:stream.

Использование в Deno

import * as mod from "node:stream";

класс default

наследует EventEmitter

Использование в Deno

import mod from "node:stream";

Методы

compose<T extends ReadableStream>(
stream:
T
| ComposeFnParam
| Iterable<T>
| AsyncIterable<T>
,
options?: { signal: AbortSignal; },
): T
pipe<T extends WritableStream>(
destination: T,
options?: { end?: boolean | undefined; },
): T

пространство имён default

Классы

default.Duplex

Двунаправленные потоки — это потоки, реализующие интерфейсы Readable и Writable.

  • addListener
  • allowHalfOpen
  • emit
  • from
  • fromWeb
  • on
  • once
  • prependListener
  • prependOnceListener
  • removeListener
  • toWeb
default.PassThrough

Класс stream.PassThrough представляет собой простую реализацию потока Transform, который просто передаёт входящие байты на выход. В первую очередь он предназначен для примеров и тестирования, но существуют случаи, когда stream.PassThrough полезен в качестве строительного блока для новых видов потоков.

default.Readable
Документация отсутствует
  • _construct
  • _destroy
  • _read
  • addListener
  • asIndexedPairs
  • closed
  • destroy
  • destroyed
  • drop
  • emit
  • errored
  • every
  • filter
  • find
  • flatMap
  • forEach
  • from
  • fromWeb
  • isDisturbed
  • isPaused
  • iterator
  • map
  • on
  • once
  • pause
  • prependListener
  • prependOnceListener
  • push
  • read
  • readable
  • readableAborted
  • readableDidRead
  • readableEncoding
  • readableEnded
  • readableFlowing
  • readableHighWaterMark
  • readableLength
  • readableObjectMode
  • reduce
  • removeListener
  • resume
  • setEncoding
  • some
  • take
  • toArray
  • toWeb
  • unpipe
  • unshift
  • wrap
default.Transform

Преобразующие потоки — это потоки Duplex, в которых выходные данные в некотором отношении зависят от входных. Как и все потоки Duplex, потоки Transform реализуют интерфейсы Readable и Writable.

  • _flush
  • _transform
default.Writable
Документация отсутствует
  • _construct
  • _destroy
  • _final
  • _write
  • _writev
  • addListener
  • closed
  • cork
  • destroy
  • destroyed
  • emit
  • end
  • errored
  • fromWeb
  • on
  • once
  • prependListener
  • prependOnceListener
  • removeListener
  • setDefaultEncoding
  • toWeb
  • uncork
  • writable
  • writableCorked
  • writableEnded
  • writableFinished
  • writableHighWaterMark
  • writableLength
  • writableNeedDrain
  • writableObjectMode
  • write

Функции

default.addAbortSignal

Поток, к которому нужно привязать сигнал.

default.duplexPair

Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых представляет собой поток Duplex, соединённый с другой стороной:

default.finished

Читаемый и/или записываемый поток/веб-поток.

default.getDefaultHighWaterMark

Возвращает значение highWaterMark по умолчанию, используемое потоками. По умолчанию это 65536 (64 КиБ) или 16 для objectMode.

default.isErrored

Возвращает информацию о том, произошла ли в потоке ошибка.

default.isReadable

Возвращает информацию о том, доступен ли поток для чтения.

default.pipeline

Метод модуля для передачи данных между потоками и генераторами с перенаправлением ошибок и надлежащей очисткой; предоставляет обратный вызов по завершении конвейера.

default.setDefaultHighWaterMark

Задаёт используемое потоками значение highWaterMark по умолчанию.

Интерфейсы

default.ArrayOptions
Документация отсутствует
  • concurrency
  • signal
default.DuplexOptions
Документация отсутствует
  • allowHalfOpen
  • readableHighWaterMark
  • readableObjectMode
  • writableCorked
  • writableHighWaterMark
  • writableObjectMode
default.FinishedOptions
Документация отсутствует
  • error
  • readable
  • writable
default.Pipe
Документация отсутствует
  • close
  • hasRef
  • ref
  • unref
default.PipelineOptions
Документация отсутствует
  • end
  • signal
default.ReadableOptions
Документация отсутствует
  • encoding
  • read
default.StreamOptions
Документация отсутствует
  • autoDestroy
  • construct
  • destroy
  • emitClose
  • highWaterMark
  • objectMode
default.TransformOptions
Документация отсутствует
  • flush
  • transform
default.WritableOptions
Документация отсутствует
  • decodeStrings
  • defaultEncoding
  • final
  • write
  • writev

Псевдонимы типов

default.PipelineCallback
Документация отсутствует
default.PipelineDestination
Документация отсутствует
default.PipelineDestinationIterableFunction
Документация отсутствует
default.PipelineDestinationPromiseFunction
Документация отсутствует
default.PipelinePromise
Документация отсутствует
default.PipelineSource
Документация отсутствует
default.PipelineSourceFunction
Документация отсутствует
default.PipelineTransform
Документация отсутствует
default.PipelineTransformSource
Документация отсутствует
default.TransformCallback
Документация отсутствует

класс default.Duplex

реализует [NodeJS.ReadWriteStream]
наследует Stream

Использование в Deno

import mod from "node:stream";

Двунаправленные потоки — это потоки, реализующие оба интерфейса Readable и Writable.

Примеры потоков Duplex:

  • TCP sockets
  • zlib streams
  • crypto streams

Конструкторы

Duplex(opts?: DuplexOptions)
new

Свойства

allowHalfOpen: boolean

Если false, поток автоматически завершит записываемую сторону, когда завершится читаемая сторона. Изначально значение задаётся параметром конструктора allowHalfOpen, по умолчанию равным true.

Это значение можно вручную изменить, чтобы поменять поведение полузакрытого режима для существующего экземпляра потока Duplex, но это необходимо сделать до генерации события 'end'.

Методы

addListener(
event: "close",
listener: () => void,
): this

Генератор событий. Список определённых событий включает:

  1. close
  2. data
  3. drain
  4. end
  5. error
  6. finish
  7. pause
  8. pipe
  9. readable
  10. resume
  11. unpipe
addListener(
event: "data",
listener: (chunk: any) => void,
): this
addListener(
event: "drain",
listener: () => void,
): this
addListener(
event: "end",
listener: () => void,
): this
addListener(
event: "error",
listener: (err: Error) => void,
): this
addListener(
event: "finish",
listener: () => void,
): this
addListener(
event: "pause",
listener: () => void,
): this
addListener(
event: "pipe",
listener: (src: Readable) => void,
): this
addListener(
event: "readable",
listener: () => void,
): this
addListener(
event: "resume",
listener: () => void,
): this
addListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
emit(event: "close"): boolean
emit(
event: "data",
chunk: any,
): boolean
emit(event: "drain"): boolean
emit(event: "end"): boolean
emit(
event: "error",
err: Error,
): boolean
emit(event: "finish"): boolean
emit(event: "pause"): boolean
emit(
event: "pipe",
src: Readable,
): boolean
emit(event: "readable"): boolean
emit(event: "resume"): boolean
emit(
event: "unpipe",
src: Readable,
): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
on(
event: "close",
listener: () => void,
): this
on(
event: "data",
listener: (chunk: any) => void,
): this
on(
event: "drain",
listener: () => void,
): this
on(
event: "end",
listener: () => void,
): this
on(
event: "error",
listener: (err: Error) => void,
): this
on(
event: "finish",
listener: () => void,
): this
on(
event: "pause",
listener: () => void,
): this
on(
event: "pipe",
listener: (src: Readable) => void,
): this
on(
event: "readable",
listener: () => void,
): this
on(
event: "resume",
listener: () => void,
): this
on(
event: "unpipe",
listener: (src: Readable) => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "close",
listener: () => void,
): this
once(
event: "data",
listener: (chunk: any) => void,
): this
once(
event: "drain",
listener: () => void,
): this
once(
event: "end",
listener: () => void,
): this
once(
event: "error",
listener: (err: Error) => void,
): this
once(
event: "finish",
listener: () => void,
): this
once(
event: "pause",
listener: () => void,
): this
once(
event: "pipe",
listener: (src: Readable) => void,
): this
once(
event: "readable",
listener: () => void,
): this
once(
event: "resume",
listener: () => void,
): this
once(
event: "unpipe",
listener: (src: Readable) => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependListener(
event: "close",
listener: () => void,
): this
prependListener(
event: "data",
listener: (chunk: any) => void,
): this
prependListener(
event: "drain",
listener: () => void,
): this
prependListener(
event: "end",
listener: () => void,
): this
prependListener(
event: "error",
listener: (err: Error) => void,
): this
prependListener(
event: "finish",
listener: () => void,
): this
prependListener(
event: "pause",
listener: () => void,
): this
prependListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependListener(
event: "readable",
listener: () => void,
): this
prependListener(
event: "resume",
listener: () => void,
): this
prependListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "close",
listener: () => void,
): this
prependOnceListener(
event: "data",
listener: (chunk: any) => void,
): this
prependOnceListener(
event: "drain",
listener: () => void,
): this
prependOnceListener(
event: "end",
listener: () => void,
): this
prependOnceListener(
event: "error",
listener: (err: Error) => void,
): this
prependOnceListener(
event: "finish",
listener: () => void,
): this
prependOnceListener(
event: "pause",
listener: () => void,
): this
prependOnceListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: "readable",
listener: () => void,
): this
prependOnceListener(
event: "resume",
listener: () => void,
): this
prependOnceListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
removeListener(
event: "close",
listener: () => void,
): this
removeListener(
event: "data",
listener: (chunk: any) => void,
): this
removeListener(
event: "drain",
listener: () => void,
): this
removeListener(
event: "end",
listener: () => void,
): this
removeListener(
event: "error",
listener: (err: Error) => void,
): this
removeListener(
event: "finish",
listener: () => void,
): this
removeListener(
event: "pause",
listener: () => void,
): this
removeListener(
event: "pipe",
listener: (src: Readable) => void,
): this
removeListener(
event: "readable",
listener: () => void,
): this
removeListener(
event: "resume",
listener: () => void,
): this
removeListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this

Статические методы

from(src:
Stream
| NodeBlob
| ArrayBuffer
| string
| Iterable<any>
| AsyncIterable<any>
| AsyncGeneratorFunction
| Promise<any>
| Object
): Duplex

Вспомогательный метод для создания двунаправленных потоков.

  • Stream преобразует записываемый поток в записываемый Duplex, а читаемый поток — в Duplex.
  • Blob преобразует в читаемый Duplex.
  • string преобразует в читаемый Duplex.
  • ArrayBuffer преобразует в читаемый Duplex.
  • AsyncIterable преобразует в читаемый Duplex. Не может выдавать null.
  • AsyncGeneratorFunction преобразует в преобразующий Duplex для чтения и записи. Первым параметром должен быть исходный AsyncIterable. Не может выдавать null.
  • AsyncFunction преобразует в записываемый Duplex. Должен возвращать либо null, либо undefined
  • Object ({ writable, readable }) преобразует readable и writable в Stream, а затем объединяет их в Duplex, где Duplex будет записывать в writable и читать из readable.
  • Promise преобразует в читаемый Duplex. Значение null игнорируется.
fromWeb(
duplexStream: { readable: streamWeb.ReadableStream; writable: streamWeb.WritableStream; },
options?: Pick<DuplexOptions,
"allowHalfOpen"
| "decodeStrings"
| "encoding"
| "highWaterMark"
| "objectMode"
| "signal"
>
,
): Duplex

Вспомогательный метод для создания Duplex на основе веб-ReadableStream и WritableStream.

toWeb(streamDuplex: Duplex): { readable: streamWeb.ReadableStream; writable: streamWeb.WritableStream; }

Вспомогательный метод для создания веб-ReadableStream и WritableStream на основе Duplex.

интерфейс default.Duplex

наследует ReadableWritable

класс default.PassThrough

наследует Transform

Использование в Deno

import mod from "node:stream";

Класс stream.PassThrough представляет собой простейшую реализацию потока Transform, который просто передаёт входящие байты на выход. Он предназначен главным образом для примеров и тестирования, однако существуют сценарии, в которых stream.PassThrough полезен как строительный блок для новых типов потоков.


класс default.Readable

реализует [NodeJS.ReadableStream]
наследует Stream

Использование в Deno

import mod from "node:stream";

Конструкторы

Readable(opts?: ReadableOptions)
new

Свойства

closed: boolean
readonly

Имеет значение true после генерации 'close'.

destroyed: boolean

Имеет значение true после вызова readable.destroy().

errored: Error | null
readonly

Возвращает ошибку, если поток был уничтожен из-за ошибки.

readable: boolean

Имеет значение true, если безопасно вызвать read, то есть поток не был уничтожен и не генерировал события 'error' или 'end'.

readableAborted: boolean
readonly

Возвращает, был ли поток уничтожен или произошла ли ошибка до генерации 'end'.

readableDidRead: boolean
readonly

Возвращает, было ли сгенерировано событие 'data'.

readableEncoding: BufferEncoding | null
readonly

Геттер свойства encoding заданного потока Readable. Значение свойства encoding можно задать с помощью метода setEncoding.

readableEnded: boolean
readonly

Принимает значение true при генерации события 'end'.

readableFlowing: boolean | null
readonly

Это свойство отражает текущее состояние потока Readable, описанное в разделе Три состояния.

readableHighWaterMark: number
readonly

Возвращает значение highWaterMark, переданное при создании этого Readable.

readableLength: number
readonly

Это свойство содержит количество байтов (или объектов) в очереди, готовых к чтению. Значение предоставляет данные для анализа состояния highWaterMark.

readableObjectMode: boolean
readonly

Геттер свойства objectMode заданного потока Readable.

Методы

[Symbol.asyncDispose](): Promise<void>

Вызывает readable.destroy() с AbortError и возвращает промис, который выполняется после завершения потока.

[Symbol.asyncIterator](): AsyncIterator<any>
_construct(callback: (error?: Error | null) => void): void
необязательно
_destroy(
error: Error | null,
callback: (error?: Error | null) => void,
): void
_read(size: number): void
addListener(
event: "close",
listener: () => void,
): this

Генератор событий. Определённые события документов включают:

  1. close
  2. data
  3. end
  4. error
  5. pause
  6. readable
  7. resume
addListener(
event: "data",
listener: (chunk: any) => void,
): this
addListener(
event: "end",
listener: () => void,
): this
addListener(
event: "error",
listener: (err: Error) => void,
): this
addListener(
event: "pause",
listener: () => void,
): this
addListener(
event: "readable",
listener: () => void,
): this
addListener(
event: "resume",
listener: () => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
asIndexedPairs(options?: Pick<ArrayOptions, "signal">): Readable

Этот метод возвращает новый поток, в котором фрагменты базового потока представлены в паре со счётчиком в формате [index, chunk]. Первое значение индекса — 0, и оно увеличивается на 1 для каждого созданного фрагмента.

destroy(error?: Error): this

Уничтожает поток. При необходимости генерирует событие 'error', а затем событие 'close' (если только emitClose не установлено в значение false). После этого вызова читаемый поток освободит все внутренние ресурсы, а последующие вызовы push() будут игнорироваться.

После вызова destroy() все дальнейшие вызовы не будут иметь эффекта, а никакие дальнейшие ошибки, кроме _destroy(), не будут генерироваться как 'error'.

Реализующим этот интерфейс не следует переопределять данный метод; вместо этого следует реализовать readable._destroy().

drop(
limit: number,
options?: Pick<ArrayOptions, "signal">,
): Readable

Этот метод возвращает новый поток, отбросив первые limit фрагментов.

emit(event: "close"): boolean
emit(
event: "data",
chunk: any,
): boolean
emit(event: "end"): boolean
emit(
event: "error",
err: Error,
): boolean
emit(event: "pause"): boolean
emit(event: "readable"): boolean
emit(event: "resume"): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
every(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Promise<boolean>

Этот метод похож на Array.prototype.every и вызывает fn для каждого фрагмента потока, чтобы проверить, являются ли все ожидаемые возвращаемые значения истинными для fn. Как только вызов fn для фрагмента возвращает ложное значение после await, поток уничтожается, а промис выполняется со значением false. Если все вызовы fn для фрагментов возвращают истинное значение, промис выполняется со значением true.

filter(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Readable

Этот метод позволяет фильтровать поток. Для каждого фрагмента потока вызывается функция fn; если она возвращает истинное значение, фрагмент передаётся в результирующий поток. Если функция fn возвращает промис, этот промис будет разрешён с помощью await.

find<T>(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => data is T
,
options?: ArrayOptions,
): Promise<T | undefined>

Этот метод похож на Array.prototype.find и вызывает fn для каждого фрагмента потока, чтобы найти фрагмент, для которого fn возвращает истинное значение. Как только ожидаемый результат вызова fn становится истинным, поток уничтожается, а промис выполняется со значением, для которого fn вернула истинное значение. Если все вызовы fn для фрагментов возвращают ложное значение, промис выполняется со значением undefined.

find(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Promise<any>
flatMap(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => any
,
options?: ArrayOptions,
): Readable

Этот метод возвращает новый поток, применяя заданную функцию обратного вызова к каждому фрагменту потока, а затем объединяя результат в один поток.

Функция fn может возвращать поток, другой итерируемый объект или асинхронный итерируемый объект; результирующие потоки будут объединены (сплющены) в возвращаемый поток.

forEach(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => void | Promise<void>
,
options?: ArrayOptions,
): Promise<void>

Этот метод позволяет перебирать поток. Для каждого фрагмента потока вызывается функция fn. Если функция fn возвращает промис, этот промис будет разрешён с помощью await.

Этот метод отличается от циклов for await...of тем, что позволяет при необходимости обрабатывать фрагменты параллельно. Кроме того, итерацию forEach можно остановить только при передаче параметра signal и отмене соответствующего AbortController, тогда как for await...of можно остановить с помощью break или return. В обоих случаях поток будет уничтожен.

Этот метод отличается от прослушивания события 'data' тем, что использует событие readable в базовом механизме и позволяет ограничить число одновременных вызовов fn.

isPaused(): boolean

Метод readable.isPaused() возвращает текущее рабочее состояние Readable. Он используется главным образом механизмом, лежащим в основе метода readable.pipe(). В большинстве типичных случаев нет необходимости вызывать этот метод напрямую.

const readable = new stream.Readable();

readable.isPaused(); // === false
readable.pause();
readable.isPaused(); // === true
readable.resume();
readable.isPaused(); // === false
iterator(options?: { destroyOnReturn?: boolean; }): AsyncIterator<any>

Итератор, созданный этим методом, позволяет отменить уничтожение потока, если цикл for await...of завершён с помощью return, break или throw, а также указать, должен ли итератор уничтожить поток, если во время итерации поток выдал ошибку.

map(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => any
,
options?: ArrayOptions,
): Readable

Этот метод позволяет отображать элементы потока. Функция fn вызывается для каждого фрагмента потока. Если функция fn возвращает промис, этот промис будет разрешён с помощью await перед передачей результата в результирующий поток.

on(
event: "close",
listener: () => void,
): this
on(
event: "data",
listener: (chunk: any) => void,
): this
on(
event: "end",
listener: () => void,
): this
on(
event: "error",
listener: (err: Error) => void,
): this
on(
event: "pause",
listener: () => void,
): this
on(
event: "readable",
listener: () => void,
): this
on(
event: "resume",
listener: () => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "close",
listener: () => void,
): this
once(
event: "data",
listener: (chunk: any) => void,
): this
once(
event: "end",
listener: () => void,
): this
once(
event: "error",
listener: (err: Error) => void,
): this
once(
event: "pause",
listener: () => void,
): this
once(
event: "readable",
listener: () => void,
): this
once(
event: "resume",
listener: () => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
pause(): this

Метод readable.pause() останавливает генерацию событий 'data' потоком в режиме передачи данных, переключая его из режима передачи данных. Любые доступные данные останутся во внутреннем буфере.

const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
  readable.pause();
  console.log('There will be no additional data for 1 second.');
  setTimeout(() => {
    console.log('Now data will start flowing again.');
    readable.resume();
  }, 1000);
});

Метод readable.pause() не действует, если есть обработчик события 'readable'.

prependListener(
event: "close",
listener: () => void,
): this
prependListener(
event: "data",
listener: (chunk: any) => void,
): this
prependListener(
event: "end",
listener: () => void,
): this
prependListener(
event: "error",
listener: (err: Error) => void,
): this
prependListener(
event: "pause",
listener: () => void,
): this
prependListener(
event: "readable",
listener: () => void,
): this
prependListener(
event: "resume",
listener: () => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "close",
listener: () => void,
): this
prependOnceListener(
event: "data",
listener: (chunk: any) => void,
): this
prependOnceListener(
event: "end",
listener: () => void,
): this
prependOnceListener(
event: "error",
listener: (err: Error) => void,
): this
prependOnceListener(
event: "pause",
listener: () => void,
): this
prependOnceListener(
event: "readable",
listener: () => void,
): this
prependOnceListener(
event: "resume",
listener: () => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
push(
chunk: any,
encoding?: BufferEncoding,
): boolean
read(size?: number): any

Метод readable.read() считывает данные из внутреннего буфера и возвращает их. Если данные для чтения отсутствуют, возвращается null. По умолчанию данные возвращаются как объекты Buffer, если только кодировка не задана с помощью метода readable.setEncoding() или поток не работает в режиме объектов.

Необязательный аргумент size задаёт точное количество байтов для чтения. Если для чтения недоступно size байтов, будет возвращено null, если только поток не завершился; в этом случае будут возвращены все данные, оставшиеся во внутреннем буфере.

Если аргумент size не указан, будут возвращены все данные из внутреннего буфера.

Аргумент size должен быть не больше 1 ГиБ.

Метод readable.read() следует вызывать только для потоков Readable, работающих в режиме паузы. В режиме передачи данных readable.read() вызывается автоматически, пока внутренний буфер не будет полностью опустошён.

const readable = getReadableStreamSomehow();

// 'readable' may be triggered multiple times as data is buffered in
readable.on('readable', () => {
  let chunk;
  console.log('Stream is readable (new data received in buffer)');
  // Use a loop to make sure we read all currently available data
  while (null !== (chunk = readable.read())) {
    console.log(`Read ${chunk.length} bytes of data...`);
  }
});

// 'end' will be triggered once when there is no more data available
readable.on('end', () => {
  console.log('Reached end of stream.');
});

Каждый вызов readable.read() возвращает фрагмент данных или null. Фрагменты не объединяются. Чтобы получить все данные, находящиеся в буфере, необходим цикл while. При чтении большого файла .read() может вернуть null, когда все накопленные на данный момент данные уже прочитаны, но новые данные ещё не попали в буфер. В этом случае при появлении данных в буфере будет сгенерировано новое событие 'readable'. Наконец, когда новых данных больше не будет, сгенерируется событие 'end'.

Поэтому, чтобы прочитать всё содержимое файла из readable, необходимо собрать фрагменты из нескольких событий 'readable':

const chunks = [];

readable.on('readable', () => {
  let chunk;
  while (null !== (chunk = readable.read())) {
    chunks.push(chunk);
  }
});

readable.on('end', () => {
  const content = chunks.join('');
});

Поток Readable в режиме объектов всегда возвращает один элемент при вызове readable.read(size) независимо от значения аргумента size.

Если метод readable.read() возвращает фрагмент данных, также будет сгенерировано событие 'data'.

Вызов read после генерации события 'end' вернёт null. Ошибка времени выполнения возникать не будет.

reduce<T = any>(
fn: (
previous: any,
data: any,
options?: Pick<ArrayOptions, "signal">,
) => T
,
initial?: undefined,
options?: Pick<ArrayOptions, "signal">,
): Promise<T>

Этот метод последовательно вызывает fn для каждого фрагмента потока, передавая результат вычисления для предыдущего элемента. Он возвращает промис с итоговым значением свёртки.

Если значение initial не указано, в качестве начального значения используется первый фрагмент потока. Если поток пуст, промис отклоняется с ошибкой TypeError, у которой свойство кода ERR_INVALID_ARGS.

Функция свёртки проходит по элементам потока по одному, поэтому параметр concurrency и параллельная обработка отсутствуют. Чтобы выполнять свёртку параллельно, можно вынести асинхронную функцию в метод readable.map.

reduce<T = any>(
fn: (
previous: T,
data: any,
options?: Pick<ArrayOptions, "signal">,
) => T
,
initial: T,
options?: Pick<ArrayOptions, "signal">,
): Promise<T>
removeListener(
event: "close",
listener: () => void,
): this
removeListener(
event: "data",
listener: (chunk: any) => void,
): this
removeListener(
event: "end",
listener: () => void,
): this
removeListener(
event: "error",
listener: (err: Error) => void,
): this
removeListener(
event: "pause",
listener: () => void,
): this
removeListener(
event: "readable",
listener: () => void,
): this
removeListener(
event: "resume",
listener: () => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
resume(): this

Метод readable.resume() возобновляет генерацию событий 'data' для потока Readable, явно переведённого в режим паузы, и переключает его в режим передачи данных.

Метод readable.resume() можно использовать, чтобы полностью прочитать данные из потока, не обрабатывая их:

getReadableStreamSomehow()
  .resume()
  .on('end', () => {
    console.log('Reached the end, but did not read anything.');
  });

Метод readable.resume() не действует, если есть обработчик события 'readable'.

setEncoding(encoding: BufferEncoding): this

Метод readable.setEncoding() задаёт кодировку символов для данных, считываемых из потока Readable.

По умолчанию кодировка не назначается, и данные потока возвращаются как объекты Buffer. При задании кодировки данные потока возвращаются в виде строк в указанной кодировке, а не объектов Buffer. Например, вызов readable.setEncoding('utf8') приведёт к интерпретации выходных данных как данных UTF-8 и их передаче в виде строк. Вызов readable.setEncoding('hex') приведёт к кодированию данных в виде шестнадцатеричной строки.

Поток Readable корректно обрабатывает многобайтовые символы, поступающие через поток, которые в противном случае декодировались бы некорректно при простом извлечении из потока в виде объектов Buffer.

const readable = getReadableStreamSomehow();
readable.setEncoding('utf8');
readable.on('data', (chunk) => {
  assert.equal(typeof chunk, 'string');
  console.log('Got %d characters of string data:', chunk.length);
});
some(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Promise<boolean>

Этот метод похож на Array.prototype.some и вызывает fn для каждого фрагмента потока, пока ожидаемое возвращаемое значение не станет true (или любым другим истинным значением). Как только вызов fn для фрагмента возвращает истинное значение после await, поток уничтожается, а промис выполняется со значением true. Если ни один вызов fn для фрагментов не возвращает истинное значение, промис выполняется со значением false.

take(
limit: number,
options?: Pick<ArrayOptions, "signal">,
): Readable

Этот метод возвращает новый поток с первыми limit фрагментами.

toArray(options?: Pick<ArrayOptions, "signal">): Promise<any[]>

Этот метод позволяет легко получить содержимое потока.

Поскольку этот метод считывает весь поток в память, он сводит на нет преимущества потоков. Он предназначен для обеспечения совместимости и удобства, а не для основного способа чтения потоков.

unpipe(destination?: WritableStream): this

Метод readable.unpipe() отсоединяет поток Writable, ранее подключённый с помощью метода pipe.

Если destination не указан, отсоединяются все каналы.

Если destination указан, но для него не настроен канал, метод ничего не делает.

import fs from 'node:fs';
const readable = getReadableStreamSomehow();
const writable = fs.createWriteStream('file.txt');
// All the data from readable goes into 'file.txt',
// but only for the first second.
readable.pipe(writable);
setTimeout(() => {
  console.log('Stop writing to file.txt.');
  readable.unpipe(writable);
  console.log('Manually close the file stream.');
  writable.end();
}, 1000);
unshift(
chunk: any,
encoding?: BufferEncoding,
): void

Передача chunk в качестве null сигнализирует о конце потока (EOF) и действует так же, как readable.push(null), после чего записывать новые данные уже нельзя. Сигнал EOF помещается в конец буфера, и все буферизованные данные по-прежнему будут переданы.

Метод readable.unshift() помещает фрагмент данных обратно во внутренний буфер. Это полезно в некоторых ситуациях, когда поток потребляется кодом, которому нужно «отменить потребление» некоторого объёма данных, предварительно извлечённых из источника, чтобы передать их другой стороне.

Метод stream.unshift(chunk) нельзя вызывать после генерации события 'end', иначе будет выброшена ошибка времени выполнения.

Разработчикам, часто использующим stream.unshift(), следует рассмотреть возможность перехода на поток Transform. Дополнительные сведения см. в разделе API for stream implementers.

// Pull off a header delimited by \n\n.
// Use unshift() if we get too much.
// Call the callback with (error, header, stream).
import { StringDecoder } from 'node:string_decoder';
function parseHeader(stream, callback) {
  stream.on('error', callback);
  stream.on('readable', onReadable);
  const decoder = new StringDecoder('utf8');
  let header = '';
  function onReadable() {
    let chunk;
    while (null !== (chunk = stream.read())) {
      const str = decoder.write(chunk);
      if (str.includes('\n\n')) {
        // Found the header boundary.
        const split = str.split(/\n\n/);
        header += split.shift();
        const remaining = split.join('\n\n');
        const buf = Buffer.from(remaining, 'utf8');
        stream.removeListener('error', callback);
        // Remove the 'readable' listener before unshifting.
        stream.removeListener('readable', onReadable);
        if (buf.length)
          stream.unshift(buf);
        // Now the body of the message can be read from the stream.
        callback(null, header, stream);
        return;
      }
      // Still reading the header.
      header += str;
    }
  }
}

В отличие от push, stream.unshift(chunk) не завершает процесс чтения, сбрасывая внутреннее состояние чтения потока. Это может привести к неожиданным результатам, если readable.unshift() вызывается во время чтения (например, из реализации _read в пользовательском потоке). Немедленный вызов push после readable.unshift() корректно сбросит состояние чтения, однако лучше не вызывать readable.unshift() во время чтения.

wrap(stream: ReadableStream): this

До Node.js 0.10 потоки не реализовывали весь API модуля node:stream в его нынешнем виде. (Дополнительные сведения см. в Compatibility.)

При использовании старой библиотеки Node.js, которая генерирует события 'data' и имеет метод pause, но только рекомендует приостановку, метод readable.wrap() можно использовать для создания потока Readable, использующего старый поток в качестве источника данных.

Метод readable.wrap() редко бывает необходим, но он предоставлен для удобства взаимодействия со старыми приложениями и библиотеками Node.js.

import { OldReader } from './old-api-module.js';
import { Readable } from 'node:stream';
const oreader = new OldReader();
const myReader = new Readable().wrap(oreader);

myReader.on('readable', () => {
  myReader.read(); // etc.
});

Статические методы

from(
iterable: Iterable<any> | AsyncIterable<any>,
options?: ReadableOptions,
): Readable

Вспомогательный метод для создания читаемых потоков из итераторов.

fromWeb(
readableStream: streamWeb.ReadableStream,
options?: Pick<ReadableOptions,
"encoding"
| "highWaterMark"
| "objectMode"
| "signal"
>
,
): Readable

Вспомогательный метод для создания Readable из веб-объекта ReadableStream.

isDisturbed(stream: Readable | ReadableStream): boolean

Возвращает сведения о том, выполнялось ли чтение из потока или была ли отменена операция.

toWeb(
streamReadable: Readable,
options?: { strategy?: streamWeb.QueuingStrategy | undefined; },
): streamWeb.ReadableStream

Вспомогательный метод для создания веб-объекта ReadableStream из Readable.


класс default.Transform

наследует Duplex

Использование в Deno

import mod from "node:stream";

Потоки преобразования — это Duplex потоки, в которых выходные данные некоторым образом связаны с входными. Как и все Duplex потоки, Transform потоки реализуют оба интерфейса: Readable и Writable.

Примеры потоков Transform:

  • zlib streams
  • crypto streams

Конструкторы

Transform(opts?: TransformOptions)
новый

Методы

_flush(callback: TransformCallback): void
_transform(
chunk: any,
encoding: BufferEncoding,
callback: TransformCallback,
): void

класс default.Writable

реализует [NodeJS.WritableStream]
наследует Stream

Использование в Deno

import mod from "node:stream";

Конструкторы

Writable(opts?: WritableOptions)
новый

Свойства

closed: boolean
только для чтения

Имеет значение true после генерации события 'close'.

destroyed: boolean

Имеет значение true после вызова writable.destroy().

errored: Error | null
только для чтения

Возвращает ошибку, если поток был уничтожен с ошибкой.

writable: boolean
только для чтения

Имеет значение true, если можно безопасно вызвать writable.write(), то есть поток не был уничтожен, не завершился с ошибкой и не закончился.

writableCorked: number
только для чтения

Количество вызовов writable.uncork(), необходимое для полной отмены приостановки потока.

writableEnded: boolean
только для чтения

Имеет значение true после вызова writable.end(). Это свойство не указывает, были ли сброшены данные; для этого вместо него используйте writable.writableFinished.

writableFinished: boolean
только для чтения

Получает значение true непосредственно перед генерацией события 'finish'.

writableHighWaterMark: number
только для чтения

Возвращает значение highWaterMark, переданное при создании этого Writable.

writableLength: number
только для чтения

Это свойство содержит количество байтов (или объектов) в очереди, готовых к записи. Значение предоставляет данные для анализа состояния highWaterMark.

writableNeedDrain: boolean
только для чтения

Имеет значение true, если буфер потока был заполнен и поток сгенерирует событие 'drain'.

writableObjectMode: boolean
только для чтения

Геттер свойства objectMode заданного потока Writable.

Методы

_construct(callback: (error?: Error | null) => void): void
необязательный
_destroy(
error: Error | null,
callback: (error?: Error | null) => void,
): void
_final(callback: (error?: Error | null) => void): void
_write(
chunk: any,
encoding: BufferEncoding,
callback: (error?: Error | null) => void,
): void
_writev(
chunks: Array<{ chunk: any; encoding: BufferEncoding; }>,
callback: (error?: Error | null) => void,
): void
необязательный
addListener(
event: "close",
listener: () => void,
): this

Эмиттер событий. Определённые события, включая:

  1. close
  2. drain
  3. error
  4. finish
  5. pipe
  6. unpipe
addListener(
event: "drain",
listener: () => void,
): this
addListener(
event: "error",
listener: (err: Error) => void,
): this
addListener(
event: "finish",
listener: () => void,
): this
addListener(
event: "pipe",
listener: (src: Readable) => void,
): this
addListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
cork(): void

Метод writable.cork() принудительно помещает все записываемые данные в буфер в памяти. Буферизованные данные будут сброшены при вызове метода uncork или end.

Основная цель writable.cork() — обработать ситуацию, когда в поток быстро записывается несколько небольших фрагментов. Вместо немедленной передачи в нижележащий пункт назначения writable.cork() буферизует все фрагменты до вызова writable.uncork(), который передаст их все в writable._writev(), если он задан. Это предотвращает блокировку в начале очереди, когда данные буферизуются в ожидании обработки первого небольшого фрагмента. Однако использование writable.cork() без реализации writable._writev() может отрицательно повлиять на пропускную способность.

См. также: writable.uncork(), writable._writev().

destroy(error?: Error): this

Уничтожает поток. При необходимости генерирует событие 'error' и событие 'close' (если только emitClose не установлено в false). После этого вызова записываемый поток завершается, а последующие вызовы write() или end() приведут к ошибке ERR_STREAM_DESTROYED. Это разрушительный и немедленный способ уничтожить поток. Данные, переданные предыдущими вызовами write(), могли не быть сброшены и могут вызвать ошибку ERR_STREAM_DESTROYED. Используйте end() вместо destroy, если данные необходимо сбросить до закрытия, или дождитесь события 'drain' перед уничтожением потока.

После вызова destroy() все последующие вызовы ничего не делают; никакие дальнейшие ошибки, кроме _destroy(), не генерируются как 'error'.

Реализующим метод не следует переопределять этот метод; вместо этого реализуйте writable._destroy().

emit(event: "close"): boolean
emit(event: "drain"): boolean
emit(
event: "error",
err: Error,
): boolean
emit(event: "finish"): boolean
emit(
event: "pipe",
src: Readable,
): boolean
emit(
event: "unpipe",
src: Readable,
): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
end(cb?: () => void): this

Вызов метода writable.end() указывает, что в Writable больше не будут записываться данные. Необязательные аргументы chunk и encoding позволяют записать ещё один последний фрагмент данных непосредственно перед закрытием потока.

Вызов метода write после вызова end приведёт к ошибке.

// Write 'hello, ' and then end with 'world!'.
import fs from 'node:fs';
const file = fs.createWriteStream('example.txt');
file.write('hello, ');
file.end('world!');
// Writing more now is not allowed!
end(
chunk: any,
cb?: () => void,
): this
end(
chunk: any,
encoding: BufferEncoding,
cb?: () => void,
): this
on(
event: "close",
listener: () => void,
): this
on(
event: "drain",
listener: () => void,
): this
on(
event: "error",
listener: (err: Error) => void,
): this
on(
event: "finish",
listener: () => void,
): this
on(
event: "pipe",
listener: (src: Readable) => void,
): this
on(
event: "unpipe",
listener: (src: Readable) => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "close",
listener: () => void,
): this
once(
event: "drain",
listener: () => void,
): this
once(
event: "error",
listener: (err: Error) => void,
): this
once(
event: "finish",
listener: () => void,
): this
once(
event: "pipe",
listener: (src: Readable) => void,
): this
once(
event: "unpipe",
listener: (src: Readable) => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependListener(
event: "close",
listener: () => void,
): this
prependListener(
event: "drain",
listener: () => void,
): this
prependListener(
event: "error",
listener: (err: Error) => void,
): this
prependListener(
event: "finish",
listener: () => void,
): this
prependListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "close",
listener: () => void,
): this
prependOnceListener(
event: "drain",
listener: () => void,
): this
prependOnceListener(
event: "error",
listener: (err: Error) => void,
): this
prependOnceListener(
event: "finish",
listener: () => void,
): this
prependOnceListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
removeListener(
event: "close",
listener: () => void,
): this
removeListener(
event: "drain",
listener: () => void,
): this
removeListener(
event: "error",
listener: (err: Error) => void,
): this
removeListener(
event: "finish",
listener: () => void,
): this
removeListener(
event: "pipe",
listener: (src: Readable) => void,
): this
removeListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
setDefaultEncoding(encoding: BufferEncoding): this

Метод writable.setDefaultEncoding() задаёт кодировку encoding по умолчанию для потока Writable.

uncork(): void

Метод writable.uncork() сбрасывает все данные, буферизованные после вызова cork.

При использовании writable.cork() и writable.uncork() для управления буферизацией записей в поток откладывайте вызовы writable.uncork() с помощью process.nextTick(). Это позволяет объединить в пакеты все вызовы writable.write(), выполняемые в течение одной фазы цикла событий Node.js.

stream.cork();
stream.write('some ');
stream.write('data ');
process.nextTick(() => stream.uncork());

Если метод writable.cork() вызывается для потока несколько раз, для сброса буферизованных данных необходимо вызвать writable.uncork() столько же раз.

stream.cork();
stream.write('some ');
stream.cork();
stream.write('data ');
process.nextTick(() => {
  stream.uncork();
  // The data will not be flushed until uncork() is called a second time.
  stream.uncork();
});

См. также: writable.cork().

write(
chunk: any,
callback?: (error:
Error
| null
| undefined
) => void
,
): boolean

Метод writable.write() записывает данные в поток и вызывает переданный callback после полной обработки данных. При возникновении ошибки callback будет вызван с ошибкой в качестве первого аргумента. Вызов callback выполняется асинхронно и до генерации события 'error'.

Возвращаемое значение — true, если внутренний буфер после добавления chunk меньше значения highWaterMark, заданного при создании потока. Если возвращено false, дальнейшую запись данных в поток следует приостановить до генерации события 'drain'.

Пока поток не опустошается, вызовы write() буферизуют chunk и возвращают false. Когда все фрагменты, находящиеся в буфере, будут переданы (приняты операционной системой для доставки), будет сгенерировано событие 'drain'. Если write() возвращает false, не записывайте новые фрагменты до генерации события 'drain'. Хотя вызовы write() для потока, который не опустошается, разрешены, Node.js будет буферизовать все записанные фрагменты до достижения максимального объёма памяти, после чего безусловно прервёт работу. Ещё до этого высокое потребление памяти ухудшит производительность сборщика мусора и увеличит RSS (который обычно не возвращается системе, даже когда память больше не нужна). Поскольку TCP-сокеты могут никогда не опустошиться, если удалённый узел не читает данные, запись в такой сокет может привести к уязвимости, эксплуатируемой удалённо.

Запись данных, когда поток не опустошается, особенно проблематична для Transform, поскольку потоки Transform по умолчанию приостанавливаются, пока для них не настроена передача данных или не добавлен обработчик события 'data' либо 'readable'.

Если данные можно генерировать или получать по запросу, рекомендуется инкапсулировать эту логику в Readable и использовать pipe. Однако если предпочтительно вызывать write(), можно учитывать обратное давление и избегать проблем с памятью с помощью события 'drain':

function write(data, cb) {
  if (!stream.write(data)) {
    stream.once('drain', cb);
  } else {
    process.nextTick(cb);
  }
}

// Wait for cb to be called before doing any other write.
write('hello', () => {
  console.log('Write completed, do more writes now.');
});

Поток Writable в режиме объектов всегда игнорирует аргумент encoding.

write(
chunk: any,
encoding: BufferEncoding,
callback?: (error:
Error
| null
| undefined
) => void
,
): boolean

Статические методы

fromWeb(
writableStream: streamWeb.WritableStream,
options?: Pick<WritableOptions,
"decodeStrings"
| "highWaterMark"
| "objectMode"
| "signal"
>
,
): Writable

Вспомогательный метод для создания Writable из веб-потока WritableStream.

toWeb(streamWritable: Writable): streamWeb.WritableStream

Вспомогательный метод для создания веб-потока WritableStream из Writable.


class Stream

extends EventEmitter

Использование в Deno

import { Stream } from "node:stream";

Методы

compose<T extends ReadableStream>(
stream:
T
| ComposeFnParam
| Iterable<T>
| AsyncIterable<T>
,
options?: { signal: AbortSignal; },
): T
pipe<T extends WritableStream>(
destination: T,
options?: { end?: boolean | undefined; },
): T

namespace Stream

Классы

Stream.Duplex

Двунаправленные потоки — это потоки, реализующие интерфейсы Readable и Writable.

  • addListener
  • allowHalfOpen
  • emit
  • from
  • fromWeb
  • on
  • once
  • prependListener
  • prependOnceListener
  • removeListener
  • toWeb
Stream.PassThrough

Класс stream.PassThrough представляет собой простую реализацию потока Transform, которая просто передаёт входные байты на выход. Он предназначен главным образом для примеров и тестирования, однако существуют сценарии, в которых stream.PassThrough полезен как строительный блок для новых типов потоков.

Stream.Readable
Документация отсутствует
  • _construct
  • _destroy
  • _read
  • addListener
  • asIndexedPairs
  • closed
  • destroy
  • destroyed
  • drop
  • emit
  • errored
  • every
  • filter
  • find
  • flatMap
  • forEach
  • from
  • fromWeb
  • isDisturbed
  • isPaused
  • iterator
  • map
  • on
  • once
  • pause
  • prependListener
  • prependOnceListener
  • push
  • read
  • readable
  • readableAborted
  • readableDidRead
  • readableEncoding
  • readableEnded
  • readableFlowing
  • readableHighWaterMark
  • readableLength
  • readableObjectMode
  • reduce
  • removeListener
  • resume
  • setEncoding
  • some
  • take
  • toArray
  • toWeb
  • unpipe
  • unshift
  • wrap
Stream.Transform

Преобразующие потоки — это потоки Duplex, выходные данные которых каким-либо образом связаны с входными. Как и все потоки Duplex, потоки Transform реализуют интерфейсы Readable и Writable.

  • _flush
  • _transform
Stream.Writable
Документация отсутствует
  • _construct
  • _destroy
  • _final
  • _write
  • _writev
  • addListener
  • closed
  • cork
  • destroy
  • destroyed
  • emit
  • end
  • errored
  • fromWeb
  • on
  • once
  • prependListener
  • prependOnceListener
  • removeListener
  • setDefaultEncoding
  • toWeb
  • uncork
  • writable
  • writableCorked
  • writableEnded
  • writableFinished
  • writableHighWaterMark
  • writableLength
  • writableNeedDrain
  • writableObjectMode
  • write

Функции

Stream.addAbortSignal

Поток, к которому нужно привязать сигнал.

Stream.duplexPair

Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых является потоком Duplex, соединённым с другим элементом:

Stream.finished

Читаемый и/или записываемый поток или веб-поток.

Stream.getDefaultHighWaterMark

Возвращает значение highWaterMark по умолчанию, используемое потоками. По умолчанию это 65536 (64 КиБ) или 16 для objectMode.

Stream.isErrored

Возвращает признак того, что в потоке произошла ошибка.

Stream.isReadable

Возвращает признак того, что поток доступен для чтения.

Stream.pipeline

Метод модуля для организации передачи данных между потоками и генераторами с передачей ошибок и надлежащей очисткой; вызывает обратный вызов по завершении конвейера.

Stream.setDefaultHighWaterMark

Задаёт значение highWaterMark по умолчанию, используемое потоками.

Интерфейсы

Stream.ArrayOptions
Документация отсутствует
  • concurrency
  • signal
Stream.DuplexOptions
Документация отсутствует
  • allowHalfOpen
  • readableHighWaterMark
  • readableObjectMode
  • writableCorked
  • writableHighWaterMark
  • writableObjectMode
Stream.FinishedOptions
Документация отсутствует
  • error
  • readable
  • writable
Stream.Pipe
Документация отсутствует
  • close
  • hasRef
  • ref
  • unref
Stream.PipelineOptions
Документация отсутствует
  • end
  • signal
Stream.ReadableOptions
Документация отсутствует
  • encoding
  • read
Stream.StreamOptions
Документация отсутствует
  • autoDestroy
  • construct
  • destroy
  • emitClose
  • highWaterMark
  • objectMode
Stream.TransformOptions
Документация отсутствует
  • flush
  • transform
Stream.WritableOptions
Документация отсутствует
  • decodeStrings
  • defaultEncoding
  • final
  • write
  • writev

Псевдонимы типов

Stream.PipelineCallback
Документация отсутствует
Stream.PipelineDestination
Документация отсутствует
Stream.PipelineDestinationIterableFunction
Документация отсутствует
Stream.PipelineDestinationPromiseFunction
Документация отсутствует
Stream.PipelinePromise
Документация отсутствует
Stream.PipelineSource
Документация отсутствует
Stream.PipelineSourceFunction
Документация отсутствует
Stream.PipelineTransform
Документация отсутствует
Stream.PipelineTransformSource
Документация отсутствует
Stream.TransformCallback
Документация отсутствует

класс Stream.Duplex

реализует [NodeJS.ReadWriteStream]
расширяет Stream

Использование в Deno

import { Stream } from "node:stream";

Двунаправленные потоки — это потоки, реализующие оба интерфейса Readable и Writable.

Примеры потоков Duplex:

  • TCP sockets
  • zlib streams
  • crypto streams

Конструкторы

Duplex(opts?: DuplexOptions)
new

Свойства

allowHalfOpen: boolean

Если false, поток автоматически завершит записываемую сторону, когда завершится читаемая сторона. Изначально значение задается параметром конструктора allowHalfOpen, который по умолчанию равен true.

Это значение можно изменить вручную, чтобы поменять поведение существующего экземпляра потока Duplex при полуоткрытом состоянии, однако изменение необходимо внести до отправки события 'end'.

Методы

addListener(
event: "close",
listener: () => void,
): this

Эмиттер событий. Определенные события в документации включают:

  1. close
  2. data
  3. drain
  4. end
  5. error
  6. finish
  7. pause
  8. pipe
  9. readable
  10. resume
  11. unpipe
addListener(
event: "data",
listener: (chunk: any) => void,
): this
addListener(
event: "drain",
listener: () => void,
): this
addListener(
event: "end",
listener: () => void,
): this
addListener(
event: "error",
listener: (err: Error) => void,
): this
addListener(
event: "finish",
listener: () => void,
): this
addListener(
event: "pause",
listener: () => void,
): this
addListener(
event: "pipe",
listener: (src: Readable) => void,
): this
addListener(
event: "readable",
listener: () => void,
): this
addListener(
event: "resume",
listener: () => void,
): this
addListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
emit(event: "close"): boolean
emit(
event: "data",
chunk: any,
): boolean
emit(event: "drain"): boolean
emit(event: "end"): boolean
emit(
event: "error",
err: Error,
): boolean
emit(event: "finish"): boolean
emit(event: "pause"): boolean
emit(
event: "pipe",
src: Readable,
): boolean
emit(event: "readable"): boolean
emit(event: "resume"): boolean
emit(
event: "unpipe",
src: Readable,
): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
on(
event: "close",
listener: () => void,
): this
on(
event: "data",
listener: (chunk: any) => void,
): this
on(
event: "drain",
listener: () => void,
): this
on(
event: "end",
listener: () => void,
): this
on(
event: "error",
listener: (err: Error) => void,
): this
on(
event: "finish",
listener: () => void,
): this
on(
event: "pause",
listener: () => void,
): this
on(
event: "pipe",
listener: (src: Readable) => void,
): this
on(
event: "readable",
listener: () => void,
): this
on(
event: "resume",
listener: () => void,
): this
on(
event: "unpipe",
listener: (src: Readable) => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "close",
listener: () => void,
): this
once(
event: "data",
listener: (chunk: any) => void,
): this
once(
event: "drain",
listener: () => void,
): this
once(
event: "end",
listener: () => void,
): this
once(
event: "error",
listener: (err: Error) => void,
): this
once(
event: "finish",
listener: () => void,
): this
once(
event: "pause",
listener: () => void,
): this
once(
event: "pipe",
listener: (src: Readable) => void,
): this
once(
event: "readable",
listener: () => void,
): this
once(
event: "resume",
listener: () => void,
): this
once(
event: "unpipe",
listener: (src: Readable) => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependListener(
event: "close",
listener: () => void,
): this
prependListener(
event: "data",
listener: (chunk: any) => void,
): this
prependListener(
event: "drain",
listener: () => void,
): this
prependListener(
event: "end",
listener: () => void,
): this
prependListener(
event: "error",
listener: (err: Error) => void,
): this
prependListener(
event: "finish",
listener: () => void,
): this
prependListener(
event: "pause",
listener: () => void,
): this
prependListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependListener(
event: "readable",
listener: () => void,
): this
prependListener(
event: "resume",
listener: () => void,
): this
prependListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "close",
listener: () => void,
): this
prependOnceListener(
event: "data",
listener: (chunk: any) => void,
): this
prependOnceListener(
event: "drain",
listener: () => void,
): this
prependOnceListener(
event: "end",
listener: () => void,
): this
prependOnceListener(
event: "error",
listener: (err: Error) => void,
): this
prependOnceListener(
event: "finish",
listener: () => void,
): this
prependOnceListener(
event: "pause",
listener: () => void,
): this
prependOnceListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: "readable",
listener: () => void,
): this
prependOnceListener(
event: "resume",
listener: () => void,
): this
prependOnceListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
removeListener(
event: "close",
listener: () => void,
): this
removeListener(
event: "data",
listener: (chunk: any) => void,
): this
removeListener(
event: "drain",
listener: () => void,
): this
removeListener(
event: "end",
listener: () => void,
): this
removeListener(
event: "error",
listener: (err: Error) => void,
): this
removeListener(
event: "finish",
listener: () => void,
): this
removeListener(
event: "pause",
listener: () => void,
): this
removeListener(
event: "pipe",
listener: (src: Readable) => void,
): this
removeListener(
event: "readable",
listener: () => void,
): this
removeListener(
event: "resume",
listener: () => void,
): this
removeListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this

Статические методы

from(src:
Stream
| NodeBlob
| ArrayBuffer
| string
| Iterable<any>
| AsyncIterable<any>
| AsyncGeneratorFunction
| Promise<any>
| Object
): Duplex

Вспомогательный метод для создания двунаправленных потоков.

  • Stream преобразует записываемый поток в записываемый Duplex, а читаемый поток — в Duplex.
  • Blob преобразует в читаемый Duplex.
  • string преобразует в читаемый Duplex.
  • ArrayBuffer преобразует в читаемый Duplex.
  • AsyncIterable преобразует в читаемый Duplex. Не может выдавать null.
  • AsyncGeneratorFunction преобразует в преобразующий читаемый/записываемый Duplex. Первым параметром должен быть исходный AsyncIterable. Не может выдавать null.
  • AsyncFunction преобразует в записываемый Duplex. Должен возвращать либо null, либо undefined
  • Object ({ writable, readable }) преобразует readable и writable в Stream, а затем объединяет их в Duplex, где Duplex будет записывать в writable и считывать из readable.
  • Promise преобразует в читаемый Duplex. Значение null игнорируется.
fromWeb(
duplexStream: { readable: streamWeb.ReadableStream; writable: streamWeb.WritableStream; },
options?: Pick<DuplexOptions,
"allowHalfOpen"
| "decodeStrings"
| "encoding"
| "highWaterMark"
| "objectMode"
| "signal"
>
,
): Duplex

Вспомогательный метод для создания Duplex из веб-ReadableStream и WritableStream.

toWeb(streamDuplex: Duplex): { readable: streamWeb.ReadableStream; writable: streamWeb.WritableStream; }

Вспомогательный метод для создания веб-ReadableStream и WritableStream из Duplex.

интерфейс Stream.Duplex

расширяет ReadableWritable

класс Stream.PassThrough

расширяет Transform

Использование в Deno

import { Stream } from "node:stream";

Класс stream.PassThrough — это простая реализация потока Transform, который лишь передает входящие байты на выход. В первую очередь он предназначен для примеров и тестирования, однако существуют сценарии, в которых stream.PassThrough полезен как строительный блок для новых типов потоков.


класс Stream.Readable

реализует [NodeJS.ReadableStream]
расширяет Stream

Использование в Deno

import { Stream } from "node:stream";

Конструкторы

Readable(opts?: ReadableOptions)
new

Свойства

closed: boolean
только для чтения

Указывает, является ли true после отправки события 'close'.

destroyed: boolean

Указывает, является ли true после вызова readable.destroy().

errored: Error | null
только для чтения

Возвращает ошибку, если поток был уничтожен из-за ошибки.

readable: boolean

Указывает, является ли true безопасным вызов read, то есть поток не был уничтожен и не отправлял события 'error' или 'end'.

readableAborted: boolean
только для чтения

Возвращает, был ли поток уничтожен или произошла ли ошибка до отправки события 'end'.

readableDidRead: boolean
только для чтения

Возвращает, было ли отправлено событие 'data'.

readableEncoding: BufferEncoding | null
только для чтения

Геттер свойства encoding заданного потока Readable. Свойству encoding можно задать значение с помощью метода setEncoding.

readableEnded: boolean
только для чтения

Принимает значение true при отправке события 'end'.

readableFlowing: boolean | null
только для чтения

Это свойство отражает текущее состояние потока Readable, описанное в разделе «Три состояния».

readableHighWaterMark: number
только для чтения

Возвращает значение highWaterMark, переданное при создании этого Readable.

readableLength: number
только для чтения

Это свойство содержит количество байтов (или объектов) в очереди, готовых к чтению. Значение предоставляет данные для проверки состояния highWaterMark.

readableObjectMode: boolean
только для чтения

Геттер свойства objectMode заданного потока Readable.

Методы

[Symbol.asyncDispose](): Promise<void>

Вызывает readable.destroy() с AbortError и возвращает промис, который выполняется после завершения потока.

[Symbol.asyncIterator](): AsyncIterator<any>
_construct(callback: (error?: Error | null) => void): void
необязательный
_destroy(
error: Error | null,
callback: (error?: Error | null) => void,
): void
_read(size: number): void
addListener(
event: "close",
listener: () => void,
): this

Генератор событий. Список событий, определённых для документов:

  1. close
  2. data
  3. end
  4. error
  5. pause
  6. readable
  7. resume
addListener(
event: "data",
listener: (chunk: any) => void,
): this
addListener(
event: "end",
listener: () => void,
): this
addListener(
event: "error",
listener: (err: Error) => void,
): this
addListener(
event: "pause",
listener: () => void,
): this
addListener(
event: "readable",
listener: () => void,
): this
addListener(
event: "resume",
listener: () => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
asIndexedPairs(options?: Pick<ArrayOptions, "signal">): Readable

Этот метод возвращает новый поток, в котором фрагменты базового потока объединены со счётчиком в виде [index, chunk]. Значение первого индекса — 0; оно увеличивается на 1 для каждого созданного фрагмента.

destroy(error?: Error): this

Уничтожает поток. При необходимости генерирует событие 'error', а также событие 'close' (если только emitClose не установлено в false). После этого вызова читаемый поток освобождает все внутренние ресурсы, а последующие вызовы push() игнорируются.

После вызова destroy() все последующие вызовы ничего не делают, и никакие дальнейшие ошибки, кроме ошибок из _destroy(), не могут быть сгенерированы как 'error'.

Реализующие этот метод не должны переопределять его, а должны реализовать readable._destroy().

drop(
limit: number,
options?: Pick<ArrayOptions, "signal">,
): Readable

Этот метод возвращает новый поток, в котором отброшены первые limit фрагментов.

emit(event: "close"): boolean
emit(
event: "data",
chunk: any,
): boolean
emit(event: "end"): boolean
emit(
event: "error",
err: Error,
): boolean
emit(event: "pause"): boolean
emit(event: "readable"): boolean
emit(event: "resume"): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
every(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Promise<boolean>

Этот метод похож на Array.prototype.every и вызывает fn для каждого фрагмента потока, чтобы проверить, являются ли все ожидаемые возвращаемые значения truthy-значениями для fn. Если ожидаемое возвращаемое значение вызова fn для фрагмента оказывается ложным после await, поток уничтожается, а промис выполняется с результатом false. Если все вызовы fn для фрагментов возвращают truthy-значение, промис выполняется с результатом true.

filter(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Readable

Этот метод позволяет фильтровать поток. Для каждого фрагмента потока вызывается функция fn; если она возвращает truthy-значение, фрагмент передаётся в результирующий поток. Если функция fn возвращает промис, этот промис будет обработан с помощью await.

find<T>(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => data is T
,
options?: ArrayOptions,
): Promise<T | undefined>

Этот метод похож на Array.prototype.find и вызывает fn для каждого фрагмента потока, чтобы найти фрагмент, для которого fn возвращает truthy-значение. Когда ожидаемое возвращаемое значение вызова fn становится truthy, поток уничтожается, а промис выполняется со значением, для которого fn вернула truthy-значение. Если все вызовы fn для фрагментов возвращают falsy-значение, промис выполняется с результатом undefined.

find(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Promise<any>
flatMap(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => any
,
options?: ArrayOptions,
): Readable

Этот метод возвращает новый поток, применяя заданную функцию обратного вызова к каждому фрагменту потока и затем объединяя результаты.

Функция fn может возвращать поток, другой итерируемый объект или асинхронный итерируемый объект; результирующие потоки будут объединены в возвращаемый поток.

forEach(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => void | Promise<void>
,
options?: ArrayOptions,
): Promise<void>

Этот метод позволяет перебирать поток. Для каждого фрагмента потока вызывается функция fn. Если функция fn возвращает промис, этот промис будет обработан с помощью await.

Этот метод отличается от циклов for await...of тем, что позволяет при необходимости обрабатывать фрагменты параллельно. Кроме того, итерацию forEach можно остановить, только передав параметр signal и прервав связанный AbortController, тогда как for await...of можно остановить с помощью break или return. В обоих случаях поток будет уничтожен.

Этот метод отличается от прослушивания события 'data' тем, что использует событие readable в базовом механизме и позволяет ограничить число параллельных вызовов fn.

isPaused(): boolean

Метод readable.isPaused() возвращает текущее состояние работы Readable. Он используется главным образом механизмом, лежащим в основе метода readable.pipe(). В большинстве обычных случаев нет причин использовать этот метод напрямую.

const readable = new stream.Readable();

readable.isPaused(); // === false
readable.pause();
readable.isPaused(); // === true
readable.resume();
readable.isPaused(); // === false
iterator(options?: { destroyOnReturn?: boolean; }): AsyncIterator<any>

Итератор, созданный этим методом, позволяет отменить уничтожение потока, если цикл for await...of завершён с помощью return, break или throw, либо настроить уничтожение потока итератором, если во время итерации поток сгенерировал ошибку.

map(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => any
,
options?: ArrayOptions,
): Readable

Этот метод позволяет выполнять преобразование элементов потока. Функция fn вызывается для каждого фрагмента потока. Если функция fn возвращает промис, этот промис будет обработан с помощью await перед передачей в результирующий поток.

on(
event: "close",
listener: () => void,
): this
on(
event: "data",
listener: (chunk: any) => void,
): this
on(
event: "end",
listener: () => void,
): this
on(
event: "error",
listener: (err: Error) => void,
): this
on(
event: "pause",
listener: () => void,
): this
on(
event: "readable",
listener: () => void,
): this
on(
event: "resume",
listener: () => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "close",
listener: () => void,
): this
once(
event: "data",
listener: (chunk: any) => void,
): this
once(
event: "end",
listener: () => void,
): this
once(
event: "error",
listener: (err: Error) => void,
): this
once(
event: "pause",
listener: () => void,
): this
once(
event: "readable",
listener: () => void,
): this
once(
event: "resume",
listener: () => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
pause(): this

Метод readable.pause() переводит поток в режиме передачи данных в режим ожидания и прекращает генерировать события 'data'. Все доступные данные остаются во внутреннем буфере.

const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
  readable.pause();
  console.log('There will be no additional data for 1 second.');
  setTimeout(() => {
    console.log('Now data will start flowing again.');
    readable.resume();
  }, 1000);
});

Метод readable.pause() не оказывает влияния, если существует обработчик события 'readable'.

prependListener(
event: "close",
listener: () => void,
): this
prependListener(
event: "data",
listener: (chunk: any) => void,
): this
prependListener(
event: "end",
listener: () => void,
): this
prependListener(
event: "error",
listener: (err: Error) => void,
): this
prependListener(
event: "pause",
listener: () => void,
): this
prependListener(
event: "readable",
listener: () => void,
): this
prependListener(
event: "resume",
listener: () => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "close",
listener: () => void,
): this
prependOnceListener(
event: "data",
listener: (chunk: any) => void,
): this
prependOnceListener(
event: "end",
listener: () => void,
): this
prependOnceListener(
event: "error",
listener: (err: Error) => void,
): this
prependOnceListener(
event: "pause",
listener: () => void,
): this
prependOnceListener(
event: "readable",
listener: () => void,
): this
prependOnceListener(
event: "resume",
listener: () => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
push(
chunk: any,
encoding?: BufferEncoding,
): boolean
read(size?: number): any

Метод readable.read() считывает данные из внутреннего буфера и возвращает их. Если данных для чтения нет, возвращается null. По умолчанию данные возвращаются как объект Buffer, если только кодировка не задана методом readable.setEncoding() или поток не работает в режиме объектов.

Необязательный аргумент size задаёт точное число байтов для чтения. Если size байтов недоступны для чтения, будет возвращено null, если только поток не завершился; в этом случае будут возвращены все оставшиеся данные из внутреннего буфера.

Если аргумент size не указан, будут возвращены все данные из внутреннего буфера.

Аргумент size должен быть меньше или равен 1 ГиБ.

Метод readable.read() следует вызывать только для потоков Readable, работающих в режиме ожидания. В режиме передачи данных readable.read() вызывается автоматически, пока внутренний буфер не будет полностью опустошён.

const readable = getReadableStreamSomehow();

// 'readable' may be triggered multiple times as data is buffered in
readable.on('readable', () => {
  let chunk;
  console.log('Stream is readable (new data received in buffer)');
  // Use a loop to make sure we read all currently available data
  while (null !== (chunk = readable.read())) {
    console.log(`Read ${chunk.length} bytes of data...`);
  }
});

// 'end' will be triggered once when there is no more data available
readable.on('end', () => {
  console.log('Reached end of stream.');
});

Каждый вызов readable.read() возвращает фрагмент данных или null. Фрагменты не объединяются. Чтобы считать все данные, имеющиеся в буфере, необходим цикл while. При чтении большого файла .read() может вернуть null, исчерпав всё содержимое буфера на данный момент, хотя впереди ещё есть данные, которые пока не помещены в буфер. В этом случае, когда в буфере появятся новые данные, будет сгенерировано новое событие 'readable'. Когда новых данных больше не будет, наконец, будет сгенерировано событие 'end'.

Поэтому, чтобы прочитать всё содержимое файла из readable, необходимо собрать фрагменты из нескольких событий 'readable':

const chunks = [];

readable.on('readable', () => {
  let chunk;
  while (null !== (chunk = readable.read())) {
    chunks.push(chunk);
  }
});

readable.on('end', () => {
  const content = chunks.join('');
});

Поток Readable в режиме объектов всегда возвращает один элемент при вызове readable.read(size), независимо от значения аргумента size.

Если метод readable.read() возвращает фрагмент данных, также будет сгенерировано событие 'data'.

Вызов read после генерации события 'end' вернёт null. Ошибка времени выполнения не возникнет.

reduce<T = any>(
fn: (
previous: any,
data: any,
options?: Pick<ArrayOptions, "signal">,
) => T
,
initial?: undefined,
options?: Pick<ArrayOptions, "signal">,
): Promise<T>

Этот метод последовательно вызывает fn для каждого фрагмента потока, передавая результат вычисления для предыдущего элемента. Он возвращает промис с итоговым значением свёртки.

Если начальное значение initial не задано, в качестве него используется первый фрагмент потока. Если поток пуст, промис отклоняется с ошибкой TypeError, у которой свойство кода ERR_INVALID_ARGS.

Функция свёртки обрабатывает элементы потока по одному, поэтому параметр concurrency и параллелизм отсутствуют. Чтобы выполнить свёртку параллельно, можно вынести асинхронную функцию в метод readable.map.

reduce<T = any>(
fn: (
previous: T,
data: any,
options?: Pick<ArrayOptions, "signal">,
) => T
,
initial: T,
options?: Pick<ArrayOptions, "signal">,
): Promise<T>
removeListener(
event: "close",
listener: () => void,
): this
removeListener(
event: "data",
listener: (chunk: any) => void,
): this
removeListener(
event: "end",
listener: () => void,
): this
removeListener(
event: "error",
listener: (err: Error) => void,
): this
removeListener(
event: "pause",
listener: () => void,
): this
removeListener(
event: "readable",
listener: () => void,
): this
removeListener(
event: "resume",
listener: () => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
resume(): this

Метод readable.resume() возобновляет генерацию событий 'data' у явно приостановленного потока Readable и переводит поток в режим передачи данных.

Метод readable.resume() можно использовать для полного считывания данных из потока без их фактической обработки:

getReadableStreamSomehow()
  .resume()
  .on('end', () => {
    console.log('Reached the end, but did not read anything.');
  });

Метод readable.resume() не оказывает влияния, если существует обработчик события 'readable'.

setEncoding(encoding: BufferEncoding): this

Метод readable.setEncoding() задаёт кодировку символов для данных, считываемых из потока Readable.

По умолчанию кодировка не задана, и данные потока возвращаются как объекты Buffer. Если задать кодировку, данные потока будут возвращаться в виде строк в указанной кодировке, а не объектов Buffer. Например, вызов readable.setEncoding('utf8') приведёт к интерпретации выходных данных как данных UTF-8 и их передаче в виде строк. Вызов readable.setEncoding('hex') приведёт к кодированию данных в виде шестнадцатеричной строки.

Поток Readable корректно обрабатывает многобайтные символы, поступающие через поток, которые в противном случае были бы декодированы некорректно при простом считывании из потока в виде объектов Buffer.

const readable = getReadableStreamSomehow();
readable.setEncoding('utf8');
readable.on('data', (chunk) => {
  assert.equal(typeof chunk, 'string');
  console.log('Got %d characters of string data:', chunk.length);
});
some(
fn: (
data: any,
options?: Pick<ArrayOptions, "signal">,
) => boolean | Promise<boolean>
,
options?: ArrayOptions,
): Promise<boolean>

Этот метод похож на Array.prototype.some и вызывает fn для каждого фрагмента потока, пока ожидаемое возвращаемое значение не станет true (или любым truthy-значением). Если после await ожидаемое возвращаемое значение вызова fn для фрагмента становится truthy, поток уничтожается, а промис выполняется с результатом true. Если ни один вызов fn для фрагментов не возвращает truthy-значение, промис выполняется с результатом false.

take(
limit: number,
options?: Pick<ArrayOptions, "signal">,
): Readable

Этот метод возвращает новый поток, содержащий первые limit фрагментов.

toArray(options?: Pick<ArrayOptions, "signal">): Promise<any[]>

Этот метод позволяет легко получить содержимое потока.

Поскольку этот метод считывает весь поток в память, он сводит на нет преимущества потоков. Он предназначен для обеспечения совместимости и удобства, а не для использования в качестве основного способа чтения потоков.

unpipe(destination?: WritableStream): this

Метод readable.unpipe() отсоединяет поток Writable, ранее подключённый с помощью метода pipe.

Если destination не указан, отсоединяются все каналы.

Если destination указан, но для него не настроен канал, метод ничего не делает.

import fs from 'node:fs';
const readable = getReadableStreamSomehow();
const writable = fs.createWriteStream('file.txt');
// All the data from readable goes into 'file.txt',
// but only for the first second.
readable.pipe(writable);
setTimeout(() => {
  console.log('Stop writing to file.txt.');
  readable.unpipe(writable);
  console.log('Manually close the file stream.');
  writable.end();
}, 1000);
unshift(
chunk: any,
encoding?: BufferEncoding,
): void

Передача chunk в качестве null сигнализирует о конце потока (EOF) и действует так же, как readable.push(null); после этого больше нельзя записывать данные. Сигнал EOF помещается в конец буфера, и все буферизованные данные по-прежнему будут сброшены.

Метод readable.unshift() помещает фрагмент данных обратно во внутренний буфер. Это полезно в ситуациях, когда поток потребляется кодом, которому нужно «отменить чтение» некоторого объёма данных, оптимистично считанных из источника, чтобы передать эти данные другой стороне.

Метод stream.unshift(chunk) нельзя вызывать после генерации события 'end', иначе будет выброшена ошибка времени выполнения.

Разработчикам, часто использующим stream.unshift(), следует рассмотреть возможность перехода на поток Transform. Дополнительные сведения см. в разделе API for stream implementers.

// Pull off a header delimited by \n\n.
// Use unshift() if we get too much.
// Call the callback with (error, header, stream).
import { StringDecoder } from 'node:string_decoder';
function parseHeader(stream, callback) {
  stream.on('error', callback);
  stream.on('readable', onReadable);
  const decoder = new StringDecoder('utf8');
  let header = '';
  function onReadable() {
    let chunk;
    while (null !== (chunk = stream.read())) {
      const str = decoder.write(chunk);
      if (str.includes('\n\n')) {
        // Found the header boundary.
        const split = str.split(/\n\n/);
        header += split.shift();
        const remaining = split.join('\n\n');
        const buf = Buffer.from(remaining, 'utf8');
        stream.removeListener('error', callback);
        // Remove the 'readable' listener before unshifting.
        stream.removeListener('readable', onReadable);
        if (buf.length)
          stream.unshift(buf);
        // Now the body of the message can be read from the stream.
        callback(null, header, stream);
        return;
      }
      // Still reading the header.
      header += str;
    }
  }
}

В отличие от push, stream.unshift(chunk) не завершает процесс чтения сбросом внутреннего состояния чтения потока. Это может привести к неожиданным результатам, если readable.unshift() вызывается во время чтения (например, из реализации _read пользовательского потока). Немедленный вызов push после readable.unshift() корректно сбросит состояние чтения, однако лучше просто не вызывать readable.unshift() во время выполнения операции чтения.

wrap(stream: ReadableStream): this

До Node.js 0.10 потоки не реализовывали весь API модуля node:stream в его нынешнем виде. (Дополнительные сведения см. в Compatibility.)

При использовании старой библиотеки Node.js, генерирующей события 'data' и имеющей метод pause, который лишь даёт рекомендацию, метод readable.wrap() можно использовать для создания потока Readable, использующего старый поток в качестве источника данных.

Метод readable.wrap() требуется редко, однако он предоставлен для удобства взаимодействия со старыми приложениями и библиотеками Node.js.

import { OldReader } from './old-api-module.js';
import { Readable } from 'node:stream';
const oreader = new OldReader();
const myReader = new Readable().wrap(oreader);

myReader.on('readable', () => {
  myReader.read(); // etc.
});

Статические методы

from(
iterable: Iterable<any> | AsyncIterable<any>,
options?: ReadableOptions,
): Readable

Вспомогательный метод для создания читаемых потоков из итераторов.

fromWeb(
readableStream: streamWeb.ReadableStream,
options?: Pick<ReadableOptions,
"encoding"
| "highWaterMark"
| "objectMode"
| "signal"
>
,
): Readable

Вспомогательный метод для создания Readable из веб-объекта ReadableStream.

isDisturbed(stream: Readable | ReadableStream): boolean

Возвращает информацию о том, выполнялось ли чтение из потока или была ли отменена его обработка.

toWeb(
streamReadable: Readable,
options?: { strategy?: streamWeb.QueuingStrategy | undefined; },
): streamWeb.ReadableStream

Вспомогательный метод для создания веб-объекта ReadableStream из Readable.


класс Stream.Transform

расширяет Duplex

Использование в Deno

import { Stream } from "node:stream";

Потоки преобразования — это потоки Duplex, выходные данные которых каким-либо образом связаны с входными. Как и все потоки Duplex, потоки Transform реализуют интерфейсы Readable и Writable.

Примеры потоков Transform:

  • zlib streams
  • crypto streams

Конструкторы

Transform(opts?: TransformOptions)
новый

Методы

_flush(callback: TransformCallback): void
_transform(
chunk: any,
encoding: BufferEncoding,
callback: TransformCallback,
): void

класс Stream.Writable

реализует [NodeJS.WritableStream]
расширяет Stream

Использование в Deno

import { Stream } from "node:stream";

Конструкторы

Writable(opts?: WritableOptions)
новый

Свойства

closed: boolean
только для чтения

Равен true после срабатывания события 'close'.

destroyed: boolean

Равен true после вызова writable.destroy().

errored: Error | null
только для чтения

Возвращает ошибку, если поток был уничтожен из-за ошибки.

writable: boolean
только для чтения

Равен true, если безопасно вызвать writable.write(), то есть поток не был уничтожен, в нём не произошла ошибка и он не завершился.

writableCorked: number
только для чтения

Количество вызовов writable.uncork(), необходимых для полной разблокировки потока.

writableEnded: boolean
только для чтения

Равен true после вызова writable.end(). Это свойство не указывает, были ли данные сброшены; для этого вместо него используйте writable.writableFinished.

writableFinished: boolean
только для чтения

Устанавливается в значение true непосредственно перед генерацией события 'finish'.

writableHighWaterMark: number
только для чтения

Возвращает значение highWaterMark, переданное при создании этого Writable.

writableLength: number
только для чтения

Это свойство содержит количество байтов (или объектов) в очереди, готовых к записи. Значение предоставляет данные для анализа состояния highWaterMark.

writableNeedDrain: boolean
только для чтения

Равен true, если буфер потока был заполнен и поток сгенерирует событие 'drain'.

writableObjectMode: boolean
только для чтения

Геттер свойства objectMode заданного потока Writable.

Методы

_construct(callback: (error?: Error | null) => void): void
необязательный
_destroy(
error: Error | null,
callback: (error?: Error | null) => void,
): void
_final(callback: (error?: Error | null) => void): void
_write(
chunk: any,
encoding: BufferEncoding,
callback: (error?: Error | null) => void,
): void
_writev(
chunks: Array<{ chunk: any; encoding: BufferEncoding; }>,
callback: (error?: Error | null) => void,
): void
необязательный
addListener(
event: "close",
listener: () => void,
): this

Генератор событий. Определённые в документации события включают:

  1. close
  2. drain
  3. error
  4. finish
  5. pipe
  6. unpipe
addListener(
event: "drain",
listener: () => void,
): this
addListener(
event: "error",
listener: (err: Error) => void,
): this
addListener(
event: "finish",
listener: () => void,
): this
addListener(
event: "pipe",
listener: (src: Readable) => void,
): this
addListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
cork(): void

Метод writable.cork() принудительно буферизует в памяти все записанные данные. Буферизованные данные будут сброшены при вызове метода uncork или end.

Основное назначение writable.cork() — обработка ситуации, когда в поток подряд быстро записываются несколько небольших фрагментов. Вместо немедленной передачи их в нижележащий пункт назначения writable.cork() буферизует все фрагменты до вызова writable.uncork(), после чего передаёт их все в writable._writev(), если он задан. Это предотвращает блокировку в начале очереди, при которой данные буферизуются в ожидании обработки первого небольшого фрагмента. Однако использование writable.cork() без реализации writable._writev() может отрицательно сказаться на пропускной способности.

См. также: writable.uncork(), writable._writev().

destroy(error?: Error): this

Уничтожает поток. При необходимости генерирует событие 'error', а также событие 'close' (если только emitClose не установлен в значение false). После этого вызова запись в поток завершается, а последующие вызовы write() или end() приведут к ошибке ERR_STREAM_DESTROYED. Это разрушительный и немедленный способ уничтожить поток. Предыдущие вызовы write() могли не завершить сброс данных и могут вызвать ошибку ERR_STREAM_DESTROYED. Вместо destroy используйте end(), если перед закрытием данные должны быть сброшены, либо дождитесь события 'drain' перед уничтожением потока.

После вызова destroy() все последующие вызовы не будут выполнять никаких действий, и ошибки, кроме _destroy(), больше не будут генерироваться, поскольку 'error'.

Реализующие класс не должны переопределять этот метод, вместо этого следует реализовать writable._destroy().

emit(event: "close"): boolean
emit(event: "drain"): boolean
emit(
event: "error",
err: Error,
): boolean
emit(event: "finish"): boolean
emit(
event: "pipe",
src: Readable,
): boolean
emit(
event: "unpipe",
src: Readable,
): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
end(cb?: () => void): this

Вызов метода writable.end() сообщает, что в Writable больше не будут записываться данные. Необязательные аргументы chunk и encoding позволяют записать ещё один заключительный фрагмент данных непосредственно перед закрытием потока.

Вызов метода write после вызова end приведёт к ошибке.

// Write 'hello, ' and then end with 'world!'.
import fs from 'node:fs';
const file = fs.createWriteStream('example.txt');
file.write('hello, ');
file.end('world!');
// Writing more now is not allowed!
end(
chunk: any,
cb?: () => void,
): this
end(
chunk: any,
encoding: BufferEncoding,
cb?: () => void,
): this
on(
event: "close",
listener: () => void,
): this
on(
event: "drain",
listener: () => void,
): this
on(
event: "error",
listener: (err: Error) => void,
): this
on(
event: "finish",
listener: () => void,
): this
on(
event: "pipe",
listener: (src: Readable) => void,
): this
on(
event: "unpipe",
listener: (src: Readable) => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "close",
listener: () => void,
): this
once(
event: "drain",
listener: () => void,
): this
once(
event: "error",
listener: (err: Error) => void,
): this
once(
event: "finish",
listener: () => void,
): this
once(
event: "pipe",
listener: (src: Readable) => void,
): this
once(
event: "unpipe",
listener: (src: Readable) => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependListener(
event: "close",
listener: () => void,
): this
prependListener(
event: "drain",
listener: () => void,
): this
prependListener(
event: "error",
listener: (err: Error) => void,
): this
prependListener(
event: "finish",
listener: () => void,
): this
prependListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "close",
listener: () => void,
): this
prependOnceListener(
event: "drain",
listener: () => void,
): this
prependOnceListener(
event: "error",
listener: (err: Error) => void,
): this
prependOnceListener(
event: "finish",
listener: () => void,
): this
prependOnceListener(
event: "pipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
removeListener(
event: "close",
listener: () => void,
): this
removeListener(
event: "drain",
listener: () => void,
): this
removeListener(
event: "error",
listener: (err: Error) => void,
): this
removeListener(
event: "finish",
listener: () => void,
): this
removeListener(
event: "pipe",
listener: (src: Readable) => void,
): this
removeListener(
event: "unpipe",
listener: (src: Readable) => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
setDefaultEncoding(encoding: BufferEncoding): this

Метод writable.setDefaultEncoding() задаёт кодировку encoding по умолчанию для потока Writable.

uncork(): void

Метод writable.uncork() сбрасывает все данные, буферизованные после вызова cork.

При использовании writable.cork() и writable.uncork() для управления буферизацией записей в поток откладывайте вызовы writable.uncork() с помощью process.nextTick(). Это позволяет объединить в пакет все вызовы writable.write(), происходящие в рамках одной фазы цикла событий Node.js.

stream.cork();
stream.write('some ');
stream.write('data ');
process.nextTick(() => stream.uncork());

Если метод writable.cork() вызывается для потока несколько раз, для сброса буферизованных данных необходимо вызвать writable.uncork() столько же раз.

stream.cork();
stream.write('some ');
stream.cork();
stream.write('data ');
process.nextTick(() => {
  stream.uncork();
  // The data will not be flushed until uncork() is called a second time.
  stream.uncork();
});

См. также: writable.cork().

write(
chunk: any,
callback?: (error:
Error
| null
| undefined
) => void
,
): boolean

Метод writable.write() записывает данные в поток и вызывает переданный callback после полной обработки данных. В случае ошибки callback будет вызван с ошибкой в качестве первого аргумента. callback вызывается асинхронно и до генерации события 'error'.

Возвращаемое значение — true, если после добавления chunk внутренний буфер меньше значения highWaterMark, заданного при создании потока. Если возвращено false, дальнейшую запись данных в поток следует прекратить до генерации события 'drain'.

Пока поток не опустошается, вызовы write() буферизуют chunk и возвращают false. После опустошения всех буферизованных фрагментов (их передачи операционной системе для доставки) будет сгенерировано событие 'drain'. Если write() возвращает false, не записывайте новые фрагменты до генерации события 'drain'. Хотя вызов write() для потока, который не опустошается, допустим, Node.js будет буферизовать все записанные фрагменты, пока не будет достигнут максимальный объём памяти, после чего безусловно прервёт работу. Ещё до этого высокая нагрузка на память ухудшит производительность сборщика мусора и увеличит RSS (который обычно не освобождается обратно системе даже после того, как память больше не нужна). Поскольку TCP-сокеты могут никогда не опустошиться, если удалённый узел не считывает данные, запись в такой сокет может привести к уязвимости, эксплуатируемой удалённо.

Запись данных, пока поток не опустошается, особенно проблематична для Transform, поскольку потоки Transform по умолчанию приостановлены до передачи данных через pipe либо добавления обработчика события 'data' или 'readable'.

Если данные для записи можно генерировать или получать по запросу, рекомендуется инкапсулировать эту логику в Readable и использовать pipe. Однако, если предпочтительно вызывать write(), можно соблюдать обратное давление и избежать проблем с памятью, используя событие 'drain':

function write(data, cb) {
  if (!stream.write(data)) {
    stream.once('drain', cb);
  } else {
    process.nextTick(cb);
  }
}

// Wait for cb to be called before doing any other write.
write('hello', () => {
  console.log('Write completed, do more writes now.');
});

Поток Writable в режиме объектов всегда игнорирует аргумент encoding.

write(
chunk: any,
encoding: BufferEncoding,
callback?: (error:
Error
| null
| undefined
) => void
,
): boolean

Статические методы

fromWeb(
writableStream: streamWeb.WritableStream,
options?: Pick<WritableOptions,
"decodeStrings"
| "highWaterMark"
| "objectMode"
| "signal"
>
,
): Writable

Вспомогательный метод для создания Writable из веб-потока WritableStream.

toWeb(streamWritable: Writable): streamWeb.WritableStream

Вспомогательный метод для создания веб-потока WritableStream из Writable.


функция default.addAbortSignal

Использование в Deno

import mod from "node:stream";
addAbortSignal<T extends Stream>(
signal: AbortSignal,
stream: T,
): T

Поток, к которому нужно подключить сигнал.

Подключает AbortSignal к потоку для чтения или записи. Это позволяет управлять уничтожением потока с помощью AbortController.

Вызов abort для AbortController, соответствующего переданному AbortSignal, будет вести себя так же, как вызов .destroy(new AbortError()) для потока и controller.error(new AbortError()) для веб-потоков.

import fs from 'node:fs';

const controller = new AbortController();
const read = addAbortSignal(
  controller.signal,
  fs.createReadStream(('object.json')),
);
// Later, abort the operation closing the stream
controller.abort();

Или с использованием AbortSignal с потоком для чтения в качестве асинхронного итерируемого объекта:

const controller = new AbortController();
setTimeout(() => controller.abort(), 10_000); // set a timeout
const stream = addAbortSignal(
  controller.signal,
  fs.createReadStream(('object.json')),
);
(async () => {
  try {
    for await (const chunk of stream) {
      await process(chunk);
    }
  } catch (e) {
    if (e.name === 'AbortError') {
      // The operation was cancelled
    } else {
      throw e;
    }
  }
})();

Или с использованием AbortSignal с ReadableStream:

const controller = new AbortController();
const rs = new ReadableStream({
  start(controller) {
    controller.enqueue('hello');
    controller.enqueue('world');
    controller.close();
  },
});

addAbortSignal(controller.signal, rs);

finished(rs, (err) => {
  if (err) {
    if (err.name === 'AbortError') {
      // The operation was cancelled
    }
  }
});

const reader = rs.getReader();

reader.read().then(({ value, done }) => {
  console.log(value); // hello
  console.log(done); // false
  controller.abort();
});

Параметры типа

T extends Stream

Параметры

signal: AbortSignal

Сигнал, представляющий возможную отмену

stream: T

Поток, к которому нужно подключить сигнал.

Возвращаемый тип

T

функция default.duplexPair

Использование в Deno

import mod from "node:stream";
duplexPair(options?: DuplexOptions): [Duplex, Duplex]

Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых представляет собой поток Duplex, подключённый к другой стороне:

const [ sideA, sideB ] = duplexPair();

Всё, что записывается в один поток, становится доступным для чтения в другом. Это обеспечивает поведение, аналогичное сетевому соединению: данные, записанные клиентом, становятся доступны для чтения серверу, и наоборот.

Двунаправленные потоки симметричны: любой из них можно использовать без каких-либо различий в поведении.

Параметры

options: DuplexOptions
необязательный

Значение, передаваемое обоим конструкторам Duplex для настройки таких параметров, как буферизация.

Тип возвращаемого значения

[Duplex, Duplex]

функция default.finished

Использование в Deno

import mod from "node:stream";

Перегрузка 1

finished(
stream:
ReadableStream
| WritableStream
| ReadWriteStream
,
options: FinishedOptions,
callback: (err?: ErrnoException | null) => void,
): () => void

Читаемый и/или доступный для записи поток или веб-поток.

Функция для получения уведомления о том, что поток больше не доступен для чтения или записи, в нём произошла ошибка либо произошло преждевременное закрытие.

import { finished } from 'node:stream';
import fs from 'node:fs';

const rs = fs.createReadStream('archive.tar');

finished(rs, (err) => {
  if (err) {
    console.error('Stream failed.', err);
  } else {
    console.log('Stream is done reading.');
  }
});

rs.resume(); // Drain the stream.

Особенно полезна при обработке ошибок в ситуациях, когда поток был уничтожен преждевременно (например, из-за прерванного HTTP-запроса) и не будет генерировать 'end' или 'finish'.

API finished предоставляет promise version.

stream.finished() оставляет не удалённые обработчики событий (в частности, 'error', 'end', 'finish' и 'close') после вызова callback. Это сделано для того, чтобы неожиданные события 'error' (вызванные некорректной реализацией потока) не приводили к неожиданным сбоям. Если такое поведение нежелательно, необходимо вызвать возвращённую функцию очистки в callback-функции:

const cleanup = finished(rs, (err) => {
  cleanup();
  // ...
});

Параметры

stream:
ReadableStream
| WritableStream
| ReadWriteStream

Читаемый и/или доступный для записи поток.

options: FinishedOptions
callback: (err?: ErrnoException | null) => void

Callback-функция, принимающая необязательный аргумент ошибки.

Тип возвращаемого значения

() => void

Функция очистки, удаляющая все зарегистрированные обработчики.

Перегрузка 2

finished(
stream:
ReadableStream
| WritableStream
| ReadWriteStream
,
callback: (err?: ErrnoException | null) => void,
): () => void

Параметры

stream:
ReadableStream
| WritableStream
| ReadWriteStream
callback: (err?: ErrnoException | null) => void

Тип возвращаемого значения

() => void

пространство имён default.finished

Функции

default.finished.__promisify__
Документация отсутствует

функция default.finished.__promisify__

Использование в Deno

import mod from "node:stream";
__promisify__(
stream:
ReadableStream
| WritableStream
| ReadWriteStream
,
options?: FinishedOptions,
): Promise<void>

Параметры

stream:
ReadableStream
| WritableStream
| ReadWriteStream
options: FinishedOptions
необязательный

Тип возвращаемого значения

Promise<void>

функция default.getDefaultHighWaterMark

Использование в Deno

import mod from "node:stream";
getDefaultHighWaterMark(objectMode: boolean): number

Возвращает используемое потоками значение highWaterMark по умолчанию. По умолчанию это 65536 (64 КиБ) или 16 для objectMode.

Параметры

objectMode: boolean

Тип возвращаемого значения

number

функция default.isErrored

нестабильный

Использование в Deno

import mod from "node:stream";
isErrored(stream:
Readable
| Writable
| ReadableStream
| WritableStream
): boolean

Возвращает признак того, что в потоке произошла ошибка.

Параметры

stream:
Readable
| Writable
| ReadableStream
| WritableStream

Тип возвращаемого значения

boolean

функция default.isReadable

нестабильный

Использование в Deno

import mod from "node:stream";
isReadable(stream: Readable | ReadableStream): boolean

Возвращает признак того, что поток доступен для чтения.

Параметры

stream: Readable | ReadableStream

Тип возвращаемого значения

boolean

функция default.pipeline

Использование в Deno

import mod from "node:stream";

Перегрузка 1

pipeline<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>
(
source: A,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Метод модуля для передачи данных между потоками и генераторами с перенаправлением ошибок и корректной очисткой, а также вызовом callback-функции по завершении конвейера.

import { pipeline } from 'node:stream';
import fs from 'node:fs';
import zlib from 'node:zlib';

// Use the pipeline API to easily pipe a series of streams
// together and get notified when the pipeline is fully done.

// A pipeline to gzip a potentially huge tar file efficiently:

pipeline(
  fs.createReadStream('archive.tar'),
  zlib.createGzip(),
  fs.createWriteStream('archive.tar.gz'),
  (err) => {
    if (err) {
      console.error('Pipeline failed.', err);
    } else {
      console.log('Pipeline succeeded.');
    }
  },
);

API pipeline предоставляет promise version.

stream.pipeline() вызовет stream.destroy(err) для всех потоков, кроме:

  • Readable потоков, которые сгенерировали 'end' или 'close'.
  • Writable потоков, которые сгенерировали 'finish' или 'close'.

stream.pipeline() оставляет обработчики событий в потоках после вызова callback. При повторном использовании потоков после сбоя это может привести к утечкам обработчиков событий и подавлению ошибок. Если последний поток доступен для чтения, оставшиеся обработчики событий будут удалены, чтобы впоследствии можно было прочитать данные из последнего потока.

stream.pipeline() закрывает все потоки при возникновении ошибки. Использование IncomingRequest с pipeline может привести к неожиданному поведению: сокет будет уничтожен без отправки ожидаемого ответа. См. пример ниже:

import fs from 'node:fs';
import http from 'node:http';
import { pipeline } from 'node:stream';

const server = http.createServer((req, res) => {
  const fileStream = fs.createReadStream('./fileNotExist.txt');
  pipeline(fileStream, res, (err) => {
    if (err) {
      console.log(err); // No such file
      // this message can't be sent once `pipeline` already destroyed the socket
      return res.end('error!!!');
    }
  });
});

Параметры типа

A extends PipelineSource<any>
B extends PipelineDestination<A, any>

Параметры

source: A
destination: B
callback: PipelineCallback<B>

Вызывается после полного завершения конвейера.

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 2

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>
(
source: A,
transform1: T1,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
B extends PipelineDestination<T1, any>

Параметры

source: A
transform1: T1
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 3

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
B extends PipelineDestination<T2, any>

Параметры

source: A
transform1: T1
transform2: T2
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 4

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
B extends PipelineDestination<T3, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
B extends PipelineDestination<T3, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 5

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
T4 extends PipelineTransform<T3, any>,
B extends PipelineDestination<T4, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
transform4: T4,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
T4 extends PipelineTransform<T3, any>
B extends PipelineDestination<T4, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
transform4: T4
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 6

pipeline(
streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
,
callback: (err: ErrnoException | null) => void,
): WritableStream

Параметры

streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
callback: (err: ErrnoException | null) => void

Тип возвращаемого значения

WritableStream

Перегрузка 7

pipeline(
stream1: ReadableStream,
stream2: ReadWriteStream | WritableStream,
...streams: Array<
ReadWriteStream
| WritableStream
| ((err: ErrnoException | null) => void)
>
,
): WritableStream

Параметры

stream1: ReadableStream
stream2: ReadWriteStream | WritableStream
...streams: Array<
ReadWriteStream
| WritableStream
| ((err: ErrnoException | null) => void)
>

Тип возвращаемого значения

WritableStream

пространство имён default.pipeline

Функции

default.pipeline.__promisify__
Документация отсутствует

функция default.pipeline.__promisify__

Использование в Deno

import mod from "node:stream";

Перегрузка 1

__promisify__<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>
(
source: A,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
B extends PipelineDestination<A, any>

Параметры

source: A
destination: B
options: PipelineOptions
необязательный

Возвращаемый тип

PipelinePromise<B>

Перегрузка 2

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>
(
source: A,
transform1: T1,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
B extends PipelineDestination<T1, any>

Параметры

source: A
transform1: T1
destination: B
options: PipelineOptions
необязательный

Возвращаемый тип

PipelinePromise<B>

Перегрузка 3

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
B extends PipelineDestination<T2, any>

Параметры

source: A
transform1: T1
transform2: T2
destination: B
options: PipelineOptions
необязательный

Возвращаемый тип

PipelinePromise<B>

Перегрузка 4

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
B extends PipelineDestination<T3, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
B extends PipelineDestination<T3, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
destination: B
options: PipelineOptions
необязательный

Возвращаемый тип

PipelinePromise<B>

Перегрузка 5

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
T4 extends PipelineTransform<T3, any>,
B extends PipelineDestination<T4, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
transform4: T4,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
T4 extends PipelineTransform<T3, any>
B extends PipelineDestination<T4, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
transform4: T4
destination: B
options: PipelineOptions
необязательный

Возвращаемый тип

PipelinePromise<B>

Перегрузка 6

__promisify__(
streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
,
options?: PipelineOptions,
): Promise<void>

Параметры

streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
options: PipelineOptions
необязательный

Возвращаемый тип

Promise<void>

Перегрузка 7

__promisify__(
stream1: ReadableStream,
stream2: ReadWriteStream | WritableStream,
...streams: Array<
ReadWriteStream
| WritableStream
| PipelineOptions
>
,
): Promise<void>

Параметры

stream1: ReadableStream
stream2: ReadWriteStream | WritableStream
...streams: Array<
ReadWriteStream
| WritableStream
| PipelineOptions
>

Возвращаемый тип

Promise<void>

функция default.setDefaultHighWaterMark

Использование в Deno

import mod from "node:stream";
setDefaultHighWaterMark(
objectMode: boolean,
value: number,
): void

Устанавливает значение highWaterMark по умолчанию, используемое потоками.

Параметры

objectMode: boolean
value: number

Значение highWaterMark

Возвращаемый тип

void

функция Stream.addAbortSignal

Использование в Deno

import { Stream } from "node:stream";
addAbortSignal<T extends Stream>(
signal: AbortSignal,
stream: T,
): T

Поток, к которому нужно прикрепить сигнал.

Прикрепляет AbortSignal к потоку для чтения или записи. Это позволяет коду управлять уничтожением потока с помощью AbortController.

Вызов abort для AbortController, соответствующего переданному AbortSignal, будет работать так же, как вызов .destroy(new AbortError()) для потока, а для веб-потоков — controller.error(new AbortError()).

import fs from 'node:fs';

const controller = new AbortController();
const read = addAbortSignal(
  controller.signal,
  fs.createReadStream(('object.json')),
);
// Later, abort the operation closing the stream
controller.abort();

Или с помощью AbortSignal с потоком для чтения в качестве асинхронного итерируемого объекта:

const controller = new AbortController();
setTimeout(() => controller.abort(), 10_000); // set a timeout
const stream = addAbortSignal(
  controller.signal,
  fs.createReadStream(('object.json')),
);
(async () => {
  try {
    for await (const chunk of stream) {
      await process(chunk);
    }
  } catch (e) {
    if (e.name === 'AbortError') {
      // The operation was cancelled
    } else {
      throw e;
    }
  }
})();

Или с помощью AbortSignal с ReadableStream:

const controller = new AbortController();
const rs = new ReadableStream({
  start(controller) {
    controller.enqueue('hello');
    controller.enqueue('world');
    controller.close();
  },
});

addAbortSignal(controller.signal, rs);

finished(rs, (err) => {
  if (err) {
    if (err.name === 'AbortError') {
      // The operation was cancelled
    }
  }
});

const reader = rs.getReader();

reader.read().then(({ value, done }) => {
  console.log(value); // hello
  console.log(done); // false
  controller.abort();
});

Параметры типа

T extends Stream

Параметры

signal: AbortSignal

Сигнал, представляющий возможную отмену

stream: T

Поток, к которому нужно прикрепить сигнал.

Возвращаемый тип

T

функция Stream.duplexPair

Использование в Deno

import { Stream } from "node:stream";
duplexPair(options?: DuplexOptions): [Duplex, Duplex]

Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых является потоком Duplex, соединённым с другой стороной:

const [ sideA, sideB ] = duplexPair();

Всё, что записывается в один поток, становится доступным для чтения из другого. Это поведение аналогично сетевому соединению, в котором данные, записанные клиентом, становятся доступными для чтения серверу, и наоборот.

Дуплексные потоки симметричны: любой из них можно использовать без каких-либо различий в поведении.

Параметры

options: DuplexOptions
необязательный

Значение, передаваемое обоим конструкторам Duplex для задания таких параметров, как буферизация.

Возвращаемый тип

[Duplex, Duplex]

функция Stream.finished

Использование в Deno

import { Stream } from "node:stream";

Перегрузка 1

finished(
stream:
ReadableStream
| WritableStream
| ReadWriteStream
,
options: FinishedOptions,
callback: (err?: ErrnoException | null) => void,
): () => void

Поток/веб-поток для чтения и/или записи.

Функция для получения уведомления о том, что поток больше не доступен для чтения или записи, в нём произошла ошибка либо преждевременно возникло событие закрытия.

import { finished } from 'node:stream';
import fs from 'node:fs';

const rs = fs.createReadStream('archive.tar');

finished(rs, (err) => {
  if (err) {
    console.error('Stream failed.', err);
  } else {
    console.log('Stream is done reading.');
  }
});

rs.resume(); // Drain the stream.

Особенно полезна при обработке ошибок, когда поток уничтожается преждевременно (например, при отмене HTTP-запроса) и не генерирует 'end' или 'finish'.

API finished предоставляет promise version.

stream.finished() оставляет обработчики событий, которые больше не нужны (в частности, 'error', 'end', 'finish' и 'close'), после вызова callback. Это сделано для того, чтобы неожиданные события 'error' (вызванные некорректной реализацией потока) не приводили к неожиданным сбоям. Если такое поведение нежелательно, необходимо вызвать возвращаемую функцию очистки в обратном вызове:

const cleanup = finished(rs, (err) => {
  cleanup();
  // ...
});

Параметры

stream:
ReadableStream
| WritableStream
| ReadWriteStream

Поток для чтения и/или записи.

options: FinishedOptions
callback: (err?: ErrnoException | null) => void

Функция обратного вызова, принимающая необязательный аргумент ошибки.

Возвращаемый тип

() => void

Функция очистки, удаляющая все зарегистрированные обработчики.

Перегрузка 2

finished(
stream:
ReadableStream
| WritableStream
| ReadWriteStream
,
callback: (err?: ErrnoException | null) => void,
): () => void

Параметры

stream:
ReadableStream
| WritableStream
| ReadWriteStream
callback: (err?: ErrnoException | null) => void

Возвращаемый тип

() => void

пространство имён Stream.finished

Функции

Stream.finished.__promisify__
Документация недоступна

функция Stream.finished.__promisify__

Использование в Deno

import { Stream } from "node:stream";
__promisify__(
stream:
ReadableStream
| WritableStream
| ReadWriteStream
,
options?: FinishedOptions,
): Promise<void>

Параметры

stream:
ReadableStream
| WritableStream
| ReadWriteStream
options: FinishedOptions
необязательный

Возвращаемый тип

Promise<void>

функция Stream.getDefaultHighWaterMark

Использование в Deno

import { Stream } from "node:stream";
getDefaultHighWaterMark(objectMode: boolean): number

Возвращает значение highWaterMark по умолчанию, используемое потоками. По умолчанию используется 65536 (64 КиБ) или 16 для objectMode.

Параметры

objectMode: boolean

Тип возвращаемого значения

number

функция Stream.isErrored

нестабильный

Использование в Deno

import { Stream } from "node:stream";
isErrored(stream:
Readable
| Writable
| ReadableStream
| WritableStream
): boolean

Возвращает информацию о том, произошла ли в потоке ошибка.

Параметры

stream:
Readable
| Writable
| ReadableStream
| WritableStream

Тип возвращаемого значения

boolean

функция Stream.isReadable

нестабильный

Использование в Deno

import { Stream } from "node:stream";
isReadable(stream: Readable | ReadableStream): boolean

Возвращает информацию о том, доступен ли поток для чтения.

Параметры

stream: Readable | ReadableStream

Тип возвращаемого значения

boolean

функция Stream.pipeline

Использование в Deno

import { Stream } from "node:stream";

Перегрузка 1

pipeline<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>
(
source: A,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Метод модуля для передачи данных между потоками и генераторами с передачей ошибок, корректной очисткой и вызовом функции обратного вызова после завершения конвейера.

import { pipeline } from 'node:stream';
import fs from 'node:fs';
import zlib from 'node:zlib';

// Use the pipeline API to easily pipe a series of streams
// together and get notified when the pipeline is fully done.

// A pipeline to gzip a potentially huge tar file efficiently:

pipeline(
  fs.createReadStream('archive.tar'),
  zlib.createGzip(),
  fs.createWriteStream('archive.tar.gz'),
  (err) => {
    if (err) {
      console.error('Pipeline failed.', err);
    } else {
      console.log('Pipeline succeeded.');
    }
  },
);

API pipeline предоставляет promise version.

stream.pipeline() вызовет stream.destroy(err) для всех потоков, кроме:

  • Readable потоков, которые сгенерировали событие 'end' или 'close'.
  • Writable потоков, которые сгенерировали событие 'finish' или 'close'.

stream.pipeline() оставляет потоки с не удалёнными обработчиками событий после вызова callback. При повторном использовании потоков после сбоя это может привести к утечкам обработчиков событий и подавлению ошибок. Если последний поток доступен для чтения, оставшиеся обработчики событий будут удалены, чтобы этот поток можно было использовать позднее.

stream.pipeline() закрывает все потоки при возникновении ошибки. Использование IncomingRequest с pipeline может привести к неожиданному поведению: сокет будет уничтожен без отправки ожидаемого ответа. См. пример ниже:

import fs from 'node:fs';
import http from 'node:http';
import { pipeline } from 'node:stream';

const server = http.createServer((req, res) => {
  const fileStream = fs.createReadStream('./fileNotExist.txt');
  pipeline(fileStream, res, (err) => {
    if (err) {
      console.log(err); // No such file
      // this message can't be sent once `pipeline` already destroyed the socket
      return res.end('error!!!');
    }
  });
});

Параметры типа

A extends PipelineSource<any>
B extends PipelineDestination<A, any>

Параметры

source: A
destination: B
callback: PipelineCallback<B>

Вызывается после полного завершения конвейера.

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 2

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>
(
source: A,
transform1: T1,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
B extends PipelineDestination<T1, any>

Параметры

source: A
transform1: T1
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 3

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
B extends PipelineDestination<T2, any>

Параметры

source: A
transform1: T1
transform2: T2
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 4

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
B extends PipelineDestination<T3, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
B extends PipelineDestination<T3, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 5

pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
T4 extends PipelineTransform<T3, any>,
B extends PipelineDestination<T4, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
transform4: T4,
destination: B,
callback: PipelineCallback<B>,
): B extends WritableStream ? B : WritableStream

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
T4 extends PipelineTransform<T3, any>
B extends PipelineDestination<T4, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
transform4: T4
destination: B
callback: PipelineCallback<B>

Тип возвращаемого значения

B extends WritableStream ? B : WritableStream

Перегрузка 6

pipeline(
streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
,
callback: (err: ErrnoException | null) => void,
): WritableStream

Параметры

streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
callback: (err: ErrnoException | null) => void

Тип возвращаемого значения

WritableStream

Перегрузка 7

pipeline(
stream1: ReadableStream,
stream2: ReadWriteStream | WritableStream,
...streams: Array<
ReadWriteStream
| WritableStream
| ((err: ErrnoException | null) => void)
>
,
): WritableStream

Параметры

stream1: ReadableStream
stream2: ReadWriteStream | WritableStream
...streams: Array<
ReadWriteStream
| WritableStream
| ((err: ErrnoException | null) => void)
>

Тип возвращаемого значения

WritableStream

пространство имён Stream.pipeline

Функции

Stream.pipeline.__promisify__
Документация отсутствует

функция Stream.pipeline.__promisify__

Использование в Deno

import { Stream } from "node:stream";

Перегрузка 1

__promisify__<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>
(
source: A,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
B extends PipelineDestination<A, any>

Параметры

source: A
destination: B
options: PipelineOptions
необязательный

Тип возвращаемого значения

PipelinePromise<B>

Перегрузка 2

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>
(
source: A,
transform1: T1,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
B extends PipelineDestination<T1, any>

Параметры

source: A
transform1: T1
destination: B
options: PipelineOptions
необязательный

Тип возвращаемого значения

PipelinePromise<B>

Перегрузка 3

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
B extends PipelineDestination<T2, any>

Параметры

source: A
transform1: T1
transform2: T2
destination: B
options: PipelineOptions
необязательный

Тип возвращаемого значения

PipelinePromise<B>

Перегрузка 4

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
B extends PipelineDestination<T3, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
B extends PipelineDestination<T3, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
destination: B
options: PipelineOptions
необязательный

Тип возвращаемого значения

PipelinePromise<B>

Перегрузка 5

__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
T3 extends PipelineTransform<T2, any>,
T4 extends PipelineTransform<T3, any>,
B extends PipelineDestination<T4, any>,
>
(
source: A,
transform1: T1,
transform2: T2,
transform3: T3,
transform4: T4,
destination: B,
options?: PipelineOptions,
): PipelinePromise<B>

Параметры типа

A extends PipelineSource<any>
T1 extends PipelineTransform<A, any>
T2 extends PipelineTransform<T1, any>
T3 extends PipelineTransform<T2, any>
T4 extends PipelineTransform<T3, any>
B extends PipelineDestination<T4, any>

Параметры

source: A
transform1: T1
transform2: T2
transform3: T3
transform4: T4
destination: B
options: PipelineOptions
необязательный

Тип возвращаемого значения

PipelinePromise<B>

Перегрузка 6

__promisify__(
streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
,
options?: PipelineOptions,
): Promise<void>

Параметры

streams: ReadonlyArray<
ReadableStream
| WritableStream
| ReadWriteStream
>
options: PipelineOptions
необязательный

Тип возвращаемого значения

Promise<void>

Перегрузка 7

__promisify__(
stream1: ReadableStream,
stream2: ReadWriteStream | WritableStream,
...streams: Array<
ReadWriteStream
| WritableStream
| PipelineOptions
>
,
): Promise<void>

Параметры

stream1: ReadableStream
stream2: ReadWriteStream | WritableStream
...streams: Array<
ReadWriteStream
| WritableStream
| PipelineOptions
>

Тип возвращаемого значения

Promise<void>

функция Stream.setDefaultHighWaterMark

Использование в Deno

import { Stream } from "node:stream";
setDefaultHighWaterMark(
objectMode: boolean,
value: number,
): void

Задаёт используемое потоками значение highWaterMark по умолчанию.

Параметры

objectMode: boolean
value: number

Значение highWaterMark

Тип возвращаемого значения

void

интерфейс default.ArrayOptions

Использование в Deno

import mod from "node:stream";

Свойства

concurrency: number
необязательный

Максимальное число одновременных вызовов fn для обработки потока.

signal: AbortSignal
необязательный

Позволяет уничтожить поток, если сигнал отменён.


интерфейс default.DuplexOptions

наследует ReadableOptions<T>WritableOptions<T>

Использование в Deno

import mod from "node:stream";

Параметры типа

T extends Duplex = Duplex

Свойства

allowHalfOpen: boolean | undefined
необязательный
readableObjectMode: boolean | undefined
необязательный
writableObjectMode: boolean | undefined
необязательный
readableHighWaterMark: number | undefined
необязательный
writableHighWaterMark: number | undefined
необязательный
writableCorked: number | undefined
необязательный

интерфейс default.FinishedOptions

наследует Abortable

Использование в Deno

import mod from "node:stream";

Свойства

error: boolean | undefined
необязательный
readable: boolean | undefined
необязательный
writable: boolean | undefined
необязательный

интерфейс default.Pipe

Использование в Deno

import mod from "node:stream";

Методы

close(): void
hasRef(): boolean
ref(): void
unref(): void

интерфейс default.PipelineOptions

Использование в Deno

import mod from "node:stream";

Свойства

signal: AbortSignal | undefined
необязательный
end: boolean | undefined
необязательный

интерфейс default.ReadableOptions

наследует StreamOptions<T>

Использование в Deno

import mod from "node:stream";

Параметры типа

T extends Readable = Readable

Свойства

encoding: BufferEncoding | undefined
необязательный

Методы

read(
this: T,
size: number,
): void
необязательный

интерфейс default.StreamOptions

расширяет Abortable

Использование в Deno

import mod from "node:stream";

Параметры типа

T extends Stream

Свойства

emitClose: boolean | undefined
необязательный
highWaterMark: number | undefined
необязательный
objectMode: boolean | undefined
необязательный
autoDestroy: boolean | undefined
необязательный

Методы

construct(
this: T,
callback: (error?: Error | null) => void,
): void
необязательный
destroy(
this: T,
error: Error | null,
callback: (error?: Error | null) => void,
): void
необязательный

интерфейс default.TransformOptions

расширяет DuplexOptions<T>

Использование в Deno

import mod from "node:stream";

Параметры типа

T extends Transform = Transform

Методы

transform(
this: T,
chunk: any,
encoding: BufferEncoding,
callback: TransformCallback,
): void
необязательный
flush(
this: T,
callback: TransformCallback,
): void
необязательный

интерфейс default.WritableOptions

расширяет StreamOptions<T>

Использование в Deno

import mod from "node:stream";

Параметры типа

T extends Writable = Writable

Свойства

decodeStrings: boolean | undefined
необязательный
defaultEncoding: BufferEncoding | undefined
необязательный

Методы

write(
this: T,
chunk: any,
encoding: BufferEncoding,
callback: (error?: Error | null) => void,
): void
необязательный
writev(
this: T,
chunks: Array<{ chunk: any; encoding: BufferEncoding; }>,
callback: (error?: Error | null) => void,
): void
необязательный
final(
this: T,
callback: (error?: Error | null) => void,
): void
необязательный

интерфейс Stream.ArrayOptions

Использование в Deno

import { Stream } from "node:stream";

Свойства

concurrency: number
необязательный

Максимальное количество одновременных вызовов fn для обработки потока.

signal: AbortSignal
необязательный

Позволяет уничтожить поток при отмене сигнала.


интерфейс Stream.DuplexOptions

расширяет ReadableOptions<T>WritableOptions<T>

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T extends Duplex = Duplex

Свойства

allowHalfOpen: boolean | undefined
необязательный
readableObjectMode: boolean | undefined
необязательный
writableObjectMode: boolean | undefined
необязательный
readableHighWaterMark: number | undefined
необязательный
writableHighWaterMark: number | undefined
необязательный
writableCorked: number | undefined
необязательный

интерфейс Stream.FinishedOptions

расширяет Abortable

Использование в Deno

import { Stream } from "node:stream";

Свойства

error: boolean | undefined
необязательный
readable: boolean | undefined
необязательный
writable: boolean | undefined
необязательный

интерфейс Stream.Pipe

Использование в Deno

import { Stream } from "node:stream";

Методы

close(): void
hasRef(): boolean
ref(): void
unref(): void

интерфейс Stream.PipelineOptions

Использование в Deno

import { Stream } from "node:stream";

Свойства

signal: AbortSignal | undefined
необязательный
end: boolean | undefined
необязательный

интерфейс Stream.ReadableOptions

расширяет StreamOptions<T>

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T extends Readable = Readable

Свойства

encoding: BufferEncoding | undefined
необязательный

Методы

read(
this: T,
size: number,
): void
необязательный

интерфейс Stream.StreamOptions

расширяет Abortable

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T extends Stream

Свойства

emitClose: boolean | undefined
необязательный
highWaterMark: number | undefined
необязательный
objectMode: boolean | undefined
необязательный
autoDestroy: boolean | undefined
необязательный

Методы

construct(
this: T,
callback: (error?: Error | null) => void,
): void
необязательный
destroy(
this: T,
error: Error | null,
callback: (error?: Error | null) => void,
): void
необязательный

интерфейс Stream.TransformOptions

расширяет DuplexOptions<T>

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T extends Transform = Transform

Методы

transform(
this: T,
chunk: any,
encoding: BufferEncoding,
callback: TransformCallback,
): void
необязательный
flush(
this: T,
callback: TransformCallback,
): void
необязательный

интерфейс Stream.WritableOptions

расширяет StreamOptions<T>

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T extends Writable = Writable

Свойства

decodeStrings: boolean | undefined
необязательный
defaultEncoding: BufferEncoding | undefined
необязательный

Методы

write(
this: T,
chunk: any,
encoding: BufferEncoding,
callback: (error?: Error | null) => void,
): void
необязательный
writev(
this: T,
chunks: Array<{ chunk: any; encoding: BufferEncoding; }>,
callback: (error?: Error | null) => void,
): void
необязательный
final(
this: T,
callback: (error?: Error | null) => void,
): void
необязательный

псевдоним типа ComposeFnParam

Использование в Deno

import { type ComposeFnParam } from "node:stream";

Определение

(source: any) => void

псевдоним типа default.PipelineCallback

Использование в Deno

import mod from "node:stream";

Параметры типа

S extends PipelineDestination<any, any>

Определение

S extends PipelineDestinationPromiseFunction<any, infer P> ? (
err: ErrnoException | null,
value: P,
) => void : (err: ErrnoException | null) => void

псевдоним типа default.PipelineDestination

Использование в Deno

import mod from "node:stream";

Параметры типа

S extends PipelineTransformSource<any>
P

Определение

S extends PipelineTransformSource<infer ST> ?
WritableStream
| PipelineDestinationIterableFunction<ST>
| PipelineDestinationPromiseFunction<ST, P>
: never

псевдоним типа default.PipelineDestinationIterableFunction

Использование в Deno

import mod from "node:stream";

Параметры типа

T

Определение

(source: AsyncIterable<T>) => AsyncIterable<any>

псевдоним типа default.PipelineDestinationPromiseFunction

Использование в Deno

import mod from "node:stream";

Параметры типа

T
P

Определение

(source: AsyncIterable<T>) => Promise<P>

псевдоним типа default.PipelinePromise

Использование в Deno

import mod from "node:stream";

Параметры типа

S extends PipelineDestination<any, any>

Определение

S extends PipelineDestinationPromiseFunction<any, infer P> ? Promise<P> : Promise<void>

псевдоним типа default.PipelineSource

Использование в Deno

import mod from "node:stream";

Параметры типа

T

Определение

Iterable<T>
| AsyncIterable<T>
| ReadableStream
| PipelineSourceFunction<T>

псевдоним типа default.PipelineSourceFunction

Использование в Deno

import mod from "node:stream";

Параметры типа

T

Определение

() => Iterable<T> | AsyncIterable<T>

псевдоним типа default.PipelineTransform

Использование в Deno

import mod from "node:stream";

Параметры типа

S extends PipelineTransformSource<any>
U

Определение

ReadWriteStream | ((source: S extends (...args: any[]) => Iterable<infer ST> | AsyncIterable<infer ST> ? AsyncIterable<ST> : S) => AsyncIterable<U>)

псевдоним типа default.PipelineTransformSource

Использование в Deno

import mod from "node:stream";

Параметры типа

T

Определение

PipelineSource<T> | PipelineTransform<any, T>

псевдоним типа default.TransformCallback

Использование в Deno

import mod from "node:stream";

Определение

(
error?: Error | null,
data?: any,
) => void

псевдоним типа Stream.PipelineCallback

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

S extends PipelineDestination<any, any>

Определение

S extends PipelineDestinationPromiseFunction<any, infer P> ? (
err: ErrnoException | null,
value: P,
) => void : (err: ErrnoException | null) => void

псевдоним типа Stream.PipelineDestination

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

S extends PipelineTransformSource<any>
P

Определение

S extends PipelineTransformSource<infer ST> ?
WritableStream
| PipelineDestinationIterableFunction<ST>
| PipelineDestinationPromiseFunction<ST, P>
: never

псевдоним типа Stream.PipelineDestinationIterableFunction

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T

Определение

(source: AsyncIterable<T>) => AsyncIterable<any>

псевдоним типа Stream.PipelineDestinationPromiseFunction

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T
P

Определение

(source: AsyncIterable<T>) => Promise<P>

псевдоним типа Stream.PipelinePromise

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

S extends PipelineDestination<any, any>

Определение

S extends PipelineDestinationPromiseFunction<any, infer P> ? Promise<P> : Promise<void>

псевдоним типа Stream.PipelineSource

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T

Определение

Iterable<T>
| AsyncIterable<T>
| ReadableStream
| PipelineSourceFunction<T>

псевдоним типа Stream.PipelineSourceFunction

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T

Определение

() => Iterable<T> | AsyncIterable<T>

псевдоним типа Stream.PipelineTransform

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

S extends PipelineTransformSource<any>
U

Определение

ReadWriteStream | ((source: S extends (...args: any[]) => Iterable<infer ST> | AsyncIterable<infer ST> ? AsyncIterable<ST> : S) => AsyncIterable<U>)

псевдоним типа Stream.PipelineTransformSource

Использование в Deno

import { Stream } from "node:stream";

Параметры типа

T

Определение

PipelineSource<T> | PipelineTransform<any, T>

псевдоним типа Stream.TransformCallback

Использование в Deno

import { Stream } from "node:stream";

Определение

(
error?: Error | null,
data?: any,
) => void

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/node/stream

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API