update sync

This commit is contained in:
mertalev
2025-09-20 10:41:45 -04:00
parent e1c6813ee0
commit b84216180c
3 changed files with 18 additions and 13 deletions
@@ -3,7 +3,6 @@ import 'dart:io';
import 'dart:ui'; import 'dart:ui';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:cancellation_token_http/http.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
@@ -63,7 +62,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
final Drift _drift; final Drift _drift;
final DriftLogger _driftLogger; final DriftLogger _driftLogger;
final BackgroundWorkerBgHostApi _backgroundHostApi; final BackgroundWorkerBgHostApi _backgroundHostApi;
final CancellationToken _cancellationToken = CancellationToken(); final Completer _cancellationToken = Completer();
final Logger _logger = Logger('BackgroundWorkerBgService'); final Logger _logger = Logger('BackgroundWorkerBgService');
bool _isCleanedUp = false; bool _isCleanedUp = false;
@@ -188,7 +187,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
_isCleanedUp = true; _isCleanedUp = true;
_ref.dispose(); _ref.dispose();
_cancellationToken.cancel(); _cancellationToken.complete();
_logger.info("Cleaning up background worker"); _logger.info("Cleaning up background worker");
final cleanupFutures = [ final cleanupFutures = [
workerManager.dispose().catchError((_) async { workerManager.dispose().catchError((_) async {
+14 -7
View File
@@ -1,12 +1,14 @@
import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:cancellation_token_http/http.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:http/http.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.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:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart'; import 'package:immich_mobile/utils/debug_print.dart';
@@ -20,6 +22,8 @@ class UploadTaskWithFile {
final uploadRepositoryProvider = Provider((ref) => UploadRepository()); final uploadRepositoryProvider = Provider((ref) => UploadRepository());
class UploadRepository { class UploadRepository {
static final _client = const NetworkRepository().getHttpClient('upload');
void Function(TaskStatusUpdate)? onUploadStatus; void Function(TaskStatusUpdate)? onUploadStatus;
void Function(TaskProgressUpdate)? onTaskProgress; void Function(TaskProgressUpdate)? onTaskProgress;
@@ -92,13 +96,12 @@ class UploadRepository {
); );
} }
Future<void> backupWithDartClient(Iterable<UploadTaskWithFile> tasks, CancellationToken cancelToken) async { Future<void> backupWithDartClient(Iterable<UploadTaskWithFile> tasks, Completer cancelToken) async {
final httpClient = Client();
final String savedEndpoint = Store.get(StoreKey.serverEndpoint); final String savedEndpoint = Store.get(StoreKey.serverEndpoint);
Logger logger = Logger('UploadRepository'); Logger logger = Logger('UploadRepository');
for (final candidate in tasks) { for (final candidate in tasks) {
if (cancelToken.isCancelled) { if (cancelToken.isCompleted) {
logger.warning("Backup was cancelled by the user"); logger.warning("Backup was cancelled by the user");
break; break;
} }
@@ -112,13 +115,17 @@ class UploadRepository {
filename: candidate.task.filename, 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.headers.addAll(candidate.task.headers);
baseRequest.fields.addAll(candidate.task.fields); baseRequest.fields.addAll(candidate.task.fields);
baseRequest.files.add(assetRawUploadData); 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()); final responseBody = jsonDecode(await response.stream.bytesToString());
@@ -131,7 +138,7 @@ class UploadRepository {
continue; continue;
} }
} on CancelledException { } on RequestAbortedException {
logger.warning("Backup was cancelled by the user"); logger.warning("Backup was cancelled by the user");
break; break;
} catch (error, stackTrace) { } catch (error, stackTrace) {
+2 -3
View File
@@ -3,7 +3,6 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:cancellation_token_http/http.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
@@ -158,7 +157,7 @@ class UploadService {
} }
} }
Future<void> startBackupWithHttpClient(String userId, bool hasWifi, CancellationToken token) async { Future<void> startBackupWithHttpClient(String userId, bool hasWifi, Completer token) async {
await _storageRepository.clearCache(); await _storageRepository.clearCache();
shouldAbortQueuingTasks = false; shouldAbortQueuingTasks = false;
@@ -170,7 +169,7 @@ class UploadService {
const batchSize = 100; const batchSize = 100;
for (int i = 0; i < candidates.length; i += batchSize) { for (int i = 0; i < candidates.length; i += batchSize) {
if (shouldAbortQueuingTasks || token.isCancelled) { if (shouldAbortQueuingTasks || token.isCompleted) {
break; break;
} }