From 350f887a452418174ba529d17878766f090cb693 Mon Sep 17 00:00:00 2001 From: Settel Date: Wed, 28 Jul 2021 23:17:08 +0200 Subject: [PATCH] update communication --- server/go.mod | 2 ++ server/go.sum | 2 ++ server/knyc.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 server/go.sum diff --git a/server/go.mod b/server/go.mod index acdf66d..1803833 100644 --- a/server/go.mod +++ b/server/go.mod @@ -1,3 +1,5 @@ module sirlab.de/go/knyc go 1.16 + +require github.com/imkira/go-observer v1.0.3 diff --git a/server/go.sum b/server/go.sum new file mode 100644 index 0000000..24121df --- /dev/null +++ b/server/go.sum @@ -0,0 +1,2 @@ +github.com/imkira/go-observer v1.0.3 h1:l45TYAEeAB4L2xF6PR2gRLn2NE5tYhudh33MLmC7B80= +github.com/imkira/go-observer v1.0.3/go.mod h1:zLzElv2cGTHufQG17IEILJMPDg32TD85fFgKyFv00wU= diff --git a/server/knyc.go b/server/knyc.go index a503117..74b28aa 100644 --- a/server/knyc.go +++ b/server/knyc.go @@ -2,22 +2,78 @@ package main import ( "fmt" + "github.com/imkira/go-observer" "net/http" "sirlab.de/go/knyc/handler" + "strconv" + "time" ) +type Value struct { + value int +} + +type Engine struct { + payload observer.Property +} + +var engine Engine + +func (engine Engine) runEngine() { + for { + value := engine.payload.Value().(Value) + fmt.Printf("sleep: %d\n", value.value) + time.Sleep(1 * time.Second) + value.value++ + engine.payload.Update(value) + } +} + +func syncFactory(payload observer.Property) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + refId, err := strconv.Atoi(r.URL.Query().Get("ref")) + if err != nil { + refId = -1 + } + + stream := payload.Observe() + var value Value + for { + value = stream.Value().(Value) + if value.value > refId { + break + } + + select { + case <-stream.Changes(): + stream.Next() + } + } + + w.Header().Add("Content-Type", "text/plain") + fmt.Fprintf(w, "%d (%d)\n", value.value, refId) + } +} + func main() { app := handler.NewAuthMux() http.Handle("/", app) app.PublicHandleFunc("/__intern__/exit", handler.Exit) + payload := observer.NewProperty(Value{value: 19}) + sync := syncFactory(payload) + app.PublicHandleFunc("/sync", sync) + // hanlde login page fsHandler := http.FileServer(http.Dir("../client/dist/")) - + // default handler app.PublicHandle("/", fsHandler) + engine.payload = payload + go engine.runEngine() + // start listening fmt.Println("http://localhost:32039") http.ListenAndServe(":32039", nil)