Use unique transfer identifiers

This commit is contained in:
jack
2025-10-15 00:37:41 +01:00
committed by islam
parent bd37cc69a0
commit de3795289d
2 changed files with 25 additions and 21 deletions
+13 -9
View File
@@ -2404,6 +2404,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
let targetPeer = selectedPrivateChatPeer
let message = enqueueMediaMessage(content: "[voice] \(url.path)", targetPeer: targetPeer)
let messageID = message.id
let transferId = makeTransferID(messageID: messageID)
Task.detached(priority: .userInitiated) { [weak self] in
guard let self = self else { return }
@@ -2424,13 +2425,12 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
content: data
)
guard let payload = packet.encode() else { throw MediaSendError.encodingFailed }
let transferId = payload.sha256Hex()
await MainActor.run {
self.registerTransfer(transferId: transferId, messageID: messageID)
if let peerID = targetPeer {
self.meshService.sendFilePrivate(packet, to: peerID)
self.meshService.sendFilePrivate(packet, to: peerID, transferId: transferId)
} else {
self.meshService.sendFileBroadcast(packet)
self.meshService.sendFileBroadcast(packet, transferId: transferId)
}
}
} catch {
@@ -2468,15 +2468,15 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
content: data
)
guard let payload = packet.encode() else { throw MediaSendError.encodingFailed }
let transferId = payload.sha256Hex()
await MainActor.run {
let message = self.enqueueMediaMessage(content: "[image] \(outputURL.path)", targetPeer: targetPeer)
let messageID = message.id
let transferId = self.makeTransferID(messageID: messageID)
self.registerTransfer(transferId: transferId, messageID: messageID)
if let peerID = targetPeer {
self.meshService.sendFilePrivate(packet, to: peerID)
self.meshService.sendFilePrivate(packet, to: peerID, transferId: transferId)
} else {
self.meshService.sendFileBroadcast(packet)
self.meshService.sendFileBroadcast(packet, transferId: transferId)
}
}
} catch {
@@ -2518,16 +2518,16 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
try? FileManager.default.removeItem(at: destination)
throw MediaSendError.encodingFailed
}
let transferId = payload.sha256Hex()
await MainActor.run {
let message = self.enqueueMediaMessage(content: "[file] \(destination.path)", targetPeer: targetPeer)
let messageID = message.id
let transferId = self.makeTransferID(messageID: messageID)
self.registerTransfer(transferId: transferId, messageID: messageID)
if let peerID = targetPeer {
self.meshService.sendFilePrivate(packet, to: peerID)
self.meshService.sendFilePrivate(packet, to: peerID, transferId: transferId)
} else {
self.meshService.sendFileBroadcast(packet)
self.meshService.sendFileBroadcast(packet, transferId: transferId)
}
}
} catch MediaSendError.tooLarge {
@@ -2655,6 +2655,10 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
messageIDToTransferId[messageID] = transferId
}
private func makeTransferID(messageID: String) -> String {
"\(messageID)-\(UUID().uuidString)"
}
@MainActor
private func clearTransferMapping(for messageID: String) {
guard let transferId = messageIDToTransferId.removeValue(forKey: messageID) else { return }