我正在尝试重新打开 RTCDataChannel 以响应前任数据通道发出的关闭事件。
handleChannelClosed() {
try {
// Create a replacement channel and hope for it to open
this._channel = this._pc.createDataChannel("channel"));
// Note that channel is negotiated in-band using an API assigned ID
// I also haven't observed this event handler being called over and over due to cascading closes
} catch {
// Whoops!
}
}
我了解在许多情况下可能无法打开新频道。我预计 createDataChannel
在这种情况下会失败;或者,iceConnectionState
会改变以指示失败,我可以重置/放弃连接。
我已经使用两个浏览器标签测试了这个逻辑。首先,我让两个tab打开一个通道(协商成功,通道打开,支持数据传输)。然后我关闭一个选项卡。尽管其余对等方的通道按预期关闭,但我的乐观 createDataChannel
成功并且新通道发出 open
事件。即使对等方未连接(数据无处可去),我也可以无限期地通过通道发送。 readyState
也仍然是 "open"
;这是另一个选项卡关闭后几分钟的真实情况!
我不知道为什么这个频道能成功打开。我注意到即使在对等点关闭后 iceConnectionState
仍然是 disconnected
;这似乎与 Chromium 错误有关,该错误从未达到 failed
状态,因为无法排除未来的候选人到达。但是,当 iceConnectionState
为 disconnected
时,我仍然希望通道关闭/出错。
为什么我可以在对等连接为 disconnected
时创建数据通道?为什么 .send()
不会引发错误?当连接为 open
时,我如何拥有 disconnected
通道?避免这种情况的最佳方法是什么?
谢谢!
在 Chrome 89.0.4389.76 上测试