summaryrefslogtreecommitdiffstats
path: root/src/api/sse.rs
blob: 4fe0bf41aa7d119e83a1a76df1ad287f72b3f3d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use std::convert::Infallible;

use axum::{
    extract::{Path, State},
    response::{
        sse::{Event, KeepAlive},
        Sse,
    },
    routing::get,
    Router,
};
use futures::{Stream, StreamExt};

use crate::{AppState, Error};

pub fn router() -> Router<AppState> {
    axum::Router::new()
        .route("/", get(events))
        .route("/:name", get(service_events))
}

pub async fn events(
    State(state): State<AppState>,
) -> Result<Sse<impl Stream<Item = Result<Event, Error>>>, 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<String>,
    State(state): State<AppState>,
) -> Result<Sse<impl Stream<Item = Result<Event, Infallible>>>, 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()))
}