Skip to content

Commit 80628c4

Browse files
committed
add hub struct for connections
1 parent 5a7295f commit 80628c4

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,6 @@ func BindRoutes(s server.Server, r *mux.Router) {
5555
r.HandleFunc("/posts/{id}", handlers.DeletePostHandler(s)).Methods(http.MethodDelete)
5656
r.HandleFunc("/posts", handlers.ListPostHandler(s)).Methods(http.MethodGet)
5757

58-
r.HandleFunc("/ws", hub.HandleWebSocket(s))
58+
go hub.Run()
59+
r.HandleFunc("/ws", hub.HandleWebSocket)
5960
}

websocket/client.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package websocket
22

33
import (
44
"github.com/gorilla/websocket"
5-
"golang.org/x/text/message"
65
)
76

87
type Client struct {
@@ -23,7 +22,7 @@ func NewClient (hub *Hub, socket *websocket.Conn) *Client {
2322
func (c *Client) Write() {
2423
for {
2524
select {
26-
case message, ok: <- c.outbound:
25+
case message, ok := <- c.outbound:
2726
if !ok {
2827
c.socket.WriteMessage(websocket.CloseMessage, []byte{})
2928
return

websocket/hub.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,41 @@ func (hub *Hub) HandleWebSocket(w http.ResponseWriter, r *http.Request) {
3838
hub.register <- client
3939

4040
go client.Write()
41+
}
42+
43+
func (hub *Hub) Run() {
44+
for {
45+
select {
46+
case client := <- hub.register:
47+
hub.onConnect(client)
48+
case client := <- hub.unregister:
49+
hub.onDisconnect(client)
50+
}
51+
}
52+
}
53+
54+
func (hub *Hub) onConnect(client *Client) {
55+
log.Println("Client Connected", client.socket.RemoteAddr())
56+
57+
hub.mutex.Lock()
58+
defer hub.mutex.Unlock()
59+
client.id = client.socket.RemoteAddr().String()
60+
hub.clients = append(hub.clients, client)
61+
}
62+
63+
func (hub *Hub) onDisconnect(client *Client) {
64+
log.Println("Client Disconnected", client.socket.RemoteAddr())
65+
client.socket.Close()
66+
hub.mutex.Lock()
67+
defer hub.mutex.Unlock()
68+
69+
i := -1
70+
for j, c := range hub.clients {
71+
if c.id == client.id {
72+
i = j
73+
}
74+
}
75+
copy(hub.clients[i:], hub.clients[i+1:])
76+
hub.clients[len(hub.clients) - 1] = nil
77+
hub.clients = hub.clients[:len(hub.clients) - 1]
4178
}

0 commit comments

Comments
 (0)