moved sse
parent
b2bf49719d
commit
a11fc2cd5c
58
main.go
58
main.go
|
@ -15,21 +15,14 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"jannex/log-manager/modules/cache"
|
|
||||||
"jannex/log-manager/modules/config"
|
"jannex/log-manager/modules/config"
|
||||||
"jannex/log-manager/modules/loghandler"
|
"jannex/log-manager/modules/loghandler"
|
||||||
"jannex/log-manager/modules/structs"
|
|
||||||
"jannex/log-manager/modules/utils"
|
"jannex/log-manager/modules/utils"
|
||||||
"jannex/log-manager/routers/router"
|
"jannex/log-manager/routers/router"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/gofiber/fiber/v2/middleware/cors"
|
"github.com/gofiber/fiber/v2/middleware/cors"
|
||||||
"github.com/gofiber/fiber/v2/middleware/logger"
|
"github.com/gofiber/fiber/v2/middleware/logger"
|
||||||
futils "github.com/gofiber/fiber/v2/utils"
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/valyala/fasthttp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -58,56 +51,5 @@ func main() {
|
||||||
|
|
||||||
router.SetupRoutes(app)
|
router.SetupRoutes(app)
|
||||||
|
|
||||||
if config.Cfg.SSEServerEnabled {
|
|
||||||
app.Get("/v1/log/sse/:logType/:date", func(c *fiber.Ctx) error {
|
|
||||||
fmt.Println("GET /:logType/:date", c.Params("logType"), c.Params("date"))
|
|
||||||
|
|
||||||
logType := futils.CopyString(c.Params("logType"))
|
|
||||||
date := futils.CopyString(c.Params("date"))
|
|
||||||
|
|
||||||
c.Set("Content-Type", "text/event-stream")
|
|
||||||
c.Set("Cache-Control", "no-cache")
|
|
||||||
c.Set("Connection", "keep-alive")
|
|
||||||
c.Set("Transfer-Encoding", "chunked")
|
|
||||||
|
|
||||||
c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
|
|
||||||
var sseclient structs.SSEClient
|
|
||||||
|
|
||||||
sseclient.MessageChannel = make(chan structs.SSEClientChannelMessage)
|
|
||||||
sseclient.LogType = logType
|
|
||||||
sseclient.Date = date
|
|
||||||
|
|
||||||
clientId := uuid.New()
|
|
||||||
|
|
||||||
cache.SSEClients[clientId] = sseclient
|
|
||||||
|
|
||||||
fmt.Printf("NEW CLIENT %v", sseclient)
|
|
||||||
fmt.Printf("%d CLIENTS CONNECTED", len(cache.SSEClients))
|
|
||||||
|
|
||||||
for message := range sseclient.MessageChannel {
|
|
||||||
fmt.Fprintf(w, "data: %s\n\n", message.Message)
|
|
||||||
|
|
||||||
err := w.Flush()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
// Refreshing page in web browser will establish a new
|
|
||||||
// SSE connection, but only (the last) one is alive, so
|
|
||||||
// dead connections must be closed here.
|
|
||||||
|
|
||||||
for id, sseClient := range cache.SSEClients {
|
|
||||||
if id == message.ClientId {
|
|
||||||
close(sseClient.MessageChannel)
|
|
||||||
delete(cache.SSEClients, id)
|
|
||||||
fmt.Printf("DELETE clientId: %s", id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
app.Listen(config.Cfg.Host + ":" + config.Cfg.Port)
|
app.Listen(config.Cfg.Host + ":" + config.Cfg.Port)
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,8 +67,6 @@ func AddLog(body structs.LogBody) {
|
||||||
|
|
||||||
for clientId, sseClient := range cache.SSEClients {
|
for clientId, sseClient := range cache.SSEClients {
|
||||||
if sseClient.LogType == body.Type && sseClient.Date == date {
|
if sseClient.LogType == body.Type && sseClient.Date == date {
|
||||||
fmt.Println("Sending message to client", clientId)
|
|
||||||
|
|
||||||
marshaledLogs, err := json.Marshal(body.Logs)
|
marshaledLogs, err := json.Marshal(body.Logs)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,12 +1,18 @@
|
||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"jannex/log-manager/modules/cache"
|
||||||
|
"jannex/log-manager/modules/config"
|
||||||
"jannex/log-manager/modules/loghandler"
|
"jannex/log-manager/modules/loghandler"
|
||||||
"jannex/log-manager/modules/structs"
|
"jannex/log-manager/modules/structs"
|
||||||
"jannex/log-manager/modules/utils"
|
"jannex/log-manager/modules/utils"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
futils "github.com/gofiber/fiber/v2/utils"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/valyala/fasthttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AddLog(c *fiber.Ctx) error {
|
func AddLog(c *fiber.Ctx) error {
|
||||||
|
@ -128,3 +134,50 @@ func GetAvailableLogTypes(c *fiber.Ctx) error {
|
||||||
|
|
||||||
return c.JSON(logTypes)
|
return c.JSON(logTypes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SSE(c *fiber.Ctx) error {
|
||||||
|
if !config.Cfg.SSEServerEnabled {
|
||||||
|
return c.SendStatus(fiber.StatusNotFound)
|
||||||
|
}
|
||||||
|
|
||||||
|
logType := futils.CopyString(c.Params("logType"))
|
||||||
|
date := futils.CopyString(c.Params("date"))
|
||||||
|
|
||||||
|
c.Set("Content-Type", "text/event-stream")
|
||||||
|
c.Set("Cache-Control", "no-cache")
|
||||||
|
c.Set("Connection", "keep-alive")
|
||||||
|
c.Set("Transfer-Encoding", "chunked")
|
||||||
|
|
||||||
|
c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
|
||||||
|
var sseclient structs.SSEClient
|
||||||
|
|
||||||
|
sseclient.MessageChannel = make(chan structs.SSEClientChannelMessage)
|
||||||
|
sseclient.LogType = logType
|
||||||
|
sseclient.Date = date
|
||||||
|
|
||||||
|
clientId := uuid.New()
|
||||||
|
|
||||||
|
cache.SSEClients[clientId] = sseclient
|
||||||
|
|
||||||
|
for message := range sseclient.MessageChannel {
|
||||||
|
fmt.Fprintf(w, "data: %s\n\n", message.Message)
|
||||||
|
|
||||||
|
err := w.Flush()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
// Refreshing page in web browser will establish a new
|
||||||
|
// SSE connection, but only (the last) one is alive, so
|
||||||
|
// dead connections must be closed here.
|
||||||
|
|
||||||
|
for id, sseClient := range cache.SSEClients {
|
||||||
|
if id == message.ClientId {
|
||||||
|
close(sseClient.MessageChannel)
|
||||||
|
delete(cache.SSEClients, id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ func SetupRoutes(app *fiber.App) {
|
||||||
l := v1.Group("/log")
|
l := v1.Group("/log")
|
||||||
l.Post("/", log.AddLog)
|
l.Post("/", log.AddLog)
|
||||||
l.Get("/types", log.GetAvailableLogTypes)
|
l.Get("/types", log.GetAvailableLogTypes)
|
||||||
|
l.Get("/sse/:logType/:date", log.SSE)
|
||||||
|
|
||||||
ls := v1.Group("/logs")
|
ls := v1.Group("/logs")
|
||||||
ls.Get("/:type", log.GetLog)
|
ls.Get("/:type", log.GetLog)
|
||||||
|
|
Loading…
Reference in New Issue