1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use libp2p::{
core::{ConnectedPoint, Endpoint as CoreEndpoint},
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, Endpoint),
Listening {
local_addr: Multiaddr,
send_back_addr: Multiaddr,
},
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum Endpoint {
Dialer,
Listener,
}
impl From<ConnectedPoint> for PeerEndpoint {
fn from(endpoint: ConnectedPoint) -> Self {
match endpoint {
ConnectedPoint::Dialer { address, role_override } =>
Self::Dialing(address, role_override.into()),
ConnectedPoint::Listener { local_addr, send_back_addr } =>
Self::Listening { local_addr, send_back_addr },
}
}
}
impl From<CoreEndpoint> for Endpoint {
fn from(endpoint: CoreEndpoint) -> Self {
match endpoint {
CoreEndpoint::Dialer => Self::Dialer,
CoreEndpoint::Listener => Self::Listener,
}
}
}