100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
package socketserver
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"clickandjoin.app/websocketserver/modules/cache"
|
|
"clickandjoin.app/websocketserver/modules/rabbitmq"
|
|
"clickandjoin.app/websocketserver/modules/redis"
|
|
"clickandjoin.app/websocketserver/modules/structs"
|
|
"clickandjoin.app/websocketserver/modules/utils"
|
|
"clickandjoin.app/websocketserver/socketclients"
|
|
"github.com/gofiber/websocket/v2"
|
|
"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:
|
|
userId := fmt.Sprintf("%v", newSocketClient.Conn.Locals("userId"))
|
|
wsSessionId := fmt.Sprintf("%v", newSocketClient.Conn.Locals("wsSessionId"))
|
|
|
|
err := rabbitmq.CreateWSClientBinding(newSocketClient, userId)
|
|
|
|
if err != nil {
|
|
logrus.Errorln("Failed to create client binding, err:", err)
|
|
break
|
|
}
|
|
|
|
newSocketClient.UserId = userId
|
|
|
|
cache.SocketClients[wsSessionId] = newSocketClient
|
|
|
|
logrus.Println("clients:", len(cache.SocketClients), cache.SocketClients)
|
|
|
|
logrus.Debugln("REGISTER CLIENT:", wsSessionId)
|
|
|
|
// for testing
|
|
marshaled, err := utils.MarshalMessage(structs.SocketMessageTest{Cmd: 99999, Body: userId})
|
|
|
|
if err != nil {
|
|
logrus.Errorln("Failed to marshal uuid, err:", err)
|
|
break
|
|
}
|
|
|
|
newSocketClient.Conn.WriteMessage(websocket.TextMessage, []byte(marshaled))
|
|
|
|
case data := <-broadcast:
|
|
var receivedMessage structs.ReceivedMessage
|
|
|
|
err := utils.UnmarshalReceivedMessage(data.Msg, &receivedMessage)
|
|
|
|
if err != nil {
|
|
logrus.Errorln("Failed to unmarshal received msg, err:", err)
|
|
}
|
|
|
|
logrus.Debugln("RECEIVED WEBSOCKET MESSAGE:", receivedMessage)
|
|
|
|
if len(receivedMessage.Rec) == utils.LenWebSocketSession {
|
|
isConnected, recSocketClient := socketclients.IsReceiverConnectedToThisServer(receivedMessage.Rec)
|
|
|
|
// send message to target receiver when connected to this server
|
|
if isConnected {
|
|
logrus.Debugln("FORWARDING MESSAGE: receiver is on connected to this server")
|
|
recSocketClient.SendMessage(structs.SendSocketMessage{Cmd: receivedMessage.Cmd, Body: receivedMessage.Body})
|
|
} else {
|
|
logrus.Debugln("FORWARDING MESSAGE: receiver connected to other server")
|
|
|
|
if !redis.IsUserConnectedToAnyWebSocketServer(receivedMessage.Rec) {
|
|
logrus.Warnln("rec user not connected to any websocket server")
|
|
break
|
|
}
|
|
|
|
err = rabbitmq.PublishClientMessage(structs.RabbitMqMessage{Cmd: receivedMessage.Cmd, Rec: receivedMessage.Rec, Body: receivedMessage.Body})
|
|
|
|
if err != nil {
|
|
logrus.Errorln("Failed to publish client message, err:", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
case connection := <-unregister:
|
|
for id, client := range cache.SocketClients {
|
|
if connection == client.Conn {
|
|
logrus.Debugln("UNREGISTER CLIENT:", id)
|
|
delete(cache.SocketClients, id)
|
|
|
|
client.CancelFunc()
|
|
rabbitmq.DeleteWSClient(client.RabbitMqConsumerId, client.RabbitMqQueueName)
|
|
redis.RemoveUserWebSocketSessionId(client.UserId, id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|