use std::sync::Arc;
use tracing::warn;
use crate::loop_::AgentEvent;
use super::{Agent, SubscriptionId};
impl Agent {
pub fn subscribe(
&mut self,
callback: impl Fn(&AgentEvent) + Send + Sync + 'static,
) -> SubscriptionId {
self.listeners.subscribe(callback)
}
pub fn unsubscribe(&mut self, id: SubscriptionId) -> bool {
self.listeners.unsubscribe(id)
}
pub(super) fn dispatch_event(&mut self, event: &AgentEvent) {
self.listeners.dispatch(event);
for forwarder in &self.event_forwarders {
let guarded = std::panic::AssertUnwindSafe(|| forwarder(event.clone()));
if let Err(error) = std::panic::catch_unwind(guarded) {
warn!("event forwarder panicked: {error:?}");
}
}
}
pub fn add_event_forwarder(&mut self, f: impl Fn(AgentEvent) + Send + Sync + 'static) {
self.event_forwarders.push(Arc::new(f));
}
pub fn forward_event(&mut self, event: &AgentEvent) {
self.dispatch_event(event);
}
pub fn emit(&mut self, name: impl Into<String>, payload: serde_json::Value) {
let event = AgentEvent::Custom(crate::emit::Emission::new(name, payload));
self.dispatch_event(&event);
}
}