ev_client/
p2p.rs

1use crate::{client::Client, error::Result};
2use ev_types::v1::{
3    p2p_service_client::P2pServiceClient, GetNetInfoResponse, GetPeerInfoResponse, NetInfo,
4    PeerInfo,
5};
6use tonic::Request;
7
8pub struct P2PClient {
9    inner: P2pServiceClient<tonic::transport::Channel>,
10}
11
12impl P2PClient {
13    /// Create a new P2PClient from a Client
14    pub fn new(client: &Client) -> Self {
15        let inner = P2pServiceClient::new(client.channel().clone());
16        Self { inner }
17    }
18
19    /// Get information about connected peers
20    pub async fn get_peer_info(&self) -> Result<Vec<PeerInfo>> {
21        let request = Request::new(());
22        let response = self.inner.clone().get_peer_info(request).await?;
23
24        Ok(response.into_inner().peers)
25    }
26
27    /// Get network information
28    pub async fn get_net_info(&self) -> Result<NetInfo> {
29        let request = Request::new(());
30        let response = self.inner.clone().get_net_info(request).await?;
31
32        Ok(response.into_inner().net_info.unwrap_or_default())
33    }
34
35    /// Get the full peer info response
36    pub async fn get_peer_info_response(&self) -> Result<GetPeerInfoResponse> {
37        let request = Request::new(());
38        let response = self.inner.clone().get_peer_info(request).await?;
39
40        Ok(response.into_inner())
41    }
42
43    /// Get the full network info response
44    pub async fn get_net_info_response(&self) -> Result<GetNetInfoResponse> {
45        let request = Request::new(());
46        let response = self.inner.clone().get_net_info(request).await?;
47
48        Ok(response.into_inner())
49    }
50
51    /// Get the number of connected peers
52    pub async fn peer_count(&self) -> Result<usize> {
53        let peers = self.get_peer_info().await?;
54        Ok(peers.len())
55    }
56}