8 "github.com/pion/datachannel"
9 "github.com/pion/webrtc/v3"
10 "go.opentelemetry.io/otel"
11 "go.opentelemetry.io/otel/attribute"
12 "go.opentelemetry.io/otel/trace"
14 "github.com/anacrolix/torrent/webtorrent"
17 const webrtcNetwork = "webrtc"
19 type webrtcNetConn struct {
20 datachannel.ReadWriteCloser
21 webtorrent.DataChannelContext
24 type webrtcNetAddr struct {
28 var _ net.Addr = webrtcNetAddr{}
30 func (webrtcNetAddr) Network() string {
31 // Now that we have the ICE candidate, we can tell if it's over udp or tcp. But should we use
32 // that for the network?
36 func (me webrtcNetAddr) String() string {
37 return net.JoinHostPort(me.Address, strconv.FormatUint(uint64(me.Port), 10))
40 func (me webrtcNetConn) LocalAddr() net.Addr {
41 // I'm not sure if this evolves over time. It might also be unavailable if the PeerConnection is
42 // closed or closes itself. The same concern applies to RemoteAddr.
43 pair, err := me.DataChannelContext.GetSelectedIceCandidatePair()
47 return webrtcNetAddr{pair.Local}
50 func (me webrtcNetConn) RemoteAddr() net.Addr {
51 // See comments on LocalAddr.
52 pair, err := me.DataChannelContext.GetSelectedIceCandidatePair()
56 return webrtcNetAddr{pair.Remote}
59 // Do we need these for WebRTC connections exposed as net.Conns? Can we set them somewhere inside
60 // PeerConnection or on the channel or some transport?
62 func (w webrtcNetConn) SetDeadline(t time.Time) error {
63 w.Span.AddEvent("SetDeadline", trace.WithAttributes(attribute.String("time", t.String())))
67 func (w webrtcNetConn) SetReadDeadline(t time.Time) error {
68 w.Span.AddEvent("SetReadDeadline", trace.WithAttributes(attribute.String("time", t.String())))
72 func (w webrtcNetConn) SetWriteDeadline(t time.Time) error {
73 w.Span.AddEvent("SetWriteDeadline", trace.WithAttributes(attribute.String("time", t.String())))
77 func (w webrtcNetConn) Read(b []byte) (n int, err error) {
78 _, span := otel.Tracer(tracerName).Start(w.Context, "Read")
80 span.SetAttributes(attribute.Int("buf_len", len(b)))
81 n, err = w.ReadWriteCloser.Read(b)
83 span.SetAttributes(attribute.Int("bytes_read", n))