chat_no_wait/
chat_no_wait.rs1use anyhow::Result;
2use iroh::{Endpoint, SecretKey};
3use iroh_gossip::{api::Event, net::Gossip};
4
5use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId};
7
8#[tokio::main]
9async fn main() -> Result<()> {
10 let secret_key = SecretKey::generate(&mut rand::rng());
12
13 let endpoint = Endpoint::builder()
15 .secret_key(secret_key.clone())
16 .discovery_n0()
17 .bind()
18 .await?;
19
20 let gossip = Gossip::builder().spawn(endpoint.clone());
22
23 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 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 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}