Skip to content

Commit ebe9038

Browse files
committed
refactor: Make SendMediaUploadRequest a builder, allowing to create a media upload request with a more flexible API
1 parent 2e32c25 commit ebe9038

File tree

4 files changed

+60
-32
lines changed

4 files changed

+60
-32
lines changed

crates/matrix-sdk/src/client/futures.rs

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -156,17 +156,43 @@ where
156156
}
157157
}
158158

159-
/// `IntoFuture` used to send media upload requests. It wraps another
160-
/// [`SendRequest`], checking its size will be accepted by the homeserver before
161-
/// uploading.
159+
/// `IntoFuture` used to send media upload requests. It works as a builder which
160+
/// can create a [`SendRequest`] given several configuration options, checking
161+
/// its size will be accepted by the homeserver before uploading.
162162
#[allow(missing_debug_implementations)]
163163
pub struct SendMediaUploadRequest {
164-
send_request: SendRequest<media::create_content::v3::Request>,
164+
client: Client,
165+
request: media::create_content::v3::Request,
166+
request_config: Option<RequestConfig>,
167+
progress_observable: SharedObservable<TransmissionProgress>,
165168
}
166-
167169
impl SendMediaUploadRequest {
168-
pub fn new(request: SendRequest<media::create_content::v3::Request>) -> Self {
169-
Self { send_request: request }
170+
/// Creates a new instance.
171+
pub fn new(client: Client, file: Vec<u8>) -> Self {
172+
Self {
173+
client,
174+
request: media::create_content::v3::Request::new(file),
175+
request_config: Default::default(),
176+
progress_observable: SharedObservable::new(TransmissionProgress::default()),
177+
}
178+
}
179+
180+
/// Sets the content type of the media for the media upload request.
181+
pub fn with_content_type(mut self, content_type: impl Into<String>) -> Self {
182+
self.request.content_type = Some(content_type.into());
183+
self
184+
}
185+
186+
/// Sets the filename for the media upload request.
187+
pub fn with_filename(mut self, filename: impl Into<String>) -> Self {
188+
self.request.filename = Some(filename.into());
189+
self
190+
}
191+
192+
/// Applies the provided [`RequestConfig`] to the future [`SendRequest`].
193+
pub fn with_request_config(mut self, request_config: Option<RequestConfig>) -> Self {
194+
self.request_config = request_config;
195+
self
170196
}
171197

172198
/// Replace the default `SharedObservable` used for tracking upload
@@ -179,14 +205,24 @@ impl SendMediaUploadRequest {
179205
mut self,
180206
send_progress: SharedObservable<TransmissionProgress>,
181207
) -> Self {
182-
self.send_request = self.send_request.with_send_progress_observable(send_progress);
208+
self.progress_observable = send_progress;
183209
self
184210
}
185211

186212
/// Get a subscriber to observe the progress of sending the request
187213
/// body.
188214
pub fn subscribe_to_send_progress(&self) -> Subscriber<TransmissionProgress> {
189-
self.send_request.send_progress.subscribe()
215+
self.progress_observable.subscribe()
216+
}
217+
218+
/// Creates the [`SendRequest`] using the provided parameters.
219+
pub fn build_send_request(self) -> SendRequest<media::create_content::v3::Request> {
220+
SendRequest {
221+
client: self.client,
222+
request: self.request,
223+
config: self.request_config,
224+
send_progress: self.progress_observable,
225+
}
190226
}
191227
}
192228

@@ -195,9 +231,9 @@ impl IntoFuture for SendMediaUploadRequest {
195231
boxed_into_future!();
196232

197233
fn into_future(self) -> Self::IntoFuture {
198-
let request_length = self.send_request.request.file.len();
199-
let client = self.send_request.client.clone();
200-
let send_request = self.send_request;
234+
let send_request = self.build_send_request();
235+
let request_length = send_request.request.file.len();
236+
let client = send_request.client.clone();
201237

202238
Box::pin(async move {
203239
let max_upload_size = client.load_or_fetch_max_upload_size().await?;

crates/matrix-sdk/src/client/mod.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,7 +2909,6 @@ pub(crate) mod tests {
29092909

29102910
use assert_matches::assert_matches;
29112911
use assert_matches2::assert_let;
2912-
use eyeball::SharedObservable;
29132912
use futures_util::{pin_mut, FutureExt};
29142913
use js_int::{uint, UInt};
29152914
use matrix_sdk_base::{
@@ -2950,10 +2949,9 @@ pub(crate) mod tests {
29502949
use crate::{
29512950
client::{futures::SendMediaUploadRequest, WeakClient},
29522951
config::RequestConfig,
2953-
futures::SendRequest,
29542952
media::MediaError,
29552953
test_utils::{client::MockClientBuilder, mocks::MatrixMockServer},
2956-
Error, TransmissionProgress,
2954+
Error,
29572955
};
29582956

29592957
#[async_test]
@@ -3781,15 +3779,7 @@ pub(crate) mod tests {
37813779
assert_eq!(*client.inner.server_max_upload_size.lock().await.get().unwrap(), uint!(1));
37823780

37833781
let data = vec![1, 2];
3784-
let upload_request =
3785-
ruma::api::client::media::create_content::v3::Request::new(data.clone());
3786-
let request = SendRequest {
3787-
client: client.clone(),
3788-
request: upload_request,
3789-
config: None,
3790-
send_progress: SharedObservable::new(TransmissionProgress::default()),
3791-
};
3792-
let media_request = SendMediaUploadRequest::new(request);
3782+
let media_request = SendMediaUploadRequest::new(client, data.clone());
37933783

37943784
let error = media_request.await.err();
37953785
assert_let!(Some(Error::Media(MediaError::MediaTooLargeToUpload { max, current })) = error);

crates/matrix-sdk/src/media.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,15 @@ impl Media {
209209
self.client.request_config().timeout(Self::reasonable_upload_timeout(&data))
210210
});
211211

212-
let request = assign!(media::create_content::v3::Request::new(data), {
213-
filename,
214-
content_type: Some(content_type.essence_str().to_owned()),
215-
});
212+
let send_media_request = SendMediaUploadRequest::new(self.client.clone(), data)
213+
.with_content_type(content_type.essence_str().to_owned())
214+
.with_request_config(Some(request_config));
216215

217-
let request = self.client.send(request).with_request_config(request_config);
218-
SendMediaUploadRequest::new(request)
216+
if let Some(filename) = filename {
217+
send_media_request.with_filename(filename)
218+
} else {
219+
send_media_request
220+
}
219221
}
220222

221223
/// Returns a reasonable upload timeout for an upload, based on the size of

crates/matrix-sdk/src/send_queue/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ use as_variant::as_variant;
142142
use matrix_sdk_base::store::FinishGalleryItemInfo;
143143
use matrix_sdk_base::{
144144
event_cache::store::EventCacheStoreError,
145-
media::MediaRequestParameters,
145+
media::{MediaEventContent, MediaRequestParameters},
146146
store::{
147147
ChildTransactionId, DependentQueuedRequest, DependentQueuedRequestKind, DynStateStore,
148148
FinishUploadThumbnailInfo, QueueWedgeError, QueuedRequest, QueuedRequestKind,
@@ -169,7 +169,7 @@ use ruma::{
169169
};
170170
use tokio::sync::{broadcast, oneshot, Mutex, Notify, OwnedMutexGuard};
171171
use tracing::{debug, error, info, instrument, trace, warn};
172-
use matrix_sdk_base::media::MediaEventContent;
172+
173173
#[cfg(feature = "e2e-encryption")]
174174
use crate::crypto::{OlmError, SessionRecipientCollectionError};
175175
use crate::{

0 commit comments

Comments
 (0)