Call lifecycle edge cases.
This commit is contained in:
parent
3967a5ab05
commit
f68f3cc53d
@ -141,6 +141,14 @@ private class SignalCallData: NSObject {
|
||||
}
|
||||
}
|
||||
|
||||
var peerConnectionClient: PeerConnectionClient? {
|
||||
didSet {
|
||||
SwiftAssertIsOnMainThread(#function)
|
||||
|
||||
Logger.debug("\(self.logTag) .peerConnectionClient setter: \(oldValue != nil) -> \(peerConnectionClient != nil) \(String(describing: peerConnectionClient))")
|
||||
}
|
||||
}
|
||||
|
||||
required init(call: SignalCall) {
|
||||
self.call = call
|
||||
|
||||
@ -186,6 +194,9 @@ private class SignalCallData: NSObject {
|
||||
// In case we're still waiting on this promise somewhere, we need to reject it to avoid a memory leak.
|
||||
// There is no harm in rejecting a previously fulfilled promise.
|
||||
rejectReadyToSendIceUpdatesPromise(CallError.obsoleteCall(description: "Terminating call"))
|
||||
|
||||
peerConnectionClient?.terminate()
|
||||
Logger.debug("\(self.logTag) setting peerConnectionClient in \(#function)")
|
||||
}
|
||||
}
|
||||
|
||||
@ -213,14 +224,6 @@ private class SignalCallData: NSObject {
|
||||
|
||||
// MARK: Ivars
|
||||
|
||||
var peerConnectionClient: PeerConnectionClient? {
|
||||
didSet {
|
||||
SwiftAssertIsOnMainThread(#function)
|
||||
|
||||
Logger.debug("\(self.logTag) .peerConnectionClient setter: \(oldValue != nil) -> \(peerConnectionClient != nil) \(String(describing: peerConnectionClient))")
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate var callData: SignalCallData? {
|
||||
didSet {
|
||||
SwiftAssertIsOnMainThread(#function)
|
||||
@ -262,6 +265,17 @@ private class SignalCallData: NSObject {
|
||||
}
|
||||
}
|
||||
|
||||
var peerConnectionClient: PeerConnectionClient? {
|
||||
get {
|
||||
SwiftAssertIsOnMainThread(#function)
|
||||
|
||||
guard let callData = callData else {
|
||||
return nil
|
||||
}
|
||||
return callData.peerConnectionClient
|
||||
}
|
||||
}
|
||||
|
||||
var localVideoTrack: RTCVideoTrack? {
|
||||
get {
|
||||
SwiftAssertIsOnMainThread(#function)
|
||||
@ -373,7 +387,7 @@ private class SignalCallData: NSObject {
|
||||
throw CallError.obsoleteCall(description: "obsolete call in \(#function)")
|
||||
}
|
||||
|
||||
guard self.peerConnectionClient == nil else {
|
||||
guard callData.peerConnectionClient == nil else {
|
||||
let errorDescription = "\(self.logTag) peerconnection was unexpectedly already set."
|
||||
Logger.error(errorDescription)
|
||||
OWSProdError(OWSAnalyticsEvents.callServicePeerConnectionAlreadySet(), file: #file, function: #function, line: #line)
|
||||
@ -384,7 +398,7 @@ private class SignalCallData: NSObject {
|
||||
|
||||
let peerConnectionClient = PeerConnectionClient(iceServers: iceServers, delegate: self, callDirection: .outgoing, useTurnOnly: useTurnOnly)
|
||||
Logger.debug("\(self.logTag) setting peerConnectionClient in \(#function) for call: \(call.identifiersForLogs)")
|
||||
self.peerConnectionClient = peerConnectionClient
|
||||
callData.peerConnectionClient = peerConnectionClient
|
||||
callData.fulfillPeerConnectionClientPromise()
|
||||
|
||||
return peerConnectionClient.createOffer()
|
||||
@ -680,7 +694,7 @@ private class SignalCallData: NSObject {
|
||||
|
||||
Logger.debug("\(self.logTag) setting peerConnectionClient in \(#function) for: \(newCall.identifiersForLogs)")
|
||||
let peerConnectionClient = PeerConnectionClient(iceServers: iceServers, delegate: self, callDirection: .incoming, useTurnOnly: useTurnOnly)
|
||||
self.peerConnectionClient = peerConnectionClient
|
||||
callData.peerConnectionClient = peerConnectionClient
|
||||
callData.fulfillPeerConnectionClientPromise()
|
||||
|
||||
let offerSessionDescription = RTCSessionDescription(type: .offer, sdp: callerSessionDescription)
|
||||
@ -1534,16 +1548,15 @@ private class SignalCallData: NSObject {
|
||||
|
||||
Logger.debug("\(self.logTag) in \(#function)")
|
||||
|
||||
// Capture a reference to the current call data,
|
||||
// then clear the call data property.
|
||||
let currentCallData = self.callData
|
||||
self.callData = nil
|
||||
|
||||
self.peerConnectionClient?.terminate()
|
||||
Logger.debug("\(self.logTag) setting peerConnectionClient in \(#function)")
|
||||
self.peerConnectionClient = nil
|
||||
|
||||
currentCallData?.terminate()
|
||||
|
||||
self.callUIAdapter.didTerminateCall(self.call)
|
||||
|
||||
fireDidUpdateVideoTracks()
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user