package structs import ( "encoding/json" "errors" "sync" "time" "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 map[string]interface{} } 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 { User UserData CategoryGroups []CategoryGroup // config specific group tasks GroupTasks []GroupTasks // in database saved group tasks GroupTasksSteps []GroupTaskSteps } type UserData struct { Username string Email string Sessions []UserSessionSocket } type UserSessionSocket struct { UserAgent string ConnectionStatus uint8 LastUsed time.Time ExpiresAt time.Time }