@@ -19,7 +19,7 @@ use tokio::task::spawn_local;
19
19
#[ cfg( target_arch = "wasm32" ) ]
20
20
use wasm_bindgen_futures:: spawn_local;
21
21
22
- use openmina_core:: channels:: { broadcast , mpsc, oneshot} ;
22
+ use openmina_core:: channels:: { mpsc, oneshot, Aborted , Aborter } ;
23
23
24
24
use crate :: identity:: { EncryptableType , PublicKey } ;
25
25
use crate :: webrtc:: { ConnectionAuth , ConnectionAuthEncrypted } ;
@@ -61,10 +61,7 @@ use super::TaskSpawner;
61
61
const CHUNK_SIZE : usize = 16 * 1024 ;
62
62
63
63
pub enum Cmd {
64
- PeerAdd {
65
- args : PeerAddArgs ,
66
- abort : broadcast:: Receiver < ( ) > ,
67
- } ,
64
+ PeerAdd { args : PeerAddArgs , aborted : Aborted } ,
68
65
}
69
66
70
67
#[ derive( Debug ) ]
@@ -105,7 +102,7 @@ pub enum PeerConnectionKind {
105
102
106
103
pub struct PeerState {
107
104
pub cmd_sender : mpsc:: UnboundedSender < PeerCmd > ,
108
- pub abort : broadcast :: Sender < ( ) > ,
105
+ pub abort : Aborter ,
109
106
}
110
107
111
108
#[ derive( thiserror:: Error , derive_more:: From , Debug ) ]
@@ -226,12 +223,7 @@ async fn wait_for_ice_gathering_complete(pc: &mut RTCConnection) {
226
223
}
227
224
}
228
225
229
- async fn peer_start (
230
- api : Api ,
231
- args : PeerAddArgs ,
232
- abort : broadcast:: Receiver < ( ) > ,
233
- closed : broadcast:: Sender < ( ) > ,
234
- ) {
226
+ async fn peer_start ( api : Api , args : PeerAddArgs , abort : Aborted , closed : mpsc:: Sender < ( ) > ) {
235
227
let PeerAddArgs {
236
228
peer_id,
237
229
kind,
@@ -353,7 +345,7 @@ async fn peer_start(
353
345
if let Some ( connected_tx) = connected_tx. take ( ) {
354
346
let _ = connected_tx. send ( Err ( "disconnected" ) ) ;
355
347
} else {
356
- let _ = closed. send ( ( ) ) ;
348
+ let _ = closed. try_send ( ( ) ) ;
357
349
}
358
350
}
359
351
_ => { }
@@ -489,7 +481,7 @@ async fn peer_loop(
489
481
event_sender : Arc < dyn Fn ( P2pEvent ) -> Option < ( ) > + Send + Sync + ' static > ,
490
482
mut cmd_receiver : mpsc:: UnboundedReceiver < PeerCmd > ,
491
483
mut pc : RTCConnection ,
492
- abort : broadcast :: Receiver < ( ) > ,
484
+ aborted : Aborted ,
493
485
) {
494
486
// TODO(binier): maybe use small_vec (stack allocated) or something like that.
495
487
let mut channels = Channels :: new ( ) ;
@@ -566,10 +558,10 @@ async fn peer_loop(
566
558
let _ =
567
559
internal_cmd_sender. send ( PeerCmdInternal :: ChannelOpened ( id, result. await ) ) ;
568
560
} ;
569
- let mut aborted = abort . resubscribe ( ) ;
561
+ let mut aborted = aborted . clone ( ) ;
570
562
spawn_local ( async move {
571
563
tokio:: select! {
572
- _ = aborted. recv ( ) => { }
564
+ _ = aborted. wait ( ) => { }
573
565
_ = fut => { }
574
566
}
575
567
} ) ;
@@ -698,10 +690,10 @@ async fn peer_loop(
698
690
}
699
691
} ;
700
692
701
- let mut aborted = abort . resubscribe ( ) ;
693
+ let mut aborted = aborted . clone ( ) ;
702
694
spawn_local ( async move {
703
695
tokio:: select! {
704
- _ = aborted. recv ( ) => { }
696
+ _ = aborted. wait ( ) => { }
705
697
_ = fut => { }
706
698
}
707
699
} ) ;
@@ -743,7 +735,7 @@ pub trait P2pServiceWebrtc: redux::Service {
743
735
let conn_permits = Arc :: new ( Semaphore :: const_new ( MAX_PEERS ) ) ;
744
736
while let Some ( cmd) = cmd_receiver. recv ( ) . await {
745
737
match cmd {
746
- Cmd :: PeerAdd { args, mut abort } => {
738
+ Cmd :: PeerAdd { args, aborted } => {
747
739
#[ allow( clippy:: all) ]
748
740
let api = api. clone ( ) ;
749
741
let conn_permits = conn_permits. clone ( ) ;
@@ -755,22 +747,21 @@ pub trait P2pServiceWebrtc: redux::Service {
755
747
bug_condition ! ( "P2P WebRTC Semaphore acquisition failed!" ) ;
756
748
return ;
757
749
} ;
758
- let ( closed_tx, mut closed) = broadcast :: channel ( 1 ) ;
750
+ let ( closed_tx, mut closed) = mpsc :: channel ( 1 ) ;
759
751
let event_sender_clone = event_sender. clone ( ) ;
760
752
spawn_local ( async move {
761
753
// to avoid sending closed multiple times
762
754
let _ = closed. recv ( ) . await ;
763
755
event_sender_clone ( P2pConnectionEvent :: Closed ( peer_id) . into ( ) ) ;
764
756
} ) ;
765
757
tokio:: select! {
766
- _ = peer_start( api, args, abort. resubscribe( ) , closed_tx. clone( ) ) => { }
767
- _ = abort. recv( ) => {
768
- }
758
+ _ = peer_start( api, args, aborted. clone( ) , closed_tx. clone( ) ) => { }
759
+ _ = aborted. wait( ) => { }
769
760
}
770
761
771
762
// delay dropping permit to give some time for cleanup.
772
763
sleep ( Duration :: from_millis ( 100 ) ) . await ;
773
- let _ = closed_tx. send ( ( ) ) ;
764
+ let _ = closed_tx. send ( ( ) ) . await ;
774
765
} ) ;
775
766
}
776
767
}
@@ -785,13 +776,14 @@ pub trait P2pServiceWebrtc: redux::Service {
785
776
786
777
fn outgoing_init ( & mut self , peer_id : PeerId ) {
787
778
let ( peer_cmd_sender, peer_cmd_receiver) = mpsc:: unbounded_channel ( ) ;
788
- let ( abort_sender, abort_receiver) = broadcast:: channel ( 1 ) ;
779
+ let aborter = Aborter :: default ( ) ;
780
+ let aborted = aborter. aborted ( ) ;
789
781
790
782
self . peers ( ) . insert (
791
783
peer_id,
792
784
PeerState {
793
785
cmd_sender : peer_cmd_sender,
794
- abort : abort_sender ,
786
+ abort : aborter ,
795
787
} ,
796
788
) ;
797
789
let event_sender = self . event_sender ( ) . clone ( ) ;
@@ -804,19 +796,20 @@ pub trait P2pServiceWebrtc: redux::Service {
804
796
event_sender,
805
797
cmd_receiver : peer_cmd_receiver,
806
798
} ,
807
- abort : abort_receiver ,
799
+ aborted ,
808
800
} ) ;
809
801
}
810
802
811
803
fn incoming_init ( & mut self , peer_id : PeerId , offer : webrtc:: Offer ) {
812
804
let ( peer_cmd_sender, peer_cmd_receiver) = mpsc:: unbounded_channel ( ) ;
813
- let ( abort_sender, abort_receiver) = broadcast:: channel ( 1 ) ;
805
+ let aborter = Aborter :: default ( ) ;
806
+ let aborted = aborter. aborted ( ) ;
814
807
815
808
self . peers ( ) . insert (
816
809
peer_id,
817
810
PeerState {
818
811
cmd_sender : peer_cmd_sender,
819
- abort : abort_sender ,
812
+ abort : aborter ,
820
813
} ,
821
814
) ;
822
815
let event_sender = self . event_sender ( ) . clone ( ) ;
@@ -829,7 +822,7 @@ pub trait P2pServiceWebrtc: redux::Service {
829
822
event_sender,
830
823
cmd_receiver : peer_cmd_receiver,
831
824
} ,
832
- abort : abort_receiver ,
825
+ aborted ,
833
826
} ) ;
834
827
}
835
828
0 commit comments