WebAssembly Web API

编辑草案

有关此文档的更多详细信息
此版本
https://github.webassembly.net.cn/spec/web-api/
最新发布版本
https://www.w3.org/TR/wasm-web-api-2/
实施报告
https://webassembly.net.cn/features/
反馈
GitHub
编辑
Ms2ger (Igalia)
问题跟踪
GitHub 问题

摘要

本文档介绍了 WebAssembly 与更广泛的 Web 平台的集成。

这是相关文档集合的一部分:WebAssembly 核心规范WebAssembly JS 接口,以及 WebAssembly Web API.

本文档的状态

这是一个公开的编辑草案副本。它仅供讨论,可能随时更改。它在此发布并不意味着 W3C 认可其内容。请勿引用本文档,除非它作为正在进行中的工作。

GitHub 问题 是讨论此规范的首选方式。所有问题和评论都已 存档.

本文档由 WebAssembly 工作组 制作。

本文档由在 W3C 专利政策 下运作的小组制作。W3C 维护着与该小组交付成果相关的任何专利公开的 公开列表;该页面还包含有关公开专利的说明。任何了解专利的人,如果认为该专利包含 基本权利要求,必须根据 W3C 专利政策第 6 节 公开信息。

本文档受 2023 年 11 月 3 日 W3C 流程文档 约束。

本文档建立在 WebAssembly 规范 [WEBASSEMBLY] 和 WebAssembly JavaScript 嵌入 [WASMJS] 之上。

1. 流模块编译和实例化

[Exposed=(Window,Worker)]
partial namespace WebAssembly {
  Promise<Module> compileStreaming(Promise<Response> source);
  Promise<WebAssemblyInstantiatedSource> instantiateStreaming(
      Promise<Response> source, optional object importObject);
};
compileStreaming(source) 方法在被调用时,返回使用 source 编译潜在的 WebAssembly 响应 的结果。
instantiateStreaming(source, importObject) 方法在被调用时,执行以下步骤
  1. promiseOfModule 为使用 source 编译潜在的 WebAssembly 响应 的结果。

  2. 返回使用导入 importObject 实例化模块的承诺 promiseOfModule 的结果。

使用 Response 的承诺 source 编译潜在的 WebAssembly 响应,执行以下步骤

注意: 此算法接受 Response 对象或其承诺,并编译和实例化响应的字节。此编译可以在后台以流方式执行。如果 Response 不是 CORS 同源,不代表 ok 状态,或与 `application/wasm` MIME 类型不匹配,则返回的承诺将被拒绝,并返回 TypeError;如果编译或实例化失败,则返回的承诺将被拒绝,并返回 CompileError 或其他相关错误类型,具体取决于失败的原因。

  1. returnValue一个新的承诺

  2. source 完成时,其值为 unwrappedSource

    1. responseunwrappedSource响应

    2. mimeType 为从 response报头列表 获取 `Content-Type` 的结果。

    3. 如果 mimeType 为 null,则用 TypeError 拒绝 returnValue,并中止这些子步骤。

    4. mimeType 的开头和结尾移除所有 HTTP 制表符或空格字节

    5. 如果 mimeType`application/wasm`字节不区分大小写 匹配,则用 TypeError 拒绝 returnValue,并中止这些子步骤。

      注意: 不允许额外的参数,包括空 `application/wasm;`

    6. 如果 response 不是 CORS 同源,则 拒绝 returnValue,并用 TypeError 中止这些子步骤。

    7. 如果 response状态 不是 ok 状态,则 拒绝 returnValue,并用 TypeError 中止这些子步骤。

    8. response 的主体作为 ArrayBuffer 消耗,并令 bodyPromise 为结果。

      注意: 虽然这里指定在编译继续之前完全消耗响应,但这纯粹是为了方便说明;实现可能会以流方式执行处理。区别是不可观察的,因此指定了更简单的模型。

    9. bodyPromise 完成时,其值为 bodyArrayBuffer

      1. stableBytes缓冲区 bodyArrayBuffer 中持有的字节的 副本

      2. 使用 网络任务源 异步编译 WebAssembly 模块 stableBytes,并用结果 解析 returnValue

    10. bodyPromise 被拒绝时,其原因是 reason

      1. reason 拒绝 returnValue

  3. source 被拒绝时,其原因是 reason

    1. reason 拒绝 returnValue

  4. 返回 returnValue

2. 序列化

Web 用户代理必须使用 [Serializable] 扩展属性来增强 Module 接口。

给定 valueserializedforStorage序列化步骤

  1. 如果 forStorage 为 true,则抛出 "DataCloneError" DOMException

  2. serialized.[[Bytes]] 设置为 value.[[Bytes]] 的 子序列化

  3. serialized.[[AgentCluster]] 设置为 当前 Realm 对应的 代理集群

给定 serializedvaluetargetRealm反序列化步骤

  1. bytesserialized.[[Bytes]] 的 子反序列化

  2. value.[[Bytes]] 设置为 bytes

  3. 如果 targetRealm 对应的 代理集群 不是 serialized.[[AgentCluster]],则抛出 "DataCloneError" DOMException

  4. bytes 编译 WebAssembly 模块,并将 value.[[Module]] 设置为结果。

引擎应尝试在执行结构化序列化时共享/重用内部编译的代码,尽管在 CPU 升级或浏览器更新等极端情况下,这可能无法实现,可能需要完全重新编译。

注意: 结构化序列化语义等同于将编译 模块 的二进制源代码序列化,然后反序列化,并重新编译到目标领域。鉴于上述引擎优化,结构化序列化为开发人员提供了对编译代码缓存和跨窗口/工作线程代码共享的显式控制。

3. 面向开发人员的显示约定

本节是非规范性的。

浏览器、JavaScript 引擎和离线工具通常使用相同的方式来引用 JavaScript 工件和语言结构。例如,JavaScript 源代码中的位置在堆栈跟踪或错误消息中打印,并自然地表示为文本文件中的十进制格式行和列。函数和变量的名称直接取自源代码。因此(例如),即使实现相关的堆栈跟踪字符串的确切格式并不总是匹配,但位置很容易理解,并且在不同浏览器中保持一致。

为了实现对 WebAssembly 结构的通用表示的目标,采用了以下约定。

WebAssembly 位置是对二进制文件中特定指令的引用,浏览器或引擎可能在类似于 JavaScript 源代码位置的上下文中显示它。它的格式如下

${url}:wasm-function[${funcIndex}]:${pcOffset}

其中

注释

虽然 导出函数 实例的 “name” 属性由 JS API 指定,但在其他上下文中(例如调试器中的调用堆栈和堆栈跟踪的字符串表示)也会显示合成函数名称。如果 WebAssembly 模块包含 名称节,则应使用这些名称来合成函数名称,如下所示

请注意,本文件并未指定字符串(例如堆栈帧表示)的完整格式;这允许引擎继续使用其现有的 JavaScript 格式(现有的代码可能已经依赖于它),同时仍然以与 JavaScript 一致的格式打印 WebAssembly 帧。

4. 媒体类型注册

本节将提交给互联网工程指导组 (IESG) 以供审查、批准和向 IANA 注册。

application/wasm

类型名称
application
子类型名称
wasm
必需参数
可选参数
编码注意事项
binary
安全注意事项

WebAssembly 是一种标准、安全、可移植的低级代码格式。与执行 WebAssembly 代码相关的安全注意事项在 https://www.w3.org/TR/wasm-core/#security-considerations 中描述。

WebAssembly 格式不包括完整性或隐私保护。如果需要此类保护,则必须通过外部方式提供,例如使用 HTTPS。

互操作性注意事项
参见 WebAssembly 核心一致性
https://www.w3.org/TR/wasm-core/#conformance
已发布的规范
https://www.w3.org/TR/wasm-core-1/ https://www.w3.org/TR/wasm-js-api-1/ https://www.w3.org/TR/wasm-web-api-1/
应用程序使用
application/wasm 媒体类型旨在用作描述 WebAssembly 文件的类型,当通过 HTTP 发送到浏览器以供执行时,这是一种常见的情况。此外,该类型由几个 WebAssembly 运行时使用,这些运行时利用安全性并可移植性,同时针对高效执行和紧凑表示。
片段标识符注意事项
使用限制
临时注册
N/A
其他信息
此类型的弃用别名
幻数
0x00 0x61 0x73 0x6D
文件扩展名
.wasm
Macintosh 文件类型代码
对象标识符或 OID
预期用途
Common
其他信息和注释
Common
联系人
联系人姓名
Eric Prud'hommeaux
联系电子邮件地址
[email protected]
作者/变更控制者
W3C

一致性

文档约定

一致性要求用描述性断言和 RFC 2119 术语的组合来表达。本文件规范性部分中的关键词 “必须”、“禁止”、“必需”、“应”、“不应”、“建议”、“不建议”、“推荐”、“可能” 和 “可选” 应按 RFC 2119 中的描述进行解释。然而,为了易读性,这些词在本规范中不会全部大写。

本规范的所有文本都是规范性的,除了明确标记为非规范性的部分、示例和注释。 [RFC2119]

本规范中的示例以 “例如” 开头,或用 class="example" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以 “注意” 开头,并用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

一致性算法

作为算法一部分的以祈使句形式表达的要求(例如 “删除任何前导空格字符” 或 “返回 false 并中止这些步骤”)应按照引入算法时使用的关键词(“必须”、“应”、“可能” 等)的含义进行解释。

以算法或特定步骤形式表达的一致性要求可以使用任何方式实现,只要最终结果等效即可。特别是,本规范中定义的算法旨在易于理解,并不打算具有高性能。鼓励实现者进行优化。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考文献

[ECMA-262]
ECMAScript® 语言规范. 当前编辑草案。URL: https://tc39.github.io/ecma262
[FETCH]
Anne van Kesteren. 获取标准. 活跃标准。URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; 等人. HTML 标准. 活跃标准。URL: https://html.whatwg.com.cn/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. 基础设施标准. 活跃标准。URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. 在 RFC 中使用指示要求级别的关键词. 1997 年 3 月。最佳实践。URL: https://datatracker.ietf.org/doc/html/rfc2119
[WASMJS]
WebAssembly JS 集成规范. 草案。URL: https://github.webassembly.net.cn/spec/js-api/
[WEBASSEMBLY]
WebAssembly 核心规范. 草案。URL: https://github.webassembly.net.cn/spec/core/
[WEBIDL]
陈伊格;顾添. Web IDL 标准. 活跃标准. 网址: https://webidl.spec.whatwg.org/

IDL 索引

[Exposed=(Window,Worker)]
partial namespace WebAssembly {
  Promise<Module> compileStreaming(Promise<Response> source);
  Promise<WebAssemblyInstantiatedSource> instantiateStreaming(
      Promise<Response> source, optional object importObject);
};