use ruma::{CanonicalJsonObject, OwnedEventId, RoomVersionId}; use serde_json::value::RawValue as RawJsonValue; use crate::{Result, err, matrix::room_version}; /// Generates a correct eventId for the incoming pdu. /// /// Returns a tuple of the new `EventId` and the PDU as a `BTreeMap`. pub fn gen_event_id_canonical_json( pdu: &RawJsonValue, room_version_id: &RoomVersionId, ) -> Result<(OwnedEventId, CanonicalJsonObject)> { let value: CanonicalJsonObject = serde_json::from_str(pdu.get()) .map_err(|e| err!(BadServerResponse(warn!("Error parsing incoming event: {e:?}"))))?; let event_id = gen_event_id(&value, room_version_id)?; Ok((event_id, value)) } /// Generates a correct eventId for the incoming pdu. pub fn gen_event_id( value: &CanonicalJsonObject, room_version_id: &RoomVersionId, ) -> Result { let room_version_rules = room_version::rules(room_version_id)?; let reference_hash = ruma::signatures::reference_hash(value, &room_version_rules)?; OwnedEventId::from_parts('$', &reference_hash, None).map_err(Into::into) }