diff options
Diffstat (limited to 'src/sse.rs')
-rw-r--r-- | src/sse.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/sse.rs b/src/sse.rs new file mode 100644 index 0000000..b4a8840 --- /dev/null +++ b/src/sse.rs @@ -0,0 +1,30 @@ +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<ServiceHandles> { + axum::Router::new().route("/:name", get(sse_handler)) +} + +pub async fn sse_handler( + Path(name): Path<String>, + State(services): State<ServiceHandles>, +) -> Result<Sse<impl Stream<Item = Result<Event, axum::Error>>>, Error> { + let stream = services + .get(&name) + .ok_or_else(|| Error::ServiceNotFound(name))? + .into_stream() + .map(|s| Event::default().json_data(s)); + + Ok(Sse::new(stream).keep_alive(KeepAlive::default())) +} |