Skip to main content

custom_relay_discovery/
custom_relay_discovery.rs

1use anyhow::Result;
2use ed25519_dalek::SigningKey;
3use iroh::{Endpoint, RelayMap, SecretKey, address_lookup::{dns::DnsAddressLookup, pkarr::PkarrPublisher}};
4use iroh_gossip::net::Gossip;
5
6// Imports from distrubuted-topic-tracker
7use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId};
8
9#[tokio::main]
10async fn main() -> Result<()> {
11    // Generate a new random secret key
12    let secret_key = SecretKey::generate(&mut rand::rng());
13    let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
14
15    // Set up endpoint with custom discovery enabled
16    let relay_map = iroh::RelayMap::empty();//iroh::defaults::prod::default_relay_map();
17    relay_map.extend(&RelayMap::from(
18        "https://iroh-relay.rustonbsd.com:8443/".parse::<iroh::RelayUrl>()?,
19    ));
20    let dns_lookup = DnsAddressLookup::builder("https://iroh-dns.rustonbsd.com/".parse()?).build();
21    let pkarr_publisher = PkarrPublisher::builder("https://iroh-relay.rustonbsd.com".parse()?).build(secret_key.clone());
22
23    let endpoint = Endpoint::builder()
24        .relay_mode(iroh::RelayMode::Custom(relay_map))
25        //.address_lookup(DnsAddressLookup::n0_dns().build())
26        //.address_lookup(PkarrPublisher::n0_dns().build(secret_key.clone()))
27        .address_lookup(dns_lookup)
28        .address_lookup(pkarr_publisher)
29        .secret_key(secret_key.clone())
30        .bind()
31        .await?;
32
33    // Initialize gossip with auto-discovery
34    let gossip = Gossip::builder().spawn(endpoint.clone());
35
36    // Set up protocol router
37    let _router = iroh::protocol::Router::builder(endpoint.clone())
38        .accept(iroh_gossip::ALPN, gossip.clone())
39        .spawn();
40
41    let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
42    let initial_secret = b"my-initial-secret".to_vec();
43
44    // Split into sink (sending) and stream (receiving)
45
46    let record_publisher = RecordPublisher::new(
47        topic_id.clone(),
48        signing_key.verifying_key(),
49        signing_key.clone(),
50        None,
51        initial_secret,
52    );
53
54    let topic = gossip
55        .subscribe_and_join_with_auto_discovery(record_publisher)
56        .await?;
57
58    println!("[joined topic]");
59
60    // Do something with the gossip topic
61    // (bonus: GossipSender and GossipReceiver are safely clonable)
62    let (_gossip_sender, _gossip_receiver) = topic.split().await?;
63
64    Ok(())
65}