use futures::{Stream, TryStreamExt};
use std::{env, process, time::Duration};
use eventsource_client as es;
#[tokio::main]
async fn main() -> Result<(), es::Error> {
env_logger::init();
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
eprintln!("Please pass args: <url> <auth_hdr>");
process::exit(1);
}
let url = &args[1];
let auth_header = &args[2];
let client = es::ClientBuilder::for_url(url)?
.header("Authorization", auth_header)?
.reconnect(
es::ReconnectOptions::reconnect(true)
.retry_initial(false)
.delay(Duration::from_secs(1))
.backoff_factor(2)
.delay_max(Duration::from_secs(60))
.build(),
)
.build();
let mut stream = tail_events(client);
while let Ok(Some(_)) = stream.try_next().await {}
Ok(())
}
fn tail_events(client: impl es::Client) -> impl Stream<Item = Result<(), ()>> {
client
.stream()
.map_ok(|event| match event {
es::SSE::Connected(connection) => {
println!("got connected: \nstatus={}", connection.response().status())
}
es::SSE::Event(ev) => {
println!("got an event: {}\n{}", ev.event_type, ev.data)
}
es::SSE::Comment(comment) => {
println!("got a comment: \n{}", comment)
}
})
.map_err(|err| eprintln!("error streaming events: {:?}", err))
}