From b84216180c27968af3b97fbc18a3e3028471dffa Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Sat, 20 Sep 2025 10:41:45 -0400 Subject: [PATCH] update sync --- .../services/background_worker.service.dart | 5 ++--- .../lib/repositories/upload.repository.dart | 21 ++++++++++++------- mobile/lib/services/upload.service.dart | 5 ++--- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/mobile/lib/domain/services/background_worker.service.dart b/mobile/lib/domain/services/background_worker.service.dart index 78dd1e980f..6be4d79855 100644 --- a/mobile/lib/domain/services/background_worker.service.dart +++ b/mobile/lib/domain/services/background_worker.service.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'dart:ui'; import 'package:background_downloader/background_downloader.dart'; -import 'package:cancellation_token_http/http.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/constants.dart'; @@ -63,7 +62,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { final Drift _drift; final DriftLogger _driftLogger; final BackgroundWorkerBgHostApi _backgroundHostApi; - final CancellationToken _cancellationToken = CancellationToken(); + final Completer _cancellationToken = Completer(); final Logger _logger = Logger('BackgroundWorkerBgService'); bool _isCleanedUp = false; @@ -188,7 +187,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { _isCleanedUp = true; _ref.dispose(); - _cancellationToken.cancel(); + _cancellationToken.complete(); _logger.info("Cleaning up background worker"); final cleanupFutures = [ workerManager.dispose().catchError((_) async { diff --git a/mobile/lib/repositories/upload.repository.dart b/mobile/lib/repositories/upload.repository.dart index 38f2c22cf2..b079e81dee 100644 --- a/mobile/lib/repositories/upload.repository.dart +++ b/mobile/lib/repositories/upload.repository.dart @@ -1,12 +1,14 @@ +import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:background_downloader/background_downloader.dart'; -import 'package:cancellation_token_http/http.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:http/http.dart'; import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/store.entity.dart'; +import 'package:immich_mobile/infrastructure/repositories/network.repository.dart'; import 'package:logging/logging.dart'; import 'package:immich_mobile/utils/debug_print.dart'; @@ -20,6 +22,8 @@ class UploadTaskWithFile { final uploadRepositoryProvider = Provider((ref) => UploadRepository()); class UploadRepository { + static final _client = const NetworkRepository().getHttpClient('upload'); + void Function(TaskStatusUpdate)? onUploadStatus; void Function(TaskProgressUpdate)? onTaskProgress; @@ -92,13 +96,12 @@ class UploadRepository { ); } - Future backupWithDartClient(Iterable tasks, CancellationToken cancelToken) async { - final httpClient = Client(); + Future backupWithDartClient(Iterable tasks, Completer cancelToken) async { final String savedEndpoint = Store.get(StoreKey.serverEndpoint); Logger logger = Logger('UploadRepository'); for (final candidate in tasks) { - if (cancelToken.isCancelled) { + if (cancelToken.isCompleted) { logger.warning("Backup was cancelled by the user"); break; } @@ -112,13 +115,17 @@ class UploadRepository { filename: candidate.task.filename, ); - final baseRequest = MultipartRequest('POST', Uri.parse('$savedEndpoint/assets')); + final baseRequest = AbortableMultipartRequest( + 'POST', + Uri.parse('$savedEndpoint/assets'), + abortTrigger: cancelToken.future, + )..headers['Accept'] = 'application/json'; baseRequest.headers.addAll(candidate.task.headers); baseRequest.fields.addAll(candidate.task.fields); baseRequest.files.add(assetRawUploadData); - final response = await httpClient.send(baseRequest, cancellationToken: cancelToken); + final response = await _client.send(baseRequest); final responseBody = jsonDecode(await response.stream.bytesToString()); @@ -131,7 +138,7 @@ class UploadRepository { continue; } - } on CancelledException { + } on RequestAbortedException { logger.warning("Backup was cancelled by the user"); break; } catch (error, stackTrace) { diff --git a/mobile/lib/services/upload.service.dart b/mobile/lib/services/upload.service.dart index 9e9c81076b..5c7674df79 100644 --- a/mobile/lib/services/upload.service.dart +++ b/mobile/lib/services/upload.service.dart @@ -3,7 +3,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:background_downloader/background_downloader.dart'; -import 'package:cancellation_token_http/http.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; @@ -158,7 +157,7 @@ class UploadService { } } - Future startBackupWithHttpClient(String userId, bool hasWifi, CancellationToken token) async { + Future startBackupWithHttpClient(String userId, bool hasWifi, Completer token) async { await _storageRepository.clearCache(); shouldAbortQueuingTasks = false; @@ -170,7 +169,7 @@ class UploadService { const batchSize = 100; for (int i = 0; i < candidates.length; i += batchSize) { - if (shouldAbortQueuingTasks || token.isCancelled) { + if (shouldAbortQueuingTasks || token.isCompleted) { break; }