From 8ec39f566d4bdc44f386c79c85c80cf6f364bd09 Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 1 Aug 2025 21:39:09 +0200 Subject: [PATCH] Fix runtime crashes and reduce excessive logging - Fix Dictionary crash in ChatViewModel by adding deduplication logic for peer IDs - Fix compilation errors: PeerData -> BitchatPeer type correction - Fix Task async context issue with cancellables - Remove excessive debug logging for handshake coordination - Remove repetitive keep-alive timer logs - Remove version cache logging spam --- bitchat/Noise/NoiseHandshakeCoordinator.swift | 2 -- bitchat/Services/BluetoothMeshService.swift | 15 --------------- bitchat/ViewModels/ChatViewModel.swift | 9 ++++++--- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/bitchat/Noise/NoiseHandshakeCoordinator.swift b/bitchat/Noise/NoiseHandshakeCoordinator.swift index 0d7e104a..b8e03b6b 100644 --- a/bitchat/Noise/NoiseHandshakeCoordinator.swift +++ b/bitchat/Noise/NoiseHandshakeCoordinator.swift @@ -85,8 +85,6 @@ class NoiseHandshakeCoordinator { // Check role let role = determineHandshakeRole(myPeerID: myPeerID, remotePeerID: remotePeerID) if role != .initiator { - SecureLogger.log("Not initiator for handshake with \(remotePeerID) (my: \(myPeerID), their: \(remotePeerID))", - category: SecureLogger.handshake, level: .debug) return false } diff --git a/bitchat/Services/BluetoothMeshService.swift b/bitchat/Services/BluetoothMeshService.swift index 440c13e2..38e99923 100644 --- a/bitchat/Services/BluetoothMeshService.swift +++ b/bitchat/Services/BluetoothMeshService.swift @@ -6356,15 +6356,11 @@ extension BluetoothMeshService: CBPeripheralManagerDelegate { let currentPeerID = fingerprintToPeerID[fingerprint], currentPeerID == peerID else { // This peer ID has rotated, skip it - SecureLogger.log("Skipping keepalive for rotated peer ID: \(peerID)", - category: SecureLogger.session, level: .debug) return nil } // Check if we actually have a Noise session with this peer guard noiseService.hasEstablishedSession(with: peerID) else { - SecureLogger.log("Skipping keepalive for \(peerID) - no established session", - category: SecureLogger.session, level: .debug) return nil } @@ -6372,21 +6368,15 @@ extension BluetoothMeshService: CBPeripheralManagerDelegate { } } - SecureLogger.log("Keep-alive timer: checking \(connectedPeers.count) peers for pings", - category: SecureLogger.session, level: .debug) for peerID in connectedPeers { // Don't spam if we recently heard from them let lastHeard = self.peerSessions[peerID]?.lastHeardFromPeer if let lastHeard = lastHeard, Date().timeIntervalSince(lastHeard) < keepAliveInterval / 2 { - SecureLogger.log("Skipping keepalive for \(peerID) - heard recently", - category: SecureLogger.session, level: .debug) continue // Skip if we heard from them in the last 10 seconds } - SecureLogger.log("Sending keepalive ping to \(peerID)", - category: SecureLogger.session, level: .debug) validateNoiseSession(with: peerID) } } @@ -6485,8 +6475,6 @@ extension BluetoothMeshService: CBPeripheralManagerDelegate { } // Check with coordinator if we should initiate - SecureLogger.log("Checking handshake coordinator - myPeerID: \(myPeerID), remotePeerID: \(peerID), hasPending: \(hasPendingMessages)", - category: SecureLogger.handshake, level: .debug) if !handshakeCoordinator.shouldInitiateHandshake(myPeerID: myPeerID, remotePeerID: peerID, forceIfStale: hasPendingMessages) { // Coordinator says no handshake @@ -7107,9 +7095,6 @@ extension BluetoothMeshService: CBPeripheralManagerDelegate { // Check version cache for this peer if let cached = versionCache[peerID], !cached.isExpired { // Skip negotiation - use cached version - SecureLogger.log("📗 Using cached version \(cached.version) for \(peerID) (cached \(Int(Date().timeIntervalSince(cached.cachedAt)))s ago)", - category: SecureLogger.session, level: .info) - negotiatedVersions[peerID] = cached.version versionNegotiationState[peerID] = .ackReceived(version: cached.version) diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 4aafcf43..7c28ea18 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -208,7 +208,7 @@ class ChatViewModel: ObservableObject, BitchatDelegate { peerManager?.updatePeers() // Bind peer manager's peer list to our published property - peerManager?.$peers + let cancellable = peerManager?.$peers .receive(on: DispatchQueue.main) .sink { [weak self] peers in SecureLogger.log("📱 UI: Received \(peers.count) peers from PeerManager", @@ -221,7 +221,7 @@ class ChatViewModel: ObservableObject, BitchatDelegate { self?.allPeers = peers // Update peer index for O(1) lookups // Deduplicate peers by ID to prevent crash from duplicate keys - var uniquePeers: [String: PeerData] = [:] + var uniquePeers: [String: BitchatPeer] = [:] for peer in peers { // Keep the first occurrence of each peer ID if uniquePeers[peer.id] == nil { @@ -242,7 +242,10 @@ class ChatViewModel: ObservableObject, BitchatDelegate { self?.updatePrivateChatPeerIfNeeded() } } - .store(in: &cancellables) + + if let cancellable = cancellable { + self.cancellables.insert(cancellable) + } } // Set up Noise encryption callbacks