p2p/network/yamux/
p2p_network_yamux_actions.rs1use openmina_core::ActionEvent;
2use serde::{Deserialize, Serialize};
3
4use super::p2p_network_yamux_state::{StreamId, YamuxFlags, YamuxFrame, YamuxPing};
5use crate::{token, ConnectionAddr, Data, P2pState};
6
7#[derive(Serialize, Deserialize, Debug, Clone, ActionEvent)]
8#[action_event(fields(display(addr), stream_id, debug(data), fin, debug(stream_kind)))]
9pub enum P2pNetworkYamuxAction {
10 IncomingData {
11 addr: ConnectionAddr,
12 data: Data,
13 },
14 OutgoingData {
15 addr: ConnectionAddr,
16 stream_id: StreamId,
17 data: Data,
18 flags: YamuxFlags,
19 },
20 #[action_event(level = trace)]
21 IncomingFrame {
22 addr: ConnectionAddr,
23 },
24 #[action_event(level = trace)]
25 OutgoingFrame {
26 addr: ConnectionAddr,
27 frame: YamuxFrame,
28 },
29 PingStream {
30 addr: ConnectionAddr,
31 ping: YamuxPing,
32 },
33 OpenStream {
34 addr: ConnectionAddr,
35 stream_id: StreamId,
36 stream_kind: token::StreamKind,
37 },
38}
39
40impl P2pNetworkYamuxAction {
41 pub fn addr(&self) -> &ConnectionAddr {
42 match self {
43 Self::IncomingData { addr, .. } => addr,
44 Self::OutgoingData { addr, .. } => addr,
45 Self::IncomingFrame { addr, .. } => addr,
46 Self::OutgoingFrame { addr, .. } => addr,
47 Self::PingStream { addr, .. } => addr,
48 Self::OpenStream { addr, .. } => addr,
49 }
50 }
51}
52
53impl From<P2pNetworkYamuxAction> for crate::P2pAction {
54 fn from(a: P2pNetworkYamuxAction) -> Self {
55 Self::Network(a.into())
56 }
57}
58
59impl redux::EnablingCondition<P2pState> for P2pNetworkYamuxAction {
60 fn is_enabled(&self, state: &P2pState, _time: redux::Timestamp) -> bool {
61 let Some(yamux_state) = state
62 .network
63 .scheduler
64 .connection_state(self.addr())
65 .and_then(|state| state.yamux_state())
66 else {
67 return false;
68 };
69
70 match self {
71 P2pNetworkYamuxAction::IncomingData { .. } => true,
72 P2pNetworkYamuxAction::OutgoingData { stream_id, .. } => {
73 yamux_state.streams.contains_key(stream_id)
74 }
75 P2pNetworkYamuxAction::IncomingFrame { .. } => true,
76 P2pNetworkYamuxAction::OutgoingFrame { .. } => true,
77 P2pNetworkYamuxAction::PingStream { .. } => true,
78 P2pNetworkYamuxAction::OpenStream { .. } => true,
79 }
80 }
81}