1818// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1919// DEALINGS IN THE SOFTWARE.
2020
21+ //! A basic relay server and relay client implementation.
22+ //!
23+ //! The example below involves three nodes: (1) a relay server, (2) a listening
24+ //! relay client listening via the relay server and (3) a dialing relay client
25+ //! dialing the listening relay client via the relay server.
26+ //!
27+ //! 1. To start the relay server, run `cargo run --example relay -- relay` which will print
28+ //! something along the lines of:
29+ //!
30+ //! ```
31+ //! Local peer id: PeerId("12D3KooWAP5X5k9DS94n7AsiUAsaiso59Kioh14j2c13fCiudjdZ")
32+ //! # ^-- <peer-id-relay-server>
33+ //! Listening on "/ip6/::1/tcp/36537"
34+ //! # ^-- <addr-relay-server>
35+ //! ```
36+ //!
37+ //! 2. To start the listening relay client run `cargo run --example relay -- client-listen
38+ //! <addr-relay-server>/p2p/<peer-id-relay-server>/p2p-circuit` in a second terminal where:
39+ //!
40+ //! - `<addr-relay-server>`: one of the listening addresses of the relay server
41+ //! - `<peer-id-relay-server>`: the peer id of the relay server
42+ //!
43+ //! 3. To start the dialing relay client run `cargo run --example relay -- client-dial
44+ //! <addr-relay-server>/p2p/<peer-id-relay-server>/p2p-circuit/p2p/<peer-id-listening-relay-client>`
45+ //! in a third terminal where:
46+ //!
47+ //! - `<addr-relay-server>`: one of the listening addresses of the relay server
48+ //! - `<peer-id-relay-server>`: the peer id of the relay server
49+ //! - `<peer-id-listening-relay-client>`: the peer id of the listening relay client
50+ //!
51+ //! In the third terminal you will see the dialing relay client to receive pings from both the relay
52+ //! server AND from the listening relay client relayed via the relay server.
53+
2154use futures:: executor:: block_on;
2255use futures:: stream:: StreamExt ;
2356use libp2p:: core:: upgrade;
57+ use libp2p:: ping:: { Ping , PingConfig , PingEvent } ;
2458use libp2p:: plaintext;
25- use libp2p:: relay:: RelayConfig ;
59+ use libp2p:: relay:: { Relay , RelayConfig } ;
2660use libp2p:: tcp:: TcpConfig ;
2761use libp2p:: Transport ;
28- use libp2p:: { identity, PeerId , Swarm } ;
62+ use libp2p:: { identity, Multiaddr , NetworkBehaviour , PeerId , Swarm } ;
2963use std:: error:: Error ;
3064use std:: task:: { Context , Poll } ;
3165use std:: time:: Duration ;
@@ -47,6 +81,15 @@ fn main() -> Result<(), Box<dyn Error>> {
4781 let ( relay_wrapped_transport, relay_behaviour) =
4882 libp2p_relay:: new_transport_and_behaviour ( relay_config, tcp_transport) ;
4983
84+ let behaviour = Behaviour {
85+ relay : relay_behaviour,
86+ ping : Ping :: new (
87+ PingConfig :: new ( )
88+ . with_keep_alive ( true )
89+ . with_interval ( Duration :: from_secs ( 1 ) ) ,
90+ ) ,
91+ } ;
92+
5093 let plaintext = plaintext:: PlainText2Config {
5194 local_public_key : local_key. public ( ) ,
5295 } ;
@@ -57,10 +100,33 @@ fn main() -> Result<(), Box<dyn Error>> {
57100 . multiplex ( libp2p_yamux:: YamuxConfig :: default ( ) )
58101 . boxed ( ) ;
59102
60- let mut swarm = Swarm :: new ( transport, relay_behaviour , local_peer_id) ;
103+ let mut swarm = Swarm :: new ( transport, behaviour , local_peer_id) ;
61104
62- // Listen on all interfaces and whatever port the OS assigns
63- swarm. listen_on ( "/ip6/::/tcp/0" . parse ( ) ?) ?;
105+ match std:: env:: args ( )
106+ . nth ( 1 )
107+ . expect ( "Please provide either of relay, client-listen or client-dial." )
108+ . as_str ( )
109+ {
110+ "relay" => {
111+ // Listen on all interfaces and whatever port the OS assigns
112+ swarm. listen_on ( "/ip6/::/tcp/0" . parse ( ) ?) ?;
113+ }
114+ "client-listen" => {
115+ let addr: Multiaddr = std:: env:: args ( )
116+ . nth ( 2 )
117+ . expect ( "Please provide relayed listen address." )
118+ . parse ( ) ?;
119+ swarm. listen_on ( addr) ?;
120+ }
121+ "client-dial" => {
122+ let addr: Multiaddr = std:: env:: args ( )
123+ . nth ( 2 )
124+ . expect ( "Please provide relayed dial address." )
125+ . parse ( ) ?;
126+ swarm. dial_addr ( addr) ?;
127+ }
128+ s => panic ! ( "Unexpected argument {:?}" , s) ,
129+ }
64130
65131 let mut listening = false ;
66132 block_on ( futures:: future:: poll_fn ( move |cx : & mut Context < ' _ > | {
@@ -82,3 +148,28 @@ fn main() -> Result<(), Box<dyn Error>> {
82148 Poll :: Pending
83149 } ) )
84150}
151+
152+ #[ derive( NetworkBehaviour ) ]
153+ #[ behaviour( out_event = "Event" , event_process = false ) ]
154+ struct Behaviour {
155+ relay : Relay ,
156+ ping : Ping ,
157+ }
158+
159+ #[ derive( Debug ) ]
160+ enum Event {
161+ Relay ( ( ) ) ,
162+ Ping ( PingEvent ) ,
163+ }
164+
165+ impl From < PingEvent > for Event {
166+ fn from ( e : PingEvent ) -> Self {
167+ Event :: Ping ( e)
168+ }
169+ }
170+
171+ impl From < ( ) > for Event {
172+ fn from ( _: ( ) ) -> Self {
173+ Event :: Relay ( ( ) )
174+ }
175+ }
0 commit comments