Skip to content

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() الحالي مرة واحدة كل ثانية إلى الأبد. يتم استخدام مُكرِّر غير متزامن لقراءة البيانات من الدفق.

js
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);
js
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]

VersionChanges
v18.0.0This class is now exposed on the global object.
v16.5.0Added 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

الخاصية readableStream.locked تكون false افتراضيًا، ويتم تبديلها إلى true بينما يوجد قارئ نشط يستهلك بيانات التدفق.

readableStream.cancel([reason])

تمت الإضافة في: الإصدار v16.5.0

  • reason <any>
  • الإرجاع: وعد يتم تنفيذه مع undefined بمجرد اكتمال الإلغاء.

readableStream.getReader([options])

تمت الإضافة في: الإصدار v16.5.0

js
import { ReadableStream } from 'node:stream/web';

const stream = new ReadableStream();

const reader = stream.getReader();

console.log(await reader.read());
js
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 أثناء نشاط عملية الأنابيب.

js
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
js
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.locked بالقيمة true.

readableStream.values([options])

أضيف في: v16.5.0

  • options <Object>
    • preventCancel <boolean> عندما تكون القيمة true، يمنع إغلاق <ReadableStream> عندما يتم إنهاء المكرر غير المتزامن بشكل مفاجئ. افتراضي: false.

ينشئ ويعيد مكررًا غير متزامن قابل للاستخدام لاستهلاك بيانات ReadableStream.

يجعل readableStream.locked بالقيمة true أثناء نشاط المكرر غير المتزامن.

js
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.

js
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>.

js
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> جديدًا من كائن قابل للتكرار.

js
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'
js
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

ينشئ <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 هو اختصار لـ "أحضر المخزن المؤقت الخاص بك". هذا نمط يسمح بقراءة أكثر كفاءة للبيانات الموجهة نحو البايتات التي تتجنب النسخ الزائد.

js
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

ينشئ 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 من العناصر. عند عدم التعيين، يتم تحقيق الوعد عندما يتوفر عنصر واحد على الأقل.
  • القيمة المُعادة: وعد يتم تحقيقه مع كائن:

يطلب الجزء التالي من البيانات من <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

يُرجع مقدار البيانات المتبقية لملء قائمة انتظار <ReadableStream>.

readableStreamDefaultController.enqueue([chunk])

أُضيف في: v16.5.0

يُلحق قطعة بيانات جديدة بقائمة انتظار <ReadableStream>.

readableStreamDefaultController.error([error])

أُضيف في: v16.5.0

يُشير إلى خطأ يتسبب في حدوث خطأ وإغلاق <ReadableStream>.

الصنف: ReadableByteStreamController

[سجل التغييرات]

الإصدارالتغييرات
v18.10.0دعم التعامل مع طلب سحب BYOB من قارئ تم إصداره.
v16.5.0أُضيف في: v16.5.0

لكل <ReadableStream> مُتحكم مسؤول عن الحالة الداخلية وإدارة قائمة انتظار التدفق. ReadableByteStreamController مخصص لـ ReadableStream الموجهة بالبايتات.

readableByteStreamController.byobRequest

تمت الإضافة في: v16.5.0

readableByteStreamController.close()

تمت الإضافة في: v16.5.0

يغلق <ReadableStream> المرتبط بهذا المتحكم.

readableByteStreamController.desiredSize

تمت الإضافة في: v16.5.0

يُرجع مقدار البيانات المتبقية لملء قائمة انتظار <ReadableStream>.

readableByteStreamController.enqueue(chunk)

تمت الإضافة في: v16.5.0

يلحق جزءًا جديدًا من البيانات بقائمة انتظار <ReadableStream>.

readableByteStreamController.error([error])

تمت الإضافة في: v16.5.0

يشير إلى وجود خطأ يتسبب في حدوث خطأ في <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 من البايتات إلى readableStreamBYOBRequest.view.

readableStreamBYOBRequest.respondWithNewView(view)

تمت الإضافة في: الإصدار 16.5.0

يشير إلى أنه تم تلبية الطلب ببايتات مكتوبة في Buffer أو TypedArray أو DataView جديد.

readableStreamBYOBRequest.view

تمت الإضافة في: الإصدار 16.5.0

الفئة: WritableStream

[السجل]

الإصدارالتغييرات
v18.0.0هذه الفئة معروضة الآن على الكائن العام.
v16.5.0تمت الإضافة في: الإصدار 16.5.0

WritableStream هي وجهة يتم إرسال بيانات التدفق إليها.

js
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

ينشئ ويعيد مثيل كاتب جديد يمكن استخدامه لكتابة البيانات في WritableStream.

writableStream.locked

تمت الإضافة في: الإصدار 16.5.0

خاصية writableStream.locked هي false افتراضيًا، ويتم تبديلها إلى true عندما يكون هناك كاتب نشط متصل بـ WritableStream.

النقل باستخدام postMessage()

يمكن نقل مثيل <WritableStream> باستخدام <MessagePort>.

js
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

ينشئ 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

يتم استدعاؤه بواسطة كود المستخدم للإشارة إلى حدوث خطأ أثناء معالجة بيانات WritableStream. عند الاستدعاء، سيتم إلغاء <WritableStream>، مع إلغاء الكتابات المعلقة حاليًا.

writableStreamDefaultController.signal

  • النوع: <AbortSignal>AbortSignal يمكن استخدامه لإلغاء عمليات الكتابة أو الإغلاق المعلقة عندما يتم إجهاض <WritableStream>.

الفئة: ‏TransformStream

[السجل]

الإصدارالتغييرات
v18.0.0هذه الفئة معروضة الآن على الكائن العام.
v16.5.0تمت إضافته في: v16.5.0

يتكون ‏TransformStream من <ReadableStream> و <WritableStream> متصلين بحيث يتم استقبال البيانات المكتوبة إلى ‏WritableStream، وربما تحويلها، قبل دفعها إلى قائمة انتظار ‏ReadableStream.

js
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

transformStream.writable

أضيف في: الإصدار 16.5.0

النقل باستخدام postMessage()

يمكن نقل مثيل <TransformStream> باستخدام <MessagePort>.

js
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

مقدار البيانات المطلوبة لملء قائمة الانتظار للجانب القابل للقراءة.

transformStreamDefaultController.enqueue([chunk])

أضيف في: الإصدار 16.5.0

يُلحِق جزءًا من البيانات بقائمة الانتظار للجانب القابل للقراءة.

transformStreamDefaultController.error([reason])

أضيف في: الإصدار 16.5.0

يشير إلى كل من الجانب القابل للقراءة والجانب القابل للكتابة إلى حدوث خطأ أثناء معالجة بيانات التحويل، مما يتسبب في إغلاق كلا الجانبين فجأة.

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

byteLengthQueuingStrategy.size

أضيف في: v16.5.0

الفئة: CountQueuingStrategy

[السجل]

الإصدارالتغييرات
v18.0.0هذه الفئة معروضة الآن على الكائن العام.
v16.5.0أضيف في: v16.5.0

new CountQueuingStrategy(init)

أضيف في: v16.5.0

countQueuingStrategy.highWaterMark

أضيف في: v16.5.0

countQueuingStrategy.size

أضيف في: v16.5.0

الفئة: TextEncoderStream

[السجل]

الإصدارالتغييرات
v18.0.0هذه الفئة معروضة الآن على الكائن العام.
v16.6.0أضيف في: v16.6.0

new TextEncoderStream()

أُضيف في: v16.6.0

ينشئ مثيلًا جديدًا لـ TextEncoderStream.

textEncoderStream.encoding

أُضيف في: v16.6.0

التشفير الذي يدعمه مثيل TextEncoderStream.

textEncoderStream.readable

أُضيف في: v16.6.0

textEncoderStream.writable

أُضيف في: v16.6.0

الفئة: 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

التشفير الذي يدعمه مثيل TextDecoderStream.

textDecoderStream.fatal

أُضيف في: v16.6.0

ستكون القيمة true إذا أدت أخطاء فك التشفير إلى طرح TypeError.

textDecoderStream.ignoreBOM

تمت الإضافة في: v16.6.0

ستكون القيمة true إذا كانت نتيجة فك التشفير ستتضمن علامة ترتيب البايت.

textDecoderStream.readable

تمت الإضافة في: v16.6.0

textDecoderStream.writable

تمت الإضافة في: v16.6.0

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

compressionStream.writable

تمت الإضافة في: v17.0.0

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

decompressionStream.writable

تمت الإضافة في: v17.0.0

مستهلكو الأداة المساعدة

أضيف في: v16.7.0

توفر وظائف مستهلك الأداة المساعدة خيارات شائعة لاستهلاك التدفقات.

يتم الوصول إليها باستخدام:

js
import {
  arrayBuffer,
  blob,
  buffer,
  json,
  text,
} from 'node:stream/consumers';
js
const {
  arrayBuffer,
  blob,
  buffer,
  json,
  text,
} = require('node:stream/consumers');

streamConsumers.arrayBuffer(stream)

أضيف في: v16.7.0

js
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
js
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

js
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
js
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

js
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
js
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

js
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
js
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

js
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
js
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
});