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};
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
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    let record_publisher = RecordPublisher::new(
32        topic_id.clone(),
33        endpoint.node_id().public(),
34        secret_key.secret().clone(),
35        None,
36        initial_secret,
37    );
38    let (gossip_sender, gossip_receiver) = gossip
39        .subscribe_and_join_with_auto_discovery_no_wait(record_publisher)
40        .await?
41        .split()
42        .await?;
43
44    println!("Joined topic");
45
46    // Spawn listener for incoming messages
47    tokio::spawn(async move {
48        while let Some(Ok(event)) = gossip_receiver.next().await {
49            if let Event::Received(msg) = event {
50                println!(
51                    "\nMessage from {}: {}",
52                    &msg.delivered_from.to_string()[0..8],
53                    String::from_utf8(msg.content.to_vec()).unwrap()
54                );
55            } else if let Event::NeighborUp(peer) = event {
56                println!("\nJoined by {}", &peer.to_string()[0..8]);
57            }
58        }
59    });
60
61    // Main input loop for sending messages
62    let mut buffer = String::new();
63    let stdin = std::io::stdin();
64    loop {
65        print!("\n> ");
66        stdin.read_line(&mut buffer).unwrap();
67        gossip_sender
68            .broadcast(buffer.clone().replace("\n", "").into())
69            .await
70            .unwrap();
71        println!(" - (sent)");
72        buffer.clear();
73    }
74}