package core import ( "fmt" "github.com/gofiber/fiber/v2" ws "github.com/gofiber/websocket/v2" "github.com/gorilla/websocket" "html/template" "log" "net/http" ) func echo(sub Subscriber) func(w http.ResponseWriter, r *http.Request) { var upgrader = websocket.Upgrader{} // use default options return func(w http.ResponseWriter, r *http.Request) { fmt.Println("upgrading to ws") c, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("upgrade:", err) return } //defer c.Close() go func() { for { if _, _, err := c.NextReader(); err != nil { c.Close() break } } }() dispatcherId, channel := sub.Subscribe() defer sub.Unsubscribe(dispatcherId) for { //log.Println("") //if err != nil { // log.Println("read:", err) // break //} cmsg := <-channel err = c.WriteMessage(websocket.TextMessage, []byte(cmsg)) if err != nil { log.Println("write:", err) break } } } } func home(w http.ResponseWriter, r *http.Request) { //var homeTemplate = template.Must(template.NewDispatcher("").ParseFiles("index.html")) tpl, err := template.ParseFiles("static/index.html") if err != nil { log.Fatalln(err) } err = tpl.Execute(w, "ws://"+r.Host+"/echo") if err != nil { log.Fatalln(err) } } func HttpListenAndServe(sub Subscriber, httpPort string) { log.Println("register websocket handler") http.HandleFunc("/echo", echo(sub)) log.Println("register index handler") http.HandleFunc("/", home) log.Println("register static file handler") http.Handle("/static/", http.FileServer(http.Dir("."))) log.Println("start server") log.Fatal(http.ListenAndServe(httpPort, nil)) } func FiberListen(sub Subscriber) { app := fiber.New() app.Static("/static", "static") // Application Main Page app.Get("/", fiberHomeHandler) // Websocket app.Get("/ws", ws.New(createFiberWebsocketHandler(sub))) // TODO: Get all SerialPorts app.Get("/serialports") // Tracking persistence controls trackings := app.Group("/trackings") trackings.Get("/") // Get all trackings Metadata trackings.Post("/") // Initialize new tracking, open websocket and prepare for automatic recording. Toggle ?serial=true and ?tcp=true. Returns trackingId trackings.Patch("/") // Starts recording trackings.Put("/") // Stops current recording. Returns trackingId if record was successful trackings.Delete("/") // Stops websocket connection, pipelines and collectors trackings.Get("/:trackingId") // Gets Tracking Metadata and loads sensorRecords from database. trackings.Post("/:trackingId") // Starts Replay. trackings.Patch("/:trackingId") // Pauses Replay. trackings.Put("/:trackingId") // Stops Replay. trackings.Delete("/:trackingId") // Deletes Tracking from database log.Fatal(app.Listen(":3011")) } func createFiberWebsocketHandler(s Subscriber) func(conn *ws.Conn) { return func(c *ws.Conn) { // Handle and discard inbound messages go func() { for { if _, _, err := c.NextReader(); err != nil { c.Close() break } } }() dispatcherId, channel := s.Subscribe() defer s.Unsubscribe(dispatcherId) for { cmsg := <-channel err := c.WriteMessage(ws.TextMessage, []byte(cmsg)) if err != nil { log.Println("write:", err) break } } } } func fiberHomeHandler(c *fiber.Ctx) error { tpl, err := template.ParseFiles("static/index.html") if err != nil { return err } err = tpl.Execute(c, "ws://"+c.Hostname()+"/ws") if err != nil { return err } return nil }