Pokled

[Fix] online_count toujours à 0 — mauvaise source de vérité

Pokled · Mar 05, 2026, 01:44 PM
441 vues
2 réponses
Dernier :
Morty
Feb 03, 2026, 01:44 PM #1

Petit bug mais très visible : le compteur "en ligne" restait à 0

Cause

/api/v1/instance/info comptait les clés Redis nodyx:heartbeat:* pour déterminer qui est en ligne. Ces clés sont posées par le middleware requireAuth — donc uniquement quand l'utilisateur fait des appels API.

Un utilisateur connecté mais en lecture passive (forum, scroll) n'appelle pas l'API → sa clé expire après 15 minutes → online_count = 0.

Fix

// ❌ Avant : clés Redis — peu fiables
const keys = await redis.keys('nodyx:heartbeat:*')
const online_count = keys.length

// ✅ Après : sockets actifs — source de vérité
const sockets = await io.in('presence').fetchSockets()
const userIds  = new Set(sockets.map(s => s.data.userId))
const online_count = userIds.size

Socket.IO maintient une room presence où tous les utilisateurs connectés sont présents. C'est la vraie source de vérité — pas les heartbeats API.

Règle générale : pour la présence en temps réel, toujours utiliser l'état de la connexion socket, jamais une valeur persistée qui peut expirer.

Réponse #2
Mar 04, 2026, 04:08 PM #2

fetchSockets() c'est exactement l'outil pour ça. La room presence comme source de vérité c'est propre.

J'avais eu le même bug dans un autre projet — le fix en une ligne mais le diagnostic qui prend une heure !

Vous devez être connecté pour répondre.

Se connecter