FreePad/lib/socketmanager/socketmanager.go

86 lines
1.8 KiB
Go

package socketmanager
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
var wsUpgrader = websocket.Upgrader{
ReadBufferSize: 1024, // TODO: Make it configurable via the .env file
WriteBufferSize: 1024, // TODO: Make it configurable via the .env file
}
// TODO: Use generics so that we can take string messages, that'd be nice!
type SocketMessage struct {
EventType string `json:"eventType"`
PadName string `json:"padName"`
Message map[string]interface{} `json:"message"`
}
// Bind the websockets to the gin router
func BindSocket(router *gin.RouterGroup) {
router.GET("/get", func(ctx *gin.Context) {
webSocketUpgrade(ctx.Writer, ctx.Request)
})
}
func webSocketUpgrade(w http.ResponseWriter, r *http.Request) {
conn, err := wsUpgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Printf("Failed to set websocket upgrade: %v\n", err)
return
}
// Start listening to this socket
for {
// Try Read the JSON input from the socket
_, msg, err := conn.ReadMessage()
// Check if a close request was sent
if errors.Is(err, websocket.ErrCloseSent) {
break
}
if err != nil {
// There has been an error reading the message
fmt.Println("Failed to read from the socket")
// Skip this cycle
continue
}
// Init the variable
var p SocketMessage
// Try and parse the json
err = json.Unmarshal([]byte(msg), &p)
if err != nil {
// There has been an error reading the message
fmt.Println("Failed to parse the JSON", err)
// Skip this cycle
continue
}
// Pass the message to the proper handlers
handleSocketMessage(p)
}
}
// Handle the socket's message
func handleSocketMessage(msg SocketMessage) {
// Check the type of message
fmt.Println(msg.EventType)
}
func BroadcastMessage(padName string, message string) {
}