From 7ec84857eb03e629aca9fa6f9b9c9452b0c273de Mon Sep 17 00:00:00 2001 From: Islam <2553451+qalandarov@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:26:17 +0100 Subject: [PATCH] =?UTF-8?q?PeerID=2020/n:=20`BLEService`=E2=80=99s=20priva?= =?UTF-8?q?te=20functions=20(#771)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bitchat/Services/BLEService.swift | 142 +++++++++--------- .../Fragmentation/FragmentationTests.swift | 10 +- 2 files changed, 73 insertions(+), 79 deletions(-) diff --git a/bitchat/Services/BLEService.swift b/bitchat/Services/BLEService.swift index 056b2c88..bc9e8130 100644 --- a/bitchat/Services/BLEService.swift +++ b/bitchat/Services/BLEService.swift @@ -549,7 +549,7 @@ final class BLEService: NSObject { } func triggerHandshake(with peerID: PeerID) { - initiateNoiseHandshake(with: peerID.id) + initiateNoiseHandshake(with: peerID) } func getNoiseService() -> NoiseEncryptionService { @@ -604,7 +604,7 @@ final class BLEService: NSObject { guard let self = self else { return } self.pendingNoisePayloadsAfterHandshake[peerID, default: []].append(payload) } - if !noiseService.hasSession(with: peerID) { initiateNoiseHandshake(with: peerID.id) } + if !noiseService.hasSession(with: peerID) { initiateNoiseHandshake(with: peerID) } SecureLogger.debug("🕒 Queued READ receipt for \(peerID) until handshake completes", category: .session) } } @@ -656,7 +656,7 @@ final class BLEService: NSObject { guard let self = self else { return } self.pendingNoisePayloadsAfterHandshake[peerID, default: []].append(payload) } - if !noiseService.hasSession(with: peerID) { initiateNoiseHandshake(with: peerID.id) } + if !noiseService.hasSession(with: peerID) { initiateNoiseHandshake(with: peerID) } SecureLogger.debug("🕒 Queued DELIVERED ack for \(peerID) until handshake completes", category: .session) } } @@ -665,12 +665,12 @@ final class BLEService: NSObject { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) { let payload = VerificationService.shared.buildVerifyChallenge(noiseKeyHex: noiseKeyHex, nonceA: nonceA) - sendNoisePayload(payload, to: peerID.id) + sendNoisePayload(payload, to: peerID) } func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) { guard let payload = VerificationService.shared.buildVerifyResponse(noiseKeyHex: noiseKeyHex, nonceA: nonceA) else { return } - sendNoisePayload(payload, to: peerID.id) + sendNoisePayload(payload, to: peerID) } } @@ -686,9 +686,9 @@ extension BLEService: GossipSyncManager.Delegate { func sendPacket(to peerID: PeerID, packet: BitchatPacket) { if DispatchQueue.getSpecific(key: messageQueueKey) != nil { - sendPacketDirected(packet, to: peerID.id) + sendPacketDirected(packet, to: peerID) } else { - messageQueue.async { [weak self] in self?.sendPacketDirected(packet, to: peerID.id) } + messageQueue.async { [weak self] in self?.sendPacketDirected(packet, to: peerID) } } } @@ -939,8 +939,8 @@ func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeriph // Get current peer list (after removal) let currentPeerIDs = self.collectionsQueue.sync { self.currentPeerIDs } - if let peerID = peerID { - self.notifyPeerDisconnectedDebounced(peerID.id) + if let peerID { + self.notifyPeerDisconnectedDebounced(peerID) } self.requestPeerDataPublish() self.delegate?.didUpdatePeerList(currentPeerIDs) @@ -1034,14 +1034,14 @@ extension BLEService { #if DEBUG // Test-only helper to inject packets into the receive pipeline extension BLEService { - func _test_handlePacket(_ packet: BitchatPacket, fromPeerID: String) { + func _test_handlePacket(_ packet: BitchatPacket, fromPeerID: PeerID) { // Ensure the synthetic peer is known and marked verified for public-message tests let normalizedID = PeerID(hexData: packet.senderID) collectionsQueue.sync(flags: .barrier) { if peers[normalizedID] == nil { peers[normalizedID] = PeerInfo( peerID: normalizedID, - nickname: "TestPeer_\(fromPeerID.prefix(4))", + nickname: "TestPeer_\(fromPeerID.id.prefix(4))", isConnected: true, noisePublicKey: packet.senderID, signingPublicKey: nil, @@ -1218,13 +1218,13 @@ extension BLEService: CBPeripheralDelegate { collectionsQueue.async(flags: .barrier) { [weak self] in self?.ingressByMessageID[msgID] = (.peripheral(peripheralUUID), Date()) } - handleReceivedPacket(packet, from: senderID.id) + handleReceivedPacket(packet, from: senderID) } else { let msgID = makeMessageID(for: packet) collectionsQueue.async(flags: .barrier) { [weak self] in self?.ingressByMessageID[msgID] = (.peripheral(peripheralUUID), Date()) } - handleReceivedPacket(packet, from: senderID.id) + handleReceivedPacket(packet, from: senderID) } } @@ -1360,7 +1360,7 @@ extension BLEService: CBPeripheralManagerDelegate { // Get current peer list (after removal) let currentPeerIDs = self.collectionsQueue.sync { self.currentPeerIDs } - self.notifyPeerDisconnectedDebounced(peerID.id) + self.notifyPeerDisconnectedDebounced(peerID) // Publish snapshots so UnifiedPeerService can refresh icons promptly self.requestPeerDataPublish() self.delegate?.didUpdatePeerList(currentPeerIDs) @@ -1460,7 +1460,7 @@ extension BLEService: CBPeripheralManagerDelegate { if let packet = BinaryProtocol.decode(combined) { // Clear buffer on success pendingWriteBuffers.removeValue(forKey: centralUUID) - let senderID = packet.senderID.hexEncodedString() + let senderID = PeerID(hexData: packet.senderID) if packet.type != MessageType.announce.rawValue { SecureLogger.debug("📦 Decoded (combined) packet type: \(packet.type) from sender: \(senderID)", category: .session) } @@ -1468,7 +1468,7 @@ extension BLEService: CBPeripheralManagerDelegate { subscribedCentrals.append(sorted[0].central) } if packet.type == MessageType.announce.rawValue { - if packet.ttl == messageTTL { centralToPeerID[centralUUID] = PeerID(str: senderID) } + if packet.ttl == messageTTL { centralToPeerID[centralUUID] = senderID } // Record ingress link for last-hop suppression then process let msgID = makeMessageID(for: packet) collectionsQueue.async(flags: .barrier) { [weak self] in @@ -1527,6 +1527,7 @@ extension BLEService { private func configureNoiseServiceCallbacks(for service: NoiseEncryptionService) { service.onPeerAuthenticated = { [weak self] peerID, fingerprint in + let peerID = PeerID(str: peerID) SecureLogger.debug("🔐 Noise session authenticated with \(peerID), fingerprint: \(fingerprint.prefix(16))...") self?.messageQueue.async { [weak self] in self?.sendPendingMessagesAfterHandshake(for: peerID) @@ -1552,18 +1553,18 @@ extension BLEService { gossipSyncManager = sync } - private func sendNoisePayload(_ typedPayload: Data, to peerID: String) { - guard noiseService.hasSession(with: PeerID(str: peerID)) else { + private func sendNoisePayload(_ typedPayload: Data, to peerID: PeerID) { + guard noiseService.hasSession(with: peerID) else { // Lazy-handshake path: queue? For now, initiate handshake and drop initiateNoiseHandshake(with: peerID) return } do { - let encrypted = try noiseService.encrypt(typedPayload, for: PeerID(str: peerID)) + let encrypted = try noiseService.encrypt(typedPayload, for: peerID) let packet = BitchatPacket( type: MessageType.noiseEncrypted.rawValue, senderID: myPeerIDData, - recipientID: Data(hexString: peerID), + recipientID: Data(hexString: peerID.id), timestamp: UInt64(Date().timeIntervalSince1970 * 1000), payload: encrypted, signature: nil, @@ -1801,7 +1802,7 @@ extension BLEService { pendingMessagesAfterHandshake[recipientID]?.append((content, messageID)) } - initiateNoiseHandshake(with: recipientID.id) + initiateNoiseHandshake(with: recipientID) // Notify delegate that message is pending notifyUI { [weak self] in @@ -1810,18 +1811,18 @@ extension BLEService { } } - private func initiateNoiseHandshake(with peerID: String) { + private func initiateNoiseHandshake(with peerID: PeerID) { // Use NoiseEncryptionService for handshake - guard !noiseService.hasSession(with: PeerID(str: peerID)) else { return } + guard !noiseService.hasSession(with: peerID) else { return } do { - let handshakeData = try noiseService.initiateHandshake(with: PeerID(str: peerID)) + let handshakeData = try noiseService.initiateHandshake(with: peerID) // Send handshake init let packet = BitchatPacket( type: MessageType.noiseHandshake.rawValue, senderID: myPeerIDData, - recipientID: Data(hexString: peerID), + recipientID: Data(hexString: peerID.id), timestamp: UInt64(Date().timeIntervalSince1970 * 1000), payload: handshakeData, signature: nil, @@ -1840,8 +1841,7 @@ extension BLEService { } } - private func sendPendingMessagesAfterHandshake(for peerID: String) { - let peerID = PeerID(str: peerID) + private func sendPendingMessagesAfterHandshake(for peerID: PeerID) { // Get and clear pending messages for this peer let pendingMessages = collectionsQueue.sync(flags: .barrier) { () -> [(content: String, messageID: String)]? in let messages = pendingMessagesAfterHandshake[peerID] @@ -1946,13 +1946,13 @@ extension BLEService { if let pm = peripheralMaxLen, data.count > pm { let overhead = 13 + 8 + 8 + 13 let chunk = max(64, pm - overhead) - sendFragmentedPacket(packet, pad: pad, maxChunk: chunk, directedOnlyPeer: recipientPeerID.id) + sendFragmentedPacket(packet, pad: pad, maxChunk: chunk, directedOnlyPeer: recipientPeerID) return } if let cm = centralMaxLen, data.count > cm { let overhead = 13 + 8 + 8 + 13 let chunk = max(64, cm - overhead) - sendFragmentedPacket(packet, pad: pad, maxChunk: chunk, directedOnlyPeer: recipientPeerID.id) + sendFragmentedPacket(packet, pad: pad, maxChunk: chunk, directedOnlyPeer: recipientPeerID) return } @@ -1983,7 +1983,7 @@ extension BLEService { if !sentEncrypted { // Flood as last resort with recipient set; link aware - sendOnAllLinks(packet: packet, data: data, pad: pad, directedOnlyPeer: recipientPeerID.id) + sendOnAllLinks(packet: packet, data: data, pad: pad, directedOnlyPeer: recipientPeerID) } } @@ -1991,14 +1991,14 @@ extension BLEService { sendOnAllLinks(packet: packet, data: data, pad: pad, directedOnlyPeer: nil) } - private func sendOnAllLinks(packet: BitchatPacket, data: Data, pad: Bool, directedOnlyPeer: String?) { + private func sendOnAllLinks(packet: BitchatPacket, data: Data, pad: Bool, directedOnlyPeer: PeerID?) { // Determine last-hop link for this message to avoid echoing back let messageID = makeMessageID(for: packet) let ingressLink: LinkID? = collectionsQueue.sync { ingressByMessageID[messageID]?.link } - let directedPeerHint: String? = { + let directedPeerHint: PeerID? = { if let explicit = directedOnlyPeer { return explicit } if let recipient = packet.recipientID?.hexEncodedString(), !recipient.isEmpty { - return recipient + return PeerID(str: recipient) } return nil }() @@ -2090,14 +2090,13 @@ extension BLEService { } // Directed send helper (unicast to a specific peerID) without altering packet contents - private func sendPacketDirected(_ packet: BitchatPacket, to peerID: String) { + private func sendPacketDirected(_ packet: BitchatPacket, to peerID: PeerID) { guard let data = packet.toBinaryData(padding: false) else { return } sendOnAllLinks(packet: packet, data: data, pad: false, directedOnlyPeer: peerID) } // MARK: Directed store-and-forward - private func spoolDirectedPacket(_ packet: BitchatPacket, recipientPeerID: String) { - let recipientPeerID = PeerID(str: recipientPeerID) + private func spoolDirectedPacket(_ packet: BitchatPacket, recipientPeerID: PeerID) { let msgID = makeMessageID(for: packet) collectionsQueue.async(flags: .barrier) { [weak self] in guard let self = self else { return } @@ -2162,7 +2161,7 @@ extension BLEService { // MARK: Fragmentation (Required for messages > BLE MTU) - private func sendFragmentedPacket(_ packet: BitchatPacket, pad: Bool, maxChunk: Int? = nil, directedOnlyPeer: String? = nil) { + private func sendFragmentedPacket(_ packet: BitchatPacket, pad: Bool, maxChunk: Int? = nil, directedOnlyPeer: PeerID? = nil) { guard let fullData = packet.toBinaryData(padding: pad) else { return } // Fragment the unpadded frame; each fragment will be encoded independently @@ -2197,7 +2196,7 @@ extension BLEService { // Choose recipient for the fragment: directed override if provided let fragmentRecipient: Data? = { - if let only = directedOnlyPeer { return Data(hexString: only) } + if let only = directedOnlyPeer { return Data(hexString: only.id) } return packet.recipientID }() @@ -2219,7 +2218,7 @@ extension BLEService { } } - private func handleFragment(_ packet: BitchatPacket, from peerID: String) { + private func handleFragment(_ packet: BitchatPacket, from peerID: PeerID) { // Don't process our own fragments if peerID == myPeerID { return @@ -2288,9 +2287,9 @@ extension BLEService { // MARK: Packet Reception - private func handleReceivedPacket(_ packet: BitchatPacket, from peerID: String) { + private func handleReceivedPacket(_ packet: BitchatPacket, from peerID: PeerID) { // Deduplication (thread-safe) - let senderID = packet.senderID.hexEncodedString() + let senderID = PeerID(hexData: packet.senderID) // Include packet type in message ID to prevent collisions between different packet types let messageID = "\(senderID)-\(packet.timestamp)-\(packet.type)" @@ -2403,8 +2402,7 @@ extension BLEService { } } - private func handleAnnounce(_ packet: BitchatPacket, from peerID: String) { - let peerID = PeerID(str: peerID) + private func handleAnnounce(_ packet: BitchatPacket, from peerID: PeerID) { guard let announcement = AnnouncementPacket.decode(from: packet.payload) else { SecureLogger.error("❌ Failed to decode announce packet from \(peerID)", category: .session) return @@ -2595,17 +2593,17 @@ extension BLEService { } // Handle REQUEST_SYNC: decode payload and respond with missing packets via sync manager - private func handleRequestSync(_ packet: BitchatPacket, from peerID: String) { + private func handleRequestSync(_ packet: BitchatPacket, from peerID: PeerID) { guard let req = RequestSyncPacket.decode(from: packet.payload) else { SecureLogger.warning("⚠️ Malformed REQUEST_SYNC from \(peerID)", category: .session) return } - gossipSyncManager?.handleRequestSync(from: PeerID(str: peerID), request: req) + gossipSyncManager?.handleRequestSync(from: peerID, request: req) } // Mention parsing moved to ChatViewModel - private func handleMessage(_ packet: BitchatPacket, from peerID: String) { + private func handleMessage(_ packet: BitchatPacket, from peerID: PeerID) { // Ignore self-origin public messages except when returned via sync (TTL==0). // This allows our own messages to be surfaced when they come back via // the sync path without re-processing regular relayed copies. @@ -2625,7 +2623,7 @@ extension BLEService { if nowMs >= ageThresholdMs { let cutoffMs = nowMs - ageThresholdMs if packet.timestamp < cutoffMs { - SecureLogger.debug("⏰ Ignoring stale broadcast message from \(peerID.prefix(8))… (age: \(Double(nowMs - packet.timestamp) / 1000.0)s)", category: .session) + SecureLogger.debug("⏰ Ignoring stale broadcast message from \(peerID.id.prefix(8))… (age: \(Double(nowMs - packet.timestamp) / 1000.0)s)", category: .session) return } } @@ -2639,20 +2637,20 @@ extension BLEService { accepted = true senderNickname = myNickname } - else if let info = peers[PeerID(str: peerID)], info.isVerifiedNickname { + else if let info = peers[peerID], info.isVerifiedNickname { // Known verified peer path accepted = true senderNickname = info.nickname // Handle nickname collisions let hasCollision = peers.values.contains { $0.isConnected && $0.nickname == info.nickname && $0.peerID != peerID } || (myNickname == info.nickname) if hasCollision { - senderNickname += "#" + String(peerID.prefix(4)) + senderNickname += "#" + String(peerID.id.prefix(4)) } } else { // Fallback: verify signature using persisted signing key for this peerID's fingerprint prefix if let signature = packet.signature, let packetData = packet.toBinaryDataForSigning() { // Find candidate identities by peerID prefix (16 hex) - let candidates = identityManager.getCryptoIdentitiesByPeerIDPrefix(PeerID(str: peerID)) + let candidates = identityManager.getCryptoIdentitiesByPeerIDPrefix(peerID) for candidate in candidates { if let signingKey = candidate.signingPublicKey, noiseService.verifySignature(signature, for: packetData, publicKey: signingKey) { @@ -2661,7 +2659,7 @@ extension BLEService { if let social = identityManager.getSocialIdentity(for: candidate.fingerprint) { senderNickname = social.localPetname ?? social.claimedNickname } else { - senderNickname = "anon" + String(peerID.prefix(4)) + senderNickname = "anon" + String(peerID.id.prefix(4)) } break } @@ -2672,7 +2670,7 @@ extension BLEService { // peers we haven't verified yet. if !accepted && packet.ttl == 0 { accepted = true - senderNickname = "anon" + String(peerID.prefix(4)) + senderNickname = "anon" + String(peerID.id.prefix(4)) } } @@ -2686,7 +2684,7 @@ extension BLEService { } guard accepted else { - SecureLogger.warning("🚫 Dropping public message from unverified or unknown peer \(peerID.prefix(8))…", category: .security) + SecureLogger.warning("🚫 Dropping public message from unverified or unknown peer \(peerID.id.prefix(8))…", category: .security) return } @@ -2696,9 +2694,9 @@ extension BLEService { } // Determine if we have a direct link to the sender let hasDirectLink: Bool = collectionsQueue.sync { - let perUUID = peerToPeripheralUUID[PeerID(str: peerID)] + let perUUID = peerToPeripheralUUID[peerID] let perConnected = perUUID != nil && peripherals[perUUID!]?.isConnected == true - let hasCentral = centralToPeerID.values.contains(PeerID(str: peerID)) + let hasCentral = centralToPeerID.values.contains(peerID) return perConnected || hasCentral } @@ -2707,22 +2705,22 @@ extension BLEService { let ts = Date(timeIntervalSince1970: Double(packet.timestamp) / 1000) notifyUI { [weak self] in - self?.delegate?.didReceivePublicMessage(from: PeerID(str: peerID), nickname: senderNickname, content: content, timestamp: ts) + self?.delegate?.didReceivePublicMessage(from: peerID, nickname: senderNickname, content: content, timestamp: ts) } } - private func handleNoiseHandshake(_ packet: BitchatPacket, from peerID: String) { + private func handleNoiseHandshake(_ packet: BitchatPacket, from peerID: PeerID) { // Use NoiseEncryptionService for handshake processing if let recipientID = packet.recipientID, recipientID.hexEncodedString() == myPeerID { // Handshake is for us do { - if let response = try noiseService.processHandshakeMessage(from: PeerID(str: peerID), message: packet.payload) { + if let response = try noiseService.processHandshakeMessage(from: peerID, message: packet.payload) { // Send response let responsePacket = BitchatPacket( type: MessageType.noiseHandshake.rawValue, senderID: myPeerIDData, - recipientID: Data(hexString: peerID), + recipientID: Data(hexString: peerID.id), timestamp: UInt64(Date().timeIntervalSince1970 * 1000), payload: response, signature: nil, @@ -2737,15 +2735,14 @@ extension BLEService { } catch { SecureLogger.error("Failed to process handshake: \(error)") // Try initiating a new handshake - if !noiseService.hasSession(with: PeerID(str: peerID)) { + if !noiseService.hasSession(with: peerID) { initiateNoiseHandshake(with: peerID) } } } } - private func handleNoiseEncrypted(_ packet: BitchatPacket, from peerID: String) { - let peerID = PeerID(str: peerID) + private func handleNoiseEncrypted(_ packet: BitchatPacket, from peerID: PeerID) { SecureLogger.debug("🔐 handleNoiseEncrypted called for packet from \(peerID)") guard let recipientID = packet.recipientID else { @@ -2760,7 +2757,7 @@ extension BLEService { } // Update lastSeen for the peer we received from (important for private messages) - updatePeerLastSeen(peerID.id) + updatePeerLastSeen(peerID) do { let decrypted = try noiseService.decrypt(packet.payload, from: peerID) @@ -2804,20 +2801,20 @@ extension BLEService { // Trigger a handshake so future messages can be decrypted. SecureLogger.debug("🔑 Encrypted message from \(peerID) without session; initiating handshake") if !noiseService.hasSession(with: peerID) { - initiateNoiseHandshake(with: peerID.id) + initiateNoiseHandshake(with: peerID) } } catch { SecureLogger.error("❌ Failed to decrypt message from \(peerID): \(error)") } } - private func handleLeave(_ packet: BitchatPacket, from peerID: String) { + private func handleLeave(_ packet: BitchatPacket, from peerID: PeerID) { _ = collectionsQueue.sync(flags: .barrier) { // Remove the peer when they leave - peers.removeValue(forKey: PeerID(str: peerID)) + peers.removeValue(forKey: peerID) } // Remove any stored announcement for sync purposes - gossipSyncManager?.removeAnnouncementForPeer(PeerID(str: peerID)) + gossipSyncManager?.removeAnnouncementForPeer(peerID) // Send on main thread notifyUI { [weak self] in guard let self = self else { return } @@ -2825,7 +2822,7 @@ extension BLEService { // Get current peer list (after removal) let currentPeerIDs = self.collectionsQueue.sync { self.currentPeerIDs } - self.delegate?.didDisconnectFromPeer(PeerID(str: peerID)) + self.delegate?.didDisconnectFromPeer(peerID) self.delegate?.didUpdatePeerList(currentPeerIDs) } } @@ -2903,8 +2900,7 @@ extension BLEService { gossipSyncManager?.onPublicPacketSeen(signedPacket) } - private func sendPendingNoisePayloadsAfterHandshake(for peerID: String) { - let peerID = PeerID(str: peerID) + private func sendPendingNoisePayloadsAfterHandshake(for peerID: PeerID) { let payloads = collectionsQueue.sync(flags: .barrier) { () -> [Data] in let list = pendingNoisePayloadsAfterHandshake[peerID] ?? [] pendingNoisePayloadsAfterHandshake.removeValue(forKey: peerID) @@ -2931,8 +2927,7 @@ extension BLEService { } } - private func updatePeerLastSeen(_ peerID: String) { - let peerID = PeerID(str: peerID) + private func updatePeerLastSeen(_ peerID: PeerID) { // Use async to avoid deadlock - we don't need immediate consistency for last seen updates collectionsQueue.async(flags: .barrier) { if var peer = self.peers[peerID] { @@ -2943,9 +2938,8 @@ extension BLEService { } // Debounced disconnect notifier to avoid duplicate disconnect callbacks within a short window - private func notifyPeerDisconnectedDebounced(_ peerID: String) { + private func notifyPeerDisconnectedDebounced(_ peerID: PeerID) { let now = Date() - let peerID = PeerID(str: peerID) let last = recentDisconnectNotifies[peerID] if last == nil || now.timeIntervalSince(last!) >= TransportConfig.bleDisconnectNotifyDebounceSeconds { delegate?.didDisconnectFromPeer(peerID) diff --git a/bitchatTests/Fragmentation/FragmentationTests.swift b/bitchatTests/Fragmentation/FragmentationTests.swift index bdfb82fa..7a3260f0 100644 --- a/bitchatTests/Fragmentation/FragmentationTests.swift +++ b/bitchatTests/Fragmentation/FragmentationTests.swift @@ -28,7 +28,7 @@ struct FragmentationTests { ble.delegate = capture // Construct a big packet (3KB) from a remote sender (not our own ID) - let remoteShortID = "1122334455667788" + let remoteShortID: PeerID = "1122334455667788" let original = makeLargePublicPacket(senderShortHex: remoteShortID, size: 3_000) // Use a small fragment size to ensure multiple pieces @@ -59,7 +59,7 @@ struct FragmentationTests { let capture = CaptureDelegate() ble.delegate = capture - let remoteShortID = "A1B2C3D4E5F60708" + let remoteShortID: PeerID = "A1B2C3D4E5F60708" let original = makeLargePublicPacket(senderShortHex: remoteShortID, size: 2048) var frags = fragmentPacket(original, fragmentSize: 300) @@ -89,7 +89,7 @@ struct FragmentationTests { let capture = CaptureDelegate() ble.delegate = capture - let remoteShortID = "0011223344556677" + let remoteShortID: PeerID = "0011223344556677" let original = makeLargePublicPacket(senderShortHex: remoteShortID, size: 1000) let fragments = fragmentPacket(original, fragmentSize: 250) @@ -143,12 +143,12 @@ extension FragmentationTests { } // Helper: build a large message packet (unencrypted public message) - private func makeLargePublicPacket(senderShortHex: String, size: Int) -> BitchatPacket { + private func makeLargePublicPacket(senderShortHex: PeerID, size: Int) -> BitchatPacket { let content = String(repeating: "A", count: size) let payload = Data(content.utf8) let pkt = BitchatPacket( type: MessageType.message.rawValue, - senderID: Data(hexString: senderShortHex) ?? Data(), + senderID: Data(hexString: senderShortHex.id) ?? Data(), recipientID: nil, timestamp: UInt64(Date().timeIntervalSince1970 * 1000), payload: payload,