|
'use strict'; |
|
|
|
|
|
|
|
|
|
|
|
var EventEmitter = require('events').EventEmitter; |
|
var Namespace = require('./namespace'); |
|
var Callbacks = require('./callbacks'); |
|
var Room = require('./room'); |
|
var inherits = require('./util').inherits; |
|
var Broadcast = require('./broadcast').init(Room); |
|
var handle = require('./handle'); |
|
var Message = require('./message'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var Socket = function Socket (socket, handle) { |
|
Socket.__super__.call(this); |
|
|
|
|
|
this.rooms = []; |
|
this.broadcast = Broadcast.bind(this); |
|
|
|
|
|
this._namespaces = {}; |
|
this._callbacks = new Callbacks(this.namespace('socket')); |
|
this._message = new Message(this._callbacks); |
|
|
|
this.join('all'); |
|
|
|
|
|
if (socket) this.connect(socket, handle); |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
inherits(Socket, EventEmitter); |
|
Socket.prototype._emit = EventEmitter.prototype.emit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.all = Room.get('all'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.in = Room.get; |
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.rooms = Room.rooms; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype._process = function _process (data) { |
|
var message = this._message.parse(data); |
|
var details = Namespace.parse(message.event); |
|
|
|
var arg1 = message.arg1; |
|
var arg2 = message.arg2; |
|
var arg3 = message.arg3; |
|
|
|
var event = details.event; |
|
var namespace = details.namespace; |
|
var ns = this._namespaces[namespace]; |
|
|
|
if (namespace && ns) { |
|
ns._emit(event, arg1, arg2, arg3); |
|
} |
|
|
|
this._emit(message.event, arg1, arg2, arg3); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype._handleWith = function _handleWith (name) { |
|
this._handle = handle(name); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.connect = function connect (socket, handle) { |
|
var self = this; |
|
|
|
if (handle) this._handleWith(handle); |
|
|
|
this.socket = socket; |
|
this.id = this._handle.identify(socket); |
|
|
|
this._handle.onread(this.socket, function handleOnRead (message) { |
|
self._process(message); |
|
}); |
|
|
|
this._handle.onopen(this.socket, function handleOnOpen (event) { |
|
self._emit('socket.open', event); |
|
}); |
|
|
|
this._handle.onerror(this.socket, function handleOnError (event) { |
|
self._emit('socket.error', event); |
|
}); |
|
|
|
this._handle.onclose(this.socket, function handleOnClose (status, message) { |
|
self.disconnect(); |
|
self._emit('socket.close', status, message); |
|
}); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.disconnect = function disconnect () { |
|
this._handle.release(this.socket); |
|
|
|
var len = this.rooms.length; |
|
for (var i = len - 1; i >= 0; i--) { |
|
this.leave(this.rooms[i]); |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.namespace = function namespace (name) { |
|
var ns = this._namespaces[name]; |
|
ns = ns ? ns : this._namespaces[name] = new Namespace(name, this); |
|
return ns; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.emit = function emit (event, arg1, arg2, arg3) { |
|
if (event === 'newListener' || event === 'removeListener') { |
|
return this._emit(event, arg1, arg2, arg3); |
|
} |
|
|
|
var message = this._message.serialize(event, arg1, arg2, arg3); |
|
|
|
this._handle.write(this.socket, message); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.join = function join (room) { |
|
var index = this.rooms.indexOf(room); |
|
if (index < 0) { |
|
this.rooms.push(room); |
|
room = Room.get(room); |
|
room._join(this); |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.leave = function leave (room) { |
|
var index = this.rooms.indexOf(room); |
|
if (index > -1) { |
|
this.rooms.splice(index, 1); |
|
room = Room.get(room); |
|
room._leave(this); |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.room = Room.get; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Socket.prototype.release = function release () { |
|
if (! this._message) return; |
|
|
|
this.disconnect(); |
|
|
|
for (var key in this._namespaces) { |
|
this._namespaces[key]._release(); |
|
} |
|
|
|
this._callbacks.release(); |
|
this._message.release(); |
|
|
|
delete this._namespaces; |
|
delete this._callbacks; |
|
delete this._message; |
|
delete this.socket; |
|
delete this.broadcast; |
|
delete this.rooms; |
|
delete this.id; |
|
delete this._handle; |
|
}; |
|
|
|
|
|
module.exports = Socket; |
|
|