# UserWallet – IndexedDB pour hash_cache **Author:** Équipe 4NK **Date:** 2026-01-26 ## Objectif Stocker le cache des hash vus (`userwallet_hash_cache`) dans IndexedDB au lieu de LocalStorage, pour éviter les limites de taille et permettre un volume plus important sans dégradation. ## Impacts - **Fonctionnels** : Comportement identique (déduplication des messages sync). Pruning à 10k entrées conservé. - **Techniques** : Nouveau module `indexedDbStorage` (idbGet, idbSet, idbRemove). `HashCache` utilise IndexedDB, `init()` async, `markSeenBatch` async. `SyncService` init avant sync, collecte des nouveaux hashes puis un seul `markSeenBatch`. Export/import lisent/écrivent `hash_cache` via IndexedDB (export/import async). ## Modifications ### utils/indexedDbStorage.ts (nouveau) - DB `userwallet`, version 1, store `kv` (keyPath `key`). - `idbGet(key)`, `idbSet(key, value)`, `idbRemove(key)`. Toutes async. ### utils/cache.ts - `HashCache` : plus de chargement dans le constructeur. `async init()` charge depuis IndexedDB (et migre depuis localStorage si présent). - `markSeen` : en mémoire uniquement. `markSeenBatch(hashes)` : ajoute + persiste via IndexedDB. - `clear()` async, utilise `idbRemove`. - Sauvegarde avec pruning à 10k entrées. ### services/syncService.ts - `async init()` : délègue à `hashCache.init()`. - Dans `sync()` : collecte des `newHashes`, puis `await hashCache.markSeenBatch(newHashes)` en fin de sync. ### Composants - **SyncScreen**, **ServiceListScreen** : `await syncService.init()` avant `sync()`. ### exportImport - `exportUserWalletData` async : lit `hash_cache` via `idbGet`. - `importUserWalletData` async : écrit `hash_cache` via `idbSet`. - **DataExportImportScreen** : `handleExport` async, `handleImportFile` onload async. ### Migration - Au premier `HashCache.init()`, si IndexedDB n’a pas `userwallet_hash_cache` et que localStorage l’a, copie vers IndexedDB puis suppression du localStorage. ## Modalités de déploiement - Rebuild frontend, déploiement des assets. Migration automatique au premier sync. ## Modalités d’analyse - Effectuer une sync : vérifier qu’aucune régression. Exporter puis réimporter : vérifier que `hash_cache` est bien présent après import. - Vérifier en DevTools (Application → IndexedDB → userwallet) la présence du store `kv` et de la clé `userwallet_hash_cache`.