mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-26 11:25:19 +00:00
fix: ensure messages maintain correct order during sync
- Sort retry queue by original timestamp when adding and processing messages - Add 50ms delay between retry messages to prevent out-of-order delivery - Messages now sync in the exact order they were sent (ping 1, ping 2, ping 3)
This commit is contained in:
@@ -87,6 +87,13 @@ class MessageRetryService {
|
||||
)
|
||||
|
||||
retryQueue.append(retryMessage)
|
||||
|
||||
// Sort the queue by original timestamp to maintain message order
|
||||
retryQueue.sort { (msg1, msg2) in
|
||||
let time1 = msg1.originalTimestamp ?? Date.distantPast
|
||||
let time2 = msg2.originalTimestamp ?? Date.distantPast
|
||||
return time1 < time2
|
||||
}
|
||||
}
|
||||
|
||||
private func processRetryQueue() {
|
||||
@@ -106,12 +113,27 @@ class MessageRetryService {
|
||||
|
||||
retryQueue = updatedQueue
|
||||
|
||||
for message in messagesToRetry {
|
||||
// Sort messages by original timestamp to maintain order
|
||||
messagesToRetry.sort { (msg1, msg2) in
|
||||
let time1 = msg1.originalTimestamp ?? Date.distantPast
|
||||
let time2 = msg2.originalTimestamp ?? Date.distantPast
|
||||
return time1 < time2
|
||||
}
|
||||
|
||||
// Send messages with delay to maintain order
|
||||
for (index, message) in messagesToRetry.enumerated() {
|
||||
// Check if we should still retry
|
||||
if message.retryCount >= message.maxRetries {
|
||||
continue
|
||||
}
|
||||
|
||||
// Add delay between messages to ensure proper ordering
|
||||
let delay = Double(index) * 0.05 // 50ms between messages
|
||||
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in
|
||||
guard let self = self,
|
||||
let meshService = self.meshService else { return }
|
||||
|
||||
// Check connectivity before retrying
|
||||
let viewModel = meshService.delegate as? ChatViewModel
|
||||
let connectedPeers = viewModel?.connectedPeers ?? []
|
||||
@@ -142,9 +164,9 @@ class MessageRetryService {
|
||||
recipientNickname: message.recipientNickname,
|
||||
channelKey: message.channelKey,
|
||||
retryCount: message.retryCount + 1,
|
||||
nextRetryTime: Date().addingTimeInterval(retryInterval * Double(message.retryCount + 2))
|
||||
nextRetryTime: Date().addingTimeInterval(self.retryInterval * Double(message.retryCount + 2))
|
||||
)
|
||||
retryQueue.append(updatedMessage)
|
||||
self.retryQueue.append(updatedMessage)
|
||||
}
|
||||
} else if let channel = message.channel, let channelKeyData = message.channelKey {
|
||||
// For channel messages, check if we have peers in the channel
|
||||
@@ -174,9 +196,9 @@ class MessageRetryService {
|
||||
recipientNickname: message.recipientNickname,
|
||||
channelKey: message.channelKey,
|
||||
retryCount: message.retryCount + 1,
|
||||
nextRetryTime: Date().addingTimeInterval(retryInterval * Double(message.retryCount + 2))
|
||||
nextRetryTime: Date().addingTimeInterval(self.retryInterval * Double(message.retryCount + 2))
|
||||
)
|
||||
retryQueue.append(updatedMessage)
|
||||
self.retryQueue.append(updatedMessage)
|
||||
}
|
||||
} else {
|
||||
// Regular message
|
||||
@@ -204,9 +226,10 @@ class MessageRetryService {
|
||||
recipientNickname: message.recipientNickname,
|
||||
channelKey: message.channelKey,
|
||||
retryCount: message.retryCount + 1,
|
||||
nextRetryTime: Date().addingTimeInterval(retryInterval * Double(message.retryCount + 2))
|
||||
nextRetryTime: Date().addingTimeInterval(self.retryInterval * Double(message.retryCount + 2))
|
||||
)
|
||||
retryQueue.append(updatedMessage)
|
||||
self.retryQueue.append(updatedMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user