vv_agent/sdk/session/
events.rs1use std::collections::BTreeMap;
2use std::sync::{Arc, Mutex};
3
4use serde_json::Value;
5
6use super::state::{SessionEventHandler, SessionListenerId};
7use super::AgentSession;
8
9pub(super) fn emit_session_event(
10 listeners: &Arc<Mutex<BTreeMap<SessionListenerId, SessionEventHandler>>>,
11 event: &str,
12 payload: BTreeMap<String, Value>,
13) {
14 let listeners: Vec<SessionEventHandler> = listeners
15 .lock()
16 .expect("session listeners lock")
17 .values()
18 .cloned()
19 .collect();
20 for listener in listeners {
21 listener(event, &payload);
22 }
23}
24
25impl AgentSession {
26 pub fn subscribe(&mut self, listener: SessionEventHandler) -> SessionListenerId {
27 let listener_id = self.next_listener_id;
28 self.next_listener_id = self.next_listener_id.saturating_add(1);
29 self.listeners
30 .lock()
31 .expect("session listeners lock")
32 .insert(listener_id, listener);
33 listener_id
34 }
35
36 pub fn unsubscribe(&mut self, listener_id: SessionListenerId) -> bool {
37 self.listeners
38 .lock()
39 .expect("session listeners lock")
40 .remove(&listener_id)
41 .is_some()
42 }
43
44 pub(super) fn emit(&self, event: &str, payload: BTreeMap<String, Value>) {
45 emit_session_event(&self.listeners, event, payload);
46 }
47}