design doc to help me define the layers?
parent
2137d198fc
commit
7e6c90ecb9
|
@ -0,0 +1,97 @@
|
|||
# Matrix Rust SDK
|
||||
|
||||
## Design and Layout
|
||||
|
||||
#### Async Client
|
||||
The highest level structure that ties the other pieces of functionality together. The client is responsible for the Request/Response cycle. It knows how to
|
||||
- login
|
||||
- send messages
|
||||
- encryption ...
|
||||
- sync client state with the server
|
||||
- make raw Http requests
|
||||
|
||||
#### Base Client
|
||||
In addition to Http the `AsyncClient` passes along methods from the `BaseClient` that deal with `Room`s and `RoomMember`s. This allows the client to keep track of more complicated information that needs to be calculated in some way.
|
||||
- human readable room names
|
||||
- power level?
|
||||
- ignored list?
|
||||
- push rulesset?
|
||||
- more?
|
||||
|
||||
#### Crypto State Machine
|
||||
|
||||
|
||||
#### Client State/Room and RoomMember
|
||||
The `BaseClient` is responsible for keeping state in sync through the `IncomingResponse`s of `AsyncClient` or querying the `StateStore`. By processing and then delegating incoming `RoomEvent`s, `StateEvent`s, `PresenceEvent`, `IncomingAccountData` and `EphemeralEvent`s to the correct `Room` in the base clients `HashMap<RoomId, Room>` or further to `Room`'s `RoomMember` via the members `HashMap<UserId, RoomMember>`. The `BaseClient` is also responsible for emitting the incoming events to the `EventEmitter` trait.
|
||||
|
||||
```rust
|
||||
/// A Matrix room.
|
||||
pub struct Room {
|
||||
/// The unique id of the room.
|
||||
pub room_id: RoomId,
|
||||
/// The name of the room, clients use this to represent a room.
|
||||
pub room_name: RoomName,
|
||||
/// The mxid of our own user.
|
||||
pub own_user_id: UserId,
|
||||
/// The mxid of the room creator.
|
||||
pub creator: Option<UserId>,
|
||||
/// The map of room members.
|
||||
pub members: HashMap<UserId, RoomMember>,
|
||||
/// A list of users that are currently typing.
|
||||
pub typing_users: Vec<UserId>,
|
||||
/// The power level requirements for specific actions in this room
|
||||
pub power_levels: Option<PowerLevels>,
|
||||
// TODO when encryption events are handled we store algorithm used and rotation time.
|
||||
/// A flag indicating if the room is encrypted.
|
||||
pub encrypted: bool,
|
||||
/// Number of unread notifications with highlight flag set.
|
||||
pub unread_highlight: Option<UInt>,
|
||||
/// Number of unread notifications.
|
||||
pub unread_notifications: Option<UInt>,
|
||||
}
|
||||
```
|
||||
|
||||
```rust
|
||||
pub struct RoomMember {
|
||||
/// The unique mxid of the user.
|
||||
pub user_id: UserId,
|
||||
/// The human readable name of the user.
|
||||
pub display_name: Option<String>,
|
||||
/// The matrix url of the users avatar.
|
||||
pub avatar_url: Option<String>,
|
||||
/// The time, in ms, since the user interacted with the server.
|
||||
pub last_active_ago: Option<UInt>,
|
||||
/// If the user should be considered active.
|
||||
pub currently_active: Option<bool>,
|
||||
/// The unique id of the room.
|
||||
pub room_id: Option<String>,
|
||||
/// If the member is typing.
|
||||
pub typing: Option<bool>,
|
||||
/// The presence of the user, if found.
|
||||
pub presence: Option<PresenceState>,
|
||||
/// The presence status message, if found.
|
||||
pub status_msg: Option<String>,
|
||||
/// The users power level.
|
||||
pub power_level: Option<Int>,
|
||||
/// The normalized power level of this `RoomMember` (0-100).
|
||||
pub power_level_norm: Option<Int>,
|
||||
/// The `MembershipState` of this `RoomMember`.
|
||||
pub membership: MembershipState,
|
||||
/// The human readable name of this room member.
|
||||
pub name: String,
|
||||
/// The events that created the state of this room member.
|
||||
pub events: Vec<Event>,
|
||||
/// The `PresenceEvent`s connected to this user.
|
||||
pub presence_events: Vec<PresenceEvent>,
|
||||
}
|
||||
```
|
||||
|
||||
#### State Store
|
||||
The `BaseClient` also has access to a `dyn StateStore` this is an abstraction around a "database" to keep client state without requesting a full sync from the server on start up. A default implementation that serializes/deserializes json to files in a specified directory can be used. The user can also implement `StateStore` to fit any storage solution they choose.
|
||||
- load
|
||||
- store/save
|
||||
- update ??
|
||||
|
||||
#### Event Emitter
|
||||
The consumer of this crate can implement the `EventEmitter` trait for full control over how incoming events are handled by their client. If that isn't enough it is possible to receive every incoming response with the `AsyncClient::sync_forever` callback.
|
||||
- list the methods for `EventEmitter`?
|
Loading…
Reference in New Issue