<-t.closed.LockedChan(t.cl.locker())
release()
}()
- wst := websocketTracker{u, wtc}
+ wst := websocketTrackerStatus{u, wtc}
go func() {
err := wtc.Announce(tracker.Started, t.infoHash)
if err != nil {
"github.com/pion/webrtc/v2"
)
+type TrackerClientStats struct {
+ Dials int64
+ ConvertedInboundConns int64
+ ConvertedOutboundConns int64
+}
+
// Client represents the webtorrent client
type TrackerClient struct {
Url string
outboundOffers map[string]outboundOffer // OfferID to outboundOffer
wsConn *websocket.Conn
closed bool
+ stats TrackerClientStats
+}
+
+func (me *TrackerClient) Stats() TrackerClientStats {
+ me.mu.Lock()
+ defer me.mu.Unlock()
+ return me.stats
}
func (me *TrackerClient) peerIdBinary() string {
func (tc *TrackerClient) doWebsocket() error {
metrics.Add("websocket dials", 1)
+ tc.stats.Dials++
c, _, err := websocket.DefaultDialer.Dial(tc.Url, nil)
if err != nil {
return fmt.Errorf("dialing tracker: %w", err)
setDataChannelOnOpen(d, peerConnection, func(dc datachannel.ReadWriteCloser) {
timer.Stop()
metrics.Add("answering peer connection conversions", 1)
+ tc.mu.Lock()
+ tc.stats.ConvertedInboundConns++
+ tc.mu.Unlock()
tc.OnConn(dc, DataChannelContext{
Local: answer,
Remote: offer,
metrics.Add("outbound offers answered", 1)
err := offer.setAnswer(answer, func(dc datachannel.ReadWriteCloser) {
metrics.Add("outbound offers answered with datachannel", 1)
+ tc.mu.Lock()
+ tc.stats.ConvertedOutboundConns++
+ tc.mu.Unlock()
tc.OnConn(dc, DataChannelContext{
Local: offer.originalOffer,
Remote: answer,
"github.com/pion/datachannel"
)
-type websocketTracker struct {
+type websocketTrackerStatus struct {
url url.URL
- *webtorrent.TrackerClient
+ tc *webtorrent.TrackerClient
}
-func (me websocketTracker) statusLine() string {
- return fmt.Sprintf("%q", me.url.String())
+func (me websocketTrackerStatus) statusLine() string {
+ return fmt.Sprintf("%q: %+v", me.tc.Url, me.tc.Stats())
}
-func (me websocketTracker) URL() url.URL {
+func (me websocketTrackerStatus) URL() url.URL {
return me.url
}