chat_no_wait/
chat_no_wait.rs

1use anyhow::Result;
2use iroh::{Endpoint, SecretKey};
3use iroh_gossip::{api::Event, net::Gossip};
4
5// Imports from distrubuted-topic-tracker
6use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId};
7use mainline::SigningKey;
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 discovery enabled
16    let endpoint = Endpoint::builder()
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.verifying_key(),
35        signing_key.clone(),
36        None,
37        initial_secret,
38    );
39    let (gossip_sender, gossip_receiver) = gossip
40        .subscribe_and_join_with_auto_discovery_no_wait(record_publisher)
41        .await?
42        .split()
43        .await?;
44
45    println!("Joined topic");
46
47    // Spawn listener for incoming messages
48    tokio::spawn(async move {
49        while let Some(Ok(event)) = gossip_receiver.next().await {
50            if let Event::Received(msg) = event {
51                println!(
52                    "\nMessage from {}: {}",
53                    &msg.delivered_from.to_string()[0..8],
54                    String::from_utf8(msg.content.to_vec()).unwrap()
55                );
56            } else if let Event::NeighborUp(peer) = event {
57                println!("\nJoined by {}", &peer.to_string()[0..8]);
58            }
59        }
60    });
61
62    // Main input loop for sending messages
63    let mut buffer = String::new();
64    let stdin = std::io::stdin();
65    loop {
66        print!("\n> ");
67        stdin.read_line(&mut buffer).unwrap();
68        gossip_sender
69            .broadcast(buffer.clone().replace("\n", "").into())
70            .await
71            .unwrap();
72        println!(" - (sent)");
73        buffer.clear();
74    }
75}