diff --git a/Cargo.lock b/Cargo.lock index 53a69a5..674d88d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -769,7 +769,7 @@ dependencies = [ [[package]] name = "distributed-topic-tracker" -version = "0.2.5" +version = "0.2.6" dependencies = [ "actor-helper", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 0b638cf..4dae5fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ homepage = "https://rustonbsd.github.io/2025/09/03/distributed-topic-tracker.htm readme = "README.md" keywords = ["networking"] categories = ["network-programming"] -version = "0.2.5" +version = "0.2.6" edition = "2024" [features] @@ -25,7 +25,7 @@ ed25519-dalek-hpke = { version = "0.0.5" } tokio = { version = "1", default-features = false, features = ["macros", "time", "sync", "rt-multi-thread"] } -iroh = { version = "0.95", optional = true, default-features = false } +iroh = { version = "0.95.1", optional = true, default-features = false } iroh-gossip = { version = "0.95", optional = true, default-features = false, features = ["net"]} futures-lite = "2" diff --git a/examples/chat.rs b/examples/chat.rs index 0526dd5..491d923 100644 --- a/examples/chat.rs +++ b/examples/chat.rs @@ -4,7 +4,7 @@ use iroh_gossip::{api::Event, net::Gossip}; use ed25519_dalek::SigningKey; -// Imports from distrubuted-topic-tracker +// Imports from distributed-topic-tracker use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId}; #[tokio::main] diff --git a/examples/custom_relay_discovery.rs b/examples/custom_relay_discovery.rs new file mode 100644 index 0000000..8e28d99 --- /dev/null +++ b/examples/custom_relay_discovery.rs @@ -0,0 +1,65 @@ +use anyhow::Result; +use ed25519_dalek::SigningKey; +use iroh::{Endpoint, RelayMap, SecretKey, discovery::{dns::DnsDiscovery, pkarr::PkarrPublisher}}; +use iroh_gossip::net::Gossip; + +// Imports from distrubuted-topic-tracker +use distributed_topic_tracker::{AutoDiscoveryGossip, RecordPublisher, TopicId}; + +#[tokio::main] +async fn main() -> Result<()> { + // Generate a new random secret key + let secret_key = SecretKey::generate(&mut rand::rng()); + let signing_key = SigningKey::from_bytes(&secret_key.to_bytes()); + + // Set up endpoint with custom discovery enabled + let relay_map = iroh::RelayMap::empty();//iroh::defaults::prod::default_relay_map(); + relay_map.extend(&RelayMap::from( + "https://iroh-relay.rustonbsd.com:8443/".parse::()?, + )); + let dns_discovery = DnsDiscovery::builder("https://iroh-dns.rustonbsd.com/".parse()?).build(); + let pkarr_publisher = PkarrPublisher::builder("https://iroh-relay.rustonbsd.com".parse()?).build(secret_key.clone()); + + let endpoint = Endpoint::builder() + .relay_mode(iroh::RelayMode::Custom(relay_map)) + //.discovery(DnsDiscovery::n0_dns().build()) + //.discovery(PkarrPublisher::n0_dns().build(secret_key.clone())) + .discovery(dns_discovery) + .discovery(pkarr_publisher) + .secret_key(secret_key.clone()) + .bind() + .await?; + + // Initialize gossip with auto-discovery + let gossip = Gossip::builder().spawn(endpoint.clone()); + + // Set up protocol router + let _router = iroh::protocol::Router::builder(endpoint.clone()) + .accept(iroh_gossip::ALPN, gossip.clone()) + .spawn(); + + let topic_id = TopicId::new("my-iroh-gossip-topic".to_string()); + let initial_secret = b"my-initial-secret".to_vec(); + + // Split into sink (sending) and stream (receiving) + + let record_publisher = RecordPublisher::new( + topic_id.clone(), + signing_key.verifying_key(), + signing_key.clone(), + None, + initial_secret, + ); + + let topic = gossip + .subscribe_and_join_with_auto_discovery(record_publisher) + .await?; + + println!("[joined topic]"); + + // Do something with the gossip topic + // (bonus: GossipSender and GossipReceiver are safely clonable) + let (_gossip_sender, _gossip_receiver) = topic.split().await?; + + Ok(()) +} diff --git a/examples/e2e_test.rs b/examples/e2e_test.rs index e3fafd2..57cde3c 100644 --- a/examples/e2e_test.rs +++ b/examples/e2e_test.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use iroh::{Endpoint, SecretKey}; +use iroh::{Endpoint, RelayMap, SecretKey, discovery::{dns::DnsDiscovery, pkarr::PkarrPublisher}}; use iroh_gossip::net::Gossip; // Imports from distrubuted-topic-tracker @@ -11,8 +11,20 @@ async fn main() -> Result<()> { let secret_key = SecretKey::generate(&mut rand::rng()); let signing_key = mainline::SigningKey::from_bytes(&secret_key.to_bytes()); + let relay_map = iroh::RelayMap::empty();//iroh::defaults::prod::default_relay_map(); + relay_map.extend(&RelayMap::from( + "https://iroh-relay.rustonbsd.com:8443/".parse::()?, + )); + let dns_discovery = DnsDiscovery::builder("https://iroh-dns.rustonbsd.com/".parse()?).build(); + let pkarr_publisher = PkarrPublisher::builder("https://iroh-relay.rustonbsd.com".parse()?).build(secret_key.clone()); + // Set up endpoint with discovery enabled let endpoint = Endpoint::builder() + .relay_mode(iroh::RelayMode::Custom(relay_map)) + .discovery(DnsDiscovery::n0_dns().build()) + .discovery(PkarrPublisher::n0_dns().build(secret_key.clone())) + .discovery(dns_discovery) + .discovery(pkarr_publisher) .secret_key(secret_key.clone()) .bind() .await?;