WebRTC 诊断日志 API

社区组报告草案,

此版本:
https://wicg.github.io/webrtc-diagnostic-logging/
问题跟踪:
GitHub
编辑:
Guido Urdaneta(Google)

摘要

本规范定义了一个用于管理 WebRTC 内部诊断日志的 API。

本文档的状态

本规范由 Web 平台孵化 社区组发布。 它既不是 W3C 标准,也不处于 W3C 标准轨道上。 请注意,根据 W3C 社区贡献者许可协议 (CLA), 存在有限的退出机制,并且还适用其他条件。 进一步了解 W3C 社区组和业务组。

1. 简介

WebRTC 诊断日志 API 为 Web 应用程序提供了一个编程接口,用于开始、完成和丢弃用户代理执行的 WebRTC 相关操作的内部诊断 日志收集。 这些诊断日志绝不会暴露给应用程序。相反,它们会 存储在由用户控制的位置,并且可以与 用户代理供应商共享。 诊断日志的收集和存储需要用户明确 授权,并且应用程序永远不会知道诊断日志记录 操作是成功还是失败。诊断日志的内容也是 实现细节。 此 API 旨在支持的用例如下:

2. 安全与隐私

这些诊断日志收集有关用户代理为实现 WebRTC 相关功能而执行的 内部操作的信息。这些诊断日志 可能包含未暴露给 Web 应用程序的信息,因此, API 不能以任何方式将这些日志暴露给 Web 应用程序。这些日志可以 在获得用户授权的情况下(例如通过带外上传) 与用户代理供应商共享,以便用于协助修复 用户代理错误或对用户代理进行其他改进。

诊断日志的收集、存储和上传需要用户明确 授权。此授权的具体机制 由实现定义。实现授权的一些选项 包括但 不限于专用 UI、配置文件、企业策略、 提示,或这些方式的组合。授权可以仅限于特定 源。这些授权的状态绝不会暴露给应用程序。 因此,这些 API 不对成功作出任何保证。

3. 对 RTCPeerConnection 接口的扩展

此 API 作为 RTCPeerConnection 接口上的一组静态方法公开。

[
  Exposed=Window
] partial interface RTCPeerConnection {
  static DOMString startDiagnosticLogging(optional RTCDiagnosticLoggingOptions options = {});
  static undefined stopDiagnosticLogging();
  static undefined cancelDiagnosticLogging();
};

3.1. 字典

RTCDiagnosticLoggingOptions 为日志记录 会话提供配置。

dictionary RTCDiagnosticLoggingOptions {
  record<DOMString, DOMString> metadata;
};

3.2. 内部槽

令相关全局对象具有一个 [[RTCDiagnosticLoggingSessionId]] 内部槽,并初始化为 null。

3.3. 方法

3.3.1. startDiagnosticLogging(options)

startDiagnosticLogging(options) 方法 尝试启动一个诊断日志记录会话。

调用此方法时,用户代理必须运行以下步骤:

  1. 令 options 为此方法的第一个参数。

  2. 令 metadata 为 options 的 metadata 成员。

  3. 如果 metadata 的 大小 大于 5,或者如果任意 条目 key → value 在 metadata 中的 长度 大于 100, 则返回一个 拒绝 原因为 TypeError 的期约。

  4. 如果 [[RTCDiagnosticLoggingSessionId]] 内部 槽不为 null,则 抛出 一个 "InvalidStateError" DOMException。

  5. 令 sesssionId 为随机生成的 UUID [rfc4122]。为避免 指纹识别,实现应该在生成 UUID 时使用 RFC 4122 第 4.4 节中的形式。

  6. 将 [[RTCDiagnosticLoggingSessionId]] 设置为 sessionId。

  7. 并行地,启动一个记录内部 WebRTC 活动的日志记录会话, 使用 metadata 作为上下文。使用 sessionId 标识该日志记录会话。

  8. 返回 sessionId。

一旦日志记录会话启动,用户代理 可以记录任何与 WebRTC 相关的 活动。该日志记录会话由 sessionId 标识,该标识符可用于 引用日志(例如,在缺陷报告中)。

3.3.2. stopDiagnosticLogging()

stopDiagnosticLogging() 方法结束 一个正在进行的诊断日志记录会话。

调用此方法时,用户代理 必须运行以下步骤:

  1. 如果 [[RTCDiagnosticLoggingSessionId]] 内部 槽为 null,则 抛出 一个 "InvalidStateError" DOMException。

  2. 令 sessionId 为 [[RTCDiagnosticLoggingSessionId]]。

  3. 将 [[RTCDiagnosticLoggingSessionId]] 设置为 null。

  4. 并行地,停止由以下值标识的日志记录会话: [[RTCDiagnosticLoggingSessionId]]。

一旦日志记录会话停止,用户代理不得记录任何与 WebRTC 相关的 活动。

3.3.3. discardDiagnosticLogging()

discardDiagnosticLogging() 方法取消一个 正在进行的诊断日志记录会话,并删除与该会话关联的 所有已记录数据。

调用此方法时,用户代理 必须运行以下步骤:

  1. 如果 [[RTCDiagnosticLoggingSessionId]] 内部 槽为 null,则 抛出 一个 "InvalidStateError" DOMException。

  2. 令 sessionId 为 [[RTCDiagnosticLoggingSessionId]]。

  3. 将 [[RTCDiagnosticLoggingSessionId]] 设置为 null。

  4. 并行地,取消由以下值标识的日志记录会话: [[RTCDiagnosticLoggingSessionId]]。

一旦日志记录会话被取消,用户代理 不得 记录任何与 WebRTC 相关的活动,并且 用户代理 必须已经 删除与被取消的日志记录会话关联的 所有已记录数据。

一致性

文档 约定

一致性要求通过描述性断言 与 RFC 2119 术语的组合来表达。 关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、 “MAY”和“OPTIONAL” 在本文档的规范性部分中 应按照 RFC 2119 中的描述进行解释。 但是,为了便于阅读, 这些词在本规范中并非全部以大写字母形式出现。

本规范的所有文本均为规范性内容, 明确标记为非规范性的章节、示例和注释除外。 [RFC2119]

本规范中的示例以“例如”等词语引出, 或使用 class="example" 与规范性文本区分开来, 如下所示:

这是一个信息性示例。

信息性注释以“注:”一词开头, 并使用 class="note" 与规范性文本区分开来, 如下所示:

注:这是一条信息性注释。

索引

本规范定义的 术语

通过引用定义的 术语

参考文献

规范性参考文献

[HTML]
Anne van Kesteren; et al. HTML 标准. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. 现行标准. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC 中用于 表示要求级别的关键词. 1997 年 3 月. 当前最佳实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准. 现行 标准. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
Cullen Jennings; et al. WebRTC:浏览器中的实时通信 . URL: https://w3c.github.io/webrtc-pc/

非规范性参考文献

[RFC4122]
K. Davis; B. Peabody; P. Leach. 通用唯一 标识符(UUID). 2024 年 5 月. 提议标准. URL: https://www.rfc-editor.org/info/rfc9562/

IDL 索引

[
  Exposed=Window
] partial interface RTCPeerConnection {
  static DOMString startDiagnosticLogging(optional RTCDiagnosticLoggingOptions options = {});
  static undefined stopDiagnosticLogging();
  static undefined cancelDiagnosticLogging();
};

dictionary RTCDiagnosticLoggingOptions {
  record<DOMString, DOMString> metadata;
};