How to add a username property to a client object in socket.io?












0














Environment



socket.io 2.1.1 
express 4.16.3
Node v10.13.0


Desired Behaviour



When a client joins a room, all clients in the room receive a list of all clients in the room, including each client's custom socket.username property.



What I've Tried



Attempt 01:



Use the clients() method with a callback, see:



https://socket.io/docs/server-api/#namespace-clients-callback.



socket.on('join', function(data) {
// get desired room name
var room = data.room;
// get username
var username = data.username;
// add username key:value to socket
socket.username = username;
// add socket to room
socket.join(room);

// get list of clients in room
io.of('/').in(room).clients((error, clients) => {
if (error) {
throw error;
} else {
// send data to all clients in room
io.in(room).emit('room_join', { username: socket.username, room: room, clients: clients });
}
});
});


In the above example, clients is returned as an array of socket id's.



Attempt 02:



Use io.sockets.adapter.rooms[room], inspired by this answer:



socket.on('join', function(data) {
var room = data.room;
var username = data.username;
socket.username = username;
socket.join(room);
var sockets_in_room = io.sockets.adapter.rooms[room];
io.in(room).emit('room_join', { username: socket.username, room: room, sockets_in_room: sockets_in_room });
});


The above returns:



Room { sockets: { '3-fHYqg7e8h-6K8EAAAC': true }, length: 1 }


Question



It seems a custom username property can be added to a socket with:



socket.username= "john";


How can that property be accessible in a list of "client objects" so that the usernames of all clients in a room are accessible?



Edit 1



In case it is relevant, there are possibly thousands of rooms in this scenario, with each room name derived from a unique content id, so any solutions need to accommodate that constraint.



Edit 2



I made the following and it seems to be working, not sure if heading in right direction or not:



var users_in_rooms = {};

io.on('connection', function(socket) {

// handle joining
socket.on('join', function(data) {
var room = data.room;
var username = data.username;
socket.username = username;
socket.join(room);
// add key:value to users_in_rooms object
users_in_rooms[socket.id] = username;

// get list of clients in room
io.of('/').in(room).clients((error, clients) => {
if (error) {
throw error;
} else {
// for each socket id in the clients array, look up its corresponding username
var client_object_array = clients.map(socketid => ({
socketid: socketid,
username: users_in_rooms[socketid]
}));
// return client_object_array to all clients
io.in(room).emit('room_join', { client_object_array: client_object_array, username: socket.username, room: room });
}
});
});

// handle leaving
socket.on('leave_all', function() {
socket.leaveAll();
// when a user leaves all rooms, delete their corresponding entry from the users_in_rooms object
delete users_in_rooms[socket.id];
});

// handle disconnecting
socket.on('disconnect', function(reason) {
console.log("client " + socket.id + " disconnected because:");
console.log(reason);
delete users_in_rooms[socket.id];
});

});









share|improve this question





























    0














    Environment



    socket.io 2.1.1 
    express 4.16.3
    Node v10.13.0


    Desired Behaviour



    When a client joins a room, all clients in the room receive a list of all clients in the room, including each client's custom socket.username property.



    What I've Tried



    Attempt 01:



    Use the clients() method with a callback, see:



    https://socket.io/docs/server-api/#namespace-clients-callback.



    socket.on('join', function(data) {
    // get desired room name
    var room = data.room;
    // get username
    var username = data.username;
    // add username key:value to socket
    socket.username = username;
    // add socket to room
    socket.join(room);

    // get list of clients in room
    io.of('/').in(room).clients((error, clients) => {
    if (error) {
    throw error;
    } else {
    // send data to all clients in room
    io.in(room).emit('room_join', { username: socket.username, room: room, clients: clients });
    }
    });
    });


    In the above example, clients is returned as an array of socket id's.



    Attempt 02:



    Use io.sockets.adapter.rooms[room], inspired by this answer:



    socket.on('join', function(data) {
    var room = data.room;
    var username = data.username;
    socket.username = username;
    socket.join(room);
    var sockets_in_room = io.sockets.adapter.rooms[room];
    io.in(room).emit('room_join', { username: socket.username, room: room, sockets_in_room: sockets_in_room });
    });


    The above returns:



    Room { sockets: { '3-fHYqg7e8h-6K8EAAAC': true }, length: 1 }


    Question



    It seems a custom username property can be added to a socket with:



    socket.username= "john";


    How can that property be accessible in a list of "client objects" so that the usernames of all clients in a room are accessible?



    Edit 1



    In case it is relevant, there are possibly thousands of rooms in this scenario, with each room name derived from a unique content id, so any solutions need to accommodate that constraint.



    Edit 2



    I made the following and it seems to be working, not sure if heading in right direction or not:



    var users_in_rooms = {};

    io.on('connection', function(socket) {

    // handle joining
    socket.on('join', function(data) {
    var room = data.room;
    var username = data.username;
    socket.username = username;
    socket.join(room);
    // add key:value to users_in_rooms object
    users_in_rooms[socket.id] = username;

    // get list of clients in room
    io.of('/').in(room).clients((error, clients) => {
    if (error) {
    throw error;
    } else {
    // for each socket id in the clients array, look up its corresponding username
    var client_object_array = clients.map(socketid => ({
    socketid: socketid,
    username: users_in_rooms[socketid]
    }));
    // return client_object_array to all clients
    io.in(room).emit('room_join', { client_object_array: client_object_array, username: socket.username, room: room });
    }
    });
    });

    // handle leaving
    socket.on('leave_all', function() {
    socket.leaveAll();
    // when a user leaves all rooms, delete their corresponding entry from the users_in_rooms object
    delete users_in_rooms[socket.id];
    });

    // handle disconnecting
    socket.on('disconnect', function(reason) {
    console.log("client " + socket.id + " disconnected because:");
    console.log(reason);
    delete users_in_rooms[socket.id];
    });

    });









    share|improve this question



























      0












      0








      0







      Environment



      socket.io 2.1.1 
      express 4.16.3
      Node v10.13.0


      Desired Behaviour



      When a client joins a room, all clients in the room receive a list of all clients in the room, including each client's custom socket.username property.



      What I've Tried



      Attempt 01:



      Use the clients() method with a callback, see:



      https://socket.io/docs/server-api/#namespace-clients-callback.



      socket.on('join', function(data) {
      // get desired room name
      var room = data.room;
      // get username
      var username = data.username;
      // add username key:value to socket
      socket.username = username;
      // add socket to room
      socket.join(room);

      // get list of clients in room
      io.of('/').in(room).clients((error, clients) => {
      if (error) {
      throw error;
      } else {
      // send data to all clients in room
      io.in(room).emit('room_join', { username: socket.username, room: room, clients: clients });
      }
      });
      });


      In the above example, clients is returned as an array of socket id's.



      Attempt 02:



      Use io.sockets.adapter.rooms[room], inspired by this answer:



      socket.on('join', function(data) {
      var room = data.room;
      var username = data.username;
      socket.username = username;
      socket.join(room);
      var sockets_in_room = io.sockets.adapter.rooms[room];
      io.in(room).emit('room_join', { username: socket.username, room: room, sockets_in_room: sockets_in_room });
      });


      The above returns:



      Room { sockets: { '3-fHYqg7e8h-6K8EAAAC': true }, length: 1 }


      Question



      It seems a custom username property can be added to a socket with:



      socket.username= "john";


      How can that property be accessible in a list of "client objects" so that the usernames of all clients in a room are accessible?



      Edit 1



      In case it is relevant, there are possibly thousands of rooms in this scenario, with each room name derived from a unique content id, so any solutions need to accommodate that constraint.



      Edit 2



      I made the following and it seems to be working, not sure if heading in right direction or not:



      var users_in_rooms = {};

      io.on('connection', function(socket) {

      // handle joining
      socket.on('join', function(data) {
      var room = data.room;
      var username = data.username;
      socket.username = username;
      socket.join(room);
      // add key:value to users_in_rooms object
      users_in_rooms[socket.id] = username;

      // get list of clients in room
      io.of('/').in(room).clients((error, clients) => {
      if (error) {
      throw error;
      } else {
      // for each socket id in the clients array, look up its corresponding username
      var client_object_array = clients.map(socketid => ({
      socketid: socketid,
      username: users_in_rooms[socketid]
      }));
      // return client_object_array to all clients
      io.in(room).emit('room_join', { client_object_array: client_object_array, username: socket.username, room: room });
      }
      });
      });

      // handle leaving
      socket.on('leave_all', function() {
      socket.leaveAll();
      // when a user leaves all rooms, delete their corresponding entry from the users_in_rooms object
      delete users_in_rooms[socket.id];
      });

      // handle disconnecting
      socket.on('disconnect', function(reason) {
      console.log("client " + socket.id + " disconnected because:");
      console.log(reason);
      delete users_in_rooms[socket.id];
      });

      });









      share|improve this question















      Environment



      socket.io 2.1.1 
      express 4.16.3
      Node v10.13.0


      Desired Behaviour



      When a client joins a room, all clients in the room receive a list of all clients in the room, including each client's custom socket.username property.



      What I've Tried



      Attempt 01:



      Use the clients() method with a callback, see:



      https://socket.io/docs/server-api/#namespace-clients-callback.



      socket.on('join', function(data) {
      // get desired room name
      var room = data.room;
      // get username
      var username = data.username;
      // add username key:value to socket
      socket.username = username;
      // add socket to room
      socket.join(room);

      // get list of clients in room
      io.of('/').in(room).clients((error, clients) => {
      if (error) {
      throw error;
      } else {
      // send data to all clients in room
      io.in(room).emit('room_join', { username: socket.username, room: room, clients: clients });
      }
      });
      });


      In the above example, clients is returned as an array of socket id's.



      Attempt 02:



      Use io.sockets.adapter.rooms[room], inspired by this answer:



      socket.on('join', function(data) {
      var room = data.room;
      var username = data.username;
      socket.username = username;
      socket.join(room);
      var sockets_in_room = io.sockets.adapter.rooms[room];
      io.in(room).emit('room_join', { username: socket.username, room: room, sockets_in_room: sockets_in_room });
      });


      The above returns:



      Room { sockets: { '3-fHYqg7e8h-6K8EAAAC': true }, length: 1 }


      Question



      It seems a custom username property can be added to a socket with:



      socket.username= "john";


      How can that property be accessible in a list of "client objects" so that the usernames of all clients in a room are accessible?



      Edit 1



      In case it is relevant, there are possibly thousands of rooms in this scenario, with each room name derived from a unique content id, so any solutions need to accommodate that constraint.



      Edit 2



      I made the following and it seems to be working, not sure if heading in right direction or not:



      var users_in_rooms = {};

      io.on('connection', function(socket) {

      // handle joining
      socket.on('join', function(data) {
      var room = data.room;
      var username = data.username;
      socket.username = username;
      socket.join(room);
      // add key:value to users_in_rooms object
      users_in_rooms[socket.id] = username;

      // get list of clients in room
      io.of('/').in(room).clients((error, clients) => {
      if (error) {
      throw error;
      } else {
      // for each socket id in the clients array, look up its corresponding username
      var client_object_array = clients.map(socketid => ({
      socketid: socketid,
      username: users_in_rooms[socketid]
      }));
      // return client_object_array to all clients
      io.in(room).emit('room_join', { client_object_array: client_object_array, username: socket.username, room: room });
      }
      });
      });

      // handle leaving
      socket.on('leave_all', function() {
      socket.leaveAll();
      // when a user leaves all rooms, delete their corresponding entry from the users_in_rooms object
      delete users_in_rooms[socket.id];
      });

      // handle disconnecting
      socket.on('disconnect', function(reason) {
      console.log("client " + socket.id + " disconnected because:");
      console.log(reason);
      delete users_in_rooms[socket.id];
      });

      });






      socket.io






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 22 at 15:38

























      asked Nov 22 at 12:35









      user1063287

      3,4081559129




      3,4081559129





























          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431189%2fhow-to-add-a-username-property-to-a-client-object-in-socket-io%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431189%2fhow-to-add-a-username-property-to-a-client-object-in-socket-io%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Berounka

          Sphinx de Gizeh

          Different font size/position of beamer's navigation symbols template's content depending on regular/plain...