Skip to main content

hitt_sse/
lib.rs

1use futures::StreamExt;
2use reqwest_eventsource::EventSource;
3use tokio::sync::mpsc::{UnboundedSender, error::SendError};
4
5pub type Error = reqwest_eventsource::Error;
6
7#[derive(Debug)]
8pub enum Event {
9    Open,
10    Message(String),
11    Error(Box<Error>),
12}
13
14#[inline]
15pub async fn start_sse(
16    url: reqwest::Url,
17    tx: UnboundedSender<Event>,
18) -> Result<(), SendError<Event>> {
19    let mut ev = EventSource::get(url);
20
21    while let Some(event) = ev.next().await {
22        match event {
23            Ok(reqwest_eventsource::Event::Open) => tx.send(Event::Open),
24            Ok(reqwest_eventsource::Event::Message(m)) => tx.send(Event::Message(m.data)),
25            Err(error) => tx.send(Event::Error(Box::new(error))),
26        }?;
27    }
28
29    ev.close();
30
31    Ok(())
32}