p2p/network/kad/stream/
p2p_network_kad_stream_actions.rs1use 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#[derive(Debug, Clone, Serialize, Deserialize, ActionEvent)]
14#[action_event(fields(display(addr), display(peer_id), stream_id, incoming, debug(data)))]
15pub enum P2pNetworkKademliaStreamAction {
16 New {
18 addr: ConnectionAddr,
19 peer_id: PeerId,
20 stream_id: StreamId,
21 incoming: bool,
22 },
23
24 IncomingData {
26 addr: ConnectionAddr,
27 peer_id: PeerId,
28 stream_id: StreamId,
29 data: Data,
30 },
31 RemoteClose {
33 addr: ConnectionAddr,
34 peer_id: PeerId,
35 stream_id: StreamId,
36 },
37
38 WaitIncoming {
40 addr: ConnectionAddr,
41 peer_id: PeerId,
42 stream_id: StreamId,
43 },
44 WaitOutgoing {
46 addr: ConnectionAddr,
47 peer_id: PeerId,
48 stream_id: StreamId,
49 callback: P2pNetworkKademliaStreamWaitOutgoingCallback,
50 },
51
52 SendRequest {
54 addr: ConnectionAddr,
55 peer_id: PeerId,
56 stream_id: StreamId,
57 data: P2pNetworkKademliaRpcRequest,
58 },
59 SendResponse {
61 addr: ConnectionAddr,
62 peer_id: PeerId,
63 stream_id: StreamId,
64 data: P2pNetworkKademliaRpcReply,
65 },
66 OutgoingDataReady {
68 addr: ConnectionAddr,
69 peer_id: PeerId,
70 stream_id: StreamId,
71 },
72
73 Close {
75 addr: ConnectionAddr,
76 peer_id: PeerId,
77 stream_id: StreamId,
78 },
79
80 #[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 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}