From f7fd8af1248f3442e08b1aeb4b58ac943679ecde Mon Sep 17 00:00:00 2001 From: jamesread Date: Wed, 9 Aug 2023 21:11:13 +0100 Subject: [PATCH] feature: Websocket early impl --- internal/httpservers/singleFrontend.go | 9 +++++-- internal/httpservers/websocket.go | 22 +++++++++------- internal/httpservers/webuiServer_test.go | 3 +++ webui/js/websocket.js | 32 ++++++++++++++++++++++++ webui/main.js | 3 +++ 5 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 webui/js/websocket.js diff --git a/internal/httpservers/singleFrontend.go b/internal/httpservers/singleFrontend.go index 6e4a926..cb39c82 100644 --- a/internal/httpservers/singleFrontend.go +++ b/internal/httpservers/singleFrontend.go @@ -14,6 +14,7 @@ import ( "net/http" "net/http/httputil" "net/url" + "strings" ) // StartSingleHTTPFrontend will create a reverse proxy that proxies the API @@ -37,8 +38,12 @@ func StartSingleHTTPFrontend(cfg *config.Config) { }) mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - log.Debugf("ui req: %q", r.URL) - webuiProxy.ServeHTTP(w, r) + if strings.Contains(r.Header.Get("Connection"), "Upgrade") { + handleWebsocket(w, r) + } else { + log.Debugf("ui req: %q", r.URL) + webuiProxy.ServeHTTP(w, r) + } }) srv := &http.Server{ diff --git a/internal/httpservers/websocket.go b/internal/httpservers/websocket.go index 099b52f..c0ef7a1 100644 --- a/internal/httpservers/websocket.go +++ b/internal/httpservers/websocket.go @@ -5,14 +5,16 @@ import ( log "github.com/sirupsen/logrus" "net/http" "nhooyr.io/websocket" + "nhooyr.io/websocket/wsjson" + "context" ) -func handleWebsocket(w http.ResponseWriter, r *http.Request) { +func handleWebsocket(w http.ResponseWriter, r *http.Request) bool { c, err := websocket.Accept(w, r, nil) if err != nil { - Log.Warnf("Websocket issue: %v", err) - return + log.Warnf("Websocket issue: %v", err) + return false } defer c.Close(websocket.StatusInternalError, "Goodbye") @@ -23,14 +25,16 @@ func handleWebsocket(w http.ResponseWriter, r *http.Request) { var v interface{} - err = wsjson.Read(Ctx, c, v) - - if err != nil { - Log.Warnf("Websocket issue: %v", err) - return - } + err = wsjson.Read(ctx, c, v) log.Printf("recv: %v", v) + if err != nil { + log.Warnf("Websocket issue: %v", err) + return false + } + + c.Close(websocket.StatusNormalClosure, "") + return true } diff --git a/internal/httpservers/webuiServer_test.go b/internal/httpservers/webuiServer_test.go index 94ea73c..a4843b7 100644 --- a/internal/httpservers/webuiServer_test.go +++ b/internal/httpservers/webuiServer_test.go @@ -4,11 +4,14 @@ import ( "github.com/stretchr/testify/assert" "os" "testing" + config "github.com/OliveTin/OliveTin/internal/config" ) func TestGetWebuiDir(t *testing.T) { os.Chdir("../../") // go test sets the cwd to "httpservers" by default + cfg = config.DefaultConfig(); + dir := findWebuiDir() assert.Equal(t, "./webui", dir, "Finding the webui dir") diff --git a/webui/js/websocket.js b/webui/js/websocket.js new file mode 100644 index 0000000..355e755 --- /dev/null +++ b/webui/js/websocket.js @@ -0,0 +1,32 @@ +export function setupWebsocket() { + window.websocketAvailable = false + + window.ws = new WebSocket('ws://localhost:1337') + + ws.addEventListener('open', websocketOnOpen) + ws.addEventListener('message', websocketOnMessage) + ws.addEventListener('error', websocketOnError) + ws.addEventListener('close', websocketOnClose) +} + +function websocketOnOpen(evt) { + window.websocketAvailable = true + console.log("open") + + const foo = '{}' + + ws.send(foo) +} + +function websocketOnMessage(msg) { + console.log(msg) +} + +function websocketOnError(err) { + window.websocketAvailable = false + console.log(err) +} + +function websocketOnClose() { + window.websocketAvailable = false +} diff --git a/webui/main.js b/webui/main.js index 7853e76..033c68b 100644 --- a/webui/main.js +++ b/webui/main.js @@ -1,6 +1,7 @@ 'use strict' import { marshalActionButtonsJsonToHtml, marshalLogsJsonToHtml } from './js/marshaller.js' +import { setupWebsocket } from './js/websocket.js' function showSection (name) { for (const otherName of ['Actions', 'Logs']) { @@ -75,6 +76,8 @@ function processWebuiSettingsJson (settings) { function main () { setupSections() + setupWebsocket() + window.fetch('webUiSettings.json').then(res => { return res.json() }).then(res => {