use anyhow::Result;
use iroh::{Endpoint, SecretKey};
use iroh_gossip::{api::Event, net::Gossip};
use ed25519_dalek::SigningKey;
use distributed_topic_tracker::{
AutoDiscoveryGossip, BootstrapConfig, Config, RecordPublisher, TopicId,
};
#[tokio::main]
async fn main() -> Result<()> {
use tracing_subscriber::filter::EnvFilter;
tracing_subscriber::fmt()
.with_thread_ids(true)
.with_ansi(true)
.with_env_filter(
EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new("distributed_topic_tracker=debug")),
)
.init();
let secret_key = SecretKey::generate();
let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
.secret_key(secret_key.clone())
.bind()
.await?;
let gossip = Gossip::builder().spawn(endpoint.clone());
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();
let record_publisher = RecordPublisher::new(
topic_id.clone(),
signing_key.clone(),
None,
initial_secret,
Config::builder()
.bootstrap_config(
BootstrapConfig::builder()
.check_older_records_first_on_startup(false)
.build(),
)
.build(),
);
let (gossip_sender, mut gossip_receiver) = gossip
.subscribe_and_join_with_auto_discovery(record_publisher)
.await?
.split()
.await?;
println!("Joined topic");
tokio::spawn(async move {
while let Ok(event) = gossip_receiver.next().await {
if let Event::Received(msg) = event {
println!(
"\nMessage from {}: {}",
&msg.delivered_from.to_string()[0..8],
String::from_utf8(msg.content.to_vec()).unwrap()
);
} else if let Event::NeighborUp(peer) = event {
println!("\nJoined by {}", &peer.to_string()[0..8]);
}
}
println!("\nGossip receiver stream ended");
});
let mut buffer = String::new();
let stdin = std::io::stdin();
loop {
print!("\n> ");
stdin.read_line(&mut buffer).unwrap();
gossip_sender
.broadcast(
buffer
.trim_end_matches(&['\r', '\n'][..])
.as_bytes()
.to_vec(),
)
.await
.unwrap();
println!(" - (sent)");
buffer.clear();
}
}