diff --git a/moon/cfc_chat_transit/server/init.moon b/moon/cfc_chat_transit/server/init.moon index 79dfec5..b2723fa 100644 --- a/moon/cfc_chat_transit/server/init.moon +++ b/moon/cfc_chat_transit/server/init.moon @@ -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}" diff --git a/web/discord_relay/relay.go b/web/discord_relay/relay.go index 52ec940..41c36ed 100644 --- a/web/discord_relay/relay.go +++ b/web/discord_relay/relay.go @@ -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 {