From 022fe8d87d350d873a30fdb62381ef9e74c1cbd3 Mon Sep 17 00:00:00 2001 From: Settel Date: Thu, 29 Jul 2021 18:39:12 +0200 Subject: [PATCH] moved sync handler to own file --- server/handler/sync.go | 38 +++++++++++++++++++++++++++++++++ server/knyc.go | 48 +++++++----------------------------------- 2 files changed, 46 insertions(+), 40 deletions(-) create mode 100644 server/handler/sync.go diff --git a/server/handler/sync.go b/server/handler/sync.go new file mode 100644 index 0000000..cc464ff --- /dev/null +++ b/server/handler/sync.go @@ -0,0 +1,38 @@ +package handler + +import ( + "fmt" + "github.com/imkira/go-observer" + "net/http" + "strconv" +) + +type Value struct { + Value int +} + +func SyncFactory(obs 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 := obs.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) + } +} diff --git a/server/knyc.go b/server/knyc.go index 74b28aa..66d0def 100644 --- a/server/knyc.go +++ b/server/knyc.go @@ -5,53 +5,22 @@ import ( "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 + obs observer.Property } var engine Engine func (engine Engine) runEngine() { for { - value := engine.payload.Value().(Value) - fmt.Printf("sleep: %d\n", value.value) + value := engine.obs.Value().(handler.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) + value.Value++ + engine.obs.Update(value) } } @@ -61,9 +30,8 @@ func main() { app.PublicHandleFunc("/__intern__/exit", handler.Exit) - payload := observer.NewProperty(Value{value: 19}) - sync := syncFactory(payload) - app.PublicHandleFunc("/sync", sync) + obs := observer.NewProperty(handler.Value{Value: 19}) + app.PublicHandleFunc("/sync", handler.SyncFactory(obs)) // hanlde login page fsHandler := http.FileServer(http.Dir("../client/dist/")) @@ -71,7 +39,7 @@ func main() { // default handler app.PublicHandle("/", fsHandler) - engine.payload = payload + engine.obs = obs go engine.runEngine() // start listening