mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 09:25:19 +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>
81 lines
1.9 KiB
Swift
81 lines
1.9 KiB
Swift
import BitFoundation
|
|
import Combine
|
|
import Foundation
|
|
|
|
enum SharedContentKind: String, Sendable, Equatable {
|
|
case text
|
|
case url
|
|
}
|
|
|
|
enum RuntimeScenePhase: String, Sendable, Equatable {
|
|
case active
|
|
case inactive
|
|
case background
|
|
}
|
|
|
|
enum TorLifecycleEvent: String, Sendable, Equatable {
|
|
case willStart
|
|
case willRestart
|
|
case didBecomeReady
|
|
case preferenceChanged
|
|
}
|
|
|
|
enum AppEvent: Sendable, Equatable {
|
|
case launched
|
|
case startupCompleted
|
|
case scenePhaseChanged(RuntimeScenePhase)
|
|
case openedURL(String)
|
|
case sharedContentAccepted(SharedContentKind)
|
|
case notificationOpened(peerID: PeerID?)
|
|
case deepLinkOpened(String)
|
|
case torLifecycleChanged(TorLifecycleEvent)
|
|
case nostrRelayConnectionChanged(Bool)
|
|
case terminationRequested
|
|
}
|
|
|
|
actor AppEventStream {
|
|
private var continuations: [UUID: AsyncStream<AppEvent>.Continuation] = [:]
|
|
|
|
func emit(_ event: AppEvent) {
|
|
for continuation in continuations.values {
|
|
continuation.yield(event)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/// Identity key for a direct conversation. Equality and hashing use the
|
|
/// canonical `id` only; `routingPeerID` carries the transport-level peer ID
|
|
/// the conversation is keyed under (see `ConversationID.directPeer`).
|
|
struct PeerHandle: Sendable, Identifiable {
|
|
let id: String
|
|
let routingPeerID: PeerID
|
|
}
|
|
|
|
extension PeerHandle: Equatable {
|
|
static func == (lhs: PeerHandle, rhs: PeerHandle) -> Bool {
|
|
lhs.id == rhs.id
|
|
}
|
|
}
|
|
|
|
extension PeerHandle: Hashable {
|
|
func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
}
|
|
}
|
|
|
|
enum ConversationID: Hashable, Sendable {
|
|
case mesh
|
|
case geohash(String)
|
|
case direct(PeerHandle)
|
|
|
|
init(channelID: ChannelID) {
|
|
switch channelID {
|
|
case .mesh:
|
|
self = .mesh
|
|
case .location(let channel):
|
|
self = .geohash(channel.geohash.lowercased())
|
|
}
|
|
}
|
|
}
|