mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 04:05:20 +00:00
Centralize PTT and voice audio-session ownership, harden courier/bridge/outbox delivery and recovery, correct location and delivery-state races, add privacy/release metadata, and ship reproducible universal Arti slices with Release CI coverage. Validated by the full iOS suite, repeated audio/fragment/performance regressions, BitFoundation tests, strict lint and dead-code analysis, universal iOS Release builds, and iOS/macOS archives.
60 lines
1.8 KiB
Swift
60 lines
1.8 KiB
Swift
import Foundation
|
|
|
|
struct BLEPendingNotification<Target> {
|
|
let data: Data
|
|
let targets: [Target]?
|
|
}
|
|
|
|
struct BLEOutboundNotificationBuffer<Target> {
|
|
enum EnqueueResult {
|
|
case enqueued(count: Int)
|
|
case full(count: Int)
|
|
}
|
|
|
|
private var notifications: [BLEPendingNotification<Target>] = []
|
|
|
|
var count: Int {
|
|
notifications.count
|
|
}
|
|
|
|
var isEmpty: Bool {
|
|
notifications.isEmpty
|
|
}
|
|
|
|
mutating func removeAll() {
|
|
notifications.removeAll()
|
|
}
|
|
|
|
mutating func enqueue(data: Data, targets: [Target]?, capCount: Int) -> EnqueueResult {
|
|
guard notifications.count < capCount else {
|
|
return .full(count: notifications.count)
|
|
}
|
|
|
|
notifications.append(BLEPendingNotification(data: data, targets: targets))
|
|
return .enqueued(count: notifications.count)
|
|
}
|
|
|
|
mutating func takeAll() -> [BLEPendingNotification<Target>] {
|
|
let pending = notifications
|
|
notifications.removeAll()
|
|
return pending
|
|
}
|
|
|
|
mutating func prepend(_ pending: [BLEPendingNotification<Target>]) {
|
|
guard !pending.isEmpty else { return }
|
|
notifications.insert(contentsOf: pending, at: 0)
|
|
}
|
|
|
|
/// Removes a disconnected target from target-specific retries. Broadcast
|
|
/// entries (`targets == nil`) remain valid for the surviving subscriber
|
|
/// set; an entry with no targets left is discarded entirely.
|
|
mutating func removeTarget(where matches: (Target) -> Bool) {
|
|
notifications = notifications.compactMap { notification in
|
|
guard let targets = notification.targets else { return notification }
|
|
let remaining = targets.filter { !matches($0) }
|
|
guard !remaining.isEmpty else { return nil }
|
|
return BLEPendingNotification(data: notification.data, targets: remaining)
|
|
}
|
|
}
|
|
}
|