admin-dashboard-backend/modules/structs/socket.go

84 lines
1.8 KiB
Go

package structs
import (
"encoding/json"
"errors"
"sync"
"github.com/gofiber/websocket/v2"
"github.com/rs/zerolog/log"
)
type SocketClient struct {
SessionId string
UserId string
Conn *websocket.Conn
connMu sync.Mutex
}
type SocketMessage struct {
Conn *websocket.Conn
Msg []byte
}
type SendSocketMessage struct {
Cmd int
Body any
}
type ReceivedMessage struct {
Cmd int
Body any
}
func (socketClient *SocketClient) SendCloseMessage() error {
return socketClient.writeMessage(websocket.CloseMessage, SendSocketMessage{}, true)
}
func (socketClient *SocketClient) SendUnauthorizedCloseMessage() error {
return socketClient.writeMessage(websocket.CloseMessage, SendSocketMessage{}, true)
}
func (socketClient *SocketClient) SendMessage(message SendSocketMessage) error {
return socketClient.writeMessage(websocket.TextMessage, message, false)
}
func (socketClient *SocketClient) writeMessage(messageType int, message SendSocketMessage, closeMessage bool) error {
var marshaledMessage []byte
var err error
if closeMessage {
// Status codes in the range 4000-4999 are reserved for private use
marshaledMessage = websocket.FormatCloseMessage(4001, "")
} else {
marshaledMessage, err = json.Marshal(message)
if err != nil {
log.Error().Msgf("Failed to marshal ws message, err: %s", err)
return err
}
}
socketClient.connMu.Lock()
defer socketClient.connMu.Unlock()
if socketClient.Conn == nil {
log.Error().Msgf("Failed to ws message because conn is nil")
return errors.New("ws client conn is nil")
}
err = socketClient.Conn.WriteMessage(messageType, marshaledMessage)
if err != nil {
log.Error().Msgf("Failed to write ws message, err: %s", err)
return err
}
return nil
}
type InitUserSocketConnection struct {
Username string
Email string
}