changed adding tokens to work on reconnect

This commit is contained in:
tigerbot 2017-04-28 10:57:48 -06:00
parent a95031cc28
commit 876fa47e02
1 changed files with 48 additions and 7 deletions

View File

@ -7,7 +7,7 @@ var sni = require('sni');
var Packer = require('tunnel-packer'); var Packer = require('tunnel-packer');
function run(copts) { function run(copts) {
var tunnelUrl = copts.stunneld.replace(/\/$/, '') + '/?access_token=' + copts.token; var tokens = [ copts.token ];
var activityTimeout = copts.activityTimeout || 2*60*1000; var activityTimeout = copts.activityTimeout || 2*60*1000;
var pongTimeout = copts.pongTimeout || 10*1000; var pongTimeout = copts.pongTimeout || 10*1000;
@ -224,7 +224,6 @@ function run(copts) {
} }
}; };
var retry = true;
var lastActivity; var lastActivity;
var timeoutId; var timeoutId;
var wsHandlers = { var wsHandlers = {
@ -269,6 +268,16 @@ function run(copts) {
console.info("[open] connected to '" + copts.stunneld + "'"); console.info("[open] connected to '" + copts.stunneld + "'");
wsHandlers.refreshTimeout(); wsHandlers.refreshTimeout();
timeoutId = setTimeout(wsHandlers.checkTimeout, activityTimeout); timeoutId = setTimeout(wsHandlers.checkTimeout, activityTimeout);
tokens.forEach(function (jwtoken) {
sendCommand('add_token', jwtoken)
.catch(function (err) {
console.error('failed re-adding token', jwtoken, 'after reconnect', err);
// Not sure if we should do something like remove the token here. It worked
// once or it shouldn't have stayed in the list, so it's less certain why
// it would have failed here.
});
});
} }
, onClose: function () { , onClose: function () {
@ -287,7 +296,7 @@ function run(copts) {
console.info('[close] failed on first attempt... check authentication.'); console.info('[close] failed on first attempt... check authentication.');
timeoutId = null; timeoutId = null;
} }
else if (retry) { else if (tokens.length) {
console.info('[retry] disconnected and waiting...'); console.info('[retry] disconnected and waiting...');
timeoutId = setTimeout(connect, 5000); timeoutId = setTimeout(connect, 5000);
} }
@ -314,13 +323,14 @@ function run(copts) {
}; };
function connect() { function connect() {
if (!retry) { if (!tokens.length) {
return; return;
} }
timeoutId = null; timeoutId = null;
var machine = require('tunnel-packer').create(packerHandlers); var machine = require('tunnel-packer').create(packerHandlers);
console.info("[connect] '" + copts.stunneld + "'"); console.info("[connect] '" + copts.stunneld + "'");
var tunnelUrl = copts.stunneld.replace(/\/$/, '') + '/?access_token=' + tokens[0];
wstunneler = new WebSocket(tunnelUrl, { rejectUnauthorized: !copts.insecure }); wstunneler = new WebSocket(tunnelUrl, { rejectUnauthorized: !copts.insecure });
wstunneler.on('open', wsHandlers.onOpen); wstunneler.on('open', wsHandlers.onOpen);
wstunneler.on('close', wsHandlers.onClose); wstunneler.on('close', wsHandlers.onClose);
@ -342,7 +352,7 @@ function run(copts) {
return { return {
end: function() { end: function() {
retry = false; tokens.length = 0;
if (timeoutId) { if (timeoutId) {
clearTimeout(timeoutId); clearTimeout(timeoutId);
timeoutId = null; timeoutId = null;
@ -358,10 +368,41 @@ function run(copts) {
} }
} }
, append: function (token) { , append: function (token) {
return sendCommand('add_token', token); if (tokens.indexOf(token) >= 0) {
return PromiseA.resolve();
}
tokens.push(token);
var prom = sendCommand('add_token', token);
prom.catch(function (err) {
console.error('adding token', token, 'failed:', err);
// Most probably an invalid token of some kind, so we don't really want to keep it.
tokens.splice(tokens.indexOf(token));
});
return prom;
} }
, clear: function (token) { , clear: function (token) {
return sendCommand('delete_token', token || '*'); if (typeof token === 'undefined') {
token = '*';
}
if (token === '*') {
tokens.length = 0;
} else {
var index = tokens.indexOf(token);
if (index < 0) {
return PromiseA.resolve();
}
tokens.splice(index);
}
var prom = sendCommand('delete_token', token);
prom.catch(function (err) {
console.error('clearing token', token, 'failed:', err);
});
return prom;
} }
}; };
} }