1pub use ::p2p::*;
2use p2p::{
3 channels::P2pChannelsEffectfulAction,
4 network::identify::stream_effectful::P2pNetworkIdentifyStreamEffectfulAction,
5};
6
7pub mod channels;
8pub mod connection;
9pub mod disconnection;
10pub mod network;
11pub mod peer;
12
13pub mod callbacks;
14
15mod p2p_effects;
16pub use p2p_effects::*;
17use redux::EnablingCondition;
18
19use crate::State;
20
21impl<S> redux::SubStore<crate::State, P2pState> for crate::Store<S>
22where
23 S: redux::Service,
24{
25 type SubAction = P2pAction;
26 type Service = S;
27
28 fn state(&self) -> &P2pState {
29 self.state
30 .get()
31 .p2p
32 .ready()
33 .expect("p2p should be initialized")
34 }
35
36 fn service(&mut self) -> &mut Self::Service {
37 &mut self.service
38 }
39
40 fn state_and_service(&mut self) -> (&P2pState, &mut Self::Service) {
41 (
42 self.state
43 .get()
44 .p2p
45 .ready()
46 .expect("p2p should be initialized"),
47 &mut self.service,
48 )
49 }
50
51 fn dispatch<A>(&mut self, action: A) -> bool
52 where
53 A: Into<P2pAction> + redux::EnablingCondition<P2pState>,
54 {
55 crate::Store::sub_dispatch(self, action)
56 }
57
58 fn dispatch_callback<T>(&mut self, callback: redux::Callback<T>, args: T) -> bool
59 where
60 T: 'static,
61 P2pAction: From<redux::AnyAction> + redux::EnablingCondition<P2pState>,
62 {
63 crate::Store::dispatch_callback(self, callback, args)
64 }
65}
66
67impl EnablingCondition<State> for P2pInitializeAction {
68 fn is_enabled(&self, state: &State, _time: redux::Timestamp) -> bool {
69 state.p2p.ready().is_none()
70 }
71}
72
73macro_rules! impl_into_global_action {
74 ($a:ty) => {
75 impl From<$a> for crate::Action {
76 fn from(value: $a) -> Self {
77 Self::P2p(value.into())
78 }
79 }
80 };
81 (effectful $a:ty) => {
82 impl From<$a> for crate::Action {
83 fn from(value: $a) -> Self {
84 Self::P2pEffectful(value.into())
85 }
86 }
87 };
88}
89
90impl_into_global_action!(P2pInitializeAction);
91
92impl_into_global_action!(connection::outgoing::P2pConnectionOutgoingAction);
93
94impl_into_global_action!(connection::incoming::P2pConnectionIncomingAction);
95
96impl_into_global_action!(disconnection::P2pDisconnectionAction);
97
98impl_into_global_action!(network::P2pNetworkSchedulerAction);
99impl_into_global_action!(network::kad::P2pNetworkKademliaAction);
100impl_into_global_action!(network::pubsub::P2pNetworkPubsubAction);
101
102impl_into_global_action!(channels::P2pChannelsMessageReceivedAction);
103impl_into_global_action!(channels::signaling::discovery::P2pChannelsSignalingDiscoveryAction);
104impl_into_global_action!(channels::signaling::exchange::P2pChannelsSignalingExchangeAction);
105impl_into_global_action!(channels::best_tip::P2pChannelsBestTipAction);
106impl_into_global_action!(channels::transaction::P2pChannelsTransactionAction);
107impl_into_global_action!(channels::snark::P2pChannelsSnarkAction);
108impl_into_global_action!(channels::snark_job_commitment::P2pChannelsSnarkJobCommitmentAction);
109impl_into_global_action!(channels::rpc::P2pChannelsRpcAction);
110impl_into_global_action!(channels::streaming_rpc::P2pChannelsStreamingRpcAction);
111
112impl_into_global_action!(p2p::P2pNetworkKademliaStreamAction);
113impl_into_global_action!(p2p::P2pNetworkKadRequestAction);
114impl_into_global_action!(p2p::P2pNetworkKadBootstrapAction);
115impl_into_global_action!(p2p::P2pNetworkYamuxAction);
116impl_into_global_action!(p2p::peer::P2pPeerAction);
117impl_into_global_action!(p2p::network::identify::stream::P2pNetworkIdentifyStreamAction);
118impl_into_global_action!(p2p::identify::P2pIdentifyAction);
119impl_into_global_action!(p2p::P2pNetworkSelectAction);
120impl_into_global_action!(p2p::P2pNetworkPnetAction);
121impl_into_global_action!(p2p::P2pNetworkNoiseAction);
122impl_into_global_action!(p2p::P2pNetworkRpcAction);
123
124impl_into_global_action!(effectful network::kad_effectful::P2pNetworkKadEffectfulAction);
125impl_into_global_action!(effectful p2p::P2pNetworkSchedulerEffectfulAction);
126impl_into_global_action!(effectful p2p::P2pNetworkPnetEffectfulAction);
127impl_into_global_action!(effectful connection::incoming_effectful::P2pConnectionIncomingEffectfulAction);
128impl_into_global_action!(effectful connection::outgoing_effectful::P2pConnectionOutgoingEffectfulAction);
129impl_into_global_action!(effectful p2p::disconnection_effectful::P2pDisconnectionEffectfulAction);
130impl_into_global_action!(effectful network::pubsub::P2pNetworkPubsubEffectfulAction);
131impl_into_global_action!(effectful P2pNetworkIdentifyStreamEffectfulAction);
132impl_into_global_action!(effectful P2pChannelsEffectfulAction);
133
134impl p2p::P2pActionTrait<crate::State> for crate::Action {}