p2p/network/kad/request/
p2p_network_kad_request_actions.rs1use std::net::SocketAddr;
2
3use openmina_core::ActionEvent;
4use redux::{Callback, EnablingCondition};
5use serde::{Deserialize, Serialize};
6
7use crate::{
8 ConnectionAddr, P2pAction, P2pNetworkKadEntry, P2pNetworkKademliaRpcRequest, P2pState, PeerId,
9 StreamId,
10};
11
12type StreamReadyCallback = Callback<(
13 ConnectionAddr,
14 PeerId,
15 StreamId,
16 P2pNetworkKademliaRpcRequest,
17)>;
18
19#[derive(Clone, Debug, Serialize, Deserialize, ActionEvent)]
20#[action_event(fields(display(peer_id), display(addr), display(key), stream_id, error))]
21pub enum P2pNetworkKadRequestAction {
22 New {
23 peer_id: PeerId,
24 addr: SocketAddr,
25 key: PeerId,
26 },
27 PeerIsConnecting {
28 peer_id: PeerId,
29 },
30 MuxReady {
31 peer_id: PeerId,
32 addr: ConnectionAddr,
33 },
34 StreamIsCreating {
35 peer_id: PeerId,
36 stream_id: StreamId,
37 },
38 StreamReady {
39 peer_id: PeerId,
40 stream_id: StreamId,
41 addr: ConnectionAddr,
42 callback: StreamReadyCallback,
43 },
44 RequestSent {
45 peer_id: PeerId,
46 },
47 ReplyReceived {
48 peer_id: PeerId,
49 stream_id: StreamId,
50 data: Vec<P2pNetworkKadEntry>,
51 },
52 #[action_event(level = trace)]
53 Prune {
54 peer_id: PeerId,
55 },
56 #[action_event(level = debug)]
57 Error {
58 peer_id: PeerId,
59 error: String,
60 },
61}
62
63impl P2pNetworkKadRequestAction {
64 pub fn peer_id(&self) -> &PeerId {
65 match self {
66 P2pNetworkKadRequestAction::New { peer_id, .. }
67 | P2pNetworkKadRequestAction::PeerIsConnecting { peer_id, .. }
68 | P2pNetworkKadRequestAction::MuxReady { peer_id, .. }
69 | P2pNetworkKadRequestAction::StreamIsCreating { peer_id, .. }
70 | P2pNetworkKadRequestAction::StreamReady { peer_id, .. }
71 | P2pNetworkKadRequestAction::RequestSent { peer_id, .. }
72 | P2pNetworkKadRequestAction::ReplyReceived { peer_id, .. }
73 | P2pNetworkKadRequestAction::Prune { peer_id, .. }
74 | P2pNetworkKadRequestAction::Error { peer_id, .. } => peer_id,
75 }
76 }
77}
78
79impl EnablingCondition<P2pState> for P2pNetworkKadRequestAction {
80 fn is_enabled(&self, state: &P2pState, _time: redux::Timestamp) -> bool {
81 state
82 .network
83 .scheduler
84 .discovery_state()
85 .is_some_and(|discovery_state| {
86 discovery_state.request(self.peer_id()).is_none()
88 == matches!(self, P2pNetworkKadRequestAction::New { .. })
89 })
90 }
91}
92
93impl From<P2pNetworkKadRequestAction> for P2pAction {
94 fn from(value: P2pNetworkKadRequestAction) -> Self {
95 P2pAction::Network(super::super::P2pNetworkKadAction::Request(value).into())
96 }
97}