类:ReadableStreamBYOBReader
¥Class: ReadableStreamBYOBReader
ReadableStreamBYOBReader 是面向字节的 <ReadableStream> 的替代消费者(在创建 ReadableStream 时将 underlyingSource.type 设置为 'bytes')。
¥The ReadableStreamBYOBReader is an alternative consumer for
byte-oriented <ReadableStream> (those that are created with
underlyingSource.type set equal to 'bytes' when the
ReadableStream was created).
BYOB 是 "带上你自己的缓冲区" 的缩写。这是一种模式,可以更有效地读取面向字节的数据,避免多余的复制。
¥The BYOB is short for "bring your own buffer". This is a
pattern that allows for more efficient reading of byte-oriented
data that avoids extraneous copying.
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());