How to add a username property to a client object in socket.io?
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
add a comment |
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
add a comment |
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
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
socket.io
edited Nov 22 at 15:38
asked Nov 22 at 12:35
user1063287
3,4081559129
3,4081559129
add a comment |
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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