diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index 1c877aed0..2e08d0ae6 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -327,8 +327,9 @@ protocol CallServiceObserver: class { // Don't let the outgoing call ring forever. We don't support inbound ringing forever anyway. let timeout: Promise = after(interval: connectingTimeoutSeconds).then { () -> Void in - // rejecting a promise by throwing is safely a no-op if the promise has already been fulfilled - OWSProdInfo(OWSAnalyticsEvents.callServiceErrorTimeoutWhileConnectingOutgoing(), file: #file, function: #function, line: #line) + // This code will always be called, whether or not the call has timed out. + // However, if the call has already connected, the `race` promise will have already been + // fulfilled. Rejecting an already fulfilled promise is a no-op. throw CallError.timeout(description: "timed out waiting to receive call answer") } @@ -341,6 +342,9 @@ protocol CallServiceObserver: class { Logger.error("\(self.logTag) placing call \(call.identifiersForLogs) failed with error: \(error)") if let callError = error as? CallError { + if case .timeout = callError { + OWSProdInfo(OWSAnalyticsEvents.callServiceErrorTimeoutWhileConnectingOutgoing(), file: #file, function: #function, line: #line) + } OWSProdInfo(OWSAnalyticsEvents.callServiceErrorOutgoingConnectionFailedInternal(), file: #file, function: #function, line: #line) self.handleFailedCall(failedCall: call, error: callError) } else {