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