From 4aad657c9d16660ac8ff5212938f269c106112a1 Mon Sep 17 00:00:00 2001 From: Daniel Svitan Date: Sat, 7 Jun 2025 09:15:00 +0200 Subject: [PATCH] :sparkles: Adds websocket for opened --- server/main.go | 2 +- server/routes.go | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/server/main.go b/server/main.go index f1325d0..27eecfd 100644 --- a/server/main.go +++ b/server/main.go @@ -24,7 +24,7 @@ var token string // the condition is: distance >= threshold (is door open) var opened bool -var openedChange = make(chan bool) +var openedChange = make(chan any) // is door locked var locked bool = false diff --git a/server/routes.go b/server/routes.go index 14ae606..58b251b 100644 --- a/server/routes.go +++ b/server/routes.go @@ -1,11 +1,15 @@ package main import ( + "github.com/gorilla/websocket" "github.com/labstack/echo/v4" + "github.com/labstack/gommon/log" "net/http" "time" ) +var upgrader = websocket.Upgrader{} + func helloWorld(c echo.Context) error { return c.JSON(http.StatusOK, "Hello world!") } @@ -19,7 +23,36 @@ func getOpened(c echo.Context) error { } func getOpenedWs(c echo.Context) error { - return nil + ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil) + if err != nil { + return err + } + defer func() { _ = ws.Close() }() + + // empty the channel + emptied := false + for !emptied { + select { + case <-openedChange: + default: + emptied = true + } + } + + for { + <-openedChange + mut.Lock() + + err = ws.WriteJSON(opened) + mut.Unlock() + + if err != nil { + log.Error(err) + break + } + } + + return err } func setOpened(c echo.Context) error { @@ -46,7 +79,7 @@ func setOpened(c echo.Context) error { go sendAlert(action) } - openedChange <- true + openedChange <- 0 mut.Unlock() return c.NoContent(http.StatusOK) }