Skip to main content

e2e_test/
e2e_test.rs

1use anyhow::Result;
2use iroh::{Endpoint, RelayMap, SecretKey, address_lookup::{dns::DnsAddressLookup, pkarr::PkarrPublisher}};
3use iroh_gossip::net::Gossip;
4
5// Imports from distrubuted-topic-tracker
6use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId};
7
8#[tokio::main]
9async fn main() -> Result<()> {
10    // Generate a new random secret key
11    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();//iroh::defaults::prod::default_relay_map();
15    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    // Set up endpoint with address lookup enabled
22    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    // Initialize gossip with auto-discovery
33    let gossip = Gossip::builder().spawn(endpoint.clone());
34
35    // Set up protocol router
36    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    // successfully joined
74    // exit with code 0
75    Ok(())
76}