spinta 0.1.1

Server-sent events client that works natively and on the web (WASM)
Documentation
use crate::{EsEvent, EventHandler, Result};
use eventsource_client::{Client, SSE};
use futures::StreamExt;

pub fn es_connect(url: String, on_event: EventHandler) -> Result<()> {
    tokio::spawn(async move {
        es_connect_async(url.clone(), on_event).await;
    });

    Ok(())
}

async fn es_connect_async(url: String, on_event: EventHandler) {
    let client = match eventsource_client::ClientBuilder::for_url(&url) {
        Ok(res) => res.build(),
        Err(err) => {
            on_event(EsEvent::Error(err.source().unwrap().to_string()));
            return;
        }
    };

    let stream = client.stream();

    let reader = stream.for_each(move |event| {
        match event {
            Ok(message) => match message {
                SSE::Event(ev) => {
                    on_event(EsEvent::Message(ev.data));
                    println!("got an event: {}", ev.event_type);
                }
                SSE::Comment(comment) => {
                    println!("got a comment: \n{}", comment);
                }
            },
            Err(err) => {
                on_event(EsEvent::Error(format!("error streaming events: {:?}", err)));
            }
        }
        async {}
    });

    futures_util::pin_mut!(reader);
    reader.await;
}