feat(perf): implement performance optimizations for session handling
- Introduced a new configuration file `config.yaml` for specifying project context and artifact rules. - Added `.openspec.yaml` files for tracking changes related to performance improvements. - Created design documents outlining the context, goals, decisions, and migration plans for optimizing session performance. - Proposed changes include batching database queries, debouncing event refreshes, purging old events, and implementing loading states for better user experience. - Added tasks and specifications to ensure proper implementation and validation of the new features. These enhancements aim to improve the scalability and responsiveness of the application during collaborative sessions.
This commit is contained in:
36
openspec/changes/perf-realtime-scale/tasks.md
Normal file
36
openspec/changes/perf-realtime-scale/tasks.md
Normal file
@@ -0,0 +1,36 @@
|
||||
## 1. Module broadcast.ts
|
||||
|
||||
- [ ] 1.1 Créer `src/lib/broadcast.ts` avec une `Map<string, Set<(event: unknown) => void>>` et les fonctions `subscribe(sessionId, cb)` et `broadcast(sessionId, event)`
|
||||
- [ ] 1.2 Ajouter la logique de polling mutualisé : `startPolling(sessionId)` / `stopPolling(sessionId)` avec compteur de subscribers
|
||||
- [ ] 1.3 Écrire un test manuel : ouvrir 2 onglets sur la même session, vérifier qu'un seul interval tourne (log côté serveur)
|
||||
|
||||
## 2. Migration des routes SSE
|
||||
|
||||
- [ ] 2.1 Lire toutes les routes `src/app/api/*/subscribe/route.ts` pour inventorier le pattern actuel
|
||||
- [ ] 2.2 Migrer la route weather en premier (elle a déjà un pattern partiel) pour valider l'approche
|
||||
- [ ] 2.3 Migrer les routes swot, motivators, year-review, weekly-checkin une par une
|
||||
- [ ] 2.4 Vérifier que le cleanup SSE (abort signal) appelle bien `unsubscribe()` dans chaque route migrée
|
||||
|
||||
## 3. revalidateTag dans les Server Actions
|
||||
|
||||
- [ ] 3.1 Définir la convention de tags dans `src/lib/cache-tags.ts` (ex: `session(id)`, `sessionsList(userId)`)
|
||||
- [ ] 3.2 Ajouter `cacheTag` / `unstable_cache` aux queries de services correspondantes
|
||||
- [ ] 3.3 Remplacer `revalidatePath` par `revalidateTag` dans `src/actions/swot.ts`
|
||||
- [ ] 3.4 Remplacer `revalidatePath` par `revalidateTag` dans `src/actions/motivators.ts`
|
||||
- [ ] 3.5 Remplacer `revalidatePath` par `revalidateTag` dans `src/actions/year-review.ts`
|
||||
- [ ] 3.6 Remplacer `revalidatePath` par `revalidateTag` dans `src/actions/weekly-checkin.ts`
|
||||
- [ ] 3.7 Remplacer `revalidatePath` par `revalidateTag` dans `src/actions/weather.ts`
|
||||
- [ ] 3.8 Vérifier que les mutations se reflètent correctement dans l'UI après revalidation
|
||||
|
||||
## 4. Broadcast depuis les Server Actions
|
||||
|
||||
- [ ] 4.1 Ajouter l'appel `broadcast(sessionId, { type: 'update' })` dans chaque Server Action de mutation (après revalidateTag)
|
||||
- [ ] 4.2 Vérifier que les mises à jour collaboratives fonctionnent (ouvrir 2 onglets, muter depuis l'un, voir la mise à jour dans l'autre)
|
||||
|
||||
## 5. Pagination sessions page
|
||||
|
||||
- [ ] 5.1 Modifier les queries dans `src/services/` pour accepter `cursor` et `limit` (défaut: 20)
|
||||
- [ ] 5.2 Mettre à jour `src/app/sessions/page.tsx` pour charger la première page + afficher le total
|
||||
- [ ] 5.3 Créer un Server Action `loadMoreSessions(type, cursor)` pour la pagination
|
||||
- [ ] 5.4 Ajouter le bouton "Charger plus" avec état loading dans le composant sessions list
|
||||
- [ ] 5.5 Vérifier l'affichage "X sur Y sessions" pour chaque type de workshop
|
||||
Reference in New Issue
Block a user