mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-26 02:05:19 +00:00
refactor(router): make MessageRouter depend on NostrOutboxService; update ChatViewModel wiring
This commit is contained in:
@@ -4,13 +4,12 @@ import Foundation
|
|||||||
@MainActor
|
@MainActor
|
||||||
final class MessageRouter {
|
final class MessageRouter {
|
||||||
private let mesh: Transport
|
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
|
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.mesh = mesh
|
||||||
self.nostr = nostr
|
self.nostr = nostr
|
||||||
self.nostr.senderPeerID = mesh.myPeerID
|
|
||||||
|
|
||||||
// Observe favorites changes to learn Nostr mapping and flush queued messages
|
// Observe favorites changes to learn Nostr mapping and flush queued messages
|
||||||
NotificationCenter.default.addObserver(
|
NotificationCenter.default.addObserver(
|
||||||
@@ -46,7 +45,7 @@ final class MessageRouter {
|
|||||||
} else if canSendViaNostr(peerID: peerID) {
|
} else if canSendViaNostr(peerID: peerID) {
|
||||||
SecureLogger.log("Routing PM via Nostr to \(peerID.prefix(8))… id=\(messageID.prefix(8))…",
|
SecureLogger.log("Routing PM via Nostr to \(peerID.prefix(8))… id=\(messageID.prefix(8))…",
|
||||||
category: SecureLogger.session, level: .debug)
|
category: SecureLogger.session, level: .debug)
|
||||||
nostr.sendPrivateMessage(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID)
|
nostr.sendPrivate(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID)
|
||||||
} else {
|
} else {
|
||||||
// Queue for later (when mesh connects or Nostr mapping appears)
|
// Queue for later (when mesh connects or Nostr mapping appears)
|
||||||
if outbox[peerID] == nil { outbox[peerID] = [] }
|
if outbox[peerID] == nil { outbox[peerID] = [] }
|
||||||
|
|||||||
@@ -30,5 +30,21 @@ final class NostrOutboxService {
|
|||||||
func sendGeohashReadAck(messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) {
|
func sendGeohashReadAck(messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) {
|
||||||
transport.sendReadReceiptGeohash(messageID, toRecipientHex: recipientHex, from: identity)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -462,10 +462,9 @@ class ChatViewModel: ObservableObject, BitchatDelegate {
|
|||||||
self.commandProcessor = CommandProcessor()
|
self.commandProcessor = CommandProcessor()
|
||||||
self.privateChatManager = PrivateChatManager(meshService: meshService, readReceiptTracker: readReceiptTracker)
|
self.privateChatManager = PrivateChatManager(meshService: meshService, readReceiptTracker: readReceiptTracker)
|
||||||
self.unifiedPeerService = UnifiedPeerService(meshService: meshService)
|
self.unifiedPeerService = UnifiedPeerService(meshService: meshService)
|
||||||
let nostrTransport = NostrTransport()
|
|
||||||
self.messageRouter = MessageRouter(mesh: meshService, nostr: nostrTransport)
|
|
||||||
self.nostrInbox = NostrInboxService()
|
self.nostrInbox = NostrInboxService()
|
||||||
self.nostrOutbox = NostrOutboxService(meshService: meshService)
|
self.nostrOutbox = NostrOutboxService(meshService: meshService)
|
||||||
|
self.messageRouter = MessageRouter(mesh: meshService, nostr: self.nostrOutbox)
|
||||||
// Route receipts from PrivateChatManager through MessageRouter
|
// Route receipts from PrivateChatManager through MessageRouter
|
||||||
self.privateChatManager.messageRouter = self.messageRouter
|
self.privateChatManager.messageRouter = self.messageRouter
|
||||||
self.autocompleteService = AutocompleteService()
|
self.autocompleteService = AutocompleteService()
|
||||||
|
|||||||
Reference in New Issue
Block a user