我什么时候可以考虑断开 RTCPeerConnection?

dbo*_*tha 2 javascript webrtc rtcpeerconnection

我试图检测 RTCPeerConnection 的另一端何时断开连接。目前我正在使用我的 RTCPeerConnection 对象执行以下操作:

rtcPeerConnection.oniceconnectionstatechange = () => {
        const state = rtcPeerConnection.iceConnectionState;

        if (state === "failed" || state === "closed") {
            // connection to the peer is lost and unsalvageable, run cleanup code
        } else if (state === "disconnected") {
            // do nothing in the "disconnected" state as it appears to be a transient 
            // state that can easily return to "connected" - I've seen this with Firefox
        }
    };
Run Code Online (Sandbox Code Playgroud)

这似乎适用于我在非常简单的网络条件下进行的有限测试,但来自MDN的以下内容让我暂停,它可能不会在生产中保持不变:

当然,“断开”和“关闭”并不一定表示错误;这些可能是正常 ICE 协商的结果,所以一定要正确处理这些(如果有的话)。

RTCPeerConnection.onconnectionstatechange如果RTCPeerConnection.connectionState"closed""failed"或者,我应该使用并考虑永久关闭连接"disconnected"吗?

Phi*_*cke 5

该规范针对该主题提供了非常精心制作的建议:

iceConnectionState转换为时,建议执行 ICE 重新启动"failed"。应用程序还可以选择侦听iceConnectionState转换"disconnected",然后使用其他信息源(例如getStats用于测量在接下来的几秒钟内发送或接收的字节数是否增加)来确定是否建议重新启动 ICE。

请参阅添加此内容的规范PR

请注意,由于错误,Chrome 在统一计划中不再“失败”。“关闭”只有在您的代码调用 pc.close() 时才会发生,因此从 Chrome 80 开始不再在 iceconnectionstatechange 中触发。