1use anyhow::Result;
2use iroh::{Endpoint, SecretKey};
3use iroh_gossip::net::Gossip;
4
5use distributed_topic_tracker::{
7 AutoDiscoveryBuilder, AutoDiscoveryGossip, DefaultSecretRotation, TopicId
8};
9
10#[tokio::main]
11async fn main() -> Result<()> {
12 let secret_key = SecretKey::generate(rand::rngs::OsRng);
14
15 let endpoint = Endpoint::builder()
17 .secret_key(secret_key)
18 .discovery_n0()
19 .bind()
20 .await?;
21
22 let gossip = Gossip::builder()
24 .spawn_with_auto_discovery::<DefaultSecretRotation>(endpoint.clone(), None)
25 .await?;
26
27 let _router = iroh::protocol::Router::builder(endpoint.clone())
29 .accept(iroh_gossip::ALPN, gossip.gossip.clone())
30 .spawn();
31
32 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
33 let initial_secret = b"my-initial-secret".to_vec();
34
35 let (tx,mut rx) = gossip
37 .subscribe_and_join_with_auto_discovery(topic_id, initial_secret)
38 .await?.split();
39
40 tokio::spawn(async move {
41 let mut rx = rx.subscribe().await.unwrap();
42 while let Ok(event) = rx.recv().await {
43 println!("{event:?}");
44 }
45 });
46
47
48 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
49 tx.broadcast(format!("hi from {}",endpoint.node_id()).into()).await?;
50
51
52 println!("[joined topic]");
54
55 tokio::time::sleep(std::time::Duration::from_secs(10)).await;
56
57 println!("[finished]");
58
59 Ok(())
62}