[tor-commits] [snowflake-webext/master] Dynamically adjust proxy poll interval
cohosh at torproject.org
cohosh at torproject.org
Thu Apr 30 14:15:58 UTC 2020
commit c283c35a7e128d72763b7f4a925103bd0b062227
Author: Cecylia Bocovich <cohosh at torproject.org>
Date: Thu Apr 2 12:53:10 2020 -0400
Dynamically adjust proxy poll interval
If the proxy succeeds in opening a datachannel to the client, decrease
the poll interval. If they fail, increase the poll interval. This will
cause less reliable/more restrictive proxies to poll less frequently.
---
config.js | 4 +++-
snowflake.js | 22 ++++++++++++++++------
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/config.js b/config.js
index 5b8963a..3f632ca 100644
--- a/config.js
+++ b/config.js
@@ -24,7 +24,9 @@ Config.prototype.minRateLimit = 10 * 1024;
Config.prototype.rateLimitHistory = 5.0;
-Config.prototype.defaultBrokerPollInterval = 300.0 * 1000;
+Config.prototype.defaultBrokerPollInterval = 300.0 * 1000; //1 poll every 5 minutes
+Config.prototype.slowestBrokerPollInterval = 6 * 60 * 60.0 * 1000; //1 poll every 6 hours
+Config.prototype.pollAdjustment = 300.0 * 1000;
// Timeout after sending answer before datachannel is opened
Config.prototype.datachannelTimeout = 20 * 1000;
diff --git a/snowflake.js b/snowflake.js
index 3baddbe..11a7801 100644
--- a/snowflake.js
+++ b/snowflake.js
@@ -22,6 +22,7 @@ class Snowflake {
this.ui = ui;
this.broker = broker;
this.proxyPairs = [];
+ this.pollInterval = this.config.defaultBrokerPollInterval;
if (void 0 === this.config.rateLimitBytes) {
this.rateLimit = new DummyRateLimit();
} else {
@@ -43,9 +44,9 @@ class Snowflake {
// process. |pollBroker| automatically arranges signalling.
beginWebRTC() {
this.pollBroker();
- return this.pollInterval = setInterval((() => {
- return this.pollBroker();
- }), this.config.defaultBrokerPollInterval);
+ return this.pollTimeout = setTimeout((() => {
+ return this.beginWebRTC()
+ }), this.pollInterval);
}
// Regularly poll Broker for clients to serve until this snowflake is
@@ -74,8 +75,18 @@ class Snowflake {
return setTimeout((() => {
if (!pair.webrtcIsReady()) {
log('proxypair datachannel timed out waiting for open');
- return pair.close();
+ pair.close();
+ // increase poll interval
+ this.pollInterval =
+ Math.min(this.pollInterval + this.config.pollAdjustment,
+ this.config.slowestBrokerPollInterval);
+ } else {
+ // decrease poll interval
+ this.pollInterval =
+ Math.max(this.pollInterval - this.config.pollAdjustment,
+ this.config.defaultBrokerPollInterval);
}
+ return;
}), this.config.datachannelTimeout);
}, function() {
//on error, close proxy pair
@@ -146,7 +157,7 @@ class Snowflake {
disable() {
var results;
log('Disabling Snowflake.');
- clearInterval(this.pollInterval);
+ clearTimeout(this.pollTimeout);
results = [];
while (this.proxyPairs.length > 0) {
results.push(this.proxyPairs.pop().close());
@@ -158,7 +169,6 @@ class Snowflake {
Snowflake.prototype.relayAddr = null;
Snowflake.prototype.rateLimit = null;
-Snowflake.prototype.pollInterval = null;
Snowflake.MESSAGE = {
CONFIRMATION: 'You\'re currently serving a Tor user via Snowflake.'
More information about the tor-commits
mailing list