forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKernelJournalEventHub.swift
More file actions
55 lines (46 loc) · 1.48 KB
/
Copy pathKernelJournalEventHub.swift
File metadata and controls
55 lines (46 loc) · 1.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import Foundation
/// One runtime callback, many surface projections. Runtime events are wakeups;
/// observers must range-fetch by turnSeq before mutating UI state.
@MainActor
final class KernelJournalEventHub {
static let shared = KernelJournalEventHub()
private struct Observer {
let surfaceKey: String?
let wake: @MainActor () -> Void
}
private var observers: [UUID: Observer] = [:]
private init() {}
func attach(client: AgentClient.Session) async {
await client.setJournalTurnChangedHandler { turn in
Task { @MainActor in
KernelJournalEventHub.shared.publish(turn)
}
}
}
func attach(bridge: AgentBridge) async {
await bridge.setJournalTurnChangedHandler { turn in
Task { @MainActor in
KernelJournalEventHub.shared.publish(turn)
}
}
}
func subscribe(surface: AgentSurfaceReference?, wake: @escaping @MainActor () -> Void) -> UUID {
let token = UUID()
observers[token] = Observer(surfaceKey: surface?.key, wake: wake)
return token
}
func unsubscribe(_ token: UUID?) {
guard let token else { return }
observers.removeValue(forKey: token)
}
private func publish(_ turn: KernelJournalTurn) {
let key = AgentSurfaceReference(
surfaceKind: turn.surfaceKind,
externalRefKind: turn.externalRefKind,
externalRefId: turn.externalRefId
).key
for observer in observers.values where observer.surfaceKey == nil || observer.surfaceKey == key {
observer.wake()
}
}
}