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 106)
81async fn main() -> Result<()> {
82 // Generate a new random secret key
83 let secret_key = SecretKey::generate();
84 let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
85
86 // Set up endpoint with discovery enabled
87 let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
88 .secret_key(secret_key.clone())
89 .bind()
90 .await?;
91
92 // Initialize gossip with auto-discovery
93 let gossip = Gossip::builder().spawn(endpoint.clone());
94
95 // Set up protocol router
96 let _router = iroh::protocol::Router::builder(endpoint.clone())
97 .accept(iroh_gossip::ALPN, gossip.clone())
98 .spawn();
99
100 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
101 let initial_secret = b"my-initial-secret".to_vec();
102
103 let record_publisher =
104 RecordPublisher::builder(topic_id.clone(), signing_key.clone(), initial_secret)
105 .config(config_builder())
106 .secret_rotation(RotationHandle::new(DefaultSecretRotation))
107 .build();
108
109 let topic = gossip
110 .subscribe_and_join_with_auto_discovery(record_publisher)
111 .await?;
112
113 println!("[joined topic]");
114
115 // Do something with the gossip topic
116 // (bonus: GossipSender and GossipReceiver are safely clonable)
117 let (_gossip_sender, _gossip_receiver) = topic.split().await?;
118
119 Ok(())
120}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();
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more