@@ -27,6 +27,7 @@ type WebsocketHandler struct {
2727 writeQueue chan []byte
2828 conn * websocket.Conn
2929 closeChan chan struct {}
30+ closed bool
3031}
3132
3233// **NewWebsocketHandler initializes WebsocketHandler**
@@ -35,6 +36,7 @@ func NewWebsocketHandler(conn *websocket.Conn) *WebsocketHandler {
3536 writeQueue : make (chan []byte , 100 ),
3637 conn : conn ,
3738 closeChan : make (chan struct {}),
39+ closed : false ,
3840 }
3941
4042 go handler .startWriter () // Start dedicated writer goroutine
@@ -79,6 +81,14 @@ func (h *WebsocketHandler) startWriter() {
7981
8082// **Close WebSocket connection and stop writer**
8183func (h * WebsocketHandler ) closeConnection () {
84+ h .mu .Lock ()
85+ if h .closed {
86+ h .mu .Unlock ()
87+ return
88+ }
89+ h .closed = true
90+ h .mu .Unlock ()
91+
8292 close (h .closeChan )
8393 h .conn .Close ()
8494}
@@ -111,10 +121,14 @@ func (h *APIHandler) HandleWebSocket(w http.ResponseWriter, r *http.Request) {
111121 for {
112122 select {
113123 case <- r .Context ().Done ():
124+ handler .closeConnection ()
114125 return
115126 case <- handler .closeChan : // Graceful shutdown
116127 return
117- case message := <- channel :
128+ case message , ok := <- channel :
129+ if ! ok {
130+ return
131+ }
118132 handler .sendResponse (& ClientResponse {
119133 Status : "success" ,
120134 Message : string (message ),
@@ -128,16 +142,20 @@ func (h *APIHandler) HandleWebSocket(w http.ResponseWriter, r *http.Request) {
128142 return nil
129143 })
130144
131- go func () {
132- ticker := time .NewTicker (10 * time .Second )
133- defer ticker .Stop ()
145+ pingTicker := time .NewTicker (10 * time .Second )
146+ defer pingTicker .Stop ()
134147
148+ go func () {
135149 for {
136150 select {
137151 case <- handler .closeChan :
138152 return
139- case <- ticker .C :
153+ case <- pingTicker .C :
140154 handler .mu .Lock ()
155+ if handler .closed {
156+ handler .mu .Unlock ()
157+ return
158+ }
141159 err := conn .WriteMessage (websocket .PingMessage , nil )
142160 handler .mu .Unlock ()
143161
0 commit comments