diff --git a/internal/api/room/control.go b/internal/api/room/control.go index 2e895010..7de66153 100644 --- a/internal/api/room/control.go +++ b/internal/api/room/control.go @@ -6,8 +6,6 @@ import ( "github.com/go-chi/chi" "demodesk/neko/internal/http/auth" - "demodesk/neko/internal/types/event" - "demodesk/neko/internal/types/message" "demodesk/neko/internal/utils" ) @@ -50,13 +48,6 @@ func (h *RoomHandler) controlRequest(w http.ResponseWriter, r *http.Request) { h.sessions.SetHost(session) - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: true, - HostID: session.ID(), - }, nil) - utils.HttpSuccess(w) } @@ -75,12 +66,6 @@ func (h *RoomHandler) controlRelease(w http.ResponseWriter, r *http.Request) { h.desktop.ResetKeys() h.sessions.ClearHost() - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: false, - }, nil) - utils.HttpSuccess(w) } @@ -93,13 +78,6 @@ func (h *RoomHandler) controlTake(w http.ResponseWriter, r *http.Request) { h.sessions.SetHost(session) - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: true, - HostID: session.ID(), - }, nil) - utils.HttpSuccess(w) } @@ -119,13 +97,6 @@ func (h *RoomHandler) controlGive(w http.ResponseWriter, r *http.Request) { h.sessions.SetHost(target) - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: true, - HostID: target.ID(), - }, nil) - utils.HttpSuccess(w) } @@ -139,11 +110,5 @@ func (h *RoomHandler) controlReset(w http.ResponseWriter, r *http.Request) { h.desktop.ResetKeys() h.sessions.ClearHost() - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: false, - }, nil) - utils.HttpSuccess(w) } diff --git a/internal/session/manager.go b/internal/session/manager.go index 8208692b..2a4120b8 100644 --- a/internal/session/manager.go +++ b/internal/session/manager.go @@ -35,10 +35,6 @@ type SessionManagerCtx struct { emmiter events.EventEmmiter } -// --- -// sessions -// --- - func (manager *SessionManagerCtx) Create(id string, profile types.MemberProfile) (types.Session, error) { manager.sessionsMu.Lock() @@ -125,10 +121,10 @@ func (manager *SessionManagerCtx) List() []types.Session { func (manager *SessionManagerCtx) SetHost(host types.Session) { manager.hostMu.Lock() - defer manager.hostMu.Unlock() - manager.host = host - manager.emmiter.Emit("host", host) + manager.hostMu.Unlock() + + manager.emmiter.Emit("host_changed", host) } func (manager *SessionManagerCtx) GetHost() types.Session { @@ -139,12 +135,7 @@ func (manager *SessionManagerCtx) GetHost() types.Session { } func (manager *SessionManagerCtx) ClearHost() { - manager.hostMu.Lock() - defer manager.hostMu.Unlock() - - host := manager.host - manager.host = nil - manager.emmiter.Emit("host_cleared", host) + manager.SetHost(nil) } // --- @@ -197,18 +188,6 @@ func (manager *SessionManagerCtx) AdminBroadcast(v interface{}, exclude interfac // events // --- -func (manager *SessionManagerCtx) OnHost(listener func(session types.Session)) { - manager.emmiter.On("host", func(payload ...interface{}) { - listener(payload[0].(*SessionCtx)) - }) -} - -func (manager *SessionManagerCtx) OnHostCleared(listener func(session types.Session)) { - manager.emmiter.On("host_cleared", func(payload ...interface{}) { - listener(payload[0].(*SessionCtx)) - }) -} - func (manager *SessionManagerCtx) OnCreated(listener func(session types.Session)) { manager.emmiter.On("created", func(payload ...interface{}) { listener(payload[0].(*SessionCtx)) @@ -245,6 +224,16 @@ func (manager *SessionManagerCtx) OnStateChanged(listener func(session types.Ses }) } +func (manager *SessionManagerCtx) OnHostChanged(listener func(session types.Session)) { + manager.emmiter.On("host_changed", func(payload ...interface{}) { + if payload[0] == nil { + listener(nil) + } else { + listener(payload[0].(*SessionCtx)) + } + }) +} + // --- // config // --- diff --git a/internal/session/session.go b/internal/session/session.go index 0311cf6f..c58dfdbf 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -63,12 +63,6 @@ func (session *SessionCtx) GetProfile() types.MemberProfile { func (session *SessionCtx) profileChanged() { if !session.CanHost() && session.IsHost() { session.manager.ClearHost() - - session.manager.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: false, - }, nil) } if !session.CanWatch() && session.state.IsWatching { diff --git a/internal/types/session.go b/internal/types/session.go index 912bf760..54328f71 100644 --- a/internal/types/session.go +++ b/internal/types/session.go @@ -72,14 +72,13 @@ type SessionManager interface { Broadcast(v interface{}, exclude interface{}) AdminBroadcast(v interface{}, exclude interface{}) - OnHost(listener func(session Session)) - OnHostCleared(listener func(session Session)) OnCreated(listener func(session Session)) OnDeleted(listener func(session Session)) OnConnected(listener func(session Session)) OnDisconnected(listener func(session Session)) OnProfileChanged(listener func(session Session)) OnStateChanged(listener func(session Session)) + OnHostChanged(listener func(session Session)) ImplicitHosting() bool diff --git a/internal/websocket/handler/control.go b/internal/websocket/handler/control.go index 69697c02..580098df 100644 --- a/internal/websocket/handler/control.go +++ b/internal/websocket/handler/control.go @@ -20,12 +20,6 @@ func (h *MessageHandlerCtx) controlRelease(session types.Session) error { h.desktop.ResetKeys() h.sessions.ClearHost() - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: false, - }, nil) - return nil } @@ -53,12 +47,6 @@ func (h *MessageHandlerCtx) controlRequest(session types.Session) error { } h.sessions.SetHost(session) - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: true, - HostID: session.ID(), - }, nil) return nil } diff --git a/internal/websocket/handler/session.go b/internal/websocket/handler/session.go index 522b2908..6bad4854 100644 --- a/internal/websocket/handler/session.go +++ b/internal/websocket/handler/session.go @@ -47,12 +47,6 @@ func (h *MessageHandlerCtx) SessionDisconnected(session types.Session) error { if session.IsHost() { h.desktop.ResetKeys() h.sessions.ClearHost() - - h.sessions.Broadcast( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: false, - }, nil) } return h.SessionStateChanged(session) diff --git a/internal/websocket/manager.go b/internal/websocket/manager.go index 613dd34e..4237e5e7 100644 --- a/internal/websocket/manager.go +++ b/internal/websocket/manager.go @@ -92,6 +92,19 @@ func (manager *WebSocketManagerCtx) Start() { } }) + manager.sessions.OnHostChanged(func(session types.Session) { + msg := message.ControlHost{ + Event: event.CONTROL_HOST, + HasHost: session != nil, + } + + if msg.HasHost { + msg.HostID = session.ID() + } + + manager.sessions.Broadcast(msg, nil) + }) + manager.desktop.OnClipboardUpdated(func() { session := manager.sessions.GetHost() if session == nil || !session.CanAccessClipboard() {