whatsapp-multi-devicewhatsapp-apiwhatsapprestgolanggobotwhatsapp-web-multi-devicewhatsapp-api-gorest-apigolang-whatsapp-apigolang-whatsapp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
package helpers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/gofiber/websocket/v2"
|
|
"log"
|
|
)
|
|
|
|
type client struct{} // Add more data to this type if needed
|
|
type WsBroadcastMessage struct {
|
|
Code string `json:"code"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
var WsClients = make(map[*websocket.Conn]client) // Note: although large maps with pointer-like types (e.g. strings) as keys are slow, using pointers themselves as keys is acceptable and fast
|
|
var WsRegister = make(chan *websocket.Conn)
|
|
var WsBroadcast = make(chan WsBroadcastMessage)
|
|
var WsUnregister = make(chan *websocket.Conn)
|
|
|
|
func WsRunHub() {
|
|
for {
|
|
select {
|
|
case connection := <-WsRegister:
|
|
WsClients[connection] = client{}
|
|
log.Println("connection registered")
|
|
|
|
case message := <-WsBroadcast:
|
|
log.Println("message received:", message)
|
|
marshalMessage, err := json.Marshal(message)
|
|
if err != nil {
|
|
log.Println("write error:", err)
|
|
return
|
|
}
|
|
|
|
// Send the message to all clients
|
|
for connection := range WsClients {
|
|
if err := connection.WriteMessage(websocket.TextMessage, marshalMessage); err != nil {
|
|
log.Println("write error:", err)
|
|
|
|
err := connection.WriteMessage(websocket.CloseMessage, []byte{})
|
|
if err != nil {
|
|
log.Println("write message close error:", err)
|
|
return
|
|
}
|
|
err = connection.Close()
|
|
if err != nil {
|
|
log.Println("close error:", err)
|
|
return
|
|
}
|
|
delete(WsClients, connection)
|
|
}
|
|
}
|
|
|
|
case connection := <-WsUnregister:
|
|
// Remove the client from the hub
|
|
delete(WsClients, connection)
|
|
|
|
log.Println("connection unregistered")
|
|
}
|
|
}
|
|
}
|