package gateway // Присутствие в Gateway: кто прямо сейчас держит соединение. Нужно Web Push // (AGENT.md 7.16, Фаза 7): если у получателя есть активная сессия, уведомление // покажет сам клиент по своим правилам, и дублировать его на телефон не нужно. // // Файл отдельный, чтобы не трогать горячий gateway.go: логика читает те же // поля и под тем же мьютексом, что и рассылка. // IsUserOnline сообщает, есть ли у пользователя хотя бы одно соединение. func (s *Service) IsUserOnline(userID uint64) bool { if s == nil || userID == 0 { return false } s.mu.RLock() defer s.mu.RUnlock() for _, session := range s.sessions { if session.userID == userID { return true } } return false } // OnlineUsers возвращает количество уникальных пользователей с соединением — // используется в тестах и диагностике. func (s *Service) OnlineUsers() int { if s == nil { return 0 } s.mu.RLock() defer s.mu.RUnlock() seen := make(map[uint64]struct{}, len(s.sessions)) for _, session := range s.sessions { seen[session.userID] = struct{}{} } return len(seen) }