package dbm import ( "encoding/json" "errors" "fmt" "io" "github.com/coder/websocket" "github.com/gin-gonic/gin" "github.com/tecamino/tecamino-dbm/auth" json_dataModels "github.com/tecamino/tecamino-json_data/models" ) const ( OnCreate = "onCreate" OnChange = "onChange" OnDelete = "onDelete" ) func (d *DBMHandler) WebSocket(c *gin.Context) { id, err := auth.GetIDFromQuery(c) if err != nil { d.Log.Error("dbmHandler.webSocket.Websocket", "error GetIDFromQuery: "+err.Error()) return } d.Log.Debug("dbmHandler.webSocket.Websocket", "authorization id token: "+id) err = d.Conns.ConnectRecievingWsConnection(id, c) defer d.Conns.RemoveClient(id) if err != nil { d.Log.Error("dbmHandler.webSocket.Websocket", "error connecting recieving websocket conection: "+err.Error()) return } defer d.Conns.DisconnectWsConnection(id, websocket.StatusInternalError, "Internal error") //Read loop for { request, err := d.readJsonData(id) if err != nil { d.Log.Error("websocket.WebSocket", err.Error()) break } // Sets d.Get(request, id) // Sets d.Set(request, id) // Subscribe d.Subscribe(request, id) // Unsubscribe d.Unsubscribe(request, id) request.Get = make([]json_dataModels.Get, 0) request.Set = make([]json_dataModels.Set, 0) request.Subscribe = make([]json_dataModels.Subscription, 0) request.Unsubscribe = make([]json_dataModels.Subscription, 0) request = nil } } func (d *DBMHandler) readJsonData(id string) (request *json_dataModels.Request, err error) { client, ok := d.Conns.Clients[id] if !ok { return request, errors.New("client id not found") } _, reader, err := client.Conn.Reader(client.Ctx) if err != nil { d.Log.Info("webSocket.readJsonData", fmt.Sprintf("WebSocket reader: %v\n", err)) return request, nil } b, err := io.ReadAll(reader) if err != nil { code := websocket.CloseStatus(err) switch code { case websocket.StatusNormalClosure, websocket.StatusGoingAway, websocket.StatusNoStatusRcvd: d.Log.Info("webSocket.readJsonData", fmt.Sprintf("WebSocket closed: %v (code: %v)\n", err, code)) return default: d.Log.Error("webSocket.readJsonData", fmt.Sprintf("WebSocket read error: %v (code: %v)\n", err, code)) return } } if err := json.Unmarshal(b, &request); err != nil { return request, err } return }