client.go | 1 + config.go | 4 ++++ webtorrent/tracker-client.go | 1 + webtorrent/transport.go | 12 +++++++----- wstracker.go | 2 ++ diff --git a/client.go b/client.go index b0f4b2a3728a497a5e0061379f6def8f136fce33..a87e44391f657508406c243b74df06602c81b030 100644 --- a/client.go +++ b/client.go @@ -301,6 +301,7 @@ return t.announceRequest(event), nil }, Proxy: cl.config.HTTPProxy, WebsocketTrackerHttpHeader: cl.config.WebsocketTrackerHttpHeader, + ICEServers: cl.config.ICEServers, DialContext: cl.config.TrackerDialContext, OnConn: func(dc datachannel.ReadWriteCloser, dcc webtorrent.DataChannelContext) { cl.lock() diff --git a/config.go b/config.go index fca37e637a5d5c8a148d96fe2a1895a88133a345..cfcfe392c3beb0d550c9ff6b6b451cb2f4eb2019 100644 --- a/config.go +++ b/config.go @@ -181,6 +181,10 @@ DisableWebseeds bool Callbacks Callbacks + // ICEServers defines a slice describing servers available to be used by + // ICE, such as STUN and TURN servers. + ICEServers []string + DialRateLimiter *rate.Limiter } diff --git a/webtorrent/tracker-client.go b/webtorrent/tracker-client.go index 30a35be7712d0fe5848f34ab76bf602ed990d138..bc9dab312e2d64acf843f46d423b424e1514ebad 100644 --- a/webtorrent/tracker-client.go +++ b/webtorrent/tracker-client.go @@ -43,6 +43,7 @@ stats TrackerClientStats pingTicker *time.Ticker WebsocketTrackerHttpHeader func() http.Header + ICEServers []string } func (me *TrackerClient) Stats() TrackerClientStats { diff --git a/webtorrent/transport.go b/webtorrent/transport.go index 610301db2c8a71cef7007d69d7287715c5174f67..856625874c8becc00be22a6ee600d401c260b13a 100644 --- a/webtorrent/transport.go +++ b/webtorrent/transport.go @@ -29,7 +29,6 @@ // Enable the detach API (since it's non-standard but more idiomatic). s.DetachDataChannels() return webrtc.NewAPI(webrtc.WithSettingEngine(s)) }() - config = webrtc.Configuration{ICEServers: []webrtc.ICEServer{{URLs: []string{"stun:stun.l.google.com:19302"}}}} newPeerConnectionMu sync.Mutex ) @@ -49,11 +48,14 @@ me.span.End() return err } -func newPeerConnection(logger log.Logger) (*wrappedPeerConnection, error) { +func newPeerConnection(logger log.Logger, iceServers []string) (*wrappedPeerConnection, error) { newPeerConnectionMu.Lock() defer newPeerConnectionMu.Unlock() ctx, span := otel.Tracer(tracerName).Start(context.Background(), "PeerConnection") - pc, err := api.NewPeerConnection(config) + + pcConfig := webrtc.Configuration{ICEServers: []webrtc.ICEServer{{URLs: iceServers}}} + + pc, err := api.NewPeerConnection(pcConfig) if err != nil { span.SetStatus(codes.Error, err.Error()) span.RecordError(err) @@ -99,7 +101,7 @@ dataChannel *webrtc.DataChannel, offer webrtc.SessionDescription, err error, ) { - peerConnection, err = newPeerConnection(logger) + peerConnection, err = newPeerConnection(logger, tc.ICEServers) if err != nil { return } @@ -191,7 +193,7 @@ offerContext offerContext, ) ( peerConn *wrappedPeerConnection, answer webrtc.SessionDescription, err error, ) { - peerConn, err = newPeerConnection(tc.Logger) + peerConn, err = newPeerConnection(tc.Logger, tc.ICEServers) if err != nil { err = fmt.Errorf("failed to create new connection: %w", err) return diff --git a/wstracker.go b/wstracker.go index c379dc312030dbfac9483509e81e3bbbb6505b4f..84af9cbfc18fc0de09a2fafd7199d7dec97f04ca 100644 --- a/wstracker.go +++ b/wstracker.go @@ -45,6 +45,7 @@ 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, infoHash [20]byte) (*webtorrent.TrackerClient, func()) { @@ -64,6 +65,7 @@ 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) {