Expand description

Trillium tools for server sent events

This primarily provides SseConnExt, an extension trait for trillium::Conn that has a with_sse_stream chainable method that takes a Stream where the Item implements Eventable.

Often, you will want this stream to be something like a channel, but the specifics of that are dependent on the event fanout characteristics of your application.

This crate implements Eventable for an Event type that you can use in your application, for String, and for &'static str. You can also implement Eventable for any type in your application.

Example usage

use broadcaster::BroadcastChannel;
use trillium::{conn_try, conn_unwrap, log_error, Conn, Method, State};
use trillium_sse::SseConnExt;
use trillium_static_compiled::static_compiled;

type Channel = BroadcastChannel<String>;

fn get_sse(mut conn: Conn) -> Conn {
    let broadcaster = conn_unwrap!(conn.take_state::<Channel>(), conn);
    conn.with_sse_stream(broadcaster)
}

async fn post_broadcast(mut conn: Conn) -> Conn {
    let broadcaster = conn_unwrap!(conn.take_state::<Channel>(), conn);
    let body = conn_try!(conn.request_body_string().await, conn);
    log_error!(broadcaster.send(&body).await);
    conn.ok("sent")
}

fn main() {
    let handler = (
        static_compiled!("examples/static").with_index_file("index.html"),
        State::new(Channel::new()),
        |conn: Conn| async move {
            match (conn.method(), conn.path()) {
                (Method::Get, "/sse") => get_sse(conn),
                (Method::Post, "/broadcast") => post_broadcast(conn).await,
                _ => conn,
            }
        },
    );

    // trillium_smol::run(handler);
}

Structs

Events are a concrete implementation of the Eventable trait.

Traits

A trait that allows any Unpin + Send + Sync type to act as an event.

Extension trait for server sent events