mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-11-14 12:46:49 +00:00
35 lines
1.1 KiB
Rust
35 lines
1.1 KiB
Rust
use ruma::{CanonicalJsonObject, OwnedEventId, RoomVersionId};
|
|
use serde_json::value::RawValue as RawJsonValue;
|
|
|
|
use crate::{Err, Result, err};
|
|
|
|
/// Generates a correct eventId for the incoming pdu.
|
|
///
|
|
/// Returns a tuple of the new `EventId` and the PDU as a `BTreeMap<String,
|
|
/// CanonicalJsonValue>`.
|
|
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<OwnedEventId> {
|
|
let Some(rules) = room_version_id.rules() else {
|
|
return Err!("Cannot generate event ID for unknown room version {room_version_id}");
|
|
};
|
|
let reference_hash = ruma::signatures::reference_hash(value, &rules)?;
|
|
let event_id: OwnedEventId = format!("${reference_hash}").try_into()?;
|
|
|
|
Ok(event_id)
|
|
}
|