GreySpace v2.1.3
v2.1.3 — Transfert web incassable : reprise sur coupure + intégrité
- Reprise automatique sur coupure (navigateur → PC) : un upload web interrompu (Wi-Fi coupé) reprend au dernier octet reçu côté PC au lieu de repartir de zéro. Le client interroge
GET /upload-offset, calcule le chunk de reprise (floor(received/CHUNK_SIZE)) et continue ; gestion du 409 (re-synchronisation) et bouton « Reprendre » tant que la sélection est en mémoire. - Écriture serveur reprise-sûre (idempotente) :
_handleUploadChunkappend au bon offset, ignore un chunk déjà reçu, renvoie 409 sur trou, et soigne un chunk partiel (torn write) par troncature+ré-écriture. Aucune corruption à la reprise. - Intégrité fin de fichier : validation de la taille au dernier chunk (422 + pas de signalement
onFileReceivedsi mismatch). - Reprise scopée à la session : un 1er envoi écrase proprement un fichier homonyme périmé (chunk 0) ; seuls les transferts qu'on a nous-mêmes commencés reprennent (clé = identité du fichier) → jamais de mélange d'octets entre deux fichiers de même nom.
- Watchdog upload 30 s : une requête d'upload figée libère la socket et nettoie l'UI de réception (distinct du ping web 8 s).
- Galerie iOS robuste : sélection de dizaines/centaines de vidéos sans freeze (icône statique au lieu de génération de vignette vidéo qui saturait Safari), miniatures images en lazy-load, retry chunk ×3 avec backoff, Wake Lock pendant l'envoi, statut par fichier (✓/✗ + raison), skip explicite des fichiers iCloud non téléchargés.
- Tests : suite E2E
test/integration/http_upload_resume_test.dart(reprise bytewise identique, idempotence, 409, 422, torn-write).
Téléchargements : macOS (.dmg) et Android (.apk) disponibles ci-dessous. La build Windows suivra (ajoutée à cette même release).