run method

  1. @override
Future<void> run()
override

Run initial sync for all handlers.

Implementation

@override
Future<void> run() async {
  if (_isRunning) {
    throw SyncAlreadyRunningException('Initial sync already running');
  }
  final featuresToSync = _featureConfigs.keys.toList();
  final allCompleted = _hasEverCompleted ??=
      await metaRepo.areAllInitialSyncsCompleted(featuresToSync);
  if (allCompleted) {
    _hasEverCompleted = true;
    _setStatus(InitialSyncStatus.completed);
    return;
  }
  _isRunning = true;
  _isCancelled = false;
  _setStatus(InitialSyncStatus.running);

  try {
    for (final featureKey in featuresToSync) {
      if (_isCancelled) {
        _setStatus(InitialSyncStatus.cancelled);
        throw OperationCancelledException('Initial sync cancelled');
      }

      await _performSync(featureKey);
    }

    // Only emit FullInitialSyncCompletedEvent if this is the first time completing
    _hasEverCompleted = true;
    _setStatus(InitialSyncStatus.completed);
  } catch (e) {
    if (!_isCancelled) {
      // Failed event handled by _performSync for specific features
    }
    rethrow;
  } finally {
    _isRunning = false;
  }
}