package ws_gateway import ( "common/log" "common/net/socket" "common/utils" "fmt" "gateway/config" "gateway/internal/handler/ws_handler/client" "gateway/internal/handler/ws_handler/login" "go.uber.org/zap" "time" ) type GatewayWsServer struct { logger *zap.SugaredLogger } func (g *GatewayWsServer) OnOpen(conn socket.ISocketConn) ([]byte, socket.Action) { g.logger = log.GetLogger().Named(fmt.Sprintf("addr:%v", conn.RemoteAddr())) return nil, socket.None } func (g *GatewayWsServer) OnHandShake(conn socket.ISocketConn) socket.Action { token, ok := conn.GetParam("token").(string) if !ok { g.logger.Warnf("token is invalid") return socket.Close } claims, err := utils.ParseToken(token, config.Get().Auth.Secret) if err != nil { g.logger.Warnf("token is invalid") return socket.Close } cli := client.NewClient(claims.USN, conn) conn.SetParam("client", cli) if !login.GetLoginQueue().AddToLoginQueue(&login.User{Cli: cli, Token: token}) { g.logger.Warnf("AddToLoginQueue err, login queue full, usn: %v", claims.USN) return socket.Close } return socket.None } func (g *GatewayWsServer) OnMessage(conn socket.ISocketConn, bytes []byte) socket.Action { cli, ok := conn.GetParam("client").(*client.Client) if !ok || cli.USN == 0 || cli.Status != 1 { return socket.Close } cli.OnEvent(&client.ClientEvent{Msg: bytes}) return socket.None } func (g *GatewayWsServer) OnPong(conn socket.ISocketConn) { cli, ok := conn.GetParam("client").(*client.Client) if !ok || cli.USN == 0 { return } cli.OnEvent(&client.PongEvent{}) } func (g *GatewayWsServer) OnClose(_ socket.ISocketConn, _ error) socket.Action { return socket.Close } func (g *GatewayWsServer) OnTick() (time.Duration, socket.Action) { return 5 * time.Second, socket.None }