package socketio import ( "log" "sync" "github.com/google/uuid" "github.com/gorilla/websocket" logging "lst.net/utils/logger" ) type Client struct { ClientID uuid.UUID Conn *websocket.Conn APIKey string IPAddress string UserAgent string Send chan []byte Channels map[string]bool // e.g., {"logs": true, "labels": true} } var clients = make(map[*Client]bool) var clientsLock sync.Mutex func init() { var broadcast = make(chan string) go func() { for { msg := <-broadcast clientsLock.Lock() for client := range clients { if client.Channels["logs"] { err := client.Conn.WriteMessage(websocket.TextMessage, []byte(msg)) if err != nil { log.Println("Write error:", err) client.Conn.Close() //client.MarkDisconnected() delete(clients, client) } } } clientsLock.Unlock() } }() } func StartBroadcasting(broadcaster chan logging.Message) { go func() { log.Println("StartBroadcasting goroutine started") for { msg := <-broadcaster //log.Printf("Received msg on broadcaster: %+v\n", msg) clientsLock.Lock() for client := range clients { if client.Channels[msg.Channel] { log.Println("Sending message to client") err := client.Conn.WriteJSON(msg) if err != nil { log.Println("Write error:", err) client.Conn.Close() client.MarkDisconnected() delete(clients, client) } } else { log.Println("Skipping client, channel mismatch") } } clientsLock.Unlock() } }() } // func (c *Client) JoinChannel(name string) { // ch := GetOrCreateChannel(name) // c.Channels[name] = ch // ch.Register <- c // } // func (c *Client) LeaveChannel(name string) { // if ch, ok := c.Channels[name]; ok { // ch.Unregister <- c // delete(c.Channels, name) // } // } func (c *Client) Disconnect() { // for _, ch := range c.Channels { // ch.Unregister <- c // } close(c.Send) }