story-research-zapwall/docs/architecture-implementation-status.md
2026-01-07 02:24:24 +01:00

6.8 KiB

État d'implémentation de l'architecture

Auteur : Équipe 4NK Date : 2025-01-27 Dernière mise à jour : 2025-01-27

Vue d'ensemble

Ce document décrit l'état actuel de l'implémentation des principes d'architecture. Toutes les migrations majeures sont terminées et le code est conforme à l'architecture définie.

Services créés

Services conformes aux principes

  1. lib/websocketService.ts - Service de gestion des WebSockets

    • Gère les connexions WebSocket
    • Communique avec les Service Workers via swClient
    • Conforme aux principes
  2. lib/writeOrchestrator.ts - Service de gestion des écritures

    • Orchestre les écritures vers WebSockets/API et Web Worker d'écriture
    • Écritures réseau et locales en parallèle
    • Conforme aux principes
  3. lib/writeService.ts - Service de gestion du Web Worker d'écriture

    • Route les écritures vers le Web Worker (writeWorker.js)
    • Fallback vers écriture directe si Web Worker indisponible
    • Conforme aux principes
  4. public/writeWorker.js - Web Worker d'écriture

    • Gère toutes les écritures dans IndexedDB
    • Transactions multi-tables
    • Conforme aux principes
  5. lib/notificationReader.ts - Service de lecture des notifications

    • Détecte les nouvelles notifications dans IndexedDB
    • Séparé du Service Worker qui alimente les notifications
    • Conforme aux principes
  6. lib/notificationService.ts - Service de gestion des notifications

    • Stocke les notifications dans IndexedDB via writeService
    • Conforme aux principes
  7. lib/swClient.ts - Client Service Worker

    • Communication entre main thread et Service Worker
    • Gère les messages de synchronisation
    • Conforme aux principes
  8. lib/swSyncHandler.ts - Handler de synchronisation

    • Exécute les opérations de synchronisation dans le main thread
    • Répond aux requêtes du Service Worker
    • Conforme aux principes
  9. lib/localeStorage.ts - Stockage de la langue

    • Stocke la préférence de langue dans IndexedDB
    • Migration automatique depuis localStorage
    • Conforme aux principes

Migrations terminées

Migrations complétées

  1. Web Worker d'écriture

    • Le fichier public/writeWorker.js est fonctionnel
    • Toutes les écritures passent par writeService qui route vers le Web Worker
  2. Migrations des écritures vers writeService

    • lib/platformSync.ts - Utilise writeService.writeObject()
    • lib/userContentSync.ts - Utilise writeService.writeObject()
    • lib/articlePublisher.ts - Utilise writeOrchestrator.writeAndPublish()
    • Tous les services de synchronisation utilisent maintenant writeService
  3. Migrations des publications vers writeOrchestrator

    • lib/articleMutations.ts - Utilise writeOrchestrator (series, articles, reviews)
    • lib/articlePublisherPublish.ts - Utilise writeOrchestrator
    • lib/paymentNotes.ts - Utilise writeOrchestrator (purchases, review_tips, sponsoring)
    • lib/reviewRewardUpdate.ts - Utilise writeOrchestrator pour les mises à jour
    • Toutes les publications d'objets passent par writeOrchestrator
  4. Migration des composants vers Service Worker

    • components/KeyManagementManager.tsx - Utilise swClient.startUserSync()
    • components/SyncProgressBar.tsx - Utilise swClient.startUserSync()
    • components/CacheUpdateManager.tsx - Utilise swClient.startUserSync()
    • lib/nostrAuth.ts - Utilise swClient.startUserSync()
  5. Migration de la langue vers IndexedDB

    • lib/localeStorage.ts - Service créé pour stocker la langue dans IndexedDB
    • components/LanguageSettingsManager.tsx - Migré vers IndexedDB
    • components/LanguageSelector.tsx - Migré vers IndexedDB
    • pages/_app.tsx - Charge depuis IndexedDB
    • hooks/useI18n.ts - Migré vers IndexedDB
    • Migration automatique depuis localStorage
  6. Suppressions et modifications

    • Suppressions : Utilisent hidden: true avec nouvelle version (plus de kind 5)
    • Modifications : Utilisent nouvelles versions incrémentées
    • Filtrage : Tous les objets cachés sont filtrés lors des lectures
  7. Réseau via Service Worker

    • lib/platformTracking.ts - Utilise websocketService.publishEvent()
    • lib/publishWorker.ts - Utilise websocketService.publishEvent()
    • lib/sponsoringTracking.ts - Utilise websocketService.publishEvent()
    • lib/swSyncHandler.ts - Utilise websocketService.publishEvent()

Architecture implémentée

Interface Utilisateur (React)
    ↓ (lecture uniquement depuis IndexedDB)
IndexedDB
    ↑ (écriture via Web Worker)
Web Worker d'écriture (writeWorker.js)
    ↑ (orchestration)
Service de gestion des écritures (writeOrchestrator)
    ├─→ (réseau) WebSocket Service (websocketService)
    │       ↓ (communication via postMessage)
    │   Service Worker (sw.js)
    │       ↓ (requêtes de synchronisation)
    │   Main Thread (swSyncHandler)
    │       ↓ (synchronisation)
    │   platformSync / userContentSync
    │       ↓ (écriture via writeService)
    │   Web Worker d'écriture
    │       ↓
    │   IndexedDB
    └─→ (local) Web Worker d'écriture
            ↓
        IndexedDB

Principes respectés

Architecture de données

  • Interface : Lecture uniquement depuis IndexedDB
  • Écritures : Toutes via writeService → Web Worker → IndexedDB
  • Publications : Via writeOrchestrator (réseau + local en parallèle)
  • Réseau : Via websocketService → Service Worker
  • Synchronisation : Via Service Worker → Main Thread → writeService

Gestion des versions

  • Suppressions : Nouvelle version avec hidden: true (publiée en base, filtrée à la lecture)
  • Modifications : Nouvelles versions incrémentées (même hash, version+1)
  • Filtrage : Tous les objets hidden: true sont filtrés automatiquement

Services de configuration

  • Les services de configuration (configStorage, settingsCache) peuvent continuer à écrire directement dans IndexedDB car ils ne sont pas des données métier
  • Les services de log (publishLog) peuvent continuer à écrire directement car ce sont des logs
  • La langue est maintenant dans IndexedDB (via localeStorage)

Cas particuliers légitimes

  • Messages privés (kind 4) : Utilisent nostrService.publishEvent() (événements simples, pas des objets)
  • Événements de suppression (kind 5) : Plus utilisés, remplacés par hidden: true

État de conformité

Statut global : 100% conforme

Toutes les migrations sont terminées et le code respecte intégralement l'architecture définie.