pub struct GossipReceiver { /* private fields */ }Implementations§
Source§impl GossipReceiver
impl GossipReceiver
pub fn new(gossip_receiver: GossipReceiver, gossip: Gossip) -> Self
pub async fn neighbors(&mut self) -> Result<HashSet<NodeId>>
pub async fn is_joined(&mut self) -> Result<bool>
Sourcepub async fn subscribe(&mut self) -> Result<Receiver<Event>>
pub async fn subscribe(&mut self) -> Result<Receiver<Event>>
Examples found in repository?
examples/e2e_test.rs (line 41)
11async fn main() -> Result<()> {
12 // Generate a new random secret key
13 let secret_key = SecretKey::generate(rand::rngs::OsRng);
14
15 // Set up endpoint with discovery enabled
16 let endpoint = Endpoint::builder()
17 .secret_key(secret_key)
18 .discovery_n0()
19 .bind()
20 .await?;
21
22 // Initialize gossip with auto-discovery
23 let gossip = Gossip::builder()
24 .spawn_with_auto_discovery::<DefaultSecretRotation>(endpoint.clone(), None)
25 .await?;
26
27 // Set up protocol router
28 let _router = iroh::protocol::Router::builder(endpoint.clone())
29 .accept(iroh_gossip::ALPN, gossip.gossip.clone())
30 .spawn();
31
32 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
33 let initial_secret = b"my-initial-secret".to_vec();
34
35 // Split into sink (sending) and stream (receiving)
36 let (tx,mut rx) = gossip
37 .subscribe_and_join_with_auto_discovery(topic_id, initial_secret)
38 .await?.split();
39
40 tokio::spawn(async move {
41 let mut rx = rx.subscribe().await.unwrap();
42 while let Ok(event) = rx.recv().await {
43 println!("{event:?}");
44 }
45 });
46
47
48 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
49 tx.broadcast(format!("hi from {}",endpoint.node_id()).into()).await?;
50
51
52 // print "[joined topic]" to stdout in success case
53 println!("[joined topic]");
54
55 tokio::time::sleep(std::time::Duration::from_secs(10)).await;
56
57 println!("[finished]");
58
59 // successfully joined
60 // exit with code 0
61 Ok(())
62}More examples
examples/secret_rotation.rs (line 67)
33async fn main() -> Result<()> {
34 // Generate a new random secret key
35 let secret_key = SecretKey::generate(rand::rngs::OsRng);
36
37 // Set up endpoint with discovery enabled
38 let endpoint = Endpoint::builder()
39 .secret_key(secret_key)
40 .discovery_n0()
41 .bind()
42 .await?;
43
44 // Initialize gossip with auto-discovery
45 let gossip = Gossip::builder()
46 .spawn_with_auto_discovery::<MySecretRotation>(endpoint.clone(), None)
47 .await?;
48
49 // Set up protocol router
50 let _router = iroh::protocol::Router::builder(endpoint.clone())
51 .accept(iroh_gossip::ALPN, gossip.gossip.clone())
52 .spawn();
53
54 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
55 let initial_secret = b"my-initial-secret".to_vec();
56
57 // Split into sink (sending) and stream (receiving)
58 let (sink, mut stream) = gossip
59 .subscribe_and_join_with_auto_discovery(topic_id, initial_secret)
60 .await?
61 .split();
62
63 println!("Joined topic");
64
65 // Spawn listener for incoming messages
66 tokio::spawn(async move {
67 let mut reader = stream.subscribe().await.unwrap();
68 while let Ok(event) = reader.recv().await {
69 if let Event::Received(msg) = event {
70 println!(
71 "\nMessage from {}: {}",
72 &msg.delivered_from.to_string()[0..8],
73 String::from_utf8(msg.content.to_vec()).unwrap()
74 );
75 } else if let Event::NeighborUp(peer) = event {
76 println!("\nJoined by {}", &peer.to_string()[0..8]);
77 }
78 }
79 });
80
81 // Main input loop for sending messages
82 let mut buffer = String::new();
83 let stdin = std::io::stdin();
84 loop {
85 print!("\n> ");
86 stdin.read_line(&mut buffer).unwrap();
87 sink.broadcast(buffer.clone().replace("\n", "").into())
88 .await
89 .unwrap();
90 println!(" - (sent)");
91 buffer.clear();
92 }
93}examples/chat.rs (line 45)
11async fn main() -> Result<()> {
12 // Generate a new random secret key
13 let secret_key = SecretKey::generate(rand::rngs::OsRng);
14
15 // Set up endpoint with discovery enabled
16 let endpoint = Endpoint::builder()
17 .secret_key(secret_key)
18 .discovery_n0()
19 .bind()
20 .await?;
21
22 // Initialize gossip with auto-discovery
23 let gossip = Gossip::builder()
24 .spawn_with_auto_discovery::<DefaultSecretRotation>(endpoint.clone(), None)
25 .await?;
26
27 // Set up protocol router
28 let _router = iroh::protocol::Router::builder(endpoint.clone())
29 .accept(iroh_gossip::ALPN, gossip.gossip.clone())
30 .spawn();
31
32 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
33 let initial_secret = b"my-initial-secret".to_vec();
34
35 // Split into sink (sending) and stream (receiving)
36 let (sink, mut stream) = gossip
37 .subscribe_and_join_with_auto_discovery(topic_id, initial_secret)
38 .await?
39 .split();
40
41 println!("Joined topic");
42
43 // Spawn listener for incoming messages
44 tokio::spawn(async move {
45 let mut reader = stream.subscribe().await.unwrap();
46 while let Ok(event) = reader.recv().await {
47 if let Event::Received(msg) = event {
48 println!(
49 "\nMessage from {}: {}",
50 &msg.delivered_from.to_string()[0..8],
51 String::from_utf8(msg.content.to_vec()).unwrap()
52 );
53 } else if let Event::NeighborUp(peer) = event {
54 println!("\nJoined by {}", &peer.to_string()[0..8]);
55 }
56 }
57 });
58
59 // Main input loop for sending messages
60 let mut buffer = String::new();
61 let stdin = std::io::stdin();
62 loop {
63 print!("\n> ");
64 stdin.read_line(&mut buffer).unwrap();
65 sink.broadcast(buffer.clone().replace("\n", "").into())
66 .await
67 .unwrap();
68 println!(" - (sent)");
69 buffer.clear();
70 }
71}examples/chat_no_wait.rs (line 45)
11async fn main() -> Result<()> {
12 // Generate a new random secret key
13 let secret_key = SecretKey::generate(rand::rngs::OsRng);
14
15 // Set up endpoint with discovery enabled
16 let endpoint = Endpoint::builder()
17 .secret_key(secret_key)
18 .discovery_n0()
19 .bind()
20 .await?;
21
22 // Initialize gossip with auto-discovery
23 let gossip = Gossip::builder()
24 .spawn_with_auto_discovery::<DefaultSecretRotation>(endpoint.clone(), None)
25 .await?;
26
27 // Set up protocol router
28 let _router = iroh::protocol::Router::builder(endpoint.clone())
29 .accept(iroh_gossip::ALPN, gossip.gossip.clone())
30 .spawn();
31
32 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
33 let initial_secret = b"my-initial-secret".to_vec();
34
35 // Split into sink (sending) and stream (receiving)
36 let (sink, mut stream) = gossip
37 .subscribe_and_join_with_auto_discovery_no_wait(topic_id, initial_secret)
38 .await?
39 .split();
40
41 println!("Joined topic");
42
43 // Spawn listener for incoming messages
44 tokio::spawn(async move {
45 let mut reader = stream.subscribe().await.unwrap();
46 while let Ok(event) = reader.recv().await {
47 if let Event::Received(msg) = event {
48 println!(
49 "\nMessage from {}: {}",
50 &msg.delivered_from.to_string()[0..8],
51 String::from_utf8(msg.content.to_vec()).unwrap()
52 );
53 } else if let Event::NeighborUp(peer) = event {
54 println!("\nJoined by {}", &peer.to_string()[0..8]);
55 }
56 }
57 });
58
59 // Main input loop for sending messages
60 let mut buffer = String::new();
61 let stdin = std::io::stdin();
62 loop {
63 print!("\n> ");
64 stdin.read_line(&mut buffer).unwrap();
65 sink.broadcast(buffer.clone().replace("\n", "").into())
66 .await
67 .unwrap();
68 println!(" - (sent)");
69 buffer.clear();
70 }
71}pub fn last_message_hashes(&self) -> Vec<[u8; 32]>
Trait Implementations§
Source§impl Clone for GossipReceiver
impl Clone for GossipReceiver
Auto Trait Implementations§
impl Freeze for GossipReceiver
impl !RefUnwindSafe for GossipReceiver
impl Send for GossipReceiver
impl Sync for GossipReceiver
impl Unpin for GossipReceiver
impl !UnwindSafe for GossipReceiver
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more