package web import ( "git.timovolkmann.de/gyrogpsc/core" "github.com/gofiber/fiber/v2" "github.com/gofiber/websocket/v2" "github.com/sirupsen/logrus" "html/template" ) func CreateServer(s core.Service, sub core.Subscriber, c *core.Configuration) { app := fiber.New() app.Static("/static", "static") // Application Main Page app.Get("/", fiberHomeHandler) // Websocket app.Get("/", websocket.New(createFiberWebsocketHandler(sub))) // TODO: Get all SerialPorts // app.Get("/serialports") // Tracking persistence controls trackings := app.Group("/trackings") trackings.Get("/", stubhander()) // Get all trackings Metadata trackings.Post("/", stubhander()) // Initialize new tracking, open websocket and prepare for automatic recording. Toggle ?serial=true and ?tcp=true. Returns trackingId trackings.Patch("/", stubhander()) // Starts recording trackings.Put("/", stubhander()) // Stops current recording. Returns trackingId if record was successful trackings.Delete("/", stubhander()) // Stops websocket connection, pipelines and collectors trackings.Get("/:trackingId", stubhander()) // Gets Tracking Metadata and loads sensorRecords from storage. trackings.Delete("/:trackingId", stubhander()) // Deletes Tracking from storage trackings.Post("/current", stubhander()) // Starts Replay. trackings.Patch("/current", stubhander()) // Pauses Replay. trackings.Put("/current", stubhander()) // Stops Replay. logrus.Fatal(app.Listen(c.Webserver.Port)) } func stubhander() fiber.Handler { return func(ctx *fiber.Ctx) error { return nil } } func createFiberWebsocketHandler(s core.Subscriber) func(conn *websocket.Conn) { return func(c *websocket.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(websocket.TextMessage, []byte(cmsg)) if err != nil { logrus.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, "://"+c.Hostname()+"/") if err != nil { return err } return nil }