TransformStreamDefaultController

Baseline 已广泛支持

此特性已得到充分确立,可在多种设备和浏览器版本上运行。自 ⁨2022 年 6 月⁩起,所有浏览器均支持此特性。

注意:此功能在 Web Workers 中可用。

TransformStreamDefaultController 接口是 Streams API 的一部分,提供了用于操作关联的 ReadableStreamWritableStream 的方法。

在构造 TransformStream 时,会创建 TransformStreamDefaultController。因此,它没有构造函数。获取 TransformStreamDefaultController 实例的方式是通过 TransformStream() 的回调方法。

实例属性

TransformStreamDefaultController.desiredSize 只读

返回用于填充流内部队列的可读端的期望大小。

实例方法

TransformStreamDefaultController.enqueue()

在流的可读端排队一个块(单个数据片段)。

TransformStreamDefaultController.error()

使转换流的可读端和可写端都出错。

TransformStreamDefaultController.terminate()

关闭流的可读端并使流的可写端出错。

示例

在下面的示例中,一个转换流使用 error()enqueue() 方法,将接收到的所有块作为 Uint8Array 值进行透传。

js
const transformContent = {
  start() {}, // required.
  async transform(chunk, controller) {
    chunk = await chunk;
    switch (typeof chunk) {
      case "object":
        // just say the stream is done I guess
        if (chunk === null) {
          controller.terminate();
        } else if (ArrayBuffer.isView(chunk)) {
          controller.enqueue(
            new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength),
          );
        } else if (
          Array.isArray(chunk) &&
          chunk.every((value) => typeof value === "number")
        ) {
          controller.enqueue(new Uint8Array(chunk));
        } else if (
          typeof chunk.valueOf === "function" &&
          chunk.valueOf() !== chunk
        ) {
          this.transform(chunk.valueOf(), controller); // hack
        } else if ("toJSON" in chunk) {
          this.transform(JSON.stringify(chunk), controller);
        }
        break;
      case "symbol":
        controller.error("Cannot send a symbol as a chunk part");
        break;
      case "undefined":
        controller.error("Cannot send undefined as a chunk part");
        break;
      default:
        controller.enqueue(this.textencoder.encode(String(chunk)));
        break;
    }
  },
  flush() {
    /* do any destructor work here */
  },
};

class AnyToU8Stream extends TransformStream {
  constructor() {
    super({ ...transformContent, textencoder: new TextEncoder() });
  }
}

规范

规范
Streams
# ts-default-controller-class

浏览器兼容性