p2p/channels/
p2p_channels_state.rs

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