From 6fb7cea1fa5e9e5a0a8a2da50725831d0a5d4b81 Mon Sep 17 00:00:00 2001 From: Roger Ferdinan Date: Fri, 26 Sep 2025 15:02:54 +0700 Subject: [PATCH] fix client & server experimental fix --- internal/hub.go | 4 ++-- v1/client/client.go | 49 ++++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/internal/hub.go b/internal/hub.go index 9ab84d4..9ee124d 100644 --- a/internal/hub.go +++ b/internal/hub.go @@ -11,7 +11,7 @@ import ( const ( writeWait = 10 * time.Second pongWait = 60 * time.Second - pingPeriod = 55 * time.Second + pingPeriod = 25 * time.Second ) type Client struct { @@ -95,7 +95,7 @@ func WritePump(c *Client, h *Hub) { } case <-pingTicker.C: c.Conn.SetWriteDeadline(time.Now().Add(writeWait)) - if err := c.Conn.WriteMessage(websocket.PingMessage, nil); err != nil { + if err := c.Conn.WriteMessage(websocket.PingMessage, []byte{}); err != nil { return } } diff --git a/v1/client/client.go b/v1/client/client.go index aad0e1d..655e540 100644 --- a/v1/client/client.go +++ b/v1/client/client.go @@ -124,16 +124,18 @@ func (wsClient *SafeWebsocketClient) connect() error { } conn.SetPingHandler(func(pingData string) error { - if err := conn.WriteMessage(websocket.PongMessage, []byte(pingData)); err != nil { - if err == websocket.ErrCloseSent { - return nil + return wsClient.mu.WriteHandler(func() error { + if err := conn.WriteMessage(websocket.PongMessage, []byte(pingData)); err != nil { + if err == websocket.ErrCloseSent { + return nil + } + if netErr, ok := err.(interface{ Timeout() bool }); ok && netErr.Timeout() { + return nil + } + return err } - if netErr, ok := err.(interface{ Timeout() bool }); ok && netErr.Timeout() { - return nil - } - return err - } - return nil + return nil + }) }) wsClient.mu.WriteHandler(func() error { @@ -142,6 +144,7 @@ func (wsClient *SafeWebsocketClient) connect() error { wsClient.cancel = cancel wsClient.conn = conn wsClient.isConnected = true + return nil }) @@ -179,22 +182,26 @@ func (wsClient *SafeWebsocketClient) startReceiveHandler() { log.Println("Reconnect handler stopped") return default: - if err := wsClient.mu.ReadHandler(func() error { - conn := wsClient.conn + // if err := wsClient.mu.ReadHandler(func() error { + conn := wsClient.conn - if conn == nil { - return fmt.Errorf("no active connection, waiting for reconnect") - } - _, message, err := conn.ReadMessage() - if err != nil { - return err - } - wsClient.dataChannel <- message - return nil - }); err != nil { + if conn == nil { wsClient.triggerReconnect() return + // return fmt.Errorf("no active connection, waiting for reconnect") } + _, message, err := conn.ReadMessage() + if err != nil { + wsClient.triggerReconnect() + return + // return err + } + wsClient.dataChannel <- message + // return nil + // }); err != nil { + // wsClient.triggerReconnect() + // return + // } } } }