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