本文档涵盖了 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 代表一个数据流源,具有两种控制器类型
| 控制器类型 | 目的 | 用例 |
|---|---|---|
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 结构
来源:ext/web/06_streams.js625-677 ext/web/06_streams.js679-693
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 创建 ReadableStreamwritableStreamForRid(rid, autoClose):从资源 ID 创建 WritableStreamresourceForReadableStream(stream, length):将 ReadableStream 转换为资源readableStreamCollectIntoUint8Array(stream):使用资源高效地收集流数据来源:ext/web/06_streams.js938-998 ext/web/06_streams.js1164-1203 ext/web/06_streams.js887-917
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
InnerBody 类在各种 body 类型和流之间充当桥梁
| Body 类型 | 流集成 |
|---|---|
ReadableStream | 直接使用或资源转换 |
Uint8Array | 带有流接口的静态 body |
字符串 | 编码为字节,然后流式传输 |
Blob | 从 blob 部分流式传输 |
FormData | 序列化并流式传输 |
来源:ext/fetch/22_body.js81-255 ext/fetch/22_body.js385-444
流 Teeing 操作从一个源创建两个独立的ReadableStream
流 Teeing 操作
来源:ext/web/06_streams.js2887-2978
Streams 支持在 ReadableStream 和 WritableStream 之间传输数据
pipeTo(destination, options):将 ReadableStream 管道传输到 WritableStreampipeThrough(transform, options):通过 TransformStream 管道传输来源:ext/web/06_streams.js7440-7456 ext/web/06_streams.js7458-7474
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 参数用于自动关闭资源来源: ext/web/06_streams.js760-780 ext/web/06_streams.js922-924 ext/web/06_streams.js1168-1176 ext/fetch/lib.rs801-811