0

我正在尝试重新打开 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由于无法排除未来候选人的到来,因此从未达到该状态。但是,我仍然希望通道在iceConnectionStateis时关闭/出错disconnected

为什么我能够在对等连接时创建数据通道disconnected?为什么不.send()引发错误?连接时如何拥有open频道disconnected?避免这种情况的最佳方法是什么?

谢谢!

在 Chrome 89.0.4389.76 上测试

4

0 回答 0