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}