Skip to content

Commit 43a8ad8

Browse files
authored
protocols/relay/examples: Add client server instructions (#2060)
Add instructions on how to run a three node example where a listening relay client listens via a relay server and a dialing relay client dials the listening relay client via the relay server.
1 parent 8988ac2 commit 43a8ad8

File tree

1 file changed

+96
-5
lines changed

1 file changed

+96
-5
lines changed

protocols/relay/examples/relay.rs

Lines changed: 96 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,48 @@
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+
2154
use futures::executor::block_on;
2255
use futures::stream::StreamExt;
2356
use libp2p::core::upgrade;
57+
use libp2p::ping::{Ping, PingConfig, PingEvent};
2458
use libp2p::plaintext;
25-
use libp2p::relay::RelayConfig;
59+
use libp2p::relay::{Relay, RelayConfig};
2660
use libp2p::tcp::TcpConfig;
2761
use libp2p::Transport;
28-
use libp2p::{identity, PeerId, Swarm};
62+
use libp2p::{identity, Multiaddr, NetworkBehaviour, PeerId, Swarm};
2963
use std::error::Error;
3064
use std::task::{Context, Poll};
3165
use 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

Comments
 (0)