···2use std::path::PathBuf;
3use std::time::{Duration, Instant};
40005use jetstream::{
6 events::{commit::CommitEvent, JetstreamEvent::Commit},
7 DefaultJetstreamEndpoints, JetstreamCompression, JetstreamConfig, JetstreamConnector,
···30 ..Default::default()
31 };
3200000000000000033 let jetstream: JetstreamConnector<serde_json::Value> = JetstreamConnector::new(config)?;
34 let receiver = jetstream.connect().await?;
35···3738 let print_throttle = Duration::from_millis(400);
39 let mut last = Instant::now();
40- while let Ok(event) = receiver.recv_async().await {
41- if let Commit(CommitEvent::Create { commit, .. }) = event {
42- let now = Instant::now();
43- let since = now - last;
44- if since >= print_throttle {
45- let overshoot = since - print_throttle; // adjust to keep the rate on average
46- last = now - overshoot;
47- println!(
48- "{}: {}",
49- &*commit.info.collection,
50- serde_json::to_string(&commit.record)?
51- );
000000000000000052 }
53 }
54 }
···2use std::path::PathBuf;
3use std::time::{Duration, Instant};
45+use tokio::select;
6+use tokio_util::sync::CancellationToken;
7+8use jetstream::{
9 events::{commit::CommitEvent, JetstreamEvent::Commit},
10 DefaultJetstreamEndpoints, JetstreamCompression, JetstreamConfig, JetstreamConnector,
···33 ..Default::default()
34 };
3536+ let stay_alive = CancellationToken::new();
37+38+ ctrlc::set_handler({
39+ let mut desperation: u8 = 0;
40+ let stay_alive = stay_alive.clone();
41+ move || match desperation {
42+ 0 => {
43+ println!("ok, signalling shutdown...");
44+ stay_alive.cancel();
45+ desperation += 1;
46+ }
47+ 1.. => panic!("fine, panicking!"),
48+ }
49+ })?;
50+51 let jetstream: JetstreamConnector<serde_json::Value> = JetstreamConnector::new(config)?;
52 let receiver = jetstream.connect().await?;
53···5556 let print_throttle = Duration::from_millis(400);
57 let mut last = Instant::now();
58+ loop {
59+ select! {
60+ _ = stay_alive.cancelled() => {
61+ eprintln!("byeeee");
62+ break
63+ }
64+ ev = receiver.recv_async() => {
65+ match ev {
66+ Ok(event) => {
67+ if let Commit(CommitEvent::Create { commit, .. }) = event {
68+ let now = Instant::now();
69+ let since = now - last;
70+ if since >= print_throttle {
71+ let overshoot = since - print_throttle; // adjust to keep the rate on average
72+ last = now - overshoot;
73+ println!(
74+ "{}: {}",
75+ &*commit.info.collection,
76+ serde_json::to_string(&commit.record)?
77+ );
78+ }
79+ }
80+ },
81+ Err(e) => {
82+ eprintln!("jetstream event error: {e:?}");
83+ break
84+ }
85+ }
86 }
87 }
88 }