use axum::{ extract::{Path, State}, response::{ sse::{Event, KeepAlive}, Sse, }, routing::get, Router, }; use futures::Stream; use tokio_stream::StreamExt; use crate::{service::ServiceHandles, Error}; pub fn router() -> Router { axum::Router::new().route("/:name", get(service_events)) } pub async fn service_events( Path(name): Path, State(services): State, ) -> Result>>, Error> { let stream = services .get(&name) .ok_or_else(|| Error::ServiceNotFound(name))? .into_stream() .map(|s| match s { crate::Status::Ok => Event::default().event("ok"), crate::Status::Error(None) => Event::default().event("error"), crate::Status::Error(Some(msg)) => Event::default().event("error").data(msg), }) .map(Ok); Ok(Sse::new(stream).keep_alive(KeepAlive::default())) }