3 - Websockets et Angular
Nous avons vu comment configurer le serveur pour accepter les requêtes en provenance de WebSockets et avons utilisé Postman pour tester quelques messages.
Cependant, ces messages viendront de Angular et ce dernier devra aussi être en mesure de recevoir des messages du serveur.
Installer ngx-socket-io
Dans un premier temps, nous installerons une librairie qui facilitera l'interaction avec les WebSockets en Angular, soit ngx-socket-io. On forcera la version 4.9.0, soit celle compatible avec Angular 20.
npm install ngx-socket-io@4.9.0
Configurer ngx-socket-io
- Dans
app.config.ts, on doit ajouter la configuration, soit pour l'instant l'URL à contacter pour les WebSocket. On ajoute cette configuration dans le haut du fichier, juste après les imports.src/app/app.config.tsconst config: SocketIoConfig = {
url: 'http://localhost',
options: {}
};
export const appConfig: ApplicationConfig = {
// ... - Au tableau
providersdansapp.config.ts, on ajouteprovideSocketIoen utilisant la configuration créée plus haut.src/app/app.module.tsconst config: SocketIoConfig = {
url: 'http://localhost',
options: {}
};
export const appConfig: ApplicationConfig = {
providers: [
provideBrowserGlobalErrorListeners(),
provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(routes),
provideSocketIo(config)
]
};
Envoyer un message à partir d'Angular
Pour envoyer un message via WebSocket à partir d'Angular, on le fait via la librairie Socket IO installée précédemment.
-
Injectez
Socketvia le constructeur de votre composantsrc/app/pages/pixels/pixels.page.tsexport class PixelsPage implements OnInit
{
grid: number[][] = [];
constructor(private socket: Socket) {}
//... -
Le fait j'injecter
Socketfait en sorte de connecter automatiquement le client au serveur! -
Pour émettre un événement, il suffit d'appeler
socket.emitavec le nom de l'événement et les données. Dans mon cas, l'appel se fait dans une fonction lorsque l'utilisateur appuie sur un carré de la grille pour ajouter un pixel au dessin.src/app/features/drawing/pages/pixels.tsdraw(row: number, col: number) {
this.socket.emit('pixel', {
x: row,
y: col,
});
}infopixelest le nom du message, c'est ce que nous avons configuré côté serveur.{ x: row, y: col }ce sont les données (data). Elles doivent correspondre au dto côté serveur. -
Créons l'équivalent du DTO serveur, mais côté client, afin de typer adéquatement les données.
src/core/requetes/creer-pixel-requete.tsexport interface CreerPixelRequete {
x: number;
y: number;
} -
Typons adéquatement l'envoi
src/app/features/drawing/pages/pixels.tsdraw(row: number, col: number) {
const creerPixelRequete: CreerPixelRequete = {
x: row,
y: col,
}
this.socket.emit('pixel', creerPixelRequete)
}
Observer et recevoir les messages
Pour recevoir les messages, il faut écouter le Socket et réagir lorsqu'un message est reçu.
-
Enregistrez l'écoute dans
ngOnInitet effectuez la tâche appropriée (ex.: ajouter le message à la liste de messages ou, dans mon cas, activer ou désactiver le pixel cliqué.)src/app/features/drawing/pages/pixels.tsngOnInit(): void {
//...
this.socket.fromEvent('pixel').subscribe((data: any) => {
this.grid[data.x][data.y] = this.grid[data.x][data.y] === 0 ? 1 : 0;
});
}infoIci, on utilise
fromEventavec le nom de l'événement auquel s'abonner. Dans notre cas, il s'agit depixel. Cette fonction retourne un observable, c'est pourquoi on utilise ensuitesubscribe, tout en passant une fonction anonyme qui sera exécutée à chaque événement reçu.Dans mon cas, j'active ou désactive le pixel qui a été sélectionné.
Se déconnecter du socket
Lorsque le composant est détruit, vous voudrez appeler la fonction disconnect() sur le socket.
ngOnDestroy(): void {
this.socket.disconnect();
}
