|
|
@ -17,6 +17,7 @@ import ( |
|
|
"github.com/pion/dtls/v3" |
|
|
"github.com/pion/dtls/v3" |
|
|
"github.com/pion/dtls/v3/pkg/crypto/selfsign" |
|
|
"github.com/pion/dtls/v3/pkg/crypto/selfsign" |
|
|
"github.com/pion/logging" |
|
|
"github.com/pion/logging" |
|
|
|
|
|
"github.com/pion/transport/v4" |
|
|
"github.com/pion/turn/v5" |
|
|
"github.com/pion/turn/v5" |
|
|
"io" |
|
|
"io" |
|
|
"log" |
|
|
"log" |
|
|
@ -33,6 +34,120 @@ import ( |
|
|
|
|
|
|
|
|
type getCredsFunc func(string) (string, string, string, error) |
|
|
type getCredsFunc func(string) (string, string, string, error) |
|
|
|
|
|
|
|
|
|
|
|
func closeWithLog(closer io.Closer, msg string) { |
|
|
|
|
|
if err := closer.Close(); err != nil { |
|
|
|
|
|
log.Printf("%s: %v", msg, err) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func setDeadlineWithLog(conn interface{ SetDeadline(time.Time) error }, t time.Time, msg string) { |
|
|
|
|
|
if err := conn.SetDeadline(t); err != nil { |
|
|
|
|
|
log.Printf("%s: %v", msg, err) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func setReadDeadlineWithLog(conn interface{ SetReadDeadline(time.Time) error }, t time.Time, msg string) { |
|
|
|
|
|
if err := conn.SetReadDeadline(t); err != nil { |
|
|
|
|
|
log.Printf("%s: %v", msg, err) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// directNet implements pion/transport.Net without enumerating system interfaces.
|
|
|
|
|
|
// iSH on iPhone often fails on net.Interfaces()/netlink, but TURN client setup
|
|
|
|
|
|
// only needs dial/listen/resolve operations.
|
|
|
|
|
|
type directNet struct{} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) ListenPacket(network string, address string) (net.PacketConn, error) { |
|
|
|
|
|
return net.ListenPacket(network, address) //nolint:noctx
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) ListenUDP(network string, locAddr *net.UDPAddr) (transport.UDPConn, error) { |
|
|
|
|
|
return net.ListenUDP(network, locAddr) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) ListenTCP(network string, laddr *net.TCPAddr) (transport.TCPListener, error) { |
|
|
|
|
|
l, err := net.ListenTCP(network, laddr) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return tcpListener{TCPListener: l}, nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) Dial(network, address string) (net.Conn, error) { |
|
|
|
|
|
return net.Dial(network, address) //nolint:noctx
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) DialUDP(network string, laddr, raddr *net.UDPAddr) (transport.UDPConn, error) { |
|
|
|
|
|
return net.DialUDP(network, laddr, raddr) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) DialTCP(network string, laddr, raddr *net.TCPAddr) (transport.TCPConn, error) { |
|
|
|
|
|
return net.DialTCP(network, laddr, raddr) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) ResolveIPAddr(network, address string) (*net.IPAddr, error) { |
|
|
|
|
|
return net.ResolveIPAddr(network, address) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) ResolveUDPAddr(network, address string) (*net.UDPAddr, error) { |
|
|
|
|
|
return net.ResolveUDPAddr(network, address) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) ResolveTCPAddr(network, address string) (*net.TCPAddr, error) { |
|
|
|
|
|
return net.ResolveTCPAddr(network, address) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) Interfaces() ([]*transport.Interface, error) { |
|
|
|
|
|
return nil, nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) InterfaceByIndex(index int) (*transport.Interface, error) { |
|
|
|
|
|
return nil, fmt.Errorf("%w: index=%d", transport.ErrInterfaceNotFound, index) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) InterfaceByName(name string) (*transport.Interface, error) { |
|
|
|
|
|
return nil, fmt.Errorf("%w: %s", transport.ErrInterfaceNotFound, name) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) CreateDialer(d *net.Dialer) transport.Dialer { |
|
|
|
|
|
return stdDialer{Dialer: d} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (directNet) CreateListenConfig(lc *net.ListenConfig) transport.ListenConfig { |
|
|
|
|
|
return stdListenConfig{ListenConfig: lc} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type stdDialer struct { |
|
|
|
|
|
*net.Dialer |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (d stdDialer) Dial(network, address string) (net.Conn, error) { |
|
|
|
|
|
return d.Dialer.Dial(network, address) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type stdListenConfig struct { |
|
|
|
|
|
*net.ListenConfig |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (lc stdListenConfig) Listen(ctx context.Context, network, address string) (net.Listener, error) { |
|
|
|
|
|
return lc.ListenConfig.Listen(ctx, network, address) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (lc stdListenConfig) ListenPacket(ctx context.Context, network, address string) (net.PacketConn, error) { |
|
|
|
|
|
return lc.ListenConfig.ListenPacket(ctx, network, address) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type tcpListener struct { |
|
|
|
|
|
*net.TCPListener |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (l tcpListener) AcceptTCP() (transport.TCPConn, error) { |
|
|
|
|
|
return l.TCPListener.AcceptTCP() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func getVkCreds(link string, dialer *dnsdialer.Dialer) (string, string, string, error) { |
|
|
func getVkCreds(link string, dialer *dnsdialer.Dialer) (string, string, string, error) { |
|
|
|
|
|
|
|
|
doRequest := func(data string, url string) (resp map[string]interface{}, err error) { |
|
|
doRequest := func(data string, url string) (resp map[string]interface{}, err error) { |
|
|
@ -655,6 +770,7 @@ func oneTurnConnection(ctx context.Context, turnParams *turnParams, peer *net.UD |
|
|
STUNServerAddr: turnServerAddr, |
|
|
STUNServerAddr: turnServerAddr, |
|
|
TURNServerAddr: turnServerAddr, |
|
|
TURNServerAddr: turnServerAddr, |
|
|
Conn: turnConn, |
|
|
Conn: turnConn, |
|
|
|
|
|
Net: directNet{}, |
|
|
Username: user, |
|
|
Username: user, |
|
|
Password: pass, |
|
|
Password: pass, |
|
|
RequestedAddressFamily: addrFamily, |
|
|
RequestedAddressFamily: addrFamily, |
|
|
|