-
Notifications
You must be signed in to change notification settings - Fork 0
/
hub.go
87 lines (75 loc) · 1.6 KB
/
hub.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package ws_chat
// Hub maintains the set of active clients and broadcasts messages to the
// clients.
type Hub struct {
// Registered clients.
clients map[*Client]bool
// Inbound messages from the clients.
broadcast chan message
// Register requests from the clients.
register chan *Client
// Unregister requests from clients.
unregister chan *Client
sendTo chan message
}
func NewHub() *Hub {
return &Hub{
sendTo: make(chan message),
broadcast: make(chan message),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
}
}
func (h *Hub) Run() {
for {
select {
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)
}
case message := <-h.broadcast:
for client := range h.clients {
select {
case client.send <- message:
default:
close(client.send)
delete(h.clients, client)
}
}
case message := <-h.sendTo:
for client := range h.clients {
if client.uuid == message.to {
select {
case client.send <- message:
default:
close(client.send)
delete(h.clients, client)
}
}
}
}
}
}
func (h *Hub) Broadcast(str interface{}, event MessageEvent) {
msg := message{
Event: event,
Data: str,
}
h.broadcast <- msg
}
func (h *Hub) Send(uuid string, str interface{}, event MessageEvent) {
msg := message{
to: uuid,
Event: event,
Data: str,
}
h.sendTo <- msg
}
//Count get Clients
func (h *Hub) Count() int {
return len(h.clients)
}