@@ -27,16 +27,19 @@ impl Client {
2727 event_types : Option < Vec < Cow < ' static , str > > > ,
2828 ) -> Result < ListenerHandle , Error > {
2929 let request_sender = {
30- let mut socket_handle = self . socket_handle . lock ( ) . unwrap ( ) ;
31- socket_handle. get_request_sender ( self . arc_client ( ) )
30+ let mut socket_handle = self . socket_handle . lock ( ) . unwrap_or_else ( |e| e . into_inner ( ) ) ;
31+ socket_handle. get_request_sender ( self . arc_client_ref ( ) )
3232 } ;
3333 request_sender
3434 . add_event_listener ( callback, event_types)
3535 . await
3636 }
3737
3838 pub fn is_socket_connected ( & self ) -> bool {
39- self . socket_handle . lock ( ) . unwrap ( ) . request_sender . is_some ( )
39+ self . socket_handle
40+ . lock ( )
41+ . unwrap_or_else ( |e| e. into_inner ( ) )
42+ . is_connected ( )
4043 }
4144
4245 // we need to expose this for v3 because most of the returned events are encrypted
@@ -54,7 +57,7 @@ impl Client {
5457#[ derive( Default ) ]
5558pub ( crate ) struct WebSocketHandle {
5659 // closes websocket thread on drop
57- request_sender : Option < tokio:: sync:: mpsc:: Sender < SocketRequest > > ,
60+ request_sender : Option < tokio:: sync:: mpsc:: WeakSender < SocketRequest > > ,
5861}
5962
6063struct RequestSender ( tokio:: sync:: mpsc:: Sender < SocketRequest > ) ;
@@ -93,15 +96,21 @@ impl RequestSender {
9396}
9497
9598impl WebSocketHandle {
96- fn get_request_sender ( & mut self , client : Arc < AuthClient > ) -> RequestSender {
97- RequestSender ( match & self . request_sender {
98- Some ( s) => s. clone ( ) ,
99- None => {
100- let request_sender = spawn_websocket_thread ( client) ;
101- self . request_sender = Some ( request_sender. clone ( ) ) ;
102- request_sender
103- }
104- } )
99+ fn get_request_sender ( & mut self , client : & Arc < AuthClient > ) -> RequestSender {
100+ if let Some ( weak_sender) = & self . request_sender
101+ && let Some ( sender) = weak_sender. upgrade ( )
102+ {
103+ return RequestSender ( sender) ;
104+ }
105+ let sender = spawn_websocket_thread ( Arc :: clone ( client) ) ;
106+ self . request_sender = Some ( sender. downgrade ( ) ) ;
107+ RequestSender ( sender)
108+ }
109+
110+ fn is_connected ( & self ) -> bool {
111+ self . request_sender
112+ . as_ref ( )
113+ . is_some_and ( |weak| weak. strong_count ( ) > 0 )
105114 }
106115}
107116
@@ -319,7 +328,7 @@ fn handle_message(
319328/// Handles a socket request, modifying the listener manager as needed.
320329///
321330/// Returns true if there are no more listeners after handling the request.
322- fn handle_request ( request : SocketRequest , listeners : & mut impl ListenerManagerExt ) -> bool {
331+ fn handle_request ( request : SocketRequest , listeners : & mut impl ListenerManagerExt ) {
323332 match request {
324333 SocketRequest :: AddListener {
325334 id_sender,
@@ -338,7 +347,6 @@ fn handle_request(request: SocketRequest, listeners: &mut impl ListenerManagerEx
338347 listeners. remove_listener ( idx) ;
339348 }
340349 }
341- listeners. is_empty ( )
342350}
343351
344352/// Handles the initialized websocket connection, processing incoming messages and managing listeners.
@@ -360,11 +368,7 @@ async fn handle_initialized_websocket(
360368 should_retry = false ;
361369 break ;
362370 } ;
363- should_retry = !handle_request( request, listeners) ;
364- if !should_retry {
365- // no more listeners, shutting down websocket task
366- break ;
367- }
371+ handle_request( request, listeners) ;
368372 }
369373 message_result = streams. read. next( ) => {
370374 if let Err ( ( should_continue, error) ) = handle_message( message_result, listeners) {
0 commit comments