webtorrent/tracker_client.go | 19 +++++++++++++++++++ diff --git a/webtorrent/tracker_client.go b/webtorrent/tracker_client.go index 47267e0ebe3b3bf3ccc6d53eaeaa049ea6784ab8..c5aacaf25f36b7234d95fba430757bf48a29cbfb 100644 --- a/webtorrent/tracker_client.go +++ b/webtorrent/tracker_client.go @@ -35,6 +35,7 @@ outboundOffers map[string]outboundOffer // OfferID to outboundOffer wsConn *websocket.Conn closed bool stats TrackerClientStats + pingTicker *time.Ticker } func (me *TrackerClient) Stats() TrackerClientStats { @@ -78,7 +79,23 @@ tc.wsConn = c tc.cond.Broadcast() tc.mu.Unlock() tc.announceOffers() + closeChan := make(chan struct{}) + go func() { + for { + select { + case <-tc.pingTicker.C: + err := c.WriteMessage(websocket.PingMessage, []byte{}) + if err != nil { + return + } + case <-closeChan: + return + default: + } + } + }() err = tc.trackerReadLoop(tc.wsConn) + close(closeChan) tc.mu.Lock() c.Close() tc.mu.Unlock() @@ -86,6 +103,7 @@ return err } func (tc *TrackerClient) Run() error { + tc.pingTicker = time.NewTicker(60 * time.Second) tc.cond.L = &tc.mu tc.mu.Lock() for !tc.closed { @@ -112,6 +130,7 @@ if tc.wsConn != nil { tc.wsConn.Close() } tc.closeUnusedOffers() + tc.pingTicker.Stop() tc.mu.Unlock() tc.cond.Broadcast() return nil