libp2p/builder/phase/
bandwidth_metrics.rs

1use std::{marker::PhantomData, sync::Arc};
2
3use super::*;
4use crate::SwarmBuilder;
5
6pub struct BandwidthMetricsPhase<T, R> {
7    pub(crate) relay_behaviour: R,
8    pub(crate) transport: T,
9}
10
11#[cfg(feature = "metrics")]
12impl<T: AuthenticatedMultiplexedTransport, Provider, R>
13    SwarmBuilder<Provider, BandwidthMetricsPhase<T, R>>
14{
15    pub fn with_bandwidth_metrics(
16        self,
17        registry: &mut libp2p_metrics::Registry,
18    ) -> SwarmBuilder<Provider, BehaviourPhase<impl AuthenticatedMultiplexedTransport, R>> {
19        SwarmBuilder {
20            phase: BehaviourPhase {
21                relay_behaviour: self.phase.relay_behaviour,
22                transport: libp2p_metrics::BandwidthTransport::new(self.phase.transport, registry)
23                    .map(|(peer_id, conn), _| (peer_id, StreamMuxerBox::new(conn))),
24            },
25            keypair: self.keypair,
26            phantom: PhantomData,
27        }
28    }
29}
30
31impl<T, Provider, R> SwarmBuilder<Provider, BandwidthMetricsPhase<T, R>> {
32    pub fn without_bandwidth_metrics(self) -> SwarmBuilder<Provider, BehaviourPhase<T, R>> {
33        SwarmBuilder {
34            phase: BehaviourPhase {
35                relay_behaviour: self.phase.relay_behaviour,
36                transport: self.phase.transport,
37            },
38            keypair: self.keypair,
39            phantom: PhantomData,
40        }
41    }
42}
43
44// Shortcuts
45#[cfg(feature = "relay")]
46impl<Provider, T: AuthenticatedMultiplexedTransport>
47    SwarmBuilder<Provider, BandwidthMetricsPhase<T, libp2p_relay::client::Behaviour>>
48{
49    pub fn with_behaviour<B, R: TryIntoBehaviour<B>>(
50        self,
51        constructor: impl FnOnce(&libp2p_identity::Keypair, libp2p_relay::client::Behaviour) -> R,
52    ) -> Result<SwarmBuilder<Provider, SwarmPhase<T, B>>, R::Error> {
53        self.without_bandwidth_metrics().with_behaviour(constructor)
54    }
55}
56
57impl<Provider, T: AuthenticatedMultiplexedTransport>
58    SwarmBuilder<Provider, BandwidthMetricsPhase<T, NoRelayBehaviour>>
59{
60    pub fn with_behaviour<B, R: TryIntoBehaviour<B>>(
61        self,
62        constructor: impl FnOnce(&libp2p_identity::Keypair) -> R,
63    ) -> Result<SwarmBuilder<Provider, SwarmPhase<T, B>>, R::Error> {
64        self.without_bandwidth_metrics().with_behaviour(constructor)
65    }
66}