Experiment with Authentication and Websockets
Some checks failed
build-docker-imge / Build the docker container (push) Failing after 2m24s
Some checks failed
build-docker-imge / Build the docker container (push) Failing after 2m24s
This commit is contained in:
83
router/websocket.go
Normal file
83
router/websocket.go
Normal file
@ -0,0 +1,83 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.kocoder.xyz/kocoded/szuntis-backend/middleware"
|
||||
"github.com/gofiber/contrib/websocket"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
type WebSocketRouter struct {
|
||||
}
|
||||
|
||||
func NewWebSocketRouter(authMiddleware middleware.WsMiddleware, ws fiber.Router) error {
|
||||
router := &WebSocketRouter{}
|
||||
go RunHub()
|
||||
ws.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendFile("/home/kocoder/szuntis-viel-zu-fiel/szuntis-backend/router/home.html", true)
|
||||
})
|
||||
ws.Get("/ws", authMiddleware.IsWebscoketUpgrade, websocket.New(router.Upgrade))
|
||||
return nil
|
||||
}
|
||||
|
||||
type Client struct{}
|
||||
|
||||
var Clients = make(map[*websocket.Conn]Client)
|
||||
var Register = make(chan *websocket.Conn)
|
||||
var Broadcast = make(chan string)
|
||||
var Unregister = make(chan *websocket.Conn)
|
||||
|
||||
func RunHub() {
|
||||
for {
|
||||
select {
|
||||
case conn := <-Register:
|
||||
Clients[conn] = Client{}
|
||||
fmt.Println("Connection registered")
|
||||
case message := <-Broadcast:
|
||||
fmt.Println("Recieved BC request: " + message)
|
||||
for connection := range Clients {
|
||||
if err := connection.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
|
||||
fmt.Println("Write error: ", err)
|
||||
|
||||
Unregister <- connection
|
||||
connection.WriteMessage(websocket.CloseMessage, []byte{})
|
||||
connection.Close()
|
||||
}
|
||||
}
|
||||
case connection := <-Unregister:
|
||||
delete(Clients, connection)
|
||||
fmt.Println("Unregistered Connection")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ws WebSocketRouter) Upgrade(c *websocket.Conn) {
|
||||
defer func() {
|
||||
fmt.Println(1)
|
||||
Unregister <- c
|
||||
c.Close()
|
||||
}()
|
||||
|
||||
fmt.Println(2)
|
||||
Register <- c
|
||||
fmt.Println(12)
|
||||
|
||||
for {
|
||||
messageType, message, err := c.ReadMessage()
|
||||
if err != nil {
|
||||
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
|
||||
fmt.Println("Read error: ", err)
|
||||
}
|
||||
fmt.Println("ASDF")
|
||||
return //Call defered function to close the connection
|
||||
}
|
||||
|
||||
if messageType == websocket.TextMessage {
|
||||
fmt.Println("Messgae", string(message))
|
||||
Broadcast <- string(message)
|
||||
} else {
|
||||
fmt.Println("Websocket message received of type: ", messageType)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user