package main import ( "log" "time" "github.com/gorilla/websocket" ) type WSServer struct { connections map[*WSConnection]bool clientId int32 Upgrader websocket.Upgrader Broadcast chan string IdleTimeout time.Duration PingInterval time.Duration } func New(timeout time.Duration) *WSServer { server := &WSServer{ connections: make(map[*WSConnection]bool), Upgrader: websocket.Upgrader{}, Broadcast: make(chan string, 128), IdleTimeout: timeout, PingInterval: timeout / 2, } go func() { for { msg := <-server.Broadcast for conn := range server.connections { conn.WriteChan <- msg } } }() return server } func (server *WSServer) HandleNew(conn *websocket.Conn) { log.Printf("Client connected, now %d clients", len(server.connections)+1) wsconn := NewConn(conn, server) go wsconn.Open() server.connections[wsconn] = true go func() { err := <-wsconn.ErrorChan wsconn.alive = false close(wsconn.ReadChan) close(wsconn.WriteChan) close(wsconn.ErrorChan) log.Printf("Client %d: disconnected due to %+v, now %d clients", wsconn.id, err, len(server.connections)) wsconn.conn.Close() delete(server.connections, wsconn) }() }