libp2p/builder/
phase.rs

1#![allow(unused_imports)]
2
3mod bandwidth_logging;
4mod bandwidth_metrics;
5mod behaviour;
6mod build;
7mod dns;
8mod identity;
9mod other_transport;
10mod provider;
11mod quic;
12mod relay;
13mod swarm;
14mod tcp;
15mod websocket;
16
17use bandwidth_logging::*;
18use bandwidth_metrics::*;
19use behaviour::*;
20use build::*;
21use dns::*;
22use other_transport::*;
23use provider::*;
24use quic::*;
25use relay::*;
26use swarm::*;
27use tcp::*;
28use websocket::*;
29
30use super::select_muxer::SelectMuxerUpgrade;
31use super::select_security::SelectSecurityUpgrade;
32use super::SwarmBuilder;
33
34use libp2p_core::{muxing::StreamMuxerBox, Transport};
35use libp2p_identity::Keypair;
36
37#[allow(unreachable_pub)]
38pub trait IntoSecurityUpgrade<C> {
39    type Upgrade;
40    type Error;
41
42    fn into_security_upgrade(self, keypair: &Keypair) -> Result<Self::Upgrade, Self::Error>;
43}
44
45impl<C, T, F, E> IntoSecurityUpgrade<C> for F
46where
47    F: for<'a> FnOnce(&'a Keypair) -> Result<T, E>,
48{
49    type Upgrade = T;
50    type Error = E;
51
52    fn into_security_upgrade(self, keypair: &Keypair) -> Result<Self::Upgrade, Self::Error> {
53        (self)(keypair)
54    }
55}
56
57impl<F1, F2, C> IntoSecurityUpgrade<C> for (F1, F2)
58where
59    F1: IntoSecurityUpgrade<C>,
60    F2: IntoSecurityUpgrade<C>,
61{
62    type Upgrade = SelectSecurityUpgrade<F1::Upgrade, F2::Upgrade>;
63    type Error = either::Either<F1::Error, F2::Error>;
64
65    fn into_security_upgrade(self, keypair: &Keypair) -> Result<Self::Upgrade, Self::Error> {
66        let (f1, f2) = self;
67
68        let u1 = f1
69            .into_security_upgrade(keypair)
70            .map_err(either::Either::Left)?;
71        let u2 = f2
72            .into_security_upgrade(keypair)
73            .map_err(either::Either::Right)?;
74
75        Ok(SelectSecurityUpgrade::new(u1, u2))
76    }
77}
78
79#[allow(unreachable_pub)]
80pub trait IntoMultiplexerUpgrade<C> {
81    type Upgrade;
82
83    fn into_multiplexer_upgrade(self) -> Self::Upgrade;
84}
85
86impl<C, U, F> IntoMultiplexerUpgrade<C> for F
87where
88    F: FnOnce() -> U,
89{
90    type Upgrade = U;
91
92    fn into_multiplexer_upgrade(self) -> Self::Upgrade {
93        (self)()
94    }
95}
96
97impl<C, U1, U2> IntoMultiplexerUpgrade<C> for (U1, U2)
98where
99    U1: IntoMultiplexerUpgrade<C>,
100    U2: IntoMultiplexerUpgrade<C>,
101{
102    type Upgrade = SelectMuxerUpgrade<U1::Upgrade, U2::Upgrade>;
103
104    fn into_multiplexer_upgrade(self) -> Self::Upgrade {
105        let (f1, f2) = self;
106
107        let u1 = f1.into_multiplexer_upgrade();
108        let u2 = f2.into_multiplexer_upgrade();
109
110        SelectMuxerUpgrade::new(u1, u2)
111    }
112}
113
114pub trait AuthenticatedMultiplexedTransport:
115    Transport<
116        Error = Self::E,
117        Dial = Self::D,
118        ListenerUpgrade = Self::U,
119        Output = (libp2p_identity::PeerId, StreamMuxerBox),
120    > + Send
121    + Unpin
122    + 'static
123{
124    type E: Send + Sync + 'static;
125    type D: Send;
126    type U: Send;
127}
128
129impl<T> AuthenticatedMultiplexedTransport for T
130where
131    T: Transport<Output = (libp2p_identity::PeerId, StreamMuxerBox)> + Send + Unpin + 'static,
132    <T as Transport>::Error: Send + Sync + 'static,
133    <T as Transport>::Dial: Send,
134    <T as Transport>::ListenerUpgrade: Send,
135{
136    type E = T::Error;
137    type D = T::Dial;
138    type U = T::ListenerUpgrade;
139}