MSC3575: use explicit loop for ops creation

This commit is contained in:
Lambda 2025-08-10 11:27:02 +00:00
parent dd705a2bb2
commit 6d4f165629

View file

@ -305,45 +305,36 @@ pub(crate) async fn sync_events_v4_route(
let mut new_known_rooms = BTreeSet::new(); let mut new_known_rooms = BTreeSet::new();
lists.insert( let mut ops = Vec::new();
list_id.clone(), for (mut from, mut to) in list.ranges {
sync_events::v4::SyncList { from = from.clamp(
ops: list
.ranges
.into_iter()
.map(|mut r| {
r.0 = r.0.clamp(
uint!(0), uint!(0),
UInt::try_from(all_joined_rooms.len() - 1) UInt::try_from(all_joined_rooms.len() - 1).unwrap_or(UInt::MAX),
.unwrap_or(UInt::MAX),
); );
r.1 = r.1.clamp( to = to.clamp(
r.0, from,
UInt::try_from(all_joined_rooms.len() - 1) UInt::try_from(all_joined_rooms.len() - 1).unwrap_or(UInt::MAX),
.unwrap_or(UInt::MAX),
); );
let room_ids = all_joined_rooms[r let room_ids =
.0 all_joined_rooms[from.try_into().unwrap_or(usize::MAX)
.try_into() ..=to.try_into().unwrap_or(usize::MAX)]
.unwrap_or(usize::MAX)
..=r.1.try_into().unwrap_or(usize::MAX)]
.to_vec(); .to_vec();
new_known_rooms.extend(room_ids.iter().cloned()); new_known_rooms.extend(room_ids.iter().cloned());
for room_id in &room_ids { for room_id in &room_ids {
let todo_room = todo_rooms let todo_room = todo_rooms.entry(room_id.clone()).or_insert((
.entry(room_id.clone()) BTreeSet::new(),
.or_insert((BTreeSet::new(), 0, u64::MAX)); 0,
u64::MAX,
));
let limit = list let limit = list
.room_details .room_details
.timeline_limit .timeline_limit
.map_or(10, u64::from) .map_or(10, u64::from)
.min(100); .min(100);
todo_room.0.extend( todo_room
list.room_details .0
.required_state .extend(list.room_details.required_state.iter().cloned());
.iter()
.cloned(),
);
todo_room.1 = todo_room.1.max(limit); todo_room.1 = todo_room.1.max(limit);
// 0 means unknown because it got out of date // 0 means unknown because it got out of date
todo_room.2 = todo_room.2.min( todo_room.2 = todo_room.2.min(
@ -354,15 +345,19 @@ pub(crate) async fn sync_events_v4_route(
.unwrap_or(0), .unwrap_or(0),
); );
} }
sync_events::v4::SyncOp { ops.push(sync_events::v4::SyncOp {
op: SlidingOp::Sync, op: SlidingOp::Sync,
range: Some(r), range: Some((from, to)),
index: None, index: None,
room_ids, room_ids,
room_id: None, room_id: None,
});
} }
})
.collect(), lists.insert(
list_id.clone(),
sync_events::v4::SyncList {
ops,
count: UInt::try_from(all_joined_rooms.len()) count: UInt::try_from(all_joined_rooms.len())
.unwrap_or(UInt::MAX), .unwrap_or(UInt::MAX),
}, },