WebSocketServer/socketserver/hub.go

84 lines
2.1 KiB
Go

package socketserver
import (
"encoding/json"
"clickandjoin.app/websocketserver/modules/cache"
"clickandjoin.app/websocketserver/modules/rabbitmq"
"clickandjoin.app/websocketserver/modules/structs"
"clickandjoin.app/websocketserver/socketclients"
"github.com/gofiber/websocket/v2"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
)
var register = make(chan *structs.SocketClient)
var broadcast = make(chan structs.SocketMessage)
var unregister = make(chan *websocket.Conn)
func RunHub() {
for {
select {
case newSocketClient := <-register:
uuid := uuid.New().String()
qName, err := rabbitmq.CreateClientBinding(uuid)
logrus.Println("qName", qName)
if err == nil {
newSocketClient.QName = qName
}
cache.SocketClients[uuid] = newSocketClient
logrus.Println("register client", uuid)
// for testing
marshaled, err := json.Marshal(structs.SocketMessageTest{Cmd: 99999, Body: uuid})
if err != nil {
logrus.Errorln("Failed to marshal uuid, err:", err)
}
newSocketClient.Conn.WriteMessage(websocket.TextMessage, []byte(marshaled))
case data := <-broadcast:
recMsg := structs.ReceivedSocketMessage{}
err := json.Unmarshal(data.Msg, &recMsg)
if err != nil {
logrus.Errorln("Failed err:", err)
}
logrus.Println(recMsg)
if recMsg.Rec != "" {
isConnected, recSocketClient := socketclients.IsReceiverConnectedToThisServer(recMsg.Rec)
// send message to target receiver when connected to this server
if isConnected {
recSocketClient.SendMessage(structs.SendSocketMessage{Cmd: recMsg.Cmd, Body: recMsg.Body})
} else {
logrus.Println("rec not found")
//rabbitmq.PublishBroadcastMessage(structs.RabbitMqMessage{Cmd: recMsg.Cmd, Rec: recMsg.Rec, Body: recMsg.Body})
rabbitmq.PublishClientMessage(structs.RabbitMqMessage{Cmd: recMsg.Cmd, Rec: recMsg.Rec, Body: recMsg.Body})
}
}
case connection := <-unregister:
logrus.Println("unregister", connection)
for id, client := range cache.SocketClients {
if connection == client.Conn {
delete(cache.SocketClients, id)
rabbitmq.DeleteClientBinding(client.QName, id)
}
}
}
}
}