run method
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;
}
}