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())
}
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![];
for (room_id, receipts) in receipts.into_iter() {
@ -679,11 +682,7 @@ impl ChatStore {
}
}
for (room_id, read_till) in updates.into_iter() {
if let Some(room) = self.worker.client.get_joined_room(&room_id) {
let _ = room.read_receipt(read_till.as_ref()).await;
}
}
return updates;
}
pub fn mark_for_load(&mut self, room_id: OwnedRoomId) {

View file

@ -56,6 +56,7 @@ use matrix_sdk::{
room::RoomType,
serde::Raw,
EventEncryptionAlgorithm,
OwnedEventId,
OwnedRoomId,
OwnedRoomOrAliasId,
OwnedUserId,
@ -905,6 +906,7 @@ impl ClientWorker {
self.rcpt_handle = tokio::spawn({
let store = store.clone();
let client = self.client.clone();
let mut sent = HashMap::<OwnedRoomId, OwnedEventId>::default();
async move {
// Update the displayed read receipts every 5 seconds.
@ -914,7 +916,22 @@ impl ClientWorker {
interval.tick().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);
}
}
}
}
}
})