Skip to main content

full_config/
full_config.rs

1use std::time::Duration;
2
3use anyhow::Result;
4use ed25519_dalek::SigningKey;
5use iroh::{Endpoint, SecretKey};
6use iroh_gossip::net::Gossip;
7
8// Imports from distributed-topic-tracker
9use distributed_topic_tracker::{
10    AutoDiscoveryGossip, BootstrapConfig, BubbleMergeConfig, Config, DefaultSecretRotation,
11    DhtConfig, MergeConfig, MessageOverlapMergeConfig, PublisherConfig, RecordPublisher,
12    RotationHandle, TimeoutConfig, TopicId,
13};
14
15// Default configuration, all in one spot as an overview
16// same as `Config::default()`
17fn 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    // Generate a new random secret key
79    let secret_key = SecretKey::generate();
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}