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) }