RTCDataChannel 成功打开——但实际上并未打开

时间:2021-04-15 00:53:13

标签: javascript webrtc rtcpeerconnection rtcdatachannel

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

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

谢谢!

在 Chrome 89.0.4389.76 上测试

0 个答案:

没有答案