Constellation, Spacedust, Slingshot, UFOs: atproto crates and services for microcosm

shutdown setup

i don't think jetstream is quite doing graceful disconnect messages yet but

Changed files
+50 -12
ufos
+2
Cargo.lock
···
dependencies = [
"anyhow",
"clap",
"jetstream",
"serde_json",
"tokio",
]
[[package]]
···
dependencies = [
"anyhow",
"clap",
+
"ctrlc",
"jetstream",
"serde_json",
"tokio",
+
"tokio-util",
]
[[package]]
+2
ufos/Cargo.toml
···
[dependencies]
anyhow = "1.0.97"
clap = { version = "4.5.31", features = ["derive"] }
jetstream = { path = "../jetstream" }
serde_json = "1.0.140"
tokio = { version = "1.43.0", features = ["full", "sync", "time"] }
···
[dependencies]
anyhow = "1.0.97"
clap = { version = "4.5.31", features = ["derive"] }
+
ctrlc = "3.4.5"
jetstream = { path = "../jetstream" }
serde_json = "1.0.140"
tokio = { version = "1.43.0", features = ["full", "sync", "time"] }
+
tokio-util = "0.7.13"
+46 -12
ufos/src/main.rs
···
use std::path::PathBuf;
use std::time::{Duration, Instant};
use jetstream::{
events::{commit::CommitEvent, JetstreamEvent::Commit},
DefaultJetstreamEndpoints, JetstreamCompression, JetstreamConfig, JetstreamConnector,
···
..Default::default()
};
let jetstream: JetstreamConnector<serde_json::Value> = JetstreamConnector::new(config)?;
let receiver = jetstream.connect().await?;
···
let print_throttle = Duration::from_millis(400);
let mut last = Instant::now();
-
while let Ok(event) = receiver.recv_async().await {
-
if let Commit(CommitEvent::Create { commit, .. }) = event {
-
let now = Instant::now();
-
let since = now - last;
-
if since >= print_throttle {
-
let overshoot = since - print_throttle; // adjust to keep the rate on average
-
last = now - overshoot;
-
println!(
-
"{}: {}",
-
&*commit.info.collection,
-
serde_json::to_string(&commit.record)?
-
);
}
}
}
···
use std::path::PathBuf;
use std::time::{Duration, Instant};
+
use tokio::select;
+
use tokio_util::sync::CancellationToken;
+
use jetstream::{
events::{commit::CommitEvent, JetstreamEvent::Commit},
DefaultJetstreamEndpoints, JetstreamCompression, JetstreamConfig, JetstreamConnector,
···
..Default::default()
};
+
let stay_alive = CancellationToken::new();
+
+
ctrlc::set_handler({
+
let mut desperation: u8 = 0;
+
let stay_alive = stay_alive.clone();
+
move || match desperation {
+
0 => {
+
println!("ok, signalling shutdown...");
+
stay_alive.cancel();
+
desperation += 1;
+
}
+
1.. => panic!("fine, panicking!"),
+
}
+
})?;
+
let jetstream: JetstreamConnector<serde_json::Value> = JetstreamConnector::new(config)?;
let receiver = jetstream.connect().await?;
···
let print_throttle = Duration::from_millis(400);
let mut last = Instant::now();
+
loop {
+
select! {
+
_ = stay_alive.cancelled() => {
+
eprintln!("byeeee");
+
break
+
}
+
ev = receiver.recv_async() => {
+
match ev {
+
Ok(event) => {
+
if let Commit(CommitEvent::Create { commit, .. }) = event {
+
let now = Instant::now();
+
let since = now - last;
+
if since >= print_throttle {
+
let overshoot = since - print_throttle; // adjust to keep the rate on average
+
last = now - overshoot;
+
println!(
+
"{}: {}",
+
&*commit.info.collection,
+
serde_json::to_string(&commit.record)?
+
);
+
}
+
}
+
},
+
Err(e) => {
+
eprintln!("jetstream event error: {e:?}");
+
break
+
}
+
}
}
}
}
ufos/src/serialize.rs

This is a binary file and will not be displayed.