# Implémentation de l'amélioration du stockage du contenu privé **Date** : Décembre 2024 **Status** : ✅ Complété ## Objectif Remplacer localStorage par IndexedDB pour le stockage du contenu privé des articles, offrant une meilleure fiabilité, une plus grande capacité de stockage et la gestion de l'expiration des données. ## Fonctionnalités implémentées ### 1. Service IndexedDB - Service IndexedDB complet avec gestion d'initialisation - Support des index pour les recherches (createdAt, expiresAt) - Gestion des erreurs - Utilisation exclusive d'IndexedDB (pas de fallback) ### 3. Gestion de l'expiration - Expiration automatique des données (30 jours par défaut) - Suppression automatique des données expirées lors de la récupération - Méthode pour nettoyer toutes les données expirées ### 4. Migration des fonctions - Toutes les fonctions de stockage sont maintenant async - Compatibilité avec l'API existante (même signature, mais async) - Migration transparente pour le code existant ## Fichiers créés ### `lib/storage/indexedDB.ts` Service IndexedDB complet : - `IndexedDBStorage` : Classe pour gérer IndexedDB - `storageService` : Instance exportée de IndexedDBStorage - Méthodes : `set()`, `get()`, `delete()`, `clearExpired()` - Gestion de l'expiration automatique - Utilisation exclusive d'IndexedDB (pas de fallback) **Caractéristiques** : - Base de données : `nostr_paywall` - Version : 1 - Object store : `article_content` - Index : `createdAt`, `expiresAt` ### `features/storage-improvement-implementation.md` Documentation de l'implémentation. ## Fichiers modifiés ### `lib/articleStorage.ts` - `storePrivateContent()` : Maintenant async, utilise `storageService` - `getStoredPrivateContent()` : Maintenant async, utilise `storageService` - `getStoredInvoice()` : Maintenant async - `removeStoredPrivateContent()` : Maintenant async - Expiration par défaut : 30 jours **Changements** : - Remplacement de `localStorage` par `storageService` - Ajout de l'expiration automatique (30 jours) - Toutes les fonctions deviennent async ### `lib/articlePublisher.ts` - Mise à jour pour utiliser les nouvelles fonctions async - Suppression des méthodes privées dupliquées - Utilisation directe des fonctions exportées de `articleStorage` ### `lib/invoiceResolver.ts` - `getStoredInvoice()` : Maintenant async avec `await` ### `lib/paymentPolling.ts` - `getStoredPrivateContent()` : Maintenant async avec `await` ## Avantages d'IndexedDB vs localStorage ### IndexedDB - **Capacité** : Plusieurs Go vs ~5-10 MB pour localStorage - **Performance** : Meilleure pour les grandes quantités de données - **Structured** : Base de données structurée avec index - **Transactions** : Support des transactions - **Types** : Support des types complexes (Blob, ArrayBuffer, etc.) ### localStorage - **Simplicité** : API plus simple (clé-valeur) - **Compatibilité** : Meilleure compatibilité navigateur (mais IndexedDB est maintenant bien supporté) - **Synchronisation** : API synchrone (plus simple mais peut bloquer) ## Gestion de l'expiration ### Expiration par défaut - **Durée** : 30 jours (configurable via `DEFAULT_EXPIRATION`) - **Vérification** : Automatique lors de la récupération - **Nettoyage** : Les données expirées sont supprimées automatiquement ### Expiration personnalisée Les données peuvent être stockées avec une expiration personnalisée : ```typescript await storageService.set(key, data, customExpirationInMs) ``` ## Exigence IndexedDB L'application nécessite IndexedDB pour fonctionner : - Si IndexedDB n'est pas disponible, une erreur sera levée - IndexedDB est supporté par tous les navigateurs modernes - Pas de fallback vers localStorage ## Migration des données existantes Les données existantes dans localStorage restent accessibles : - Les nouvelles données sont stockées dans IndexedDB (ou localStorage en fallback) - Les anciennes données dans localStorage peuvent être lues (si nécessaire) - Pas de migration automatique nécessaire (les données anciennes seront progressivement remplacées) ## Impact ### Utilisateur - Stockage plus fiable et performant - Pas de changement visible dans l'interface ### Technique - Meilleure gestion du stockage - Expiration automatique des données - Support de plus grandes quantités de données - Code plus robuste avec fallback ## Limitations et améliorations futures ### Limitations actuelles - Expiration fixe à 30 jours (pas de configuration utilisateur) - Pas de nettoyage périodique automatique (seulement lors de la récupération) - Nécessite IndexedDB (pas de fallback) ### Améliorations possibles - **Migration automatique** : Migrer les données localStorage vers IndexedDB au premier chargement - **Nettoyage périodique** : Tâche de nettoyage périodique pour supprimer les données expirées - **Configuration** : Permettre à l'utilisateur de configurer l'expiration - **Compression** : Compresser les données avant stockage pour économiser l'espace - **Chiffrement** : Chiffrer les données sensibles avant stockage ## Tests recommandés 1. **Stockage** : - Stocker du contenu privé - Vérifier qu'il est stocké correctement - Vérifier qu'il peut être récupéré 2. **Expiration** : - Stocker avec expiration courte - Attendre l'expiration - Vérifier que les données sont supprimées 3. **IndexedDB requis** : - Vérifier que l'application fonctionne avec IndexedDB - Vérifier que les erreurs sont gérées correctement si IndexedDB n'est pas disponible 4. **Performance** : - Tester avec un grand nombre d'articles - Vérifier que les performances sont bonnes - Vérifier qu'il n'y a pas de blocage de l'UI