From 3173313ab941caecd644b3066ad8866c5bbf3fc0 Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Fri, 4 Sep 2026 10:00:49 +0800 Subject: [PATCH] Refresh presence on websocket pong --- server/hdl_websock.go | 3 +++ server/session.go | 25 +++++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/server/hdl_websock.go b/server/hdl_websock.go index f8bf405..99bdc8a 100644 --- a/server/hdl_websock.go +++ b/server/hdl_websock.go @@ -12,6 +12,7 @@ package main import ( "encoding/json" "net/http" + "sync/atomic" "time" "github.com/gorilla/websocket" @@ -45,6 +46,8 @@ func (sess *Session) readLoop() { sess.ws.SetReadLimit(globals.maxMessageSize) sess.ws.SetReadDeadline(time.Now().Add(pongWait)) sess.ws.SetPongHandler(func(string) error { + atomic.StoreInt64(&sess.lastAction, types.TimeNow().UnixNano()) + sess.refreshPresence("ws.pong") sess.ws.SetReadDeadline(time.Now().Add(pongWait)) return nil }) diff --git a/server/session.go b/server/session.go index 7f4f57c..28c7d25 100644 --- a/server/session.go +++ b/server/session.go @@ -519,16 +519,7 @@ func (s *Session) dispatchRaw(raw []byte) { func (s *Session) dispatch(msg *ClientComMessage) { now := types.TimeNow() atomic.StoreInt64(&s.lastAction, now.UnixNano()) - if !s.uid.IsZero() && s.tenantID.IsValid() { - if err := store.RefreshUserPresence(s.tenantID, s.uid, s.sid, currentNodeID()); err != nil { - logs.Warn.Println("s.dispatch: failed to refresh user presence", s.uid, err, s.sid) - } - for _, topic := range s.groupSubs() { - if err := store.MarkTopicMemberOnline(s.tenantID, topic, s.uid, currentNodeID()); err != nil { - logs.Warn.Println("s.dispatch: failed to refresh group member presence", topic, s.uid, err, s.sid) - } - } - } + s.refreshPresence("s.dispatch") // This should be the first block here, before any other checks. var resp *ServerComMessage @@ -701,6 +692,20 @@ func (s *Session) dispatch(msg *ClientComMessage) { } } +func (s *Session) refreshPresence(context string) { + if s.uid.IsZero() || !s.tenantID.IsValid() { + return + } + if err := store.RefreshUserPresence(s.tenantID, s.uid, s.sid, currentNodeID()); err != nil { + logs.Warn.Println(context+": failed to refresh user presence", s.uid, err, s.sid) + } + for _, topic := range s.groupSubs() { + if err := store.MarkTopicMemberOnline(s.tenantID, topic, s.uid, currentNodeID()); err != nil { + logs.Warn.Println(context+": failed to refresh group member presence", topic, s.uid, err, s.sid) + } + } +} + // Request to subscribe to a topic. func (s *Session) subscribe(msg *ClientComMessage) { if strings.HasPrefix(msg.Original, "new") || strings.HasPrefix(msg.Original, "nch") {