1use anyhow::Result;
2use iroh::{Endpoint, SecretKey};
3use iroh_gossip::net::Gossip;
4
5use distributed_topic_tracker::{
7 TopicId, AutoDiscoveryGossip, RecordPublisher,
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.clone())
18 .discovery_n0()
19 .bind()
20 .await?;
21
22 let gossip = Gossip::builder()
24 .spawn(endpoint.clone());
25
26 let _router = iroh::protocol::Router::builder(endpoint.clone())
28 .accept(iroh_gossip::ALPN, gossip.clone())
29 .spawn();
30
31 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
32 let initial_secret = b"my-initial-secret".to_vec();
33
34 let record_publisher = RecordPublisher::new(
35 topic_id.clone(),
36 endpoint.node_id().public(),
37 secret_key.secret().clone(),
38 None,
39 initial_secret,
40 );
41 let (gossip_sender, gossip_receiver) = gossip
42 .subscribe_and_join_with_auto_discovery(record_publisher)
43 .await?
44 .split().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
53 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
54 gossip_sender.broadcast(format!("hi from {}",endpoint.node_id()).into()).await?;
55
56 println!("[joined topic]");
57
58 tokio::time::sleep(std::time::Duration::from_secs(10)).await;
59
60 println!("[finished]");
61
62 Ok(())
65}