Terminate WebSocketClient.pingWatchdog goroutine when closing the connection (#13655)
Co-authored-by: mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
b98bb1624f
Коммит
3b732fe257
@@ -31,6 +31,7 @@ type WebSocketClient struct {
|
|||||||
ResponseChannel chan *WebSocketResponse // The channel used to receive responses for requests made to the server
|
ResponseChannel chan *WebSocketResponse // The channel used to receive responses for requests made to the server
|
||||||
ListenError *AppError // A field that is set if there was an abnormal closure of the WebSocket connection
|
ListenError *AppError // A field that is set if there was an abnormal closure of the WebSocket connection
|
||||||
pingTimeoutTimer *time.Timer
|
pingTimeoutTimer *time.Timer
|
||||||
|
closeChannel chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWebSocketClient constructs a new WebSocket client with convenience
|
// NewWebSocketClient constructs a new WebSocket client with convenience
|
||||||
@@ -59,6 +60,7 @@ func NewWebSocketClientWithDialer(dialer *websocket.Dialer, url, authToken strin
|
|||||||
make(chan *WebSocketResponse, 100),
|
make(chan *WebSocketResponse, 100),
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
|
make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
client.configurePingHandling()
|
client.configurePingHandling()
|
||||||
@@ -111,6 +113,7 @@ func (wsc *WebSocketClient) Listen() {
|
|||||||
wsc.Conn.Close()
|
wsc.Conn.Close()
|
||||||
close(wsc.EventChannel)
|
close(wsc.EventChannel)
|
||||||
close(wsc.ResponseChannel)
|
close(wsc.ResponseChannel)
|
||||||
|
close(wsc.closeChannel)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@@ -193,6 +196,9 @@ func (wsc *WebSocketClient) pingHandler(appData string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (wsc *WebSocketClient) pingWatchdog() {
|
func (wsc *WebSocketClient) pingWatchdog() {
|
||||||
<-wsc.pingTimeoutTimer.C
|
select {
|
||||||
|
case <-wsc.pingTimeoutTimer.C:
|
||||||
wsc.PingTimeoutChannel <- true
|
wsc.PingTimeoutChannel <- true
|
||||||
|
case <-wsc.closeChannel:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user