use std::net::SocketAddr;
use anyhow::Result;
use futures_lite::{Stream, StreamExt};
use iroh::{endpoint::RemoteInfo, NodeAddr, NodeId, RelayUrl};
use quic_rpc::RpcClient;
use serde::{Deserialize, Serialize};
use super::flatten;
use crate::rpc::proto::{
net::{
AddAddrRequest, AddrRequest, IdRequest, RelayRequest, RemoteInfoRequest,
RemoteInfoResponse, RemoteInfosIterRequest,
},
RpcService,
};
#[derive(Debug, Clone)]
#[repr(transparent)]
pub struct Client {
pub(super) rpc: RpcClient<RpcService>,
}
impl Client {
pub fn new(rpc: RpcClient<RpcService>) -> Self {
Self { rpc }
}
pub async fn remote_info_iter(&self) -> Result<impl Stream<Item = Result<RemoteInfo>>> {
let stream = self.rpc.server_streaming(RemoteInfosIterRequest {}).await?;
Ok(flatten(stream).map(|res| res.map(|res| res.info)))
}
pub async fn remote_info(&self, node_id: NodeId) -> Result<Option<RemoteInfo>> {
let RemoteInfoResponse { info } = self.rpc.rpc(RemoteInfoRequest { node_id }).await??;
Ok(info)
}
pub async fn node_id(&self) -> Result<NodeId> {
let id = self.rpc.rpc(IdRequest).await??;
Ok(id)
}
pub async fn node_addr(&self) -> Result<NodeAddr> {
let addr = self.rpc.rpc(AddrRequest).await??;
Ok(addr)
}
pub async fn add_node_addr(&self, addr: NodeAddr) -> Result<()> {
self.rpc.rpc(AddAddrRequest { addr }).await??;
Ok(())
}
pub async fn home_relay(&self) -> Result<Option<RelayUrl>> {
let relay = self.rpc.rpc(RelayRequest).await??;
Ok(relay)
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct NodeStatus {
pub addr: NodeAddr,
pub listen_addrs: Vec<SocketAddr>,
pub version: String,
pub rpc_addr: Option<SocketAddr>,
}