Skip to main content

karyon_p2p/monitor/
event.rs

1use karyon_net::Endpoint;
2
3use crate::PeerID;
4
5/// Wire-level connection events.
6#[derive(Clone, Debug)]
7pub enum ConnectionKind {
8    Connected(Endpoint),
9    ConnectRetried(Endpoint),
10    ConnectFailed(Endpoint),
11    Accepted(Endpoint),
12    AcceptFailed,
13    Disconnected(Endpoint),
14    Listening(Endpoint),
15    ListenFailed(Endpoint),
16}
17
18/// Peer-pool lifecycle events.
19#[derive(Clone, Debug)]
20pub enum PoolEvent {
21    NewPeer(PeerID),
22    RemovePeer(PeerID),
23    HandshakeFailed(Option<PeerID>),
24    /// Outbound dial failed. `peer_id` may be `None` for manual peer
25    /// endpoints whose id wasn't pre-shared.
26    ConnectFailed(Option<PeerID>, Endpoint),
27    /// Inbound or outbound connection rejected because a peer with
28    /// the same id is already connected.
29    PeerAlreadyConnected(PeerID),
30}
31
32/// Discovery (Kademlia) events.
33#[derive(Clone, Debug)]
34pub enum DiscoveryKind {
35    LookupStarted(Endpoint),
36    LookupFailed(Endpoint),
37    LookupSucceeded(Endpoint, usize),
38    RefreshStarted,
39    /// Refresh sweep completed. Carries the number of entries pinged.
40    RefreshSucceeded(usize),
41    RefreshFailed,
42    /// Routing-table entry evicted after exceeding the failure budget.
43    EntryEvicted(PeerID),
44}
45
46impl ConnectionKind {
47    pub(super) fn get_endpoint(&self) -> Option<&Endpoint> {
48        match self {
49            ConnectionKind::Connected(endpoint)
50            | ConnectionKind::ConnectRetried(endpoint)
51            | ConnectionKind::ConnectFailed(endpoint)
52            | ConnectionKind::Accepted(endpoint)
53            | ConnectionKind::Disconnected(endpoint)
54            | ConnectionKind::Listening(endpoint)
55            | ConnectionKind::ListenFailed(endpoint) => Some(endpoint),
56            ConnectionKind::AcceptFailed => None,
57        }
58    }
59
60    pub(super) fn variant_name(&self) -> &'static str {
61        match self {
62            ConnectionKind::Connected(_) => "Connected",
63            ConnectionKind::ConnectRetried(_) => "ConnectRetried",
64            ConnectionKind::ConnectFailed(_) => "ConnectFailed",
65            ConnectionKind::Accepted(_) => "Accepted",
66            ConnectionKind::AcceptFailed => "AcceptFailed",
67            ConnectionKind::Disconnected(_) => "Disconnected",
68            ConnectionKind::Listening(_) => "Listening",
69            ConnectionKind::ListenFailed(_) => "ListenFailed",
70        }
71    }
72}
73
74impl PoolEvent {
75    pub(super) fn get_peer_id(&self) -> Option<&PeerID> {
76        match self {
77            PoolEvent::NewPeer(peer_id)
78            | PoolEvent::RemovePeer(peer_id)
79            | PoolEvent::PeerAlreadyConnected(peer_id) => Some(peer_id),
80            PoolEvent::HandshakeFailed(peer_id) | PoolEvent::ConnectFailed(peer_id, _) => {
81                peer_id.as_ref()
82            }
83        }
84    }
85
86    pub(super) fn get_endpoint(&self) -> Option<&Endpoint> {
87        match self {
88            PoolEvent::ConnectFailed(_, endpoint) => Some(endpoint),
89            _ => None,
90        }
91    }
92
93    pub(super) fn variant_name(&self) -> &'static str {
94        match self {
95            PoolEvent::NewPeer(_) => "NewPeer",
96            PoolEvent::RemovePeer(_) => "RemovePeer",
97            PoolEvent::HandshakeFailed(_) => "HandshakeFailed",
98            PoolEvent::ConnectFailed(_, _) => "ConnectFailed",
99            PoolEvent::PeerAlreadyConnected(_) => "PeerAlreadyConnected",
100        }
101    }
102}
103
104impl DiscoveryKind {
105    pub(super) fn get_endpoint(&self) -> Option<&Endpoint> {
106        match self {
107            DiscoveryKind::LookupStarted(endpoint)
108            | DiscoveryKind::LookupFailed(endpoint)
109            | DiscoveryKind::LookupSucceeded(endpoint, _) => Some(endpoint),
110            _ => None,
111        }
112    }
113
114    pub(super) fn get_size(&self) -> Option<usize> {
115        match self {
116            DiscoveryKind::LookupSucceeded(_, size) | DiscoveryKind::RefreshSucceeded(size) => {
117                Some(*size)
118            }
119            _ => None,
120        }
121    }
122
123    pub(super) fn get_peer_id(&self) -> Option<&PeerID> {
124        match self {
125            DiscoveryKind::EntryEvicted(peer_id) => Some(peer_id),
126            _ => None,
127        }
128    }
129
130    pub(super) fn variant_name(&self) -> &'static str {
131        match self {
132            DiscoveryKind::LookupStarted(_) => "LookupStarted",
133            DiscoveryKind::LookupFailed(_) => "LookupFailed",
134            DiscoveryKind::LookupSucceeded(_, _) => "LookupSucceeded",
135            DiscoveryKind::RefreshStarted => "RefreshStarted",
136            DiscoveryKind::RefreshSucceeded(_) => "RefreshSucceeded",
137            DiscoveryKind::RefreshFailed => "RefreshFailed",
138            DiscoveryKind::EntryEvicted(_) => "EntryEvicted",
139        }
140    }
141}