diff --git a/bindings/matrix-sdk-ffi/src/api.udl b/bindings/matrix-sdk-ffi/src/api.udl index f28e58051..dc792f684 100644 --- a/bindings/matrix-sdk-ffi/src/api.udl +++ b/bindings/matrix-sdk-ffi/src/api.udl @@ -115,7 +115,7 @@ interface SlidingSyncView { }; interface SlidingSyncRoom { - void add_timeline_listener(TimelineListener listener); + StoppableSpawn? add_timeline_listener(TimelineListener listener); }; interface SlidingSync { diff --git a/bindings/matrix-sdk-ffi/src/sliding_sync.rs b/bindings/matrix-sdk-ffi/src/sliding_sync.rs index d339516fa..2b4569677 100644 --- a/bindings/matrix-sdk-ffi/src/sliding_sync.rs +++ b/bindings/matrix-sdk-ffi/src/sliding_sync.rs @@ -139,24 +139,32 @@ impl SlidingSyncRoom { } impl SlidingSyncRoom { - pub fn add_timeline_listener(&self, listener: Box) { - let timeline = RUNTIME.block_on(async move { self.inner.timeline().await }); + pub fn add_timeline_listener( + &self, + listener: Box, + ) -> Option> { + let Some(timeline) = RUNTIME.block_on(async move { self.inner.timeline().await }) else { + tracing::warn!(room_id=?self.room_id(), "Could set timeline listener: no timeline found."); + return None + }; let timeline_signal = self.timeline.write().unwrap().get_or_insert_with(|| Arc::new(timeline)).signal(); let listener: Arc = listener.into(); - RUNTIME.spawn(timeline_signal.for_each(move |diff| { - let listener = listener.clone(); - let fut = RUNTIME - .spawn_blocking(move || listener.on_update(Arc::new(TimelineDiff::new(diff)))); + Some(Arc::new(StoppableSpawn::with_handle(RUNTIME.spawn(timeline_signal.for_each( + move |diff| { + let listener = listener.clone(); + let fut = RUNTIME + .spawn_blocking(move || listener.on_update(Arc::new(TimelineDiff::new(diff)))); - async move { - if let Err(e) = fut.await { - error!("Timeline listener error: {e}"); + async move { + if let Err(e) = fut.await { + error!("Timeline listener error: {e}"); + } } - } - })); + }, + ))))) } } diff --git a/crates/matrix-sdk/src/sliding_sync.rs b/crates/matrix-sdk/src/sliding_sync.rs index 00546bc22..cf42c3091 100644 --- a/crates/matrix-sdk/src/sliding_sync.rs +++ b/crates/matrix-sdk/src/sliding_sync.rs @@ -219,8 +219,8 @@ impl SlidingSyncRoom { /// `Timeline` of this room #[cfg(feature = "experimental-timeline")] - pub async fn timeline(&self) -> Timeline { - self.timeline_no_fully_read_tracking().unwrap().with_fully_read_tracking().await + pub async fn timeline(&self) -> Option { + Some(self.timeline_no_fully_read_tracking()?.with_fully_read_tracking().await) } fn timeline_no_fully_read_tracking(&self) -> Option {