1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use libp2p::{
gossipsub::{Gossipsub, GossipsubEvent},
identify::{Identify, IdentifyEvent},
ping,
swarm::NetworkBehaviourEventProcess,
NetworkBehaviour,
};
#[derive(NetworkBehaviour)]
#[behaviour(event_process = true)]
pub struct Subnet {
pub gossipsub: Gossipsub,
pub identify: Identify,
pub ping: ping::Behaviour,
}
impl NetworkBehaviourEventProcess<IdentifyEvent> for Subnet {
fn inject_event(&mut self, event: IdentifyEvent) {
println!("identify: {:?}", event);
}
}
impl NetworkBehaviourEventProcess<GossipsubEvent> for Subnet {
fn inject_event(&mut self, event: GossipsubEvent) {
match event {
GossipsubEvent::Message {
propagation_source: peer_id,
message_id: id,
message,
} => println!(
"Got message: {} with id: {} from peer: {:#?}",
String::from_utf8_lossy(&message.data),
id,
peer_id
),
_ => {}
}
}
}
impl NetworkBehaviourEventProcess<ping::Event> for Subnet {
fn inject_event(&mut self, event: ping::Event) {
match event {
ping::Event {
peer,
result: Result::Ok(ping::Success::Ping { rtt }),
} => {
println!(
"ping: rtt to {} is {} ms",
peer.to_base58(),
rtt.as_millis()
);
}
ping::Event {
peer,
result: Result::Ok(ping::Success::Pong),
} => {
println!("ping: pong from {}", peer.to_base58());
}
ping::Event {
peer,
result: Result::Err(ping::Failure::Timeout),
} => {
println!("ping: timeout to {}", peer.to_base58());
}
ping::Event {
peer,
result: Result::Err(ping::Failure::Unsupported),
} => {
println!("ping: {} does not support ping protocol", peer.to_base58());
}
ping::Event {
peer,
result: Result::Err(ping::Failure::Other { error }),
} => {
println!("ping: ping::Failure with {}: {}", peer.to_base58(), error);
}
}
}
}