gyrogpsc/web/http.go

86 lines
2.6 KiB
Go

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
}