@@ -3,6 +3,7 @@ use super::callback::Callback;
3
3
use crate :: packet:: { Packet , PacketId } ;
4
4
use rand:: { thread_rng, Rng } ;
5
5
6
+ use crate :: client:: callback:: { SocketAnyCallback , SocketCallback } ;
6
7
use crate :: error:: Result ;
7
8
use std:: collections:: HashMap ;
8
9
use std:: ops:: DerefMut ;
@@ -21,7 +22,7 @@ pub struct Ack {
21
22
pub id : i32 ,
22
23
timeout : Duration ,
23
24
time_started : Instant ,
24
- callback : Callback ,
25
+ callback : Callback < SocketCallback > ,
25
26
}
26
27
27
28
/// A socket which handles communication with the server. It's initialized with
@@ -31,7 +32,8 @@ pub struct Ack {
31
32
pub struct Client {
32
33
/// The inner socket client to delegate the methods to.
33
34
socket : InnerSocket ,
34
- on : Arc < RwLock < HashMap < Event , Callback > > > ,
35
+ on : Arc < RwLock < HashMap < Event , Callback < SocketCallback > > > > ,
36
+ on_any : Arc < RwLock < Option < Callback < SocketAnyCallback > > > > ,
35
37
outstanding_acks : Arc < RwLock < Vec < Ack > > > ,
36
38
// namespace, for multiplexing messages
37
39
nsp : String ,
@@ -47,13 +49,15 @@ impl Client {
47
49
pub ( crate ) fn new < T : Into < String > > (
48
50
socket : InnerSocket ,
49
51
namespace : T ,
50
- on : HashMap < Event , Callback > ,
52
+ on : HashMap < Event , Callback < SocketCallback > > ,
53
+ on_any : Option < Callback < SocketAnyCallback > > ,
51
54
auth : Option < serde_json:: Value > ,
52
55
) -> Result < Self > {
53
56
Ok ( Client {
54
57
socket,
55
58
nsp : namespace. into ( ) ,
56
59
on : Arc :: new ( RwLock :: new ( on) ) ,
60
+ on_any : Arc :: new ( RwLock :: new ( on_any) ) ,
57
61
outstanding_acks : Arc :: new ( RwLock :: new ( Vec :: new ( ) ) ) ,
58
62
auth,
59
63
} )
@@ -202,7 +206,7 @@ impl Client {
202
206
id,
203
207
time_started : Instant :: now ( ) ,
204
208
timeout,
205
- callback : Callback :: new ( callback) ,
209
+ callback : Callback :: < SocketCallback > :: new ( callback) ,
206
210
} ;
207
211
208
212
// add the ack to the tuple of outstanding acks
@@ -238,11 +242,25 @@ impl Client {
238
242
239
243
fn callback < P : Into < Payload > > ( & self , event : & Event , payload : P ) -> Result < ( ) > {
240
244
let mut on = self . on . write ( ) ?;
245
+ let mut on_any = self . on_any . write ( ) ?;
241
246
let lock = on. deref_mut ( ) ;
247
+ let on_any_lock = on_any. deref_mut ( ) ;
248
+
249
+ let payload = payload. into ( ) ;
250
+
242
251
if let Some ( callback) = lock. get_mut ( event) {
243
- callback ( payload. into ( ) , self . clone ( ) ) ;
252
+ callback ( payload. clone ( ) , self . clone ( ) ) ;
253
+ }
254
+ match event. clone ( ) {
255
+ Event :: Message | Event :: Custom ( _) => {
256
+ if let Some ( callback) = on_any_lock {
257
+ callback ( event. clone ( ) , payload, self . clone ( ) )
258
+ }
259
+ }
260
+ _ => { }
244
261
}
245
262
drop ( on) ;
263
+ drop ( on_any) ;
246
264
Ok ( ( ) )
247
265
}
248
266
@@ -530,33 +548,69 @@ mod test {
530
548
test_socketio_socket ( socket, "/admin" . to_owned ( ) )
531
549
}
532
550
551
+ #[ test]
552
+ fn socket_io_on_any_integration ( ) -> Result < ( ) > {
553
+ let url = crate :: test:: socket_io_server ( ) ;
554
+
555
+ let ( tx, rx) = mpsc:: sync_channel ( 1 ) ;
556
+
557
+ let _socket = ClientBuilder :: new ( url)
558
+ . namespace ( "/" )
559
+ . auth ( json ! ( { "password" : "123" } ) )
560
+ . on ( "auth" , |payload, _client| {
561
+ if let Payload :: String ( msg) = payload {
562
+ println ! ( "{}" , msg) ;
563
+ }
564
+ } )
565
+ . on_any ( move |event, payload, _client| {
566
+ if let Payload :: String ( str) = payload {
567
+ println ! ( "{} {}" , String :: from( event. clone( ) ) , str ) ;
568
+ }
569
+ tx. send ( String :: from ( event) ) . unwrap ( ) ;
570
+ } )
571
+ . connect ( ) ?;
572
+
573
+ // Sleep to give server enough time to send 2 events
574
+ sleep ( Duration :: from_secs ( 2 ) ) ;
575
+
576
+ let event = rx. recv ( ) . unwrap ( ) ;
577
+ assert_eq ! ( event, "message" ) ;
578
+ let event = rx. recv ( ) . unwrap ( ) ;
579
+ assert_eq ! ( event, "test" ) ;
580
+
581
+ Ok ( ( ) )
582
+ }
583
+
533
584
#[ test]
534
585
fn socket_io_auth_builder_integration ( ) -> Result < ( ) > {
535
586
let url = crate :: test:: socket_io_auth_server ( ) ;
587
+ let nsp = String :: from ( "/admin" ) ;
536
588
let socket = ClientBuilder :: new ( url)
537
- . namespace ( "/admin" )
589
+ . namespace ( nsp . clone ( ) )
538
590
. auth ( json ! ( { "password" : "123" } ) )
539
- . connect ( ) ?;
591
+ . connect_manual ( ) ?;
540
592
541
- let ( tx, rx) = mpsc:: sync_channel ( 0 ) ;
593
+ let mut iter = socket
594
+ . iter ( )
595
+ . map ( |packet| packet. unwrap ( ) )
596
+ . filter ( |packet| packet. packet_type != PacketId :: Connect ) ;
542
597
543
- // Send emit with ack after 1s, so socketio server has enough time to register it's listeners
544
- sleep ( Duration :: from_secs ( 1 ) ) ;
598
+ let packet : Option < Packet > = iter . next ( ) ;
599
+ assert ! ( packet . is_some ( ) ) ;
545
600
546
- assert ! ( socket
547
- . emit_with_ack(
548
- "test" ,
549
- json!( { "msg" : "1" } ) ,
550
- Duration :: from_secs( 1 ) ,
551
- move |payload, _| {
552
- println!( "Got ack" ) ;
553
- tx. send( Payload :: from( json!( [ "456" ] ) ) == payload) . unwrap( ) ;
554
- }
555
- )
556
- . is_ok( ) ) ;
601
+ let packet = packet. unwrap ( ) ;
557
602
558
- let received = rx. recv ( ) ;
559
- assert ! ( received. is_ok( ) && received. unwrap( ) ) ;
603
+ assert_eq ! (
604
+ packet,
605
+ Packet :: new(
606
+ PacketId :: Event ,
607
+ nsp. clone( ) ,
608
+ Some ( "[\" auth\" ,\" success\" ]" . to_owned( ) ) ,
609
+ None ,
610
+ 0 ,
611
+ None
612
+ )
613
+ ) ;
560
614
561
615
Ok ( ( ) )
562
616
}
0 commit comments