Skip to content

Commit 234e0be

Browse files
committed
refactor(timeline): reuse the same push context for all the events we're trying to re-decrypt
1 parent b6d71a3 commit 234e0be

File tree

3 files changed

+27
-25
lines changed

3 files changed

+27
-25
lines changed

crates/matrix-sdk-ui/src/timeline/controller/decryption_retry_task.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ async fn decrypt_by_index<D: Decryptor>(
256256
retry_indices: Vec<usize>,
257257
) {
258258
let push_context = room_data_provider.push_context().await;
259+
let push_context = push_context.as_ref();
259260
let unable_to_decrypt_hook = state.meta.unable_to_decrypt_hook.clone();
260261

261262
let retry_one = |item: Arc<TimelineItem>| {
@@ -290,7 +291,7 @@ async fn decrypt_by_index<D: Decryptor>(
290291
return None;
291292
};
292293

293-
match decryptor.decrypt_event_impl(original_json).await {
294+
match decryptor.decrypt_event_impl(original_json, push_context).await {
294295
Ok(event) => {
295296
if let SdkTimelineEventKind::UnableToDecrypt { utd_info, .. } = event.kind {
296297
info!(
@@ -320,15 +321,7 @@ async fn decrypt_by_index<D: Decryptor>(
320321
))
321322
};
322323

323-
state
324-
.retry_event_decryption(
325-
retry_one,
326-
retry_indices,
327-
push_context,
328-
room_data_provider,
329-
settings,
330-
)
331-
.await;
324+
state.retry_event_decryption(retry_one, retry_indices, room_data_provider, settings).await;
332325
}
333326

334327
#[cfg(test)]

crates/matrix-sdk-ui/src/timeline/controller/state.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
use std::{future::Future, sync::Arc};
1616

1717
use eyeball_im::VectorDiff;
18-
use matrix_sdk::{
19-
deserialized_responses::TimelineEvent, room::PushContext, send_queue::SendHandle,
20-
};
18+
use matrix_sdk::{deserialized_responses::TimelineEvent, send_queue::SendHandle};
2119
#[cfg(test)]
2220
use ruma::events::receipt::ReceiptEventContent;
2321
use ruma::{
@@ -180,7 +178,6 @@ impl TimelineState {
180178
&mut self,
181179
retry_one: impl Fn(Arc<TimelineItem>) -> Fut,
182180
retry_indices: Vec<usize>,
183-
push_context: Option<PushContext>,
184181
room_data_provider: &P,
185182
settings: &TimelineSettings,
186183
) where
@@ -197,12 +194,10 @@ impl TimelineState {
197194
let mut offset = 0;
198195
for idx in retry_indices {
199196
let idx = idx - offset;
200-
let Some(mut event) = retry_one(txn.items[idx].clone()).await else {
197+
let Some(event) = retry_one(txn.items[idx].clone()).await else {
201198
continue;
202199
};
203200

204-
event.push_actions = push_context.as_ref().map(|ctx| ctx.for_event(event.raw()));
205-
206201
let handle_one_res = txn
207202
.handle_remote_event(
208203
event,

crates/matrix-sdk-ui/src/timeline/traits.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -282,30 +282,44 @@ pub(super) trait Decryptor: AsyncTraitDeps + Clone + 'static {
282282
fn decrypt_event_impl(
283283
&self,
284284
raw: &Raw<AnySyncTimelineEvent>,
285+
push_context: Option<&PushContext>,
285286
) -> impl Future<Output = Result<TimelineEvent>> + SendOutsideWasm;
286287
}
287288

288289
impl Decryptor for Room {
289-
async fn decrypt_event_impl(&self, raw: &Raw<AnySyncTimelineEvent>) -> Result<TimelineEvent> {
290-
let push_action_ctx = self.push_context().await?;
291-
self.decrypt_event(raw.cast_ref(), push_action_ctx.as_ref()).await
290+
async fn decrypt_event_impl(
291+
&self,
292+
raw: &Raw<AnySyncTimelineEvent>,
293+
push_context: Option<&PushContext>,
294+
) -> Result<TimelineEvent> {
295+
self.decrypt_event(raw.cast_ref(), push_context).await
292296
}
293297
}
294298

295299
#[cfg(test)]
296300
impl Decryptor for (matrix_sdk_base::crypto::OlmMachine, ruma::OwnedRoomId) {
297-
async fn decrypt_event_impl(&self, raw: &Raw<AnySyncTimelineEvent>) -> Result<TimelineEvent> {
301+
async fn decrypt_event_impl(
302+
&self,
303+
raw: &Raw<AnySyncTimelineEvent>,
304+
push_context: Option<&PushContext>,
305+
) -> Result<TimelineEvent> {
298306
let (olm_machine, room_id) = self;
299307
let decryption_settings =
300308
DecryptionSettings { sender_device_trust_requirement: TrustRequirement::Untrusted };
301-
match olm_machine
309+
310+
let mut timeline_event = match olm_machine
302311
.try_decrypt_room_event(raw.cast_ref(), room_id, &decryption_settings)
303312
.await?
304313
{
305-
RoomEventDecryptionResult::Decrypted(decrypted) => Ok(decrypted.into()),
314+
RoomEventDecryptionResult::Decrypted(decrypted) => decrypted.into(),
306315
RoomEventDecryptionResult::UnableToDecrypt(utd_info) => {
307-
Ok(TimelineEvent::new_utd_event(raw.clone(), utd_info))
316+
TimelineEvent::new_utd_event(raw.clone(), utd_info)
308317
}
309-
}
318+
};
319+
320+
// Fill the push actions here, to mimic what `Room::decrypt_event` does.
321+
timeline_event.push_actions = push_context.map(|ctx| ctx.for_event(timeline_event.raw()));
322+
323+
Ok(timeline_event)
310324
}
311325
}

0 commit comments

Comments
 (0)