package Ws import ( "encoding/json" "github.com/gorilla/websocket" ) // ClientManager is a websocket manager type ClientManager struct { Clients map[*Client]bool Broadcast chan []byte Register chan *Client Unregister chan *Client } // Client is a websocket client type Client struct { ID string Socket *websocket.Conn } // Message is an object for websocket message which is mapped to json type type Message struct { Sender string `json:"sender,omitempty"` Recipient string `json:"recipient,omitempty"` Content string `json:"content,omitempty"` } // Manager define a ws server manager var Manager = ClientManager{ Broadcast: make(chan []byte), Register: make(chan *Client), Unregister: make(chan *Client), Clients: make(map[*Client]bool), } // Start is to start a ws server func (manager *ClientManager) Start() { for { select { case conn := <-manager.Register: manager.Clients[conn] = true jsonMessage, _ := json.Marshal(&Message{Content: "/A new socket has connected."}) manager.Send(jsonMessage, conn) case conn := <-manager.Unregister: if _, ok := manager.Clients[conn]; ok { delete(manager.Clients, conn) jsonMessage, _ := json.Marshal(&Message{Content: "/A socket has disconnected."}) manager.Send(jsonMessage, conn) } case message := <-manager.Broadcast: for conn := range manager.Clients { conn.Socket.WriteMessage(1, message) } } } } // Send is to send ws message to ws client func (manager *ClientManager) Send(message []byte, ignore *Client) { for conn := range manager.Clients { if conn != ignore { conn.Socket.WriteMessage(1, message) } } } func (c *Client) Send(message []byte) { c.Socket.WriteMessage(websocket.TextMessage, message) }