commit 76732155e7d730573b3ced62209e4e1e4ead511c Author: David Fifield david@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