2016-04-10 21:39:38 +00:00
|
|
|
// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
2017-03-25 19:45:10 +00:00
|
|
|
// hub maintains the set of active clients and broadcasts messages to the
|
|
|
|
// clients.
|
|
|
|
type Hub struct {
|
|
|
|
// Registered clients.
|
|
|
|
clients map[*Client]bool
|
2016-04-10 21:39:38 +00:00
|
|
|
|
2017-03-25 19:45:10 +00:00
|
|
|
// Inbound messages from the clients.
|
2016-04-10 21:39:38 +00:00
|
|
|
broadcast chan []byte
|
|
|
|
|
2017-03-25 19:45:10 +00:00
|
|
|
// Register requests from the clients.
|
|
|
|
register chan *Client
|
2016-04-10 21:39:38 +00:00
|
|
|
|
2017-03-25 19:45:10 +00:00
|
|
|
// Unregister requests from clients.
|
|
|
|
unregister chan *Client
|
2016-04-10 21:39:38 +00:00
|
|
|
}
|
|
|
|
|
2017-03-25 19:45:10 +00:00
|
|
|
func newHub() *Hub {
|
|
|
|
return &Hub{
|
|
|
|
broadcast: make(chan []byte),
|
|
|
|
register: make(chan *Client),
|
|
|
|
unregister: make(chan *Client),
|
|
|
|
clients: make(map[*Client]bool),
|
|
|
|
}
|
2016-04-10 21:39:38 +00:00
|
|
|
}
|
|
|
|
|
2017-03-25 19:45:10 +00:00
|
|
|
func (h *Hub) run() {
|
2016-04-10 21:39:38 +00:00
|
|
|
for {
|
|
|
|
select {
|
2017-03-25 19:45:10 +00:00
|
|
|
case client := <-h.register:
|
|
|
|
h.clients[client] = true
|
|
|
|
case client := <-h.unregister:
|
|
|
|
if _, ok := h.clients[client]; ok {
|
|
|
|
delete(h.clients, client)
|
|
|
|
close(client.send)
|
2016-04-10 21:39:38 +00:00
|
|
|
}
|
2017-03-25 19:45:10 +00:00
|
|
|
case message := <-h.broadcast:
|
|
|
|
for client := range h.clients {
|
2016-04-10 21:39:38 +00:00
|
|
|
select {
|
2017-03-25 19:45:10 +00:00
|
|
|
case client.send <- message:
|
2016-04-10 21:39:38 +00:00
|
|
|
default:
|
2017-03-25 19:45:10 +00:00
|
|
|
close(client.send)
|
|
|
|
delete(h.clients, client)
|
2016-04-10 21:39:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|