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 实现使用 `deno_fetch` 扩展来处理 HTTP 客户端操作,并使用 `deno_http` 扩展来处理服务器功能。
全局 `fetch()` 在 ext/fetch/26_fetch.js121-306 中实现,由 `op_fetch` 处理底层的 HTTP 客户端工作。
| Op | 目的 | 位置 |
|---|---|---|
op_fetch | 创建 HTTP 请求 | ext/fetch/lib.rs508-587 |
op_fetch_send | 执行请求 | ext/fetch/lib.rs509 |
op_fetch_custom_client | 创建自定义客户端 | ext/fetch/lib.rs150 |
来源
`deno_crypto` 扩展通过 ext/crypto/00_crypto.js509-1610 中的 `SubtleCrypto` 接口实现了 Web Crypto API。
| 操作 | Op 函数 | 算法 |
|---|---|---|
digest() | op_crypto_subtle_digest | SHA-1, SHA-256, SHA-384, SHA-512 |
generateKey() | op_crypto_generate_key | RSA, ECDSA, ECDH, AES, HMAC, Ed25519, X25519, X448 |
sign() | op_crypto_sign_key, op_crypto_sign_ed25519 | RSA-PSS, ECDSA, HMAC, Ed25519 |
verify() | op_crypto_verify_key, op_crypto_verify_ed25519 | RSA-PSS, ECDSA, HMAC, Ed25519 |
encrypt()/decrypt() | op_crypto_encrypt, op_crypto_decrypt | RSA-OAEP, AES-CBC, AES-CTR, AES-GCM |
deriveBits() | op_crypto_derive_bits | HKDF, PBKDF2, ECDH, X25519, X448 |
来源
`deno_websocket` 扩展提供了基于事件的 `WebSocket` 和基于流的 `WebSocketStream` API。
`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() |
`WebSocketStream` 类在 ext/websocket/02_websocketstream.js205-570 中实现,提供了基于流的接口。
来源
在 ext/web/06_streams.js1-5321 中的实现提供了具有资源支持的 ReadableStream、WritableStream 和 TransformStream 类。
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 协议通过 HTTP 升级和专用 WebSocket 处理的组合来处理。
WebSocket 连接可以使用 ext/http/http_next.rs260-298 中的 op_http_upgrade_websocket_next 来完成。
ServerWebSocket 资源定义在 ext/websocket/lib.rs544-627,并管理 WebSocket 帧。
ws_read: AsyncRefCell<FragmentCollectorRead<ReadHalf<WebSocketStream>>>ws_write: AsyncRefCell<WebSocketWrite<WriteHalf<WebSocketStream>>>来源
事件系统提供了 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 通过 ext/web/03_abort_signal.js95-139 中的 add() 和 remove() 函数提供取消功能。
signal<FileRef file-url="https://github.com/denoland/deno/blob/1323aca1/add" undefined file-path="add">Hii</FileRef> 注册取消回调signalAbort(signal, reason) 触发所有注册的算法来源
Deno 支持 Web Workers 进行多线程 JavaScript 执行,其实现符合 Web Workers 规范。
来源
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 组件 |
Blob 类实现在 ext/web/09_file.js90-600,具有以下特性
Blob 构造函数,支持 type 和 endings 选项slice() 方法stream()、text()、arrayBuffer() 方法URL.createObjectURL() 和 URL.revokeObjectURL()Headers 类在 ext/fetch/20_headers.js200-800 中实现
append()、set()、get()、delete() 方法entries()、keys()、values() 的迭代器支持FormData 类在 ext/fetch/21_formdata.js 支持
append() 和 set() 用于键值对File 对象进行文件上传文本编码由 TextEncoder 和 TextDecoder 类处理
encode() 返回 Uint8Arraydecode() 处理 BufferSource 输入来源
Deno 实现了一个权限系统,用于控制对各种 Web API 的访问
来源
Deno 使用 WebIDL 来定义其 Web API 实现的接口,确保与 Web 标准的兼容性。
来源
Deno 的 Web 标准实现目标是尽可能与浏览器实现兼容,同时适应服务器/CLI 环境。这些 API 紧密遵循相关规范,并在必要时为非浏览器环境进行调整。
| Web 标准 | 实现完整性 | 备注 |
|---|---|---|
| Fetch API | 高 | 对大多数功能提供全面支持,并针对 CLI 环境进行了调整 |
| Web 加密 | 高 | 全面的加密操作实现 |
| WebSocket | 高 | 完整的客户端实现,以及服务器功能 |
| Web 流 | 高 | 流规范的完整实现 |
| HTTP | 高 | 客户端和服务器实现均支持 |
| URL | 已完成 | URL 标准的完整实现 |
| 计时器 | 已完成 | 标准计时器函数 |
| 事件 | 高 | DOM 兼容的事件系统 |
| 工作进程 | 高 | 支持专用和模块工作线程 |
| Blob/File | 高 | Blob 和基础 File API 支持 |
| FormData | 高 | 标准 FormData 实现 |
| 文本编码 | 高 | 标准编码/解码功能 |
来源