@@ -13,7 +13,7 @@ use matrix_sdk::{
1313 session:: get_login_types,
1414 sync:: sync_events:: v3:: Filter ,
1515 } ,
16- events:: room:: MediaSource ,
16+ events:: { room:: MediaSource , AnyToDeviceEvent } ,
1717 serde:: Raw ,
1818 TransactionId , UInt ,
1919 } ,
@@ -49,11 +49,29 @@ pub struct Client {
4949
5050impl Client {
5151 pub fn new ( client : MatrixClient , state : ClientState ) -> Self {
52+ let session_verification_controller: Arc <
53+ matrix_sdk:: locks:: RwLock < Option < SessionVerificationController > > ,
54+ > = Default :: default ( ) ;
55+ let ctrl = session_verification_controller. clone ( ) ;
56+
57+ client. add_event_handler ( move |ev : AnyToDeviceEvent | {
58+ let ctrl = ctrl. clone ( ) ;
59+ async move {
60+ if let Some ( session_verification_controller) = & * ctrl. clone ( ) . read ( ) . await {
61+ session_verification_controller. process_to_device_message ( ev) . await ;
62+ } else {
63+ tracing:: warn!(
64+ "received to-device message, but verification controller isn't ready"
65+ ) ;
66+ }
67+ }
68+ } ) ;
69+
5270 Client {
5371 client,
5472 state : Arc :: new ( RwLock :: new ( state) ) ,
5573 delegate : Arc :: new ( RwLock :: new ( None ) ) ,
56- session_verification_controller : Arc :: new ( matrix_sdk :: locks :: RwLock :: new ( None ) ) ,
74+ session_verification_controller,
5775 }
5876 }
5977
@@ -234,7 +252,6 @@ impl Client {
234252 {
235253 return Ok ( Arc :: new ( session_verification_controller. clone ( ) ) ) ;
236254 }
237-
238255 let user_id = self . client . user_id ( ) . context ( "Failed retrieving current user_id" ) ?;
239256 let user_identity = self
240257 . client
@@ -263,19 +280,20 @@ impl Client {
263280 }
264281
265282 /// Process a sync error and return loop control accordingly
266- fn process_sync_error ( & self , sync_error : Error ) -> LoopCtrl {
267- let mut control = LoopCtrl :: Continue ;
283+ pub ( crate ) fn process_sync_error ( & self , sync_error : Error ) -> LoopCtrl {
268284 if let Some ( RumaApiError :: ClientApi ( error) ) = sync_error. as_ruma_api_error ( ) {
269285 if let ErrorKind :: UnknownToken { soft_logout } = error. kind {
270286 self . state . write ( ) . unwrap ( ) . is_soft_logout = soft_logout;
271287 if let Some ( delegate) = & * self . delegate . read ( ) . unwrap ( ) {
272288 delegate. did_update_restore_token ( ) ;
273289 delegate. did_receive_auth_error ( soft_logout) ;
274290 }
275- control = LoopCtrl :: Break
291+ return LoopCtrl :: Break ;
276292 }
277293 }
278- control
294+
295+ tracing:: warn!( "Ignoring sync error: {:?}" , sync_error) ;
296+ LoopCtrl :: Continue
279297 }
280298}
281299
@@ -315,7 +333,6 @@ impl Client {
315333 let client = self . client . clone ( ) ;
316334 let state = self . state . clone ( ) ;
317335 let delegate = self . delegate . clone ( ) ;
318- let session_verification_controller = self . session_verification_controller . clone ( ) ;
319336 let local_self = self . clone ( ) ;
320337 RUNTIME . spawn ( async move {
321338 let mut filter = FilterDefinition :: default ( ) ;
@@ -337,7 +354,7 @@ impl Client {
337354
338355 client
339356 . sync_with_result_callback ( sync_settings, |result| async {
340- Ok ( if let Ok ( sync_response ) = result {
357+ Ok ( if result . is_ok ( ) {
341358 if !state. read ( ) . unwrap ( ) . has_first_synced {
342359 state. write ( ) . unwrap ( ) . has_first_synced = true ;
343360 }
@@ -353,14 +370,6 @@ impl Client {
353370 delegate. did_receive_sync_update ( )
354371 }
355372
356- if let Some ( session_verification_controller) =
357- & * session_verification_controller. read ( ) . await
358- {
359- session_verification_controller
360- . process_to_device_messages ( sync_response. to_device_events )
361- . await ;
362- }
363-
364373 LoopCtrl :: Continue
365374 } else {
366375 local_self. process_sync_error ( result. err ( ) . unwrap ( ) )
0 commit comments