use libp2p::{core::ConnectedPoint, Multiaddr};
use serde::{Deserialize, Serialize};
use std::{collections::{HashMap, HashSet}, time::Duration};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct NetworkState {
pub peer_id: String,
pub listened_addresses: HashSet<Multiaddr>,
pub external_addresses: HashSet<Multiaddr>,
pub connected_peers: HashMap<String, Peer>,
pub not_connected_peers: HashMap<String, NotConnectedPeer>,
pub peerset: serde_json::Value,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Peer {
pub endpoint: PeerEndpoint,
pub version_string: Option<String>,
pub latest_ping_time: Option<Duration>,
pub known_addresses: HashSet<Multiaddr>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct NotConnectedPeer {
pub known_addresses: HashSet<Multiaddr>,
pub version_string: Option<String>,
pub latest_ping_time: Option<Duration>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum PeerEndpoint {
Dialing(Multiaddr),
Listening {
local_addr: Multiaddr,
send_back_addr: Multiaddr,
},
}
impl From<ConnectedPoint> for PeerEndpoint {
fn from(endpoint: ConnectedPoint) -> Self {
match endpoint {
ConnectedPoint::Dialer { address } =>
PeerEndpoint::Dialing(address),
ConnectedPoint::Listener { local_addr, send_back_addr } =>
PeerEndpoint::Listening {
local_addr,
send_back_addr
}
}
}
}