|
'use strict'; |
|
|
|
|
|
|
|
|
|
|
|
var Namespace = require('./namespace'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
var Room = function Room (id) { |
|
this.id = id; |
|
this.sockets = []; |
|
this._namespaces = {}; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.rooms = {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.get = function get (id) { |
|
var room = Room.rooms[id]; |
|
if (! room) { |
|
room = Room.rooms[id] = new Room(id); |
|
} |
|
return room; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.flush = function flush () { |
|
for (var id in Room.rooms) { |
|
Room.get(id).empty(); |
|
delete Room.rooms[id]; |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype._join = function _join (socket) { |
|
if (this.sockets.indexOf(socket) < 0) { |
|
this.sockets.push(socket); |
|
} |
|
return this; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype._leave = function _leave (socket) { |
|
var index = this.sockets.indexOf(socket); |
|
if (index >= 0) { |
|
this.sockets.splice(index, 1); |
|
} |
|
return this; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.in = function in_ (id) { |
|
return Room.get(id); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.length = function length () { |
|
return this.sockets.length; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.emit = function emit (event, arg1, arg2, arg3) { |
|
for (var i = 0, len = this.sockets.length; i < len; i++) { |
|
this.sockets[i].emit(event, arg1, arg2, arg3); |
|
} |
|
return this; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.broadcast = function broadcast (sender, event, arg1, arg2, arg3) { |
|
for (var i = 0, len = this.sockets.length; i < len; i++) { |
|
var socket = this.sockets[i]; |
|
if (socket.id !== sender) { |
|
socket.emit(event, arg1, arg2, arg3); |
|
} |
|
} |
|
return this; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.namespace = function namespace (name) { |
|
var ns = this._namespaces[name]; |
|
ns = ns ? ns : this._namespaces[name] = new Namespace(name, this); |
|
return ns; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.contains = function contains (socket) { |
|
for (var i = 0, len = this.sockets.length; i < len; i++) { |
|
if (this.sockets[i] === socket) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.empty = function empty () { |
|
for (var i = this.sockets.length - 1; i >= 0; i--) { |
|
this._leave(this.sockets[i]); |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Room.prototype.release = function () { |
|
this.empty(); |
|
delete Room.rooms[this.id]; |
|
}; |
|
|
|
|
|
|
|
|
|
module.exports = Room; |
|
|