changed adding tokens to work on reconnect

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

View File

@ -7,7 +7,7 @@ var sni = require('sni');
var Packer = require('tunnel-packer');
function run(copts) {
var tunnelUrl = copts.stunneld.replace(/\/$/, '') + '/?access_token=' + copts.token;
var tokens = [ copts.token ];
var activityTimeout = copts.activityTimeout || 2*60*1000;
var pongTimeout = copts.pongTimeout || 10*1000;
@ -224,7 +224,6 @@ function run(copts) {
}
};
var retry = true;
var lastActivity;
var timeoutId;
var wsHandlers = {
@ -269,6 +268,16 @@ function run(copts) {
console.info("[open] connected to '" + copts.stunneld + "'");
wsHandlers.refreshTimeout();
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 () {
@ -287,7 +296,7 @@ function run(copts) {
console.info('[close] failed on first attempt... check authentication.');
timeoutId = null;
}
else if (retry) {
else if (tokens.length) {
console.info('[retry] disconnected and waiting...');
timeoutId = setTimeout(connect, 5000);
}
@ -314,13 +323,14 @@ function run(copts) {
};
function connect() {
if (!retry) {
if (!tokens.length) {
return;
}
timeoutId = null;
var machine = require('tunnel-packer').create(packerHandlers);
console.info("[connect] '" + copts.stunneld + "'");
var tunnelUrl = copts.stunneld.replace(/\/$/, '') + '/?access_token=' + tokens[0];
wstunneler = new WebSocket(tunnelUrl, { rejectUnauthorized: !copts.insecure });
wstunneler.on('open', wsHandlers.onOpen);
wstunneler.on('close', wsHandlers.onClose);
@ -342,7 +352,7 @@ function run(copts) {
return {
end: function() {
retry = false;
tokens.length = 0;
if (timeoutId) {
clearTimeout(timeoutId);
timeoutId = null;
@ -358,10 +368,41 @@ function run(copts) {
}
}
, 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) {
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;
}
};
}