handle offer message might come in earlier than pre offer message

This commit is contained in:
ryanzhao 2021-11-12 16:24:47 +11:00
parent ee83523621
commit 716378ccd3
4 changed files with 17 additions and 20 deletions

View File

@ -161,6 +161,7 @@ public final class SessionCall: NSObject, WebRTCSessionDelegate {
}
func didReceiveRemoteSDP(sdp: RTCSessionDescription) {
print("[Calls] Did receive remote sdp.")
remoteSDP = sdp
if hasStartedConnecting {
webRTCSession.handleRemoteSDP(sdp, from: sessionID) // This sends an answer message internally

View File

@ -22,17 +22,24 @@ extension AppDelegate {
@objc func setUpCallHandling() {
// Pre offer messages
MessageReceiver.handlePreOfferCallMessage = { (message, transaction) in
MessageReceiver.handleNewCallOfferMessageIfNeeded = { (message, transaction) in
guard CurrentAppContext().isMainApp else { return }
let callManager = AppEnvironment.shared.callManager
// Ignore pre offer message afte the same call instance has been generated
if let currentCall = callManager.currentCall, currentCall.uuid == message.uuid! { return }
guard callManager.currentCall == nil && SSKPreferences.areCallsEnabled else {
callManager.handleIncomingCallOfferInBusyOrUnenabledState(offerMessage: message, using: transaction)
return
}
DispatchQueue.main.async {
if let caller = message.sender, let uuid = message.uuid {
let call = SessionCall(for: caller, uuid: uuid, mode: .answer)
call.callMessageTimestamp = message.sentTimestamp
// Create incoming call message
let thread = TSContactThread.getOrCreateThread(withContactSessionID: message.sender!, transaction: transaction)
let tsMessage = TSIncomingMessage.from(message, associatedWith: thread)
tsMessage.save(with: transaction)
// Handle UI
if let caller = message.sender, let uuid = message.uuid {
let call = SessionCall(for: caller, uuid: uuid, mode: .answer)
call.callMessageTimestamp = message.sentTimestamp
DispatchQueue.main.async {
if CurrentAppContext().isMainAppAndActive {
guard let presentingVC = CurrentAppContext().frontmostViewController() else { preconditionFailure() } // TODO: Handle more gracefully
if let conversationVC = presentingVC as? ConversationVC, let contactThread = conversationVC.thread as? TSContactThread, contactThread.contactSessionID() == caller {
@ -51,7 +58,6 @@ extension AppDelegate {
}
}
}
}
}
// Offer messages

View File

@ -268,21 +268,11 @@ extension MessageReceiver {
case .preOffer:
print("[Calls] Received pre-offer message.")
let transaction = transaction as! YapDatabaseReadWriteTransaction
if SSKPreferences.areCallsEnabled {
let storage = SNMessagingKitConfiguration.shared.storage
if let threadID = storage.getOrCreateThread(for: message.sender!, groupPublicKey: message.groupPublicKey, openGroupID: nil, using: transaction),
let thread = TSThread.fetch(uniqueId: threadID, transaction: transaction) {
let tsMessage = TSIncomingMessage.from(message, associatedWith: thread)
tsMessage.save(with: transaction)
}
}
handlePreOfferCallMessage?(message, transaction)
handleNewCallOfferMessageIfNeeded?(message, transaction)
case .offer:
print("[Calls] Received offer message.")
if WebRTCSession.current?.uuid != message.uuid! {
// TODO: Call in progress, put the new call on hold/reject
return
}
let transaction = transaction as! YapDatabaseReadWriteTransaction
handleNewCallOfferMessageIfNeeded?(message, transaction)
handleOfferCallMessage?(message)
case .answer:
print("[Calls] Received answer message.")

View File

@ -2,7 +2,7 @@ import SessionUtilitiesKit
public enum MessageReceiver {
private static var lastEncryptionKeyPairRequest: [String:Date] = [:]
public static var handlePreOfferCallMessage: ((CallMessage, YapDatabaseReadWriteTransaction) -> Void)?
public static var handleNewCallOfferMessageIfNeeded: ((CallMessage, YapDatabaseReadWriteTransaction) -> Void)?
public static var handleOfferCallMessage: ((CallMessage) -> Void)?
public static var handleAnswerCallMessage: ((CallMessage) -> Void)?
public static var handleEndCallMessage: ((CallMessage) -> Void)?