···1pub mod consumer;
02pub mod server;
3pub mod subscriber;
4
···1pub mod consumer;
2+pub mod error;
3pub mod server;
4pub mod subscriber;
5
+23-7
spacedust/src/main.rs
···34use clap::Parser;
5use tokio::sync::broadcast;
067/// Aggregate links in the at-mosphere
8#[derive(Parser, Debug, Clone)]
···2122#[tokio::main]
23async fn main() -> Result<(), String> {
24- let args = Args::parse();
2526 // tokio broadcast keeps a single main output queue for all subscribers.
27 // each subscriber clones off a copy of an individual value for each recv.
···40 // TODO: determine if a pathological case could blow this up (eg 1MB link
41 // paths + slow subscriber -> 16GiB queue)
42 let (b, _) = broadcast::channel(16_384);
04344- let consuming = consumer::consume(b.clone(), &args.jetstream, None, args.jetstream_no_zstd);
0004546- let serving = server::serve(b);
4748- tokio::select! {
49- e = serving => eprintln!("serving failed: {e:?}"),
50- e = consuming => eprintln!("consuming failed: {e:?}"),
51- };
000000000005253 Ok(())
54}
···34use clap::Parser;
5use tokio::sync::broadcast;
6+use tokio_util::sync::CancellationToken;
78/// Aggregate links in the at-mosphere
9#[derive(Parser, Debug, Clone)]
···2223#[tokio::main]
24async fn main() -> Result<(), String> {
25+ env_logger::init();
2627 // tokio broadcast keeps a single main output queue for all subscribers.
28 // each subscriber clones off a copy of an individual value for each recv.
···41 // TODO: determine if a pathological case could blow this up (eg 1MB link
42 // paths + slow subscriber -> 16GiB queue)
43 let (b, _) = broadcast::channel(16_384);
44+ let consumer_sender = b.clone();
4546+ let shutdown = CancellationToken::new();
47+48+ let ctrlc_shutdown = shutdown.clone();
49+ ctrlc::set_handler(move || ctrlc_shutdown.cancel()).expect("failed to set ctrl-c handler");
5051+ let args = Args::parse();
5253+ let server_shutdown = shutdown.clone();
54+ let serving = tokio::spawn(async move {
55+ server::serve(b, server_shutdown).await
56+ });
57+58+ let consumer_shutdown = shutdown.clone();
59+ let consuming = tokio::spawn(async move {
60+ consumer::consume(consumer_sender, args.jetstream, None, args.jetstream_no_zstd, consumer_shutdown).await
61+ });
62+63+ let (served, consumed) = tokio::join!(serving, consuming);
64+ log::info!("serving ended: {served:?}");
65+ log::info!("consuming ended: {consumed:?}");
66+67+ log::info!("bye!");
6869 Ok(())
70}