tuwunel_service/federation/
format.rs1use 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#[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}