package dbm import ( "context" "fmt" "github.com/coder/websocket" "github.com/coder/websocket/wsjson" "github.com/gin-gonic/gin" "github.com/zuadi/tecamino-dbm/models" ) const ( OnCreate = "onCreate" OnChange = "onChange" OnDelete = "onDelete" ) func (d *DBMHandler) WebSocket(c *gin.Context) { // id, err := auth.GetIDFromAuth(c) // if err != nil { // d.Log.Error("dbmHandler.webSocket.Websocket", "error GetIDFromAuth: "+err.Error()) // return // } id := "test" d.Log.Debug("dbmHandler.webSocket.Websocket", "authorization id token: "+id) ctx, cancel := context.WithCancel(c.Request.Context()) defer cancel() err := d.Clients.ConnectRecievingWsConnection(id, c) defer d.Clients.RemoveClient(id) if err != nil { d.Log.Error("dbmHandler.webSocket.Websocket", "error connecting recieving websocket conection: "+err.Error()) return } defer d.Clients.DisconnectWsConnection(id, websocket.StatusInternalError, "Internal error") //Read loop for { request, err := d.readJsonData(ctx, id) if err != nil { break } // Subscribe if request.Subscribe != nil { go func() { for _, sub := range *request.Subscribe { d.Subscribe(ctx, &sub, id) } }() } // Unsubscribe if request.Unsubscribe != nil { for _, unsub := range *request.Unsubscribe { err = d.Unsubscribe(ctx, &unsub, id) if err != nil { d.Log.Error("dbmHandler.WebSocket unsubscribe", err) break } } } if err != nil { break } } } func (d *DBMHandler) readJsonData(ctx context.Context, id string) (*models.JsonData, error) { var request models.JsonData err := wsjson.Read(ctx, d.Clients[id].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 nil, err default: d.Log.Error("webSocket.readJsonData", fmt.Sprintf("WebSocket read error: %v (code: %v)\n", err, code)) return nil, err } } return &request, nil }