ChatStore::set_receipts locks up app for bad connections (#99)

This commit is contained in:
Ulyssa 2023-05-12 17:42:25 -07:00
parent 4935899aed
commit ad8b4a60d2
No known key found for this signature in database
GPG key ID: 1B3965A3D18B9B64
2 changed files with 23 additions and 7 deletions

View file

@ -666,7 +666,10 @@ impl ChatStore {
.unwrap_or_else(|| "Untitled Matrix Room".to_string()) .unwrap_or_else(|| "Untitled Matrix Room".to_string())
} }
pub async fn set_receipts(&mut self, receipts: Vec<(OwnedRoomId, Receipts)>) { pub async fn set_receipts(
&mut self,
receipts: Vec<(OwnedRoomId, Receipts)>,
) -> Vec<(OwnedRoomId, OwnedEventId)> {
let mut updates = vec![]; let mut updates = vec![];
for (room_id, receipts) in receipts.into_iter() { for (room_id, receipts) in receipts.into_iter() {
@ -679,11 +682,7 @@ impl ChatStore {
} }
} }
for (room_id, read_till) in updates.into_iter() { return updates;
if let Some(room) = self.worker.client.get_joined_room(&room_id) {
let _ = room.read_receipt(read_till.as_ref()).await;
}
}
} }
pub fn mark_for_load(&mut self, room_id: OwnedRoomId) { pub fn mark_for_load(&mut self, room_id: OwnedRoomId) {

View file

@ -56,6 +56,7 @@ use matrix_sdk::{
room::RoomType, room::RoomType,
serde::Raw, serde::Raw,
EventEncryptionAlgorithm, EventEncryptionAlgorithm,
OwnedEventId,
OwnedRoomId, OwnedRoomId,
OwnedRoomOrAliasId, OwnedRoomOrAliasId,
OwnedUserId, OwnedUserId,
@ -905,6 +906,7 @@ impl ClientWorker {
self.rcpt_handle = tokio::spawn({ self.rcpt_handle = tokio::spawn({
let store = store.clone(); let store = store.clone();
let client = self.client.clone(); let client = self.client.clone();
let mut sent = HashMap::<OwnedRoomId, OwnedEventId>::default();
async move { async move {
// Update the displayed read receipts every 5 seconds. // Update the displayed read receipts every 5 seconds.
@ -914,7 +916,22 @@ impl ClientWorker {
interval.tick().await; interval.tick().await;
let receipts = update_receipts(&client).await; let receipts = update_receipts(&client).await;
store.lock().await.application.set_receipts(receipts).await; let read = store.lock().await.application.set_receipts(receipts).await;
for (room_id, read_till) in read.into_iter() {
if let Some(read_sent) = sent.get(&room_id) {
if read_sent == &read_till {
// Skip unchanged receipts.
continue;
}
}
if let Some(room) = client.get_joined_room(&room_id) {
if room.read_receipt(&read_till).await.is_ok() {
sent.insert(room_id, read_till);
}
}
}
} }
} }
}) })