5.6 KiB
5.6 KiB
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 IndexedDBstorageService: 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, utilisestorageServicegetStoredPrivateContent(): Maintenant async, utilisestorageServicegetStoredInvoice(): Maintenant asyncremoveStoredPrivateContent(): Maintenant async- Expiration par défaut : 30 jours
Changements :
- Remplacement de
localStorageparstorageService - 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 avecawait
lib/paymentPolling.ts
getStoredPrivateContent(): Maintenant async avecawait
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 :
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
-
Stockage :
- Stocker du contenu privé
- Vérifier qu'il est stocké correctement
- Vérifier qu'il peut être récupéré
-
Expiration :
- Stocker avec expiration courte
- Attendre l'expiration
- Vérifier que les données sont supprimées
-
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
-
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