2024-11-12 03:46:31 +00:00
|
|
|
use axum::extract::State;
|
2025-01-04 04:12:50 +00:00
|
|
|
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},
|
2025-01-04 04:12:50 +00:00
|
|
|
};
|
2025-04-27 00:58:56 +00:00
|
|
|
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(
|
2024-12-15 00:05:47 -05:00
|
|
|
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
|
2026-05-26 13:28:23 -04:00
|
|
|
.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.")));
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-27 00:58:56 +00:00
|
|
|
let membership = services
|
2024-11-12 03:46:31 +00:00
|
|
|
.rooms
|
2025-04-27 00:58:56 +00:00
|
|
|
.state_cache
|
2026-05-26 13:28:23 -04:00
|
|
|
.user_membership(body.identity.sender_user(), room_id)
|
2025-04-27 00:58:56 +00:00
|
|
|
.map(Ok);
|
|
|
|
|
|
|
|
|
|
let visibility = services.rooms.directory.visibility(room_id).map(Ok);
|
2024-11-12 03:46:31 +00:00
|
|
|
|
2025-04-27 00:58:56 +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)
|
2025-04-27 00:58:56 +00:00
|
|
|
.try_collect::<Vec<_>>();
|
|
|
|
|
|
2025-06-03 21:31:02 +01:00
|
|
|
// Events are returned in body
|
|
|
|
|
|
2025-04-27 00:58:56 +00:00
|
|
|
let limit = LIMIT_MAX;
|
|
|
|
|
let events = services
|
|
|
|
|
.rooms
|
|
|
|
|
.timeline
|
2025-06-03 21:31:02 +01:00
|
|
|
.pdus_rev(room_id, None)
|
2025-04-27 00:58:56 +00:00
|
|
|
.try_take(limit)
|
2025-06-03 21:31:02 +01:00
|
|
|
.and_then(async |mut pdu| {
|
2026-05-26 13:28:23 -04:00
|
|
|
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
|
|
|
}
|
2025-06-03 21:31:02 +01:00
|
|
|
Ok(pdu)
|
|
|
|
|
})
|
2025-04-27 00:58:56 +00:00
|
|
|
.try_collect::<Vec<_>>();
|
|
|
|
|
|
|
|
|
|
let (membership, visibility, state, events) =
|
2025-04-27 02:39:28 +00:00
|
|
|
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),
|
2025-04-27 00:58:56 +00:00
|
|
|
visibility: visibility.into(),
|
|
|
|
|
membership,
|
2026-04-10 12:52:42 -04:00
|
|
|
}))
|
2024-11-12 03:46:31 +00:00
|
|
|
}
|