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
CreateGame,JoinWaitingRoom,StartGameRequestGameUpdate,ToggleGameLock
Événements de jeu
Deplacement,ActionDoor,PickUpItemChangeRound,EndTurn
Événements de combat
StartCombat,Attack,EscapeRollDice,CombatEnded
Événements de chat et canaux
chat:send-message,chat:message-receivedchat:join-channel,chat:leave-channel
Événements d'amis
FriendRequestReceived,FriendRequestAcceptedFriendRequestRejected,FriendRemoved
Événements de statistiques
stats:join-room,stats:leave-roomstats:player-count-updated
Points d'attention
- Le
SocketServicesert de façade pour tous les autres services spécialisés - Chaque service spécialisé gère un aspect spécifique (jeu, salle d'attente, chat, amis, combat)
- L'approche est modulaire, permettant d'étendre facilement le système
- Les services utilisent intensivement le pattern Observer via les événements Socket.IO
- 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
private io: SocketIOServer: Instance Socket.IOprivate socketMap: Map<string, Socket> - Mapping socket ID → Socketprivate userSocketMap: Map<string, Socket> - Mapping Firebase UID → Socket
Méthodes
constructor(...services)
Description : Initialise le service avec toutes les dépendances nécessaires.
Services injectés :
OnGoingGameService: Gestion des parties en coursWaitingSocketService: Événements de salle d'attenteJoinGameService: Logique de rejoindre une partieTimerSocketService: Événements de timerCombatSocketService: Événements de combatChatSocketService: Événements de chat et canauxFriendsSocketService: Événements d'amisAuthSocketService: Authentification des socketsStatsRoomSocketService: Événements de statistiques
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 :
room: Nom de la room (ex:game:{gameCode},user:{firebaseUid})event: Type d'événement à émettredata: Données optionnelles à envoyer
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 :
firebaseUid: Firebase UID de l'utilisateurevent: Type d'événementdata: Données
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 :
- Authentification obligatoire via
AuthSocketService - Configuration des handlers spécialisés (jeu, chat, amis, etc.)
- 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 :
StartGame: Démarrage de la partieDeplacement: Déplacement des joueursActionDoor: Interaction avec les portesPickUpItem: Ramasser des objetsChangeRound: Changement de tourEndTurn: Fin du tour du joueur
private handlePlayerMovement(socket: Socket): void
Description : Gère les événements de déplacement des joueurs.
Validation :
- Vérifie que c'est le tour du joueur
- Vérifie la validité du déplacement (pathfinding)
- Vérifie les points d'action disponibles
É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 :
- Vérifie la proximité de la porte
- Vérifie les points d'action
É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 :
JoinWaitingRoom: Rejoindre la salle d'attenteLeaveWaitingRoom: Quitter la salleKickPlayer: Expulser un joueur (admin uniquement)ToggleGameLock: Verrouiller/déverrouiller la partieRequestGameUpdate: Demander mise à jour de l'étatStartGame: Lancer la partie (admin uniquement)AddVirtualPlayer: Ajouter un bot
private handlePlayerLeave(socket: Socket, isDisconnected: boolean): void
Description : Gère le départ d'un joueur de la salle d'attente.
Logique :
- Si admin déconnecté → Annulation de la partie
- Sinon → Retrait du joueur et notification aux autres
- Remboursement des frais d'entrée si configuré
private cancelGame(gameCode: string, isDisconnected: boolean): void
Description : Annule une partie en attente.
Actions :
- Notification à tous les joueurs
- Remboursement des frais d'entrée
- Suppression de la partie de la mémoire
- Nettoyage des ressources
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 :
JoinCharacterCreation: Accéder à la création de personnageJoinWaitingRoom: Rejoindre la salle d'attenteRequestAvailableGames: Demander la liste des parties disponibles
Fonctionnalités :
- Support du drop-in (rejoindre partie en cours)
- Vérification des frais d'entrée
- Validation de la visibilité (public/friends)
- Vérification de la capacité de la partie
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 :
chat:send-message: Envoyer un messagechat:join-channel: Rejoindre un canalchat:leave-channel: Quitter un canalchat:create-channel: Créer un canalchat:delete-channel: Supprimer un canal (owner uniquement)
Fonctionnalités :
- Censure automatique des messages (
MessageCensorshipService) - Support GIFs Tenor dans les messages
- Historique de messages persisté dans MongoDB
- Notifications en temps réel
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 :
FriendRequestReceived: Notification de demande reçueFriendRequestAccepted: Notification d'acceptationFriendRequestRejected: Notification de refusFriendRemoved: Notification de suppression
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 :
stats:join-room: Rejoindre la stats roomstats:leave-room: Quitter la stats roomstats:player-count-updated: Mise à jour du nombre de joueurs
Fonctionnalités :
- Tracking des joueurs dans la page de statistiques
- Nettoyage automatique :
- Dernier joueur quitte → suppression du canal de partie
- Suppression de l'
OnGoingGamede la mémoire
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 :
socket-authenticate: Authentification avec session ID
Validation :
- Vérification du session ID via
SessionService - Association socket ↔ Firebase UID
- Jointure automatique de la room personnelle
user:{firebaseUid}
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 :
TimerUpdate: Mise à jour du temps restantTimerExpired: Timer expiré, passage au tour suivant
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 :
StartCombat: Initier un combatRollDice: Lancer les désFlee: Fuir le combat
Événements émis :
CombatStarted: Combat commencéCombatRollResult: Résultat du lancer de désCombatEnded: Combat terminé avec résultats
Intégration : Utilise CombatService pour la logique de combat.
Rooms Socket.IO
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 :
- Événements de partie →
game:{gameCode} - Notifications personnelles →
user:{firebaseUid} - Messages de canal →
channel:{channelId}
Gestion des déconnexions
Flux de déconnexion
- Event
disconnectdétecté - Identification du joueur (via
AuthSocketService) - 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
- Notification aux autres utilisateurs concernés
- Nettoyage des ressources (rooms, mappings)
Reconnexion
- Support de reconnexion automatique
- Préservation de l'état de partie si drop-in/out activé
- Réauthentification requise avec session ID