use crate::errors::HeyoError;
pub struct P2pTunnel {
local_port: u16,
_guard: TunnelGuard,
}
struct TunnelGuard(tokio::task::JoinHandle<()>);
impl Drop for TunnelGuard {
fn drop(&mut self) {
self.0.abort();
}
}
impl P2pTunnel {
pub async fn connect(ticket: &str, relay: Option<&str>) -> Result<Self, HeyoError> {
let proxy = crate::proxy::Client::connect(ticket, 0, relay)
.await
.map_err(|e| HeyoError::Connection(format!("iroh P2P connect failed: {e}")))?;
let local = proxy
.local_addr()
.map_err(|e| HeyoError::Connection(format!("tunnel local_addr: {e}")))?;
let local_port = local.port();
let handle = tokio::spawn(async move {
let _ = proxy.run().await;
});
Ok(Self {
local_port,
_guard: TunnelGuard(handle),
})
}
pub fn local_port(&self) -> u16 {
self.local_port
}
pub fn local_url(&self) -> String {
format!("http://127.0.0.1:{}", self.local_port)
}
}