クローズ イベントを発行する先行データ チャネルに応答して、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 のバグに関連しているようです。ただし、iceConnectionState
がdisconnected
.
ピア接続が のときにデータ チャネルを作成できるのはなぜdisconnected
ですか? .send()
エラーが発生しないのはなぜですか? 接続が の場合、どうすればopen
チャンネルを取得できdisconnected
ますか? この状況を回避する最善の方法は何ですか?
ありがとうございました!
Chrome 89.0.4389.76 でテスト済み