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