# É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 ```text 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.