diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index 166e98da4..51ff18276 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -449,9 +449,8 @@ private class SignalCallData: NSObject { self.handleFailedCall(failedCall: call, error: .obsoleteCall(description:"obsolete call in \(#function)")) return } - guard callData.call == call else { - self.handleFailedCall(failedCall: call, error: .obsoleteCall(description:"obsolete call in \(#function)")) + Logger.warn("\(self.logTag) ignoring \(#function) for call other than current call") return } @@ -746,6 +745,7 @@ private class SignalCallData: NSObject { * Remote client (could be caller or callee) sent us a connectivity update */ public func handleRemoteAddedIceCandidate(thread: TSContactThread, callId: UInt64, sdp: String, lineIndex: Int32, mid: String) { + SwiftAssertIsOnMainThread(#function) Logger.verbose("\(logTag) \(#function) callId: \(callId)") guard let callData = self.callData else { @@ -1001,7 +1001,7 @@ private class SignalCallData: NSObject { Logger.info("\(self.logTag) in \(#function)") SwiftAssertIsOnMainThread(#function) - guard let peerConnectionClient = self.peerConnectionClient else { + guard let peerConnectionClient = callData.peerConnectionClient else { OWSProdError(OWSAnalyticsEvents.callServicePeerConnectionMissing(), file: #file, function: #function, line: #line) handleFailedCall(failedCall: call, error: CallError.assertionError(description: "\(self.logTag) peerConnectionClient unexpectedly nil in \(#function)")) return diff --git a/Signal/src/call/PeerConnectionClient.swift b/Signal/src/call/PeerConnectionClient.swift index 54ab4ebcf..f8880821c 100644 --- a/Signal/src/call/PeerConnectionClient.swift +++ b/Signal/src/call/PeerConnectionClient.swift @@ -412,7 +412,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD } peerConnection.offer(for: strongSelf.defaultOfferConstraints, completionHandler: { (sdp: RTCSessionDescription?, error: Error?) in - PeerConnectionClient.signalingQueue.async { + PeerConnectionClient.signalingQueue.async { [weak self] in completion(sdp, error) } }) @@ -549,7 +549,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD Logger.debug("\(strongSelf.logTag) negotiating answer session.") peerConnection.answer(for: constraints, completionHandler: { (sdp: RTCSessionDescription?, error: Error?) in - PeerConnectionClient.signalingQueue.async { + PeerConnectionClient.signalingQueue.async { [weak self] in completion(sdp, error) } }) @@ -608,6 +608,10 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD localVideoTrack?.isEnabled = false remoteVideoTrack?.isEnabled = false + if let dataChannel = self.dataChannel { + dataChannel.delegate = nil + } + dataChannel = nil audioSender = nil audioTrack = nil @@ -701,7 +705,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD return } - DispatchQueue.main.async { + DispatchQueue.main.async { [weak self] in completion(dataChannelMessage) } } @@ -751,7 +755,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD strongSelf.remoteVideoTrack = remoteVideoTrack - DispatchQueue.main.async { + DispatchQueue.main.async { [weak self] in completion(remoteVideoTrack) } } @@ -842,7 +846,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD return } Logger.info("\(strongSelf.logTag) adding local ICE candidate:\(candidate.sdp)") - DispatchQueue.main.async { + DispatchQueue.main.async { [weak self] in completion(candidate) } } @@ -883,7 +887,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD let pendingMessages = strongSelf.pendingDataChannelMessages strongSelf.pendingDataChannelMessages = [] - DispatchQueue.main.async { + DispatchQueue.main.async { [weak self] in completion(pendingMessages) } }