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失敗を示すように変化し、接続をリセット/放棄することができました。

2 つのブラウザー タブを使用して、このロジックをテストしました。まず、2 つのタブでチャネルを開くことができます (ネゴシエーションが成功し、チャネルが開き、データ転送がサポートされます)。次に、1 つのタブを閉じます。残りのピアのチャネルは期待どおりに閉じますが、私の楽観主義はcreateDataChannel成功し、新しいチャネルはopenイベントを発行します。ピアが接続されていなくても、チャネルを介して無期限に送信できます (データはどこにも行きません)。readyStateも残ってい"open"ます。これは、他のタブが閉じられた数分後に当てはまります!

なぜこのチャネルが正常に開かれたのか途方に暮れています。ピアが閉じられた後もそれiceConnectionStateが残っていることに気付きました。disconnectedこれは、failed将来の候補の到着を除外する方法がないため、状態に決して到達しない Chromium のバグに関連しているようです。ただし、iceConnectionStatedisconnected.

ピア接続が のときにデータ チャネルを作成できるのはなぜdisconnectedですか? .send()エラーが発生しないのはなぜですか? 接続が の場合、どうすればopenチャンネルを取得できdisconnectedますか? この状況を回避する最善の方法は何ですか?

ありがとうございました!

Chrome 89.0.4389.76 でテスト済み

4

0 に答える 0