From 735b4e07b1be74e37d34d3daa2e20ed155c6ae84 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 22 May 2018 15:33:15 -0400 Subject: [PATCH] Respond to CR. --- Signal/src/call/PeerConnectionClient.swift | 55 +++++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/Signal/src/call/PeerConnectionClient.swift b/Signal/src/call/PeerConnectionClient.swift index 44454a44a..561aff4f6 100644 --- a/Signal/src/call/PeerConnectionClient.swift +++ b/Signal/src/call/PeerConnectionClient.swift @@ -380,7 +380,10 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD let handle = self.handle let (promise, fulfill, reject) = Promise.pending() let completion: ((RTCSessionDescription?, Error?) -> Void) = { [weak self] (sdp, error) in - guard let strongSelf = handle.get() else { return } + guard let strongSelf = handle.get() else { + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) + return + } strongSelf.assertOnSignalingQueue() guard strongSelf.peerConnection != nil else { Logger.debug("\(strongSelf.logTag) \(#function) Ignoring obsolete event in terminated client") @@ -403,7 +406,10 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD } PeerConnectionClient.signalingQueue.async { [weak self] in - guard let strongSelf = handle.get() else { return } + guard let strongSelf = handle.get() else { + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) + return + } strongSelf.assertOnSignalingQueue() guard let peerConnection = strongSelf.peerConnection else { Logger.debug("\(strongSelf.logTag) \(#function) Ignoring obsolete event in terminated client") @@ -423,18 +429,30 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD public func setLocalSessionDescriptionInternal(_ sessionDescription: HardenedRTCSessionDescription) -> Promise { let handle = self.handle - return PromiseKit.wrap { [weak self] resolve in - guard let strongSelf = handle.get() else { return } + let (promise, fulfill, reject) = Promise.pending() + PeerConnectionClient.signalingQueue.async { [weak self] in + guard let strongSelf = handle.get() else { + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) + return + } strongSelf.assertOnSignalingQueue() - guard let peerConnection = peerConnection else { + guard let peerConnection = strongSelf.peerConnection else { Logger.debug("\(strongSelf.logTag) \(#function) Ignoring obsolete event in terminated client") + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) return } Logger.verbose("\(strongSelf.logTag) setting local session description: \(sessionDescription)") - peerConnection.setLocalDescription(sessionDescription.rtcSessionDescription, completionHandler: resolve) + peerConnection.setLocalDescription(sessionDescription.rtcSessionDescription, completionHandler: { (error) in + if let error = error { + reject(error) + } else { + fulfill() + } + }) } + return promise } public func setLocalSessionDescription(_ sessionDescription: HardenedRTCSessionDescription) -> Promise { @@ -442,7 +460,10 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD let handle = self.handle let (promise, fulfill, reject) = Promise.pending() PeerConnectionClient.signalingQueue.async { [weak self] in - guard let strongSelf = handle.get() else { return } + guard let strongSelf = handle.get() else { + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) + return + } strongSelf.assertOnSignalingQueue() guard let peerConnection = strongSelf.peerConnection else { Logger.debug("\(strongSelf.logTag) \(#function) Ignoring obsolete event in terminated client") @@ -470,9 +491,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD return setRemoteSessionDescription(remoteDescription) .then(on: PeerConnectionClient.signalingQueue) { [weak self] in guard let strongSelf = handle.get() else { - return Promise { _, reject in - reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) - } + return Promise(error: NSError(domain: "Obsolete client", code: 0, userInfo: nil)) } return strongSelf.negotiateAnswerSessionDescription(constraints: constraints) } @@ -483,7 +502,10 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD let handle = self.handle let (promise, fulfill, reject) = Promise.pending() PeerConnectionClient.signalingQueue.async { [weak self] in - guard let strongSelf = handle.get() else { return } + guard let strongSelf = handle.get() else { + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) + return + } strongSelf.assertOnSignalingQueue() guard let peerConnection = strongSelf.peerConnection else { Logger.debug("\(strongSelf.logTag) \(#function) Ignoring obsolete event in terminated client") @@ -508,7 +530,10 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD let handle = self.handle let (promise, fulfill, reject) = Promise.pending() let completion: ((RTCSessionDescription?, Error?) -> Void) = { [weak self] (sdp, error) in - guard let strongSelf = handle.get() else { return } + guard let strongSelf = handle.get() else { + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) + return + } strongSelf.assertOnSignalingQueue() guard strongSelf.peerConnection != nil else { Logger.debug("\(strongSelf.logTag) \(#function) Ignoring obsolete event in terminated client") @@ -538,11 +563,15 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD } PeerConnectionClient.signalingQueue.async { [weak self] in - guard let strongSelf = handle.get() else { return } + guard let strongSelf = handle.get() else { + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) + return + } strongSelf.assertOnSignalingQueue() guard let peerConnection = strongSelf.peerConnection else { Logger.debug("\(strongSelf.logTag) \(#function) Ignoring obsolete event in terminated client") + reject(NSError(domain: "Obsolete client", code: 0, userInfo: nil)) return }