159 lines
5.6 KiB
Markdown
159 lines
5.6 KiB
Markdown
# 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
|