1use anyhow::Result;
2use iroh::{Endpoint, RelayMap, SecretKey, address_lookup::{dns::DnsAddressLookup, pkarr::PkarrPublisher}};
3use iroh_gossip::net::Gossip;
4
5use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId};
7
8#[tokio::main]
9async fn main() -> Result<()> {
10 let secret_key = SecretKey::generate(&mut rand::rng());
12 let signing_key = mainline::SigningKey::from_bytes(&secret_key.to_bytes());
13
14 let relay_map = iroh::RelayMap::empty();relay_map.extend(&RelayMap::from(
16 "https://iroh-relay.rustonbsd.com:8443/".parse::<iroh::RelayUrl>()?,
17 ));
18 let dns_lookup = DnsAddressLookup::builder("https://iroh-dns.rustonbsd.com/".parse()?).build();
19 let pkarr_publisher = PkarrPublisher::builder("https://iroh-relay.rustonbsd.com".parse()?).build(secret_key.clone());
20
21 let endpoint = Endpoint::builder()
23 .relay_mode(iroh::RelayMode::Custom(relay_map))
24 .address_lookup(DnsAddressLookup::n0_dns().build())
25 .address_lookup(PkarrPublisher::n0_dns().build(secret_key.clone()))
26 .address_lookup(dns_lookup)
27 .address_lookup(pkarr_publisher)
28 .secret_key(secret_key.clone())
29 .bind()
30 .await?;
31
32 let gossip = Gossip::builder().spawn(endpoint.clone());
34
35 let _router = iroh::protocol::Router::builder(endpoint.clone())
37 .accept(iroh_gossip::ALPN, gossip.clone())
38 .spawn();
39
40 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
41 let initial_secret = b"my-initial-secret".to_vec();
42
43 let record_publisher = RecordPublisher::new(
44 topic_id.clone(),
45 signing_key.verifying_key(),
46 signing_key.clone(),
47 None,
48 initial_secret,
49 );
50 let (gossip_sender, gossip_receiver) = gossip
51 .subscribe_and_join_with_auto_discovery(record_publisher)
52 .await?
53 .split()
54 .await?;
55
56 tokio::spawn(async move {
57 while let Some(Ok(event)) = gossip_receiver.next().await {
58 println!("event: {event:?}");
59 }
60 });
61
62 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
63 gossip_sender
64 .broadcast(format!("hi from {}", endpoint.id()).into())
65 .await?;
66
67 println!("[joined topic]");
68
69 tokio::time::sleep(std::time::Duration::from_secs(10)).await;
70
71 println!("[finished]");
72
73 Ok(())
76}