Merge pull request #2111 from vitorpamplona/claude/debug-webrtc-calls-ZPFIV

Improve peer disconnection handling in calls
This commit is contained in:
Vitor Pamplona
2026-04-03 15:46:31 -04:00
committed by GitHub
2 changed files with 11 additions and 3 deletions
@@ -729,12 +729,17 @@ class CallController(
private fun onPeerDisconnected(peerPubKey: HexKey) {
Log.d(TAG) { "Peer ${peerPubKey.take(8)} disconnected (ICE FAILED)" }
// If all peers disconnected, hang up
val sessionStates = peerSessions.map { (key, ps) -> "${key.take(8)}=${ps.session.getSignalingState()}" }
// If all peers disconnected, hang up.
// A session counts as "not active" if it is the one that just failed,
// if it was already closed, or if it never received a remote description
// (e.g. the peer rejected before answering).
val sessionStates = peerSessions.map { (key, ps) -> "${key.take(8)}=${ps.session.getSignalingState()},remoteSet=${ps.remoteDescriptionSet.get()}" }
Log.d(TAG) { "onPeerDisconnected: checking remaining sessions: $sessionStates" }
val allDisconnected =
peerSessions.keys.all { key ->
key == peerPubKey || peerSessions[key]?.session?.getSignalingState() == PeerConnection.SignalingState.CLOSED
key == peerPubKey ||
peerSessions[key]?.session?.getSignalingState() == PeerConnection.SignalingState.CLOSED ||
peerSessions[key]?.remoteDescriptionSet?.get() != true
}
if (allDisconnected) {
Log.d(TAG) { "onPeerDisconnected: all peers disconnected, hanging up" }
@@ -349,6 +349,7 @@ class CallManager(
transitionToEnded(current.callId, current.peerPubKeys, EndReason.PEER_REJECTED)
} else {
_state.value = current.copy(peerPubKeys = remaining)
onPeerLeft?.invoke(rejectingPeer)
}
}
@@ -356,12 +357,14 @@ class CallManager(
if (callId != current.callId) return
_state.value =
current.copy(pendingPeerPubKeys = current.pendingPeerPubKeys - rejectingPeer)
onPeerLeft?.invoke(rejectingPeer)
}
is CallState.Connected -> {
if (callId != current.callId) return
_state.value =
current.copy(pendingPeerPubKeys = current.pendingPeerPubKeys - rejectingPeer)
onPeerLeft?.invoke(rejectingPeer)
}
is CallState.IncomingCall -> {