Skip to content

Commit

Permalink
refactor(sdk): Move timeline event handling fns to TimelineInner
Browse files Browse the repository at this point in the history
  • Loading branch information
jplatte authored Oct 25, 2022
1 parent 2547d6e commit 2232092
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 75 deletions.
142 changes: 72 additions & 70 deletions crates/matrix-sdk/src/room/timeline/event_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,79 +40,81 @@ use super::{
TimelineKey,
};

pub(super) fn handle_live_event(
raw: Raw<AnySyncTimelineEvent>,
encryption_info: Option<EncryptionInfo>,
own_user_id: &UserId,
timeline: &TimelineInner,
) {
handle_remote_event(raw, encryption_info, own_user_id, TimelineItemPosition::End, timeline)
}
impl TimelineInner {
pub(super) fn handle_live_event(
&self,
raw: Raw<AnySyncTimelineEvent>,
encryption_info: Option<EncryptionInfo>,
own_user_id: &UserId,
) {
self.handle_remote_event(raw, encryption_info, own_user_id, TimelineItemPosition::End)
}

pub(super) fn handle_local_event(
txn_id: OwnedTransactionId,
content: AnyMessageLikeEventContent,
own_user_id: &UserId,
timeline: &TimelineInner,
) {
let meta = TimelineEventMetadata {
sender: own_user_id.to_owned(),
origin_server_ts: None,
raw_event: None,
is_own_event: true,
relations: None,
// FIXME: Should we supply something here for encrypted rooms?
encryption_info: None,
};

let flow = Flow::Local { txn_id };
let kind = TimelineEventKind::Message { content };

TimelineEventHandler::new(meta, flow, timeline).handle_event(kind)
}
pub(super) fn handle_local_event(
&self,
txn_id: OwnedTransactionId,
content: AnyMessageLikeEventContent,
own_user_id: &UserId,
) {
let meta = TimelineEventMetadata {
sender: own_user_id.to_owned(),
origin_server_ts: None,
raw_event: None,
is_own_event: true,
relations: None,
// FIXME: Should we supply something here for encrypted rooms?
encryption_info: None,
};

pub(super) fn handle_back_paginated_event(
raw: Raw<AnySyncTimelineEvent>,
encryption_info: Option<EncryptionInfo>,
own_user_id: &UserId,
timeline: &TimelineInner,
) {
handle_remote_event(raw, encryption_info, own_user_id, TimelineItemPosition::Start, timeline)
}
let flow = Flow::Local { txn_id };
let kind = TimelineEventKind::Message { content };

fn handle_remote_event(
raw: Raw<AnySyncTimelineEvent>,
encryption_info: Option<EncryptionInfo>,
own_user_id: &UserId,
position: TimelineItemPosition,
timeline: &TimelineInner,
) {
let event = match raw.deserialize() {
Ok(ev) => ev,
Err(_e) => {
// TODO: Add some sort of error timeline item
return;
}
};

let sender = event.sender().to_owned();
let is_own_event = sender == own_user_id;

let meta = TimelineEventMetadata {
raw_event: Some(raw),
sender,
origin_server_ts: Some(event.origin_server_ts()),
is_own_event,
relations: event.relations().cloned(),
encryption_info,
};
let flow = Flow::Remote {
event_id: event.event_id().to_owned(),
txn_id: event.transaction_id().map(ToOwned::to_owned),
position,
};

TimelineEventHandler::new(meta, flow, timeline).handle_event(event.into())
TimelineEventHandler::new(meta, flow, self).handle_event(kind)
}

pub(super) fn handle_back_paginated_event(
&self,
raw: Raw<AnySyncTimelineEvent>,
encryption_info: Option<EncryptionInfo>,
own_user_id: &UserId,
) {
self.handle_remote_event(raw, encryption_info, own_user_id, TimelineItemPosition::Start)
}

fn handle_remote_event(
&self,
raw: Raw<AnySyncTimelineEvent>,
encryption_info: Option<EncryptionInfo>,
own_user_id: &UserId,
position: TimelineItemPosition,
) {
let event = match raw.deserialize() {
Ok(ev) => ev,
Err(_e) => {
// TODO: Add some sort of error timeline item
return;
}
};

let sender = event.sender().to_owned();
let is_own_event = sender == own_user_id;

let meta = TimelineEventMetadata {
raw_event: Some(raw),
sender,
origin_server_ts: Some(event.origin_server_ts()),
is_own_event,
relations: event.relations().cloned(),
encryption_info,
};
let flow = Flow::Remote {
event_id: event.event_id().to_owned(),
txn_id: event.transaction_id().map(ToOwned::to_owned),
position,
};

TimelineEventHandler::new(meta, flow, self).handle_event(event.into())
}
}

enum Flow {
Expand Down
8 changes: 3 additions & 5 deletions crates/matrix-sdk/src/room/timeline/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ mod event_handler;
mod event_item;
mod virtual_item;

use self::event_handler::{handle_back_paginated_event, handle_live_event, handle_local_event};
pub use self::{
event_item::{
EventTimelineItem, Message, PaginationOutcome, ReactionDetails, TimelineDetails,
Expand Down Expand Up @@ -81,7 +80,7 @@ impl Timeline {
move |event, encryption_info: Option<EncryptionInfo>, room: Room| {
let inner = inner.clone();
async move {
handle_live_event(event, encryption_info, room.own_user_id(), &inner);
inner.handle_live_event(event, encryption_info, room.own_user_id());
}
}
});
Expand Down Expand Up @@ -113,11 +112,10 @@ impl Timeline {

let own_user_id = self.room.own_user_id();
for room_ev in messages.chunk {
handle_back_paginated_event(
self.inner.handle_back_paginated_event(
room_ev.event.cast(),
room_ev.encryption_info,
own_user_id,
&self.inner,
);
}

Expand Down Expand Up @@ -175,7 +173,7 @@ impl Timeline {
txn_id: Option<&TransactionId>,
) -> Result<()> {
let txn_id = txn_id.map_or_else(TransactionId::new, ToOwned::to_owned);
handle_local_event(txn_id.clone(), content.clone(), self.room.own_user_id(), &self.inner);
self.inner.handle_local_event(txn_id.clone(), content.clone(), self.room.own_user_id());

// If this room isn't actually in joined state, we'll get a server error.
// Not ideal, but works for now.
Expand Down

0 comments on commit 2232092

Please sign in to comment.