simple/
simple.rs

1use anyhow::Result;
2use iroh::{Endpoint, SecretKey};
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(rand::rngs::OsRng);
12
13    // Set up endpoint with discovery enabled
14    let endpoint = Endpoint::builder()
15        .secret_key(secret_key.clone())
16        .discovery_n0()
17        .bind()
18        .await?;
19
20    // Initialize gossip with auto-discovery
21    let gossip = Gossip::builder().spawn(endpoint.clone());
22
23    // Set up protocol router
24    let _router = iroh::protocol::Router::builder(endpoint.clone())
25        .accept(iroh_gossip::ALPN, gossip.clone())
26        .spawn();
27
28    let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
29    let initial_secret = b"my-initial-secret".to_vec();
30
31    // Split into sink (sending) and stream (receiving)
32
33    let record_publisher = RecordPublisher::new(
34        topic_id.clone(),
35        endpoint.node_id().public(),
36        secret_key.secret().clone(),
37        None,
38        initial_secret,
39    );
40
41    let topic = gossip
42        .subscribe_and_join_with_auto_discovery(record_publisher)
43        .await?;
44
45    println!("[joined topic]");
46
47    // Do something with the gossip topic
48    // (bonus: GossipSender and GossipReceiver are safely clonable)
49    let (_gossip_sender, _gossip_receiver) = topic.split().await?;
50
51    Ok(())
52}