#matrix #chat #ruma

ruma-state-res

An abstraction for Matrix state resolution

11 releases (breaking)

0.9.1 Feb 15, 2023
0.8.0 Sep 12, 2022
0.7.0 Apr 28, 2022
0.6.0 Feb 19, 2022
0.2.0 Jun 21, 2021

#6 in #matrix-org

Download history 90/week @ 2023-06-09 296/week @ 2023-06-16 256/week @ 2023-06-23 385/week @ 2023-06-30 338/week @ 2023-07-07 178/week @ 2023-07-14 245/week @ 2023-07-21 174/week @ 2023-07-28 196/week @ 2023-08-04 235/week @ 2023-08-11 223/week @ 2023-08-18 147/week @ 2023-08-25 184/week @ 2023-09-01 196/week @ 2023-09-08 333/week @ 2023-09-15 228/week @ 2023-09-22

966 downloads per month
Used in 12 crates (via ruma)

MIT license

1MB
22K SLoC

Matrix State Resolution in Rust!

/// Abstraction of a PDU so users can have their own PDU types.
pub trait Event {
    /// The `EventId` of this event.
    fn event_id(&self) -> &EventId;
    /// The `RoomId` of this event.
    fn room_id(&self) -> &RoomId;
    /// The `UserId` of this event.
    fn sender(&self) -> &UserId;
    // and so on...
}

/// A mapping of event type and state_key to some value `T`, usually an `EventId`.
pub type StateMap<T> = BTreeMap<(StateEventType, Option<String>), T>;

/// A mapping of `EventId` to `T`, usually a `OriginalStateEvent`.
pub type EventMap<T> = BTreeMap<OwnedEventId, T>;

struct StateResolution {
    // For now the StateResolution struct is empty. If "caching" `event_map`
    // between `resolve` calls ends up being more efficient (probably not, as this would eat memory)
    // it may have an `event_map` field. The `event_map` is all the events
    // `StateResolution` has to know about to resolve state.
}

impl StateResolution {
    /// The point of this all, resolve the possibly conflicting sets of events.
    pub fn resolve<E: Event>(
        room_id: &RoomId,
        room_version: &RoomVersionId,
        state_sets: &[StateMap<OwnedEventId>],
        auth_events: Vec<Vec<OwnedEventId>>,
        event_map: &mut EventMap<Arc<E>>,
    ) -> Result<StateMap<OwnedEventId>> {;
}

The StateStore trait is an abstraction around what ever database your server (or maybe even client) uses to store Persistent Data Units.

We use rumas types when deserializing any PDU or it's contents which helps avoid a lot of type checking logic synapse must do while authenticating event chains.

Dependencies

~8–13MB
~264K SLoC