use anyhow::Result;
use iroh::{Endpoint, endpoint::presets, protocol::Router};
use iroh_services::{
API_SECRET_ENV_VAR_NAME, ApiSecret, CLIENT_HOST_ALPN, Client, ClientHost,
caps::NetDiagnosticsCap,
};
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
let endpoint = Endpoint::bind(presets::N0).await?;
let secret = ApiSecret::from_env_var(API_SECRET_ENV_VAR_NAME)?;
let id = endpoint.id().to_string();
let name = format!("net-diagnostics-example-{}", &id[..8]);
let client = Client::builder(&endpoint)
.api_secret(secret.clone())?
.name(name)?
.build()
.await?;
let client2 = client.clone();
let remote_id = secret.addr().id;
let t = tokio::spawn(async move {
if let Err(err) = client2
.grant_capability(remote_id, vec![NetDiagnosticsCap::GetAny])
.await
{
eprintln!("Failed to grant capability: {err:?}");
}
});
let host = ClientHost::new(&endpoint);
let router = Router::builder(endpoint)
.accept(CLIENT_HOST_ALPN, host)
.spawn();
println!("Running network diagnostics...\n");
let report = client.net_diagnostics(false).await?;
println!("{:?}", report);
println!("waiting for remote diagnostics requests. ctrl+c to exit.");
tokio::signal::ctrl_c().await?;
router.endpoint().close().await;
t.abort();
Ok(())
}