Skip to content
Snippets Groups Projects
Commit 40f13188 authored by Atanamo's avatar Atanamo
Browse files

Fixed unregistering of disconnect events

parent 3012bffb
No related branches found
No related tags found
No related merge requests found
Loading
@@ -26,7 +26,7 @@ class Channel
Loading
@@ -26,7 +26,7 @@ class Channel
eventNameLeave: 'leave#unnamed' eventNameLeave: 'leave#unnamed'
eventNameDelete: 'delete#unnamed' eventNameDelete: 'delete#unnamed'
eventNameHistory: 'history#unnamed' eventNameHistory: 'history#unnamed'
listenerNameDisconnect: 'disconnectListener_unnamed'
   
constructor: (data) -> constructor: (data) ->
@_updateUniqueClientsMap() # Initialize map of unique clients @_updateUniqueClientsMap() # Initialize map of unique clients
Loading
@@ -43,6 +43,7 @@ class Channel
Loading
@@ -43,6 +43,7 @@ class Channel
@eventNameLeave = 'leave#' + @name @eventNameLeave = 'leave#' + @name
@eventNameDelete = 'delete#' + @name @eventNameDelete = 'delete#' + @name
@eventNameHistory = 'history#' + @name @eventNameHistory = 'history#' + @name
@listenerNameDisconnect = 'disconnectListener_' + @name
   
@getInstance: (channelData) -> @getInstance: (channelData) ->
name = channelData.name name = channelData.name
Loading
@@ -73,22 +74,30 @@ class Channel
Loading
@@ -73,22 +74,30 @@ class Channel
return Object.keys(clientsMap).length return Object.keys(clientsMap).length
   
_registerListeners: (clientSocket) -> _registerListeners: (clientSocket) ->
# Store callback for channel-specific disconnect on socket
clientSocket[@listenerNameDisconnect] = disconnectCallback = =>
@_handleClientLeave(clientSocket, true, true)
# Register channel-specific client events
clientSocket.on @eventNameMsg, (messageText) => @_handleClientMessage(clientSocket, messageText) clientSocket.on @eventNameMsg, (messageText) => @_handleClientMessage(clientSocket, messageText)
clientSocket.on @eventNameLeave, (isClose) => @_handleClientLeave(clientSocket, isClose) clientSocket.on @eventNameLeave, (isClose) => @_handleClientLeave(clientSocket, isClose)
clientSocket.on @eventNameDelete, => @_handleClientDeleteRequest(clientSocket) clientSocket.on @eventNameDelete, => @_handleClientDeleteRequest(clientSocket)
clientSocket.on @eventNameHistory, => @_handleClientHistoryRequest(clientSocket) clientSocket.on @eventNameHistory, => @_handleClientHistoryRequest(clientSocket)
clientSocket.on 'disconnect', => @_handleClientLeave(clientSocket, true) clientSocket.on 'disconnect', disconnectCallback
   
_unregisterListeners: (clientSocket) -> _unregisterListeners: (clientSocket) ->
# Deregister listeners
clientSocket.removeAllListeners @eventNameMsg clientSocket.removeAllListeners @eventNameMsg
clientSocket.removeAllListeners @eventNameLeave clientSocket.removeAllListeners @eventNameLeave
clientSocket.removeAllListeners @eventNameDelete clientSocket.removeAllListeners @eventNameDelete
clientSocket.removeAllListeners @eventNameHistory clientSocket.removeAllListeners @eventNameHistory
clientSocket.removeAllListeners 'disconnect' # TODO: Doesnt this remove disconnect listener on other channels, too? clientSocket.removeListener 'disconnect', clientSocket[@listenerNameDisconnect]
   
addClient: (clientSocket, isRejoin=false) -> addClient: (clientSocket, isRejoin=false) ->
return false if clientSocket.rooms.indexOf(@name) >= 0 # Cancel, if socket is already joined to channel return false if clientSocket.rooms.indexOf(@name) >= 0 # Cancel, if socket is already joined to channel
   
log.debug "Adding client '#{clientSocket.identity.getName()}' to channel '#{@name}'"
isExistingIdentity = @_hasUniqueClient(clientSocket) isExistingIdentity = @_hasUniqueClient(clientSocket)
   
channelInfo = channelInfo =
Loading
@@ -128,9 +137,11 @@ class Channel
Loading
@@ -128,9 +137,11 @@ class Channel
   
return true return true
   
removeClient: (clientSocket, isClose=false) -> removeClient: (clientSocket, isClose=false, isDisconnect=false) ->
return false unless clientSocket.rooms.indexOf(@name) >= 0 # Cancel, if socket is not joined to channel return false unless clientSocket.rooms.indexOf(@name) >= 0 # Cancel, if socket is not joined to channel
   
log.debug "Removing client #{clientSocket.identity.getName()} from channel '#{@name}' (by close: #{isClose})"
# Unregister events for this channel # Unregister events for this channel
@_unregisterListeners(clientSocket) @_unregisterListeners(clientSocket)
   
Loading
@@ -151,7 +162,7 @@ class Channel
Loading
@@ -151,7 +162,7 @@ class Channel
if @isPublic if @isPublic
@_sendUserNumberToRoom() @_sendUserNumberToRoom()
else else
leaveAction = if isClose then 'quit' else 'part' leaveAction = if isDisconnect then 'quit' else 'part'
@_sendUserChangeToRoom('remove', leaveAction, clientSocket.identity) @_sendUserChangeToRoom('remove', leaveAction, clientSocket.identity)
@_sendUserListToRoom() @_sendUserListToRoom()
   
Loading
@@ -168,6 +179,8 @@ class Channel
Loading
@@ -168,6 +179,8 @@ class Channel
_deleteByClient: (clientSocket, customRoutine=null) -> _deleteByClient: (clientSocket, customRoutine=null) ->
return false unless clientSocket.rooms.indexOf(@name) >= 0 # Cancel, if socket is not joined to channel return false unless clientSocket.rooms.indexOf(@name) >= 0 # Cancel, if socket is not joined to channel
   
log.debug "Deleting channel '#{@name}' by client #{clientSocket.identity.getName()}"
# Unregister events for this channel # Unregister events for this channel
@_unregisterListeners(clientSocket) @_unregisterListeners(clientSocket)
   
Loading
@@ -289,7 +302,7 @@ class Channel
Loading
@@ -289,7 +302,7 @@ class Channel
   
# May be overridden # May be overridden
# @protected # @protected
_handleClientMessage: (clientSocket, messageText) => _handleClientMessage: (clientSocket, messageText) ->
log.debug "Client message to '#{@name}':", messageText log.debug "Client message to '#{@name}':", messageText
messageText = messageText?.trim() or '' messageText = messageText?.trim() or ''
return if messageText is '' return if messageText is ''
Loading
@@ -299,21 +312,19 @@ class Channel
Loading
@@ -299,21 +312,19 @@ class Channel
log.debug "Client requests chat history for '#{@name}'" log.debug "Client requests chat history for '#{@name}'"
@_sendHistoryToSocket(clientSocket) @_sendHistoryToSocket(clientSocket)
   
_handleClientLeave: (clientSocket, isClose=false) => _handleClientLeave: (clientSocket, isClose=false, isDisconnect=false) ->
if not isClose and clientSocket.identity.getUserID() is @creatorID if not isClose and clientSocket.identity.getUserID() is @creatorID
# Disallow permanent leaving on channels created by the client # Disallow permanent leaving on channels created by the client
@_sendToSocket(clientSocket, 'leave_fail', 'Cannot leave own channels') @_sendToSocket(clientSocket, 'leave_fail', 'Cannot leave own channels')
else else
log.debug "Removing client from channel '#{@name}' (by close: #{isClose}):", clientSocket.identity @removeClient(clientSocket, isClose, isDisconnect)
@removeClient(clientSocket, isClose)
   
_handleClientDeleteRequest: (clientSocket) => _handleClientDeleteRequest: (clientSocket) ->
if clientSocket.identity.getUserID() isnt @creatorID if clientSocket.identity.getUserID() isnt @creatorID
@_sendToSocket(clientSocket, 'delete_fail', 'Can only delete own channels') @_sendToSocket(clientSocket, 'delete_fail', 'Can only delete own channels')
else if @getNumberOfClients() > 1 else if @getNumberOfClients() > 1
@_sendToSocket(clientSocket, 'delete_fail', 'Can only delete empty channels') @_sendToSocket(clientSocket, 'delete_fail', 'Can only delete empty channels')
else else
log.debug "Deleting channel '#{@name}' by client #{clientSocket.identity.getName()}"
@_deleteByClient(clientSocket) @_deleteByClient(clientSocket)
   
   
Loading
Loading
Loading
@@ -25,6 +25,10 @@ module.exports.warn = (text, sender='General') ->
Loading
@@ -25,6 +25,10 @@ module.exports.warn = (text, sender='General') ->
   
module.exports.error = (textOrError, sender='General') -> module.exports.error = (textOrError, sender='General') ->
if textOrError instanceof Error if textOrError instanceof Error
textOrError = if textOrError.message? then textOrError.message else textOrError.toString?() or textOrError errObject = textOrError
textOrError = if errObject.message? then errObject.message else errObject.toString?() or errObject
console.error "!! #{getTimestamp()} ERROR by #{sender}:", textOrError console.error "!! #{getTimestamp()} ERROR by #{sender}:", textOrError
if errObject?
console.error ''
console.error(errObject.stack)
console.error ''
Loading
@@ -71,7 +71,7 @@ class Gateway
Loading
@@ -71,7 +71,7 @@ class Gateway
return @botManager.start() return @botManager.start()
   
# Start listening for socket.io emits and for HTTP requests # Start listening for socket.io emits and for HTTP requests
startupPromise.then => startupPromise = startupPromise.then =>
log.info 'Start listening...' log.info 'Start listening...'
server.listen(Config.WEB_SERVER_PORT) server.listen(Config.WEB_SERVER_PORT)
   
Loading
Loading
Loading
@@ -23,12 +23,16 @@ class SocketHandler
Loading
@@ -23,12 +23,16 @@ class SocketHandler
@_bindSocketGlobalEvents() @_bindSocketGlobalEvents()
   
_bindSocketGlobalEvents: -> _bindSocketGlobalEvents: ->
## Register common websocket events # Register common websocket events
io.sockets.on 'connection', @_handleClientConnect # Build-in event io.sockets.on 'connection', @_handleClientConnect # Build-in event
   
_bindSocketClientEvents: (clientSocket) -> _bindSocketClientEvents: (clientSocket) ->
## Register client socket events # Store callback for disconnect on socket
clientSocket.on 'disconnect', => @_handleClientDisconnect(clientSocket) # Build-in event clientSocket.disconnectListener = =>
@_handleClientDisconnect(clientSocket)
# Register client socket events
clientSocket.on 'disconnect', clientSocket.disconnectListener # Build-in event
clientSocket.on 'auth', (authData) => @_handleClientAuthRequest(clientSocket, authData) clientSocket.on 'auth', (authData) => @_handleClientAuthRequest(clientSocket, authData)
   
_bindSocketClientAuthorizedEvents: (clientSocket) -> _bindSocketClientAuthorizedEvents: (clientSocket) ->
Loading
@@ -41,10 +45,11 @@ class SocketHandler
Loading
@@ -41,10 +45,11 @@ class SocketHandler
   
_handleClientDisconnect: (clientSocket) => _handleClientDisconnect: (clientSocket) =>
log.debug 'Client disconnected...' log.debug 'Client disconnected...'
# Deregister listeners
clientSocket.isDisconnected = true clientSocket.isDisconnected = true
clientSocket.removeAllListeners() # Deregister listeners
#clientSocket.removeAllListeners 'disconnect' clientSocket.removeListener 'disconnect', clientSocket.disconnectListener
clientSocket.removeAllListeners 'auth'
clientSocket.removeAllListeners 'join'
   
_handleClientAuthRequest: (clientSocket, authData) => _handleClientAuthRequest: (clientSocket, authData) =>
log.debug 'Client requests auth...' log.debug 'Client requests auth...'
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment