@@ -27,15 +27,12 @@ use tokio_util::task::AbortOnDropHandle;
27
27
use tracing:: { debug, error, event, info_span, trace, warn, Instrument , Level } ;
28
28
use url:: Url ;
29
29
30
- use conn:: {
31
- Conn as RelayClient , ConnBuilder as RelayClientBuilder , ConnReader ,
32
- ConnReceiver as RelayClientReceiver , ConnWriter , ReceivedMessage ,
33
- } ;
30
+ use conn:: { Conn , ConnBuilder , ConnReader , ConnReceiver , ConnWriter , ReceivedMessage } ;
34
31
use streams:: { downcast_upgrade, MaybeTlsStream , ProxyStream } ;
35
32
36
33
use crate :: defaults:: timeouts:: relay:: * ;
37
34
use crate :: dns:: { DnsResolver , ResolverExt } ;
38
- use crate :: key:: { PublicKey , SecretKey } ;
35
+ use crate :: key:: { NodeId , PublicKey , SecretKey } ;
39
36
use crate :: relay:: codec:: DerpCodec ;
40
37
use crate :: relay:: http:: { Protocol , RELAY_PATH } ;
41
38
use crate :: relay:: RelayUrl ;
@@ -140,7 +137,7 @@ pub struct Client {
140
137
141
138
#[ derive( Debug ) ]
142
139
enum ActorMessage {
143
- Connect ( oneshot:: Sender < Result < ( RelayClient , usize ) , ClientError > > ) ,
140
+ Connect ( oneshot:: Sender < Result < Conn , ClientError > > ) ,
144
141
NotePreferred ( bool ) ,
145
142
LocalAddr ( oneshot:: Sender < Result < Option < SocketAddr > , ClientError > > ) ,
146
143
Ping ( oneshot:: Sender < Result < Duration , ClientError > > ) ,
@@ -154,19 +151,18 @@ enum ActorMessage {
154
151
/// Receiving end of a [`Client`].
155
152
#[ derive( Debug ) ]
156
153
pub struct ClientReceiver {
157
- msg_receiver : mpsc:: Receiver < Result < ( ReceivedMessage , usize ) , ClientError > > ,
154
+ msg_receiver : mpsc:: Receiver < Result < ReceivedMessage , ClientError > > ,
158
155
}
159
156
160
157
#[ derive( derive_more:: Debug ) ]
161
158
struct Actor {
162
159
secret_key : SecretKey ,
163
160
can_ack_pings : bool ,
164
161
is_preferred : bool ,
165
- relay_client : Option < ( RelayClient , RelayClientReceiver ) > ,
162
+ relay_conn : Option < ( Conn , ConnReceiver ) > ,
166
163
is_closed : bool ,
167
164
#[ debug( "address family selector callback" ) ]
168
165
address_family_selector : Option < Box < dyn Fn ( ) -> BoxFuture < bool > + Send + Sync + ' static > > ,
169
- conn_gen : usize ,
170
166
url : RelayUrl ,
171
167
protocol : Protocol ,
172
168
#[ debug( "TlsConnector" ) ]
@@ -334,10 +330,9 @@ impl ClientBuilder {
334
330
secret_key : key,
335
331
can_ack_pings : self . can_ack_pings ,
336
332
is_preferred : self . is_preferred ,
337
- relay_client : None ,
333
+ relay_conn : None ,
338
334
is_closed : false ,
339
335
address_family_selector : self . address_family_selector ,
340
- conn_gen : 0 ,
341
336
pings : PingTracker :: default ( ) ,
342
337
ping_tasks : Default :: default ( ) ,
343
338
url : self . url ,
@@ -371,9 +366,8 @@ impl ClientBuilder {
371
366
}
372
367
373
368
impl ClientReceiver {
374
- /// Reads a message from the server. Returns the message and the `conn_get`, or the number of
375
- /// re-connections this Client has ever made
376
- pub async fn recv ( & mut self ) -> Option < Result < ( ReceivedMessage , usize ) , ClientError > > {
369
+ /// Reads a message from the server.
370
+ pub async fn recv ( & mut self ) -> Option < Result < ReceivedMessage , ClientError > > {
377
371
self . msg_receiver . recv ( ) . await
378
372
}
379
373
}
@@ -399,13 +393,13 @@ impl Client {
399
393
}
400
394
}
401
395
402
- /// Connect to a relay Server and returns the underlying relay Client .
396
+ /// Connects to a relay Server and returns the underlying relay connection .
403
397
///
404
398
/// Returns [`ClientError::Closed`] if the [`Client`] is closed.
405
399
///
406
400
/// If there is already an active relay connection, returns the already
407
401
/// connected [`crate::relay::RelayConn`].
408
- pub async fn connect ( & self ) -> Result < ( RelayClient , usize ) , ClientError > {
402
+ pub async fn connect ( & self ) -> Result < Conn , ClientError > {
409
403
self . send_actor ( ActorMessage :: Connect ) . await
410
404
}
411
405
@@ -475,7 +469,7 @@ impl Actor {
475
469
async fn run (
476
470
mut self ,
477
471
mut inbox : mpsc:: Receiver < ActorMessage > ,
478
- msg_sender : mpsc:: Sender < Result < ( ReceivedMessage , usize ) , ClientError > > ,
472
+ msg_sender : mpsc:: Sender < Result < ReceivedMessage , ClientError > > ,
479
473
) {
480
474
// Add an initial connection attempt.
481
475
if let Err ( err) = self . connect ( "initial connect" ) . await {
@@ -485,7 +479,7 @@ impl Actor {
485
479
loop {
486
480
tokio:: select! {
487
481
res = self . recv_detail( ) => {
488
- if let Ok ( ( ReceivedMessage :: Pong ( ping) , _ ) ) = res {
482
+ if let Ok ( ReceivedMessage :: Pong ( ping) ) = res {
489
483
match self . pings. unregister( ping, "pong" ) {
490
484
Some ( chan) => {
491
485
if chan. send( ( ) ) . is_err( ) {
@@ -503,7 +497,7 @@ impl Actor {
503
497
Some ( msg) = inbox. recv( ) => {
504
498
match msg {
505
499
ActorMessage :: Connect ( s) => {
506
- let res = self . connect( "actor msg" ) . await . map( |( client, _, count ) | ( client, count ) ) ;
500
+ let res = self . connect( "actor msg" ) . await . map( |( client, _) | ( client) ) ;
507
501
s. send( res) . ok( ) ;
508
502
} ,
509
503
ActorMessage :: NotePreferred ( is_preferred) => {
@@ -549,46 +543,51 @@ impl Actor {
549
543
}
550
544
}
551
545
546
+ /// Returns a connection to the relay.
547
+ ///
548
+ /// If the client is currently connected, the existing connection is returned; otherwise,
549
+ /// a new connection is made.
550
+ ///
551
+ /// Returns:
552
+ /// - A clonable connection object which can send DISCO messages to the relay.
553
+ /// - A reference to a channel receiving DISCO messages from the relay.
552
554
async fn connect (
553
555
& mut self ,
554
556
why : & ' static str ,
555
- ) -> Result < ( RelayClient , & ' _ mut RelayClientReceiver , usize ) , ClientError > {
557
+ ) -> Result < ( Conn , & ' _ mut ConnReceiver ) , ClientError > {
556
558
debug ! (
557
559
"connect: {}, current client {}" ,
558
560
why,
559
- self . relay_client . is_some( )
561
+ self . relay_conn . is_some( )
560
562
) ;
561
563
562
564
if self . is_closed {
563
565
return Err ( ClientError :: Closed ) ;
564
566
}
565
567
async move {
566
- if self . relay_client . is_none ( ) {
568
+ if self . relay_conn . is_none ( ) {
567
569
trace ! ( "no connection, trying to connect" ) ;
568
- let ( relay_client, receiver) =
569
- tokio:: time:: timeout ( CONNECT_TIMEOUT , self . connect_0 ( ) )
570
- . await
571
- . map_err ( |_| ClientError :: ConnectTimeout ) ??;
570
+ let ( conn, receiver) = tokio:: time:: timeout ( CONNECT_TIMEOUT , self . connect_0 ( ) )
571
+ . await
572
+ . map_err ( |_| ClientError :: ConnectTimeout ) ??;
572
573
573
- self . relay_client = Some ( ( relay_client. clone ( ) , receiver) ) ;
574
- self . next_conn ( ) ;
574
+ self . relay_conn = Some ( ( conn, receiver) ) ;
575
575
} else {
576
576
trace ! ( "already had connection" ) ;
577
577
}
578
- let count = self . current_conn ( ) ;
579
- let ( relay_client, receiver) = self
580
- . relay_client
578
+ let ( conn, receiver) = self
579
+ . relay_conn
581
580
. as_mut ( )
582
581
. map ( |( c, r) | ( c. clone ( ) , r) )
583
582
. expect ( "just checked" ) ;
584
583
585
- Ok ( ( relay_client , receiver, count ) )
584
+ Ok ( ( conn , receiver) )
586
585
}
587
586
. instrument ( info_span ! ( "connect" ) )
588
587
. await
589
588
}
590
589
591
- async fn connect_0 ( & self ) -> Result < ( RelayClient , RelayClientReceiver ) , ClientError > {
590
+ async fn connect_0 ( & self ) -> Result < ( Conn , ConnReceiver ) , ClientError > {
592
591
let ( reader, writer, local_addr) = match self . protocol {
593
592
Protocol :: Websocket => {
594
593
let ( reader, writer) = self . connect_ws ( ) . await ?;
@@ -601,14 +600,14 @@ impl Actor {
601
600
}
602
601
} ;
603
602
604
- let ( relay_client , receiver) =
605
- RelayClientBuilder :: new ( self . secret_key . clone ( ) , local_addr, reader, writer)
603
+ let ( conn , receiver) =
604
+ ConnBuilder :: new ( self . secret_key . clone ( ) , local_addr, reader, writer)
606
605
. build ( )
607
606
. await
608
607
. map_err ( |e| ClientError :: Build ( e. to_string ( ) ) ) ?;
609
608
610
- if self . is_preferred && relay_client . note_preferred ( true ) . await . is_err ( ) {
611
- relay_client . close ( ) . await ;
609
+ if self . is_preferred && conn . note_preferred ( true ) . await . is_err ( ) {
610
+ conn . close ( ) . await ;
612
611
return Err ( ClientError :: Send ) ;
613
612
}
614
613
@@ -620,7 +619,7 @@ impl Actor {
620
619
) ;
621
620
622
621
trace ! ( "connect_0 done" ) ;
623
- Ok ( ( relay_client , receiver) )
622
+ Ok ( ( conn , receiver) )
624
623
}
625
624
626
625
async fn connect_ws ( & self ) -> Result < ( ConnReader , ConnWriter ) , ClientError > {
@@ -732,8 +731,8 @@ impl Actor {
732
731
733
732
// only send the preference if we already have a connection
734
733
let res = {
735
- if let Some ( ( ref client , _) ) = self . relay_client {
736
- client . note_preferred ( is_preferred) . await
734
+ if let Some ( ( ref conn , _) ) = self . relay_conn {
735
+ conn . note_preferred ( is_preferred) . await
737
736
} else {
738
737
return ;
739
738
}
@@ -749,23 +748,23 @@ impl Actor {
749
748
if self . is_closed {
750
749
return None ;
751
750
}
752
- if let Some ( ( ref client , _) ) = self . relay_client {
753
- client . local_addr ( )
751
+ if let Some ( ( ref conn , _) ) = self . relay_conn {
752
+ conn . local_addr ( )
754
753
} else {
755
754
None
756
755
}
757
756
}
758
757
759
758
async fn ping ( & mut self , s : oneshot:: Sender < Result < Duration , ClientError > > ) {
760
- let connect_res = self . connect ( "ping" ) . await . map ( |( c, _, _ ) | c) ;
759
+ let connect_res = self . connect ( "ping" ) . await . map ( |( c, _) | c) ;
761
760
let ( ping, recv) = self . pings . register ( ) ;
762
761
trace ! ( "ping: {}" , hex:: encode( ping) ) ;
763
762
764
763
self . ping_tasks . spawn ( async move {
765
764
let res = match connect_res {
766
- Ok ( client ) => {
765
+ Ok ( conn ) => {
767
766
let start = Instant :: now ( ) ;
768
- if let Err ( err) = client . send_ping ( ping) . await {
767
+ if let Err ( err) = conn . send_ping ( ping) . await {
769
768
warn ! ( "failed to send ping: {:?}" , err) ;
770
769
Err ( ClientError :: Send )
771
770
} else {
@@ -782,10 +781,10 @@ impl Actor {
782
781
} ) ;
783
782
}
784
783
785
- async fn send ( & mut self , dst_key : PublicKey , b : Bytes ) -> Result < ( ) , ClientError > {
786
- trace ! ( dst = %dst_key . fmt_short( ) , len = b . len( ) , "send" ) ;
787
- let ( client , _ , _) = self . connect ( "send" ) . await ?;
788
- if client . send ( dst_key , b ) . await . is_err ( ) {
784
+ async fn send ( & mut self , remote_node : NodeId , payload : Bytes ) -> Result < ( ) , ClientError > {
785
+ trace ! ( remote_node = %remote_node . fmt_short( ) , len = payload . len( ) , "send" ) ;
786
+ let ( conn , _) = self . connect ( "send" ) . await ?;
787
+ if conn . send ( remote_node , payload ) . await . is_err ( ) {
789
788
self . close_for_reconnect ( ) . await ;
790
789
return Err ( ClientError :: Send ) ;
791
790
}
@@ -795,8 +794,8 @@ impl Actor {
795
794
async fn send_pong ( & mut self , data : [ u8 ; 8 ] ) -> Result < ( ) , ClientError > {
796
795
debug ! ( "send_pong" ) ;
797
796
if self . can_ack_pings {
798
- let ( client , _ , _) = self . connect ( "send_pong" ) . await ?;
799
- if client . send_pong ( data) . await . is_err ( ) {
797
+ let ( conn , _) = self . connect ( "send_pong" ) . await ?;
798
+ if conn . send_pong ( data) . await . is_err ( ) {
800
799
self . close_for_reconnect ( ) . await ;
801
800
return Err ( ClientError :: Send ) ;
802
801
}
@@ -817,16 +816,7 @@ impl Actor {
817
816
if self . is_closed {
818
817
return false ;
819
818
}
820
- self . relay_client . is_some ( )
821
- }
822
-
823
- fn current_conn ( & self ) -> usize {
824
- self . conn_gen
825
- }
826
-
827
- fn next_conn ( & mut self ) -> usize {
828
- self . conn_gen = self . conn_gen . wrapping_add ( 1 ) ;
829
- self . conn_gen
819
+ self . relay_conn . is_some ( )
830
820
}
831
821
832
822
fn tls_servername ( & self ) -> Option < rustls:: pki_types:: ServerName > {
@@ -987,13 +977,12 @@ impl Actor {
987
977
}
988
978
}
989
979
990
- async fn recv_detail ( & mut self ) -> Result < ( ReceivedMessage , usize ) , ClientError > {
991
- if let Some ( ( _client , client_receiver ) ) = self . relay_client . as_mut ( ) {
980
+ async fn recv_detail ( & mut self ) -> Result < ReceivedMessage , ClientError > {
981
+ if let Some ( ( _conn , conn_receiver ) ) = self . relay_conn . as_mut ( ) {
992
982
trace ! ( "recv_detail tick" ) ;
993
- match client_receiver . recv ( ) . await {
983
+ match conn_receiver . recv ( ) . await {
994
984
Ok ( msg) => {
995
- let current_gen = self . current_conn ( ) ;
996
- return Ok ( ( msg, current_gen) ) ;
985
+ return Ok ( msg) ;
997
986
}
998
987
Err ( e) => {
999
988
self . close_for_reconnect ( ) . await ;
@@ -1012,8 +1001,8 @@ impl Actor {
1012
1001
/// requires a connection, it will call `connect`.
1013
1002
async fn close_for_reconnect ( & mut self ) {
1014
1003
debug ! ( "close for reconnect" ) ;
1015
- if let Some ( ( client , _) ) = self . relay_client . take ( ) {
1016
- client . close ( ) . await
1004
+ if let Some ( ( conn , _) ) = self . relay_conn . take ( ) {
1005
+ conn . close ( ) . await
1017
1006
}
1018
1007
}
1019
1008
}
0 commit comments