-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhub.go
86 lines (72 loc) · 1.83 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
package main
import "github.com/IT108/achieve-gateway-go/processor"
import "github.com/IT108/achieve-gateway-go/serialization"
type Message struct {
clientID string
msg []byte
}
// Hub maintains the set of active clients and broadcasts messages to the
// clients
type Hub struct {
// Registered clients.
clients map[string]*Client
// Authorized users.
users map[string][]*Client
// Inbound messages from the clients.
broadcast chan []byte
// Inbound messages from the internal clients.
send chan *Message
// Register requests from the clients.
register chan *Client
// Unregister requests from clients.
unregister chan *Client
}
func newHub() *Hub {
return &Hub{
broadcast: make(chan []byte),
send: make(chan *Message),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[string]*Client),
users: make(map[string][]*Client),
}
}
func (h *Hub) run() {
for {
select {
case client := <-h.register:
h.registerClient(client)
case client := <-h.unregister:
h.unregisterClient(client)
case message := <-h.broadcast:
processor.Process(serialization.Deserialize(string(message)))
case clientMsg := <-h.send:
if client, ok := h.clients[clientMsg.clientID]; ok {
select {
case client.send <- clientMsg.msg:
default:
close(client.send)
delete(h.clients, client.clientId)
}
}
//for _, client := range h.clients {
// select {
// case client.send <- message:
// default:
// close(client.send)
// delete(h.clients, client.clientId)
// }
//}
}
}
}
func (h *Hub) registerClient(client *Client) {
h.clients[client.clientId] = client
println(client.clientId)
}
func (h *Hub) unregisterClient(client *Client) {
if _, ok := h.clients[client.clientId]; ok {
delete(h.clients, client.clientId)
close(client.send)
}
}