···11+use clap::Parser;
22+use std::path::PathBuf;
33+use std::time::{Duration, Instant};
44+55+use jetstream::{
66+ events::{commit::CommitEvent, JetstreamEvent::Commit},
77+ DefaultJetstreamEndpoints, JetstreamCompression, JetstreamConfig, JetstreamConnector,
88+};
99+1010+/// Aggregate links in the at-mosphere
1111+#[derive(Parser, Debug)]
1212+#[command(version, about, long_about = None)]
1313+struct Args {
1414+ /// Jetstream server to connect to (exclusive with --fixture). Provide either a wss:// URL, or a shorhand value:
1515+ /// 'us-east-1', 'us-east-2', 'us-west-1', or 'us-west-2'
1616+ #[arg(long)]
1717+ jetstream: String,
1818+ /// Location to store persist data to disk
1919+ #[arg(long)]
2020+ data: PathBuf,
2121+}
2222+2323+#[tokio::main]
2424+async fn main() -> anyhow::Result<()> {
2525+ let args = Args::parse();
2626+2727+ let config: JetstreamConfig<serde_json::Value> = JetstreamConfig {
2828+ endpoint: DefaultJetstreamEndpoints::endpoint_or_shortcut(&args.jetstream),
2929+ compression: JetstreamCompression::Zstd,
3030+ ..Default::default()
3131+ };
3232+3333+ let jetstream: JetstreamConnector<serde_json::Value> = JetstreamConnector::new(config)?;
3434+ let receiver = jetstream.connect().await?;
3535+3636+ println!("Jetstream ready");
3737+3838+ let print_throttle = Duration::from_millis(400);
3939+ let mut last = Instant::now();
4040+ while let Ok(event) = receiver.recv_async().await {
4141+ if let Commit(CommitEvent::Create { commit, .. }) = event {
4242+ let now = Instant::now();
4343+ let since = now - last;
4444+ if since >= print_throttle {
4545+ let overshoot = since - print_throttle; // adjust to keep the rate on average
4646+ last = now - overshoot;
4747+ println!(
4848+ "{}: {}",
4949+ &*commit.info.collection,
5050+ serde_json::to_string(&commit.record)?
5151+ );
5252+ }
5353+ }
5454+ }
5555+5656+ Ok(())
5757+}