2024-12-28 23:31:24 +00:00
|
|
|
use ruma::{CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId};
|
2024-05-09 15:59:08 -07:00
|
|
|
use serde_json::value::RawValue as RawJsonValue;
|
2025-04-27 09:34:07 +00:00
|
|
|
use tuwunel_core::{
|
|
|
|
|
Result, err, implement, matrix::event::gen_event_id_canonical_json, result::FlatOk,
|
|
|
|
|
};
|
2024-05-09 15:59:08 -07:00
|
|
|
|
2025-01-26 10:43:53 +00:00
|
|
|
type Parsed = (OwnedRoomId, OwnedEventId, CanonicalJsonObject);
|
|
|
|
|
|
2024-11-08 07:30:52 +00:00
|
|
|
#[implement(super::Service)]
|
2025-01-26 10:43:53 +00:00
|
|
|
pub async fn parse_incoming_pdu(&self, pdu: &RawJsonValue) -> Result<Parsed> {
|
2024-12-15 00:05:47 -05:00
|
|
|
let value = serde_json::from_str::<CanonicalJsonObject>(pdu.get()).map_err(|e| {
|
|
|
|
|
err!(BadServerResponse(debug_warn!("Error parsing incoming event {e:?}")))
|
|
|
|
|
})?;
|
2024-05-09 15:59:08 -07:00
|
|
|
|
2024-11-08 07:30:52 +00:00
|
|
|
let room_id: OwnedRoomId = value
|
|
|
|
|
.get("room_id")
|
|
|
|
|
.and_then(CanonicalJsonValue::as_str)
|
2024-12-28 23:31:24 +00:00
|
|
|
.map(OwnedRoomId::parse)
|
2024-11-08 07:30:52 +00:00
|
|
|
.flat_ok_or(err!(Request(InvalidParam("Invalid room_id in pdu"))))?;
|
2024-05-09 15:59:08 -07:00
|
|
|
|
2024-11-08 07:30:52 +00:00
|
|
|
let room_version_id = self
|
|
|
|
|
.services
|
|
|
|
|
.state
|
|
|
|
|
.get_room_version(&room_id)
|
|
|
|
|
.await
|
|
|
|
|
.map_err(|_| err!("Server is not in room {room_id}"))?;
|
2024-05-09 15:59:08 -07:00
|
|
|
|
2024-12-15 00:05:47 -05:00
|
|
|
let (event_id, value) = gen_event_id_canonical_json(pdu, &room_version_id).map_err(|e| {
|
|
|
|
|
err!(Request(InvalidParam("Could not convert event to canonical json: {e}")))
|
|
|
|
|
})?;
|
2024-05-09 15:59:08 -07:00
|
|
|
|
2025-01-26 10:43:53 +00:00
|
|
|
Ok((room_id, event_id, value))
|
2024-05-09 15:59:08 -07:00
|
|
|
}
|