Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
0c3161b
feat(send_queue): Implement sending of MSC4274 galleries
Johennes Apr 25, 2025
d749ebe
Merge branch 'main' into johannes/msc4274-step2
Johennes May 23, 2025
9a62767
Use an OwnedTransactionId to avoid cloning
Johennes May 23, 2025
58626d2
Add missing trailing periods in comments
Johennes May 23, 2025
932dbf9
Move client and cache store outside of loop
Johennes May 23, 2025
c6731ca
Prevent sending empty galleries
Johennes May 23, 2025
47fe934
Remove superfluous type annotations
Johennes May 23, 2025
49c9576
Pre-allocate capacity for item vectors
Johennes May 23, 2025
421f5bd
Extract macro for MessageType / GalleryItemType
Johennes May 23, 2025
b5f4828
Remove superfluous self
Johennes May 23, 2025
7149b73
Rename make_message_event to make_media_event
Johennes May 23, 2025
0e58e50
Bundle items with GalleryConfig
Johennes May 23, 2025
fc4aa7e
Avoid type annotation and pre-allocate vector
Johennes May 23, 2025
e47706e
Avoid unnecessary type annotation
Johennes May 23, 2025
4028bb4
Use let / else to reduce indentation
Johennes May 23, 2025
3acc0e8
Relocate and rephrase comment for FinishGalleryItemInfo
Johennes May 23, 2025
7e7a38c
Extract shared function to update cache keys
Johennes May 23, 2025
aaa392c
Extract method to push thumbnail & media requests
Johennes May 26, 2025
26601a4
Move pushing the dependent media request out of the if / else
Johennes May 26, 2025
b5b6723
Avoid unwrapping last_upload_file_txn
Johennes May 26, 2025
9a491b6
Extract method for caching
Johennes May 26, 2025
6b2b3f0
Merge branch 'main' into johannes/msc4274-step2
Johennes May 26, 2025
946e05a
Rename config parameter to gallery
Johennes May 27, 2025
662d6c7
Remove superfluous blank line
Johennes May 27, 2025
f235e56
Reduce indentation by returning early
Johennes May 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
231 changes: 107 additions & 124 deletions crates/matrix-sdk/src/send_queue/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ use matrix_sdk_base::{
event_cache::store::EventCacheStoreError,
media::MediaRequestParameters,
store::{
ChildTransactionId, DependentQueuedRequest, DependentQueuedRequestKind,
ChildTransactionId, DependentQueuedRequest, DependentQueuedRequestKind, DynStateStore,
FinishUploadThumbnailInfo, QueueWedgeError, QueuedRequest, QueuedRequestKind,
SentMediaInfo, SentRequestKey, SerializableEventContent,
},
Expand Down Expand Up @@ -1204,69 +1204,18 @@ impl QueueStorage {
let guard = self.store.lock().await;
let client = guard.client()?;
let store = client.state_store();
let thumbnail_info =
if let Some((thumbnail_info, thumbnail_media_request, thumbnail_content_type)) =
thumbnail
{
let upload_thumbnail_txn = thumbnail_info.txn.clone();

// Save the thumbnail upload request.
store
.save_send_queue_request(
&self.room_id,
upload_thumbnail_txn.clone(),
created_at,
QueuedRequestKind::MediaUpload {
content_type: thumbnail_content_type.to_string(),
cache_key: thumbnail_media_request,
thumbnail_source: None, // the thumbnail has no thumbnails :)
related_to: send_event_txn.clone(),
#[cfg(feature = "unstable-msc4274")]
accumulated: vec![],
},
Self::LOW_PRIORITY,
)
.await?;

// Save the file upload request as a dependent request of the thumbnail upload.
store
.save_dependent_queued_request(
&self.room_id,
&upload_thumbnail_txn,
upload_file_txn.clone().into(),
created_at,
DependentQueuedRequestKind::UploadFileOrThumbnail {
content_type: content_type.to_string(),
cache_key: file_media_request,
related_to: send_event_txn.clone(),
#[cfg(feature = "unstable-msc4274")]
parent_is_thumbnail_upload: true,
},
)
.await?;

Some(thumbnail_info)
} else {
// Save the file upload as its own request, not a dependent one.
store
.save_send_queue_request(
&self.room_id,
upload_file_txn.clone(),
created_at,
QueuedRequestKind::MediaUpload {
content_type: content_type.to_string(),
cache_key: file_media_request,
thumbnail_source: None,
related_to: send_event_txn.clone(),
#[cfg(feature = "unstable-msc4274")]
accumulated: vec![],
},
Self::LOW_PRIORITY,
)
.await?;

None
};
let thumbnail_info = self
.push_thumbnail_and_media_uploads(
store,
&content_type,
send_event_txn.clone(),
created_at,
upload_file_txn.clone(),
file_media_request,
thumbnail,
)
.await?;

// Push the dependent request for the event itself.
store
Expand Down Expand Up @@ -1314,70 +1263,21 @@ impl QueueStorage {
thumbnail,
} = first;

let thumbnail_info =
if let Some((thumbnail_info, thumbnail_media_request, thumbnail_content_type)) =
thumbnail
{
let upload_thumbnail_txn = thumbnail_info.txn.clone();

// Save the thumbnail upload request.
store
.save_send_queue_request(
&self.room_id,
upload_thumbnail_txn.clone(),
created_at,
QueuedRequestKind::MediaUpload {
content_type: thumbnail_content_type.to_string(),
cache_key: thumbnail_media_request.clone(),
thumbnail_source: None, // the thumbnail has no thumbnails :)
related_to: send_event_txn.clone(),
accumulated: vec![],
},
Self::LOW_PRIORITY,
)
.await?;

// Save the file upload request as a dependent request of the thumbnail upload.
store
.save_dependent_queued_request(
&self.room_id,
&upload_thumbnail_txn,
upload_file_txn.clone().into(),
created_at,
DependentQueuedRequestKind::UploadFileOrThumbnail {
content_type: content_type.to_string(),
cache_key: file_media_request.clone(),
related_to: send_event_txn.clone(),
parent_is_thumbnail_upload: true,
},
)
.await?;

Some(thumbnail_info)
} else {
// Save the file upload as its own request, not a dependent one.
store
.save_send_queue_request(
&self.room_id,
upload_file_txn.clone(),
created_at,
QueuedRequestKind::MediaUpload {
content_type: content_type.to_string(),
cache_key: file_media_request.clone(),
thumbnail_source: None,
related_to: send_event_txn.clone(),
accumulated: vec![],
},
Self::LOW_PRIORITY,
)
.await?;

None
};
let thumbnail_info = self
.push_thumbnail_and_media_uploads(
store,
content_type,
send_event_txn.clone(),
created_at,
upload_file_txn.clone(),
file_media_request.clone(),
thumbnail.clone(),
)
.await?;

finish_item_infos.push(FinishGalleryItemInfo {
file_upload: upload_file_txn.clone(),
thumbnail_info: thumbnail_info.cloned(),
thumbnail_info,
});

last_upload_file_txn = Some(upload_file_txn.clone());
Expand Down Expand Up @@ -1479,6 +1379,89 @@ impl QueueStorage {
Ok(())
}

/// If a thumbnail exists, pushes a [`QueuedRequestKind::MediaUpload`] to
/// upload it
/// and a [`DependentQueuedRequestKind::UploadFileOrThumbnail`] to upload
/// the media itself. Otherwise, pushes a
/// [`QueuedRequestKind::MediaUpload`] to upload the media directly.
#[allow(clippy::too_many_arguments)]
async fn push_thumbnail_and_media_uploads(
&self,
store: &DynStateStore,
content_type: &Mime,
send_event_txn: OwnedTransactionId,
created_at: MilliSecondsSinceUnixEpoch,
upload_file_txn: OwnedTransactionId,
file_media_request: MediaRequestParameters,
thumbnail: Option<(FinishUploadThumbnailInfo, MediaRequestParameters, Mime)>,
) -> Result<Option<FinishUploadThumbnailInfo>, RoomSendQueueStorageError> {
let thumbnail_info =
if let Some((thumbnail_info, thumbnail_media_request, thumbnail_content_type)) =
thumbnail
{
let upload_thumbnail_txn = thumbnail_info.txn.clone();

// Save the thumbnail upload request.
store
.save_send_queue_request(
&self.room_id,
upload_thumbnail_txn.clone(),
created_at,
QueuedRequestKind::MediaUpload {
content_type: thumbnail_content_type.to_string(),
cache_key: thumbnail_media_request,
thumbnail_source: None, // the thumbnail has no thumbnails :)
related_to: send_event_txn.clone(),
#[cfg(feature = "unstable-msc4274")]
accumulated: vec![],
},
Self::LOW_PRIORITY,
)
.await?;

// Save the file upload request as a dependent request of the thumbnail upload.
store
.save_dependent_queued_request(
&self.room_id,
&upload_thumbnail_txn,
upload_file_txn.into(),
created_at,
DependentQueuedRequestKind::UploadFileOrThumbnail {
content_type: content_type.to_string(),
cache_key: file_media_request,
related_to: send_event_txn,
#[cfg(feature = "unstable-msc4274")]
parent_is_thumbnail_upload: true,
},
)
.await?;

Some(thumbnail_info)
} else {
// Save the file upload as its own request, not a dependent one.
store
.save_send_queue_request(
&self.room_id,
upload_file_txn,
created_at,
QueuedRequestKind::MediaUpload {
content_type: content_type.to_string(),
cache_key: file_media_request,
thumbnail_source: None,
related_to: send_event_txn,
#[cfg(feature = "unstable-msc4274")]
accumulated: vec![],
},
Self::LOW_PRIORITY,
)
.await?;

None
};

Ok(thumbnail_info)
Comment thread
Johennes marked this conversation as resolved.
Outdated
}

/// Reacts to the given local echo of an event.
#[instrument(skip(self))]
async fn react(
Expand Down