From e23f82134173158e3720e0eaa77898f4f6398931 Mon Sep 17 00:00:00 2001 From: hiveminded Date: Wed, 9 Aug 2017 13:31:56 +0300 Subject: [PATCH] fix websocket some times tries to emit to a disconnected client Former-commit-id: 026798e6bc587c902bfc9f92281aced406d628a5 --- websocket/emitter.go | 4 ++++ websocket/server.go | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/websocket/emitter.go b/websocket/emitter.go index 5827b24d..d77be364 100644 --- a/websocket/emitter.go +++ b/websocket/emitter.go @@ -34,6 +34,10 @@ func (e *emitter) EmitMessage(nativeMessage []byte) error { } func (e *emitter) Emit(event string, data interface{}) error { + if e.conn.server.rooms[e.to] == nil { + return nil + } + message, err := websocketMessageSerialize(event, data) if err != nil { return err diff --git a/websocket/server.go b/websocket/server.go index 50f54c16..cbfd7567 100644 --- a/websocket/server.go +++ b/websocket/server.go @@ -260,8 +260,9 @@ func (s *Server) LeaveAll(connID string) { // fire the on room leave connection's listeners s.connections.get(connID).fireOnLeave(name) // the connection is inside this room, lets remove it - s.rooms[name][i] = s.rooms[name][len(s.rooms[name])-1] - s.rooms[name] = s.rooms[name][:len(s.rooms[name])-1] + if i < len(s.rooms[name]) { + s.rooms[name] = append(s.rooms[name][:i], s.rooms[name][i+1:]...) + } } } } @@ -287,8 +288,7 @@ func (s *Server) leave(roomName string, connID string) (left bool) { if s.rooms[roomName] != nil { for i := range s.rooms[roomName] { if s.rooms[roomName][i] == connID { - s.rooms[roomName][i] = s.rooms[roomName][len(s.rooms[roomName])-1] - s.rooms[roomName] = s.rooms[roomName][:len(s.rooms[roomName])-1] + s.rooms[roomName] = append(s.rooms[roomName][:i], s.rooms[roomName][i+1:]...) left = true break }