refactor(base): Create the room::sync_v2::update_knocked_room response processor.

This patch creates the `update_knocked_room` processor, extracted from
the sync v2 flow.
This commit is contained in:
Ivan Enderlin
2025-04-14 14:01:48 +02:00
parent aeca1f1495
commit 13e565a4dc
2 changed files with 45 additions and 24 deletions

View File

@@ -610,28 +610,14 @@ impl BaseClient {
new_rooms.invite.insert(room_id, invited_room_update);
}
for (room_id, new_info) in response.rooms.knock {
let room = self.state_store.get_or_create_room(
for (room_id, knocked_room) in response.rooms.knock {
let knocked_room_update = processors::room::sync_v2::update_knocked_room(
&mut context,
&room_id,
RoomState::Knocked,
knocked_room,
&self.state_store,
self.room_info_notable_update_sender.clone(),
);
let (raw_events, events) = processors::state_events::stripped::collect(
&mut context,
&new_info.knock_state.events,
);
let mut room_info = room.clone_info();
room_info.mark_as_knocked();
room_info.mark_state_fully_synced();
processors::state_events::stripped::dispatch_invite_or_knock(
&mut context,
(&raw_events, &events),
&room,
&mut room_info,
processors::notification::Notification::new(
processors::timeline::builder::Notification::new(
&push_rules,
&mut notifications,
&self.state_store,
@@ -639,8 +625,7 @@ impl BaseClient {
)
.await?;
context.state_changes.add_room(room_info);
new_rooms.knocked.insert(room_id, new_info);
new_rooms.knocked.insert(room_id, knocked_room_update);
}
global_account_data_processor.apply(&mut context, &self.state_store).await;

View File

@@ -15,7 +15,7 @@
use std::collections::{BTreeMap, BTreeSet};
use ruma::{
api::client::sync::sync_events::v3::{InvitedRoom, JoinedRoom, LeftRoom},
api::client::sync::sync_events::v3::{InvitedRoom, JoinedRoom, KnockedRoom, LeftRoom},
OwnedRoomId, OwnedUserId, RoomId,
};
use tokio::sync::broadcast::Sender;
@@ -25,7 +25,7 @@ use super::super::e2ee;
use super::super::{account_data, ephemeral_events, state_events, timeline, Context};
use crate::{
store::{ambiguity_map::AmbiguityCache, BaseStateStore},
sync::{InvitedRoomUpdate, JoinedRoomUpdate, LeftRoomUpdate},
sync::{InvitedRoomUpdate, JoinedRoomUpdate, KnockedRoomUpdate, LeftRoomUpdate},
RequestedRequiredStates, Result, RoomInfoNotableUpdate, RoomState,
};
@@ -246,3 +246,39 @@ pub async fn update_invited_room(
Ok(invited_room)
}
/// Process updates of a knocked room.
pub async fn update_knocked_room(
context: &mut Context,
room_id: &RoomId,
knocked_room: KnockedRoom,
state_store: &BaseStateStore,
room_info_notable_update_sender: Sender<RoomInfoNotableUpdate>,
notification: timeline::builder::Notification<'_>,
) -> Result<KnockedRoomUpdate> {
let room = state_store.get_or_create_room(
room_id,
RoomState::Knocked,
room_info_notable_update_sender,
);
let (raw_events, events) =
state_events::stripped::collect(context, &knocked_room.knock_state.events);
let mut room_info = room.clone_info();
room_info.mark_as_knocked();
room_info.mark_state_fully_synced();
state_events::stripped::dispatch_invite_or_knock(
context,
(&raw_events, &events),
&room,
&mut room_info,
notification,
)
.await?;
context.state_changes.add_room(room_info);
Ok(knocked_room)
}