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) } } } } }