pub struct RotationHandle(/* private fields */);Expand description
Wrapper for custom or default secret rotation implementations.
Allows pluggable key derivation strategies while maintaining a consistent API.
Implementations§
Source§impl RotationHandle
impl RotationHandle
Sourcepub fn new(rotation: impl SecretRotation + 'static) -> Self
pub fn new(rotation: impl SecretRotation + 'static) -> Self
Create a new rotation handle with a custom implementation.
Examples found in repository?
examples/full_config.rs (line 102)
77async fn main() -> Result<()> {
78 // Generate a new random secret key
79 let secret_key = SecretKey::generate(&mut rand::rng());
80 let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
81
82 // Set up endpoint with discovery enabled
83 let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
84 .secret_key(secret_key.clone())
85 .bind()
86 .await?;
87
88 // Initialize gossip with auto-discovery
89 let gossip = Gossip::builder().spawn(endpoint.clone());
90
91 // Set up protocol router
92 let _router = iroh::protocol::Router::builder(endpoint.clone())
93 .accept(iroh_gossip::ALPN, gossip.clone())
94 .spawn();
95
96 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
97 let initial_secret = b"my-initial-secret".to_vec();
98
99 let record_publisher =
100 RecordPublisher::builder(topic_id.clone(), signing_key.clone(), initial_secret)
101 .config(config_builder())
102 .secret_rotation(RotationHandle::new(DefaultSecretRotation))
103 .build();
104
105 let topic = gossip
106 .subscribe_and_join_with_auto_discovery(record_publisher)
107 .await?;
108
109 println!("[joined topic]");
110
111 // Do something with the gossip topic
112 // (bonus: GossipSender and GossipReceiver are safely clonable)
113 let (_gossip_sender, _gossip_receiver) = topic.split().await?;
114
115 Ok(())
116}More examples
examples/secret_rotation.rs (line 55)
30async fn main() -> Result<()> {
31 // Generate a new random secret key
32 let secret_key = SecretKey::generate(&mut rand::rng());
33 let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
34
35 // Set up endpoint with discovery enabled
36 let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
37 .secret_key(secret_key.clone())
38 .bind()
39 .await?;
40
41 // Initialize gossip with auto-discovery
42 let gossip = Gossip::builder().spawn(endpoint.clone());
43
44 // Set up protocol router
45 let _router = iroh::protocol::Router::builder(endpoint.clone())
46 .accept(iroh_gossip::ALPN, gossip.clone())
47 .spawn();
48
49 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
50 let initial_secret = b"my-initial-secret".to_vec();
51
52 let record_publisher = RecordPublisher::new(
53 topic_id.clone(),
54 signing_key.clone(),
55 Some(RotationHandle::new(MySecretRotation)),
56 initial_secret,
57 Config::default(),
58 );
59 let (gossip_sender, mut gossip_receiver) = gossip
60 .subscribe_and_join_with_auto_discovery(record_publisher)
61 .await?
62 .split()
63 .await?;
64
65 println!("Joined topic");
66
67 // Spawn listener for incoming messages
68 tokio::spawn(async move {
69 while let Ok(event) = gossip_receiver.next().await {
70 if let Event::Received(msg) = event {
71 println!(
72 "\nMessage from {}: {}",
73 &msg.delivered_from.to_string()[0..8],
74 String::from_utf8(msg.content.to_vec()).unwrap()
75 );
76 } else if let Event::NeighborUp(peer) = event {
77 println!("\nJoined by {}", &peer.to_string()[0..8]);
78 }
79 }
80 println!("\nGossip receiver stream ended");
81 });
82
83 // Main input loop for sending messages
84 let mut buffer = String::new();
85 let stdin = std::io::stdin();
86 loop {
87 print!("\n> ");
88 stdin.read_line(&mut buffer).unwrap();
89 gossip_sender
90 .broadcast(buffer.clone().replace("\n", "").into())
91 .await
92 .unwrap();
93 println!(" - (sent)");
94 buffer.clear();
95 }
96}Trait Implementations§
Source§impl Clone for RotationHandle
impl Clone for RotationHandle
Source§fn clone(&self) -> RotationHandle
fn clone(&self) -> RotationHandle
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for RotationHandle
impl Debug for RotationHandle
Auto Trait Implementations§
impl Freeze for RotationHandle
impl !RefUnwindSafe for RotationHandle
impl Send for RotationHandle
impl Sync for RotationHandle
impl Unpin for RotationHandle
impl UnsafeUnpin for RotationHandle
impl !UnwindSafe for RotationHandle
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