Fix /send_join response event format. Optimize.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-08-28 08:33:10 +00:00
parent 757d38e891
commit 79e3c898ac

View File

@@ -3,17 +3,16 @@
use std::borrow::Borrow; use std::borrow::Borrow;
use axum::extract::State; use axum::extract::State;
use futures::{FutureExt, StreamExt, TryStreamExt}; use futures::{FutureExt, StreamExt, TryStreamExt, future::try_join3};
use ruma::{ use ruma::{
CanonicalJsonValue, OwnedEventId, OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, OwnedEventId, OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, ServerName,
ServerName,
api::federation::membership::create_join_event, api::federation::membership::create_join_event,
events::{ events::{
StateEventType, StateEventType,
room::member::{MembershipState, RoomMemberEventContent}, room::member::{MembershipState, RoomMemberEventContent},
}, },
}; };
use serde_json::value::{RawValue as RawJsonValue, to_raw_value}; use serde_json::value::RawValue as RawJsonValue;
use tuwunel_core::{ use tuwunel_core::{
Err, Result, at, err, Err, Result, at, err,
matrix::event::gen_event_id_canonical_json, matrix::event::gen_event_id_canonical_json,
@@ -212,20 +211,6 @@ async fn create_join_event(
.collect() .collect()
.await; .await;
let state = state_ids
.iter()
.try_stream()
.broad_and_then(|event_id| services.timeline.get_pdu_json(event_id))
.broad_and_then(|pdu| {
services
.federation
.format_pdu_into(pdu, Some(&room_version_id))
.map(Ok)
})
.try_collect()
.boxed()
.await?;
let starting_events = state_ids.iter().map(Borrow::borrow); let starting_events = state_ids.iter().map(Borrow::borrow);
let auth_chain = services let auth_chain = services
.auth_chain .auth_chain
@@ -237,20 +222,34 @@ async fn create_join_event(
.format_pdu_into(pdu, Some(&room_version_id)) .format_pdu_into(pdu, Some(&room_version_id))
.map(Ok) .map(Ok)
}) })
.try_collect() .try_collect();
.boxed()
.await?; let state = state_ids
.iter()
.try_stream()
.broad_and_then(|event_id| services.timeline.get_pdu_json(event_id))
.broad_and_then(|pdu| {
services
.federation
.format_pdu_into(pdu, Some(&room_version_id))
.map(Ok)
})
.try_collect();
let event = services
.federation
.format_pdu_into(value, Some(&room_version_id))
.map(Some)
.map(Ok);
let (auth_chain, state, event) = try_join3(auth_chain, state, event).await?;
services services
.sending .sending
.send_pdu_room(room_id, &pdu_id) .send_pdu_room(room_id, &pdu_id)
.await?; .await?;
Ok(create_join_event::v1::RoomState { Ok(create_join_event::v1::RoomState { auth_chain, state, event })
auth_chain,
state,
event: to_raw_value(&CanonicalJsonValue::Object(value)).ok(),
})
} }
/// # `PUT /_matrix/federation/v1/send_join/{roomId}/{eventId}` /// # `PUT /_matrix/federation/v1/send_join/{roomId}/{eventId}`
@@ -271,6 +270,7 @@ pub(crate) async fn create_join_event_v1_route(
body.origin(), body.origin(),
&body.room_id, &body.room_id,
); );
return Err!(Request(Forbidden("Server is banned on this homeserver."))); return Err!(Request(Forbidden("Server is banned on this homeserver.")));
} }
@@ -286,17 +286,18 @@ pub(crate) async fn create_join_event_v1_route(
body.origin(), body.origin(),
&body.room_id, &body.room_id,
); );
return Err!(Request(Forbidden(warn!( return Err!(Request(Forbidden(warn!(
"Room ID server name {server} is banned on this homeserver." "Room ID server name {server} is banned on this homeserver."
)))); ))));
} }
} }
let room_state = create_join_event(&services, body.origin(), &body.room_id, &body.pdu) Ok(create_join_event::v1::Response {
.boxed() room_state: create_join_event(&services, body.origin(), &body.room_id, &body.pdu)
.await?; .boxed()
.await?,
Ok(create_join_event::v1::Response { room_state }) })
} }
/// # `PUT /_matrix/federation/v2/send_join/{roomId}/{eventId}` /// # `PUT /_matrix/federation/v2/send_join/{roomId}/{eventId}`
@@ -326,6 +327,7 @@ pub(crate) async fn create_join_event_v2_route(
body.origin(), body.origin(),
&body.room_id, &body.room_id,
); );
return Err!(Request(Forbidden(warn!( return Err!(Request(Forbidden(warn!(
"Room ID server name {server} is banned on this homeserver." "Room ID server name {server} is banned on this homeserver."
)))); ))));
@@ -337,13 +339,13 @@ pub(crate) async fn create_join_event_v2_route(
.boxed() .boxed()
.await?; .await?;
let room_state = create_join_event::v2::RoomState { Ok(create_join_event::v2::Response {
members_omitted: false, room_state: create_join_event::v2::RoomState {
auth_chain, members_omitted: false,
state, auth_chain,
event, state,
servers_in_room: None, event,
}; servers_in_room: None,
},
Ok(create_join_event::v2::Response { room_state }) })
} }