40 lines
1.0 KiB
Swift
40 lines
1.0 KiB
Swift
import Foundation
|
|
import Observation
|
|
import SwiftUI
|
|
|
|
@MainActor
|
|
@Observable
|
|
final class HeartbeatStore {
|
|
static let shared = HeartbeatStore()
|
|
|
|
private(set) var lastEvent: ControlHeartbeatEvent?
|
|
|
|
private var observer: NSObjectProtocol?
|
|
|
|
private init() {
|
|
self.observer = NotificationCenter.default.addObserver(
|
|
forName: .controlHeartbeat,
|
|
object: nil,
|
|
queue: .main)
|
|
{ [weak self] note in
|
|
guard let data = note.object as? Data else { return }
|
|
if let decoded = try? JSONDecoder().decode(ControlHeartbeatEvent.self, from: data) {
|
|
Task { @MainActor in self?.lastEvent = decoded }
|
|
}
|
|
}
|
|
|
|
Task {
|
|
if self.lastEvent == nil {
|
|
if let evt = try? await ControlChannel.shared.lastHeartbeat() {
|
|
self.lastEvent = evt
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
deinit {
|
|
if let observer { NotificationCenter.default.removeObserver(observer) }
|
|
}
|
|
}
|