5 "github.com/anacrolix/log"
6 "github.com/anacrolix/torrent/tracker/http"
7 "github.com/gorilla/websocket"
11 "github.com/anacrolix/torrent/tracker"
12 "github.com/anacrolix/torrent/webtorrent"
13 "github.com/pion/datachannel"
16 type websocketTrackerStatus struct {
18 tc *webtorrent.TrackerClient
21 func (me websocketTrackerStatus) statusLine() string {
22 return fmt.Sprintf("%+v", me.tc.Stats())
25 func (me websocketTrackerStatus) URL() *url.URL {
29 type refCountedWebtorrentTrackerClient struct {
30 webtorrent.TrackerClient
34 type websocketTrackers struct {
37 GetAnnounceRequest func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
38 OnConn func(datachannel.ReadWriteCloser, webtorrent.DataChannelContext)
40 clients map[string]*refCountedWebtorrentTrackerClient
44 func (me *websocketTrackers) Get(url string) (*webtorrent.TrackerClient, func()) {
47 value, ok := me.clients[url]
49 dialer := &websocket.Dialer{Proxy: me.Proxy, HandshakeTimeout: websocket.DefaultDialer.HandshakeTimeout}
50 value = &refCountedWebtorrentTrackerClient{
51 TrackerClient: webtorrent.TrackerClient{
54 GetAnnounceRequest: me.GetAnnounceRequest,
57 Logger: me.Logger.WithText(func(m log.Msg) string {
58 return fmt.Sprintf("tracker client for %q: %v", url, m)
62 value.TrackerClient.Start(func(err error) {
64 me.Logger.Printf("error running tracker client for %q: %v", url, err)
67 if me.clients == nil {
68 me.clients = make(map[string]*refCountedWebtorrentTrackerClient)
70 me.clients[url] = value
73 return &value.TrackerClient, func() {
77 if value.refCount == 0 {
78 value.TrackerClient.Close()
79 delete(me.clients, url)