package dbm import ( "errors" "fmt" "github.com/coder/websocket" "github.com/coder/websocket/wsjson" "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 { break } // Subscribe go d.Subscribe(request.Subscribe, id) // Unsubscribe go d.Unsubscribe(request.Unsubscribe, id) } } 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") } err = wsjson.Read(client.Ctx, client.Conn, &request) 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 } } return }