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