package main import ( "fmt" "net/http" "os" "github.com/gorilla/websocket" "github.com/joho/godotenv" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } var clients = make(map[*websocket.Conn]bool) // connected clients var broadcast = make(chan []byte) // broadcast channel func main() { godotenv.Load() http.HandleFunc("/ws", handleConnections) go handleMessages() fmt.Println("Server running on " + os.Getenv("PORT")) http.ListenAndServeTLS(os.Getenv("PORT"), "cert.pem", "key.pem", nil) } func handleConnections(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { fmt.Println(err) return } defer conn.Close() clients[conn] = true for { _, msg, err := conn.ReadMessage() if err != nil { delete(clients, conn) break } broadcast <- msg } } func handleMessages() { for { msg := <-broadcast for client := range clients { if err := client.WriteMessage(websocket.TextMessage, msg); err != nil { client.Close() delete(clients, client) } } } }