@@ -150,78 +150,104 @@ extension Messages on BaseChannel {
150150 pending.sender = Sender .fromUser (_sdk.state.currentUser, this );
151151
152152 final queue = _sdk.getMsgQueue (channelUrl);
153- queue.enqueue (AsyncSimpleTask (() async {
154- if (params.uploadFile.hasBinary) {
155- upload = await _sdk.api
156- .uploadFile (
157- channelUrl: channelUrl,
158- requestId: pending.requestId,
159- params: params,
160- progress: progress)
161- .timeout (
162- Duration (seconds: _sdk.options.fileTransferTimeout),
163- onTimeout: () {
164- logger.e ('upload timeout' );
165- if (onCompleted != null ) {
166- onCompleted (
167- pending..sendingStatus = MessageSendingStatus .failed,
168- SBError (
169- message: 'upload timeout' ,
170- code: ErrorCode .fileUploadTimeout,
171- ),
172- );
153+ final task = AsyncSimpleTask (
154+ () async {
155+ if (params.uploadFile.hasBinary) {
156+ try {
157+ upload = await _sdk.api
158+ .uploadFile (
159+ channelUrl: channelUrl,
160+ requestId: pending.requestId,
161+ params: params,
162+ progress: progress)
163+ .timeout (
164+ Duration (seconds: _sdk.options.fileTransferTimeout),
165+ onTimeout: () {
166+ logger.e ('upload timeout' );
167+ if (onCompleted != null ) {
168+ onCompleted (
169+ pending..sendingStatus = MessageSendingStatus .failed,
170+ SBError (
171+ message: 'upload timeout' ,
172+ code: ErrorCode .fileUploadTimeout,
173+ ),
174+ );
175+ }
176+ return ;
177+ },
178+ );
179+ if (upload == null ) {
180+ throw SBError (code: ErrorCode .fileUploadTimeout);
173181 }
174- return ;
175- },
182+ fileSize = upload.fileSize;
183+ url = upload.url;
184+ } catch (e) {
185+ rethrow ;
186+ }
187+ }
188+
189+ if (fileSize != null ) params.uploadFile.fileSize = fileSize;
190+ if (url != null ) params.uploadFile.url = url;
191+
192+ final cmd = Command .buildFileMessage (
193+ channelUrl: channelUrl,
194+ params: params,
195+ requestId: pending.requestId,
196+ requireAuth: upload? .requireAuth,
197+ thumbnails: upload? .thumbnails,
176198 );
177- if (upload == null ) throw SBError (code: ErrorCode .fileUploadTimeout);
178199
179- fileSize = upload.fileSize;
180- url = upload.url;
181- }
182-
183- if (fileSize != null ) params.uploadFile.fileSize = fileSize;
184- if (url != null ) params.uploadFile.url = url;
185-
186- final cmd = Command .buildFileMessage (
187- channelUrl: channelUrl,
188- params: params,
189- requestId: pending.requestId,
190- requireAuth: upload? .requireAuth,
191- thumbnails: upload? .thumbnails,
192- );
193-
194- final msgFromPayload = BaseMessage .msgFromJson <FileMessage >(
195- cmd.payload,
196- channelType: channelType,
197- );
200+ final msgFromPayload = BaseMessage .msgFromJson <FileMessage >(
201+ cmd.payload,
202+ channelType: channelType,
203+ );
198204
199- if (! _sdk.state.hasActiveUser) {
200- final error = ConnectionRequiredError ();
201- msgFromPayload
202- ..errorCode = error.code
203- ..sendingStatus = MessageSendingStatus .failed;
204- if (onCompleted != null ) onCompleted (msgFromPayload, error);
205- return msgFromPayload;
206- }
207-
208- _sdk.cmdManager.sendCommand (cmd).then ((cmdResult) {
209- final msg = BaseMessage .msgFromJson <FileMessage >(cmdResult.payload);
210- if (onCompleted != null ) onCompleted (msg, null );
211- }).catchError ((e) {
212- // pending.errorCode = e?.code ?? ErrorCode.unknownError;
213- pending
214- ..errorCode = e.code
215- ..sendingStatus = MessageSendingStatus .failed;
216- if (onCompleted != null ) onCompleted (pending, e);
217- });
218- }));
205+ if (! _sdk.state.hasActiveUser) {
206+ final error = ConnectionRequiredError ();
207+ msgFromPayload
208+ ..errorCode = error.code
209+ ..sendingStatus = MessageSendingStatus .failed;
210+ if (onCompleted != null ) onCompleted (msgFromPayload, error);
211+ return msgFromPayload;
212+ }
213+
214+ _sdk.cmdManager.sendCommand (cmd).then ((cmdResult) {
215+ final msg = BaseMessage .msgFromJson <FileMessage >(cmdResult.payload);
216+ if (onCompleted != null ) onCompleted (msg, null );
217+ }).catchError ((e) {
218+ // pending.errorCode = e?.code ?? ErrorCode.unknownError;
219+ pending
220+ ..errorCode = e.code
221+ ..sendingStatus = MessageSendingStatus .failed;
222+ if (onCompleted != null ) onCompleted (pending, e);
223+ });
224+ },
225+ onCancel: () {
226+ if (onCompleted != null ) onCompleted (pending, OperationCancelError ());
227+ },
228+ );
219229
230+ queue.enqueue (task);
231+ _sdk.setUploadTask (pending.requestId, task);
220232 _sdk.setMsgQueue (channelUrl, queue);
221233
222234 return pending;
223235 }
224236
237+ bool cancelUploadingFileMessage (String requestId) {
238+ if (requestId == null || requestId == '' ) {
239+ throw InvalidParameterError ();
240+ }
241+ final task = _sdk.getUploadTask (requestId);
242+ if (task == null ) {
243+ throw NotFoundError ();
244+ }
245+
246+ final queue = _sdk.getMsgQueue (channelUrl);
247+ _sdk.api.cancelUploadingFile (requestId);
248+ return queue.cancel (task.hashCode);
249+ }
250+
225251 /// Resends failed [FileMessage] on this channel with [message] .
226252 ///
227253 /// It returns [FileMessage] with [MessageSendingStatus.pending] and
0 commit comments