story-research-zapwall/features/storage-improvement-implementation.md
2025-12-22 09:48:57 +01:00

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 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 :

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