Skip to content

Commit ccf8ecf

Browse files
authored
Revert nhooyr.io/websocket (#357)
due to issue: #321, and nhooyr.io/websocket is not active for maintain. revert pr #290. Signed-off-by: adshao <[email protected]>
1 parent 5c415dd commit ccf8ecf

File tree

5 files changed

+95
-138
lines changed

5 files changed

+95
-138
lines changed

v2/delivery/websocket.go

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package delivery
22

33
import (
4-
"context"
5-
"nhooyr.io/websocket"
64
"time"
5+
6+
"github.com/gorilla/websocket"
77
)
88

99
// WsHandler handle raw websocket message
@@ -24,10 +24,8 @@ func newWsConfig(endpoint string) *WsConfig {
2424
}
2525

2626
var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (doneC, stopC chan struct{}, err error) {
27-
ctx, cancel := context.WithCancel(context.Background())
28-
c, _, err := websocket.Dial(ctx, cfg.Endpoint, nil)
27+
c, _, err := websocket.DefaultDialer.Dial(cfg.Endpoint, nil)
2928
if err != nil {
30-
cancel()
3129
return nil, nil, err
3230
}
3331
c.SetReadLimit(655350)
@@ -38,9 +36,8 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
3836
// websocket.Conn.ReadMessage or when the stopC channel is
3937
// closed by the client.
4038
defer close(doneC)
41-
defer cancel()
4239
if WebsocketKeepalive {
43-
go keepAlive(ctx, c, WebsocketTimeout)
40+
keepAlive(c, WebsocketTimeout)
4441
}
4542
// Wait for the stopC channel to be closed. We do that in a
4643
// separate goroutine because ReadMessage is a blocking
@@ -52,13 +49,13 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
5249
silent = true
5350
case <-doneC:
5451
}
55-
_ = c.Close(websocket.StatusNormalClosure, "normal closure")
52+
c.Close()
5653
}()
5754
for {
58-
_, message, readErr := c.Read(ctx)
59-
if readErr != nil {
55+
_, message, err := c.ReadMessage()
56+
if err != nil {
6057
if !silent {
61-
errHandler(readErr)
58+
errHandler(err)
6259
}
6360
return
6461
}
@@ -68,21 +65,28 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
6865
return
6966
}
7067

71-
func keepAlive(ctx context.Context, c *websocket.Conn, d time.Duration) {
72-
t := time.NewTimer(d)
73-
defer t.Stop()
74-
for {
75-
select {
76-
case <-ctx.Done():
77-
return
78-
case <-t.C:
79-
}
68+
func keepAlive(c *websocket.Conn, timeout time.Duration) {
69+
ticker := time.NewTicker(timeout)
8070

81-
err := c.Ping(ctx)
82-
if err != nil {
83-
return
84-
}
71+
lastResponse := time.Now()
72+
c.SetPongHandler(func(msg string) error {
73+
lastResponse = time.Now()
74+
return nil
75+
})
8576

86-
t.Reset(d)
87-
}
77+
go func() {
78+
defer ticker.Stop()
79+
for {
80+
deadline := time.Now().Add(10 * time.Second)
81+
err := c.WriteControl(websocket.PingMessage, []byte{}, deadline)
82+
if err != nil {
83+
return
84+
}
85+
<-ticker.C
86+
if time.Since(lastResponse) > timeout {
87+
c.Close()
88+
return
89+
}
90+
}
91+
}()
8892
}

v2/futures/websocket.go

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package futures
22

33
import (
4-
"context"
5-
"nhooyr.io/websocket"
64
"time"
5+
6+
"github.com/gorilla/websocket"
77
)
88

99
// WsHandler handle raw websocket message
@@ -24,10 +24,8 @@ func newWsConfig(endpoint string) *WsConfig {
2424
}
2525

2626
var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (doneC, stopC chan struct{}, err error) {
27-
ctx, cancel := context.WithCancel(context.Background())
28-
c, _, err := websocket.Dial(ctx, cfg.Endpoint, nil)
27+
c, _, err := websocket.DefaultDialer.Dial(cfg.Endpoint, nil)
2928
if err != nil {
30-
cancel()
3129
return nil, nil, err
3230
}
3331
c.SetReadLimit(655350)
@@ -38,9 +36,8 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
3836
// websocket.Conn.ReadMessage or when the stopC channel is
3937
// closed by the client.
4038
defer close(doneC)
41-
defer cancel()
4239
if WebsocketKeepalive {
43-
go keepAlive(ctx, c, WebsocketTimeout)
40+
keepAlive(c, WebsocketTimeout)
4441
}
4542
// Wait for the stopC channel to be closed. We do that in a
4643
// separate goroutine because ReadMessage is a blocking
@@ -52,13 +49,13 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
5249
silent = true
5350
case <-doneC:
5451
}
55-
_ = c.Close(websocket.StatusNormalClosure, "normal closure")
52+
c.Close()
5653
}()
5754
for {
58-
_, message, readErr := c.Read(ctx)
59-
if readErr != nil {
55+
_, message, err := c.ReadMessage()
56+
if err != nil {
6057
if !silent {
61-
errHandler(readErr)
58+
errHandler(err)
6259
}
6360
return
6461
}
@@ -68,21 +65,28 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
6865
return
6966
}
7067

71-
func keepAlive(ctx context.Context, c *websocket.Conn, d time.Duration) {
72-
t := time.NewTimer(d)
73-
defer t.Stop()
74-
for {
75-
select {
76-
case <-ctx.Done():
77-
return
78-
case <-t.C:
79-
}
68+
func keepAlive(c *websocket.Conn, timeout time.Duration) {
69+
ticker := time.NewTicker(timeout)
8070

81-
err := c.Ping(ctx)
82-
if err != nil {
83-
return
84-
}
71+
lastResponse := time.Now()
72+
c.SetPongHandler(func(msg string) error {
73+
lastResponse = time.Now()
74+
return nil
75+
})
8576

86-
t.Reset(d)
87-
}
77+
go func() {
78+
defer ticker.Stop()
79+
for {
80+
deadline := time.Now().Add(10 * time.Second)
81+
err := c.WriteControl(websocket.PingMessage, []byte{}, deadline)
82+
if err != nil {
83+
return
84+
}
85+
<-ticker.C
86+
if time.Since(lastResponse) > timeout {
87+
c.Close()
88+
return
89+
}
90+
}
91+
}()
8892
}

v2/go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ go 1.13
55
require (
66
github.com/bitly/go-simplejson v0.5.0
77
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect
8-
github.com/klauspost/compress v1.13.1 // indirect
8+
github.com/gorilla/websocket v1.5.0
99
github.com/kr/pretty v0.2.0 // indirect
1010
github.com/stretchr/testify v1.4.0
11-
nhooyr.io/websocket v1.8.7
1211
)

v2/go.sum

Lines changed: 4 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,76 +2,22 @@ github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkN
22
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
33
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
44
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
5+
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
56
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7-
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8-
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
9-
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
10-
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
11-
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
12-
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
13-
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
14-
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
15-
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
16-
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
17-
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
18-
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
19-
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
20-
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
21-
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
22-
github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
23-
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
24-
github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
25-
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
26-
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
27-
github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
28-
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
29-
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
30-
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
31-
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
32-
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
33-
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
34-
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
35-
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
36-
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
37-
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
38-
github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ=
39-
github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
7+
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
8+
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
409
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
4110
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
4211
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
4312
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
4413
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
45-
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
46-
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
47-
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
48-
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
49-
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
50-
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
51-
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
52-
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
5314
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
5415
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5516
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
5617
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
57-
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
5818
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
5919
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
60-
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
61-
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
62-
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
63-
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
64-
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
65-
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
66-
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
67-
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
68-
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
69-
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
70-
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7120
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
7221
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
22+
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
7323
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
74-
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
75-
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
76-
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
77-
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=

v2/websocket.go

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package binance
22

33
import (
4-
"context"
5-
"nhooyr.io/websocket"
64
"time"
5+
6+
"github.com/gorilla/websocket"
77
)
88

99
// WsHandler handle raw websocket message
@@ -24,10 +24,8 @@ func newWsConfig(endpoint string) *WsConfig {
2424
}
2525

2626
var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (doneC, stopC chan struct{}, err error) {
27-
ctx, cancel := context.WithCancel(context.Background())
28-
c, _, err := websocket.Dial(ctx, cfg.Endpoint, nil)
27+
c, _, err := websocket.DefaultDialer.Dial(cfg.Endpoint, nil)
2928
if err != nil {
30-
cancel()
3129
return nil, nil, err
3230
}
3331
c.SetReadLimit(655350)
@@ -38,9 +36,8 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
3836
// websocket.Conn.ReadMessage or when the stopC channel is
3937
// closed by the client.
4038
defer close(doneC)
41-
defer cancel()
4239
if WebsocketKeepalive {
43-
go keepAlive(ctx, c, WebsocketTimeout)
40+
keepAlive(c, WebsocketTimeout)
4441
}
4542
// Wait for the stopC channel to be closed. We do that in a
4643
// separate goroutine because ReadMessage is a blocking
@@ -52,13 +49,13 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
5249
silent = true
5350
case <-doneC:
5451
}
55-
_ = c.Close(websocket.StatusNormalClosure, "normal closure")
52+
c.Close()
5653
}()
5754
for {
58-
_, message, readErr := c.Read(ctx)
59-
if readErr != nil {
55+
_, message, err := c.ReadMessage()
56+
if err != nil {
6057
if !silent {
61-
errHandler(readErr)
58+
errHandler(err)
6259
}
6360
return
6461
}
@@ -68,21 +65,28 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
6865
return
6966
}
7067

71-
func keepAlive(ctx context.Context, c *websocket.Conn, d time.Duration) {
72-
t := time.NewTimer(d)
73-
defer t.Stop()
74-
for {
75-
select {
76-
case <-ctx.Done():
77-
return
78-
case <-t.C:
79-
}
68+
func keepAlive(c *websocket.Conn, timeout time.Duration) {
69+
ticker := time.NewTicker(timeout)
8070

81-
err := c.Ping(ctx)
82-
if err != nil {
83-
return
84-
}
71+
lastResponse := time.Now()
72+
c.SetPongHandler(func(msg string) error {
73+
lastResponse = time.Now()
74+
return nil
75+
})
8576

86-
t.Reset(d)
87-
}
77+
go func() {
78+
defer ticker.Stop()
79+
for {
80+
deadline := time.Now().Add(10 * time.Second)
81+
err := c.WriteControl(websocket.PingMessage, []byte{}, deadline)
82+
if err != nil {
83+
return
84+
}
85+
<-ticker.C
86+
if time.Since(lastResponse) > timeout {
87+
c.Close()
88+
return
89+
}
90+
}
91+
}()
8892
}

0 commit comments

Comments
 (0)