Root cause: recovery is implemented twice, at two layers, and neither re-runs signalling
Connection recovery exists in both WebRTCService.attemptRecovery (src/WebRTCService.ts:159) and FileTransferManager.attemptRecovery (src/FileTransferManager.ts:621). Neither knows about the other, and neither re-runs the offer/answer through the GMCP signalling channel, so a "recovered" peer connection has no remote description and can never reach connected.
Instances already filed
Suggested direction
One recovery owner — the layer that holds the signalling channel (FileTransferManager) — drives re-negotiation; WebRTCService only reports transport state. Guard against concurrent recovery attempts.
Root cause: recovery is implemented twice, at two layers, and neither re-runs signalling
Connection recovery exists in both
WebRTCService.attemptRecovery(src/WebRTCService.ts:159) andFileTransferManager.attemptRecovery(src/FileTransferManager.ts:621). Neither knows about the other, and neither re-runs the offer/answer through the GMCP signalling channel, so a "recovered" peer connection has no remote description and can never reachconnected.Instances already filed
createPeerConnectionleaks the previous connection on the recovery pathSuggested direction
One recovery owner — the layer that holds the signalling channel (
FileTransferManager) — drives re-negotiation;WebRTCServiceonly reports transport state. Guard against concurrent recovery attempts.