Backend/servers/web/server.go

85 lines
2.2 KiB
Go

package web
import (
"context"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/websocket/v2"
"go.mongodb.org/mongo-driver/bson"
serverConfig "krakatoa.net/backend/modules/configs/serverConfig"
"krakatoa.net/backend/modules/logger"
"krakatoa.net/backend/modules/mongo"
"krakatoa.net/backend/modules/structs"
"krakatoa.net/backend/routers/router"
)
func RunServer() {
webApp := fiber.New(fiber.Config{AppName: "web"})
webApp.Use(cors.New(cors.Config{
AllowOrigins: "https://dev.voice.krakatoa-roleplay.umbach.dev, https://voice.krakatoa-roleplay.umbach.dev, https://dev.mobile.krakatoa-roleplay.umbach.dev, https://mobile.krakatoa-roleplay.umbach.dev",
AllowCredentials: true,
}))
router.SetupWebRoutes(webApp)
webApp.Use("/ws", func(c *fiber.Ctx) error {
token := c.Cookies("token")
// check if the token is correct
clientDb := structs.WebClientDb{}
err := mongo.PlayersCollection.FindOne(context.TODO(), bson.D{{"$or", bson.A{bson.D{{"voiceSessionToken", token}}, bson.D{{"mobileSessionToken", token}}}}}).Decode(&clientDb)
if err != nil || len(clientDb.VoiceSessionToken) == 0 && len(clientDb.MobileSessionToken) == 0 {
logger.Mongo.Warnln("err", err)
return c.SendStatus(fiber.StatusUnauthorized)
}
if websocket.IsWebSocketUpgrade(c) { // Returns true if the client requested upgrade to the WebSocket protocol
return c.Next()
}
return c.SendStatus(fiber.StatusUpgradeRequired)
})
go RunHub()
WebSocketServer(webApp)
go webApp.Listen(serverConfig.Cfg.Servers.WebServer.Host)
}
func WebSocketServer(app *fiber.App) {
app.Get("/ws", websocket.New(func(c *websocket.Conn) {
defer func() {
unregister <- c
c.Close()
}()
register <- c
for {
messageType, msg, err := c.ReadMessage()
logger.Web.Debugln("recv", msg)
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
logger.Web.Println("read error:", err)
}
return
}
if messageType == websocket.BinaryMessage {
broadcast <- structs.SocketBroadcastData{Conn: c, Msg: msg}
} else {
logger.Web.Println("websocket message received of type", messageType)
}
}
}))
}