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 FiberListenAndServe(sub Subscriber) { app := fiber.New() app.Static("/static", "static") // Application Main Page app.Get("/", fiberHomeHandler) // Websocket app.Get("/ws", ws.New(fiberWebsocketHandler)) // Tracking persistence controls trackings := app.Group("/trackings") trackings.Get("/") // Get all trackings Metadata trackings.Post("/") // Initialize new tracking by 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 by Id. 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 fiberWebsocketHandler(c *ws.Conn) { for { mt, msg, err := c.ReadMessage() if err != nil { log.Println("read:", err) break } log.Printf("recv: %s", msg) err = c.WriteMessage(mt, msg) 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 }