]> Sergey Matveev's repositories - btrtrc.git/blobdiff - wstracker.go
Drop support for go 1.20
[btrtrc.git] / wstracker.go
index f93f784a7f3c87c0bdc458d2d5f3fef38b4e29df..84af9cbfc18fc0de09a2fafd7199d7dec97f04ca 100644 (file)
@@ -1,15 +1,20 @@
 package torrent
 
 import (
+       "context"
        "fmt"
+       "net"
+       netHttp "net/http"
        "net/url"
        "sync"
 
        "github.com/anacrolix/log"
+       "github.com/gorilla/websocket"
+       "github.com/pion/datachannel"
 
        "github.com/anacrolix/torrent/tracker"
+       httpTracker "github.com/anacrolix/torrent/tracker/http"
        "github.com/anacrolix/torrent/webtorrent"
-       "github.com/pion/datachannel"
 )
 
 type websocketTrackerStatus struct {
@@ -31,21 +36,27 @@ type refCountedWebtorrentTrackerClient struct {
 }
 
 type websocketTrackers struct {
-       PeerId             [20]byte
-       Logger             log.Logger
-       GetAnnounceRequest func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
-       OnConn             func(datachannel.ReadWriteCloser, webtorrent.DataChannelContext)
-       mu                 sync.Mutex
-       clients            map[string]*refCountedWebtorrentTrackerClient
+       PeerId                     [20]byte
+       Logger                     log.Logger
+       GetAnnounceRequest         func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
+       OnConn                     func(datachannel.ReadWriteCloser, webtorrent.DataChannelContext)
+       mu                         sync.Mutex
+       clients                    map[string]*refCountedWebtorrentTrackerClient
+       Proxy                      httpTracker.ProxyFunc
+       DialContext                func(ctx context.Context, network, addr string) (net.Conn, error)
+       WebsocketTrackerHttpHeader func() netHttp.Header
+       ICEServers                 []string
 }
 
-func (me *websocketTrackers) Get(url string) (*webtorrent.TrackerClient, func()) {
+func (me *websocketTrackers) Get(url string, infoHash [20]byte) (*webtorrent.TrackerClient, func()) {
        me.mu.Lock()
        defer me.mu.Unlock()
        value, ok := me.clients[url]
        if !ok {
+               dialer := &websocket.Dialer{Proxy: me.Proxy, NetDialContext: me.DialContext, HandshakeTimeout: websocket.DefaultDialer.HandshakeTimeout}
                value = &refCountedWebtorrentTrackerClient{
                        TrackerClient: webtorrent.TrackerClient{
+                               Dialer:             dialer,
                                Url:                url,
                                GetAnnounceRequest: me.GetAnnounceRequest,
                                PeerId:             me.PeerId,
@@ -53,6 +64,8 @@ func (me *websocketTrackers) Get(url string) (*webtorrent.TrackerClient, func())
                                Logger: me.Logger.WithText(func(m log.Msg) string {
                                        return fmt.Sprintf("tracker client for %q: %v", url, m)
                                }),
+                               WebsocketTrackerHttpHeader: me.WebsocketTrackerHttpHeader,
+                               ICEServers:                 me.ICEServers,
                        },
                }
                value.TrackerClient.Start(func(err error) {
@@ -69,6 +82,7 @@ func (me *websocketTrackers) Get(url string) (*webtorrent.TrackerClient, func())
        return &value.TrackerClient, func() {
                me.mu.Lock()
                defer me.mu.Unlock()
+               value.TrackerClient.CloseOffersForInfohash(infoHash)
                value.refCount--
                if value.refCount == 0 {
                        value.TrackerClient.Close()