[Majeur] Présence : IsOnline booléen, un onglet fermé ou une déconnexion brutale fausse le statut et coupe le temps réel #99
Labels
No labels
bug
enhancement
feature
groupe/chat-data
groupe/friends-blocking
groupe/input-validation
groupe/realtime-presence
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Transcendence/backend#99
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Gravité : Majeur
Rapports QA d'origine : FRIENDS-14, PROFILE-15, FRIENDS-15, PROFILE-16
KeepGroupedHub(lignes 19 et 51) stocke un booléen : fermer un onglet passe l'user Offline pour tous et coupe le temps réel de ses autres onglets ; après un crash, aucun Offline n'est diffusé.Détails des rapports
[FRIENDS-14] Multi-onglets : fermer un onglet passe l'utilisateur "Offline" pour tous et coupe le temps réel des autres onglets — Gravité : Majeur
KeepGroupedHub.OnDisconnectedAsync) +routes/dashboard.tsx(beforeunload) ;CreateMessageCommand(user.IsOnline)/messages/all(B apparaît "Online"). 2. B ferme l'onglet 2. 3. A envoie un message dans le DM (API, 201).friends_25_presence_after_close_tab2.png) alors qu'un onglet est toujours ouvert ; (b) l'onglet 1 de B ne reçoit PAS le message en direct (friends_26_B_tab1_no_realtime.png) : il n'apparaît qu'après rechargement. Tous les événements temps réelNewMessage/UpdateMessage/RemoveMessagene sont envoyés qu'aux users dontIsOnlineest vrai en base, orOnDisconnectedAsyncmetIsOnline=falseà la fermeture de n'importe quelle connexion.scripts/friends/ui8.py("A view after B closes tab2: ... Offline", "B tab1 got message live: False").backend/API/KeepGroupedHub.cs:19et:51(booléen unique au lieu d'un compteur de connexions) ;Channels/Messages/Create/CreateMessageCommand.cs:49(filtreIsOnlineinutile :Clients.User(...)suffit). Côté client,frontend/src/routes/dashboard.tsx:38-41(handleUnloadenvoie Offline sans tenir compte des autres onglets).[PROFILE-15] Présence : fermer UN onglet d'un user connecté dans plusieurs onglets le fait passer "Offline" pour tous les autres — Gravité : Mineur
bring_to_frontde l'onglet 1 ; seul un changement de visibilité ou un reload de A le corrigera.B sees A: OFFLINE — 64après fermeture du 2e onglet).frontend/src/routes/dashboard.tsx:38-44(handleUnloadenvoiesetSelfActivity(Offline)à chaque onglet) ; l'état de présence est purement client (activity.hook.ts), aucun comptage de connexions par user côté hub (backend/API/KeepGroupedHub.cs).[FRIENDS-15] Présence figée après une déconnexion abrupte (le serveur ne diffuse pas "Offline") — Gravité : Mineur
ActivityLabel/ onglet "Online" /ProfilePicstatus ; hubOnDisconnectedAsync/messages/online, B (ami) en ligne. 2. B ferme brutalement sa page (page.close()sansbeforeunload, équivalent crash / coupure réseau / mobile). 3. Attendre 12 s.visibilitychange) indéfiniment ; il faut recharger la page de A pour qu'il disparaisse. La présence ne repose que sur des événements envoyés par le client (routes/dashboard.tsxbeforeunload) ;KeepGroupedHub.OnDisconnectedAsyncne notifie personne.scripts/friends/ui9.py("A online tab after B abrupt close (4s): ... Away", idem à +12 s, vide après reload).backend/API/KeepGroupedHub.cs:44-54(pas deClients.Others.SendAsync("OtherActivityUpdated", userId, Offline)).[PROFILE-16] Présence : après une déconnexion brutale (crash navigateur/onglet tué/réseau coupé) le user reste affiché "Away/Online" indéfiniment pour les autres — Gravité : Mineur
beforeunload(kill du navigateur). 3. Observer B pendant 15 s, puis recharger B.OnDisconnectedAsyncmetIsOnline=falseen base mais ne diffuse rien aux autres clients ;IsOnlinen'est lu nulle part.backend/API/KeepGroupedHub.cs:41-54(pas deClients.Others.SendAsync("OtherActivityUpdated", userId, Offline)dansOnDisconnectedAsync).Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes.