matrix_sdk_ui/timeline/
to_device.rs
1use std::iter;
16
17use matrix_sdk::event_handler::EventHandler;
18use ruma::{
19 events::{forwarded_room_key::ToDeviceForwardedRoomKeyEvent, room_key::ToDeviceRoomKeyEvent},
20 OwnedRoomId,
21};
22use tracing::{debug_span, trace, Instrument};
23
24use super::controller::TimelineController;
25
26pub(super) fn handle_room_key_event(
27 timeline: TimelineController,
28 room_id: OwnedRoomId,
29) -> impl EventHandler<ToDeviceRoomKeyEvent, ()> {
30 move |event: ToDeviceRoomKeyEvent| {
31 async move {
32 let event_room_id = event.content.room_id;
33 let session_id = event.content.session_id;
34 retry_decryption(timeline, room_id, event_room_id, session_id).await;
35 }
36 .instrument(debug_span!("handle_room_key_event"))
37 }
38}
39
40pub(super) fn handle_forwarded_room_key_event(
41 timeline: TimelineController,
42 room_id: OwnedRoomId,
43) -> impl EventHandler<ToDeviceForwardedRoomKeyEvent, ()> {
44 move |event: ToDeviceForwardedRoomKeyEvent| {
45 async move {
46 let event_room_id = event.content.room_id;
47 let session_id = event.content.session_id;
48 retry_decryption(timeline, room_id, event_room_id, session_id).await;
49 }
50 .instrument(debug_span!("handle_forwarded_room_key_event"))
51 }
52}
53
54async fn retry_decryption(
55 timeline: TimelineController,
56 room_id: OwnedRoomId,
57 event_room_id: OwnedRoomId,
58 session_id: String,
59) {
60 if event_room_id != room_id {
61 trace!(
62 ?event_room_id, timeline_room_id = ?room_id, ?session_id,
63 "Received to-device room key event for a different room, ignoring"
64 );
65 return;
66 }
67
68 timeline.retry_event_decryption(Some(iter::once(session_id).collect())).await;
69}