2 - Gérer les événements
Maintenant que vous êtes en mesure de vous connecter à un WebSocket et que le serveur est en mesure d'accepter les connexions, comment allons-nous communiquer de l'information avec lui?
Les WebSockets s'appuient sur un système d'événement. Un message envoyé au serveur comprend un type d'événement (event) et des données data.
S'abonner aux événements via @SubscribeMessage
Pour accepter des événements, on peut créer une fonction dans le gateway et associer cette fonction à un type d'événement.
Le décorateur @SubscribeMessage permet de lier une fonction à un type d'événement.
export class PixelsEventsGateway implements OnGatewayConnection, OnGatewayDisconnect {
handleConnection(client: any, ...args: any[]) {
console.log('Client connected:', client.id);
}
handleDisconnect(client: any) {
console.log('Client disconnected:', client.id);
}
@SubscribeMessage('pixel')
async handleMessage(client: any, data: any) {
console.log('Client message:', data);
}
}
Ici, le serveur s'abonne aux messages ayant comme event pixel. On ne fait qu'afficher en console les données reçues pour commencer.
Envoyer des données via un événement
- En utilisant Postman, je peux envoyer un événement
pixelavec, par exemple, les coordonnées du pixel à ajouter.
- Côté serveur, l'événement a bien été reçu!
Client message: {
"x": 12,
"y": 12
}
Typer les données attendues
Plutôt que d'utiliser data: any, il est possible, tout comme au niveau de l'API, de typer les données attendues via un DTO.
export class PixelData {
x: number;
y: number;
}
@SubscribeMessage('pixel')
async handleMessage(client: any, data: PixelDataDto) {
console.log('Client message:', data);
this.server.emit('pixel', data);
}
Émettre un événement aux clients connectés
Imaginons que le serveur vient en effet de recevoir un nouveau pixel à dessiner. Il doit maintenant communiquer avec tous les clients connectés la position du nouveau pixel.
Le serveur doit à son tour émettre un événement! L'événement peut porter le même nom (pixel), mais sera envoyé aux clients connectés.
-
On doit premièrement ajouter une référence au websocket côté serveur afin d'émettre des événements
export class PixelsEventsGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer()
server: Server;
//...attentionIl est possible que vous deviez importer
Serverdirectement à partir desocket.ioen ajoutant manuellement l'import.import { Server } from 'socket.io'; -
Le serveur peut ensuite, à son tour, émettre un événement à tous les clients connectés via la fonction
emit()surServer.@SubscribeMessage('pixel')
async handleMessage(client: any, data: any) {
console.log('Client message:', data);
this.server.emit('pixel', data);
}Ainsi, dès que le serveur reçoit un message d'un client pour un nouveau "pixel" à dessiner, il renvoie à tous les clients le même pixel.
-
Dans Postman, dans la section
Events, on peut le configurer pour écouter les événements portant un certain nom, commepixel
-
On peut maintenant renvoyer un événement au serveur et en retour on devrait obtenir une réponse! :)
