@@ -31,14 +31,12 @@ pub type Room = Cow<'static, str>;
31
31
pub enum BroadcastFlags {
32
32
/// Broadcast only to the current server
33
33
Local ,
34
- /// Broadcast to all servers
34
+ /// Broadcast to all clients except the sender
35
35
Broadcast ,
36
- /// Add a custom timeout to the ack callback
37
- Timeout ( Duration ) ,
38
36
}
39
37
40
38
/// Options that can be used to modify the behavior of the broadcast methods.
41
- #[ derive( Clone , Debug ) ]
39
+ #[ derive( Clone , Debug , Default ) ]
42
40
pub struct BroadcastOptions {
43
41
/// The flags to apply to the broadcast.
44
42
pub flags : HashSet < BroadcastFlags > ,
@@ -49,24 +47,13 @@ pub struct BroadcastOptions {
49
47
/// The socket id of the sender.
50
48
pub sid : Option < Sid > ,
51
49
}
52
- impl BroadcastOptions {
53
- pub ( crate ) fn new ( sid : Option < Sid > ) -> Self {
54
- Self {
55
- flags : HashSet :: new ( ) ,
56
- rooms : HashSet :: new ( ) ,
57
- except : HashSet :: new ( ) ,
58
- sid,
59
- }
60
- }
61
- }
62
-
63
50
//TODO: Make an AsyncAdapter trait
64
51
/// An adapter is responsible for managing the state of the server.
65
52
/// This adapter can be implemented to share the state between multiple servers.
66
53
/// The default adapter is the [`LocalAdapter`], which stores the state in memory.
67
54
pub trait Adapter : std:: fmt:: Debug + Send + Sync + ' static {
68
55
/// An error that can occur when using the adapter. The default [`LocalAdapter`] has an [`Infallible`] error.
69
- type Error : std:: error:: Error + Into < AdapterError > + Send + ' static ;
56
+ type Error : std:: error:: Error + Into < AdapterError > + Send + Sync + ' static ;
70
57
71
58
/// Create a new adapter and give the namespace ref to retrieve sockets.
72
59
fn new ( ns : Weak < Namespace < Self > > ) -> Self
@@ -92,8 +79,12 @@ pub trait Adapter: std::fmt::Debug + Send + Sync + 'static {
92
79
fn broadcast ( & self , packet : Packet < ' _ > , opts : BroadcastOptions ) -> Result < ( ) , BroadcastError > ;
93
80
94
81
/// Broadcasts the packet to the sockets that match the [`BroadcastOptions`] and return a stream of ack responses.
95
- fn broadcast_with_ack ( & self , packet : Packet < ' static > , opts : BroadcastOptions )
96
- -> AckInnerStream ;
82
+ fn broadcast_with_ack (
83
+ & self ,
84
+ packet : Packet < ' static > ,
85
+ opts : BroadcastOptions ,
86
+ timeout : Option < Duration > ,
87
+ ) -> AckInnerStream ;
97
88
98
89
/// Returns the sockets ids that match the [`BroadcastOptions`].
99
90
fn sockets ( & self , rooms : impl RoomParam ) -> Result < Vec < Sid > , Self :: Error > ;
@@ -211,23 +202,20 @@ impl Adapter for LocalAdapter {
211
202
& self ,
212
203
packet : Packet < ' static > ,
213
204
opts : BroadcastOptions ,
205
+ timeout : Option < Duration > ,
214
206
) -> AckInnerStream {
215
- let duration = opts. flags . iter ( ) . find_map ( |flag| match flag {
216
- BroadcastFlags :: Timeout ( duration) => Some ( * duration) ,
217
- _ => None ,
218
- } ) ;
219
207
let sockets = self . apply_opts ( opts) ;
220
208
#[ cfg( feature = "tracing" ) ]
221
209
tracing:: debug!(
222
210
"broadcasting packet to {} sockets: {:?}" ,
223
211
sockets. len( ) ,
224
212
sockets. iter( ) . map( |s| s. id) . collect:: <Vec <_>>( )
225
213
) ;
226
- AckInnerStream :: broadcast ( packet, sockets, duration )
214
+ AckInnerStream :: broadcast ( packet, sockets, timeout )
227
215
}
228
216
229
217
fn sockets ( & self , rooms : impl RoomParam ) -> Result < Vec < Sid > , Infallible > {
230
- let mut opts = BroadcastOptions :: new ( None ) ;
218
+ let mut opts = BroadcastOptions :: default ( ) ;
231
219
opts. rooms . extend ( rooms. into_room_iter ( ) ) ;
232
220
Ok ( self
233
221
. apply_opts ( opts)
@@ -421,7 +409,10 @@ mod test {
421
409
let adapter = LocalAdapter :: new ( Arc :: downgrade ( & ns) ) ;
422
410
adapter. add_all ( socket, [ "room1" ] ) . unwrap ( ) ;
423
411
424
- let mut opts = BroadcastOptions :: new ( Some ( socket) ) ;
412
+ let mut opts = BroadcastOptions {
413
+ sid : Some ( socket) ,
414
+ ..Default :: default ( )
415
+ } ;
425
416
opts. rooms = hash_set ! [ "room1" . into( ) ] ;
426
417
adapter. add_sockets ( opts, "room2" ) . unwrap ( ) ;
427
418
let rooms_map = adapter. rooms . read ( ) . unwrap ( ) ;
@@ -438,7 +429,10 @@ mod test {
438
429
let adapter = LocalAdapter :: new ( Arc :: downgrade ( & ns) ) ;
439
430
adapter. add_all ( socket, [ "room1" ] ) . unwrap ( ) ;
440
431
441
- let mut opts = BroadcastOptions :: new ( Some ( socket) ) ;
432
+ let mut opts = BroadcastOptions {
433
+ sid : Some ( socket) ,
434
+ ..Default :: default ( )
435
+ } ;
442
436
opts. rooms = hash_set ! [ "room1" . into( ) ] ;
443
437
adapter. add_sockets ( opts, "room2" ) . unwrap ( ) ;
444
438
@@ -450,7 +444,10 @@ mod test {
450
444
assert ! ( rooms_map. get( "room2" ) . unwrap( ) . contains( & socket) ) ;
451
445
}
452
446
453
- let mut opts = BroadcastOptions :: new ( Some ( socket) ) ;
447
+ let mut opts = BroadcastOptions {
448
+ sid : Some ( socket) ,
449
+ ..Default :: default ( )
450
+ } ;
454
451
opts. rooms = hash_set ! [ "room1" . into( ) ] ;
455
452
adapter. del_sockets ( opts, "room2" ) . unwrap ( ) ;
456
453
@@ -507,7 +504,10 @@ mod test {
507
504
. add_all ( socket2, [ "room2" , "room3" , "room6" ] )
508
505
. unwrap ( ) ;
509
506
510
- let mut opts = BroadcastOptions :: new ( Some ( socket0) ) ;
507
+ let mut opts = BroadcastOptions {
508
+ sid : Some ( socket0) ,
509
+ ..Default :: default ( )
510
+ } ;
511
511
opts. rooms = hash_set ! [ "room5" . into( ) ] ;
512
512
adapter. disconnect_socket ( opts) . unwrap ( ) ;
513
513
@@ -533,33 +533,48 @@ mod test {
533
533
. unwrap ( ) ;
534
534
535
535
// socket 2 is the sender
536
- let mut opts = BroadcastOptions :: new ( Some ( socket2) ) ;
536
+ let mut opts = BroadcastOptions {
537
+ sid : Some ( socket2) ,
538
+ ..Default :: default ( )
539
+ } ;
537
540
opts. rooms = hash_set ! [ "room1" . into( ) ] ;
538
541
opts. except = hash_set ! [ "room2" . into( ) ] ;
539
542
let sockets = adapter. fetch_sockets ( opts) . unwrap ( ) ;
540
543
assert_eq ! ( sockets. len( ) , 1 ) ;
541
544
assert_eq ! ( sockets[ 0 ] . id, socket1) ;
542
545
543
- let mut opts = BroadcastOptions :: new ( Some ( socket2) ) ;
546
+ let mut opts = BroadcastOptions {
547
+ sid : Some ( socket2) ,
548
+ ..Default :: default ( )
549
+ } ;
544
550
opts. flags . insert ( BroadcastFlags :: Broadcast ) ;
545
551
let sockets = adapter. fetch_sockets ( opts) . unwrap ( ) ;
546
552
assert_eq ! ( sockets. len( ) , 2 ) ;
547
553
sockets. iter ( ) . for_each ( |s| {
548
554
assert ! ( s. id == socket0 || s. id == socket1) ;
549
555
} ) ;
550
556
551
- let mut opts = BroadcastOptions :: new ( Some ( socket2) ) ;
557
+ let mut opts = BroadcastOptions {
558
+ sid : Some ( socket2) ,
559
+ ..Default :: default ( )
560
+ } ;
552
561
opts. flags . insert ( BroadcastFlags :: Broadcast ) ;
553
562
opts. except = hash_set ! [ "room2" . into( ) ] ;
554
563
let sockets = adapter. fetch_sockets ( opts) . unwrap ( ) ;
555
564
assert_eq ! ( sockets. len( ) , 1 ) ;
556
565
557
- let opts = BroadcastOptions :: new ( Some ( socket2) ) ;
566
+ let opts = BroadcastOptions {
567
+ sid : Some ( socket2) ,
568
+ ..Default :: default ( )
569
+ } ;
558
570
let sockets = adapter. fetch_sockets ( opts) . unwrap ( ) ;
559
571
assert_eq ! ( sockets. len( ) , 1 ) ;
560
572
assert_eq ! ( sockets[ 0 ] . id, socket2) ;
561
573
562
- let opts = BroadcastOptions :: new ( Some ( Sid :: new ( ) ) ) ;
574
+ let opts = BroadcastOptions {
575
+ sid : Some ( Sid :: new ( ) ) ,
576
+ ..Default :: default ( )
577
+ } ;
563
578
let sockets = adapter. fetch_sockets ( opts) . unwrap ( ) ;
564
579
assert_eq ! ( sockets. len( ) , 0 ) ;
565
580
}
0 commit comments