PeerID 15/n: Bitchat Message & Packet accept in init (#754)

This commit is contained in:
Islam
2025-10-06 17:16:11 +02:00
committed by GitHub
parent 01ec4573f8
commit 5f44c56a90
10 changed files with 45 additions and 34 deletions
+16 -4
View File
@@ -42,7 +42,19 @@ final class BitchatMessage: Codable {
case isPrivate, recipientNickname, senderPeerID, mentions, deliveryStatus case isPrivate, recipientNickname, senderPeerID, mentions, deliveryStatus
} }
init(id: String? = nil, sender: String, content: String, timestamp: Date, isRelay: Bool, originalSender: String? = nil, isPrivate: Bool = false, recipientNickname: String? = nil, senderPeerID: String? = nil, mentions: [String]? = nil, deliveryStatus: DeliveryStatus? = nil) { init(
id: String? = nil,
sender: String,
content: String,
timestamp: Date,
isRelay: Bool,
originalSender: String? = nil,
isPrivate: Bool = false,
recipientNickname: String? = nil,
senderPeerID: PeerID? = nil,
mentions: [String]? = nil,
deliveryStatus: DeliveryStatus? = nil
) {
self.id = id ?? UUID().uuidString self.id = id ?? UUID().uuidString
self.sender = sender self.sender = sender
self.content = content self.content = content
@@ -51,7 +63,7 @@ final class BitchatMessage: Codable {
self.originalSender = originalSender self.originalSender = originalSender
self.isPrivate = isPrivate self.isPrivate = isPrivate
self.recipientNickname = recipientNickname self.recipientNickname = recipientNickname
self.senderPeerID = PeerID(str: senderPeerID) self.senderPeerID = senderPeerID
self.mentions = mentions self.mentions = mentions
self.deliveryStatus = deliveryStatus ?? (isPrivate ? .sending : nil) self.deliveryStatus = deliveryStatus ?? (isPrivate ? .sending : nil)
} }
@@ -264,11 +276,11 @@ extension BitchatMessage {
} }
} }
var senderPeerID: String? var senderPeerID: PeerID?
if hasSenderPeerID && offset < dataCopy.count { if hasSenderPeerID && offset < dataCopy.count {
let length = Int(dataCopy[offset]); offset += 1 let length = Int(dataCopy[offset]); offset += 1
if offset + length <= dataCopy.count { if offset + length <= dataCopy.count {
senderPeerID = String(data: dataCopy[offset..<offset+length], encoding: .utf8) senderPeerID = PeerID(data: dataCopy[offset..<offset+length])
offset += length offset += length
} }
} }
+2 -2
View File
@@ -34,12 +34,12 @@ struct BitchatPacket: Codable {
} }
// Convenience initializer for new binary format // Convenience initializer for new binary format
init(type: UInt8, ttl: UInt8, senderID: String, payload: Data) { init(type: UInt8, ttl: UInt8, senderID: PeerID, payload: Data) {
self.version = 1 self.version = 1
self.type = type self.type = type
// Convert hex string peer ID to binary data (8 bytes) // Convert hex string peer ID to binary data (8 bytes)
var senderData = Data() var senderData = Data()
var tempID = senderID var tempID = senderID.id
while tempID.count >= 2 { while tempID.count >= 2 {
let hexByte = String(tempID.prefix(2)) let hexByte = String(tempID.prefix(2))
if let byte = UInt8(hexByte, radix: 16) { if let byte = UInt8(hexByte, radix: 16) {
+1 -2
View File
@@ -69,8 +69,7 @@ extension PeerID {
/// Convenience init to create PeerID by converting Data to String /// Convenience init to create PeerID by converting Data to String
init?(data: Data) { init?(data: Data) {
guard let str = String(data: data, encoding: .utf8) else { return nil } self.init(str: String(data: data, encoding: .utf8))
self.init(str: str)
} }
/// Convenience init to "hide" hex-encoding implementation detail /// Convenience init to "hide" hex-encoding implementation detail
+1 -1
View File
@@ -2791,7 +2791,7 @@ extension BLEService {
let packet = BitchatPacket( let packet = BitchatPacket(
type: MessageType.leave.rawValue, type: MessageType.leave.rawValue,
ttl: messageTTL, ttl: messageTTL,
senderID: myPeerID.id, senderID: myPeerID,
payload: Data(myNickname.utf8) payload: Data(myNickname.utf8)
) )
broadcastPacket(packet) broadcastPacket(packet)
+18 -18
View File
@@ -1009,7 +1009,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
content: content, content: content,
timestamp: timestamp, timestamp: timestamp,
isRelay: false, isRelay: false,
senderPeerID: "nostr:\(event.pubkey.prefix(TransportConfig.nostrShortKeyDisplayLength))", senderPeerID: PeerID(nostr: event.pubkey),
mentions: mentions.isEmpty ? nil : mentions mentions: mentions.isEmpty ? nil : mentions
) )
Task { @MainActor in Task { @MainActor in
@@ -1080,7 +1080,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
isRelay: false, isRelay: false,
isPrivate: true, isPrivate: true,
recipientNickname: nickname, recipientNickname: nickname,
senderPeerID: convKey, senderPeerID: PeerID(str: convKey),
deliveryStatus: .delivered(to: nickname, at: Date()) deliveryStatus: .delivered(to: nickname, at: Date())
) )
@@ -1424,7 +1424,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
content: trimmed, content: trimmed,
timestamp: Date(), timestamp: Date(),
isRelay: false, isRelay: false,
senderPeerID: localSenderPeerID.id, senderPeerID: localSenderPeerID,
mentions: mentions.isEmpty ? nil : mentions mentions: mentions.isEmpty ? nil : mentions
) )
@@ -1677,7 +1677,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
content: content, content: content,
timestamp: min(rawTs, Date()), timestamp: min(rawTs, Date()),
isRelay: false, isRelay: false,
senderPeerID: "nostr:\(event.pubkey.prefix(TransportConfig.nostrShortKeyDisplayLength))", senderPeerID: PeerID(nostr: event.pubkey),
mentions: mentions.isEmpty ? nil : mentions mentions: mentions.isEmpty ? nil : mentions
) )
@@ -1777,7 +1777,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
isRelay: false, isRelay: false,
isPrivate: true, isPrivate: true,
recipientNickname: nickname, recipientNickname: nickname,
senderPeerID: convKey, senderPeerID: PeerID(str: convKey),
deliveryStatus: .delivered(to: nickname, at: Date()) deliveryStatus: .delivered(to: nickname, at: Date())
) )
@@ -2127,7 +2127,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
content: content, content: content,
timestamp: ts, timestamp: ts,
isRelay: false, isRelay: false,
senderPeerID: "nostr:\(event.pubkey.prefix(TransportConfig.nostrShortKeyDisplayLength))", senderPeerID: PeerID(nostr: event.pubkey),
mentions: mentions.isEmpty ? nil : mentions mentions: mentions.isEmpty ? nil : mentions
) )
if !arr.contains(where: { $0.id == msg.id }) { if !arr.contains(where: { $0.id == msg.id }) {
@@ -2242,7 +2242,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: nil, originalSender: nil,
isPrivate: true, isPrivate: true,
recipientNickname: recipientNickname, recipientNickname: recipientNickname,
senderPeerID: meshService.myPeerID.id, senderPeerID: meshService.myPeerID,
mentions: nil, mentions: nil,
deliveryStatus: .sending deliveryStatus: .sending
) )
@@ -2299,7 +2299,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
isRelay: false, isRelay: false,
isPrivate: true, isPrivate: true,
recipientNickname: nickname, recipientNickname: nickname,
senderPeerID: meshService.myPeerID.id, senderPeerID: meshService.myPeerID,
deliveryStatus: .sending deliveryStatus: .sending
) )
@@ -2397,7 +2397,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: nil, originalSender: nil,
isPrivate: true, isPrivate: true,
recipientNickname: meshService.peerNickname(peerID: PeerID(str: peerID)), recipientNickname: meshService.peerNickname(peerID: PeerID(str: peerID)),
senderPeerID: meshService.myPeerID.id senderPeerID: meshService.myPeerID
) )
if privateChats[peerID] == nil { privateChats[peerID] = [] } if privateChats[peerID] == nil { privateChats[peerID] = [] }
privateChats[peerID]?.append(systemMessage) privateChats[peerID]?.append(systemMessage)
@@ -2506,7 +2506,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: message.originalSender, originalSender: message.originalSender,
isPrivate: message.isPrivate, isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname, recipientNickname: message.recipientNickname,
senderPeerID: message.senderPeerID == meshService.myPeerID ? meshService.myPeerID.id : peerID, // Update peer ID if it's from them senderPeerID: message.senderPeerID == meshService.myPeerID ? meshService.myPeerID : PeerID(str: peerID), // Update peer ID if it's from them
mentions: message.mentions, mentions: message.mentions,
deliveryStatus: message.deliveryStatus deliveryStatus: message.deliveryStatus
) )
@@ -2594,7 +2594,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: message.originalSender, originalSender: message.originalSender,
isPrivate: message.isPrivate, isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname, recipientNickname: message.recipientNickname,
senderPeerID: peerID, // Update to match current peer senderPeerID: PeerID(str: peerID), // Update to match current peer
mentions: message.mentions, mentions: message.mentions,
deliveryStatus: message.deliveryStatus deliveryStatus: message.deliveryStatus
) )
@@ -2887,7 +2887,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: nil, originalSender: nil,
isPrivate: true, isPrivate: true,
recipientNickname: meshService.peerNickname(peerID: PeerID(str: peerID)), recipientNickname: meshService.peerNickname(peerID: PeerID(str: peerID)),
senderPeerID: meshService.myPeerID.id senderPeerID: meshService.myPeerID
) )
var chats = privateChats var chats = privateChats
if chats[peerID] == nil { if chats[peerID] == nil {
@@ -4450,7 +4450,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: nil, originalSender: nil,
isPrivate: true, isPrivate: true,
recipientNickname: nickname, recipientNickname: nickname,
senderPeerID: peerID, senderPeerID: PeerID(str: peerID),
mentions: pmMentions.isEmpty ? nil : pmMentions mentions: pmMentions.isEmpty ? nil : pmMentions
) )
handlePrivateMessage(msg) handlePrivateMessage(msg)
@@ -4557,7 +4557,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: nil, originalSender: nil,
isPrivate: false, isPrivate: false,
recipientNickname: nil, recipientNickname: nil,
senderPeerID: peerID, senderPeerID: PeerID(str: peerID),
mentions: publicMentions.isEmpty ? nil : publicMentions mentions: publicMentions.isEmpty ? nil : publicMentions
) )
handlePublicMessage(msg) handlePublicMessage(msg)
@@ -4658,7 +4658,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: msg.originalSender, originalSender: msg.originalSender,
isPrivate: msg.isPrivate, isPrivate: msg.isPrivate,
recipientNickname: msg.recipientNickname, recipientNickname: msg.recipientNickname,
senderPeerID: msg.senderPeerID == meshService.myPeerID ? meshService.myPeerID.id : stableKeyHex, senderPeerID: msg.senderPeerID == meshService.myPeerID ? meshService.myPeerID : PeerID(str: stableKeyHex),
mentions: msg.mentions, mentions: msg.mentions,
deliveryStatus: msg.deliveryStatus deliveryStatus: msg.deliveryStatus
) )
@@ -5190,7 +5190,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
isRelay: false, isRelay: false,
isPrivate: true, isPrivate: true,
recipientNickname: nickname, recipientNickname: nickname,
senderPeerID: targetPeerID, senderPeerID: PeerID(str: targetPeerID),
deliveryStatus: .delivered(to: nickname, at: Date()) deliveryStatus: .delivered(to: nickname, at: Date())
) )
@@ -5530,7 +5530,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: nil, originalSender: nil,
isPrivate: true, isPrivate: true,
recipientNickname: nickname, recipientNickname: nickname,
senderPeerID: tempPeerID, senderPeerID: PeerID(str: tempPeerID),
mentions: nil, mentions: nil,
deliveryStatus: .delivered(to: nickname, at: Date()) deliveryStatus: .delivered(to: nickname, at: Date())
) )
@@ -5693,7 +5693,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate {
originalSender: message.originalSender, originalSender: message.originalSender,
isPrivate: message.isPrivate, isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname, recipientNickname: message.recipientNickname,
senderPeerID: message.senderPeerID?.id, senderPeerID: message.senderPeerID,
mentions: message.mentions, mentions: message.mentions,
deliveryStatus: message.deliveryStatus deliveryStatus: message.deliveryStatus
) )
@@ -111,7 +111,7 @@ final class PublicChatE2ETests: XCTestCase {
originalSender: message.sender, originalSender: message.sender,
isPrivate: message.isPrivate, isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname, recipientNickname: message.recipientNickname,
senderPeerID: message.senderPeerID?.id, senderPeerID: message.senderPeerID,
mentions: message.mentions mentions: message.mentions
) )
@@ -450,7 +450,7 @@ final class PublicChatE2ETests: XCTestCase {
originalSender: message.isRelay ? message.originalSender : message.sender, originalSender: message.isRelay ? message.originalSender : message.sender,
isPrivate: message.isPrivate, isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname, recipientNickname: message.recipientNickname,
senderPeerID: message.senderPeerID?.id, senderPeerID: message.senderPeerID,
mentions: message.mentions mentions: message.mentions
) )
@@ -640,7 +640,7 @@ final class IntegrationTests: XCTestCase {
originalSender: message.isRelay ? message.originalSender : message.sender, originalSender: message.isRelay ? message.originalSender : message.sender,
isPrivate: message.isPrivate, isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname, recipientNickname: message.recipientNickname,
senderPeerID: message.senderPeerID?.id, senderPeerID: message.senderPeerID,
mentions: message.mentions mentions: message.mentions
) )
+2 -2
View File
@@ -147,7 +147,7 @@ final class MockBLEService: NSObject {
originalSender: nil, originalSender: nil,
isPrivate: recipientID != nil, isPrivate: recipientID != nil,
recipientNickname: nil, recipientNickname: nil,
senderPeerID: myPeerID, senderPeerID: PeerID(str: myPeerID),
mentions: mentions.isEmpty ? nil : mentions mentions: mentions.isEmpty ? nil : mentions
) )
@@ -192,7 +192,7 @@ final class MockBLEService: NSObject {
originalSender: nil, originalSender: nil,
isPrivate: true, isPrivate: true,
recipientNickname: recipientNickname, recipientNickname: recipientNickname,
senderPeerID: myPeerID, senderPeerID: PeerID(str: myPeerID),
mentions: nil mentions: nil
) )
@@ -251,7 +251,7 @@ final class BinaryProtocolTests: XCTestCase {
originalSender: TestConstants.testNickname3, originalSender: TestConstants.testNickname3,
isPrivate: false, isPrivate: false,
recipientNickname: nil, recipientNickname: nil,
senderPeerID: TestConstants.testPeerID1.id, senderPeerID: TestConstants.testPeerID1,
mentions: nil mentions: nil
) )
+1 -1
View File
@@ -44,7 +44,7 @@ final class TestHelpers {
originalSender: nil, originalSender: nil,
isPrivate: isPrivate, isPrivate: isPrivate,
recipientNickname: recipientNickname, recipientNickname: recipientNickname,
senderPeerID: senderPeerID.id, senderPeerID: senderPeerID,
mentions: mentions mentions: mentions
) )
} }