@@ -3,8 +3,10 @@ use std::str::FromStr;
3
3
use clap:: Parser ;
4
4
use libp2p:: gossipsub;
5
5
use libp2p:: identity;
6
+ use libp2p:: PeerId ;
6
7
use multiaddr:: Multiaddr ;
7
8
use tokio:: io:: AsyncBufReadExt ;
9
+ use tracing:: debug;
8
10
use tracing:: { error, info} ;
9
11
use tracing_subscriber:: prelude:: * ;
10
12
use tracing_subscriber:: EnvFilter ;
@@ -51,7 +53,7 @@ impl FromStr for Mode {
51
53
match mode {
52
54
"interactive" => Ok ( Mode :: Interactive ) ,
53
55
"echo" => Ok ( Mode :: Echo ) ,
54
- _ => Err ( "Expected either 'dial ' or 'listen '" . to_string ( ) ) ,
56
+ _ => Err ( "Expected either 'interactive ' or 'echo '" . to_string ( ) ) ,
55
57
}
56
58
}
57
59
}
@@ -72,21 +74,24 @@ async fn main() -> eyre::Result<()> {
72
74
let keypair = generate_ed25519 ( opt. secret_key_seed ) ;
73
75
74
76
let ( network_client, mut network_events) =
75
- network:: run ( keypair, opt. port , opt. relay_address . clone ( ) ) . await ?;
77
+ network:: run ( keypair. clone ( ) , opt. port , opt. relay_address . clone ( ) ) . await ?;
76
78
77
79
if let Some ( peer_addrs) = opt. dial_peer_addrs {
78
80
for addr in peer_addrs {
81
+ info ! ( "Dialing peer: {}" , addr) ;
79
82
network_client. dial ( addr) . await ?;
80
83
}
81
84
}
82
85
83
86
if let Some ( topic_names) = opt. gossip_topic_names {
84
87
for topic_name in topic_names {
88
+ info ! ( "Subscribing to topic: {}" , topic_name) ;
85
89
let topic = gossipsub:: IdentTopic :: new ( topic_name) ;
86
90
network_client. subscribe ( topic) . await ?;
87
91
}
88
92
}
89
93
94
+ let peer_id = keypair. public ( ) . to_peer_id ( ) ;
90
95
match opt. mode {
91
96
Mode :: Interactive => {
92
97
let mut stdin = tokio:: io:: BufReader :: new ( tokio:: io:: stdin ( ) ) . lines ( ) ;
@@ -97,7 +102,7 @@ async fn main() -> eyre::Result<()> {
97
102
let Some ( event) = event else {
98
103
break ;
99
104
} ;
100
- handle_network_event( Mode :: Interactive , network_client. clone( ) , event) . await ?;
105
+ handle_network_event( network_client. clone( ) , event, peer_id , false ) . await ?;
101
106
}
102
107
line = stdin. next_line( ) => {
103
108
if let Some ( line) = line? {
@@ -109,7 +114,7 @@ async fn main() -> eyre::Result<()> {
109
114
}
110
115
Mode :: Echo => {
111
116
while let Some ( event) = network_events. recv ( ) . await {
112
- handle_network_event ( Mode :: Echo , network_client. clone ( ) , event) . await ?;
117
+ handle_network_event ( network_client. clone ( ) , event, peer_id , true ) . await ?;
113
118
}
114
119
}
115
120
}
@@ -124,43 +129,50 @@ fn generate_ed25519(secret_key_seed: u8) -> identity::Keypair {
124
129
identity:: Keypair :: ed25519_from_bytes ( bytes) . expect ( "only errors on wrong length" )
125
130
}
126
131
132
+ const LINE_START : & str = ">>>>>>>>>> " ;
133
+
127
134
async fn handle_network_event (
128
- mode : Mode ,
129
135
network_client : network:: client:: NetworkClient ,
130
136
event : network:: types:: NetworkEvent ,
137
+ peer_id : PeerId ,
138
+ is_echo : bool ,
131
139
) -> eyre:: Result < ( ) > {
132
140
match event {
133
141
network:: types:: NetworkEvent :: IdentifySent { peer_id } => {
134
- info ! ( "Identify sent to {:?}" , peer_id) ;
142
+ debug ! ( "Identify sent to {:?}" , peer_id) ;
135
143
}
136
144
network:: types:: NetworkEvent :: IdentifyReceived {
137
145
peer_id,
138
146
observed_addr,
139
147
} => {
140
- info ! (
148
+ debug ! (
141
149
"Identify received from {:?} at {:?}" ,
142
150
peer_id, observed_addr
143
151
) ;
144
152
}
145
- network:: types:: NetworkEvent :: Message { id , message } => {
153
+ network:: types:: NetworkEvent :: Message { message , .. } => {
146
154
let text = String :: from_utf8_lossy ( & message. data ) ;
147
- info ! ( "Message from {:?}: {:?}" , id, text) ;
148
-
149
- match mode {
150
- Mode :: Echo => {
151
- let text = format ! ( "Echo, original: '{}'" , text) ;
152
-
153
- match network_client
154
- . publish ( message. topic , text. into_bytes ( ) )
155
- . await
156
- {
157
- Ok ( _) => info ! ( "Echoed message back" ) ,
158
- Err ( err) => error ! ( %err, "Failed to echo message back" ) ,
159
- } ;
155
+ println ! ( "{LINE_START} Received message: {:?}" , text) ;
156
+
157
+ if is_echo {
158
+ let text = format ! ( "echo ({}): '{}'" , peer_id, text) ;
159
+ if text. starts_with ( "echo" ) {
160
+ debug ! ( "Ignoring echo message" ) ;
161
+ return Ok ( ( ) ) ;
160
162
}
161
- _ => { }
163
+
164
+ match network_client
165
+ . publish ( message. topic , text. into_bytes ( ) )
166
+ . await
167
+ {
168
+ Ok ( _) => debug ! ( "Echoed message back" ) ,
169
+ Err ( err) => error ! ( %err, "Failed to echo message back" ) ,
170
+ } ;
162
171
}
163
172
}
173
+ network:: types:: NetworkEvent :: Subscribed { topic, .. } => {
174
+ debug ! ( "Subscribed to {:?}" , topic) ;
175
+ }
164
176
network:: types:: NetworkEvent :: ListeningOn { address, .. } => {
165
177
info ! ( "Listening on: {}" , address) ;
166
178
}
@@ -185,128 +197,125 @@ async fn handle_line(
185
197
let args = match args {
186
198
Some ( args) => args,
187
199
None => {
188
- println ! ( "Usage: dial <multiaddr>" ) ;
200
+ println ! ( "{LINE_START} Usage: dial <multiaddr>" ) ;
189
201
return Ok ( ( ) ) ;
190
202
}
191
203
} ;
192
204
193
205
let addr = match Multiaddr :: from_str ( args) {
194
206
Ok ( addr) => addr,
195
207
Err ( err) => {
196
- println ! ( "Failed to parse MultiAddr: {:?}" , err) ;
208
+ println ! ( "{LINE_START} Failed to parse MultiAddr: {:?}" , err) ;
197
209
return Ok ( ( ) ) ;
198
210
}
199
211
} ;
200
212
201
- info ! ( "Dialing {:?}" , addr) ;
213
+ info ! ( "{LINE_START} Dialing {:?}" , addr) ;
202
214
203
215
match network_client. dial ( addr) . await {
204
216
Ok ( _) => {
205
- println ! ( "Peer dialed" ) ;
217
+ println ! ( "{LINE_START} Peer dialed" ) ;
206
218
}
207
219
Err ( err) => {
208
- println ! ( "Failed to parse peer id : {:?}" , err) ;
220
+ println ! ( "{LINE_START} Failed to dial peer: {:?}" , err) ;
209
221
}
210
222
} ;
211
223
}
212
224
"subscribe" => {
213
225
let args = match args {
214
226
Some ( args) => args,
215
227
None => {
216
- println ! ( "Usage: subscribe <topic-name>" ) ;
228
+ println ! ( "{LINE_START} Usage: subscribe <topic-name>" ) ;
217
229
return Ok ( ( ) ) ;
218
230
}
219
231
} ;
220
232
221
233
let topic = gossipsub:: IdentTopic :: new ( args. to_string ( ) ) ;
222
234
match network_client. subscribe ( topic) . await {
223
235
Ok ( _) => {
224
- println ! ( "Peer dialed" ) ;
236
+ println ! ( "{LINE_START} Peer dialed" ) ;
225
237
}
226
238
Err ( err) => {
227
- println ! ( "Failed to parse peer id: {:?}" , err) ;
239
+ println ! ( "{LINE_START} Failed to parse peer id: {:?}" , err) ;
228
240
}
229
241
} ;
230
242
}
231
243
"unsubscribe" => {
232
244
let args = match args {
233
245
Some ( args) => args,
234
246
None => {
235
- println ! ( "Usage: unsubscribe <topic-name>" ) ;
247
+ println ! ( "{LINE_START} Usage: unsubscribe <topic-name>" ) ;
236
248
return Ok ( ( ) ) ;
237
249
}
238
250
} ;
239
251
240
252
let topic = gossipsub:: IdentTopic :: new ( args. to_string ( ) ) ;
241
253
match network_client. unsubscribe ( topic) . await {
242
254
Ok ( _) => {
243
- println ! ( "Peer dialed" ) ;
255
+ println ! ( "{LINE_START} Peer dialed" ) ;
244
256
}
245
257
Err ( err) => {
246
- println ! ( "Failed to parse peer id: {:?}" , err) ;
258
+ println ! ( "{LINE_START} Failed to parse peer id: {:?}" , err) ;
247
259
}
248
260
} ;
249
261
}
250
262
"publish" => {
251
263
let args = match args {
252
264
Some ( args) => args,
253
265
None => {
254
- println ! ( "Usage: message <topic-name> <message>" ) ;
266
+ println ! ( "{LINE_START} Usage: message <topic-name> <message>" ) ;
255
267
return Ok ( ( ) ) ;
256
268
}
257
269
} ;
258
270
259
- // Extracting topic name and message data from args
260
271
let mut args_iter = args. split_whitespace ( ) ;
261
272
let topic_name = match args_iter. next ( ) {
262
273
Some ( topic) => topic,
263
274
None => {
264
- println ! ( "Usage: message <topic-name> <message>" ) ;
275
+ println ! ( "{LINE_START} Usage: message <topic-name> <message>" ) ;
265
276
return Ok ( ( ) ) ;
266
277
}
267
278
} ;
268
279
269
280
let message_data = match args_iter. next ( ) {
270
281
Some ( data) => data,
271
282
None => {
272
- println ! ( "Usage: message <topic-name> <message>" ) ;
283
+ println ! ( "{LINE_START} Usage: message <topic-name> <message>" ) ;
273
284
return Ok ( ( ) ) ;
274
285
}
275
286
} ;
276
287
277
288
let topic = gossipsub:: IdentTopic :: new ( topic_name. to_string ( ) ) ;
278
-
279
- // Publishing the message
280
289
match network_client
281
290
. publish ( topic. hash ( ) , message_data. as_bytes ( ) . to_vec ( ) )
282
291
. await
283
292
{
284
293
Ok ( _) => {
285
- println ! ( "Message published successfully" ) ;
294
+ println ! ( "{LINE_START} Message published successfully" ) ;
286
295
}
287
296
Err ( err) => {
288
- println ! ( "Failed to publish message: {:?}" , err) ;
297
+ println ! ( "{LINE_START} Failed to publish message: {:?}" , err) ;
289
298
}
290
299
} ;
291
300
}
292
301
"peers" => {
293
302
let peer_info = network_client. peer_info ( ) . await ;
294
- info ! ( "Peer info: {:?}" , peer_info) ;
303
+ println ! ( "{LINE_START} Peer info: {:?}" , peer_info) ;
295
304
}
296
305
"mesh-peers" => {
297
306
let args = match args {
298
307
Some ( args) => args,
299
308
None => {
300
- println ! ( "Usage: mesh-peers <topic-name>" ) ;
309
+ println ! ( "{LINE_START} Usage: mesh-peers <topic-name>" ) ;
301
310
return Ok ( ( ) ) ;
302
311
}
303
312
} ;
304
313
305
314
let topic = gossipsub:: IdentTopic :: new ( args. to_string ( ) ) ;
306
315
let mesh_peer_info = network_client. mesh_peer_info ( topic. hash ( ) ) . await ;
307
- info ! ( "Mesh peer info: {:?}" , mesh_peer_info) ;
316
+ println ! ( "{LINE_START} Mesh peer info: {:?}" , mesh_peer_info) ;
308
317
}
309
- _ => info ! ( "Unknown command" ) ,
318
+ _ => println ! ( "{LINE_START} Unknown command" ) ,
310
319
}
311
320
312
321
Ok ( ( ) )
0 commit comments