mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 23:05:20 +00:00
Periphery 3.7.4 audit of both schemes (macOS + iOS, intersected so platform-specific code is never touched), with test targets indexed and the share extension built. 277 dead declarations removed or demoted: dead forwarding wrappers (ChatViewModel+Nostr/+PrivateChat), removed- feature remnants (autocomplete command suggestions, back-swipe tuning, MediaSendError, GeohashParticipantTracker), unused Tor dormancy bindings, assign-only properties, unused parameters (renamed to _), and redundant public accessibility. 13 orphaned localization keys deleted across all 29 locales (old pre-#1392 location-notes UI, app_info warnings). Two real tests were flagged as unused because they never ran: Swift Testing methods missing @Test (NostrProtocolTests. testAckRoundTripNIP44V2_Delivered, NotificationStreamAssemblerTests. testAssemblesCompressedLargeFrame). Re-armed both; they pass. Deliberately kept, now recorded in .periphery.baseline.json: iOS-only code invisible to the CI macOS scan, C FFI signatures, keep-alive NWPathMonitor reference, InboundEventKey.eventID (dedup semantics), wifiBulk capability bit (reserved for Wi-Fi bulk work, used by BitFoundation package tests), and the String secureClear cluster (exercised by package tests). New: .periphery.yml config and an advisory Dead Code CI job (mirrors the SwiftLint precedent from #1361) that fails on findings not in the committed baseline. Verified: full macOS app suite, BitFoundation (119) and BitLogger (13) package tests green; periphery scan --strict exits clean. Co-authored-by: jack <jackjackbits@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
118 lines
3.6 KiB
Swift
118 lines
3.6 KiB
Swift
import BitFoundation
|
|
import Combine
|
|
import Foundation
|
|
|
|
@MainActor
|
|
final class PeerIdentityStore: ObservableObject {
|
|
@Published private(set) var encryptionStatuses: [PeerID: EncryptionStatus] = [:]
|
|
@Published private(set) var verifiedFingerprints: Set<String> = []
|
|
|
|
private(set) var peerFingerprintsByPeerID: [PeerID: String] = [:]
|
|
private(set) var selectedPrivateChatFingerprint: String?
|
|
|
|
private var stablePeerIDsByShortID: [PeerID: PeerID] = [:]
|
|
private var encryptionStatusCache: [PeerID: EncryptionStatus] = [:]
|
|
|
|
func stablePeerID(forShortID peerID: PeerID) -> PeerID? {
|
|
stablePeerIDsByShortID[peerID]
|
|
}
|
|
|
|
func shortPeerID(forStablePeerID stablePeerID: PeerID) -> PeerID? {
|
|
stablePeerIDsByShortID.first(where: { $0.value == stablePeerID })?.key
|
|
}
|
|
|
|
func setStablePeerID(_ stablePeerID: PeerID, forShortID peerID: PeerID) {
|
|
stablePeerIDsByShortID[peerID] = stablePeerID
|
|
}
|
|
|
|
func fingerprint(for peerID: PeerID) -> String? {
|
|
peerFingerprintsByPeerID[peerID]
|
|
}
|
|
|
|
func setFingerprint(_ fingerprint: String?, for peerID: PeerID) {
|
|
if let fingerprint {
|
|
peerFingerprintsByPeerID[peerID] = fingerprint
|
|
} else {
|
|
peerFingerprintsByPeerID.removeValue(forKey: peerID)
|
|
}
|
|
}
|
|
|
|
func replaceFingerprintMappings(_ mappings: [PeerID: String]) {
|
|
peerFingerprintsByPeerID = mappings
|
|
}
|
|
|
|
@discardableResult
|
|
func migrateFingerprintMapping(
|
|
from oldPeerID: PeerID,
|
|
to newPeerID: PeerID,
|
|
fallback: String? = nil
|
|
) -> String? {
|
|
let fingerprint = peerFingerprintsByPeerID.removeValue(forKey: oldPeerID) ?? fallback
|
|
if let fingerprint {
|
|
peerFingerprintsByPeerID[newPeerID] = fingerprint
|
|
if selectedPrivateChatFingerprint == nil {
|
|
selectedPrivateChatFingerprint = fingerprint
|
|
}
|
|
}
|
|
return fingerprint
|
|
}
|
|
|
|
func setSelectedPrivateChatFingerprint(_ fingerprint: String?) {
|
|
selectedPrivateChatFingerprint = fingerprint
|
|
}
|
|
|
|
func cachedEncryptionStatus(for peerID: PeerID) -> EncryptionStatus? {
|
|
encryptionStatusCache[peerID]
|
|
}
|
|
|
|
func setCachedEncryptionStatus(_ status: EncryptionStatus, for peerID: PeerID) {
|
|
encryptionStatusCache[peerID] = status
|
|
}
|
|
|
|
func invalidateEncryptionCache(for peerID: PeerID? = nil) {
|
|
if let peerID {
|
|
encryptionStatusCache.removeValue(forKey: peerID)
|
|
} else {
|
|
encryptionStatusCache.removeAll()
|
|
}
|
|
}
|
|
|
|
func encryptionStatus(for peerID: PeerID) -> EncryptionStatus? {
|
|
encryptionStatuses[peerID]
|
|
}
|
|
|
|
func setEncryptionStatus(_ status: EncryptionStatus?, for peerID: PeerID) {
|
|
if let status {
|
|
encryptionStatuses[peerID] = status
|
|
} else {
|
|
encryptionStatuses.removeValue(forKey: peerID)
|
|
}
|
|
invalidateEncryptionCache(for: peerID)
|
|
}
|
|
|
|
func setVerifiedFingerprints(_ fingerprints: Set<String>) {
|
|
verifiedFingerprints = fingerprints
|
|
}
|
|
|
|
func setVerified(_ fingerprint: String, verified: Bool) {
|
|
if verified {
|
|
verifiedFingerprints.insert(fingerprint)
|
|
} else {
|
|
verifiedFingerprints.remove(fingerprint)
|
|
}
|
|
}
|
|
|
|
func isVerified(_ fingerprint: String) -> Bool {
|
|
verifiedFingerprints.contains(fingerprint)
|
|
}
|
|
|
|
func clearAll() {
|
|
encryptionStatuses.removeAll()
|
|
verifiedFingerprints.removeAll()
|
|
peerFingerprintsByPeerID.removeAll()
|
|
selectedPrivateChatFingerprint = nil
|
|
stablePeerIDsByShortID.removeAll()
|
|
encryptionStatusCache.removeAll()
|
|
}
|
|
}
|