[tor-commits] [snowflake/master] Move datachannel timeout to after sendAnswer return

arlo at torproject.org arlo at torproject.org
Tue May 21 15:09:19 UTC 2019


commit 2e4383434f33a4f8e801974bbe70d8a4568b3d93
Author: Arlo Breault <arlolra at gmail.com>
Date:   Mon May 20 15:43:07 2019 -0400

    Move datachannel timeout to after sendAnswer return
---
 proxy-go/snowflake.go | 33 ++++++++++++++-------------------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/proxy-go/snowflake.go b/proxy-go/snowflake.go
index 12190ac..858320b 100644
--- a/proxy-go/snowflake.go
+++ b/proxy-go/snowflake.go
@@ -263,9 +263,7 @@ func datachannelHandler(conn *webRTCConn, remoteAddr net.Addr) {
 // candidates is complete and the answer is available in LocalDescription.
 // Installs an OnDataChannel callback that creates a webRTCConn and passes it to
 // datachannelHandler.
-func makePeerConnectionFromOffer(sdp *webrtc.SessionDescription, config *webrtc.Configuration) (*webrtc.PeerConnection, error) {
-
-	dataChan := make(chan struct{})
+func makePeerConnectionFromOffer(sdp *webrtc.SessionDescription, config *webrtc.Configuration, dataChan chan struct{}) (*webrtc.PeerConnection, error) {
 	pc, err := webrtc.NewPeerConnection(config)
 	if err != nil {
 		return nil, fmt.Errorf("accept: NewPeerConnection: %s", err)
@@ -333,21 +331,6 @@ func makePeerConnectionFromOffer(sdp *webrtc.SessionDescription, config *webrtc.
 		return nil, err
 	}
 
-	// Set a timeout on peerconnection. If the connection state has not
-	// advanced to PeerConnectionStateConnected in this time,
-	// destroy the peer connection and return the token.
-	go func() {
-		select {
-		case <-dataChan:
-			log.Println("Connection successful.")
-		case <-time.After(dataChannelTimeout):
-			log.Println("Timed out waiting for client to open data channel.")
-			pc.Destroy()
-			retToken()
-		}
-
-	}()
-
 	return pc, nil
 }
 
@@ -358,7 +341,8 @@ func runSession(sid string) {
 		retToken()
 		return
 	}
-	pc, err := makePeerConnectionFromOffer(offer, config)
+	dataChan := make(chan struct{})
+	pc, err := makePeerConnectionFromOffer(offer, config, dataChan)
 	if err != nil {
 		log.Printf("error making WebRTC connection: %s", err)
 		retToken()
@@ -371,6 +355,17 @@ func runSession(sid string) {
 		retToken()
 		return
 	}
+	// Set a timeout on peerconnection. If the connection state has not
+	// advanced to PeerConnectionStateConnected in this time,
+	// destroy the peer connection and return the token.
+	select {
+	case <-dataChan:
+		log.Println("Connection successful.")
+	case <-time.After(dataChannelTimeout):
+		log.Println("Timed out waiting for client to open data channel.")
+		pc.Destroy()
+		retToken()
+	}
 }
 
 func main() {



More information about the tor-commits mailing list