feat(admin): pousse le monitoring en WebSocket au lieu du polling client #45
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/admin-monitoring-websocket"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Reprise de la #35, dont le merge a atterri sur
fix/admin-monitoring-spa-route-collision(branche déjà fusionnée dansmainvia la #33) — le travail WebSocket n'a donc jamais atteintmain. Cette PR le rebranche directement surmainet corrige au passage la fuite de handle qui bloquait le jobtesten CI.Contenu
13d92f8— le travail d'origine de la #35 :Le tableau de bord
/admin/monitoringfonctionnait en polling côté client (15 s) déclenchant une sonde active côté serveur à chaque appel — deux onglets admin ouverts = deux séries de sondes redondantes. Le mécanisme est inversé : le serveur sonde une fois par minute et pousse le résultat aux clients connectés via WebSocket (socket.io, room"monitoring").ExpressServer(packages/express-tools) expose désormais sonhttp.Serversous-jacent, créé explicitement plutôt que dans.listen()— socket.io s'y attache directement.MonitoringBroadcastService(nouveau) : sonde immédiate au démarrage puis toutes les 60 s (réutilisegetMonitoring()tel quel), diffuse à la room"monitoring", rejoue le dernier résultat en cache à tout admin qui rejoint.requireAdminSocket(nouveau) : middleware de handshake socket.io, équivalent WebSocket derequireAdmin(vérification factorisée dansresolveAdminFromToken).GET /admin/api/monitoringsupprimée (route + service de test associés).MonitoringSocketClient(wrapper socket.io-client injectable),MonitoringPageséparedataetconnectionState(une coupure affiche un badge « reconnexion » sans effacer le dernier board connu).23be1e4— correctif CI :Le hook
afterdeadmin-monitoring-socket.test.tsne fermait jamais le serveur socket.io ni sonhttp.Server. Mocha tournant sans--exit, ce handle en fuite empêchait le process de se terminer — le jobtestaffichait « N passing » puis restait bloqué des heures (runs #80/#81).io.close()est maintenant appelé en fin de suite.Tests
apps/api/test/admin-monitoring-socket.test.ts— handshake auth (rejet sans cookie / avec cookie non-admin), pushmonitoring:updatecouvrant les 4 cibles, diffusion partagée entre plusieurs admins.apps/web/cypress/component/MonitoringPage.cy.tsx— rendu du board, badge de reconnexion, conservation du dernier état connu.🤖 Generated with Claude Code