p2p/channels/
p2p_channels_state.rs1use std::collections::BTreeSet;
2
3use serde::{Deserialize, Serialize};
4
5use super::{
6 best_tip::P2pChannelsBestTipState,
7 rpc::{P2pChannelsRpcState, P2pRpcId},
8 signaling::{
9 discovery::P2pChannelsSignalingDiscoveryState, exchange::P2pChannelsSignalingExchangeState,
10 P2pChannelsSignalingState,
11 },
12 snark::P2pChannelsSnarkState,
13 snark_job_commitment::P2pChannelsSnarkJobCommitmentState,
14 streaming_rpc::P2pChannelsStreamingRpcState,
15 transaction::P2pChannelsTransactionState,
16 ChannelId,
17};
18
19#[derive(Serialize, Deserialize, Debug, Clone)]
20pub struct P2pChannelsState {
21 pub signaling: P2pChannelsSignalingState,
22 pub best_tip: P2pChannelsBestTipState,
23 pub transaction: P2pChannelsTransactionState,
24 pub snark: P2pChannelsSnarkState,
25 pub snark_job_commitment: P2pChannelsSnarkJobCommitmentState,
26 pub rpc: P2pChannelsRpcState,
27 pub streaming_rpc: P2pChannelsStreamingRpcState,
28
29 pub(super) next_local_rpc_id: P2pRpcId,
30}
31
32impl P2pChannelsState {
33 pub fn new(enabled_channels: &BTreeSet<ChannelId>) -> Self {
34 Self {
35 signaling: P2pChannelsSignalingState {
36 discovery: match enabled_channels.contains(&ChannelId::SignalingDiscovery) {
37 false => P2pChannelsSignalingDiscoveryState::Disabled,
38 true => P2pChannelsSignalingDiscoveryState::Enabled,
39 },
40 exchange: match enabled_channels.contains(&ChannelId::SignalingExchange) {
41 false => P2pChannelsSignalingExchangeState::Disabled,
42 true => P2pChannelsSignalingExchangeState::Enabled,
43 },
44 },
45 best_tip: match enabled_channels.contains(&ChannelId::BestTipPropagation) {
46 false => P2pChannelsBestTipState::Disabled,
47 true => P2pChannelsBestTipState::Enabled,
48 },
49 snark_job_commitment: match enabled_channels
50 .contains(&ChannelId::SnarkJobCommitmentPropagation)
51 {
52 false => P2pChannelsSnarkJobCommitmentState::Disabled,
53 true => P2pChannelsSnarkJobCommitmentState::Enabled,
54 },
55 transaction: match enabled_channels.contains(&ChannelId::TransactionPropagation) {
56 false => P2pChannelsTransactionState::Disabled,
57 true => P2pChannelsTransactionState::Enabled,
58 },
59 snark: match enabled_channels.contains(&ChannelId::SnarkPropagation) {
60 false => P2pChannelsSnarkState::Disabled,
61 true => P2pChannelsSnarkState::Enabled,
62 },
63 rpc: match enabled_channels.contains(&ChannelId::Rpc) {
64 false => P2pChannelsRpcState::Disabled,
65 true => P2pChannelsRpcState::Enabled,
66 },
67 streaming_rpc: match enabled_channels.contains(&ChannelId::StreamingRpc) {
68 false => P2pChannelsStreamingRpcState::Disabled,
69 true => P2pChannelsStreamingRpcState::Enabled,
70 },
71
72 next_local_rpc_id: 0,
73 }
74 }
75
76 pub fn next_local_rpc_id(&self) -> P2pRpcId {
77 self.next_local_rpc_id
78 }
79
80 pub fn rpc_remote_last_responded(&self) -> redux::Timestamp {
81 std::cmp::max(
82 self.rpc.remote_last_responded(),
83 self.streaming_rpc.remote_last_responded(),
84 )
85 }
86}
87
88impl P2pChannelsState {
89 pub fn is_channel_ready(&self, chan_id: ChannelId) -> bool {
90 match chan_id {
91 ChannelId::SignalingDiscovery => self.signaling.discovery.is_ready(),
92 ChannelId::SignalingExchange => self.signaling.exchange.is_ready(),
93 ChannelId::BestTipPropagation => self.best_tip.is_ready(),
94 ChannelId::TransactionPropagation => self.transaction.is_ready(),
95 ChannelId::SnarkPropagation => self.snark.is_ready(),
96 ChannelId::SnarkJobCommitmentPropagation => self.snark_job_commitment.is_ready(),
97 ChannelId::Rpc => self.rpc.is_ready(),
98 ChannelId::StreamingRpc => self.rpc.is_ready(),
99 }
100 }
101}