use std::sync::Arc;
use kameo::{
actor::{ActorRef, Spawn},
message::Message,
};
use kameo_actors::message_bus::{MessageBus, Publish, Register};
use tokio::sync::watch;
use crate::{Error, error::ResultExt};
#[derive(Clone)]
pub struct Env {
pub bus: ActorRef<MessageBus>,
pub keys: Arc<ts_keys::NodeState>,
pub shutdown: watch::Receiver<bool>,
}
impl Env {
pub fn new(keys: ts_keys::NodeState, shutdown: watch::Receiver<bool>) -> Self {
Self {
bus: MessageBus::spawn_default(),
keys: Arc::new(keys),
shutdown,
}
}
pub async fn subscribe<M>(&self, slf: &ActorRef<impl Message<M>>) -> Result<(), Error>
where
M: Clone + Send + 'static,
{
self.bus
.tell(Register(slf.clone().recipient::<M>()))
.await
.with_actor_info(&self.bus)?;
Ok(())
}
pub async fn publish<M>(&self, msg: M) -> Result<(), Error>
where
M: Clone + Send + 'static,
{
self.bus
.tell(Publish(msg))
.await
.with_actor_info(&self.bus)?;
Ok(())
}
}