4.4.1.7 设置配置

要设置配置,请运行以下步骤:

  1. 让配置成为要处理的 RTCConfiguration 字典。

  2. 让connection 成为目标 RTCPeerConnection 对象。

  3. 如果设置了 configuration.peerIdentity 且其值与目标的 peer identity 不同,则抛出 InvalidModificationError。

  4. 如果设置了 configuration.certificates 且证书集与构造连接时使用的证书集不同,则抛出 InvalidModificationError。

  5. 如果设置了 configuration.bundlePolicy 的值且其值与连接的捆绑策略不同,则抛出 InvalidModificationError。

  6. 如果设置了 configuration.rtcpMuxPolicy 的值且其值与连接的 rtcpMux 策略不同,则抛出 InvalidModificationError。如果值为“negotiate”且用户代理未实现非复用的 RTCP,则抛出 NotSupportedError。

  7. 如果设置了 configuration.iceCandidatePoolSize 的值并且其值与连接的先前设置的 iceCandidatePoolSize 不同,并且已经调用了 setLocalDescription,则抛出 InvalidModificationError。

  8. 将 ICE 代理的 ICE 传输设置设置为 configuration.iceTransportPolicy 的值。如[JSEP](第4.1.16节)中所定义,如果新的 ICE 传输设置更改了现有设置,则在下一个收集阶段之前不会采取任何操作。如果脚本希望立即发生这种情况,则应该重新启动 ICE。

  9. 将[JSEP](第3.5.4节和第4.1.1节中)中定义的 ICE 代理的预取ICE候选池大小设置为 configuration.iceCandidatePoolSize 的值。如果新的 ICE 候选池大小改变了现有设置,则可能导致立即收集新候选池里的候选者,或丢弃现有的池里的候选者,如[JSEP](第4.1.16节)中所定义。

  10. 让 validatedServers 为空列表。

  11. 如果定义了 configuration.iceServers,则对每个元素运行以下步骤:

    1. 让 server 成为当前的列表元素。

    2. 让 urls 为 server.urls。

    3. 如果 url 是一个字符串,请将 url 设置为仅包含该字符串的列表。

    4. 如果 url 为空,则抛出一个 SyntaxError。

    5. 对于 urls 中的每个 url,请执行以下步骤:

      1. 使用[RFC3986]中定义的通用 URI 语法解析 URL 并获取方案名称。如果基于[RFC3986]中定义的语法的解析失败,则抛出一个 SyntaxError。如果浏览器未实现方案名称,则抛出 NotSupportedError。如果方案名称是 turn 或 turns,并且使用[RFC7064]中定义的语法解析 URL 失败,则抛出一个 SyntaxError。如果方案名称是 stun 或 stuns,并且使用[RFC7065]中定义的语法解析url失败,则抛出一个 SyntaxError。

      2. 如果方案名称是 turn 或 turns ,并且省略了 server.username 或 server.credential,则抛出 InvalidAccessError。

      3. 如果方案名称是turn或turn,并且 server.credentialType 是“password”,而 server.credential 不是 DOMString,则抛出 InvalidAccessError。

      4. 如果方案名称是 turn 或 turns ,server.credentialType 是 “oauth”,而 server.credential 不是 RTCOAuthCredential,则抛出 InvalidAccessError。

    6. 将 server 附加到validatedServers。

    让 validatedServers 成为 ICE 代理的 ICE服务器列表。

    如[JSEP](第4.1.16节)中所定义,如果新的服务器列表替换ICE代理的现有ICE服务器列表,则在下一个收集阶段之前不会采取任何操作。如果脚本希望立即发生这种情况,则应该重新启动ICE。但是,如果ICE候选池具有非零大小,则将丢弃任何现有池化候选者,并且将从新服务器收集新候选者。

  12. 将配置存储在[[Configuration]]值中。