11package server
22
3- // Hub является центральным узлом (чатом), который обрабатывает все соединения
3+ // Hub является центральным узлом (чатом), который обрабатывает все соединения.
44type Hub struct {
55 connections map [string ]* connection
66 broadcast chan []byte
@@ -17,26 +17,46 @@ func NewHub() *Hub {
1717 }
1818}
1919
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, куда попадают все публичные сообщения.
2129func (h * Hub ) Listen () {
2230 for {
2331 select {
2432 case conn := <- h .register :
25- h .connections [ conn . id ] = conn
33+ h .registerConn ( conn )
2634 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 )
3136 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 )
4060 }
4161 }
4262}
0 commit comments