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}