Refactor websocket session sync (#44)

* refactor websocket peer and comment functions.

* update comments.

* add DestroyWebSocketPeer.
This commit is contained in:
Miroslav Šedivý
2023-04-23 11:23:20 +02:00
committed by GitHub
parent 43f8fe339f
commit 0ea1c2870f
5 changed files with 84 additions and 61 deletions

View File

@ -207,19 +207,18 @@ func (manager *WebSocketManagerCtx) Upgrade(checkOrigin types.CheckOrigin) types
}
func (manager *WebSocketManagerCtx) connect(connection *websocket.Conn, r *http.Request) {
// create new peer
peer := newPeer(connection)
session, err := manager.sessions.Authenticate(r)
if err != nil {
manager.logger.Warn().Err(err).Msg("authentication failed")
peer.Destroy(err.Error())
newPeer(manager.logger, connection).Destroy(err.Error())
return
}
// add session id to all log messages
logger := manager.logger.With().Str("session_id", session.ID()).Logger()
peer.setSessionID(session.ID())
// create new peer
peer := newPeer(logger, connection)
if !session.Profile().CanConnect {
logger.Warn().Msg("connection disabled")
@ -238,14 +237,12 @@ func (manager *WebSocketManagerCtx) connect(connection *websocket.Conn, r *http.
logger.Info().Msg("replacing peer connection")
}
session.SetWebSocketPeer(peer)
logger.Info().
Str("address", connection.RemoteAddr().String()).
Str("agent", r.UserAgent()).
Msg("connection started")
session.SetWebSocketConnected(peer, true, false)
session.ConnectWebSocketPeer(peer)
// this is a blocking function that lives
// throughout whole websocket connection
@ -277,7 +274,7 @@ func (manager *WebSocketManagerCtx) connect(connection *websocket.Conn, r *http.
}
}
session.SetWebSocketConnected(peer, false, delayedDisconnect)
session.DisconnectWebSocketPeer(peer, delayedDisconnect)
}
func (manager *WebSocketManagerCtx) handle(connection *websocket.Conn, peer types.WebSocketPeer, session types.Session) error {

View File

@ -2,12 +2,10 @@ package websocket
import (
"encoding/json"
"errors"
"sync"
"github.com/gorilla/websocket"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/demodesk/neko/pkg/types"
"github.com/demodesk/neko/pkg/types/event"
@ -21,30 +19,17 @@ type WebSocketPeerCtx struct {
connection *websocket.Conn
}
func newPeer(connection *websocket.Conn) *WebSocketPeerCtx {
logger := log.With().
Str("module", "websocket").
Str("submodule", "peer").
Logger()
func newPeer(logger zerolog.Logger, connection *websocket.Conn) *WebSocketPeerCtx {
return &WebSocketPeerCtx{
logger: logger,
logger: logger.With().Str("submodule", "peer").Logger(),
connection: connection,
}
}
func (peer *WebSocketPeerCtx) setSessionID(sessionId string) {
peer.logger = peer.logger.With().Str("session_id", sessionId).Logger()
}
func (peer *WebSocketPeerCtx) Send(event string, payload any) {
peer.mu.Lock()
defer peer.mu.Unlock()
if peer.connection == nil {
return
}
raw, err := json.Marshal(payload)
if err != nil {
peer.logger.Err(err).Str("event", event).Msg("message marshalling has failed")
@ -79,10 +64,6 @@ func (peer *WebSocketPeerCtx) Ping() error {
peer.mu.Lock()
defer peer.mu.Unlock()
if peer.connection == nil {
return errors.New("peer connection not found")
}
// application level heartbeat
if err := peer.connection.WriteJSON(types.WebSocketMessage{
Event: event.SYSTEM_HEARTBEAT,
@ -103,9 +84,6 @@ func (peer *WebSocketPeerCtx) Destroy(reason string) {
peer.mu.Lock()
defer peer.mu.Unlock()
if peer.connection != nil {
err := peer.connection.Close()
peer.logger.Err(err).Msg("peer connection destroyed")
peer.connection = nil
}
err := peer.connection.Close()
peer.logger.Err(err).Msg("peer connection destroyed")
}