菜单

Web 流

相关源文件

本文档涵盖了 Deno 对 Web Streams API 的实现,该 API 提供了用于流式数据处理的标准化接口。Web Streams 能够高效地处理大型数据集、实时数据处理,以及在 Deno 运行时中不同 I/O 操作之间的集成。

有关 HTTP 特定流式处理的信息,请参阅 Fetch 和 HTTP。有关 WebSocket 流式处理的信息,请参阅 WebSocket 协议

核心架构

Deno 的 Web Streams 实现遵循 WHATWG Streams 标准,并包含三种主要的流类型以及相关的控制器、读取器和写入器。

核心流类架构

来源:ext/web/06_streams.js445-467 ext/web/06_streams.js479-502 ext/web/06_streams.js584-602

流类型和控制器

ReadableStream

ReadableStream 代表一个数据流源,具有两种控制器类型

控制器类型目的用例
ReadableStreamDefaultController对象模式流JSON、文本或任意 JavaScript 对象
ReadableByteStreamController二进制数据流文件、网络数据、ArrayBuffers

ReadableStream 控制器和读取器架构

来源:ext/web/06_streams.js1256-1284 ext/web/06_streams.js410-425 ext/web/06_streams.js421-425

WritableStream 和 TransformStream

WritableStream 为数据流提供了一个目标,而 TransformStream 将可读和可写端结合起来用于数据转换

WritableStream 和 TransformStream 结构

来源:ext/web/06_streams.js625-677 ext/web/06_streams.js679-693

与 Deno 资源系统的集成

Web Streams 与 Deno 的资源系统深度集成,能够高效地流式传输文件、网络连接和其他 I/O 操作。

基于资源的流集成

来源:ext/web/06_streams.js937-998 ext/web/06_streams.js1164-1203 ext/web/06_streams.js887-917

基于资源的流函数

用于创建基于资源的流的关键函数

  • readableStreamForRid(rid, autoClose):从资源 ID 创建 ReadableStream
  • writableStreamForRid(rid, autoClose):从资源 ID 创建 WritableStream
  • resourceForReadableStream(stream, length):将 ReadableStream 转换为资源
  • readableStreamCollectIntoUint8Array(stream):使用资源高效地收集流数据

来源:ext/web/06_streams.js938-998 ext/web/06_streams.js1164-1203 ext/web/06_streams.js887-917

Fetch 和 HTTP 集成

Web Streams 是 Deno HTTP 实现的基础,作为请求和响应体的传输机制。

Fetch 和 HTTP 中的 Web Streams

来源:ext/fetch/22_body.js81-255 ext/fetch/26_fetch.js150-183 ext/fetch/lib.rs816-920

Body 流处理

InnerBody 类在各种 body 类型和流之间充当桥梁

Body 类型流集成
ReadableStream直接使用或资源转换
Uint8Array带有流接口的静态 body
字符串编码为字节,然后流式传输
Blob从 blob 部分流式传输
FormData序列化并流式传输

来源:ext/fetch/22_body.js81-255 ext/fetch/22_body.js385-444

流操作

Teeing 和克隆

流 Teeing 操作从一个源创建两个独立的ReadableStream

流 Teeing 操作

来源:ext/web/06_streams.js2887-2978

Piping 操作

Streams 支持在 ReadableStream 和 WritableStream 之间传输数据

  • pipeTo(destination, options):将 ReadableStream 管道传输到 WritableStream
  • pipeThrough(transform, options):通过 TransformStream 管道传输

来源:ext/web/06_streams.js7440-7456 ext/web/06_streams.js7458-7474

BYOB (Bring Your Own Buffer) 读取器

BYOB 读取器通过允许消费者提供自己的缓冲区来实现高效的二进制数据处理

BYOB 读取器数据流

来源: ext/web/06_streams.js5645-5791 ext/web/06_streams.js1256-1284

错误处理和取消

Web Streams 提供全面的错误处理和取消机制

取消支持

  • 集成 AbortController 以取消流操作
  • 可读流上的 cancel() 方法
  • 可写流上的 abort() 方法
  • 流错误时自动清理资源

流错误处理和取消

来源: ext/web/06_streams.js172-176 ext/web/06_streams.js942-950 ext/web/06_streams.js1168-1176

资源清理

Streams 通过以下方式自动管理资源清理:

  • 使用 SafeFinalizationRegistry 进行垃圾回收清理
  • autoClose 参数用于自动关闭资源
  • 错误传播以触发清理
  • 集成 cancel handle 以进行操作取消

来源: ext/web/06_streams.js760-780 ext/web/06_streams.js922-924 ext/web/06_streams.js1168-1176 ext/fetch/lib.rs801-811