lint fix wip

This commit is contained in:
Nicolas Cantu 2026-01-07 02:24:24 +01:00
parent 3c888e375a
commit 790b8f6e25
4 changed files with 116 additions and 59 deletions

View File

@ -2,10 +2,11 @@
**Auteur** : Équipe 4NK **Auteur** : Équipe 4NK
**Date** : 2025-01-27 **Date** : 2025-01-27
**Dernière mise à jour** : 2025-01-27
## Vue d'ensemble ## Vue d'ensemble
Ce document décrit l'état actuel de l'implémentation des principes d'architecture et les migrations nécessaires. 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 créés
@ -18,88 +19,140 @@ Ce document décrit l'état actuel de l'implémentation des principes d'architec
2. **`lib/writeOrchestrator.ts`** - Service de gestion des écritures 2. **`lib/writeOrchestrator.ts`** - Service de gestion des écritures
- Orchestre les écritures vers WebSockets/API et Web Worker d'écriture - Orchestre les écritures vers WebSockets/API et Web Worker d'écriture
- Écritures réseau et locales en parallèle
- ✅ Conforme aux principes - ✅ Conforme aux principes
3. **`lib/writeService.ts`** - Service de gestion du Web Worker d'écriture 3. **`lib/writeService.ts`** - Service de gestion du Web Worker d'écriture
- Existe déjà et route les écritures vers le Web Worker - Route les écritures vers le Web Worker (`writeWorker.js`)
- ⚠️ Le fichier `writeWorker.js` doit être créé et adapté pour Next.js - Fallback vers écriture directe si Web Worker indisponible
- ✅ Conforme aux principes
4. **`lib/notificationReader.ts`** - Service de lecture des notifications 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 - Détecte les nouvelles notifications dans IndexedDB
- Séparé du Service Worker qui alimente les notifications - Séparé du Service Worker qui alimente les notifications
- ✅ Conforme aux principes - ✅ Conforme aux principes
5. **`lib/notificationService.ts`** - Service de gestion des notifications 6. **`lib/notificationService.ts`** - Service de gestion des notifications
- Stocke les notifications dans IndexedDB - Stocke les notifications dans IndexedDB via `writeService`
- ✅ Conforme aux principes - ✅ Conforme aux principes
6. **`lib/notificationDetector.ts`** - Détecteur de notifications 7. **`lib/swClient.ts`** - Client Service Worker
- Scanne IndexedDB pour détecter les nouveaux événements - Communication entre main thread et Service Worker
- ⚠️ Doit être intégré dans le Service Worker pour alimenter les notifications - Gère les messages de synchronisation
- ✅ Conforme aux principes
## Migrations nécessaires 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
### 🔄 Migrations prioritaires 9. **`lib/localeStorage.ts`** - Stockage de la langue
- Stocke la préférence de langue dans IndexedDB
- Migration automatique depuis localStorage
- ✅ Conforme aux principes
1. **Créer et adapter `writeWorker.js`** ## Migrations terminées
- Le fichier `public/writeWorker.js` existe mais doit être adapté pour Next.js
- Les Web Workers dans Next.js nécessitent une configuration spéciale
- **Action** : Adapter le worker pour fonctionner avec Next.js ou utiliser une approche alternative
2. **Migrer les écritures directes vers `writeService`** ### ✅ Migrations complétées
- Plusieurs services appellent directement `objectCache.set` et `objectCache.updatePublished`
- **Fichiers concernés** :
- `lib/platformSync.ts` - Synchronisation plateforme
- `lib/userContentSync.ts` - Synchronisation contenu utilisateur
- `lib/articlePublisher.ts` - Publication d'articles
- `lib/purchaseQueries.ts` - Requêtes d'achats
- `lib/reviewTipQueries.ts` - Requêtes de tips
- `lib/sponsoringQueries.ts` - Requêtes de sponsoring
- **Action** : Remplacer tous les appels directs par `writeService.writeObject()` et `writeService.updatePublished()`
3. **Intégrer le Service Worker pour les notifications** 1. **✅ Web Worker d'écriture**
- Le Service Worker doit alimenter directement la table des notifications via le Web Worker d'écriture - Le fichier `public/writeWorker.js` est fonctionnel
- Actuellement, le détecteur s'exécute dans le thread principal - Toutes les écritures passent par `writeService` qui route vers le Web Worker
- **Action** : Modifier `public/sw.js` pour que le Service Worker alimente les notifications via `writeService.createNotification()`
4. **Utiliser `websocketService` au lieu de `nostrService.pool`** 2. **✅ Migrations des écritures vers `writeService`**
- `nostrService` utilise directement `SimplePool` pour les WebSockets - `lib/platformSync.ts` - ✅ Utilise `writeService.writeObject()`
- **Action** : Migrer vers `websocketService` qui communique avec les Service Workers - `lib/userContentSync.ts` - ✅ Utilise `writeService.writeObject()`
- `lib/articlePublisher.ts` - ✅ Utilise `writeOrchestrator.writeAndPublish()`
- Tous les services de synchronisation utilisent maintenant `writeService`
5. **Utiliser `writeOrchestrator` pour les publications** 3. **✅ Migrations des publications vers `writeOrchestrator`**
- Les publications doivent passer par `writeOrchestrator` qui orchestre WebSocket + Web Worker - `lib/articleMutations.ts` - ✅ Utilise `writeOrchestrator` (series, articles, reviews)
- **Action** : Modifier `nostrService.publishEvent()` pour utiliser `writeOrchestrator` - `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`
## Architecture cible 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) Interface Utilisateur (React)
↓ (lecture uniquement) ↓ (lecture uniquement depuis IndexedDB)
IndexedDB IndexedDB
↑ (écriture via Web Worker) ↑ (écriture via Web Worker)
Web Worker d'écriture (writeWorker.js) Web Worker d'écriture (writeWorker.js)
↑ (orchestration) ↑ (orchestration)
Service de gestion des écritures (writeOrchestrator) Service de gestion des écritures (writeOrchestrator)
↓ (réseau) ├─→ (réseau) WebSocket Service (websocketService)
Service WebSocket (websocketService) │ ↓ (communication via postMessage)
↓ (communication) │ Service Worker (sw.js)
Service Workers (sw.js) │ ↓ (requêtes de synchronisation)
↓ (persistance via Web Worker) │ Main Thread (swSyncHandler)
Web Worker d'écriture │ ↓ (synchronisation)
│ platformSync / userContentSync
│ ↓ (écriture via writeService)
│ Web Worker d'écriture
│ ↓
│ IndexedDB
└─→ (local) Web Worker d'écriture
IndexedDB IndexedDB
``` ```
## Priorités ## Principes respectés
1. **Haute priorité** : Créer et adapter `writeWorker.js` pour Next.js ### ✅ Architecture de données
2. **Haute priorité** : Migrer les écritures de synchronisation vers `writeService` - **Interface** : Lecture uniquement depuis IndexedDB
3. **Moyenne priorité** : Intégrer le Service Worker pour alimenter les notifications - **Écritures** : Toutes via `writeService` → Web Worker → IndexedDB
4. **Moyenne priorité** : Migrer vers `websocketService` - **Publications** : Via `writeOrchestrator` (réseau + local en parallèle)
5. **Basse priorité** : Utiliser `writeOrchestrator` pour les publications - **Réseau** : Via `websocketService` → Service Worker
- **Synchronisation** : Via Service Worker → Main Thread → `writeService`
## Notes ### ✅ 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 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 - Les services de log (`publishLog`) peuvent continuer à écrire directement car ce sont des logs
- La migration doit être progressive pour éviter de casser l'application - 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.

View File

@ -542,7 +542,7 @@ async function publishUpdate(
const updateTags = await buildUpdateTags(draft, originalArticleId, newCategory, authorPubkey, currentVersion) const updateTags = await buildUpdateTags(draft, originalArticleId, newCategory, authorPubkey, currentVersion)
// Build parsed article with incremented version // Build parsed article with incremented version
const { article, hash, version, index } = await buildParsedArticleFromDraft(draft, invoice, authorPubkey) const { article } = await buildParsedArticleFromDraft(draft, invoice, authorPubkey)
const updatedArticle: Article = { const updatedArticle: Article = {
...article, ...article,
version: currentVersion + 1, // Increment version for update version: currentVersion + 1, // Increment version for update

View File

@ -257,7 +257,8 @@ class WebSocketService {
this.reconnectIntervals.clear() this.reconnectIntervals.clear()
if (this.pool) { if (this.pool) {
this.pool.close() // SimplePool doesn't have a close method, just nullify the reference
// Connections will be closed automatically when pool is garbage collected
this.pool = null this.pool = null
} }

View File

@ -240,13 +240,16 @@ class WriteService {
} }
// Fallback: direct write // Fallback: direct write
const { notificationService } = await import('./notificationService') const { notificationService } = await import('./notificationService')
await notificationService.createNotification({ const notificationParams: Parameters<typeof notificationService.createNotification>[0] = {
type: type as Parameters<typeof notificationService.createNotification>[0]['type'], type: type as Parameters<typeof notificationService.createNotification>[0]['type'],
objectType, objectType,
objectId, objectId,
eventId, eventId,
data, }
}) if (data !== undefined) {
notificationParams.data = data
}
await notificationService.createNotification(notificationParams)
} catch (error) { } catch (error) {