diff --git a/src/api/client_server/sync/msc3575.rs b/src/api/client_server/sync/msc3575.rs index 31333eaf..e1ede5de 100644 --- a/src/api/client_server/sync/msc3575.rs +++ b/src/api/client_server/sync/msc3575.rs @@ -305,64 +305,59 @@ pub(crate) async fn sync_events_v4_route( let mut new_known_rooms = BTreeSet::new(); + let mut ops = Vec::new(); + for (mut from, mut to) in list.ranges { + from = from.clamp( + uint!(0), + UInt::try_from(all_joined_rooms.len() - 1).unwrap_or(UInt::MAX), + ); + to = to.clamp( + from, + UInt::try_from(all_joined_rooms.len() - 1).unwrap_or(UInt::MAX), + ); + let room_ids = + all_joined_rooms[from.try_into().unwrap_or(usize::MAX) + ..=to.try_into().unwrap_or(usize::MAX)] + .to_vec(); + + new_known_rooms.extend(room_ids.iter().cloned()); + for room_id in &room_ids { + let todo_room = todo_rooms.entry(room_id.clone()).or_insert(( + BTreeSet::new(), + 0, + u64::MAX, + )); + let limit = list + .room_details + .timeline_limit + .map_or(10, u64::from) + .min(100); + todo_room + .0 + .extend(list.room_details.required_state.iter().cloned()); + todo_room.1 = todo_room.1.max(limit); + // 0 means unknown because it got out of date + todo_room.2 = todo_room.2.min( + known_rooms + .get(&list_id) + .and_then(|k| k.get(room_id)) + .copied() + .unwrap_or(0), + ); + } + ops.push(sync_events::v4::SyncOp { + op: SlidingOp::Sync, + range: Some((from, to)), + index: None, + room_ids, + room_id: None, + }); + } + lists.insert( list_id.clone(), sync_events::v4::SyncList { - ops: list - .ranges - .into_iter() - .map(|mut r| { - r.0 = r.0.clamp( - uint!(0), - UInt::try_from(all_joined_rooms.len() - 1) - .unwrap_or(UInt::MAX), - ); - r.1 = r.1.clamp( - r.0, - UInt::try_from(all_joined_rooms.len() - 1) - .unwrap_or(UInt::MAX), - ); - let room_ids = all_joined_rooms[r - .0 - .try_into() - .unwrap_or(usize::MAX) - ..=r.1.try_into().unwrap_or(usize::MAX)] - .to_vec(); - new_known_rooms.extend(room_ids.iter().cloned()); - for room_id in &room_ids { - let todo_room = todo_rooms - .entry(room_id.clone()) - .or_insert((BTreeSet::new(), 0, u64::MAX)); - let limit = list - .room_details - .timeline_limit - .map_or(10, u64::from) - .min(100); - todo_room.0.extend( - list.room_details - .required_state - .iter() - .cloned(), - ); - todo_room.1 = todo_room.1.max(limit); - // 0 means unknown because it got out of date - todo_room.2 = todo_room.2.min( - known_rooms - .get(&list_id) - .and_then(|k| k.get(room_id)) - .copied() - .unwrap_or(0), - ); - } - sync_events::v4::SyncOp { - op: SlidingOp::Sync, - range: Some(r), - index: None, - room_ids, - room_id: None, - } - }) - .collect(), + ops, count: UInt::try_from(all_joined_rooms.len()) .unwrap_or(UInt::MAX), },