mirror of
https://github.com/matrix-org/matrix-rust-sdk.git
synced 2026-05-08 16:04:13 -04:00
This patch is trying to resolve the following issue: When a local event is sent to the server, in case of an error, the `Timeline::send` method just returned the error but it wasn't reflected inside the `LocalEventTimelineItem` type itself. It's easy to loss this information. So now, there is a new enum: `LocalEventTimelineItemSendState` with 3 states: 1. `NotSentYet`, when the local event has not been sent yet, it's theorically the initial state, 2. `SendingFailed`, when the local event has been sent but it's failed! 3. `Sent`, when the local event has been sent successfully. Therefore, the `LocalEventTimelineItem` struct has a new field: `send_state`. The send state is managed by its `with_event_id` method which now receives an `Option<OwnedEventId>` (prev. `OwnedEventId` directly): * If it's `Some(_)`, then it means we got a successful response from the server after the sending, so the send state is set to `Sent`, * If it's `None`, then it means we got an error response from the server, so the send state is set to `SentFailed`. (A small change: The method `TimelineInner::add_event_id` has been renamed `TimelineInner::update_event_id_of_local_event`.) The `Timeline::send` still returns a `Result`, but the server's response is passed to a new method: `TimelinerInner::handle_local_event_send_response` (it's logically named after the `handle_local_event` method), which is responsible to call `TimelineInner:update_event_id_of_local_event` (which was previously called directly by `Timeline::send`). And `TimelineInner::update_event_id_of_local_event` was already calling `LocalEventTimelineItem::with_event_id`. So everything works like a charm here. The local send state is closely managed by `LocalEventTimelineItem`, I hope it will avoid state breakage as much as possible.