mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 05:25:19 +00:00
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
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user