菜单

Web 标准支持

相关源文件

Deno 通过 Rust 扩展和 JavaScript 模块的组合来实现 Web 标准 API 和协议。每个 Web 标准都实现为一个 deno_core::extension!,它同时提供 Rust ops 和 JavaScript/TypeScript 接口。

概述

Deno 中的 Web 标准通过注册 ops 和 ESM 模块的扩展来实现。该架构使用 Rust 来处理性能关键的操作,使用 JavaScript 来提供符合标准的接口。

扩展架构

来源

实现模式

每个 Web 标准都遵循一致的模式:Rust ops 处理系统调用和资源管理,而 JavaScript 模块提供 Web API 接口。

标准实现流程

来源

Fetch 和 HTTP

fetch 实现使用 `deno_fetch` 扩展来处理 HTTP 客户端操作,并使用 `deno_http` 扩展来处理服务器功能。

Fetch API 实现

全局 `fetch()` 在 ext/fetch/26_fetch.js121-306 中实现,由 `op_fetch` 处理底层的 HTTP 客户端工作。

关键 Fetch Ops

Op目的位置
op_fetch创建 HTTP 请求ext/fetch/lib.rs508-587
op_fetch_send执行请求ext/fetch/lib.rs509
op_fetch_custom_client创建自定义客户端ext/fetch/lib.rs150

HTTP 服务器实现

来源

Web 加密

`deno_crypto` 扩展通过 ext/crypto/00_crypto.js509-1610 中的 `SubtleCrypto` 接口实现了 Web Crypto API。

Crypto 操作和 Ops

操作Op 函数算法
digest()op_crypto_subtle_digestSHA-1, SHA-256, SHA-384, SHA-512
generateKey()op_crypto_generate_keyRSA, ECDSA, ECDH, AES, HMAC, Ed25519, X25519, X448
sign()op_crypto_sign_key, op_crypto_sign_ed25519RSA-PSS, ECDSA, HMAC, Ed25519
verify()op_crypto_verify_key, op_crypto_verify_ed25519RSA-PSS, ECDSA, HMAC, Ed25519
encrypt()/decrypt()op_crypto_encrypt, op_crypto_decryptRSA-OAEP, AES-CBC, AES-CTR, AES-GCM
deriveBits()op_crypto_derive_bitsHKDF, PBKDF2, ECDH, X25519, X448

算法支持实现

来源

WebSocket 协议

`deno_websocket` 扩展提供了基于事件的 `WebSocket` 和基于流的 `WebSocketStream` API。

WebSocket 实现

`WebSocket` 类在 ext/websocket/01_websocket.js126-700 中实现,包括以下关键 ops:

Op目的用途
op_ws_create建立连接从 WebSocket 构造函数调用
op_ws_send_text发送文本帧WebSocket.send()(字符串)
op_ws_send_binary_ab发送二进制帧WebSocket.send()(ArrayBuffer)
op_ws_next_event接收事件事件循环处理
op_ws_close关闭连接WebSocket.close()

WebSocket 事件循环

WebSocketStream API

`WebSocketStream` 类在 ext/websocket/02_websocketstream.js205-570 中实现,提供了基于流的接口。

来源

Web 流

ext/web/06_streams.js1-5321 中的实现提供了具有资源支持的 ReadableStreamWritableStreamTransformStream 类。

流资源集成

Streams 通过以下操作与 Deno 的资源系统集成

Op目的流类型
op_readable_stream_resource_allocate创建资源支持的流ReadableStream
op_readable_stream_resource_write_buf写入流资源内部信息
op_readable_stream_resource_close关闭流资源内部信息

流构造函数模式

流状态管理

Streams 使用内部符号进行状态管理,这些符号定义在 ext/web/06_streams.js342-393

  • _state: 当前流状态("readable", "closed", "errored")
  • _controller: 关联的控制器实例
  • _reader/_writer: 已锁定的读取器/写入器
  • _storedError: 错误状态存储
  • _disturbed: 指示流是否已被消耗

来源

WebSocket 协议

WebSocket 协议通过 HTTP 升级和专用 WebSocket 处理的组合来处理。

WebSocket 从 HTTP 升级

WebSocket 连接可以使用 ext/http/http_next.rs260-298 中的 op_http_upgrade_websocket_next 来完成。

服务器端 WebSocket 资源

ServerWebSocket 资源定义在 ext/websocket/lib.rs544-627,并管理 WebSocket 帧。

  • ws_read: AsyncRefCell<FragmentCollectorRead<ReadHalf<WebSocketStream>>>
  • ws_write: AsyncRefCell<WebSocketWrite<WriteHalf<WebSocketStream>>>
  • 帧缓冲和流控制
  • 二进制和文本消息处理

来源

事件系统和 AbortSignal

事件系统提供了 EventTarget 类和专门的事件类型,实现在 ext/web/02_event.js124-1600

事件实现细节

内部符号目的
事件_attributes, _canceledFlag, _stopPropagationFlag基础事件处理
EventTarget_listeners事件监听器管理
AbortController_signal取消控制
AbortSignal_aborted, _reason取消状态

事件分发算法

事件分发遵循 DOM 标准算法,位于 ext/web/02_event.js1434-1600

AbortSignal 集成

AbortSignal 通过 ext/web/03_abort_signal.js95-139 中的 add()remove() 函数提供取消功能。

  • Signals 维护一组相关的信号和中止算法
  • signal<FileRef file-url="https://github.com/denoland/deno/blob/1323aca1/add" undefined file-path="add">Hii</FileRef> 注册取消回调
  • signalAbort(signal, reason) 触发所有注册的算法

来源

Web Workers

Deno 支持 Web Workers 进行多线程 JavaScript 执行,其实现符合 Web Workers 规范

特性

  • 专用 Worker
  • 模块 Worker
  • 通过结构化克隆算法进行消息传递
  • 可转移对象
  • 错误处理
  • 终止

来源

其他 Web 标准

URL API

URL 实现使用 Rust op 进行解析,并在 ext/url/00_url.js820-1350 中有 JavaScript 包装器。

Op目的
op_url_parse解析 URL 字符串
op_url_parse_with_base使用基础 URL 进行解析
op_url_get_serialization序列化 URL 组件

File 和 Blob API

Blob 类实现在 ext/web/09_file.js90-600,具有以下特性

  • Blob 构造函数,支持 type 和 endings 选项
  • 用于创建子 blob 的 slice() 方法
  • stream()text()arrayBuffer() 方法
  • 用于 blob URL 的 URL.createObjectURL()URL.revokeObjectURL()

Headers API

Headers 类在 ext/fetch/20_headers.js200-800 中实现

  • 不区分大小写的标头名称处理
  • 标头值规范化
  • append()set()get()delete() 方法
  • entries()keys()values() 的迭代器支持

FormData API

FormData 类在 ext/fetch/21_formdata.js 支持

  • 支持 append()set() 用于键值对
  • 使用 File 对象进行文件上传
  • 迭代器接口
  • 与 fetch 请求体的集成

文本编码 API

文本编码由 TextEncoderTextDecoder 类处理

  • UTF-8 编码/解码
  • encode() 返回 Uint8Array
  • decode() 处理 BufferSource 输入
  • 流式解码器支持

来源

权限系统

Deno 实现了一个权限系统,用于控制对各种 Web API 的访问

来源

WebIDL 实现

Deno 使用 WebIDL 来定义其 Web API 实现的接口,确保与 Web 标准的兼容性。

来源

Web 标准兼容性

Deno 的 Web 标准实现目标是尽可能与浏览器实现兼容,同时适应服务器/CLI 环境。这些 API 紧密遵循相关规范,并在必要时为非浏览器环境进行调整。

Web 标准实现完整性备注
Fetch API对大多数功能提供全面支持,并针对 CLI 环境进行了调整
Web 加密全面的加密操作实现
WebSocket完整的客户端实现,以及服务器功能
Web 流流规范的完整实现
HTTP客户端和服务器实现均支持
URL已完成URL 标准的完整实现
计时器已完成标准计时器函数
事件DOM 兼容的事件系统
工作进程支持专用和模块工作线程
Blob/FileBlob 和基础 File API 支持
FormData标准 FormData 实现
文本编码标准编码/解码功能

来源

  • 本文档审核的所有文件