RTCPeerConnection: setConfiguration() 方法

Baseline 已廣泛支援

此功能已經非常成熟,可在多種裝置和瀏覽器版本上使用。自 2022 年 4 月以來,它已在各大瀏覽器中得到支援。

RTCPeerConnection 介面的 setConfiguration() 方法根據指定物件中包含的值來設定連線的當前配置。這允許您更改連線使用的 ICE 伺服器以及使用的傳輸策略。

此方法最常見的用例(即使如此,也可能不是一個非常常見的用例)是替換要使用的 ICE 伺服器集。可能執行此操作的兩個潛在場景是:

  • RTCPeerConnection 在未指定任何 ICE 伺服器的情況下被例項化。例如,如果未使用任何引數呼叫 RTCPeerConnection() 建構函式,則必須在 ICE 協商開始之前呼叫 setConfiguration() 來新增 ICE 伺服器。
  • 需要重新協商連線,並且出於某種原因需要使用不同的 ICE 伺服器集。例如,使用者可能已移至新區域,因此需要使用新的區域 ICE 伺服器。在這種情況下,可以呼叫 setConfiguration() 來切換到新的區域 ICE 伺服器,然後啟動 ICE 重啟

注意: 一旦設定了連線的身份資訊,就無法更改它。

語法

js
setConfiguration(configuration)

引數

configuration

提供要設定的選項的物件。更改不是累加的;而是,新值會完全替換現有值。有關允許的選項的資訊,請參閱 RTCPeerConnection()

返回值

無(undefined)。

異常

InvalidAccessError DOMException

如果在 configuration.iceServers 中指定的 URL 中有一個或多個是 TURN 伺服器,但未提供完整的登入資訊(即,缺少 usernamecredential,或者如果 credentialType"password"credential 不是字串),則會丟擲此錯誤。這會阻止成功登入伺服器。

InvalidModificationError DOMException

如果 configuration 包含已更改的身份資訊,但連線已指定身份資訊,則會丟擲此錯誤。如果設定了 configuration.peerIdentityconfiguration.certificates 並且它們的值與當前配置不同,則會發生這種情況。如果更改了 configuration.bundlePolicyconfiguration.rtcpMuxPolicy,或者更改了 configuration.iceCandidatePoolSize(並且 RTCPeerConnection.setLocalDescription() 已被呼叫),也可能丟擲此錯誤。

InvalidStateError DOMException

如果 RTCPeerConnection 已關閉,則丟擲此異常。

SyntaxError DOMException

如果 configuration.iceServers 不包含任何 URL,或者列表中的某個值無效,則會丟擲此錯誤。

NotSupportedError DOMException

如果 configuration.iceServers 包含的 URL 的方案不受支援,則會丟擲此錯誤。

示例

在此示例中,已確定需要 ICE 重啟,並且需要使用不同的 ICE 伺服器進行協商。

js
const restartConfig = {
  iceServers: [
    {
      urls: "turn:asia.turn-server.net",
      username: "allie@oopcode.com",
      credential: "topsecretpassword",
    },
  ],
};

myPeerConnection.setConfiguration(restartConfig);

myPeerConnection.restartIce();

myPeerConnection
  .createOffer() // restartIce() causes iceRestart to be set true
  .then((offer) => myPeerConnection.setLocalDescription(offer))
  .then(() => {
    // send the offer to the other peer using the signaling server
  })
  .catch(window.reportError);

首先,建立一個新物件 restartConfig,指定新的 ICE 伺服器及其憑據。然後將其傳遞給 setConfiguration()。透過呼叫 restartIce() 來重啟 ICE 協商,這會導致建立的下一個 offer 包含新的 ICE 伺服器資訊。從那裡,我們按常規處理流程,將本地描述設定為返回的 offer,然後將該 offer 傳送給另一方。

規範

規範
WebRTC:瀏覽器中的即時通訊
# dom-rtcpeerconnection-setconfiguration

瀏覽器相容性

另見