pub struct Topic<R: SecretRotation + Default + Clone + Send + 'static> { /* private fields */ }Implementations§
Source§impl<R: SecretRotation + Default + Clone + Send + 'static> Topic<R>
impl<R: SecretRotation + Default + Clone + Send + 'static> Topic<R>
pub async fn new( topic_id: TopicId, endpoint: &Endpoint, node_signing_key: &SigningKey, gossip: Gossip, initial_secret: &Vec<u8>, secret_rotation_function: Option<R>, async_bootstrap: bool, ) -> Result<Self>
Sourcepub fn split(&self) -> (GossipSender, GossipReceiver)
pub fn split(&self) -> (GossipSender, GossipReceiver)
Examples found in repository?
examples/e2e_test.rs (line 38)
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 61)
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 39)
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 39)
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 topic_id(&self) -> &TopicId
pub fn node_id(&self) -> &NodeId
pub fn gossip_sender(&self) -> GossipSender
pub fn gossip_receiver(&self) -> GossipReceiver
pub fn secret_rotation_function(&self) -> R
pub fn initial_secret_hash(&self) -> [u8; 32]
pub fn set_initial_secret_hash(&mut self, initial_secret_hash: [u8; 32])
Source§impl<R: SecretRotation + Default + Clone + Send + 'static> Topic<R>
impl<R: SecretRotation + Default + Clone + Send + 'static> Topic<R>
pub async fn bootstrap_no_wait( topic_id: TopicId, endpoint: &Endpoint, node_signing_key: &SigningKey, gossip: Gossip, initial_secret_hash: [u8; 32], secret_rotation_function: Option<R>, ) -> Result<(GossipSender, GossipReceiver)>
pub async fn bootstrap( topic_id: TopicId, endpoint: &Endpoint, node_signing_key: &SigningKey, gossip: Gossip, initial_secret_hash: [u8; 32], secret_rotation_function: Option<R>, ) -> Result<(GossipSender, GossipReceiver)>
Trait Implementations§
Auto Trait Implementations§
impl<R> Freeze for Topic<R>where
R: Freeze,
impl<R> !RefUnwindSafe for Topic<R>
impl<R> Send for Topic<R>
impl<R> Sync for Topic<R>where
R: Sync,
impl<R> Unpin for Topic<R>where
R: Unpin,
impl<R> !UnwindSafe for Topic<R>
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