我正在尝试重新打开 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
会更改以指示失败,我可以重置/放弃连接。
我已经使用两个浏览器选项卡测试了这个逻辑。首先,我允许两个选项卡打开一个通道(协商成功,通道打开并支持数据传输)。然后我关闭一个标签。尽管其余对等点的通道按预期关闭,但我的乐观createDataChannel
成功并且新通道发出了一个open
事件。即使对等方未连接(数据无处可去),我也可以无限期地通过通道发送。readyState
也仍然存在"open"
;这是关闭另一个选项卡后几分钟的真实情况!
我不知道为什么这个频道能成功打开。我注意到即使在对等点关闭后iceConnectionState
仍然存在;disconnected
这似乎与 Chromium 错误有关,failed
由于无法排除未来候选人的到来,因此从未达到该状态。但是,我仍然希望通道在iceConnectionState
is时关闭/出错disconnected
。
为什么我能够在对等连接时创建数据通道disconnected
?为什么不.send()
引发错误?连接时如何拥有open
频道disconnected
?避免这种情况的最佳方法是什么?
谢谢!
在 Chrome 89.0.4389.76 上测试