add simple ws logger

This commit is contained in:
GitProtogen
2026-03-16 00:04:01 +01:00
parent 9a677d7e46
commit 83d2105b4e
11 changed files with 19 additions and 755 deletions
+18 -90
View File
@@ -2,113 +2,41 @@ package main
import (
"context"
"errors"
"log"
"net/http"
"sync"
"time"
"github.com/coder/websocket"
"github.com/coder/websocket/wsjson"
)
type wsServer struct {
OnOpen func(c *Client)
OnClose func(c *Client, err error)
OnMessage func(c *Client, msg map[string]any)
}
var (
mu sync.Mutex
)
func (s *wsServer) ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) {
conn, err := websocket.Accept(responseWriter, request, &websocket.AcceptOptions{
InsecureSkipVerify: true,
})
func ServeConnection(responseWriter http.ResponseWriter, request *http.Request) {
connection, err := websocket.Accept(responseWriter, request, nil)
if err != nil {
log.Println("accept error:", err)
log.Printf("websocket accept error: %v", err)
return
}
defer conn.CloseNow()
client := &Client{conn: conn}
ctx, cancel := context.WithCancel(context.Background())
ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
defer cancel()
if s.OnOpen != nil {
s.OnOpen(client)
}
var readErr error
for {
var msg map[string]any
if readErr = wsjson.Read(ctx, conn, &msg); readErr != nil {
break
var clientMessage any
err := wsjson.Read(ctx, connection, &clientMessage)
if err != nil {
log.Printf("read error: %clientMessage", err)
return
}
if s.OnMessage != nil {
s.OnMessage(client, msg)
log.Printf("received: %clientMessage", clientMessage)
// process and optionally respond
err = wsjson.Write(ctx, connection, map[string]string{"status": "ok"})
if err != nil {
log.Printf("write error: %clientMessage", err)
return
}
}
cancel() // cancel before OnClose so any in-flight queries are canceled first
if s.OnClose != nil {
s.OnClose(client, readErr)
}
conn.Close(websocket.StatusNormalClosure, "done")
}
func sendAndCloseIfFails(conn *websocket.Conn, message *map[string]any) {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := wsjson.Write(ctx, conn, message); err != nil {
conn.Close(websocket.StatusGoingAway, "Write error")
}
}
func sendToGroup(id uint64, excludedUserId uint64, message *map[string]any) error {
if _, ok := Groups[id]; !ok {
return errors.New("Group Not Found")
}
for client := range ConnectedClients[id] {
if client.User.Id != excludedUserId {
sendAndCloseIfFails(client.conn, message)
}
}
return nil
}
func handleUnauthenticatedMessage(client *Client, msg map[string]any) {
token, ok := msg["token"].(string)
if !ok {
client.conn.Close(websocket.StatusGoingAway, "invalid token")
return
}
user, err := GetUserFromToken(token)
if err != nil {
client.conn.Close(websocket.StatusPolicyViolation, "invalid token")
return
}
groupIds, err := GetUserMemberGroupIds(context.Background(), user.Id)
if err != nil {
client.conn.Close(websocket.StatusInternalError, "internal error")
return
}
user.MemberGroupsId = groupIds
client.User = &user
m := map[string]any{
"authAs": user.Name,
}
sendAndCloseIfFails(client.conn, &m)
AddOrUpdateConnectedClientToCache(&mu, client)
log.Println("New User authenticated as: " + user.Name)
}
func handleAuthenticatedMessage(client *Client, msg map[string]any) {
m := map[string]any{"temporary": "unauthorized"}
sendAndCloseIfFails(client.conn, &m)
}
func handleUnauthenticatedMessage() {}
func handleAuthenticatedMessage() {}