mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-24 23:25:19 +00:00
Announces now carry an optional capabilities TLV (0x05): a little-endian bitfield with named bits for upcoming features (prekeys, wifiBulk, gateway, groups, board, vouch, meshDiagnostics). Old clients skip the unknown TLV; peers without it decode as nil so features can distinguish "legacy peer" from "advertises nothing". PeerCapabilities lives in BitFoundation with a minimal-length encoding that preserves unknown bits for forward compatibility. Peer capabilities are stored in the BLE peer registry on verified announce and exposed via BLEService.peerCapabilities(_:). The local advertisement set is empty until each feature ships its bit. Co-authored-by: jack <jackjackbits@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
44 lines
1.6 KiB
Swift
44 lines
1.6 KiB
Swift
//
|
|
// PeerCapabilitiesTests.swift
|
|
// bitchatTests
|
|
//
|
|
// This is free and unencumbered software released into the public domain.
|
|
// For more information, see <https://unlicense.org>
|
|
//
|
|
|
|
import Testing
|
|
import Foundation
|
|
@testable import BitFoundation
|
|
|
|
struct PeerCapabilitiesTests {
|
|
@Test
|
|
func encodingIsMinimalAndRoundTrips() {
|
|
#expect(PeerCapabilities([]).encoded() == Data([0x00]))
|
|
#expect(PeerCapabilities.prekeys.encoded() == Data([0x01]))
|
|
#expect(PeerCapabilities.meshDiagnostics.encoded() == Data([0x40]))
|
|
|
|
let high = PeerCapabilities(rawValue: 1 << 9)
|
|
#expect(high.encoded() == Data([0x00, 0x02]))
|
|
|
|
let all: PeerCapabilities = [.prekeys, .wifiBulk, .gateway, .groups, .board, .vouch, .meshDiagnostics]
|
|
#expect(PeerCapabilities(encoded: all.encoded()) == all)
|
|
#expect(PeerCapabilities(encoded: high.encoded()) == high)
|
|
#expect(PeerCapabilities(encoded: PeerCapabilities([]).encoded()) == [])
|
|
}
|
|
|
|
@Test
|
|
func decodingToleratesUnknownBitsAndOversizedFields() {
|
|
// Unknown bits survive a round-trip untouched.
|
|
let unknown = PeerCapabilities(encoded: Data([0xFF, 0xFF]))
|
|
#expect(unknown.rawValue == 0xFFFF)
|
|
#expect(unknown.contains(.gateway))
|
|
|
|
// Fields longer than 8 bytes keep the low 64 bits and ignore the rest.
|
|
let oversized = Data([0x01] + [UInt8](repeating: 0x00, count: 7) + [0xAA, 0xBB])
|
|
#expect(PeerCapabilities(encoded: oversized) == .prekeys)
|
|
|
|
// Empty value decodes to no capabilities.
|
|
#expect(PeerCapabilities(encoded: Data()) == [])
|
|
}
|
|
}
|