Skip to main content

without_mergers/
without_mergers.rs

1use anyhow::Result;
2use ed25519_dalek::SigningKey;
3use iroh::{Endpoint, SecretKey};
4use iroh_gossip::net::Gossip;
5
6// Imports from distributed-topic-tracker
7use distributed_topic_tracker::{
8    AutoDiscoveryGossip, BubbleMergeConfig, Config, MergeConfig, MessageOverlapMergeConfig,
9    RecordPublisher, TopicId,
10};
11
12#[tokio::main]
13async fn main() -> Result<()> {
14    // Generate a new random secret key
15    let secret_key = SecretKey::generate();
16    let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
17
18    // Set up endpoint with discovery enabled
19    let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
20        .secret_key(secret_key.clone())
21        .bind()
22        .await?;
23
24    // Initialize gossip with auto-discovery
25    let gossip = Gossip::builder().spawn(endpoint.clone());
26
27    // Set up protocol router
28    let _router = iroh::protocol::Router::builder(endpoint.clone())
29        .accept(iroh_gossip::ALPN, 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    let record_publisher = RecordPublisher::new(
36        topic_id.clone(),
37        signing_key.clone(),
38        None,
39        initial_secret,
40        // [!] Disable merge workers (BubbleMerge and MessageOverlapMerge)
41        Config::builder()
42            .merge_config(
43                MergeConfig::builder()
44                    .bubble_merge(BubbleMergeConfig::Disabled)
45                    .message_overlap_merge(MessageOverlapMergeConfig::Disabled)
46                    .build(),
47            )
48            .build(),
49    );
50
51    let topic = gossip
52        .subscribe_and_join_with_auto_discovery(record_publisher)
53        .await?;
54
55    println!("[joined topic]");
56
57    // Do something with the gossip topic
58    // (bonus: GossipSender and GossipReceiver are safely clonable)
59    let (_gossip_sender, _gossip_receiver) = topic.split().await?;
60
61    Ok(())
62}