Web Streams API
[التاريخ]
الإصدار | التغييرات |
---|---|
v21.0.0 | لم يعد تجريبيًا. |
v18.0.0 | لم يعد استخدام واجهة برمجة التطبيقات هذه يصدر تحذيرًا في وقت التشغيل. |
v16.5.0 | تمت إضافته في: v16.5.0 |
[مستقر: 2 - مستقر]
مستقر: 2 الاستقرار: 2 - مستقر
تنفيذ معيار WHATWG Streams.
نظرة عامة
يحدد معيار WHATWG Streams (أو "تدفقات الويب") واجهة برمجة تطبيقات للتعامل مع بيانات البث. إنه مشابه لواجهة برمجة تطبيقات التدفقات الخاصة بـ Node.js ولكنه ظهر لاحقًا وأصبح واجهة برمجة التطبيقات "القياسية" لتدفق البيانات عبر العديد من بيئات JavaScript.
هناك ثلاثة أنواع رئيسية من الكائنات:
ReadableStream
- يمثل مصدرًا لبيانات البث.WritableStream
- يمثل وجهة لبيانات البث.TransformStream
- يمثل خوارزمية لتحويل بيانات البث.
مثال ReadableStream
ينشئ هذا المثال ReadableStream
بسيطًا يدفع الطابع الزمني performance.now()
الحالي مرة واحدة كل ثانية إلى الأبد. يتم استخدام مُكرِّر غير متزامن لقراءة البيانات من الدفق.
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);
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);
})();
API
Class: ReadableStream
[History]
Version | Changes |
---|---|
v18.0.0 | This class is now exposed on the global object. |
v16.5.0 | Added in: v16.5.0 |
new ReadableStream([underlyingSource [, strategy]])
Added in: v16.5.0
underlyingSource
<Object>start
<Function> دالة معرفة من قبل المستخدم يتم استدعاؤها فور إنشاءReadableStream
.controller
<ReadableStreamDefaultController> | <ReadableByteStreamController>Returns:
undefined
أو وعد يتم تحقيقه بقيمةundefined
.pull
<Function> دالة معرفة من قبل المستخدم يتم استدعاؤها بشكل متكرر عندما لا يكون الطابور الداخليReadableStream
ممتلئًا. قد تكون العملية متزامنة أو غير متزامنة. إذا كانت غير متزامنة، فلن يتم استدعاء الدالة مرة أخرى حتى يتم تحقيق الوعد الذي تم إرجاعه مسبقًا.controller
<ReadableStreamDefaultController> | <ReadableByteStreamController>Returns: وعد يتم تحقيقه بقيمة
undefined
.cancel
<Function> دالة معرفة من قبل المستخدم يتم استدعاؤها عند إلغاءReadableStream
.reason
<any>Returns: وعد يتم تحقيقه بقيمة
undefined
.type
<string> يجب أن يكون'bytes'
أوundefined
.autoAllocateChunkSize
<number> يُستخدم فقط عندما تكونtype
مساوية لـ'bytes'
. عند التعيين إلى قيمة غير صفرية، يتم تخصيص مخزن مؤقت للعرض تلقائيًا لـReadableByteStreamController.byobRequest
. عند عدم التعيين، يجب استخدام قوائم الانتظار الداخلية للدفق لنقل البيانات عبر القارئ الافتراضيReadableStreamDefaultReader
.
strategy
<Object>highWaterMark
<number> الحد الأقصى لحجم قائمة الانتظار الداخلية قبل تطبيق الضغط الخلفي.size
<Function> دالة معرفة من قبل المستخدم تُستخدم لتحديد حجم كل جزء من البيانات.chunk
<any>- Returns: <number>
readableStream.locked
تمت الإضافة في: الإصدار v16.5.0
- النوع: <boolean> يتم تعيينها إلى
true
إذا كان هناك قارئ نشط لهذا <ReadableStream>.
الخاصية readableStream.locked
تكون false
افتراضيًا، ويتم تبديلها إلى true
بينما يوجد قارئ نشط يستهلك بيانات التدفق.
readableStream.cancel([reason])
تمت الإضافة في: الإصدار v16.5.0
reason
<any>- الإرجاع: وعد يتم تنفيذه مع
undefined
بمجرد اكتمال الإلغاء.
readableStream.getReader([options])
تمت الإضافة في: الإصدار v16.5.0
options
<Object>mode
<string>'byob'
أوundefined
الإرجاع: <ReadableStreamDefaultReader> | <ReadableStreamBYOBReader>
import { ReadableStream } from 'node:stream/web';
const stream = new ReadableStream();
const reader = stream.getReader();
console.log(await reader.read());
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])
تمت الإضافة في: الإصدار v16.5.0
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
أثناء نشاط عملية الأنابيب.
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
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])
أضيف في: v16.5.0
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()
[السجل]
الإصدار | التغييرات |
---|---|
v18.10.0, v16.18.0 | دعم إنشاء نسخة مطابقة لتيار بايت قابل للقراءة. |
v16.5.0 | أضيف في: v16.5.0 |
- الإرجاع: <ReadableStream[]>
يُرجع زوجًا من مثيلات <ReadableStream> الجديدة التي سيتم توجيه بيانات ReadableStream
إليها. سيتلقى كل منهما نفس البيانات.
يجعل readableStream.locked
بالقيمة true
.
readableStream.values([options])
أضيف في: v16.5.0
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());
التكرار غير المتزامن
يدعم الكائن <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());
سيستهلك المكرر غير المتزامن <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]);
ReadableStream.from(iterable)
تمت الإضافة في: v20.6.0
iterable
<Iterable> كائن يقوم بتنفيذ بروتوكول التكرارSymbol.asyncIterator
أوSymbol.iterator
.
طريقة مساعدة تنشئ <ReadableStream> جديدًا من كائن قابل للتكرار.
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'
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'
})();
الفئة: ReadableStreamDefaultReader
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار v18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
الإصدار v16.5.0 | أُضيف في: v16.5.0 |
بشكل افتراضي، استدعاء readableStream.getReader()
بدون وسيطات سيعيد نسخة من ReadableStreamDefaultReader
. يعامل القارئ الافتراضي أجزاء البيانات التي تمر عبر الدفق كقيم مبهمة، مما يسمح لـ <ReadableStream> بالعمل بشكل عام مع أي قيمة JavaScript.
new ReadableStreamDefaultReader(stream)
أُضيف في: v16.5.0
stream
<ReadableStream>
ينشئ <ReadableStreamDefaultReader> جديدًا مؤمنًا للدفق <ReadableStream> المحدد.
readableStreamDefaultReader.cancel([reason])
أُضيف في: v16.5.0
reason
<any>- الإرجاع: وعد يتم تحقيقه بـ
undefined
.
يلغي <ReadableStream> ويعيد وعدًا يتم تحقيقه عند إلغاء الدفق الأساسي.
readableStreamDefaultReader.closed
أُضيف في: v16.5.0
- النوع: <Promise> يتم تحقيقه بـ
undefined
عندما يتم إغلاق <ReadableStream> المرتبط أو يتم رفضه إذا حدث خطأ في الدفق أو تم تحرير قفل القارئ قبل أن ينتهي الدفق من الإغلاق.
readableStreamDefaultReader.read()
أُضيف في: v16.5.0
يطلب الجزء التالي من البيانات من <ReadableStream> الأساسي ويعيد وعدًا يتم تحقيقه بالبيانات بمجرد توفرها.
readableStreamDefaultReader.releaseLock()
أضيف في: الإصدار 16.5.0
يحرر قفل هذا القارئ على <ReadableStream> الأساسي.
الفئة: ReadableStreamBYOBReader
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
الإصدار 16.5.0 | أضيف في: الإصدار 16.5.0 |
ReadableStreamBYOBReader
هو مستهلك بديل لـ <ReadableStream> الموجهة نحو البايتات (تلك التي تم إنشاؤها مع underlyingSource.type
المعين على القيمة 'bytes'
عند إنشاء ReadableStream
).
BYOB
هو اختصار لـ "أحضر المخزن المؤقت الخاص بك". هذا نمط يسمح بقراءة أكثر كفاءة للبيانات الموجهة نحو البايتات التي تتجنب النسخ الزائد.
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());
new ReadableStreamBYOBReader(stream)
أضيف في: الإصدار 16.5.0
stream
<ReadableStream>
ينشئ ReadableStreamBYOBReader
جديدًا مقفلًا على <ReadableStream> المحدد.
readableStreamBYOBReader.cancel([reason])
أُضيف في: الإصدار 16.5.0
reason
<any>- القيمة المُعادة: وعد يتم تحقيقه مع
undefined
.
يلغي <ReadableStream> ويعيد وعدًا يتم تحقيقه عندما يتم إلغاء التدفق الأساسي.
readableStreamBYOBReader.closed
أُضيف في: الإصدار 16.5.0
- النوع: <Promise> يتم تحقيقه مع
undefined
عندما يتم إغلاق <ReadableStream> المرتبط أو رفضه إذا حدث خطأ في التدفق أو تم تحرير قفل القارئ قبل انتهاء التدفق من الإغلاق.
readableStreamBYOBReader.read(view[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v21.7.0, v20.17.0 | تمت إضافة خيار min . |
v16.5.0 | أُضيف في: الإصدار 16.5.0 |
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()
أُضيف في: v16.5.0
يُحرِّر قفل هذا القارئ على <ReadableStream> الأساسي.
الصنف: ReadableStreamDefaultController
أُضيف في: v16.5.0
لكل <ReadableStream> مُتحكم مسؤول عن الحالة الداخلية وإدارة قائمة انتظار التدفق. ReadableStreamDefaultController
هو تطبيق المتحكم الافتراضي لـ ReadableStream
التي ليست مُوجهة بالبايتات.
readableStreamDefaultController.close()
أُضيف في: v16.5.0
يُغلق <ReadableStream> الذي يرتبط به هذا المتحكم.
readableStreamDefaultController.desiredSize
أُضيف في: v16.5.0
- النوع: <number>
يُرجع مقدار البيانات المتبقية لملء قائمة انتظار <ReadableStream>.
readableStreamDefaultController.enqueue([chunk])
أُضيف في: v16.5.0
chunk
<any>
يُلحق قطعة بيانات جديدة بقائمة انتظار <ReadableStream>.
readableStreamDefaultController.error([error])
أُضيف في: v16.5.0
error
<any>
يُشير إلى خطأ يتسبب في حدوث خطأ وإغلاق <ReadableStream>.
الصنف: ReadableByteStreamController
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v18.10.0 | دعم التعامل مع طلب سحب BYOB من قارئ تم إصداره. |
v16.5.0 | أُضيف في: v16.5.0 |
لكل <ReadableStream> مُتحكم مسؤول عن الحالة الداخلية وإدارة قائمة انتظار التدفق. ReadableByteStreamController
مخصص لـ ReadableStream
الموجهة بالبايتات.
readableByteStreamController.byobRequest
تمت الإضافة في: v16.5.0
- النوع: <ReadableStreamBYOBRequest>
readableByteStreamController.close()
تمت الإضافة في: v16.5.0
يغلق <ReadableStream> المرتبط بهذا المتحكم.
readableByteStreamController.desiredSize
تمت الإضافة في: v16.5.0
- النوع: <number>
يُرجع مقدار البيانات المتبقية لملء قائمة انتظار <ReadableStream>.
readableByteStreamController.enqueue(chunk)
تمت الإضافة في: v16.5.0
-
chunk
: <Buffer> | <TypedArray> | <DataView>
يلحق جزءًا جديدًا من البيانات بقائمة انتظار <ReadableStream>.
readableByteStreamController.error([error])
تمت الإضافة في: v16.5.0
-
error
<any>
يشير إلى وجود خطأ يتسبب في حدوث خطأ في <ReadableStream> وإغلاقه.
الصنف: ReadableStreamBYOBRequest
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذا الصنف معروض الآن على الكائن العام. |
v16.5.0 | تمت الإضافة في: v16.5.0 |
عند استخدام ReadableByteStreamController
في تدفقات موجهة بالبايت، وعند استخدام ReadableStreamBYOBReader
، توفر الخاصية readableByteStreamController.byobRequest
الوصول إلى نسخة ReadableStreamBYOBRequest
التي تمثل طلب القراءة الحالي. يُستخدم الكائن للوصول إلى ArrayBuffer
/TypedArray
التي تم توفيرها لطلب القراءة لملئها، ويوفر طرقًا للإشارة إلى أنه تم توفير البيانات.
readableStreamBYOBRequest.respond(bytesWritten)
تمت الإضافة في: الإصدار 16.5.0
bytesWritten
<number>
يشير إلى أنه تم كتابة عدد bytesWritten
من البايتات إلى readableStreamBYOBRequest.view
.
readableStreamBYOBRequest.respondWithNewView(view)
تمت الإضافة في: الإصدار 16.5.0
view
<Buffer> | <TypedArray> | <DataView>
يشير إلى أنه تم تلبية الطلب ببايتات مكتوبة في Buffer
أو TypedArray
أو DataView
جديد.
readableStreamBYOBRequest.view
تمت الإضافة في: الإصدار 16.5.0
- النوع: <Buffer> | <TypedArray> | <DataView>
الفئة: WritableStream
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
v16.5.0 | تمت الإضافة في: الإصدار 16.5.0 |
WritableStream
هي وجهة يتم إرسال بيانات التدفق إليها.
import {
WritableStream,
} from 'node:stream/web';
const stream = new WritableStream({
write(chunk) {
console.log(chunk);
},
});
await stream.getWriter().write('Hello World');
new WritableStream([underlyingSink[, strategy]])
تمت الإضافة في: الإصدار 16.5.0
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
محجوز للاستخدام المستقبلي و يجب أن يكون غير محدد.
strategy
<Object>highWaterMark
<number> الحد الأقصى لحجم قائمة الانتظار الداخلية قبل تطبيق الضغط الخلفي.size
<Function> دالة معرفة من قبل المستخدم تستخدم لتحديد حجم كل جزء من البيانات.chunk
<any>- الإرجاع: <number>
writableStream.abort([reason])
تمت الإضافة في: الإصدار 16.5.0
reason
<any>- الإرجاع: وعد يتم تحقيقه مع
undefined
.
ينهي WritableStream
بشكل مفاجئ. سيتم إلغاء جميع عمليات الكتابة المنتظرة مع رفض الوعود المرتبطة بها.
writableStream.close()
تمت الإضافة في: الإصدار 16.5.0
- الإرجاع: وعد يتم تحقيقه مع
undefined
.
يغلق WritableStream
عندما لا يُتوقع إجراء عمليات كتابة إضافية.
writableStream.getWriter()
تمت الإضافة في: الإصدار 16.5.0
- الإرجاع: <WritableStreamDefaultWriter>
ينشئ ويعيد مثيل كاتب جديد يمكن استخدامه لكتابة البيانات في WritableStream
.
writableStream.locked
تمت الإضافة في: الإصدار 16.5.0
- النوع: <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]);
الفئة: WritableStreamDefaultWriter
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
الإصدار 16.5.0 | تمت الإضافة في: الإصدار 16.5.0 |
new WritableStreamDefaultWriter(stream)
تمت الإضافة في: الإصدار 16.5.0
stream
<WritableStream>
ينشئ WritableStreamDefaultWriter
جديدًا مقفلًا على WritableStream
المحدد.
writableStreamDefaultWriter.abort([reason])
تمت الإضافة في: الإصدار 16.5.0
reason
<any>- الإرجاع: وعد يتم تحقيقه مع
undefined
.
ينهي WritableStream
بشكل مفاجئ. سيتم إلغاء جميع عمليات الكتابة المنتظرة مع رفض الوعود المرتبطة بها.
writableStreamDefaultWriter.close()
أضيف في: v16.5.0
- الإرجاع: وعد يتحقق بـ
undefined
.
يغلق WritableStream
عندما لا يُتوقع كتابة إضافية.
writableStreamDefaultWriter.closed
أضيف في: v16.5.0
- النوع: <وعد> يتحقق بـ
undefined
عندما يتم إغلاق <WritableStream> المرتبط أو يتم رفضه إذا حدث خطأ في التدفق أو تم تحرير قفل الكاتب قبل أن ينتهي التدفق من الإغلاق.
writableStreamDefaultWriter.desiredSize
أضيف في: v16.5.0
- النوع: <عدد>
كمية البيانات المطلوبة لملء قائمة انتظار <WritableStream>.
writableStreamDefaultWriter.ready
أضيف في: v16.5.0
- النوع: <وعد> يتحقق بـ
undefined
عندما يكون الكاتب جاهزًا للاستخدام.
writableStreamDefaultWriter.releaseLock()
أضيف في: v16.5.0
يحرر قفل هذا الكاتب على <ReadableStream> الأساسي.
writableStreamDefaultWriter.write([chunk])
أضيف في: v16.5.0
chunk
: <أي نوع>- الإرجاع: وعد يتحقق بـ
undefined
.
يلحق قطعة جديدة من البيانات بقائمة انتظار <WritableStream>.
الفئة: WritableStreamDefaultController
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
v16.5.0 | أضيف في: v16.5.0 |
يدير WritableStreamDefaultController
الحالة الداخلية لـ <WritableStream>.
writableStreamDefaultController.error([error])
أضيف في: v16.5.0
error
<أي نوع>
يتم استدعاؤه بواسطة كود المستخدم للإشارة إلى حدوث خطأ أثناء معالجة بيانات WritableStream
. عند الاستدعاء، سيتم إلغاء <WritableStream>، مع إلغاء الكتابات المعلقة حاليًا.
writableStreamDefaultController.signal
- النوع: <AbortSignal>
AbortSignal
يمكن استخدامه لإلغاء عمليات الكتابة أو الإغلاق المعلقة عندما يتم إجهاض <WritableStream>.
الفئة: TransformStream
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
v16.5.0 | تمت إضافته في: v16.5.0 |
يتكون 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(),
]);
new TransformStream([transformer[, writableStrategy[, readableStrategy]]])
تمت إضافته في: v16.5.0
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
.
readableType
<any> خيارreadableType
محجوز للاستخدام المستقبلي ويجب أن يكونundefined
.
writableType
<any> خيارwritableType
محجوز للاستخدام المستقبلي ويجب أن يكونundefined
.
writableStrategy
<Object>-
highWaterMark
<number> الحد الأقصى لحجم قائمة الانتظار الداخلية قبل تطبيق الضغط الخلفي. -
size
<Function> دالة معرفة من قبل المستخدم تستخدم لتحديد حجم كل جزء من البيانات. -
chunk
<any> - الإرجاع: <number>
-
readableStrategy
<Object>-
highWaterMark
<number> الحد الأقصى لحجم قائمة الانتظار الداخلية قبل تطبيق الضغط الخلفي. -
size
<Function> دالة معرفة من قبل المستخدم تستخدم لتحديد حجم كل جزء من البيانات. -
chunk
<any> - الإرجاع: <number>
-
transformStream.readable
أضيف في: الإصدار 16.5.0
- النوع: <ReadableStream>
transformStream.writable
أضيف في: الإصدار 16.5.0
- النوع: <WritableStream>
النقل باستخدام postMessage()
يمكن نقل مثيل <TransformStream> باستخدام <MessagePort>.
const stream = new TransformStream();
const { port1, port2 } = new MessageChannel();
port1.onmessage = ({ data }) => {
const { writable, readable } = data;
// ...
};
port2.postMessage(stream, [stream]);
الفئة: TransformStreamDefaultController
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
الإصدار 16.5.0 | أضيف في: الإصدار 16.5.0 |
يدير TransformStreamDefaultController
الحالة الداخلية لـ TransformStream
.
transformStreamDefaultController.desiredSize
أضيف في: الإصدار 16.5.0
- النوع: <number>
مقدار البيانات المطلوبة لملء قائمة الانتظار للجانب القابل للقراءة.
transformStreamDefaultController.enqueue([chunk])
أضيف في: الإصدار 16.5.0
chunk
<any>
يُلحِق جزءًا من البيانات بقائمة الانتظار للجانب القابل للقراءة.
transformStreamDefaultController.error([reason])
أضيف في: الإصدار 16.5.0
reason
<any>
يشير إلى كل من الجانب القابل للقراءة والجانب القابل للكتابة إلى حدوث خطأ أثناء معالجة بيانات التحويل، مما يتسبب في إغلاق كلا الجانبين فجأة.
transformStreamDefaultController.terminate()
أضيف في: الإصدار 16.5.0
يُغلِق الجانب القابل للقراءة من النقل ويتسبب في إغلاق الجانب القابل للكتابة فجأة مع وجود خطأ.
الفئة: ByteLengthQueuingStrategy
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
الإصدار 16.5.0 | أضيف في: الإصدار 16.5.0 |
new ByteLengthQueuingStrategy(init)
أضيف في: v16.5.0
byteLengthQueuingStrategy.highWaterMark
أضيف في: v16.5.0
- النوع: <number>
byteLengthQueuingStrategy.size
أضيف في: v16.5.0
- النوع: <Function>
الفئة: CountQueuingStrategy
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
v16.5.0 | أضيف في: v16.5.0 |
new CountQueuingStrategy(init)
أضيف في: v16.5.0
countQueuingStrategy.highWaterMark
أضيف في: v16.5.0
- النوع: <number>
countQueuingStrategy.size
أضيف في: v16.5.0
- النوع: <Function>
الفئة: TextEncoderStream
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
v16.6.0 | أضيف في: v16.6.0 |
new TextEncoderStream()
أُضيف في: v16.6.0
ينشئ مثيلًا جديدًا لـ TextEncoderStream
.
textEncoderStream.encoding
أُضيف في: v16.6.0
- النوع: <string>
التشفير الذي يدعمه مثيل TextEncoderStream
.
textEncoderStream.readable
أُضيف في: v16.6.0
- النوع: <ReadableStream>
textEncoderStream.writable
أُضيف في: v16.6.0
- النوع: <WritableStream>
الفئة: TextDecoderStream
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذه الفئة معروضة الآن على الكائن العام. |
v16.6.0 | أُضيف في: v16.6.0 |
new TextDecoderStream([encoding[, options]])
أُضيف في: v16.6.0
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
أُضيف في: v16.6.0
- النوع: <string>
التشفير الذي يدعمه مثيل TextDecoderStream
.
textDecoderStream.fatal
أُضيف في: v16.6.0
- النوع: <boolean>
ستكون القيمة true
إذا أدت أخطاء فك التشفير إلى طرح TypeError
.
textDecoderStream.ignoreBOM
تمت الإضافة في: v16.6.0
- النوع: <boolean>
ستكون القيمة true
إذا كانت نتيجة فك التشفير ستتضمن علامة ترتيب البايت.
textDecoderStream.readable
تمت الإضافة في: v16.6.0
- النوع: <ReadableStream>
textDecoderStream.writable
تمت الإضافة في: v16.6.0
- النوع: <WritableStream>
Class: CompressionStream
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذا الصنف معروض الآن على الكائن العام. |
v17.0.0 | تمت الإضافة في: v17.0.0 |
new CompressionStream(format)
[السجل]
الإصدار | التغييرات |
---|---|
v21.2.0, v20.12.0 | يقبل الآن التنسيق قيمة deflate-raw . |
v17.0.0 | تمت الإضافة في: v17.0.0 |
format
<string> أحد الخيارات التالية:'deflate'
أو'deflate-raw'
أو'gzip'
.
compressionStream.readable
تمت الإضافة في: v17.0.0
- النوع: <ReadableStream>
compressionStream.writable
تمت الإضافة في: v17.0.0
- النوع: <WritableStream>
Class: DecompressionStream
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | هذا الصنف معروض الآن على الكائن العام. |
v17.0.0 | تمت الإضافة في: v17.0.0 |
new DecompressionStream(format)
[السجل]
الإصدار | التغييرات |
---|---|
v21.2.0, v20.12.0 | يقبل الآن التنسيق قيمة deflate-raw . |
v17.0.0 | تمت الإضافة في: v17.0.0 |
format
<string> أحد الخيارات التالية:'deflate'
أو'deflate-raw'
أو'gzip'
.
decompressionStream.readable
تمت الإضافة في: v17.0.0
- النوع: <ReadableStream>
decompressionStream.writable
تمت الإضافة في: v17.0.0
- النوع: <WritableStream>
مستهلكو الأداة المساعدة
أضيف في: v16.7.0
توفر وظائف مستهلك الأداة المساعدة خيارات شائعة لاستهلاك التدفقات.
يتم الوصول إليها باستخدام:
import {
arrayBuffer,
blob,
buffer,
json,
text,
} from 'node:stream/consumers';
const {
arrayBuffer,
blob,
buffer,
json,
text,
} = require('node:stream/consumers');
streamConsumers.arrayBuffer(stream)
أضيف في: v16.7.0
stream
<ReadableStream> | <stream.Readable> | <AsyncIterator>- Returns: <Promise> تحقق مع
ArrayBuffer
يحتوي على المحتويات الكاملة للتدفق.
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
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)
أضيف في: v16.7.0
stream
<ReadableStream> | <stream.Readable> | <AsyncIterator>- Returns: <Promise> تحقق مع <Blob> يحتوي على المحتويات الكاملة للتدفق.
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
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)
أضيف في: v16.7.0
stream
<ReadableStream> | <stream.Readable> | <AsyncIterator>- الإرجاع: <Promise> تتحقق مع <Buffer> تحتوي على المحتويات الكاملة للدفق.
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
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.json(stream)
أضيف في: v16.7.0
stream
<ReadableStream> | <stream.Readable> | <AsyncIterator>- الإرجاع: <Promise> تتحقق مع محتويات الدفق التي تم تحليلها كسلسلة بترميز UTF-8 والتي يتم تمريرها بعد ذلك عبر
JSON.parse()
.
import { json } from 'node:stream/consumers';
import { Readable } from 'node:stream';
const items = Array.from(
{
length: 100,
},
() => ({
message: 'hello world from consumers!',
}),
);
const readable = Readable.from(JSON.stringify(items));
const data = await json(readable);
console.log(`from readable: ${data.length}`);
// Prints: from readable: 100
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)
أضيف في: الإصدار 16.7.0
stream
<ReadableStream> | <stream.Readable> | <AsyncIterator>- القيمة المعادة: <Promise> يتم الوفاء بها بمحتويات التدفق التي تم تحليلها كسلسلة مرمزة بـ UTF-8.
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
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
});