iroh-dns-server 0.14.0

A pkarr relay and DNS server
Documentation
//! A DNS server and pkarr relay

#![deny(missing_docs, rustdoc::broken_intra_doc_links)]

pub mod config;
pub mod dns;
pub mod http;
pub mod metrics;
pub mod server;
pub mod state;
mod store;
mod util;

#[cfg(test)]
mod tests {
    use std::net::SocketAddr;

    use anyhow::Result;
    use hickory_resolver::{
        config::{NameServerConfig, Protocol, ResolverConfig},
        AsyncResolver,
    };
    use iroh_net::{
        discovery::pkarr_publish::PkarrRelayClient,
        dns::{
            node_info::{lookup_by_id, NodeInfo},
            DnsResolver,
        },
        key::SecretKey,
    };
    use url::Url;

    use crate::server::Server;

    #[tokio::test]
    async fn integration_smoke() -> Result<()> {
        tracing_subscriber::fmt::init();
        let (server, nameserver, http_url) = Server::spawn_for_tests().await?;

        let pkarr_relay = {
            let mut url = http_url.clone();
            url.set_path("/pkarr");
            url
        };

        let origin = "irohdns.example.";

        let secret_key = SecretKey::generate();
        let node_id = secret_key.public();
        let relay_url: Url = "https://relay.example.".parse()?;
        let pkarr = PkarrRelayClient::new(pkarr_relay);
        let node_info = NodeInfo::new(node_id, Some(relay_url.clone()));
        let signed_packet = node_info.to_pkarr_signed_packet(&secret_key, 30)?;

        pkarr.publish(&signed_packet).await?;

        let resolver = test_resolver(nameserver);
        let res = lookup_by_id(&resolver, &node_id, origin).await?;

        assert_eq!(res.node_id, node_id);
        assert_eq!(res.info.relay_url.map(Url::from), Some(relay_url));

        server.shutdown().await?;
        Ok(())
    }

    fn test_resolver(nameserver: SocketAddr) -> DnsResolver {
        let mut config = ResolverConfig::new();
        let nameserver_config = NameServerConfig::new(nameserver, Protocol::Udp);
        config.add_name_server(nameserver_config);
        AsyncResolver::tokio(config, Default::default())
    }
}