@@ -753,11 +753,20 @@ impl Client {
753
753
self . inner . available_sliding_sync_versions ( ) . await . into_iter ( ) . map ( Into :: into) . collect ( )
754
754
}
755
755
756
+ /// Sets the [ClientDelegate] which will inform about authentication errors.
757
+ /// Returns an error if the delegate was already set.
756
758
pub fn set_delegate (
757
759
self : Arc < Self > ,
758
760
delegate : Option < Box < dyn ClientDelegate > > ,
759
- ) -> Option < Arc < TaskHandle > > {
760
- delegate. map ( |delegate| {
761
+ ) -> Result < Option < Arc < TaskHandle > > , ClientError > {
762
+ if self . delegate . get ( ) . is_some ( ) {
763
+ return Err ( ClientError :: Generic {
764
+ msg : "Delegate already initialized" . to_owned ( ) ,
765
+ details : None ,
766
+ } ) ;
767
+ }
768
+
769
+ Ok ( delegate. map ( |delegate| {
761
770
let mut session_change_receiver = self . inner . subscribe_to_session_changes ( ) ;
762
771
let client_clone = self . clone ( ) ;
763
772
let session_change_task = get_runtime_handle ( ) . spawn ( async move {
@@ -774,11 +783,24 @@ impl Client {
774
783
} ) ;
775
784
776
785
self . delegate . get_or_init ( || Arc :: from ( delegate) ) ;
786
+
777
787
Arc :: new ( TaskHandle :: new ( session_change_task) )
778
- } )
788
+ } ) )
779
789
}
780
790
781
- pub async fn set_utd_delegate ( self : Arc < Self > , utd_delegate : Box < dyn UnableToDecryptDelegate > ) {
791
+ /// Sets the [UnableToDecryptDelegate] which will inform about UTDs.
792
+ /// Returns an error if the delegate was already set.
793
+ pub async fn set_utd_delegate (
794
+ self : Arc < Self > ,
795
+ utd_delegate : Box < dyn UnableToDecryptDelegate > ,
796
+ ) -> Result < ( ) , ClientError > {
797
+ if self . utd_hook_manager . get ( ) . is_some ( ) {
798
+ return Err ( ClientError :: Generic {
799
+ msg : "UTD delegate already initialized" . to_owned ( ) ,
800
+ details : None ,
801
+ } ) ;
802
+ }
803
+
782
804
// UTDs detected before this duration may be reclassified as "late decryption"
783
805
// events (or discarded, if they get decrypted fast enough).
784
806
const UTD_HOOK_GRACE_PERIOD : Duration = Duration :: from_secs ( 60 ) ;
@@ -796,6 +818,8 @@ impl Client {
796
818
}
797
819
798
820
self . utd_hook_manager . get_or_init ( || Arc :: new ( utd_hook_manager) ) ;
821
+
822
+ Ok ( ( ) )
799
823
}
800
824
801
825
pub fn session ( & self ) -> Result < Session , ClientError > {
0 commit comments