@@ -13,6 +13,7 @@ use matrix_sdk_base::{
1313 locks:: Mutex ,
1414} ;
1515use ruma:: {
16+ api:: client:: message:: send_message_event:: v3:: Response as SendMessageEventResponse ,
1617 events:: {
1718 fully_read:: FullyReadEvent , relation:: Annotation , AnyMessageLikeEventContent ,
1819 AnySyncTimelineEvent ,
@@ -109,6 +110,7 @@ impl<P: ProfileProvider> TimelineInner<P> {
109110 . await ;
110111 }
111112
113+ /// Handle the creation of a new local event.
112114 pub ( super ) async fn handle_local_event (
113115 & self ,
114116 txn_id : OwnedTransactionId ,
@@ -134,29 +136,45 @@ impl<P: ProfileProvider> TimelineInner<P> {
134136 . handle_event ( kind) ;
135137 }
136138
137- /// Handle a back-paginated event.
138- ///
139- /// Returns the number of timeline updates that were made.
140- pub ( super ) async fn handle_back_paginated_event (
139+ /// Handle the response returned by the server when a local event has been
140+ /// sent.
141+ pub ( super ) fn handle_local_event_send_response (
141142 & self ,
142- event : TimelineEvent ,
143- ) -> HandleEventResult {
144- let mut metadata_lock = self . metadata . lock ( ) . await ;
145- handle_remote_event (
146- event. event . cast ( ) ,
147- event. encryption_info ,
148- TimelineItemPosition :: Start ,
149- & self . items ,
150- & mut metadata_lock,
151- & self . profile_provider ,
152- )
153- . await
143+ txn_id : & TransactionId ,
144+ response : crate :: error:: Result < SendMessageEventResponse > ,
145+ ) -> crate :: error:: Result < ( ) > {
146+ match response {
147+ Ok ( response) => {
148+ self . update_event_id_of_local_event ( txn_id, Some ( response. event_id ) ) ;
149+
150+ Ok ( ( ) )
151+ }
152+ Err ( error) => {
153+ self . update_event_id_of_local_event ( txn_id, None ) ;
154+
155+ Err ( error)
156+ }
157+ }
154158 }
155159
156- /// Update the transaction ID by an event ID.
157- pub ( super ) fn add_event_id ( & self , txn_id : & TransactionId , event_id : OwnedEventId ) {
160+ /// Update the event ID of a local event represented by a transaction ID.
161+ ///
162+ /// If the event ID is `None`, it means there is no event ID returned by the
163+ /// server, so the sending has failed. If the event ID is `Some(_)`, it
164+ /// means the sending has been successful.
165+ ///
166+ /// If no local event is found, a warning is raised.
167+ pub ( super ) fn update_event_id_of_local_event (
168+ & self ,
169+ txn_id : & TransactionId ,
170+ event_id : Option < OwnedEventId > ,
171+ ) {
158172 let mut lock = self . items . lock_mut ( ) ;
173+
174+ // Look for the local event by the transaction ID.
159175 if let Some ( ( idx, local_event_item) ) = find_event_by_txn_id ( & lock, txn_id) {
176+ // An event ID already exists, that's a broken state, let's emit an error but
177+ // also override to the given event ID.
160178 if let Some ( existing_event_id) = & local_event_item. event_id {
161179 error ! (
162180 ?existing_event_id, new_event_id = ?event_id, ?txn_id,
@@ -168,12 +186,35 @@ impl<P: ProfileProvider> TimelineInner<P> {
168186 idx,
169187 Arc :: new ( TimelineItem :: Event ( local_event_item. with_event_id ( event_id) . into ( ) ) ) ,
170188 ) ;
171- } else if find_event_by_id ( & lock, & event_id) . is_none ( ) {
172- // Event isn't found by transaction ID, and also not by event ID
173- // (which it would if the remote echo comes in before the send-event
174- // response)
175- warn ! ( ?txn_id, "Timeline item not found, can't add event ID" ) ;
176189 }
190+ // No local event has been found.
191+ else if let Some ( event_id) = event_id {
192+ if find_event_by_id ( & lock, & event_id) . is_none ( ) {
193+ // Event isn't found by transaction ID, and also not by event ID
194+ // (which it would if the remote echo comes in before the send-event
195+ // response)
196+ warn ! ( ?txn_id, "Timeline item not found, can't add event ID" ) ;
197+ }
198+ }
199+ }
200+
201+ /// Handle a back-paginated event.
202+ ///
203+ /// Returns the number of timeline updates that were made.
204+ pub ( super ) async fn handle_back_paginated_event (
205+ & self ,
206+ event : TimelineEvent ,
207+ ) -> HandleEventResult {
208+ let mut metadata_lock = self . metadata . lock ( ) . await ;
209+ handle_remote_event (
210+ event. event . cast ( ) ,
211+ event. encryption_info ,
212+ TimelineItemPosition :: Start ,
213+ & self . items ,
214+ & mut metadata_lock,
215+ & self . profile_provider ,
216+ )
217+ . await
177218 }
178219
179220 #[ instrument( skip_all) ]
0 commit comments