1
1
package server
2
2
3
- // Hub является центральным узлом (чатом), который обрабатывает все соединения
3
+ // Hub является центральным узлом (чатом), который обрабатывает все соединения.
4
4
type Hub struct {
5
5
connections map [string ]* connection
6
6
broadcast chan []byte
@@ -17,26 +17,46 @@ func NewHub() *Hub {
17
17
}
18
18
}
19
19
20
- // Listen прослушивает новые соединения, закрытые соединения и сообщения из канала broadcast
20
+ // Connection возращает ссылку на соединения и булево значение о том,
21
+ // существует ли такое соединение в Hub.
22
+ func (h Hub ) Connection (id string ) (conn * connection , exists bool ) {
23
+ conn , exists = h .connections [id ]
24
+ return
25
+ }
26
+
27
+ // Listen прослушивает сигнал на создание нового соеднинения, закрытия соединения,
28
+ // а также сообщения из канала broadcast, куда попадают все публичные сообщения.
21
29
func (h * Hub ) Listen () {
22
30
for {
23
31
select {
24
32
case conn := <- h .register :
25
- h .connections [ conn . id ] = conn
33
+ h .registerConn ( conn )
26
34
case conn := <- h .unregister :
27
- if _ , ok := h .connections [conn .id ]; ok {
28
- delete (h .connections , conn .id )
29
- close (conn .send )
30
- }
35
+ h .unregisterConn (conn )
31
36
case message := <- h .broadcast :
32
- for _ , conn := range h .connections {
33
- select {
34
- case conn .send <- message :
35
- default :
36
- delete (h .connections , conn .id )
37
- close (conn .send )
38
- }
39
- }
37
+ h .sendMessageAllConnections (message )
38
+ }
39
+ }
40
+ }
41
+
42
+ func (h * Hub ) registerConn (conn * connection ) {
43
+ h .connections [conn .id ] = conn
44
+ }
45
+
46
+ func (h * Hub ) unregisterConn (conn * connection ) {
47
+ if _ , ok := h .connections [conn .id ]; ok {
48
+ delete (h .connections , conn .id )
49
+ close (conn .send )
50
+ }
51
+ }
52
+
53
+ func (h * Hub ) sendMessageAllConnections (message []byte ) {
54
+ for _ , conn := range h .connections {
55
+ select {
56
+ case conn .send <- message :
57
+ default :
58
+ delete (h .connections , conn .id )
59
+ close (conn .send )
40
60
}
41
61
}
42
62
}
0 commit comments