diff --git a/server/internal/http/legacy/event/events.go b/server/internal/http/legacy/event/events.go index 3cc0b3aec..dce8a8cd6 100644 --- a/server/internal/http/legacy/event/events.go +++ b/server/internal/http/legacy/event/events.go @@ -4,6 +4,8 @@ const ( SYSTEM_INIT = "system/init" SYSTEM_DISCONNECT = "system/disconnect" SYSTEM_ERROR = "system/error" + SYSTEM_HEARTBEAT = "system/heartbeat" + SYSTEM_PONG = "system/pong" ) const ( diff --git a/server/internal/http/legacy/message/messages.go b/server/internal/http/legacy/message/messages.go index 860a184a9..f43227011 100644 --- a/server/internal/http/legacy/message/messages.go +++ b/server/internal/http/legacy/message/messages.go @@ -24,6 +24,11 @@ type SystemMessage struct { Message string `json:"message"` } +type SystemPong struct { + Event string `json:"event"` + Timestamp string `json:"timestamp"` +} + type SignalProvide struct { Event string `json:"event"` ID string `json:"id"` diff --git a/server/internal/http/legacy/wstobackend.go b/server/internal/http/legacy/wstobackend.go index c2b7f134c..aff4934e9 100644 --- a/server/internal/http/legacy/wstobackend.go +++ b/server/internal/http/legacy/wstobackend.go @@ -4,7 +4,9 @@ import ( "encoding/json" "fmt" "net/http" - + "strconv" + "time" + "github.com/pion/webrtc/v3" oldEvent "github.com/m1k1o/neko/server/internal/http/legacy/event" @@ -28,8 +30,10 @@ func (s *session) wsToBackend(msg []byte) error { switch header.Event { // Client Events case oldEvent.CLIENT_HEARTBEAT: - // do nothing - return nil + return s.toClient(&oldMessage.SystemPong{ + Event: oldEvent.SYSTEM_PONG, + Timestamp: strconv.FormatInt(time.Now().UnixMilli(), 10), + }) // Signal Events case oldEvent.SIGNAL_OFFER: diff --git a/server/internal/websocket/handler/handler.go b/server/internal/websocket/handler/handler.go index 922f204e0..4bf9830cc 100644 --- a/server/internal/websocket/handler/handler.go +++ b/server/internal/websocket/handler/handler.go @@ -1,7 +1,6 @@ package handler import ( - "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" @@ -39,9 +38,7 @@ func (h *MessageHandlerCtx) Message(session types.Session, data types.WebSocketM switch data.Event { // Client Events case event.CLIENT_HEARTBEAT: - session.Send("system/heartbeat", map[string]any{ - "timestamp": time.Now(), - }) + err = h.systemPong(session) // System Events case event.SYSTEM_LOGS: @@ -196,6 +193,7 @@ func (h *MessageHandlerCtx) Message(session types.Session, data types.WebSocketM return h.sendBroadcast(session, payload) }) default: + err = h.systemPong(session) return false } diff --git a/server/internal/websocket/handler/system.go b/server/internal/websocket/handler/system.go index 6863f0806..1d1d4c0db 100644 --- a/server/internal/websocket/handler/system.go +++ b/server/internal/websocket/handler/system.go @@ -1,6 +1,7 @@ package handler import ( + "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" @@ -94,3 +95,13 @@ func (h *MessageHandlerCtx) systemLogs(session types.Session, payload *message.S return nil } + +func (h *MessageHandlerCtx) systemPong(session types.Session) error { + session.Send( + event.SYSTEM_PONG, + message.SystemPong{ + Timestamp: time.Now().UnixMilli(), + }, + ) + return nil +} \ No newline at end of file diff --git a/server/internal/websocket/manager.go b/server/internal/websocket/manager.go index 9fc21f602..aa4c81d9b 100644 --- a/server/internal/websocket/manager.go +++ b/server/internal/websocket/manager.go @@ -32,8 +32,8 @@ var nologEvents = []string{ // don't log twice event.SYSTEM_LOGS, // don't log heartbeats - event.SYSTEM_HEARTBEAT, - event.CLIENT_HEARTBEAT, + // event.CLIENT_HEARTBEAT, + // event.SYSTEM_PONG, // don't log every cursor update event.SESSION_CURSORS, } diff --git a/server/pkg/types/event/events.go b/server/pkg/types/event/events.go index 91f005f87..f1d8fdb80 100644 --- a/server/pkg/types/event/events.go +++ b/server/pkg/types/event/events.go @@ -7,6 +7,7 @@ const ( SYSTEM_LOGS = "system/logs" SYSTEM_DISCONNECT = "system/disconnect" SYSTEM_HEARTBEAT = "system/heartbeat" + SYSTEM_PONG = "system/pong" ) const ( diff --git a/server/pkg/types/message/messages.go b/server/pkg/types/message/messages.go index 48a1afe9d..e87e7e00c 100644 --- a/server/pkg/types/message/messages.go +++ b/server/pkg/types/message/messages.go @@ -47,6 +47,11 @@ type SystemSettingsUpdate struct { types.Settings } +// SystemPong is sent by the server as a direct response to CLIENT_HEARTBEAT +type SystemPong struct { + Timestamp int64 `json:"timestamp"` // Unix ms +} + ///////////////////////////// // Signal /////////////////////////////