Gestion des WebSockets

Cette section détaille les composants qui gèrent les communications en temps réel via WebSockets. Ces services sont essentiels pour maintenir la connexion entre le client et le serveur, ainsi que pour synchroniser l'état du jeu entre tous les participants.

Événements Socket principaux

Les événements Socket.IO incluent:

Événements de gestion de partie

Événements de jeu

Événements de combat

Événements de chat et canaux

Événements d'amis

Événements de statistiques

Points d'attention

  1. Le SocketService sert de façade pour tous les autres services spécialisés
  2. Chaque service spécialisé gère un aspect spécifique (jeu, salle d'attente, chat, amis, combat)
  3. L'approche est modulaire, permettant d'étendre facilement le système
  4. Les services utilisent intensivement le pattern Observer via les événements Socket.IO
  5. Toutes les connexions Socket.IO requièrent une authentification via session ID

Cette architecture permet une synchronisation en temps réel efficace entre tous les clients tout en maintenant une séparation des préoccupations claire.

SocketService (socket.service.ts)

Service central qui gère les connexions Socket.IO et coordonne tous les gestionnaires de sockets spécifiques.

Propriétés

Méthodes

constructor(...services)

Description : Initialise le service avec toutes les dépendances nécessaires.
Services injectés :

Importance : Élevée - Point d'entrée pour toute la gestion WebSocket.

sendToRoom(room: string, event: string, data?: unknown): void

Description : Envoie un message à tous les clients connectés à une room spécifique.
Paramètres :

Importance : Très élevée - Méthode principale pour la diffusion des événements.

sendToUser(firebaseUid: string, event: string, data?: unknown): void

Description : Envoie un message à un utilisateur spécifique.
Paramètres :

Importance : Très élevée - Communication ciblée.

getIO(): SocketIOServer

Description : Renvoie l'instance Socket.IO.
Retour : L'instance SocketIOServer.
Importance : Élevée - Utilisée par d'autres services.

private init(): void

Description : Configure le gestionnaire de connexion Socket.IO.
Importance : Élevée - Initialise tous les gestionnaires d'événements.
Détails : S'abonne à l'événement connection et appelle activateNewSocket() pour chaque nouvelle connexion.

private activateNewSocket(socket: Socket): void

Description : Configure tous les gestionnaires d'événements pour une nouvelle connexion socket.
Paramètres : socket - La connexion socket à configurer.
Importance : Élevée - Délègue la gestion des événements aux services spécialisés.
Flux :

  1. Authentification obligatoire via AuthSocketService
  2. Configuration des handlers spécialisés (jeu, chat, amis, etc.)
  3. Gestion de la déconnexion

GameSocketHandlerService

Service (game-socket-handler.service.ts) qui gère les événements socket liés au jeu principal.

Méthodes principales

initialize(service: IOnGoingGameService): void

Description : Initialise le service avec l'instance d'OnGoingGameService.
Paramètres : service - Service de gestion des parties en cours.

handleSocket(socket: Socket): void

Description : Configure les gestionnaires d'événements généraux pour le jeu.
Événements gérés : CreateGame, Disconnect

handleGame(socket: Socket): void

Description : Configure les gestionnaires d'événements spécifiques au déroulement du jeu.
Événements gérés :

private handlePlayerMovement(socket: Socket): void

Description : Gère les événements de déplacement des joueurs.
Validation :

Émission : PlayerMoved à tous les joueurs de la partie

private handleDoorAction(socket: Socket): void

Description : Gère les événements d'interaction avec les portes.
Validation :

Émission : DoorToggled à tous les joueurs

WaitingSocketService

Service (waiting-room-socket.service.ts) qui gère les événements socket de la salle d'attente.

Méthodes principales

handleSocket(socket: Socket): void

Description : Configure les gestionnaires d'événements pour la salle d'attente.
Événements gérés :

private handlePlayerLeave(socket: Socket, isDisconnected: boolean): void

Description : Gère le départ d'un joueur de la salle d'attente.
Logique :

private cancelGame(gameCode: string, isDisconnected: boolean): void

Description : Annule une partie en attente.
Actions :

JoinGameService

Service (join-game.service.ts) qui gère la logique de rejoindre une partie.

Méthodes principales

handleSocket(socket: Socket): void

Description : Configure les gestionnaires d'événements pour rejoindre une partie.
Événements gérés :

Fonctionnalités :

ChatSocketService

Service (chat-socket.service.ts) qui gère les événements socket pour le chat et les canaux.

Méthodes principales

handleSocket(socket: Socket): void

Description : Configure les gestionnaires d'événements pour le chat.
Événements gérés :

Fonctionnalités :

FriendsSocketService

Service (friends-socket.service.ts) qui gère les événements socket pour les amis.

Méthodes principales

handleSocket(socket: Socket): void

Description : Configure les gestionnaires pour les événements d'amis.
Événements émis :

Intégration : Travaille avec FriendsNotificationService pour envoyer les notifications en temps réel.

StatsRoomSocketService

Service (stats-room-socket.service.ts) qui gère les événements socket pour les statistiques post-partie.

Méthodes principales

handleSocket(socket: Socket): void

Description : Configure les gestionnaires pour les stats rooms.
Événements gérés :

Fonctionnalités :

AuthSocketService

Service (auth-socket.service.ts) qui gère l'authentification des connexions Socket.IO.

Méthodes principales

handleSocket(socket: Socket): void

Description : Gère l'authentification des sockets.
Événements gérés :

Validation :

Sécurité : Toutes les actions critiques requièrent une authentification valide.

TimerSocketService

Service (timer-socket.service.ts) qui gère les événements de timer.

Méthodes principales

handleSocket(socket: Socket): void

Description : Gère les événements liés aux timers de tour.
Événements émis :

Intégration : Travaille avec GameTimerService pour la logique des timers.

CombatSocketService

Service (combat-socket.service.ts) qui gère les événements de combat.

Méthodes principales

handleSocket(socket: Socket): void

Description : Gère les événements liés au combat.
Événements gérés :

Événements émis :

Intégration : Utilise CombatService pour la logique de combat.

Rooms principales

Room Description Utilisateurs
user:{firebaseUid} Room personnelle Utilisateur spécifique
game:{gameCode} Room de partie Tous les joueurs de la partie
waiting:{gameCode} Room de salle d'attente Joueurs en attente
channel:{channelId} Room de canal de chat Participants du canal

Utilisation

Les rooms permettent de cibler précisément les destinataires des événements :

Gestion des déconnexions

Flux de déconnexion

  1. Event disconnect détecté
  2. Identification du joueur (via AuthSocketService)
  3. Nettoyage selon le contexte :
    • En salle d'attente → Retrait ou annulation de partie
    • En partie → Marquage comme déconnecté (support drop-in/out)
    • En stats room → Nettoyage si dernier joueur
  4. Notification aux autres utilisateurs concernés
  5. Nettoyage des ressources (rooms, mappings)

Reconnexion