diff --git a/internal/api/members/crud.go b/internal/api/members/crud.go index 357c27e1..a306b6bf 100644 --- a/internal/api/members/crud.go +++ b/internal/api/members/crud.go @@ -12,14 +12,15 @@ type MemberCreatePayload struct { } type MemberDataPayload struct { - ID string `json:"id"` - Secret string `json:"secret,omitempty"` - Name string `json:"name"` - IsAdmin bool `json:"is_admin"` - //Enabled bool `json:"enabled"` - //CanControl bool `json:"can_control"` - //CanWatch bool `json:"can_watch"` - //ClipboardAccess bool `json:"clipboard_access"` + ID string `json:"id"` + Secret string `json:"secret,omitempty"` + Name string `json:"name"` + IsAdmin bool `json:"is_admin"` + CanLogin bool `json:"can_login"` + CanConnect bool `json:"can_connect"` + CanWatch bool `json:"can_watch"` + CanHost bool `json:"can_host"` + CanAccessClipboard bool `json:"can_access_clipboard"` } func (h *MembersHandler) membersCreate(w http.ResponseWriter, r *http.Request) { diff --git a/internal/session/manager.go b/internal/session/manager.go index 96edc152..6b35e01e 100644 --- a/internal/session/manager.go +++ b/internal/session/manager.go @@ -238,6 +238,18 @@ func (manager *SessionManagerCtx) OnDisconnected(listener func(session types.Ses }) } +func (manager *SessionManagerCtx) OnReceivingStarted(listener func(session types.Session)) { + manager.emmiter.On("receiving_started", func(payload ...interface{}) { + listener(payload[0].(*SessionCtx)) + }) +} + +func (manager *SessionManagerCtx) OnReceivingStopped(listener func(session types.Session)) { + manager.emmiter.On("receiving_stopped", func(payload ...interface{}) { + listener(payload[0].(*SessionCtx)) + }) +} + // --- // config // --- diff --git a/internal/session/session.go b/internal/session/session.go index 8da9c08b..0e280aa2 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -23,6 +23,14 @@ func (session *SessionCtx) ID() string { return session.id } +// --- +// profile +// --- + +func (session *SessionCtx) VerifySecret(secret string) bool { + return session.profile.Secret == secret +} + func (session *SessionCtx) Name() string { return session.profile.Name } @@ -31,55 +39,44 @@ func (session *SessionCtx) IsAdmin() bool { return session.profile.IsAdmin } +func (session *SessionCtx) CanLogin() bool { + return session.profile.CanLogin +} + +func (session *SessionCtx) CanConnect() bool { + return session.profile.CanConnect +} + +func (session *SessionCtx) CanWatch() bool { + return session.profile.CanWatch +} + +func (session *SessionCtx) CanHost() bool { + return session.profile.CanHost +} + +func (session *SessionCtx) CanAccessClipboard() bool { + return session.profile.CanAccessClipboard +} + +func (session *SessionCtx) SetProfile(profile types.MemberProfile) { + session.profile = profile +} + +// --- +// runtime +// --- + func (session *SessionCtx) IsHost() bool { return session.manager.host != nil && session.manager.host.ID() == session.ID() } -func (session *SessionCtx) VerifySecret(secret string) bool { - return session.profile.Secret == secret -} - func (session *SessionCtx) IsConnected() bool { - // TODO: Refactor. - return session.websocket_connected// && session.webrtc_connected + return session.websocket_connected } -func (session *SessionCtx) SetWebSocketPeer(websocket_peer types.WebSocketPeer) { - session.websocket_peer = websocket_peer -} - -func (session *SessionCtx) SetWebSocketConnected(connected bool) { - if connected { - session.websocket_connected = true - - // TODO: Refactor. - //session.manager.emmiter.Emit("websocket_connected", session) - session.manager.emmiter.Emit("connected", session) - } else { - session.websocket_connected = false - - // TODO: Refactor. - //session.manager.emmiter.Emit("websocket_disconnected", session) - session.manager.emmiter.Emit("disconnected", session) - - session.websocket_peer = nil - } -} - -func (session *SessionCtx) SetWebRTCPeer(webrtc_peer types.WebRTCPeer) { - session.webrtc_peer = webrtc_peer -} - -func (session *SessionCtx) SetWebRTCConnected(connected bool) { - if connected { - session.webrtc_connected = true - session.manager.emmiter.Emit("webrtc_connected", session) - } else { - session.webrtc_connected = false - session.manager.emmiter.Emit("webrtc_disconnected", session) - - session.webrtc_peer = nil - } +func (session *SessionCtx) IsReceiving() bool { + return session.webrtc_connected } func (session *SessionCtx) Disconnect(reason string) error { @@ -106,6 +103,25 @@ func (session *SessionCtx) Disconnect(reason string) error { return nil } +// --- +// webscoket +// --- + +func (session *SessionCtx) SetWebSocketPeer(websocket_peer types.WebSocketPeer) { + session.websocket_peer = websocket_peer +} + +func (session *SessionCtx) SetWebSocketConnected(connected bool) { + if connected { + session.websocket_connected = true + session.manager.emmiter.Emit("connected", session) + } else { + session.websocket_connected = false + session.manager.emmiter.Emit("disconnected", session) + session.websocket_peer = nil + } +} + func (session *SessionCtx) Send(v interface{}) error { if session.websocket_peer == nil { return nil @@ -114,6 +130,25 @@ func (session *SessionCtx) Send(v interface{}) error { return session.websocket_peer.Send(v) } +// --- +// webrtc +// --- + +func (session *SessionCtx) SetWebRTCPeer(webrtc_peer types.WebRTCPeer) { + session.webrtc_peer = webrtc_peer +} + +func (session *SessionCtx) SetWebRTCConnected(connected bool) { + if connected { + session.webrtc_connected = true + session.manager.emmiter.Emit("receiving_started", session) + } else { + session.webrtc_connected = false + session.manager.emmiter.Emit("receiving_stopped", session) + session.webrtc_peer = nil + } +} + func (session *SessionCtx) SignalAnswer(sdp string) error { if session.webrtc_peer == nil { return nil diff --git a/internal/types/session.go b/internal/types/session.go index 52e1cc81..fc9342d2 100644 --- a/internal/types/session.go +++ b/internal/types/session.go @@ -3,29 +3,41 @@ package types import "net/http" type MemberProfile struct { - ID string - Secret string - Name string - IsAdmin bool - //Enabled bool - //CanControl bool - //CanWatch bool - //ClipboardAccess bool + Secret string + Name string + + IsAdmin bool + CanLogin bool + CanConnect bool + CanWatch bool + CanHost bool + CanAccessClipboard bool } type Session interface { ID() string + + VerifySecret(secret string) bool Name() string IsAdmin() bool + CanLogin() bool + CanConnect() bool + CanWatch() bool + CanHost() bool + CanAccessClipboard() bool + SetProfile(profile MemberProfile) + IsHost() bool IsConnected() bool - VerifySecret(secret string) bool + IsReceiving() bool + Disconnect(reason string) error + SetWebSocketPeer(websocket_peer WebSocketPeer) SetWebSocketConnected(connected bool) + Send(v interface{}) error + SetWebRTCPeer(webrtc_peer WebRTCPeer) SetWebRTCConnected(connected bool) - Disconnect(reason string) error - Send(v interface{}) error SignalAnswer(sdp string) error } @@ -47,8 +59,8 @@ type SessionManager interface { OnHostCleared(listener func(session Session)) OnConnected(listener func(session Session)) OnDisconnected(listener func(session Session)) + ImplicitHosting() bool - // auth Authenticate(r *http.Request) (Session, error) }