full_config/
full_config.rs1use std::time::Duration;
2
3use anyhow::Result;
4use ed25519_dalek::SigningKey;
5use iroh::{Endpoint, SecretKey};
6use iroh_gossip::net::Gossip;
7
8use distributed_topic_tracker::{
10 AutoDiscoveryGossip, BootstrapConfig, BubbleMergeConfig, Config, DefaultSecretRotation,
11 DhtConfig, MergeConfig, MessageOverlapMergeConfig, PublisherConfig, RecordPublisher,
12 RotationHandle, TimeoutConfig, TopicId,
13};
14
15fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}
75
76#[tokio::main]
77async fn main() -> Result<()> {
78 let secret_key = SecretKey::generate();
80 let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
81
82 let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
84 .secret_key(secret_key.clone())
85 .bind()
86 .await?;
87
88 let gossip = Gossip::builder().spawn(endpoint.clone());
90
91 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 let (_gossip_sender, _gossip_receiver) = topic.split().await?;
114
115 Ok(())
116}