From c2db6c8af60e8eb250a2cc3279089cf2ebce4a12 Mon Sep 17 00:00:00 2001 From: dawn <90008@gaze.systems> Date: Tue, 14 Apr 2026 02:20:30 +0000 Subject: [PATCH] use multiple jetstream urls --- src/main.rs | 24 +++++++++++++++++------- 1 file(s) changed, 17 insertion(s)(+), 7 deletion(s)(-) diff --git a/src/main.rs b/src/main.rs --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,11 @@ mod resolver; const LEX: &str = "net.klbr.printer.job"; -const JETSTREAM: &str = "wss://jetstream2.fr.hose.cam"; +const JETSTREAM: [&str; 3] = [ + "wss://jetstream2.fr.hose.cam", + "wss://jetstream2.us-east.bsky.network", + "wss://jetstream2.us-west.bsky.network", +]; #[derive(Deserialize)] struct Event { @@ -91,14 +95,14 @@ resolver.resolve(did).await?; } - let mut url = format!("{JETSTREAM}/subscribe?wantedCollections={LEX}"); + let mut jetstream_query = format!("wantedCollections={LEX}"); for did in &allowed_dids { - url.push_str(&format!("&wantedDids={did}")); + jetstream_query.push_str(&format!("&wantedDids={did}")); } let (task_tx, task_rx) = mpsc::channel(16); let job_handler = tokio::task::spawn_blocking(move || handle_jobs(printer, task_rx)); - let job_stream = tokio::spawn(stream_jobs(url, task_tx, resolver)); + let job_stream = tokio::spawn(stream_jobs(jetstream_query, task_tx, resolver)); tokio::select! { r = job_stream => r.into_diagnostic().flatten(), @@ -106,11 +110,17 @@ } } -async fn stream_jobs(url: String, task_tx: TaskTx, resolver: Arc) -> Result<()> { +async fn stream_jobs(query: String, task_tx: TaskTx, resolver: Arc) -> Result<()> { + let mut jetstream_idx = 0; loop { + let jetstream = JETSTREAM[jetstream_idx]; + let url = format!("{jetstream}/subscribe?{query}"); match run_stream(&url, &task_tx, &resolver).await { - Ok(()) => tracing::warn!("jetstream disconnected, reconnecting..."), - Err(e) => tracing::warn!(err = %e, "jetstream error, reconnecting..."), + Ok(()) => tracing::warn!("{url} disconnected, reconnecting..."), + Err(e) => { + tracing::warn!(err = %e, "{url} error, reconnecting..."); + jetstream_idx = (jetstream_idx + 1) % JETSTREAM.len(); + } } tokio::time::sleep(Duration::from_secs(5)).await; } -- tangled.sh