use std::convert::Infallible; use axum::{ extract::{Path, State}, response::{ sse::{Event, KeepAlive}, Sse, }, routing::get, Router, }; use futures::Stream; use tokio_stream::StreamExt; use crate::{AppState, Error}; pub fn router() -> Router { axum::Router::new() .route("/", get(events)) .route("/:name", get(service_events)) } pub async fn events( State(state): State, ) -> Result>>, Error> { let stream = state.streams().map(|(name, status)| { let data = serde_json::to_string(&status)?; Ok(Event::default().event(name).data(data)) }); Ok(Sse::new(stream).keep_alive(KeepAlive::default())) } pub async fn service_events( Path(name): Path, State(state): State, ) -> Result>>, Error> { let stream = state .stream(&name) .ok_or_else(|| Error::ServiceNotFound(name))? .map(Event::from) .map(Ok); Ok(Sse::new(stream).keep_alive(KeepAlive::default())) }