Skip to content

Commit 470cfd0

Browse files
authored
Fix ws (#106)
* upd ui * fix
1 parent a7b6f64 commit 470cfd0

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

api/main_handler.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func NewHandler(services APIServices) http.Handler {
4040
"allocs",
4141
"block",
4242
"mutex",
43+
"txpool",
4344
"admin",
4445
}
4546

api/websocket_handler.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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**
8183
func (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

Comments
 (0)