[tor-commits] [snowflake/master] simplify proxypair relay onclose

arlo at torproject.org arlo at torproject.org
Tue Mar 15 03:42:07 UTC 2016


commit 3339b9f172c742cf9fbdaf64cb61bf32fb0070d0
Author: Serene Han <keroserene+git at gmail.com>
Date:   Sun Mar 13 22:58:11 2016 -0700

    simplify proxypair relay onclose
---
 proxy/proxypair.coffee | 51 ++++++++++++++++++++++----------------------------
 proxy/snowflake.coffee |  8 ++------
 2 files changed, 24 insertions(+), 35 deletions(-)

diff --git a/proxy/proxypair.coffee b/proxy/proxypair.coffee
index c6478cb..db53612 100644
--- a/proxy/proxypair.coffee
+++ b/proxy/proxypair.coffee
@@ -16,6 +16,7 @@ class ProxyPair
   running:     true
   active:      false  # Whether serving a client.
   flush_timeout_id: null
+  onCleanup:  null
 
   constructor: (@clientAddr, @relayAddr, @rateLimit) ->
     @active = false
@@ -56,6 +57,7 @@ class ProxyPair
     @active = true
     true
 
+  # Given a WebRTC DataChannel, prepare callbacks.
   prepareDataChannel: (channel) =>
     channel.onopen = =>
       log 'WebRTC DataChannel opened!'
@@ -64,12 +66,14 @@ class ProxyPair
       # This is the point when the WebRTC datachannel is done, so the next step
       # is to establish websocket to the server.
       @connectRelay()
-    channel.onclose = ->
+    channel.onclose = =>
       log 'WebRTC DataChannel closed.'
       snowflake.ui.setStatus 'disconnected by webrtc.'
       snowflake.ui.setActive false
       snowflake.state = MODE.INIT
-      # Change this for multiplexing.
+      @flush()
+      @close()
+      # TODO: Change this for multiplexing.
       snowflake.reset()
     channel.onerror = -> log 'Data channel error!'
     channel.onmessage = @onClientToRelayMessage
@@ -82,7 +86,14 @@ class ProxyPair
     @relay.onopen = =>
       log @relay.label + ' connected!'
       snowflake.ui.setStatus 'connected'
-    @relay.onclose = @onClose
+    @relay.onclose = (event) =>
+      ws = event.target
+      log ws.label + ' closed.'
+      snowflake.ui.setStatus 'disconnected.'
+      snowflake.ui.setActive false
+      snowflake.state = MODE.INIT
+      @flush()
+      @close()
     @relay.onerror = @onError
     @relay.onmessage = @onRelayToClientMessage
 
@@ -105,47 +116,25 @@ class ProxyPair
     # log 'websocket-->WebRTC data: ' + event.data
     @flush()
 
-  onClose: (event) =>
-    ws = event.target
-    log ws.label + ' closed.'
-    snowflake.ui.setStatus 'disconnected.'
-    snowflake.ui.setActive false
-    snowflake.state = MODE.INIT
-    @flush()
-    @maybeCleanup()
-
   onError: (event) =>
     ws = event.target
     log ws.label + ' error.'
     @close()
-    # we can't rely on onclose_callback to cleanup, since one common error
-    # case is when the client fails to connect and the relay never starts.
-    # in that case close() is a NOP and onclose_callback is never called.
-    @maybeCleanup()
 
-  webrtcIsReady: -> null != @client && 'open' == @client.readyState
-  relayIsReady: -> (null != @relay) && (WebSocket.OPEN == @relay.readyState)
-  isClosed: (ws) -> undefined == ws || WebSocket.CLOSED == ws.readyState
+  # Close both WebRTC and websocket.
   close: ->
+    @running = false
     @client.close() if @webrtcIsReady()
     @relay.close() if @relayIsReady()
     relay = null
 
-  maybeCleanup: =>
-    if @running
-      @running = false
-      # TODO: Call external callback
-      true
-    false
-
-  # Send as much data as the rate limit currently allows.
+  # Send as much data in both directions as the rate limit currently allows.
   flush: =>
     clearTimeout @flush_timeout_id if @flush_timeout_id
     @flush_timeout_id = null
     busy = true
     checkChunks = =>
       busy = false
-
       # WebRTC --> websocket
       if @relayIsReady() &&
          @relay.bufferedAmount < @MAX_BUFFER &&
@@ -154,7 +143,6 @@ class ProxyPair
         @rateLimit.update chunk.length
         @relay.send chunk
         busy = true
-
       # websocket --> WebRTC
       if @webrtcIsReady() &&
          @client.bufferedAmount < @MAX_BUFFER &&
@@ -170,3 +158,8 @@ class ProxyPair
        (@relayIsReady()  && @relay.bufferedAmount > 0) ||
        (@webrtcIsReady() && @client.bufferedAmount > 0)
       @flush_timeout_id = setTimeout @flush,  @rateLimit.when() * 1000
+
+  webrtcIsReady: -> null != @client && 'open' == @client.readyState
+  relayIsReady: -> (null != @relay) && (WebSocket.OPEN == @relay.readyState)
+  isClosed: (ws) -> undefined == ws || WebSocket.CLOSED == ws.readyState
+
diff --git a/proxy/snowflake.coffee b/proxy/snowflake.coffee
index 31a553f..e8c00aa 100644
--- a/proxy/snowflake.coffee
+++ b/proxy/snowflake.coffee
@@ -131,13 +131,9 @@ class Snowflake
     pair.onCleanup = (event) =>
       # Delete from the list of active proxy pairs.
       @proxyPairs.splice(@proxyPairs.indexOf(pair), 1)
-    try
-      pair.begin()
-    catch err
-      log 'ERROR: ProxyPair exception while connecting.'
-      log err
-      return
+    pair.begin()
 
+  # Stop all proxypairs.
   cease: ->
     while @proxyPairs.length > 0
       @proxyPairs.pop().close()





More information about the tor-commits mailing list