go-websocket

created : Fri, 31 Jan 2025 11:55:53 +0900
modified : Sat, 01 Feb 2025 03:08:28 +0900
go websocket

해당 글을 쓰는 이유

Go 에서 websocket 구성시 널리쓰이는 방법

func (c *Controller) handleWSRequest(ctx *gin.Context) {
	w, req := ctx.Writer, ctx.Request

	conn, err := c.wsUpgrader.Upgrade(w, req, nil)
	if err != nil {
		c.logger.Warn("Cannot upgrade HTTP connection to WebSocket", "error", err.Error())

		return
	}

	c.handleWSConnection(req.Context(), conn)
}

func (c *Controller) handleWSConnection(ctx context.Context, conn *websocket.Conn) {
	// reader loop
	go func() {
		for {
			mt, msg, err := conn.ReadMessage()
			if err != nil {
				// handle close
				return
			}
			err = readingUsecase(mt, msg)
			if err != nil {
				c.logger.Error("handleWSConnection", slog.Any("error", err))
				// even if usecase is failed, we should continue to read from the connection
				continue
			}
		}
	}()

	// writer loop
	go func() {
		for {
			msg, err := writingUsecase()
			if err != nil {
				c.logger.Error("handleWSConnection", slog.Any("error", err))
				continue
			}

			err = conn.WriteMessage(websocket.BinaryMessage, msg)
			if err != nil {
				c.logger.Error("handleWSConnection", slog.Any("error", err))
				continue
			}
		}
	}()