Fix thread safety issue causing peer count to show 0

- Add thread safety lock for activePeers Set access
- Force UI update when peer list changes with objectWillChange
- Add debug logging to track peer additions/removals
- This fixes the 'alone :/' display when peers are actually connected
This commit is contained in:
jack
2025-07-04 15:59:56 +02:00
parent be08f4c8a7
commit 6023ff8af0
2 changed files with 18 additions and 7 deletions
+15 -3
View File
@@ -33,6 +33,7 @@ class BluetoothMeshService: NSObject {
private var peerNicknames: [String: String] = [:] private var peerNicknames: [String: String] = [:]
private let peerNicknamesLock = NSLock() private let peerNicknamesLock = NSLock()
private var activePeers: Set<String> = [] // Track all active peers private var activePeers: Set<String> = [] // Track all active peers
private let activePeersLock = NSLock() // Thread safety for activePeers
private var peerRSSI: [String: NSNumber] = [:] // Track RSSI values for peers private var peerRSSI: [String: NSNumber] = [:] // Track RSSI values for peers
private var peripheralRSSI: [String: NSNumber] = [:] // Track RSSI by peripheral ID during discovery private var peripheralRSSI: [String: NSNumber] = [:] // Track RSSI by peripheral ID during discovery
private var loggedCryptoErrors = Set<String>() // Track which peers we've logged crypto errors for private var loggedCryptoErrors = Set<String>() // Track which peers we've logged crypto errors for
@@ -337,7 +338,9 @@ class BluetoothMeshService: NSObject {
// Clear all tracking // Clear all tracking
connectedPeripherals.removeAll() connectedPeripherals.removeAll()
subscribedCentrals.removeAll() subscribedCentrals.removeAll()
activePeersLock.lock()
activePeers.removeAll() activePeers.removeAll()
activePeersLock.unlock()
announcedPeers.removeAll() announcedPeers.removeAll()
// Clear announcement tracking // Clear announcement tracking
@@ -757,7 +760,11 @@ class BluetoothMeshService: NSObject {
private func getAllConnectedPeerIDs() -> [String] { private func getAllConnectedPeerIDs() -> [String] {
// Return all valid active peers // Return all valid active peers
let validPeers = activePeers.filter { peerID in activePeersLock.lock()
let peersCopy = activePeers
activePeersLock.unlock()
let validPeers = peersCopy.filter { peerID in
// Ensure peerID is valid // Ensure peerID is valid
return !peerID.isEmpty && return !peerID.isEmpty &&
peerID != "unknown" && peerID != "unknown" &&
@@ -765,6 +772,7 @@ class BluetoothMeshService: NSObject {
peerID.count <= 8 // Filter out temp IDs peerID.count <= 8 // Filter out temp IDs
} }
print("[DEBUG] Active peers: \(peersCopy), Valid peers: \(validPeers)")
return Array(validPeers).sorted() return Array(validPeers).sorted()
} }
@@ -1328,6 +1336,7 @@ class BluetoothMeshService: NSObject {
// Add to active peers immediately on key exchange // Add to active peers immediately on key exchange
activePeers.insert(senderID) activePeers.insert(senderID)
print("[DEBUG] Added peer \(senderID) to active peers via key exchange")
let connectedPeerIDs = self.getAllConnectedPeerIDs() let connectedPeerIDs = self.getAllConnectedPeerIDs()
DispatchQueue.main.async { DispatchQueue.main.async {
self.delegate?.didUpdatePeerList(connectedPeerIDs) self.delegate?.didUpdatePeerList(connectedPeerIDs)
@@ -1373,8 +1382,11 @@ class BluetoothMeshService: NSObject {
// Add to active peers if not already there // Add to active peers if not already there
if senderID != "unknown" { if senderID != "unknown" {
if !activePeers.contains(senderID) { activePeersLock.lock()
activePeers.insert(senderID) let wasInserted = activePeers.insert(senderID).inserted
activePeersLock.unlock()
if wasInserted {
print("[DEBUG] Added peer \(senderID) to active peers via announce")
} }
// Show join message only for first announce // Show join message only for first announce
+3 -4
View File
@@ -588,13 +588,12 @@ extension ChatViewModel: BitchatDelegate {
} }
func didUpdatePeerList(_ peers: [String]) { func didUpdatePeerList(_ peers: [String]) {
print("[DEBUG] Updating peer list: \(peers.count) peers: \(peers)")
connectedPeers = peers connectedPeers = peers
isConnected = !peers.isEmpty isConnected = !peers.isEmpty
// If we just disconnected from all peers, ensure UI updates // Force UI update
if peers.isEmpty && isConnected { objectWillChange.send()
isConnected = false
}
// If we're in a private chat with someone who disconnected, exit the chat // If we're in a private chat with someone who disconnected, exit the chat
if let currentChatPeer = selectedPrivateChatPeer, if let currentChatPeer = selectedPrivateChatPeer,