processQueue method

Future<int> processQueue()

Processes the sync queue — uploads all pending items with retry logic.

Returns the number of successfully synced items.

Implementation

Future<int> processQueue() async {
  if (_isSyncing) return 0;
  _isSyncing = true;

  int syncedCount = 0;

  // Check adapter availability
  final isAvailable = await adapter.isAvailable();
  if (!isAvailable) {
    _isSyncing = false;
    return 0;
  }

  final pendingItems = _queue
      .where((i) =>
          i.status == SyncStatus.pending || i.status == SyncStatus.failed)
      .toList();

  for (final item in pendingItems) {
    if (item.retryCount >= maxRetries) continue;

    item.status = SyncStatus.uploading;
    _emitEvent(item.id, SyncStatus.uploading, result: item.result);

    try {
      final success =
          await adapter.upload(item.result, metadata: item.metadata);
      if (success) {
        item.status = SyncStatus.synced;
        syncedCount++;
        _emitEvent(item.id, SyncStatus.synced, result: item.result);
      } else {
        item.status = SyncStatus.failed;
        item.retryCount++;
        _emitEvent(item.id, SyncStatus.failed,
            result: item.result, error: 'Upload returned false');
      }
    } catch (e) {
      item.status = SyncStatus.failed;
      item.retryCount++;
      _emitEvent(item.id, SyncStatus.failed,
          result: item.result, error: e.toString());
    }
  }

  _isSyncing = false;
  return syncedCount;
}