Files
continuwuity/src/api/client/room/initial_sync.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

97 lines
2.1 KiB
Rust
Raw Normal View History

2024-11-12 03:46:31 +00:00
use axum::extract::State;
use conduwuit::{
2025-06-04 00:11:09 +01:00
Err, Event, Result, at, debug_warn,
2025-04-29 06:39:30 +00:00
utils::{BoolExt, stream::TryTools},
};
use futures::{FutureExt, TryStreamExt, future::try_join4};
2026-04-10 12:52:42 -04:00
use ruma::{
api::client::peeking::get_current_state::v3::{PaginationChunk, Request, Response},
assign,
};
2024-11-12 03:46:31 +00:00
use crate::Ruma;
const LIMIT_MAX: usize = 100;
pub(crate) async fn room_initial_sync_route(
State(services): State<crate::State>,
body: Ruma<Request>,
2024-11-12 03:46:31 +00:00
) -> Result<Response> {
let room_id = &body.room_id;
if !services
.rooms
.state_accessor
.user_can_see_state_events(body.identity.sender_user(), room_id)
2024-11-12 03:46:31 +00:00
.await
{
return Err!(Request(Forbidden("No room preview available.")));
}
let membership = services
2024-11-12 03:46:31 +00:00
.rooms
.state_cache
.user_membership(body.identity.sender_user(), room_id)
.map(Ok);
let visibility = services.rooms.directory.visibility(room_id).map(Ok);
2024-11-12 03:46:31 +00:00
let state = services
2024-11-12 03:46:31 +00:00
.rooms
.state_accessor
.room_state_full_pdus(room_id)
2025-04-26 08:24:47 +00:00
.map_ok(Event::into_format)
.try_collect::<Vec<_>>();
// Events are returned in body
let limit = LIMIT_MAX;
let events = services
.rooms
.timeline
.pdus_rev(room_id, None)
.try_take(limit)
.and_then(async |mut pdu| {
pdu.1.set_unsigned(Some(body.identity.sender_user()));
if let Err(e) = services
.rooms
.pdu_metadata
.add_bundled_aggregations_to_pdu(body.identity.sender_user(), &mut pdu.1)
.await
{
debug_warn!("Failed to add bundled aggregations: {e}");
2025-06-04 00:11:09 +01:00
}
Ok(pdu)
})
.try_collect::<Vec<_>>();
let (membership, visibility, state, events) =
try_join4(membership, visibility, state, events)
.boxed()
.await?;
2024-11-12 03:46:31 +00:00
2026-04-10 12:52:42 -04:00
let end = events
.first()
.map(at!(0))
.as_ref()
.map(ToString::to_string)
.unwrap_or_default();
let start = events.last().map(at!(0)).as_ref().map(ToString::to_string);
2024-11-12 03:46:31 +00:00
2026-04-10 12:52:42 -04:00
let chunk = events
.into_iter()
.map(at!(1))
.map(Event::into_format)
.collect();
2024-11-12 03:46:31 +00:00
2026-04-10 12:52:42 -04:00
let messages = assign!(PaginationChunk::new(chunk, end), { start });
2024-11-12 03:46:31 +00:00
2026-04-10 12:52:42 -04:00
Ok(assign!(Response::new(room_id.to_owned()), {
account_data: vec![],
2026-04-13 18:31:16 -04:00
state: state,
2024-11-12 03:46:31 +00:00
messages: messages.chunk.is_empty().or_some(messages),
visibility: visibility.into(),
membership,
2026-04-10 12:52:42 -04:00
}))
2024-11-12 03:46:31 +00:00
}