use libp2p::futures::StreamExt;
use tokio_stream::wrappers::WatchStream;
use tracing::error;
mod handle_shoji_command;
mod handle_swarm_event;
use crate::Satellite;
impl Satellite {
pub async fn run(mut self) -> ! {
let mut event_stream = WatchStream::new(self.event_watcher.clone());
loop {
tokio::select! {
Some(event) = self.swarm.0.next() => {
if let Err(e) = self.handle_swarm_event(event) {
error!("Handling swarm events failed: {}", e);
}
}
Some(command) = self.shoji_command_reciever.recv() => {
if let Err(e) = self.handle_shoji_command(command) {
error!("Handling shoji's commands failed: {}", e);
}
}
Some(event) = event_stream.next() => {
self.config.modules.iter().for_each(|module| {
let res = module.lock();
match res {
Ok(mut module) => {
module.on_events(
event.clone(),
&self
);
},
Err(e) => {
error!("Module mutex was poisoned: {}", e);
},
}
})
}
}
}
}
}