[SOCKET IO] Problème avec les namespaces Nodejs

a marqué ce sujet comme résolu.

Hello World,

Après plusieurs années sur sur le site du zéro, j’ai décidé de franchir le pas et de venir un peu plus souvent sur le zeste du savoir. :soleil:

~Après cette petite aparté, ~ voici mon petit problème sur mon projet. Je ne trouve pas comment faire pour qu’un utilisateur se déconnecte d’un namespace.

J’ai un namespace par default

io.on("connection", function (socket) {
  
  socket.on("new-user", (username) => {
    io.emit("user-connected", username);
  });

  socket.on("user-enter-pictonnary", () => {
    console.log("ICI SPACE PICTO");
    space = io.of(`/pictonnary`);
    namespacePictonnary(space);
  });

  socket.on("user-enter-chat", () => {
    console.log("ICI SPACE CHAT");
    space = io.of(`/chat`);
    namespaceChat(space);
  });
});

Ce namespace par default va appelé la fonction selon le namespace que je renvoie depuis le front. Voici les deux namespaces

/* NAMESPACE PICTONNARY */
function namespacePictonnary(space) {
  console.log("On se connecte au NameSpace Pictonnary");

  space.on("connection", (socket) => {
    socket.on("welcome-space", (username) => {
      space.emit("user-connected-space", username);
    });

    socket.on("disconnect", function () {
      io.of("/")
        .in("pictonnary")
        .clients((error, socketIds) => {
          if (error) throw error;
          socketIds.forEach((socketId) =>
            io.of("/").adapter.remoteLeave(socketId, "chat")
          );
        });
      /* On récupére tous les clients dans le salon */
      space.clients((error, clients) => {
        if (error) throw error;
        console.log(clients);
      });
      console.log("Someone disconnected from namespace chat.");
    });

    /* On récupére tous les clients dans le salon */
    space.clients((error, clients) => {
      if (error) throw error;
      console.log(clients);
    });
  });
}

/* NAMESPACE CHAT */
function namespaceChat(space) {
  console.log("On se connecte au NameSpace Chat");

  space.on("connection", (socket) => {
    socket.on("welcome-space", (username) => {
      space.emit("user-connected-space", username);
    });

    socket.on("disconnect", function () {
      io.of("/")
        .in("chat")
        .clients((error, socketIds) => {
          if (error) throw error;
          socketIds.forEach((socketId) =>
            io.of("/").adapter.remoteLeave(socketId, "chat")
          );
        });
      /* On récupére tous les clients dans le salon */
      space.clients((error, clients) => {
        if (error) throw error;
        console.log(clients);
      });
      console.log("Someone disconnected from namespace chat.");
    });

    /* On récupére tous les clients dans le salon */
    space.clients((error, clients) => {
      if (error) throw error;
      console.log(clients);
    });
  });
}

Ici, j’affiche les clients qui sont connecté à mon namespace

space.clients((error, clients) => {
  if (error) throw error;
    console.log(clients);
});

Quand je me connecte 1 fois, j’ai bien mon utilisateur qui s’ajoute

[ '/chat#r9NQo4PU7nhAxX4HAAAF' ]

Quand je me déconnecte, mon tableau se vide bien

[]

Mais quand je me reconnecte, il me créer un nouvel id mais en double

[ '/chat#gCBmRJ9fW2zblFJ1AAAI' ] [ '/chat#gCBmRJ9fW2zblFJ1AAAI' ]

Et cela augmente a chaque déconnexion et connexion :/

Je ne sais pas ou j’ai mal fait :/

Bonjour,

Peut-être en évitant de choisir le mot clé réservé connection ?

space.on("connection", (socket) => { /* ... */ }

Après je n’ai jamais eu besoin d’utiliser les namespaces. Sûrement que j’aurais fait autrement, ta méthode me paraît un peu compliqué et le on('disconnect') doublé me semble plutôt bancale (pas super pour la maintenance).

Bonjour,

Peut-être en évitant de choisir le mot clé réservé connection ?

space.on("connection", (socket) => { /* ... */ }

Après je n’ai jamais eu besoin d’utiliser les namespaces. Sûrement que j’aurais fait autrement, ta méthode me paraît un peu compliqué et le on('disconnect') doublé me semble plutôt bancale (pas super pour la maintenance).

Yarflam

Oui, je n’avais pas besoin d’utiliser les namespaces mais c’est pour expérimenter.

C’est pour la suite, on va devoir selectionner une jeu (Namespace) puis ensuite, pouvoir creer des salons (room). Je sais pas si je procéder autrement ?

Les étapes pour ce type de projets, je le vois ainsi :

  • Démarrer une connexion par Socket.
  • Identifier l’utilisateur (un registre avec l’ID du socket et ses infos).
  • Authentifier l’utilisateur (connexion via des identifiants et/ou choix d’un jeu).
  • Définir ses droits (mettre en place des règles pour identifier les ressources auxquelles il a accès - dans ton cas à l’un des jeux et à la liste des salons).
  • Traiter des opérations courantes (créer un salon, rejoindre, envoyer un message etc).
  • Stratégie de connexion / déconnexion (gestion des déconnexions, des cookies, switch entre fenêtres et onglets différents).

L’ensemble représente une liste d’utilisateurs, chacun disposant d’un état (identification + authentification + droits) te permettant de connaître les ressources accessibles ou au contraire bloquées / limitées à un instant T pour un utilisateur en particulier. Tout ceci n’a pas besoin d’être (à mon avis) dispatché dans un méandre de namespace.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte