Graphe des messages du chat
Qui émet quoi, qui reçoit quoi, ce qui traverse le canal. Ce graphe est généré à l'ouverture de la page à partir des emits et receives des composants réels et du CHANNEL du catalogue : il ne peut pas diverger du code.
Scénarios commentés
Connexion
- Le socket s'ouvre ; le canal client envoie
handshake_request. Le serveur vérifie la compatibilité, crée une session, répond un jeton. Le canal serveur publieconnection_event { connected }avecidetsession. gestion_connexionrattache la session :session.data.connectes(tableau partagé) etsession.allowMessage(deny sauf accès et déconnexion).- L'utilisateur valide le formulaire :
ecran_connexionpublieacces_demande { ref, pseudo, mot_de_passe }. Broker client, canal, réseau, canal serveur (admis : pas encore de pseudo maisacces_demandeest dans la liste blanche), broker serveur. gestion_connexioncrée ou vérifie l'utilisateur, écritsession.data.pseudo, publieacces_reponse { ref, accord }ciblé parid, puispresence_changeeciblé sur tous les connectés.gestion_messagesreçoit aussiacces_reponse(livraison locale au serveur) et sert l'historique :message_poste { historique }, ciblé.- Côté client,
ecran_connexionse masque,ecran_fils'affiche, peint la présence puis l'historique.
Envoi d'un message
ecran_filpubliemessage_demande { ref, texte }. Le broker client valide lepatterndurefet la longueur du texte.- Le canal serveur pose
id/session, consulteallowMessage: le pseudo est en session, admis. gestion_messagesvérifie que la session figure dans les connectés, ignore unrefdéjà enregistré (renvoi après coupure), enregistre, publiemessage_poste { message }ciblé sur tous les connectés, et efface la mention d'écriture.- Chaque
ecran_filajoute la ligne, sans doublon grâce auref.
Mention « écrit… »
- Au premier caractère,
ecran_filpubliepresence_signalee { ecrit: true }, puis au plus une fois par seconde tant qu'on tape ;{ ecrit: false }si le champ est vidé. gestion_messagesmet à jour le connecté, arme une minuterie de 3 secondes, et diffusepresence_changeesi l'état a changé. À l'expiration ou à l'envoi, il remetecrità faux et rediffuse.
Déconnexion volontaire
/quit:ecran_filpubliedeconnexion_demande { ref }et se remet à zéro.ecran_connexion, abonné au même message, repasse à l'état vierge : une réaction locale à un message pourtant destiné au serveur.- Serveur :
gestion_connexionefface le pseudo de la session (la porte se referme), retire la session des connectés, diffuse la présence aux autres.
Coupure et expiration de session
- Socket fermé : le canal serveur publie
connection_event { disconnected };gestion_connexionretire la session de la présence. La session survit pendant le TTL. - Le client revient avec son jeton (reconnexion automatique, ou rechargement de page dans le TTL) :
resumed.gestion_connexionrattache la session, mais le pseudo a été effacé : l'utilisateur doit se réidentifier. C'est un choix du chat, pas du framework. - TTL écoulé sans retour :
expired, dernière livraison où la session est lisible, puis destruction.
Dans la démo, le bouton « couper le lien » rejoue la coupure et l'expiration (TTL réduit à 8 secondes).