@@ -50,7 +50,7 @@ use libp2p::kad::{
5050use libp2p:: {
5151 development_transport, identity,
5252 mdns:: { Mdns , MdnsConfig , MdnsEvent } ,
53- swarm:: { NetworkBehaviourEventProcess , SwarmEvent } ,
53+ swarm:: SwarmEvent ,
5454 NetworkBehaviour , PeerId , Swarm ,
5555} ;
5656use std:: error:: Error ;
@@ -68,28 +68,60 @@ async fn main() -> Result<(), Box<dyn Error>> {
6868
6969 // We create a custom network behaviour that combines Kademlia and mDNS.
7070 #[ derive( NetworkBehaviour ) ]
71- #[ behaviour( event_process = true ) ]
71+ #[ behaviour( out_event = "MyBehaviourEvent" ) ]
7272 struct MyBehaviour {
7373 kademlia : Kademlia < MemoryStore > ,
7474 mdns : Mdns ,
7575 }
7676
77- impl NetworkBehaviourEventProcess < MdnsEvent > for MyBehaviour {
78- // Called when `mdns` produces an event.
79- fn inject_event ( & mut self , event : MdnsEvent ) {
80- if let MdnsEvent :: Discovered ( list) = event {
81- for ( peer_id, multiaddr) in list {
82- self . kademlia . add_address ( & peer_id, multiaddr) ;
83- }
84- }
77+ enum MyBehaviourEvent {
78+ Kademlia ( KademliaEvent ) ,
79+ Mdns ( MdnsEvent ) ,
80+ }
81+
82+ impl From < KademliaEvent > for MyBehaviourEvent {
83+ fn from ( event : KademliaEvent ) -> Self {
84+ MyBehaviourEvent :: Kademlia ( event)
85+ }
86+ }
87+
88+ impl From < MdnsEvent > for MyBehaviourEvent {
89+ fn from ( event : MdnsEvent ) -> Self {
90+ MyBehaviourEvent :: Mdns ( event)
8591 }
8692 }
8793
88- impl NetworkBehaviourEventProcess < KademliaEvent > for MyBehaviour {
89- // Called when `kademlia` produces an event.
90- fn inject_event ( & mut self , message : KademliaEvent ) {
91- match message {
92- KademliaEvent :: OutboundQueryCompleted { result, .. } => match result {
94+ // Create a swarm to manage peers and events.
95+ let mut swarm = {
96+ // Create a Kademlia behaviour.
97+ let store = MemoryStore :: new ( local_peer_id) ;
98+ let kademlia = Kademlia :: new ( local_peer_id, store) ;
99+ let mdns = task:: block_on ( Mdns :: new ( MdnsConfig :: default ( ) ) ) ?;
100+ let behaviour = MyBehaviour { kademlia, mdns } ;
101+ Swarm :: new ( transport, behaviour, local_peer_id)
102+ } ;
103+
104+ // Read full lines from stdin
105+ let mut stdin = io:: BufReader :: new ( io:: stdin ( ) ) . lines ( ) . fuse ( ) ;
106+
107+ // Listen on all interfaces and whatever port the OS assigns.
108+ swarm. listen_on ( "/ip4/0.0.0.0/tcp/0" . parse ( ) ?) ?;
109+
110+ // Kick it off.
111+ loop {
112+ select ! {
113+ line = stdin. select_next_some( ) => handle_input_line( & mut swarm. behaviour_mut( ) . kademlia, line. expect( "Stdin not to close" ) ) ,
114+ event = swarm. select_next_some( ) => match event {
115+ SwarmEvent :: NewListenAddr { address, .. } => {
116+ println!( "Listening in {:?}" , address) ;
117+ } ,
118+ SwarmEvent :: Behaviour ( MyBehaviourEvent :: Mdns ( MdnsEvent :: Discovered ( list) ) ) => {
119+ for ( peer_id, multiaddr) in list {
120+ swarm. behaviour_mut( ) . kademlia. add_address( & peer_id, multiaddr) ;
121+ }
122+ }
123+ SwarmEvent :: Behaviour ( MyBehaviourEvent :: Kademlia ( KademliaEvent :: OutboundQueryCompleted { result, ..} ) ) => {
124+ match result {
93125 QueryResult :: GetProviders ( Ok ( ok) ) => {
94126 for peer in ok. providers {
95127 println!(
@@ -137,38 +169,10 @@ async fn main() -> Result<(), Box<dyn Error>> {
137169 eprintln!( "Failed to put provider record: {:?}" , err) ;
138170 }
139171 _ => { }
140- } ,
141- _ => { }
172+ }
142173 }
174+ _ => { }
143175 }
144- }
145-
146- // Create a swarm to manage peers and events.
147- let mut swarm = {
148- // Create a Kademlia behaviour.
149- let store = MemoryStore :: new ( local_peer_id) ;
150- let kademlia = Kademlia :: new ( local_peer_id, store) ;
151- let mdns = task:: block_on ( Mdns :: new ( MdnsConfig :: default ( ) ) ) ?;
152- let behaviour = MyBehaviour { kademlia, mdns } ;
153- Swarm :: new ( transport, behaviour, local_peer_id)
154- } ;
155-
156- // Read full lines from stdin
157- let mut stdin = io:: BufReader :: new ( io:: stdin ( ) ) . lines ( ) . fuse ( ) ;
158-
159- // Listen on all interfaces and whatever port the OS assigns.
160- swarm. listen_on ( "/ip4/0.0.0.0/tcp/0" . parse ( ) ?) ?;
161-
162- // Kick it off.
163- loop {
164- select ! {
165- line = stdin. select_next_some( ) => handle_input_line( & mut swarm. behaviour_mut( ) . kademlia, line. expect( "Stdin not to close" ) ) ,
166- event = swarm. select_next_some( ) => match event {
167- SwarmEvent :: NewListenAddr { address, .. } => {
168- println!( "Listening in {:?}" , address) ;
169- } ,
170- _ => { }
171- }
172176 }
173177 }
174178}
0 commit comments