8 "github.com/anacrolix/log"
10 "github.com/anacrolix/torrent/tracker"
11 "github.com/anacrolix/torrent/webtorrent"
12 "github.com/pion/datachannel"
15 type websocketTrackerStatus struct {
17 tc *webtorrent.TrackerClient
20 func (me websocketTrackerStatus) statusLine() string {
21 return fmt.Sprintf("%+v", me.tc.Stats())
24 func (me websocketTrackerStatus) URL() *url.URL {
28 type refCountedWebtorrentTrackerClient struct {
29 webtorrent.TrackerClient
33 type websocketTrackers struct {
36 GetAnnounceRequest func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
37 OnConn func(datachannel.ReadWriteCloser, webtorrent.DataChannelContext)
39 clients map[string]*refCountedWebtorrentTrackerClient
42 func (me *websocketTrackers) Get(url string) (*webtorrent.TrackerClient, func()) {
45 value, ok := me.clients[url]
47 value = &refCountedWebtorrentTrackerClient{
48 TrackerClient: webtorrent.TrackerClient{
50 GetAnnounceRequest: me.GetAnnounceRequest,
53 Logger: me.Logger.WithText(func(m log.Msg) string {
54 return fmt.Sprintf("tracker client for %q: %v", url, m)
58 value.TrackerClient.Start(func(err error) {
60 me.Logger.Printf("error running tracker client for %q: %v", url, err)
63 if me.clients == nil {
64 me.clients = make(map[string]*refCountedWebtorrentTrackerClient)
66 me.clients[url] = value
69 return &value.TrackerClient, func() {
73 if value.refCount == 0 {
74 value.TrackerClient.Close()
75 delete(me.clients, url)