API веб-потоков
Стабильность: 2 — стабильный
Реализация стандарта WHATWG Streams.
Обзор
Стандарт WHATWG Streams (или «веб-потоки») определяет API для обработки потоковых данных. Он похож на API потоков Node.js, но появился позже и стал «стандартным» API для потоковой передачи данных во многих средах JavaScript.
Существует три основных типа объектов:
-
ReadableStream— представляет источник потоковых данных. -
WritableStream— представляет получателя потоковых данных. -
TransformStream— представляет алгоритм преобразования потоковых данных.
Пример ReadableStream
В этом примере создаётся простой ReadableStream, который бесконечно отправляет текущую временную метку performance.now() раз в секунду. Для чтения данных из потока используется асинхронный итерируемый объект.
Модули JavaScript
import {
ReadableStream,
} from 'node:stream/web';
import {
setInterval as every,
} from 'node:timers/promises';
import {
performance,
} from 'node:perf_hooks';
const SECOND = 1000;
const stream = new ReadableStream({
async start(controller) {
for await (const _ of every(SECOND))
controller.enqueue(performance.now());
},
});
for await (const value of stream)
console.log(value);
CommonJS
const {
ReadableStream,
} = require('node:stream/web');
const {
setInterval: every,
} = require('node:timers/promises');
const {
performance,
} = require('node:perf_hooks');
const SECOND = 1000;
const stream = new ReadableStream({
async start(controller) {
for await (const _ of every(SECOND))
controller.enqueue(performance.now());
},
});
(async () => {
for await (const value of stream)
console.log(value);
})();
Совместимость с потоками Node.js
Потоки Node.js можно преобразовывать в веб-потоки и наоборот с помощью методов toWeb и fromWeb, доступных в объектах stream.Readable, stream.Writable и stream.Duplex.
Дополнительные сведения см. в соответствующей документации:
API
Класс: ReadableStream
new ReadableStream([underlyingSource [, strategy]])
-
underlyingSource<Object>-
start<Function>Пользовательская функция, которая вызывается сразу после созданияReadableStream.-
controller<ReadableStreamDefaultController>|<ReadableByteStreamController> - Возвращает:
undefinedили промис, выполненный с результатомundefined.
-
-
pull<Function>Пользовательская функция, которая повторно вызывается, когда внутренняя очередьReadableStreamне заполнена. Операция может быть синхронной или асинхронной. Если она асинхронная, функция не будет вызвана повторно, пока не будет выполнен возвращённый ранее промис.-
controller<ReadableStreamDefaultController>|<ReadableByteStreamController> - Возвращает: промис, выполненный с результатом
undefined.
-
-
cancel<Function>Пользовательская функция, которая вызывается при отменеReadableStream.-
reason<any> - Возвращает: промис, выполненный с результатом
undefined.
-
-
type<string>Должно быть'bytes'илиundefined. -
autoAllocateChunkSize<number>Используется только, еслиtypeравно'bytes'. Если задано ненулевое значение, буфер представления автоматически выделяется дляReadableByteStreamController.byobRequest. Если значение не задано, для передачи данных необходимо использовать внутренние очереди потока через читатель по умолчаниюReadableStreamDefaultReader.
-
-
strategy<Object>-
highWaterMark<number>Максимальный размер внутренней очереди до применения обратного давления. -
size<Function>Пользовательская функция, определяющая размер каждого фрагмента данных.
-
readableStream.locked
- Тип:
<boolean>Устанавливается вtrue, если для этого<ReadableStream>активен читатель.
По умолчанию свойство readableStream.locked имеет значение false; оно меняется на true, пока активный читатель получает данные из потока.
readableStream.cancel([reason])
-
reason<any> - Возвращает: промис, выполненный с результатом
undefinedпосле завершения отмены.
readableStream.getReader([options])
-
options<Object>-
mode<string>'byob'илиundefined
-
- Возвращает:
<ReadableStreamDefaultReader>|<ReadableStreamBYOBReader>
Модули JavaScript
import { ReadableStream } from 'node:stream/web';
const stream = new ReadableStream();
const reader = stream.getReader();
console.log(await reader.read());
CommonJS
const { ReadableStream } = require('node:stream/web');
const stream = new ReadableStream();
const reader = stream.getReader();
reader.read().then(console.log);
Приводит к тому, что readableStream.locked становится true.
readableStream.pipeThrough(transform[, options])
-
transform<Object>-
readable<ReadableStream>ReadableStream, в которыйtransform.writableбудет отправлять потенциально изменённые данные, полученные из этогоReadableStream. -
writable<WritableStream>WritableStream, в который будут записываться данные этогоReadableStream.
-
-
options<Object>-
preventAbort<boolean>Еслиtrue, ошибки в этомReadableStreamне приведут к прерываниюtransform.writable. -
preventCancel<boolean>Еслиtrue, ошибки в потоке назначенияtransform.writableне приведут к отмене этогоReadableStream. -
preventClose<boolean>Еслиtrue, закрытие этогоReadableStreamне приведёт к закрытиюtransform.writable. -
signal<AbortSignal>Позволяет отменить передачу данных с помощью<AbortController>.
-
- Возвращает:
<ReadableStream>Изtransform.readable.
Соединяет этот <ReadableStream> с парой <ReadableStream> и <WritableStream>, переданной в аргументе transform, так что данные из этого <ReadableStream> записываются в transform.writable, при необходимости преобразуются, а затем передаются в transform.readable. После настройки конвейера возвращается transform.readable.
Пока выполняется операция передачи, readableStream.locked становится true.
Модули JavaScript
import {
ReadableStream,
TransformStream,
} from 'node:stream/web';
const stream = new ReadableStream({
start(controller) {
controller.enqueue('a');
},
});
const transform = new TransformStream({
transform(chunk, controller) {
controller.enqueue(chunk.toUpperCase());
},
});
const transformedStream = stream.pipeThrough(transform);
for await (const chunk of transformedStream)
console.log(chunk);
// Prints: A
CommonJS
const {
ReadableStream,
TransformStream,
} = require('node:stream/web');
const stream = new ReadableStream({
start(controller) {
controller.enqueue('a');
},
});
const transform = new TransformStream({
transform(chunk, controller) {
controller.enqueue(chunk.toUpperCase());
},
});
const transformedStream = stream.pipeThrough(transform);
(async () => {
for await (const chunk of transformedStream)
console.log(chunk);
// Prints: A
})();
readableStream.pipeTo(destination[, options])
-
destination<WritableStream><WritableStream>, в который будут записываться данные этогоReadableStream. -
options<Object>-
preventAbort<boolean>Еслиtrue, ошибки в этомReadableStreamне приведут к прерываниюdestination. -
preventCancel<boolean>Еслиtrue, ошибки вdestinationне приведут к отмене этогоReadableStream. -
preventClose<boolean>Еслиtrue, закрытие этогоReadableStreamне приведёт к закрытиюdestination. -
signal<AbortSignal>Позволяет отменить передачу данных с помощью<AbortController>.
-
- Возвращает: промис, выполненный с результатом
undefined
Пока выполняется операция передачи, readableStream.locked становится true.
readableStream.tee()
- Возвращает:
<ReadableStream[]>
Возвращает пару новых экземпляров <ReadableStream>, которым будут передаваться данные этого ReadableStream. Каждый экземпляр получит одни и те же данные.
Приводит к тому, что readableStream.locked становится true.
readableStream.values([options])
-
options<Object>-
preventCancel<boolean>Еслиtrue,<ReadableStream>не закрывается при досрочном завершении асинхронного итератора. По умолчанию:false.
-
Создаёт и возвращает асинхронный итератор, предназначенный для получения данных из этого ReadableStream.
Пока асинхронный итератор активен, readableStream.locked становится true.
import { Buffer } from 'node:buffer';
const stream = new ReadableStream(getSomeSource());
for await (const chunk of stream.values({ preventCancel: true }))
console.log(Buffer.from(chunk).toString());
mjscopyАсинхронная итерация
Объект <ReadableStream> поддерживает протокол асинхронного итератора с использованием синтаксиса for await.
import { Buffer } from 'node:buffer';
const stream = new ReadableStream(getSomeSource());
for await (const chunk of stream)
console.log(Buffer.from(chunk).toString());
mjscopy
Асинхронный итератор будет получать данные из <ReadableStream> до его завершения.
По умолчанию, если асинхронный итератор завершается досрочно (из-за break, return или throw), <ReadableStream> будет закрыт. Чтобы предотвратить автоматическое закрытие <ReadableStream>, используйте метод readableStream.values() для получения асинхронного итератора и задайте для параметра preventCancel значение true.
<ReadableStream> не должен быть заблокирован (то есть у него не должно быть активного читателя). Во время асинхронной итерации <ReadableStream> будет заблокирован.
Передача с помощью postMessage()
Экземпляр <ReadableStream> можно передать с помощью <MessagePort>.
const stream = new ReadableStream(getReadableSourceSomehow());
const { port1, port2 } = new MessageChannel();
port1.onmessage = ({ data }) => {
data.getReader().read().then((chunk) => {
console.log(chunk);
});
};
port2.postMessage(stream, [stream]);
jscopy
ReadableStream.from(iterable)
-
iterable{Iterable} Объект, реализующий протокол итерируемого объектаSymbol.asyncIteratorилиSymbol.iterator.
Вспомогательный метод, создающий новый <ReadableStream> из итерируемого объекта.
Модули JavaScript
import { ReadableStream } from 'node:stream/web';
async function* asyncIterableGenerator() {
yield 'a';
yield 'b';
yield 'c';
}
const stream = ReadableStream.from(asyncIterableGenerator());
for await (const chunk of stream)
console.log(chunk); // Prints: 'a', 'b', 'c'
CommonJS
const { ReadableStream } = require('node:stream/web');
async function* asyncIterableGenerator() {
yield 'a';
yield 'b';
yield 'c';
}
(async () => {
const stream = ReadableStream.from(asyncIterableGenerator());
for await (const chunk of stream)
console.log(chunk); // Prints: 'a', 'b', 'c'
})();
Чтобы передать полученный <ReadableStream> в <WritableStream>, объект {Iterable} должен выдавать последовательность объектов <Buffer>, <TypedArray> или <DataView>.
Модули JavaScript
import { ReadableStream } from 'node:stream/web';
import { Buffer } from 'node:buffer';
async function* asyncIterableGenerator() {
yield Buffer.from('a');
yield Buffer.from('b');
yield Buffer.from('c');
}
const stream = ReadableStream.from(asyncIterableGenerator());
await stream.pipeTo(createWritableStreamSomehow());
CommonJS
const { ReadableStream } = require('node:stream/web');
const { Buffer } = require('node:buffer');
async function* asyncIterableGenerator() {
yield Buffer.from('a');
yield Buffer.from('b');
yield Buffer.from('c');
}
const stream = ReadableStream.from(asyncIterableGenerator());
(async () => {
await stream.pipeTo(createWritableStreamSomehow());
})();
Класс: ReadableStreamDefaultReader
По умолчанию вызов readableStream.getReader() без аргументов возвращает экземпляр ReadableStreamDefaultReader. Читатель по умолчанию рассматривает фрагменты данных, передаваемые через поток, как непрозрачные значения, что позволяет <ReadableStream> работать практически с любыми значениями JavaScript.
new ReadableStreamDefaultReader(stream)
-
stream<ReadableStream>
Создаёт новый <ReadableStreamDefaultReader>, заблокированный для указанного <ReadableStream>.
readableStreamDefaultReader.cancel([reason])
-
reason<any> - Возвращает: промис, выполненный с результатом
undefined.
Отменяет <ReadableStream> и возвращает промис, который выполняется после отмены нижележащего потока.
readableStreamDefaultReader.closed
- Тип:
<Promise>Выполняется с результатомundefined, когда связанный<ReadableStream>закрывается, либо отклоняется, если в потоке возникает ошибка или блокировка читателя снимается до завершения закрытия потока.
readableStreamDefaultReader.read()
Запрашивает следующий фрагмент данных из нижележащего <ReadableStream> и возвращает промис, который выполняется с данными после их поступления.
readableStreamDefaultReader.releaseLock()
Снимает блокировку, установленную этим читателем на нижележащем <ReadableStream>.
Класс: ReadableStreamBYOBReader
ReadableStreamBYOBReader — это альтернативный потребитель байтовых <ReadableStream> (создаваемых с параметром underlyingSource.type, равным 'bytes' при создании ReadableStream).
Название BYOB — сокращение от «bring your own buffer» («используйте собственный буфер»). Этот шаблон позволяет эффективнее считывать байтовые данные, избегая лишнего копирования.
import {
open,
} from 'node:fs/promises';
import {
ReadableStream,
} from 'node:stream/web';
import { Buffer } from 'node:buffer';
class Source {
type = 'bytes';
autoAllocateChunkSize = 1024;
async start(controller) {
this.file = await open(new URL(import.meta.url));
this.controller = controller;
}
async pull(controller) {
const view = controller.byobRequest?.view;
const {
bytesRead,
} = await this.file.read({
buffer: view,
offset: view.byteOffset,
length: view.byteLength,
});
if (bytesRead === 0) {
await this.file.close();
this.controller.close();
}
controller.byobRequest.respond(bytesRead);
}
}
const stream = new ReadableStream(new Source());
async function read(stream) {
const reader = stream.getReader({ mode: 'byob' });
const chunks = [];
let result;
do {
result = await reader.read(Buffer.alloc(100));
if (result.value !== undefined)
chunks.push(Buffer.from(result.value));
} while (!result.done);
return Buffer.concat(chunks);
}
const data = await read(stream);
console.log(Buffer.from(data).toString());
mjscopy
new ReadableStreamBYOBReader(stream)
-
stream<ReadableStream>
Создаёт новый ReadableStreamBYOBReader, заблокированный для указанного <ReadableStream>.
readableStreamBYOBReader.cancel([reason])
-
reason<any> - Возвращает: промис, выполненный с результатом
undefined.
Отменяет <ReadableStream> и возвращает промис, который выполняется после отмены нижележащего потока.
readableStreamBYOBReader.closed
- Тип:
<Promise>Выполняется с результатомundefined, когда связанный<ReadableStream>закрывается, либо отклоняется, если в потоке возникает ошибка или блокировка читателя снимается до завершения закрытия потока.
readableStreamBYOBReader.read(view[, options])
-
view<Buffer>|<TypedArray>|<DataView> -
options<Object>-
min<number>Если задано это значение, возвращаемый промис будет выполнен только после того, как станет доступно указанное количество элементов:min. Если значение не задано, промис выполняется, когда доступен хотя бы один элемент.
-
- Возвращает: промис, выполненный с объектом:
-
value<TypedArray>|<DataView> -
done<boolean>
-
Запрашивает следующий фрагмент данных из нижележащего <ReadableStream> и возвращает промис, который выполняется с данными после их поступления.
Не передавайте этому методу экземпляр <Buffer>, выделенный из пула. Объекты Buffer, выделенные из пула, создаются с помощью Buffer.allocUnsafe() или Buffer.from() либо часто возвращаются различными функциями обратного вызова модуля node:fs. Для этих типов Buffer используется общий нижележащий объект <ArrayBuffer>, содержащий данные всех экземпляров Buffer, выделенных из пула. При передаче Buffer, <TypedArray> или <DataView> в readableStreamBYOBReader.read() нижележащий ArrayBuffer этого представления отсоединяется, что делает недействительными все существующие представления, которые могут ссылаться на этот ArrayBuffer. Это может иметь катастрофические последствия для приложения.
readableStreamBYOBReader.releaseLock()
Снимает блокировку, установленную этим читателем на нижележащем <ReadableStream>.
Класс: ReadableStreamDefaultController
У каждого <ReadableStream> есть контроллер, отвечающий за внутреннее состояние и управление очередью потока. ReadableStreamDefaultController — это реализация контроллера по умолчанию для ReadableStream, не ориентированных на байты.
readableStreamDefaultController.close()
Закрывает <ReadableStream>, с которым связан этот контроллер.
readableStreamDefaultController.desiredSize
- Тип:
<number>
Возвращает объём данных, необходимый для заполнения очереди <ReadableStream>.
readableStreamDefaultController.enqueue([chunk])
-
chunk<any>
Добавляет новый фрагмент данных в очередь <ReadableStream>.
readableStreamDefaultController.error([error])
-
error<any>
Сообщает об ошибке, из-за которой в <ReadableStream> возникает ошибка и он закрывается.
Класс: ReadableByteStreamController
У каждого <ReadableStream> есть контроллер, отвечающий за внутреннее состояние и управление очередью потока. ReadableByteStreamController предназначен для байтовых ReadableStream.
readableByteStreamController.byobRequest
readableByteStreamController.close()
Закрывает <ReadableStream>, с которым связан этот контроллер.
readableByteStreamController.desiredSize
- Тип:
<number>
Возвращает объём данных, необходимый для заполнения очереди <ReadableStream>.
readableByteStreamController.enqueue(chunk)
-
chunk<Buffer>|<TypedArray>|<DataView>
Добавляет новый фрагмент данных в очередь <ReadableStream>.
readableByteStreamController.error([error])
-
error<any>
Сообщает об ошибке, которая приводит к ошибке и закрытию <ReadableStream>.
Класс: ReadableStreamBYOBRequest
При использовании ReadableByteStreamController в потоках, ориентированных на байты, а также при использовании ReadableStreamBYOBReader, свойство readableByteStreamController.byobRequest предоставляет доступ к экземпляру ReadableStreamBYOBRequest, представляющему текущий запрос на чтение. Этот объект используется для доступа к ArrayBuffer/TypedArray, предоставленному для заполнения в рамках запроса на чтение, и содержит методы для уведомления о том, что данные предоставлены.
readableStreamBYOBRequest.respond(bytesWritten)
-
bytesWritten<number>
Сообщает, что в readableStreamBYOBRequest.view записано число байтов, равное bytesWritten.
readableStreamBYOBRequest.respondWithNewView(view)
-
view<Buffer>|<TypedArray>|<DataView>
Сообщает, что запрос выполнен: байты записаны в новое представление Buffer, TypedArray или DataView.
readableStreamBYOBRequest.view
- Тип:
<Buffer>|<TypedArray>|<DataView>
Класс: WritableStream
WritableStream — это приемник, которому передаются данные потока.
import {
WritableStream,
} from 'node:stream/web';
const stream = new WritableStream({
write(chunk) {
console.log(chunk);
},
});
await stream.getWriter().write('Hello World');
mjscopy
new WritableStream([underlyingSink[, strategy]])
-
underlyingSink<Object>-
start<Function>Пользовательская функция, вызываемая сразу после созданияWritableStream.-
controller<WritableStreamDefaultController> - Возвращает:
undefinedили промис, выполненный сundefined.
-
-
write<Function>Пользовательская функция, вызываемая при записи фрагмента данных вWritableStream.-
chunk<any> -
controller<WritableStreamDefaultController> - Возвращает: промис, выполненный с
undefined.
-
-
close<Function>Пользовательская функция, вызываемая при закрытииWritableStream.- Возвращает: промис, выполненный с
undefined.
- Возвращает: промис, выполненный с
-
abort<Function>Пользовательская функция, вызываемая для внезапного закрытияWritableStream.-
reason<any> - Возвращает: промис, выполненный с
undefined.
-
-
type<any>Параметрtypeзарезервирован для будущего использования и должен иметь значение undefined.
-
-
strategy<Object>-
highWaterMark<number>Максимальный размер внутренней очереди до применения обратного давления. -
size<Function>Пользовательская функция для определения размера каждого фрагмента данных.
-
writableStream.abort([reason])
-
reason<any> - Возвращает: промис, выполненный с
undefined.
Внезапно завершает WritableStream. Все записи в очереди отменяются, а связанные с ними промисы отклоняются.
writableStream.close()
- Возвращает: промис, выполненный с
undefined.
Закрывает WritableStream, когда новые записи больше не ожидаются.
writableStream.getWriter()
- Возвращает:
<WritableStreamDefaultWriter>
Создает и возвращает новый экземпляр средства записи, который можно использовать для записи данных в WritableStream.
writableStream.locked
- Тип:
<boolean>
По умолчанию свойство writableStream.locked имеет значение false; оно меняется на true, когда к этому WritableStream подключено активное средство записи.
Передача с помощью postMessage()
Экземпляр <WritableStream> можно передать с помощью <MessagePort>.
const stream = new WritableStream(getWritableSinkSomehow());
const { port1, port2 } = new MessageChannel();
port1.onmessage = ({ data }) => {
data.getWriter().write('hello');
};
port2.postMessage(stream, [stream]);
jscopyКласс: WritableStreamDefaultWriter
new WritableStreamDefaultWriter(stream)
-
stream<WritableStream>
Создает новый WritableStreamDefaultWriter, заблокированный для указанного WritableStream.
writableStreamDefaultWriter.abort([reason])
-
reason<any> - Возвращает: промис, выполненный с
undefined.
Внезапно завершает WritableStream. Все записи в очереди отменяются, а связанные с ними промисы отклоняются.
writableStreamDefaultWriter.close()
- Возвращает: промис, выполненный с
undefined.
Закрывает WritableStream, когда новые записи больше не ожидаются.
writableStreamDefaultWriter.closed
- Тип:
<Promise>Выполняется сundefined, когда связанный<WritableStream>закрыт, или отклоняется, если в потоке возникает ошибка либо блокировка средства записи снимается до завершения закрытия потока.
writableStreamDefaultWriter.desiredSize
- Тип:
<number>
Объем данных, необходимый для заполнения очереди <WritableStream>.
writableStreamDefaultWriter.ready
- Тип:
<Promise>Выполняется сundefined, когда средство записи готово к использованию.
writableStreamDefaultWriter.releaseLock()
Снимает блокировку этого средства записи с базового <ReadableStream>.
writableStreamDefaultWriter.write([chunk])
-
chunk<any> - Возвращает: промис, выполненный с
undefined.
Добавляет новый фрагмент данных в очередь <WritableStream>.
Класс: WritableStreamDefaultController
WritableStreamDefaultController управляет внутренним состоянием <WritableStream>.
writableStreamDefaultController.error([error])
-
error<any>
Вызывается пользовательским кодом, чтобы сообщить об ошибке при обработке данных WritableStream. При вызове <WritableStream> прерывается, а текущие ожидающие записи отменяются.
writableStreamDefaultController.signal
- Тип:
<AbortSignal>AbortSignal, который можно использовать для отмены ожидающих операций записи или закрытия при прерывании<WritableStream>.
Класс: TransformStream
TransformStream состоит из <ReadableStream> и <WritableStream>, соединенных таким образом, что данные, записанные в WritableStream, принимаются и, возможно, преобразуются, прежде чем попасть в очередь ReadableStream.
import {
TransformStream,
} from 'node:stream/web';
const transform = new TransformStream({
transform(chunk, controller) {
controller.enqueue(chunk.toUpperCase());
},
});
await Promise.all([
transform.writable.getWriter().write('A'),
transform.readable.getReader().read(),
]);
mjscopy
new TransformStream([transformer[, writableStrategy[, readableStrategy]]])
-
transformer<Object>-
start<Function>Пользовательская функция, вызываемая сразу после созданияTransformStream.-
controller<TransformStreamDefaultController> - Возвращает:
undefinedили промис, выполненный сundefined
-
-
transform<Function>Пользовательская функция, принимающая фрагмент данных, записанный вtransformStream.writable, и, возможно, изменяющая его перед передачей вtransformStream.readable.-
chunk<any> -
controller<TransformStreamDefaultController> - Возвращает: промис, выполненный с
undefined.
-
-
flush<Function>Пользовательская функция, вызываемая непосредственно перед закрытием записываемой стороныTransformStream, сигнализируя об окончании процесса преобразования.-
controller<TransformStreamDefaultController> - Возвращает: промис, выполненный с
undefined.
-
-
cancel<Function>Пользовательская функция, вызываемая при отмене читаемой стороныTransformStreamили прерывании записываемой стороны.-
reason<any> - Возвращает: промис, выполненный с
undefined.
-
-
readableType<any>параметрreadableTypeзарезервирован для будущего использования и должен иметь значениеundefined. -
writableType<any>параметрwritableTypeзарезервирован для будущего использования и должен иметь значениеundefined.
-
-
writableStrategy<Object>-
highWaterMark<number>Максимальный размер внутренней очереди до применения обратного давления. -
size<Function>Пользовательская функция для определения размера каждого фрагмента данных.
-
-
readableStrategy<Object>-
highWaterMark<number>Максимальный размер внутренней очереди до применения обратного давления. -
size<Function>Пользовательская функция для определения размера каждого фрагмента данных.
-
transformStream.readable
- Тип:
<ReadableStream>
transformStream.writable
- Тип:
<WritableStream>
Передача с помощью postMessage()
Экземпляр <TransformStream> можно передать с помощью <MessagePort>.
const stream = new TransformStream();
const { port1, port2 } = new MessageChannel();
port1.onmessage = ({ data }) => {
const { writable, readable } = data;
// ...
};
port2.postMessage(stream, [stream]);
jscopyКласс: TransformStreamDefaultController
TransformStreamDefaultController управляет внутренним состоянием TransformStream.
transformStreamDefaultController.desiredSize
- Тип:
<number>
Объем данных, необходимый для заполнения очереди читаемой стороны.
transformStreamDefaultController.enqueue([chunk])
-
chunk<any>
Добавляет фрагмент данных в очередь читаемой стороны.
transformStreamDefaultController.error([reason])
-
reason<any>
Сообщает читаемой и записываемой сторонам об ошибке при обработке преобразуемых данных, из-за которой обе стороны внезапно закрываются.
transformStreamDefaultController.terminate()
Закрывает читаемую сторону транспортного потока и вызывает внезапное закрытие записываемой стороны с ошибкой.
Класс: ByteLengthQueuingStrategy
new ByteLengthQueuingStrategy(init)
byteLengthQueuingStrategy.highWaterMark
- Тип:
<number>
byteLengthQueuingStrategy.size
- Тип:
<Function>
Класс: CountQueuingStrategy
new CountQueuingStrategy(init)
countQueuingStrategy.highWaterMark
- Тип:
<number>
countQueuingStrategy.size
- Тип:
<Function>
Класс: TextEncoderStream
new TextEncoderStream()
Создает новый экземпляр TextEncoderStream.
textEncoderStream.encoding
- Тип:
<string>
Кодировка, поддерживаемая экземпляром TextEncoderStream.
textEncoderStream.readable
- Тип:
<ReadableStream>
textEncoderStream.writable
- Тип:
<WritableStream>
Класс: TextDecoderStream
new TextDecoderStream([encoding[, options]])
-
encoding<string>Определяетencoding, поддерживаемую этим экземпляромTextDecoder. По умолчанию:'utf-8'. -
options<Object>-
fatal<boolean>true, если ошибки декодирования являются фатальными. -
ignoreBOM<boolean>Если задано значениеtrue,TextDecoderStreamвключает метку порядка байтов в результат декодирования. Если задано значениеfalse, метка порядка байтов удаляется из результата. Этот параметр используется только еслиencodingимеет значение'utf-8','utf-16be'или'utf-16le'. По умолчанию:false.
-
Создает новый экземпляр TextDecoderStream.
textDecoderStream.encoding
- Тип:
<string>
Кодировка, поддерживаемая экземпляром TextDecoderStream.
textDecoderStream.fatal
- Тип:
<boolean>
Значение будет равно true, если ошибки декодирования приводят к выбрасыванию TypeError.
textDecoderStream.ignoreBOM
- Тип:
<boolean>
Значение будет true, если результат декодирования будет содержать маркер порядка байтов.
textDecoderStream.readable
- Тип:
<ReadableStream>
textDecoderStream.writable
- Тип:
<WritableStream>
Класс: CompressionStream
new CompressionStream(format)
-
format<string>Одно из следующих значений:'deflate','deflate-raw','gzip'или'brotli'.
compressionStream.readable
- Тип:
<ReadableStream>
compressionStream.writable
- Тип:
<WritableStream>
Класс: DecompressionStream
new DecompressionStream(format)
-
format<string>Одно из следующих значений:'deflate','deflate-raw','gzip'или'brotli'.
decompressionStream.readable
- Тип:
<ReadableStream>
decompressionStream.writable
- Тип:
<WritableStream>
Вспомогательные функции для чтения данных
Вспомогательные функции для чтения данных предоставляют стандартные способы чтения потоков.
Они доступны следующим образом:
Модули JavaScript
import {
arrayBuffer,
blob,
buffer,
json,
text,
} from 'node:stream/consumers';
CommonJS
const {
arrayBuffer,
blob,
buffer,
json,
text,
} = require('node:stream/consumers');
streamConsumers.arrayBuffer(stream)
-
stream<ReadableStream>|<stream.Readable>|<AsyncIterator> - Возвращает:
<Promise>Выполняется сArrayBuffer, содержащим всё содержимое потока.
Модули JavaScript
import { arrayBuffer } from 'node:stream/consumers';
import { Readable } from 'node:stream';
import { TextEncoder } from 'node:util';
const encoder = new TextEncoder();
const dataArray = encoder.encode('hello world from consumers!');
const readable = Readable.from(dataArray);
const data = await arrayBuffer(readable);
console.log(`from readable: ${data.byteLength}`);
// Prints: from readable: 76
CommonJS
const { arrayBuffer } = require('node:stream/consumers');
const { Readable } = require('node:stream');
const { TextEncoder } = require('node:util');
const encoder = new TextEncoder();
const dataArray = encoder.encode('hello world from consumers!');
const readable = Readable.from(dataArray);
arrayBuffer(readable).then((data) => {
console.log(`from readable: ${data.byteLength}`);
// Prints: from readable: 76
});
streamConsumers.blob(stream)
-
stream<ReadableStream>|<stream.Readable>|<AsyncIterator> - Возвращает:
<Promise>Выполняется с объектом<Blob>, содержащим всё содержимое потока.
Модули JavaScript
import { blob } from 'node:stream/consumers';
const dataBlob = new Blob(['hello world from consumers!']);
const readable = dataBlob.stream();
const data = await blob(readable);
console.log(`from readable: ${data.size}`);
// Prints: from readable: 27
CommonJS
const { blob } = require('node:stream/consumers');
const dataBlob = new Blob(['hello world from consumers!']);
const readable = dataBlob.stream();
blob(readable).then((data) => {
console.log(`from readable: ${data.size}`);
// Prints: from readable: 27
});
streamConsumers.buffer(stream)
-
stream<ReadableStream>|<stream.Readable>|<AsyncIterator> - Возвращает:
<Promise>Выполняется с объектом<Buffer>, содержащим всё содержимое потока.
Модули JavaScript
import { buffer } from 'node:stream/consumers';
import { Readable } from 'node:stream';
import { Buffer } from 'node:buffer';
const dataBuffer = Buffer.from('hello world from consumers!');
const readable = Readable.from(dataBuffer);
const data = await buffer(readable);
console.log(`from readable: ${data.length}`);
// Prints: from readable: 27
CommonJS
const { buffer } = require('node:stream/consumers');
const { Readable } = require('node:stream');
const { Buffer } = require('node:buffer');
const dataBuffer = Buffer.from('hello world from consumers!');
const readable = Readable.from(dataBuffer);
buffer(readable).then((data) => {
console.log(`from readable: ${data.length}`);
// Prints: from readable: 27
});
streamConsumers.bytes(stream)
-
stream<ReadableStream>|<stream.Readable>|<AsyncIterator> - Возвращает:
<Promise>Выполняется с объектом<Uint8Array>, содержащим всё содержимое потока.
Модули JavaScript
import { bytes } from 'node:stream/consumers';
import { Readable } from 'node:stream';
import { Buffer } from 'node:buffer';
const dataBuffer = Buffer.from('hello world from consumers!');
const readable = Readable.from(dataBuffer);
const data = await bytes(readable);
console.log(`from readable: ${data.length}`);
// Prints: from readable: 27
CommonJS
const { bytes } = require('node:stream/consumers');
const { Readable } = require('node:stream');
const { Buffer } = require('node:buffer');
const dataBuffer = Buffer.from('hello world from consumers!');
const readable = Readable.from(dataBuffer);
bytes(readable).then((data) => {
console.log(`from readable: ${data.length}`);
// Prints: from readable: 27
});
streamConsumers.json(stream)
-
stream<ReadableStream>|<stream.Readable>|<AsyncIterator> - Возвращает:
<Promise>Выполняется с содержимым потока, разобранным как строка в кодировке UTF-8, которая затем передаётся вJSON.parse().
Модули JavaScript
import { json } from 'node:stream/consumers';
import { Readable } from 'node:stream';
const items = Array.from(
{
length: 100,
},
() => ({
message: 'hello world from consumers!',
}),
);
const readable = Readable.from(JSON.stringify(items));
const data = await json(readable);
console.log(`from readable: ${data.length}`);
// Prints: from readable: 100
CommonJS
const { json } = require('node:stream/consumers');
const { Readable } = require('node:stream');
const items = Array.from(
{
length: 100,
},
() => ({
message: 'hello world from consumers!',
}),
);
const readable = Readable.from(JSON.stringify(items));
json(readable).then((data) => {
console.log(`from readable: ${data.length}`);
// Prints: from readable: 100
});
streamConsumers.text(stream)
-
stream<ReadableStream>|<stream.Readable>|<AsyncIterator> - Возвращает:
<Promise>Выполняется с содержимым потока, разобранным как строка в кодировке UTF-8.
Модули JavaScript
import { text } from 'node:stream/consumers';
import { Readable } from 'node:stream';
const readable = Readable.from('Hello world from consumers!');
const data = await text(readable);
console.log(`from readable: ${data.length}`);
// Prints: from readable: 27
CommonJS
const { text } = require('node:stream/consumers');
const { Readable } = require('node:stream');
const readable = Readable.from('Hello world from consumers!');
text(readable).then((data) => {
console.log(`from readable: ${data.length}`);
// Prints: from readable: 27
});
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/api/webstreams.html