Add Keepalive ping/pong (#46)

This commit is contained in:
Brandon Sturgeon 2023-09-20 21:34:14 -07:00 committed by GitHub
parent 7f24b6c386
commit dfa279b534
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 3 deletions

View File

@ -22,6 +22,13 @@ hook.Add "Think", loadHook, ->
with ChatTransit.WebSocket
.reconnectTimerName = "CFC_ChatTransit_WebsocketReconnect"
.onMessage = (msg) =>
if msg ~= "keepalive"
logger\info "Received a not-keepalive message from the server:", msg
return
\write "keepalive"
.onConnected = =>
logger\info "Established websocket connection"
timer.Remove .reconnectTimerName
@ -76,6 +83,11 @@ ChatTransit.guard = (f, delay) -> (...) ->
return nil
hook.Add "ShutDown", "CFC_ChatTransit_WebsocketDisconnect", ->
logger\info "Gracefully closing websocket.."
ProtectedCall -> ChatTransit.WebSocket\closeNow!
return nil
logger\info "Loading modules..."
for f in *file.Find "cfc_chat_transit/server/modules/*.lua", "LUA"
logger\info "Loading modules/#{f}"

View File

@ -1,16 +1,32 @@
package main
import (
"github.com/gorilla/websocket"
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{}
func relay(w http.ResponseWriter, r *http.Request) {
// TODO: Prevent multiple clients here
func keepAlive(c *websocket.Conn, r *http.Request) {
ctx := r.Context()
select {
case <-time.After(2 * time.Second):
err := c.WriteMessage(websocket.PingMessage, []byte("keepalive"))
if err != nil {
log.Print("Received an error when sending keepalive. Exiting keepalive loop")
return
}
case <-ctx.Done():
log.Print("Request context is done. Existing keepalive loop")
return
}
}
func relay(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
@ -19,6 +35,8 @@ func relay(w http.ResponseWriter, r *http.Request) {
defer c.Close()
go keepAlive(c, r)
for {
_, message, err := c.ReadMessage()
if err != nil {