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