package utils import ( "encoding/json" "io" "log/slog" "github.com/gofiber/contrib/websocket" ) var MessageBus = &messagebus{mandanten: make(map[int][]*websocket.Conn)} type messagebus struct { mandanten map[int][]*websocket.Conn } func (mb *messagebus) AddConn(mid int, c *websocket.Conn) { mb.mandanten[mid] = append(mb.mandanten[mid], c) ReadLoop(c) } func ReadLoop(c *websocket.Conn) { for { var t int var r io.Reader var err error if t, r, err = c.NextReader(); err != nil { c.Close() break } bytes, err := io.ReadAll(r) slog.Info("READLOOP: ", "Type", t, "value", bytes) } } func (mb *messagebus) SendMBObject(mid int, mbo MessageBusObject) { bytes, err := json.Marshal(mbo) if err != nil { slog.Info("marshal", "error", err) } i := 0 for _, c := range mb.mandanten[mid] { if err := c.WriteMessage(websocket.TextMessage, bytes); err != nil { slog.Info("conn to remove", "conns", mb.mandanten) mb.RemoveConn(mid, i) slog.Info("write", "error", err, "index", i) } else { i++ } } } func (mb *messagebus) RemoveConn(mid int, i int) { s := mb.mandanten[mid] s[i] = s[len(s)-1] mb.mandanten[mid] = s[:len(s)-1] slog.Info("conn removed", "conns", mb.mandanten) } type MessageBusObject struct { Entity []string `json:"entity"` Id any `json:"id"` }