Skip to main content

tuwunel_service/federation/
format.rs

1use futures::future::OptionFuture;
2use ruma::{CanonicalJsonObject, CanonicalJsonValue, RoomId, RoomVersionId};
3use serde_json::value::{RawValue as RawJsonValue, to_raw_value};
4use tuwunel_core::{implement, matrix::pdu, utils::result::FlatOk};
5
6/// This does not return a full `Pdu` it is only to satisfy ruma's types.
7#[implement(super::Service)]
8pub async fn format_pdu_into(
9	&self,
10	mut pdu_json: CanonicalJsonObject,
11	room_version: Option<&RoomVersionId>,
12) -> Box<RawJsonValue> {
13	let room_id = pdu_json
14		.get("room_id")
15		.and_then(CanonicalJsonValue::as_str)
16		.map(RoomId::parse)
17		.flat_ok();
18
19	let query_room_version: OptionFuture<_> = room_id
20		.filter(|_| room_version.is_none())
21		.map(|room_id| async move {
22			self.services
23				.state
24				.get_room_version(&room_id)
25				.await
26				.ok()
27		})
28		.into();
29
30	if let Some(room_version) = query_room_version
31		.await
32		.flatten()
33		.as_ref()
34		.or(room_version)
35	{
36		pdu_json = pdu::into_outgoing_federation(pdu_json, room_version);
37	} else {
38		pdu_json.remove("event_id");
39	}
40
41	to_raw_value(&pdu_json).expect("CanonicalJson is valid serde_json::Value")
42}