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
Использование в Deno
import mod from "node:stream";
пространство имён default
Классы
Двунаправленные потоки — это потоки, реализующие интерфейсы Readable и Writable.
Класс stream.PassThrough представляет собой простую реализацию потока Transform, который просто передаёт входящие байты на выход. В первую очередь он предназначен для примеров и тестирования, но существуют случаи, когда stream.PassThrough полезен в качестве строительного блока для новых видов потоков.
- _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
Преобразующие потоки — это потоки Duplex, в которых выходные данные в некотором отношении зависят от входных. Как и все потоки Duplex, потоки Transform реализуют интерфейсы Readable и 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
Функции
Поток, к которому нужно привязать сигнал.
Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых представляет собой поток Duplex, соединённый с другой стороной:
Читаемый и/или записываемый поток/веб-поток.
Возвращает значение highWaterMark по умолчанию, используемое потоками. По умолчанию это 65536 (64 КиБ) или 16 для objectMode.
Возвращает информацию о том, произошла ли в потоке ошибка.
Возвращает информацию о том, доступен ли поток для чтения.
Метод модуля для передачи данных между потоками и генераторами с перенаправлением ошибок и надлежащей очисткой; предоставляет обратный вызов по завершении конвейера.
Задаёт используемое потоками значение highWaterMark по умолчанию.
Интерфейсы
Псевдонимы типов
класс default.Duplex
Использование в Deno
import mod from "node:stream";
Двунаправленные потоки — это потоки, реализующие оба интерфейса Readable и Writable.
Примеры потоков Duplex:
TCP socketszlib streamscrypto streams
Конструкторы
Duplex(opts?: DuplexOptions) Свойства
allowHalfOpen: boolean Если false, поток автоматически завершит записываемую сторону, когда завершится читаемая сторона. Изначально значение задаётся параметром конструктора allowHalfOpen, по умолчанию равным true.
Это значение можно вручную изменить, чтобы поменять поведение полузакрытого режима для существующего экземпляра потока Duplex, но это необходимо сделать до генерации события 'end'.
Методы
addListener(
event: "close",
listener: () => void,
): this Генератор событий. Список определённых событий включает:
- close
- data
- drain
- end
- error
- finish
- pause
- pipe
- readable
- resume
- 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: "readable"): boolean emit(event: "resume"): 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: "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: "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: "readable",
listener: () => void,
): this once(
event: "resume",
listener: () => 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.
интерфейс default.Duplex
класс default.PassThrough
Использование в Deno
import mod from "node:stream";
Класс stream.PassThrough представляет собой простейшую реализацию потока Transform, который просто передаёт входящие байты на выход. Он предназначен главным образом для примеров и тестирования, однако существуют сценарии, в которых stream.PassThrough полезен как строительный блок для новых типов потоков.
класс default.Readable
Использование в Deno
import mod from "node:stream";
Конструкторы
Readable(opts?: ReadableOptions) Свойства
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 Генератор событий. Определённые события документов включают:
- close
- data
- end
- error
- pause
- readable
- 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>(): Promise<T> Этот метод последовательно вызывает fn для каждого фрагмента потока, передавая результат вычисления для предыдущего элемента. Он возвращает промис с итоговым значением свёртки.
Если значение initial не указано, в качестве начального значения используется первый фрагмент потока. Если поток пуст, промис отклоняется с ошибкой TypeError, у которой свойство кода ERR_INVALID_ARGS.
Функция свёртки проходит по элементам потока по одному, поэтому параметр concurrency и параллельная обработка отсутствуют. Чтобы выполнять свёртку параллельно, можно вынести асинхронную функцию в метод readable.map.
reduce<T = any>(): 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 Возвращает сведения о том, выполнялось ли чтение из потока или была ли отменена операция.
класс default.Transform
Использование в Deno
import mod from "node:stream";
Потоки преобразования — это Duplex потоки, в которых выходные данные некоторым образом связаны с входными. Как и все Duplex потоки, Transform потоки реализуют оба интерфейса: Readable и Writable.
Примеры потоков Transform:
zlib streamscrypto streams
Конструкторы
Transform(opts?: TransformOptions) Методы
_flush(callback: TransformCallback): void _transform(): void класс default.Writable
Использование в 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 Эмиттер событий. Определённые события, включая:
- close
- drain
- error
- finish
- pipe
- 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: 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: 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: 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.
class Stream
Использование в Deno
import { Stream } from "node:stream";
namespace Stream
Классы
Двунаправленные потоки — это потоки, реализующие интерфейсы Readable и Writable.
Класс stream.PassThrough представляет собой простую реализацию потока Transform, которая просто передаёт входные байты на выход. Он предназначен главным образом для примеров и тестирования, однако существуют сценарии, в которых stream.PassThrough полезен как строительный блок для новых типов потоков.
- _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
Преобразующие потоки — это потоки Duplex, выходные данные которых каким-либо образом связаны с входными. Как и все потоки Duplex, потоки Transform реализуют интерфейсы Readable и 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
Функции
Поток, к которому нужно привязать сигнал.
Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых является потоком Duplex, соединённым с другим элементом:
Читаемый и/или записываемый поток или веб-поток.
Возвращает значение highWaterMark по умолчанию, используемое потоками. По умолчанию это 65536 (64 КиБ) или 16 для objectMode.
Возвращает признак того, что в потоке произошла ошибка.
Возвращает признак того, что поток доступен для чтения.
Метод модуля для организации передачи данных между потоками и генераторами с передачей ошибок и надлежащей очисткой; вызывает обратный вызов по завершении конвейера.
Задаёт значение highWaterMark по умолчанию, используемое потоками.
Интерфейсы
Псевдонимы типов
класс Stream.Duplex
Использование в Deno
import { Stream } from "node:stream";
Двунаправленные потоки — это потоки, реализующие оба интерфейса Readable и Writable.
Примеры потоков Duplex:
TCP socketszlib streamscrypto streams
Конструкторы
Duplex(opts?: DuplexOptions) Свойства
allowHalfOpen: boolean Если false, поток автоматически завершит записываемую сторону, когда завершится читаемая сторона. Изначально значение задается параметром конструктора allowHalfOpen, который по умолчанию равен true.
Это значение можно изменить вручную, чтобы поменять поведение существующего экземпляра потока Duplex при полуоткрытом состоянии, однако изменение необходимо внести до отправки события 'end'.
Методы
addListener(
event: "close",
listener: () => void,
): this Эмиттер событий. Определенные события в документации включают:
- close
- data
- drain
- end
- error
- finish
- pause
- pipe
- readable
- resume
- 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: "readable"): boolean emit(event: "resume"): 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: "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: "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: "readable",
listener: () => void,
): this once(
event: "resume",
listener: () => 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.
интерфейс Stream.Duplex
класс Stream.PassThrough
Использование в Deno
import { Stream } from "node:stream";
Класс stream.PassThrough — это простая реализация потока Transform, который лишь передает входящие байты на выход. В первую очередь он предназначен для примеров и тестирования, однако существуют сценарии, в которых stream.PassThrough полезен как строительный блок для новых типов потоков.
класс Stream.Readable
Использование в Deno
import { Stream } from "node:stream";
Конструкторы
Readable(opts?: ReadableOptions) Свойства
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 Генератор событий. Список событий, определённых для документов:
- close
- data
- end
- error
- pause
- readable
- 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>(): Promise<T> Этот метод последовательно вызывает fn для каждого фрагмента потока, передавая результат вычисления для предыдущего элемента. Он возвращает промис с итоговым значением свёртки.
Если начальное значение initial не задано, в качестве него используется первый фрагмент потока. Если поток пуст, промис отклоняется с ошибкой TypeError, у которой свойство кода ERR_INVALID_ARGS.
Функция свёртки обрабатывает элементы потока по одному, поэтому параметр concurrency и параллелизм отсутствуют. Чтобы выполнить свёртку параллельно, можно вынести асинхронную функцию в метод readable.map.
reduce<T = any>(): 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 Возвращает информацию о том, выполнялось ли чтение из потока или была ли отменена его обработка.
класс Stream.Transform
Использование в Deno
import { Stream } from "node:stream";
Потоки преобразования — это потоки Duplex, выходные данные которых каким-либо образом связаны с входными. Как и все потоки Duplex, потоки Transform реализуют интерфейсы Readable и Writable.
Примеры потоков Transform:
zlib streamscrypto streams
Конструкторы
Transform(opts?: TransformOptions) Методы
_flush(callback: TransformCallback): void _transform(): void класс Stream.Writable
Использование в 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 Генератор событий. Определённые в документации события включают:
- close
- drain
- error
- finish
- pipe
- 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: 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: 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: 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.
функция 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 Поток, к которому нужно подключить сигнал.
Возвращаемый тип
функция default.duplexPair
Использование в Deno
import mod from "node:stream";
duplexPair(options?: DuplexOptions): [Duplex, Duplex]Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых представляет собой поток Duplex, подключённый к другой стороне:
const [ sideA, sideB ] = duplexPair();
Всё, что записывается в один поток, становится доступным для чтения в другом. Это обеспечивает поведение, аналогичное сетевому соединению: данные, записанные клиентом, становятся доступны для чтения серверу, и наоборот.
Двунаправленные потоки симметричны: любой из них можно использовать без каких-либо различий в поведении.
Параметры
options: DuplexOptions Значение, передаваемое обоим конструкторам 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__
Использование в 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.pipeline
Использование в Deno
import mod from "node:stream";
Перегрузка 1
pipeline<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>(): 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> Вызывается после полного завершения конвейера.
Тип возвращаемого значения
Перегрузка 2
pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>(): B extends WritableStream ? B : WritableStreamПараметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> B extends PipelineDestination<T1, any> Параметры
Тип возвращаемого значения
Перегрузка 3
pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>(): B extends WritableStream ? B : WritableStreamПараметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> T2 extends PipelineTransform<T1, any> B extends PipelineDestination<T2, any> Параметры
Тип возвращаемого значения
Перегрузка 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> Параметры
Тип возвращаемого значения
Перегрузка 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> Параметры
Тип возвращаемого значения
Перегрузка 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__
Использование в Deno
import mod from "node:stream";
Перегрузка 1
__promisify__<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>(): PipelinePromise<B>Параметры типа
A extends PipelineSource<any> B extends PipelineDestination<A, any> Параметры
Возвращаемый тип
Перегрузка 2
__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>(): PipelinePromise<B>Параметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> B extends PipelineDestination<T1, any> Параметры
Возвращаемый тип
Перегрузка 3
__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>(): PipelinePromise<B>Параметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> T2 extends PipelineTransform<T1, any> B extends PipelineDestination<T2, any> Параметры
Возвращаемый тип
Перегрузка 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> Параметры
Возвращаемый тип
Перегрузка 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> Параметры
Возвращаемый тип
Перегрузка 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<>,
): Promise<void>Параметры
stream1: ReadableStream stream2: ReadWriteStream | WritableStream ...streams: Array<> Возвращаемый тип
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 Поток, к которому нужно прикрепить сигнал.
Возвращаемый тип
функция Stream.duplexPair
Использование в Deno
import { Stream } from "node:stream";
duplexPair(options?: DuplexOptions): [Duplex, Duplex]Вспомогательная функция duplexPair возвращает массив из двух элементов, каждый из которых является потоком Duplex, соединённым с другой стороной:
const [ sideA, sideB ] = duplexPair();
Всё, что записывается в один поток, становится доступным для чтения из другого. Это поведение аналогично сетевому соединению, в котором данные, записанные клиентом, становятся доступными для чтения серверу, и наоборот.
Дуплексные потоки симметричны: любой из них можно использовать без каких-либо различий в поведении.
Параметры
options: DuplexOptions Значение, передаваемое обоим конструкторам 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__
Использование в 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.pipeline
Использование в Deno
import { Stream } from "node:stream";
Перегрузка 1
pipeline<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>(): 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> Вызывается после полного завершения конвейера.
Тип возвращаемого значения
Перегрузка 2
pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>(): B extends WritableStream ? B : WritableStreamПараметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> B extends PipelineDestination<T1, any> Параметры
Тип возвращаемого значения
Перегрузка 3
pipeline<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>(): B extends WritableStream ? B : WritableStreamПараметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> T2 extends PipelineTransform<T1, any> B extends PipelineDestination<T2, any> Параметры
Тип возвращаемого значения
Перегрузка 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> Параметры
Тип возвращаемого значения
Перегрузка 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> Параметры
Тип возвращаемого значения
Перегрузка 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__
Использование в Deno
import { Stream } from "node:stream";
Перегрузка 1
__promisify__<
A extends PipelineSource<any>,
B extends PipelineDestination<A, any>,
>(): PipelinePromise<B>Параметры типа
A extends PipelineSource<any> B extends PipelineDestination<A, any> Параметры
Тип возвращаемого значения
Перегрузка 2
__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
B extends PipelineDestination<T1, any>,
>(): PipelinePromise<B>Параметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> B extends PipelineDestination<T1, any> Параметры
Тип возвращаемого значения
Перегрузка 3
__promisify__<
A extends PipelineSource<any>,
T1 extends PipelineTransform<A, any>,
T2 extends PipelineTransform<T1, any>,
B extends PipelineDestination<T2, any>,
>(): PipelinePromise<B>Параметры типа
A extends PipelineSource<any> T1 extends PipelineTransform<A, any> T2 extends PipelineTransform<T1, any> B extends PipelineDestination<T2, any> Параметры
Тип возвращаемого значения
Перегрузка 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> Параметры
Тип возвращаемого значения
Перегрузка 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> Параметры
Тип возвращаемого значения
Перегрузка 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<>,
): Promise<void>Параметры
stream1: ReadableStream stream2: ReadWriteStream | WritableStream ...streams: Array<> Тип возвращаемого значения
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
Использование в Deno
import mod from "node:stream";
Параметры типа
Свойства
allowHalfOpen: boolean | undefined readableObjectMode: boolean | undefined writableObjectMode: boolean | undefined readableHighWaterMark: number | undefined writableHighWaterMark: number | undefined writableCorked: number | undefined интерфейс default.FinishedOptions
Использование в Deno
import mod from "node:stream";
интерфейс default.Pipe
Использование в Deno
import mod from "node:stream";
интерфейс default.PipelineOptions
Использование в Deno
import mod from "node:stream";
интерфейс default.ReadableOptions
Использование в Deno
import mod from "node:stream";
интерфейс default.StreamOptions
Использование в Deno
import mod from "node:stream";
Параметры типа
T extends Stream Свойства
emitClose: boolean | undefined highWaterMark: number | undefined objectMode: boolean | undefined autoDestroy: boolean | undefined Методы
интерфейс default.TransformOptions
Использование в Deno
import mod from "node:stream";
Параметры типа
Методы
transform(): void flush(
this: T,
callback: TransformCallback,
): void интерфейс default.WritableOptions
Использование в Deno
import mod from "node:stream";
Параметры типа
Свойства
decodeStrings: boolean | undefined defaultEncoding: BufferEncoding | undefined Методы
интерфейс Stream.ArrayOptions
Использование в Deno
import { Stream } from "node:stream";
Свойства
concurrency: number Максимальное количество одновременных вызовов fn для обработки потока.
signal: AbortSignal Позволяет уничтожить поток при отмене сигнала.
интерфейс Stream.DuplexOptions
Использование в Deno
import { Stream } from "node:stream";
Параметры типа
Свойства
allowHalfOpen: boolean | undefined readableObjectMode: boolean | undefined writableObjectMode: boolean | undefined readableHighWaterMark: number | undefined writableHighWaterMark: number | undefined writableCorked: number | undefined интерфейс Stream.FinishedOptions
Использование в Deno
import { Stream } from "node:stream";
интерфейс Stream.Pipe
Использование в Deno
import { Stream } from "node:stream";
интерфейс Stream.PipelineOptions
Использование в Deno
import { Stream } from "node:stream";
интерфейс Stream.ReadableOptions
Использование в Deno
import { Stream } from "node:stream";
интерфейс Stream.StreamOptions
Использование в Deno
import { Stream } from "node:stream";
Параметры типа
T extends Stream Свойства
emitClose: boolean | undefined highWaterMark: number | undefined objectMode: boolean | undefined autoDestroy: boolean | undefined Методы
интерфейс Stream.TransformOptions
Использование в Deno
import { Stream } from "node:stream";
Параметры типа
Методы
transform(): void flush(
this: T,
callback: TransformCallback,
): void интерфейс Stream.WritableOptions
Использование в Deno
import { Stream } from "node:stream";
Параметры типа
Свойства
decodeStrings: boolean | undefined defaultEncoding: BufferEncoding | undefined Методы
псевдоним типа 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";
псевдоним типа 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 Определение
псевдоним типа default.PipelineSourceFunction
Использование в Deno
import mod from "node:stream";
псевдоним типа default.PipelineTransform
Использование в Deno
import mod from "node:stream";
Параметры типа
S extends PipelineTransformSource<any> 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";
псевдоним типа 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 Определение
псевдоним типа Stream.PipelineSourceFunction
Использование в Deno
import { Stream } from "node:stream";
псевдоним типа Stream.PipelineTransform
Использование в Deno
import { Stream } from "node:stream";
Параметры типа
S extends PipelineTransformSource<any> 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