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>, ) -> Result<Self>
Sourcepub fn split(&self) -> (GossipSender, GossipReceiver)
pub fn split(&self) -> (GossipSender, GossipReceiver)
Examples found in repository?
examples/secret_rotation.rs (line 67)
39async fn main() -> Result<()> {
40 // Generate a new random secret key
41 let secret_key = SecretKey::generate(rand::rngs::OsRng);
42
43 // Set up endpoint with discovery enabled
44 let endpoint = Endpoint::builder()
45 .secret_key(secret_key)
46 .discovery_n0()
47 .bind()
48 .await?;
49
50 // Initialize gossip with auto-discovery
51 let gossip = Gossip::builder()
52 .spawn_with_auto_discovery::<MySecretRotation>(endpoint.clone(), None)
53 .await?;
54
55 // Set up protocol router
56 let _router = iroh::protocol::Router::builder(endpoint.clone())
57 .accept(iroh_gossip::ALPN, gossip.gossip.clone())
58 .spawn();
59
60 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
61 let initial_secret = b"my-initial-secret".to_vec();
62
63 // Split into sink (sending) and stream (receiving)
64 let (sink, mut stream) = gossip
65 .subscribe_and_join_with_auto_discovery(topic_id, &initial_secret)
66 .await?
67 .split();
68
69 println!("Joined topic");
70
71 // Spawn listener for incoming messages
72 tokio::spawn(async move {
73 while let Ok(event) = stream.recv().await {
74 if let Event::Received(msg) = event {
75 println!(
76 "\nMessage from {}: {}",
77 &msg.delivered_from.to_string()[0..8],
78 String::from_utf8(msg.content.to_vec()).unwrap()
79 );
80 } else if let Event::NeighborUp(peer) = event {
81 println!("\nJoined by {}", &peer.to_string()[0..8]);
82 }
83 }
84 });
85
86 // Main input loop for sending messages
87 let mut buffer = String::new();
88 let stdin = std::io::stdin();
89 loop {
90 print!("\n> ");
91 stdin.read_line(&mut buffer).unwrap();
92 sink.broadcast(buffer.clone().replace("\n", "").into())
93 .await
94 .unwrap();
95 print!(" - (sent)\n");
96 buffer.clear();
97 }
98}More examples
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 while let Ok(event) = stream.recv().await {
46 if let Event::Received(msg) = event {
47 println!(
48 "\nMessage from {}: {}",
49 &msg.delivered_from.to_string()[0..8],
50 String::from_utf8(msg.content.to_vec()).unwrap()
51 );
52 } else if let Event::NeighborUp(peer) = event {
53 println!("\nJoined by {}", &peer.to_string()[0..8]);
54 }
55 }
56 });
57
58 // Main input loop for sending messages
59 let mut buffer = String::new();
60 let stdin = std::io::stdin();
61 loop {
62 print!("\n> ");
63 stdin.read_line(&mut buffer).unwrap();
64 sink.broadcast(buffer.clone().replace("\n", "").into())
65 .await
66 .unwrap();
67 print!(" - (sent)\n");
68 buffer.clear();
69 }
70}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( 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