Skip to main content

vv_agent/sdk/session/
events.rs

1use 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}