1use anyhow::Result;
2use iroh::{
3 Endpoint, SecretKey,
4};
5use iroh_gossip::net::Gossip;
6
7use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId};
9
10#[tokio::main]
11async fn main() -> Result<()> {
12 let secret_key = SecretKey::generate(&mut rand::rng());
14 let signing_key = mainline::SigningKey::from_bytes(&secret_key.to_bytes());
15
16 let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
18 .secret_key(secret_key.clone())
19 .bind()
20 .await?;
21
22 let gossip = Gossip::builder().spawn(endpoint.clone());
24
25 let _router = iroh::protocol::Router::builder(endpoint.clone())
27 .accept(iroh_gossip::ALPN, gossip.clone())
28 .spawn();
29
30 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
31 let initial_secret = b"my-initial-secret".to_vec();
32
33 let record_publisher = RecordPublisher::new(
34 topic_id.clone(),
35 signing_key.verifying_key(),
36 signing_key.clone(),
37 None,
38 initial_secret,
39 );
40 let (gossip_sender, gossip_receiver) = gossip
41 .subscribe_and_join_with_auto_discovery(record_publisher)
42 .await?
43 .split()
44 .await?;
45
46 tokio::spawn(async move {
47 while let Some(Ok(event)) = gossip_receiver.next().await {
48 println!("event: {event:?}");
49 }
50 });
51
52 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
53 gossip_sender
54 .broadcast(format!("hi from {}", endpoint.id()).into())
55 .await?;
56
57 println!("[joined topic]");
58
59 tokio::time::sleep(std::time::Duration::from_secs(10)).await;
60
61 println!("[finished]");
62
63 Ok(())
66}