fix: pong data race

This commit is contained in:
2025-10-01 14:41:23 +07:00
parent 2ab2e07b9b
commit 70d9a37a4e

View File

@@ -193,6 +193,7 @@ type SafeWebsocketClient struct {
authenticateFn func(*SafeWebsocketClient) error authenticateFn func(*SafeWebsocketClient) error
writeChan chan Message writeChan chan Message
pongChan chan error
} }
func (wsClient *SafeWebsocketClient) connect() error { func (wsClient *SafeWebsocketClient) connect() error {
@@ -267,6 +268,9 @@ func (wsClient *SafeWebsocketClient) connect() error {
if err := c.WriteMessage(int(data.MessageType), data.Data); err != nil { if err := c.WriteMessage(int(data.MessageType), data.Data); err != nil {
log.Printf("error on write message: %v\n", err) log.Printf("error on write message: %v\n", err)
wsClient.triggerReconnect() wsClient.triggerReconnect()
if data.MessageType == MessageTypePong {
wsClient.pongChan <- err
}
return return
} }
} }
@@ -324,18 +328,15 @@ func (wsClient *SafeWebsocketClient) connect() error {
}() }()
conn.SetPingHandler(func(pingData string) error { conn.SetPingHandler(func(pingData string) error {
// wsClient.writeChan <- Message{ wsClient.writeChan <- Message{
// MessageType: MessageTypePong, MessageType: MessageTypePong,
// Data: []byte(pingData), Data: []byte(pingData),
// } }
if err := conn.WriteMessage(websocket.PongMessage, []byte(pingData)); err != nil {
if err == websocket.ErrCloseSent { select {
return nil case err := <-wsClient.pongChan:
}
if netErr, ok := err.(interface{ Timeout() bool }); ok && netErr.Timeout() {
return nil
}
return err return err
default:
} }
return nil return nil
}) })