From bb175929715eccacc1a334c150ef73bc21bb6338 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 30 Jan 2019 15:12:30 -0500 Subject: [PATCH] Fail call if ICE updates fail to send. --- Signal/src/call/CallService.swift | 38 +++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index c1799f812..53decbba0 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -99,8 +99,14 @@ protocol CallServiceObserver: class { remoteVideoTrack: RTCVideoTrack?) } +protocol SignalCallDataDelegate: class { + func outgoingIceUpdateDidFail(call: SignalCall) +} + // Gather all per-call state in one place. private class SignalCallData: NSObject { + fileprivate weak var delegate: SignalCallDataDelegate? + public let call: SignalCall // Used to coordinate promises across delegate methods @@ -147,8 +153,9 @@ private class SignalCallData: NSObject { } } - required init(call: SignalCall) { + required init(call: SignalCall, delegate: SignalCallDataDelegate) { self.call = call + self.delegate = delegate let (callConnectedPromise, callConnectedResolver) = Promise.pending() self.callConnectedPromise = callConnectedPromise @@ -245,7 +252,7 @@ private class SignalCallData: NSObject { */ let callMessage = OWSOutgoingCallMessage(thread: call.thread, iceUpdateMessages: iceUpdateProtos) let sendPromise = self.messageSender.sendPromise(message: callMessage) - .ensure { [weak self] in + .done { [weak self] in AssertIsOnMainThread() guard let strongSelf = self else { @@ -254,13 +261,22 @@ private class SignalCallData: NSObject { strongSelf.outgoingIceUpdatesInFlight = false strongSelf.tryToSendIceUpdates() + }.catch { [weak self] (_) in + AssertIsOnMainThread() + + guard let strongSelf = self else { + return + } + + strongSelf.outgoingIceUpdatesInFlight = false + strongSelf.delegate?.outgoingIceUpdateDidFail(call: strongSelf.call) } sendPromise.retainUntilComplete() } } // This class' state should only be accessed on the main queue. -@objc public class CallService: NSObject, CallObserver, PeerConnectionClientDelegate { +@objc public class CallService: NSObject, CallObserver, PeerConnectionClientDelegate, SignalCallDataDelegate { // MARK: - Properties @@ -280,6 +296,7 @@ private class SignalCallData: NSObject { didSet { AssertIsOnMainThread() + oldValue?.delegate = nil oldValue?.call.removeObserver(self) callData?.call.addObserverAndSyncState(observer: self) @@ -427,7 +444,7 @@ private class SignalCallData: NSObject { return Promise(error: CallError.assertionError(description: errorDescription)) } - let callData = SignalCallData(call: call) + let callData = SignalCallData(call: call, delegate: self) self.callData = callData // MJK TODO remove this timestamp param @@ -728,7 +745,7 @@ private class SignalCallData: NSObject { Logger.info("starting new call: \(newCall.identifiersForLogs)") - let callData = SignalCallData(call: newCall) + let callData = SignalCallData(call: newCall, delegate: self) self.callData = callData var backgroundTask: OWSBackgroundTask? = OWSBackgroundTask(label: "\(#function)", completionBlock: { [weak self] status in @@ -1876,4 +1893,15 @@ private class SignalCallData: NSObject { self.activeCallTimer?.invalidate() self.activeCallTimer = nil } + + // MARK: - SignalCallDataDelegate + + func outgoingIceUpdateDidFail(call: SignalCall) { + guard self.call == call else { + Logger.warn("obsolete call") + return + } + + terminateCall() + } }