vv-agent 0.1.3

VectorVein agent runtime, SDK, CLI, tools, and workspace backends
Documentation
use std::collections::BTreeMap;
use std::sync::{Arc, Mutex};

use serde_json::Value;

use super::state::{SessionEventHandler, SessionListenerId};
use super::AgentSession;

pub(super) fn emit_session_event(
    listeners: &Arc<Mutex<BTreeMap<SessionListenerId, SessionEventHandler>>>,
    event: &str,
    payload: BTreeMap<String, Value>,
) {
    let listeners: Vec<SessionEventHandler> = listeners
        .lock()
        .expect("session listeners lock")
        .values()
        .cloned()
        .collect();
    for listener in listeners {
        listener(event, &payload);
    }
}

impl AgentSession {
    pub fn subscribe(&mut self, listener: SessionEventHandler) -> SessionListenerId {
        let listener_id = self.next_listener_id;
        self.next_listener_id = self.next_listener_id.saturating_add(1);
        self.listeners
            .lock()
            .expect("session listeners lock")
            .insert(listener_id, listener);
        listener_id
    }

    pub fn unsubscribe(&mut self, listener_id: SessionListenerId) -> bool {
        self.listeners
            .lock()
            .expect("session listeners lock")
            .remove(&listener_id)
            .is_some()
    }

    pub(super) fn emit(&self, event: &str, payload: BTreeMap<String, Value>) {
        emit_session_event(&self.listeners, event, payload);
    }
}