Skip to main content

simple/
simple.rs

1use anyhow::Result;
2use ed25519_dalek::SigningKey;
3use iroh::{Endpoint, SecretKey};
4use iroh_gossip::net::Gossip;
5
6// Imports from distributed-topic-tracker
7use distributed_topic_tracker::{AutoDiscoveryGossip, Config, RecordPublisher, TopicId};
8
9#[tokio::main]
10async fn main() -> Result<()> {
11    // Generate a new random secret key
12    let secret_key = SecretKey::generate();
13    let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
14
15    // Set up endpoint with discovery enabled
16    let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
17        .secret_key(secret_key.clone())
18        .bind()
19        .await?;
20
21    // Initialize gossip with auto-discovery
22    let gossip = Gossip::builder().spawn(endpoint.clone());
23
24    // Set up protocol router
25    let _router = iroh::protocol::Router::builder(endpoint.clone())
26        .accept(iroh_gossip::ALPN, gossip.clone())
27        .spawn();
28
29    let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
30    let initial_secret = b"my-initial-secret".to_vec();
31
32    let record_publisher = RecordPublisher::new(
33        topic_id.clone(),
34        signing_key.clone(),
35        None,
36        initial_secret,
37        Config::default(),
38    );
39
40    let topic = gossip
41        .subscribe_and_join_with_auto_discovery(record_publisher)
42        .await?;
43
44    println!("[joined topic]");
45
46    // Do something with the gossip topic
47    // (bonus: GossipSender and GossipReceiver are safely clonable)
48    let (_gossip_sender, _gossip_receiver) = topic.split().await?;
49
50    Ok(())
51}