// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation import GRDB import WebRTC import SessionUtilitiesKit extension MessageReceiver { public static func handleCallMessage(_ db: Database, message: CallMessage) throws { switch message.kind { case .preOffer: try MessageReceiver.handleNewCallMessage(db, message: message) case .offer: MessageReceiver.handleOfferCallMessage(db, message: message) case .answer: MessageReceiver.handleAnswerCallMessage(db, message: message) case .provisionalAnswer: break // TODO: Implement case let .iceCandidates(sdpMLineIndexes, sdpMids): guard let currentWebRTCSession = WebRTCSession.current, currentWebRTCSession.uuid == message.uuid else { return } var candidates: [RTCIceCandidate] = [] let sdps = message.sdps for i in 0.. Interaction? { guard (try? Interaction .filter(Interaction.Columns.variant == Interaction.Variant.infoCall) .filter(Interaction.Columns.messageUuid == message.uuid) .isEmpty(db)) .defaulting(to: false), let sender: String = message.sender, let thread: SessionThread = try SessionThread.fetchOne(db, id: sender), !thread.isMessageRequest(db) else { return nil } let messageInfo: CallMessage.MessageInfo = CallMessage.MessageInfo( state: state.defaulting( to: (sender == getUserHexEncodedPublicKey(db) ? .outgoing : .incoming ) ) ) let timestampMs: Int64 = ( message.sentTimestamp.map { Int64($0) } ?? Int64(floor(Date().timeIntervalSince1970 * 1000)) ) guard let messageInfoData: Data = try? JSONEncoder().encode(messageInfo) else { return nil } return try Interaction( serverHash: message.serverHash, messageUuid: message.uuid, threadId: thread.id, authorId: sender, variant: .infoCall, body: String(data: messageInfoData, encoding: .utf8), timestampMs: timestampMs ).inserted(db) } }