libp2p/builder/phase/
bandwidth_metrics.rs

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