Files
openclaw/apps/macos/Sources/OpenClaw/HeartbeatStore.swift

40 lines
1.0 KiB
Swift
Raw Normal View History

2025-12-08 20:17:38 +01:00
import Foundation
import Observation
2025-12-08 20:17:38 +01:00
import SwiftUI
@MainActor
@Observable
final class HeartbeatStore {
2025-12-08 20:17:38 +01:00
static let shared = HeartbeatStore()
private(set) var lastEvent: ControlHeartbeatEvent?
2025-12-08 20:17:38 +01:00
private var observer: NSObjectProtocol?
private init() {
self.observer = NotificationCenter.default.addObserver(
forName: .controlHeartbeat,
2025-12-08 20:17:38 +01:00
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 }
2025-12-08 20:17:38 +01:00
}
}
Task {
if self.lastEvent == nil {
if let evt = try? await ControlChannel.shared.lastHeartbeat() {
self.lastEvent = evt
}
}
}
2025-12-08 20:17:38 +01:00
}
@MainActor
deinit {
if let observer { NotificationCenter.default.removeObserver(observer) }
}
}