Socket.io: рд╕реЙрдХреЗрдЯ.рд░реВрдо рдПрдХ рдмреЗрдХрд╛рд░ рд╡рд╕реНрддреБ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдорд╛рд░реНрдЪ 2017  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: socketio/socket.io

рдпрд╣ рд╕реЙрдХреЗрдЯ.рд░реВрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ,

рдЗрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрдорд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд╣реИрд╢, рдХрдорд░реЗ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд╣реИ:

io.on('connection', function(socket){
  socket.join('room 237', function(){
    console.log(socket.rooms); // [ <socket.id>, 'room 237' ]
    io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room
  });
});

рдЬрдм рдореИрдВ console.log(socket.rooms); рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ _want_ рдЙрд╕ рд╕реБрдВрджрд░ рд╕рд░рдгреА (рддрд╛рдХрд┐ рдореИрдВ рдЯреБрдХрдбрд╝рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ)рдФрд░ рдмрд╕ рдХрдорд░реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдмрджрд╕реВрд░рдд рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдорд┐рд▓ рдЧрдИ:

io.on('connection', function(socket){
  socket.join('room 237', function(){
    console.log(socket.rooms); // { <socket.id>: '<socket.id>', 'room 237': 'room 237' }
  });
});

... рдЬрд┐рд╕реЗ рдореБрдЭреЗ .keys() рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╣рд╛рде рд╕реЗ socket.id рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ? рдореИрдВ 1.7.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╛рд╣ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реЙрдХреЗрдЯ рдЖрдИрдбреА "рдХрдорд░рд╛" рдХреНрдпреЛрдВ рд╣реИ?, рдпрд╛ рдХреБрдВрдЬреА рдХреНрдпреЛрдВ

['room1', 'room2', 'room3']

рдФрд░ рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, io.rooms рдЙрди рд╕рднреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рддреЛ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдорд░реЗ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА рдФрд░ рд╕реЙрдХреЗрдЯ рдЖрдИрдбреА рдХреА рдПрдХ рд╕рд░рдгреА рдЙрдирдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВред

{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдареАрдХ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рдЕрджреНрдпрддрд┐рдд рдирд╣реАрдВ рд╣реИ, rooms рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдереА рдЬрдм рддрдХ рдХрд┐ v1.4 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рдиреЛрдЯ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмреВрд▓рд┐рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рд╣реИред Socket.io рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢рд╛рдирджрд╛рд░ рдмрдирд╛рдПрдВ: рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВ!

рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдпрд╣рд╛рдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдХрдорд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ socket.id рдкрд╣рд▓реЗ рд╣реЛрдЧрд╛:

var rooms = socket.rooms.slice(1);

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

var roomKeys = Object.keys(socket.rooms);
var socketIdIndex = roomKeys.indexOf( socket.id );
var rooms = roomKeys.splice( socketIdIndex, 1 );

рдпрджрд┐ socket.id рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреЗ, рддреЛ рдпрд╣ рднреА рдареАрдХ рд╣реЛрддрд╛ред рдореИрдВ рдмрд╕ рдЗрд╕реЗ рдвреВрдВрдврдирд╛ рдФрд░ рдЗрд╕реЗ рдЪреБрдирдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред

var rooms = Object.keys(socket.rooms);

рдмреВрд▓рд┐рдпрди рдХреЗ рд╕рд╛рде, рдореИрдВ рдЗрд╕ рддрд░рд╣ (рджрд╛рдПрдВ?) рд╕рд╣реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛:

var roomKeys = Object.keys(socket.rooms);
var rooms = roomKeys.filter(function(key){ 
  return socket.rooms[key]==true;
});

рдЬреЛ indexOf() рд╕рд╛рде рдкреБрдирд░рд╛рд╡реГрддрд┐ рдЬрд┐рддрдирд╛ рд╣реА рдзреАрдорд╛ рд╣реИред

рдпрд╣ рдЙрди рдХрдорд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛, рдЬрд┐рдирдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдЪреИрдЯ рд░реВрдо рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХрд╣реАрдВ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдЧреА, рдЬреИрд╕реЗ Server рдЙрджрд╛рд╣рд░рдг:

var allRooms = io.rooms;
var myRooms = socket.rooms;

рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдХреА рд░рд╛рдп рд╣реИ?

рдпрд╛рд╣ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реЙрдХреЗрдЯ рдЖрдИрдбреА "рдХрдорд░рд╛" рдХреНрдпреЛрдВ рд╣реИ?, рдпрд╛ рдХреБрдВрдЬреА рдХреНрдпреЛрдВ

['room1', 'room2', 'room3']

рдФрд░ рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, io.rooms рдЙрди рд╕рднреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рддреЛ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдорд░реЗ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА рдФрд░ рд╕реЙрдХреЗрдЯ рдЖрдИрдбреА рдХреА рдПрдХ рд╕рд░рдгреА рдЙрдирдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВред

{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░рдг рд▓реБрдХрдЕрдк рдкреНрд░рджрд░реНрд╢рди рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 100 рдХрдорд░реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реБрдЖ рдерд╛, рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реБрдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рд╕рд░рдгреА рдорд╛рди рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХрдорд░реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реБрдЖ рдерд╛ред

рдкрд░ рдореЗрд░рд╛ рдЙрддреНрддрд░ рдХреЛ рджреЗрдЦреЗрдВ stackoverflow

{
    "room1":"room1",
    "room2":"room2",
    ...
    "room100":"room100"
}

рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдорд░реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реБрдЖ рд╣реИ:
if(socket.rooms[roomID]) return true;

рдпрджрд┐ рдпрд╣ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рд╣реИ рддреЛ рд╣рдореЗрдВ indexOf рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░рдгреА рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
if(socket.rooms.indexOf(roomID) != -1) return true;

рд▓реЗрдХрд┐рди рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдХреБрдВрдЬреА рдорд╛рди рдХреЛ рдмреВрд▓рд┐рдпрди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
{ room1: true, ... , room100: true }

рдпрд╣ рдХреБрдЫ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ рд╕реЙрдХреЗрдЯ рдмрджрд▓рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реЛрдЧреАред рдХрдорд░реЗ рддрд╛рдХрд┐ рдореВрд▓реНрдп рдмреВрд▓рд┐рдпрди рд╣реЛрдВред рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдареАрдХ рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ CONTRIBUTING.md рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреАред

рдХреНрдпрд╛ Set рдЕрдзрд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рд╣реЛрдЧрд╛?

if (socket.rooms.has(roomID)) return true;

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреЗрд╡рд▓ Set(4)┬а{"<socket ID>", "room1", "room2", "room3"}

рдореИрдВ рддрдм рддрдХ рд╕рд╣рдордд рд╣реВрдВ рдЬрдм рддрдХ рд╕реЗрдЯ рдХреА рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рд╕реНрдерд┐рд░ рд╣реИред рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдпрд╣ рд╣реИред

Socket.IO v3 рдореЗрдВ, Socket#rooms рдЕрдм рдПрдХ рд╕реЗрдЯ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдбреЗрдкреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

doughsay picture doughsay  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jloa picture jloa  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Elliot9 picture Elliot9  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dmuth picture dmuth  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

karmac2015 picture karmac2015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ