Better disconnect responsiveness

Instead of waiting for the websocket to really close, which can take a
long time because network latency, weechat inresponsiveness etc, we just
set our status to disconnected when user wants to disconnect, and we let
the websocket handle the close in its own time in the background.

If the user wants to reconnect this means there will be a new websocket
connection before the old one has failed, but this works just fine.
This commit is contained in:
Tor Hveem 2015-03-27 10:22:42 +01:00
parent 5e83401782
commit 5099357a8a

View file

@ -130,17 +130,14 @@ weechat.factory('connection',
}; };
var handleClose = function (evt) { var handleClose = function (evt) {
ngWebsockets.failCallbacks('disconnection');
$rootScope.connected = false;
$rootScope.$emit('relayDisconnect');
if (ssl && evt && evt.code === 1006) { if (ssl && evt && evt.code === 1006) {
// A password error doesn't trigger onerror, but certificate issues do. Check time of last error. // A password error doesn't trigger onerror, but certificate issues do. Check time of last error.
if (typeof $rootScope.lastError !== "undefined" && (Date.now() - $rootScope.lastError) < 1000) { if (typeof $rootScope.lastError !== "undefined" && (Date.now() - $rootScope.lastError) < 1000) {
// abnormal disconnect by client, most likely ssl error // abnormal disconnect by client, most likely ssl error
$rootScope.sslError = true; $rootScope.sslError = true;
}
}
$rootScope.$apply(); $rootScope.$apply();
}
}
}; };
var onerror = function (evt) { var onerror = function (evt) {
@ -235,8 +232,19 @@ weechat.factory('connection',
}; };
var disconnect = function() { var disconnect = function() {
$log.info('Disconnecting from relay');
$rootScope.userdisconnect = true; $rootScope.userdisconnect = true;
ngWebsockets.send(weeChat.Protocol.formatQuit()); ngWebsockets.send(weeChat.Protocol.formatQuit());
// In case the backend doesn't repond we will close from our end
var closeTimer = setTimeout(function() {
ngWebsockets.disconnect();
// We pretend we are not connected anymore
// The connection can time out on its own
ngWebsockets.failCallbacks('disconnection');
$rootScope.connected = false;
$rootScope.$emit('relayDisconnect');
$rootScope.$apply();
});
}; };
/* /*