p2p/channels/
p2p_channels_actions.rs

1use openmina_core::log::ActionEvent;
2use redux::Callback;
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    identity::PublicKey,
7    webrtc::{EncryptedAnswer, EncryptedOffer, Offer, P2pConnectionResponse},
8    P2pState, PeerId,
9};
10
11use super::{
12    best_tip::P2pChannelsBestTipAction,
13    rpc::P2pChannelsRpcAction,
14    signaling::{
15        discovery::P2pChannelsSignalingDiscoveryAction,
16        exchange::P2pChannelsSignalingExchangeAction,
17    },
18    snark::P2pChannelsSnarkAction,
19    snark_job_commitment::P2pChannelsSnarkJobCommitmentAction,
20    streaming_rpc::P2pChannelsStreamingRpcAction,
21    transaction::P2pChannelsTransactionAction,
22    ChannelId, ChannelMsg, MsgId,
23};
24
25#[derive(Serialize, Deserialize, Debug, Clone, openmina_core::ActionEvent)]
26pub enum P2pChannelsAction {
27    MessageReceived(P2pChannelsMessageReceivedAction),
28    SignalingDiscovery(P2pChannelsSignalingDiscoveryAction),
29    SignalingExchange(P2pChannelsSignalingExchangeAction),
30    BestTip(P2pChannelsBestTipAction),
31    Transaction(P2pChannelsTransactionAction),
32    Snark(P2pChannelsSnarkAction),
33    SnarkJobCommitment(P2pChannelsSnarkJobCommitmentAction),
34    Rpc(P2pChannelsRpcAction),
35    StreamingRpc(P2pChannelsStreamingRpcAction),
36}
37
38#[derive(Serialize, Deserialize, Debug, Clone, openmina_core::ActionEvent)]
39pub enum P2pChannelsEffectfulAction {
40    InitChannel {
41        peer_id: PeerId,
42        id: ChannelId,
43        on_success: Callback<PeerId>,
44    },
45    MessageSend {
46        peer_id: PeerId,
47        msg_id: MsgId,
48        msg: ChannelMsg,
49    },
50    SignalingDiscoveryAnswerDecrypt {
51        peer_id: PeerId,
52        pub_key: PublicKey,
53        answer: EncryptedAnswer,
54    },
55    SignalingDiscoveryOfferEncryptAndSend {
56        peer_id: PeerId,
57        pub_key: PublicKey,
58        offer: Box<Offer>,
59    },
60    SignalingExchangeOfferDecrypt {
61        peer_id: PeerId,
62        pub_key: PublicKey,
63        offer: EncryptedOffer,
64    },
65    SignalingExchangeAnswerEncryptAndSend {
66        peer_id: PeerId,
67        pub_key: PublicKey,
68        answer: Option<P2pConnectionResponse>,
69    },
70}
71
72impl P2pChannelsAction {
73    pub fn peer_id(&self) -> Option<&PeerId> {
74        match self {
75            Self::MessageReceived(v) => Some(&v.peer_id),
76            Self::SignalingDiscovery(v) => Some(v.peer_id()),
77            Self::SignalingExchange(v) => Some(v.peer_id()),
78            Self::BestTip(v) => Some(v.peer_id()),
79            Self::Transaction(v) => v.peer_id(),
80            Self::Snark(v) => v.peer_id(),
81            Self::SnarkJobCommitment(v) => Some(v.peer_id()),
82            Self::Rpc(v) => Some(v.peer_id()),
83            Self::StreamingRpc(v) => Some(v.peer_id()),
84        }
85    }
86}
87
88impl redux::EnablingCondition<crate::P2pState> for P2pChannelsAction {
89    fn is_enabled(&self, state: &crate::P2pState, time: redux::Timestamp) -> bool {
90        match self {
91            P2pChannelsAction::MessageReceived(a) => a.is_enabled(state, time),
92            P2pChannelsAction::SignalingDiscovery(a) => a.is_enabled(state, time),
93            P2pChannelsAction::SignalingExchange(a) => a.is_enabled(state, time),
94            P2pChannelsAction::Transaction(a) => a.is_enabled(state, time),
95            P2pChannelsAction::BestTip(a) => a.is_enabled(state, time),
96            P2pChannelsAction::Snark(a) => a.is_enabled(state, time),
97            P2pChannelsAction::SnarkJobCommitment(a) => a.is_enabled(state, time),
98            P2pChannelsAction::Rpc(a) => a.is_enabled(state, time),
99            P2pChannelsAction::StreamingRpc(a) => a.is_enabled(state, time),
100        }
101    }
102}
103
104impl redux::EnablingCondition<crate::P2pState> for P2pChannelsEffectfulAction {
105    fn is_enabled(&self, _state: &crate::P2pState, _time: redux::Timestamp) -> bool {
106        true
107    }
108}
109
110#[derive(Serialize, Deserialize, Debug, Clone)]
111pub struct P2pChannelsMessageReceivedAction {
112    pub peer_id: PeerId,
113    pub message: Box<ChannelMsg>,
114}
115
116impl redux::EnablingCondition<P2pState> for P2pChannelsMessageReceivedAction {
117    fn is_enabled(&self, state: &P2pState, _time: redux::Timestamp) -> bool {
118        state
119            .get_ready_peer(&self.peer_id)
120            .is_some_and(|p| p.channels.is_channel_ready(self.message.channel_id()))
121    }
122}
123
124impl From<P2pChannelsMessageReceivedAction> for crate::P2pAction {
125    fn from(a: P2pChannelsMessageReceivedAction) -> Self {
126        Self::Channels(P2pChannelsAction::MessageReceived(a))
127    }
128}
129
130impl ActionEvent for P2pChannelsMessageReceivedAction {
131    fn action_event<T>(&self, _context: &T)
132    where
133        T: openmina_core::log::EventContext,
134    {
135    }
136}