refactor(router): make MessageRouter depend on NostrOutboxService; update ChatViewModel wiring

This commit is contained in:
jack
2025-08-26 21:27:55 +02:00
parent 8ebb7411a7
commit ed105f311a
3 changed files with 21 additions and 7 deletions
+3 -4
View File
@@ -4,13 +4,12 @@ import Foundation
@MainActor
final class MessageRouter {
private let mesh: Transport
private let nostr: NostrTransport
private let nostr: NostrOutboxService
private var outbox: [String: [(content: String, nickname: String, messageID: String)]] = [:] // peerID -> queued messages
init(mesh: Transport, nostr: NostrTransport) {
init(mesh: Transport, nostr: NostrOutboxService) {
self.mesh = mesh
self.nostr = nostr
self.nostr.senderPeerID = mesh.myPeerID
// Observe favorites changes to learn Nostr mapping and flush queued messages
NotificationCenter.default.addObserver(
@@ -46,7 +45,7 @@ final class MessageRouter {
} else if canSendViaNostr(peerID: peerID) {
SecureLogger.log("Routing PM via Nostr to \(peerID.prefix(8))… id=\(messageID.prefix(8))",
category: SecureLogger.session, level: .debug)
nostr.sendPrivateMessage(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID)
nostr.sendPrivate(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID)
} else {
// Queue for later (when mesh connects or Nostr mapping appears)
if outbox[peerID] == nil { outbox[peerID] = [] }
+17 -1
View File
@@ -30,5 +30,21 @@ final class NostrOutboxService {
func sendGeohashReadAck(messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) {
transport.sendReadReceiptGeohash(messageID, toRecipientHex: recipientHex, from: identity)
}
}
// MARK: - Generic outbox via favorites mapping
func sendPrivate(_ content: String, to peerID: String, recipientNickname: String, messageID: String) {
transport.sendPrivateMessage(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID)
}
func sendReadReceipt(_ receipt: ReadReceipt, to peerID: String) {
transport.sendReadReceipt(receipt, to: peerID)
}
func sendDeliveryAck(for messageID: String, to peerID: String) {
transport.sendDeliveryAck(for: messageID, to: peerID)
}
func sendFavoriteNotification(to peerID: String, isFavorite: Bool) {
transport.sendFavoriteNotification(to: peerID, isFavorite: isFavorite)
}
}
+1 -2
View File
@@ -462,10 +462,9 @@ class ChatViewModel: ObservableObject, BitchatDelegate {
self.commandProcessor = CommandProcessor()
self.privateChatManager = PrivateChatManager(meshService: meshService, readReceiptTracker: readReceiptTracker)
self.unifiedPeerService = UnifiedPeerService(meshService: meshService)
let nostrTransport = NostrTransport()
self.messageRouter = MessageRouter(mesh: meshService, nostr: nostrTransport)
self.nostrInbox = NostrInboxService()
self.nostrOutbox = NostrOutboxService(meshService: meshService)
self.messageRouter = MessageRouter(mesh: meshService, nostr: self.nostrOutbox)
// Route receipts from PrivateChatManager through MessageRouter
self.privateChatManager.messageRouter = self.messageRouter
self.autocompleteService = AutocompleteService()