[tor-commits] [snowflake/master] Remove `Snowflake` interface, use `*WebRTCPeer` directly.

dcf at torproject.org dcf at torproject.org
Mon Apr 27 23:52:50 UTC 2020


commit 76732155e7d730573b3ced62209e4e1e4ead511c
Author: David Fifield <david at bamsoftware.com>
Date:   Fri Apr 24 14:21:08 2020 -0600

    Remove `Snowflake` interface, use `*WebRTCPeer` directly.
    
    The other interfaces in client/lib/interfaces.go exist for the purpose
    of running tests, but not Snowflake. Existing code would not have worked
    with other types anyway, because it does unchecked .(*WebRTCPeer)
    conversions.
---
 client/lib/interfaces.go | 13 +++----------
 client/lib/lib_test.go   |  8 ++++----
 client/lib/peers.go      | 17 +++++++----------
 client/lib/rendezvous.go |  2 +-
 client/lib/webrtc.go     |  3 ---
 5 files changed, 15 insertions(+), 28 deletions(-)

diff --git a/client/lib/interfaces.go b/client/lib/interfaces.go
index 57171f8..e551c4d 100644
--- a/client/lib/interfaces.go
+++ b/client/lib/interfaces.go
@@ -9,16 +9,9 @@ type Connector interface {
 	Connect() error
 }
 
-// Interface for a single remote WebRTC peer.
-// In the Client context, "Snowflake" refers to the remote browser proxy.
-type Snowflake interface {
-	io.ReadWriteCloser
-	Connector
-}
-
 // Interface for catching Snowflakes. (aka the remote dialer)
 type Tongue interface {
-	Catch() (Snowflake, error)
+	Catch() (*WebRTCPeer, error)
 }
 
 // Interface for collecting some number of Snowflakes, for passing along
@@ -26,10 +19,10 @@ type Tongue interface {
 type SnowflakeCollector interface {
 	// Add a Snowflake to the collection.
 	// Implementation should decide how to connect and maintain the webRTCConn.
-	Collect() (Snowflake, error)
+	Collect() (*WebRTCPeer, error)
 
 	// Remove and return the most available Snowflake from the collection.
-	Pop() Snowflake
+	Pop() *WebRTCPeer
 
 	// Signal when the collector has stopped collecting.
 	Melted() <-chan struct{}
diff --git a/client/lib/lib_test.go b/client/lib/lib_test.go
index 1cdc2c6..50a211d 100644
--- a/client/lib/lib_test.go
+++ b/client/lib/lib_test.go
@@ -52,7 +52,7 @@ func (m *MockTransport) RoundTrip(req *http.Request) (*http.Response, error) {
 
 type FakeDialer struct{}
 
-func (w FakeDialer) Catch() (Snowflake, error) {
+func (w FakeDialer) Catch() (*WebRTCPeer, error) {
 	fmt.Println("Caught a dummy snowflake.")
 	return &WebRTCPeer{}, nil
 }
@@ -70,9 +70,9 @@ func (f FakeSocksConn) Grant(addr *net.TCPAddr) error { return nil }
 
 type FakePeers struct{ toRelease *WebRTCPeer }
 
-func (f FakePeers) Collect() (Snowflake, error) { return &WebRTCPeer{}, nil }
-func (f FakePeers) Pop() Snowflake              { return nil }
-func (f FakePeers) Melted() <-chan struct{}     { return nil }
+func (f FakePeers) Collect() (*WebRTCPeer, error) { return &WebRTCPeer{}, nil }
+func (f FakePeers) Pop() *WebRTCPeer              { return nil }
+func (f FakePeers) Melted() <-chan struct{}       { return nil }
 
 const sampleSDP = `"v=0\r\no=- 4358805017720277108 2 IN IP4 8.8.8.8\r\ns=-\r\nt=0 0\r\na=group:BUNDLE data\r\na=msid-semantic: WMS\r\nm=application 56688 DTLS/SCTP 5000\r\nc=IN IP4 8.8.8.8\r\na=candidate:3769337065 1 udp 2122260223 8.8.8.8 56688 typ host generation 0 network-id 1 network-cost 50\r\na=candidate:2921887769 1 tcp 1518280447 8.8.8.8 35441 typ host tcptype passive generation 0 network-id 1 network-cost 50\r\na=ice-ufrag:aMAZ\r\na=ice-pwd:jcHb08Jjgrazp2dzjdrvPPvV\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C8:88:EE:B9:E7:02:2E:21:37:ED:7A:D1:EB:2B:A3:15:A2:3B:5B:1C:3D:D4:D5:1F:06:CF:52:40:03:F8:DD:66\r\na=setup:actpass\r\na=mid:data\r\na=sctpmap:5000 webrtc-datachannel 1024\r\n"`
 
diff --git a/client/lib/peers.go b/client/lib/peers.go
index 2649638..f766a66 100644
--- a/client/lib/peers.go
+++ b/client/lib/peers.go
@@ -22,7 +22,7 @@ type Peers struct {
 	Tongue
 	BytesLogger BytesLogger
 
-	snowflakeChan chan Snowflake
+	snowflakeChan chan *WebRTCPeer
 	activePeers   *list.List
 	capacity      int
 
@@ -33,14 +33,14 @@ type Peers struct {
 func NewPeers(max int) *Peers {
 	p := &Peers{capacity: max}
 	// Use buffered go channel to pass snowflakes onwards to the SOCKS handler.
-	p.snowflakeChan = make(chan Snowflake, max)
+	p.snowflakeChan = make(chan *WebRTCPeer, max)
 	p.activePeers = list.New()
 	p.melt = make(chan struct{})
 	return p
 }
 
 // As part of |SnowflakeCollector| interface.
-func (p *Peers) Collect() (Snowflake, error) {
+func (p *Peers) Collect() (*WebRTCPeer, error) {
 	cnt := p.Count()
 	s := fmt.Sprintf("Currently at [%d/%d]", cnt, p.capacity)
 	if cnt >= p.capacity {
@@ -64,21 +64,18 @@ func (p *Peers) Collect() (Snowflake, error) {
 
 // Pop blocks until an available, valid snowflake appears. Returns nil after End
 // has been called.
-//
-// Part of |SnowflakeCollector| interface.
-func (p *Peers) Pop() Snowflake {
+func (p *Peers) Pop() *WebRTCPeer {
 	for {
 		snowflake, ok := <-p.snowflakeChan
 		if !ok {
 			return nil
 		}
-		conn := snowflake.(*WebRTCPeer)
-		if conn.closed {
+		if snowflake.closed {
 			continue
 		}
 		// Set to use the same rate-limited traffic logger to keep consistency.
-		conn.BytesLogger = p.BytesLogger
-		return conn
+		snowflake.BytesLogger = p.BytesLogger
+		return snowflake
 	}
 }
 
diff --git a/client/lib/rendezvous.go b/client/lib/rendezvous.go
index c82fc9e..f236c47 100644
--- a/client/lib/rendezvous.go
+++ b/client/lib/rendezvous.go
@@ -147,7 +147,7 @@ func NewWebRTCDialer(broker *BrokerChannel, iceServers []webrtc.ICEServer) *WebR
 }
 
 // Initialize a WebRTC Connection by signaling through the broker.
-func (w WebRTCDialer) Catch() (Snowflake, error) {
+func (w WebRTCDialer) Catch() (*WebRTCPeer, error) {
 	// TODO: [#25591] Fetch ICE server information from Broker.
 	// TODO: [#25596] Consider TURN servers here too.
 	connection := NewWebRTCPeer(w.webrtcConfig, w.BrokerChannel)
diff --git a/client/lib/webrtc.go b/client/lib/webrtc.go
index 389e02b..19fd5c9 100644
--- a/client/lib/webrtc.go
+++ b/client/lib/webrtc.go
@@ -14,8 +14,6 @@ import (
 )
 
 // Remote WebRTC peer.
-// Implements the |Snowflake| interface, which includes
-// |io.ReadWriter| and |Connector|.
 //
 // Handles preparation of go-webrtc PeerConnection. Only ever has
 // one DataChannel.
@@ -87,7 +85,6 @@ func (c *WebRTCPeer) Write(b []byte) (int, error) {
 	return len(b), nil
 }
 
-// As part of |Snowflake|
 func (c *WebRTCPeer) Close() error {
 	c.once.Do(func() {
 		c.closed = true



More information about the tor-commits mailing list