p2p/network/kad/request/
p2p_network_kad_request_actions.rs

1use 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                // no request for New, some request for anything else.
87                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}