p2p/network/yamux/
p2p_network_yamux_actions.rs

1use 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}