From 4b7ec503bce9d28d246e3f1becc3b269688e535b Mon Sep 17 00:00:00 2001 From: Muzzammil Shahid Date: Fri, 27 Dec 2024 19:01:12 +0500 Subject: [PATCH] Implement websocket keepalive --- acceptor.go | 3 +++ acceptor_test.go | 2 +- joiner.go | 7 +++---- peer.go | 7 ++++++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/acceptor.go b/acceptor.go index 1cdaba4..98db720 100644 --- a/acceptor.go +++ b/acceptor.go @@ -70,6 +70,9 @@ func (w *WebSocketAcceptor) Spec(subProtocol string) (serializers.Serializer, er } func (w *WebSocketAcceptor) Accept(conn net.Conn, config *WebSocketServerConfig) (BaseSession, error) { + if config == nil { + config = DefaultWebSocketServerConfig() + } config.SubProtocols = w.protocols() peer, err := UpgradeWebSocket(conn, config) if err != nil { diff --git a/acceptor_test.go b/acceptor_test.go index ea6da98..68a7b52 100644 --- a/acceptor_test.go +++ b/acceptor_test.go @@ -25,7 +25,7 @@ func TestAccept(t *testing.T) { require.NotNil(t, conn) acceptor := xconn.WebSocketAcceptor{} - session, err := acceptor.Accept(conn, xconn.DefaultWebSocketServerConfig()) + session, err := acceptor.Accept(conn, nil) require.NoError(t, err) require.NotNil(t, session) diff --git a/joiner.go b/joiner.go index 6a443e8..b97b3a9 100644 --- a/joiner.go +++ b/joiner.go @@ -33,10 +33,6 @@ func (w *WebSocketJoiner) Join(ctx context.Context, url, realm string, config *W w.Authenticator = auth.NewAnonymousAuthenticator("", nil) } - if config.DialTimeout == 0 { - config.DialTimeout = time.Second * 10 - } - peer, err := DialWebSocket(ctx, parsedURL, config) if err != nil { return nil, err @@ -46,6 +42,9 @@ func (w *WebSocketJoiner) Join(ctx context.Context, url, realm string, config *W } func DialWebSocket(ctx context.Context, url *netURL.URL, config *WSDialerConfig) (Peer, error) { + if config == nil { + config = &WSDialerConfig{SubProtocol: JsonWebsocketProtocol} + } wsDialer := ws.Dialer{ Protocols: []string{config.SubProtocol}, } diff --git a/peer.go b/peer.go index 379dcf6..53e796d 100644 --- a/peer.go +++ b/peer.go @@ -1,6 +1,7 @@ package xconn import ( + "crypto/rand" "errors" "fmt" "io" @@ -136,8 +137,12 @@ func (c *WebSocketPeer) startPinger(keepaliveInterval time.Duration, keepaliveTi for { <-ticker.C // Send a ping - err := c.writeOpFunc(c.conn, ws.OpPing, []byte("ping")) + randomBytes := make([]byte, 4) + _, err := rand.Read(randomBytes) if err != nil { + fmt.Println("failed to generate random bytes:", err) + } + if err := c.writeOpFunc(c.conn, ws.OpPing, randomBytes); err != nil { log.Printf("failed to send ping: %v\n", err) _ = c.conn.Close() return