p2p/network/kad/stream/
p2p_network_kad_stream_actions.rs

1use openmina_core::ActionEvent;
2use redux::EnablingCondition;
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    ConnectionAddr, Data, P2pAction, P2pNetworkKademliaRpcReply, P2pNetworkKademliaRpcRequest,
7    P2pState, PeerId, StreamId,
8};
9
10use super::P2pNetworkKademliaStreamWaitOutgoingCallback;
11
12/// Kademlia stream related actions.
13#[derive(Debug, Clone, Serialize, Deserialize, ActionEvent)]
14#[action_event(fields(display(addr), display(peer_id), stream_id, incoming, debug(data)))]
15pub enum P2pNetworkKademliaStreamAction {
16    /// Creates a new stream state.
17    New {
18        addr: ConnectionAddr,
19        peer_id: PeerId,
20        stream_id: StreamId,
21        incoming: bool,
22    },
23
24    /// Handles incoming data from the stream.
25    IncomingData {
26        addr: ConnectionAddr,
27        peer_id: PeerId,
28        stream_id: StreamId,
29        data: Data,
30    },
31    /// Remote peer sent FIN to close the stream.
32    RemoteClose {
33        addr: ConnectionAddr,
34        peer_id: PeerId,
35        stream_id: StreamId,
36    },
37
38    /// Reinitializes existing stream state.
39    WaitIncoming {
40        addr: ConnectionAddr,
41        peer_id: PeerId,
42        stream_id: StreamId,
43    },
44    /// Sets the state to wait for outgoing data.
45    WaitOutgoing {
46        addr: ConnectionAddr,
47        peer_id: PeerId,
48        stream_id: StreamId,
49        callback: P2pNetworkKademliaStreamWaitOutgoingCallback,
50    },
51
52    /// Sends request to the stream.
53    SendRequest {
54        addr: ConnectionAddr,
55        peer_id: PeerId,
56        stream_id: StreamId,
57        data: P2pNetworkKademliaRpcRequest,
58    },
59    /// Sends response to the stream.
60    SendResponse {
61        addr: ConnectionAddr,
62        peer_id: PeerId,
63        stream_id: StreamId,
64        data: P2pNetworkKademliaRpcReply,
65    },
66    /// Outgoing data is ready to be sent via the stream.
67    OutgoingDataReady {
68        addr: ConnectionAddr,
69        peer_id: PeerId,
70        stream_id: StreamId,
71    },
72
73    /// Start closing outgoing stream (first closing our half of the stream)
74    Close {
75        addr: ConnectionAddr,
76        peer_id: PeerId,
77        stream_id: StreamId,
78    },
79
80    /// Removes the closed stream from the state.
81    #[action_event(level = trace)]
82    Prune {
83        addr: ConnectionAddr,
84        peer_id: PeerId,
85        stream_id: StreamId,
86    },
87}
88
89macro_rules! enum_field {
90    ($field:ident: $field_type:ty) => {
91        pub fn $field(&self) -> &$field_type {
92            match self {
93                P2pNetworkKademliaStreamAction::New { $field, .. }
94                | P2pNetworkKademliaStreamAction::IncomingData { $field, .. }
95                | P2pNetworkKademliaStreamAction::WaitOutgoing { $field, .. }
96                | P2pNetworkKademliaStreamAction::SendRequest { $field, .. }
97                | P2pNetworkKademliaStreamAction::SendResponse { $field, .. }
98                | P2pNetworkKademliaStreamAction::OutgoingDataReady { $field, .. }
99                | P2pNetworkKademliaStreamAction::WaitIncoming { $field, .. }
100                | P2pNetworkKademliaStreamAction::Close { $field, .. }
101                | P2pNetworkKademliaStreamAction::RemoteClose { $field, .. }
102                | P2pNetworkKademliaStreamAction::Prune { $field, .. } => $field,
103            }
104        }
105    };
106}
107
108impl P2pNetworkKademliaStreamAction {
109    enum_field!(addr: ConnectionAddr);
110    enum_field!(peer_id: PeerId);
111    enum_field!(stream_id: StreamId);
112}
113
114impl EnablingCondition<P2pState> for P2pNetworkKademliaStreamAction {
115    fn is_enabled(&self, _state: &P2pState, _time: redux::Timestamp) -> bool {
116        // TODO
117        true
118    }
119}
120
121impl From<P2pNetworkKademliaStreamAction> for P2pAction {
122    fn from(value: P2pNetworkKademliaStreamAction) -> Self {
123        P2pAction::Network(super::super::P2pNetworkKadAction::Stream(value).into())
124    }
125}