diff --git a/server/internal/http/legacy/wstoclient.go b/server/internal/http/legacy/wstoclient.go index be5e4c88..932f1f56 100644 --- a/server/internal/http/legacy/wstoclient.go +++ b/server/internal/http/legacy/wstoclient.go @@ -165,6 +165,11 @@ func (s *session) wsToClient(msg []byte) error { return err } + // if profile change is the reason for disconnect, it's a kick event + if request.Message == "profile changed" { + request.Message = "kicked" + } + return s.toClient(&oldMessage.SystemMessage{ Event: oldEvent.SYSTEM_DISCONNECT, Message: request.Message, diff --git a/server/internal/session/session.go b/server/internal/session/session.go index 769b42af..61d7fc65 100644 --- a/server/internal/session/session.go +++ b/server/internal/session/session.go @@ -47,7 +47,12 @@ func (session *SessionCtx) profileChanged() { } if (!session.profile.CanConnect || !session.profile.CanLogin || !session.profile.CanWatch) && session.state.IsWatching { - session.GetWebRTCPeer().Destroy() + // TODO: Needed for legacy implementation. Websocket must die before webrtc and deliver signal close message + // otherwise webrtc destroy would trigger websocket reconnect. In case of kick event, webrtc destroy is called + // before websocket destroy that delivers the information about the kick. + time.AfterFunc(time.Second, func() { + session.GetWebRTCPeer().Destroy() + }) } if (!session.profile.CanConnect || !session.profile.CanLogin) && session.state.IsConnected {