Serveur de chat
Tous les éléments sont réunis pour concevoir notre plateforme de clavardage. Avant toute chose, il convient de définir le protocole de communication entre le client et le serveur.
| Nom | Paramètre | Définition | Réponse possible |
|---|---|---|---|
>signin |
pseudo | Demande de connexion | <connected<error<notification |
>message |
texte | Envoi d'un message au serveur | <message |
<connected |
pseudo | Confirmation de connexion | |
<error |
message d'erreur | Échec de connexion | |
<notification |
texte | Envoi d'une notification aux clients | |
<message |
expéditeur + texte | Envoi d'un message aux clients |
Demande de connexion
Côté client
Exercice
Ajoutez un écouteur d'événement
submit au formulaire
signin afin :
-
d'envoyer un événement de type
>signinau serveur avec comme paramètre la valeur du champ de saisie nomménickname - d'empêcher la soumission du formulaire
Côté serveur
Les sockets déjà connectés sont stockés dans l'objet registeredSockets
avec comme clé le pseudo de l'utilisateur. Lorsque le serveur reçoit une nouvelle
demande de connexion, il doit vérifier si le pseudo est déjà attribué.
Ajoutez la création de la variable registeredSockets dans le fichier
server.js
let registeredSockets = {};
Exercice
Écrivez une fonction function isAvailable(nickname)
qui retourne un booléen indiquant si le pseudo est disponible ou pas.
Confirmation de connexion
Côté serveur
Si le pseudo proposé par le client lors de l'envoi de l'événement >signin
est disponible, le serveur doit confirmer la connexion au client et informer tous les
autres.
Exercice
Écrivez un écouteur d'événement >signin pour l'objet socket
afin :
-
d'ajouter ce nouveau socket à l'objet
registeredSockets -
d'envoyer un événement de type
<connectedau client -
d'envoyer un événement de type
<notificationà tous les autres
Côté client
L'interface Web du client chat doit être mise à jour en fonction des événements émis par le serveur.
Exercice
Écrivez deux écouteurs d'événement pour l'objet socketClient afin :
-
<connected-
de masquer le formulaire
signin -
d'ajouter le pseudo comme contenu textuel de l'élément
spandu formulairesend -
d'afficher le formulaire
send
L'utilisateur o.nocentest connecté -
de masquer le formulaire
-
<notification- Ajouter le message passé en paramètre dans l'élément
div#display
L'utilisateur o.nocenta reçu une notification du serveur - Ajouter le message passé en paramètre dans l'élément
Echec de connexion
Côté serveur
Exercice
Complétez le code de l'écouteur d'événement >signinpour
l'objet socket afin d'envoyer un événement de type
<error au client concerné.
Côté client
Exercice
Écrivez un écouteur d'événement de type <error
pour l'objet socketClient afin :
-
de renseigner le message d'erreur dans l'élément
div.toast-error -
d'afficher l'élément
div.toast-error
o.nocent est déjà utilisé
Envoi/réception de messages
Côté client
Exercice
Ajoutez un écouteur d'événement submit au formulaire send afin :
-
d'envoyer un événement de type
>messageau serveur avec comme paramètre la valeur du champ de saisie nommémessage -
de vider le champ de saisie nommé
message - d'empêcher la soumission du formulaire
Côté serveur
Lors de la réception d'un événement >message, le serveur
doit pouvoir déterminer le pseudo de l'utilisateur à partir de l'objet
socket.
Exercice
Écrivez une fonction function getNicknameBy(socket)
qui retourne le pseudo de l'utilisateur correspondant à l'objet
socket passé en paramètre.
Le paramètre de l'événement <message envoyé par le
serveur à tous les clients connectés sera un objet composé de deux propriétés :
sender et text.
Exercice
Écrivez un écouteur d'événement >message pour l'objet
socket qui enverra un événement de type <message
à tous les clients connectés (y compris l'expéditeur initial).
Côté client (encore)
Dernière étape de l'envoi/réception de message, le client doit mettre
en forme l'événement <message envoyé par le serveur.
Exercice
Écrivez un écouteur d'événement de type <message
pour l'objet socketClient afin d'afficher le message
dans l'élément div#display
Injection de code HTML
Si l'on n'y prend pas garde, un utilisateur peut injecter du code HTML via le champ
de saisie send et modifier l'affichage des messages.
div#display
Afin d'empêcher ce genre d'actions, il est préférable de remplacer les
caractères problématiques par leur entité HTML. Le module npm
ent
propose une solution assez simple.
Déconnexion
Côté serveur
Exercice
Ajoutez un écouteur d'événement de type disconnect à
l'objet socket afin :
- de supprimer ce socket de l'objet
registeredSockets - d'envoyer une notification aux autres utilisateurs