offline_upload_queue 0.6.0
offline_upload_queue: ^0.6.0 copied to clipboard
Offline-first image upload queue for Flutter — persistent, retry-capable, background-aware.
0.6.0 #
Breaking Changes #
- API Değişikliği:
PersistenceRepository.enqueueimzasındansequenceNumberparametresi kaldırıldı. Sequence numarası artık repository tarafından (transaction içerisinde güvenli şekilde) otomatik üretiliyor. ÖzelPersistenceRepositoryimplementasyonlarınınenqueueimzalarını güncellemeleri gerekir. PersistenceRepository.init()artık crash recovery yapmaz;recoverStuckUploads()worker kilidi alındıktan sonra çağrılmalıdır (çift yükleme yarışını önlemek için).QueueControllerbunu otomatik yönetir.retry()/purge()yalnızcapermanentlyFailed/cancelledgörevleri kabul eder; aksi haldeStateError.- Özel
PersistenceRepositoryimplementasyonları için yeni üyeler:getTask,hasProgressListener,getNextPending(..., onlyTaskIds:).
Bug Fixes #
dispose()sonrasıinit()artık çalışır (late finalkaldırıldı).BackgroundTaskRunnerpaylaşılan (iOS) kuyruğu dispose etmez;abortActiveUploads()eklendi.watchProgressdinleyici varken gerçektenonProgressbağlanır.cancel()/dispose()sonrası adapterfailuredönüşü görevifailedile ezmez.updateHeartbeatyalnızca kilit sahibi için yazar.forceUploadOnceöncelik açlığı giderildi;pause()/resume()watchSummaryabonelerini günceller.- Sequence üretimi O(1) meta sayaç kullanır; yayın arşivinden
build/ve geçici kök dosyalar çıkarıldı.
0.5.1 #
Fixes & Improvements #
- Performans: Büyük dosyalarda (örn. 50MB+) enqueue işlemi sırasında oluşan RAM spike'ı önlemek için checksum hesaplaması streaming (chunked SHA-256) kullanacak şekilde güncellendi.
- Hafıza: Tamamlanan (completed, cancelled, permanentlyFailed) görevlerde progress stream controller'larının map'te birikmesine neden olan hafıza sızıntısı giderildi.
- Güvenilirlik: Dosyaların sandbox dizinine kopyalanması sırasında dosya uzantısının hesaplanmasındaki bir kırılganlık (
pathpaketi kullanılarak) giderildi.
0.5.0 #
Breaking Changes #
- Persistence backend değişti: SQLite/Drift'ten sembast'a geçildi.
- Native binary bağımlılığı (
sqlite3_flutter_libs) kaldırıldı — pure-Dart backend. driftvesqlite3_flutter_libsbağımlılıkları kaldırıldı.build_runner/drift_devartık gerekmiyor — codegen adımı yok.database.dartvetables.dartpublic export'tan kaldırıldı;SembastPersistenceRepositoryexport edildi (ileri düzey kullanım için).
- Native binary bağımlılığı (
PersistenceRepositoryinterface'i değişmedi — özel implementasyonlar etkilenmez.
Encryption (Uyarı ile) #
encryptionKeyparametresi artık sembast'ın codec mekanizmasına bağlı. Önemli: Kullanılan codec (Salsa20+SHA256), sembast kaynak deposundaki örnek bir implementasyondur ve bağımsız güvenlik denetiminden geçmemiştir. Compliance gerektiren kullanım senaryoları için bağımsız denetlenmiş bir şifreleme çözümü tercih edin.
0.4.0 #
Security #
- Encryption Support: Added
encryptionKeyoption toUploadQueueallowing the database to be fully encrypted at rest (typically requires a federated SQLCipher package likesqlcipher_flutter_libs). - Metadata Encryption: Added
MetadataCodecinterface toUploadQueuefor encrypting only PII data insidemetadatafields without encrypting the entire database.
0.3.0 #
Performance #
- Event-Based Lock Takeover:
QueueControllernow listens to SQLite lock table updates (tableUpdates) to immediately resume uploads when a worker releases a lock, eliminating the default 30s polling delay in multi-isolate setups. - Adaptive Polling: In background execution contexts with short deadlines (e.g. iOS
BGTaskScheduler), the polling interval is adaptively reduced to prevent missing the execution window.
0.2.0 #
Performance #
- Zero-Copy Sandbox:
copyToSandboxnow attempts to use hardlinks (ln) first on compatible filesystems to eliminate disk I/O and duplication overhead. - Streaming Copy: Introduced
sandboxCopyThresholdBytesinUploadQueueAdvancedOptions. Files larger than this threshold fallback to an asynchronous chunked streaming copy instead of blockingFile.copy(), saving memory on large files.
0.1.0 #
Initial public release.
Features #
- Offline-first persistent upload queue backed by SQLite (via Drift).
- Sequential processing with configurable
maxAttemptsand exponential backoff retry (BackoffStrategy.exponential/BackoffStrategy.fixed). - Wi-Fi only mode (
wifiOnly: true) with cellular override viaforceUploadOnce(). - Reactive streams:
watchSummary(),watchTasks(),watchProgress(). - Disk usage tracking:
estimatedDiskUsageBytesand configurableonDiskUsageWarningcallback. - SHA-256 checksum verification against optional server-side checksum.
copyToSandbox: true(default) — files are copied to a package-managed sandbox directory on enqueue so originals can be deleted safely.- Stale-lock recovery:
uploading → pendingon restart after crash. - Worker heartbeat and atomic lock acquisition (SQLite single-writer guarantee).
- iOS background sync via
BGTaskScheduler(IosBackgroundChannel). - Android background sync via Workmanager (
AndroidBackgroundRunner). - Pluggable
UploadAdapterinterface (default:RestUploadAdapterwith Dio). - Pluggable
ConnectivityMonitorinterface (default:DefaultConnectivityMonitorwith reachability test). - Pluggable
PersistenceRepositoryinterface for custom storage backends. onAuthExpiredcallback for token-refresh integration.onLoghook for routing internal events to Sentry / Crashlytics.- Multiple independent queues via
boxNameparameter.
