diff --git a/www/js/services/bma-services.js b/www/js/services/bma-services.js index a04ffc2820d74017e414ba7678e55dc59963cab5..d641d2f3335428e3da6772f3f8604bb0d0586e6a 100644 --- a/www/js/services/bma-services.js +++ b/www/js/services/bma-services.js @@ -193,12 +193,12 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium. // Override close methods (add a usage counter) sock._counter = 1; - var close = sock.close; + var inheritedClose = sock.close; sock.close = function() { sock._counter--; if (sock._counter <= 0) { - console.debug('[BMA] Stopping websocket ['+path+']'); - close(); + console.debug('[BMA] Closing websocket ['+path+']'); + inheritedClose(); delete that.cache.wsByPath[path]; } }; diff --git a/www/js/services/http-services.js b/www/js/services/http-services.js index 1583b4a68d096c9a56acc7d0f3156365286738ba..0d2109b24e9bea32811b99fd2d9bdaac450f9da5 100644 --- a/www/js/services/http-services.js +++ b/www/js/services/http-services.js @@ -63,6 +63,10 @@ angular.module('cesium.http.services', ['cesium.cache.services']) } function getResource(host, port, path, useSsl, forcedTimeout) { + // Make sure host is defined - fix #537 + if (!host) { + return $q.reject('[http] invalid URL from host: ' + host); + } var url = getUrl(host, port, path, useSsl); return function(params) { return $q(function(resolve, reject) { @@ -149,35 +153,64 @@ angular.module('cesium.http.services', ['cesium.cache.services']) throw 'calling csHttp.ws without path argument'; } var uri = getWsUrl(host, port, path, useSsl); - var sock = null; + var delegate = null; var callbacks = []; function _waitOpen() { - if (!sock) throw new Error('Websocket not opened'); - if (sock.readyState == 1) { - return $q.when(sock); + if (!delegate) throw new Error('Websocket not opened'); + if (delegate.readyState == 1) { + return $q.when(delegate); } - if (sock.readyState == 3) { - return $q.reject('Unable to connect to Websocket ['+sock.url+']'); + if (delegate.readyState == 3) { + return $q.reject('Unable to connect to Websocket ['+delegate.url+']'); } - return $timeout(_waitOpen, 100); + console.debug('[http] Waiting websocket ['+path+'] openning...'); + return $timeout(_waitOpen, 200); } function _open(self, callback, params) { - if (!sock) { + if (!delegate) { + self.path = path; + prepare(uri, params, {}, function(uri) { - console.debug('[http] Listening on websocket ['+path+']...'); - sock = new WebSocket(uri); - sock.onerror = function(e) { - sock.readyState=3; + delegate = new WebSocket(uri); + delegate.onerror = function(e) { + delegate.readyState=3; }; - sock.onmessage = function(e) { + delegate.onmessage = function(e) { var obj = JSON.parse(e.data); _.forEach(callbacks, function(callback) { callback(obj); }); }; - sockets.push(self); + delegate.onopen = function(e) { + console.debug('[http] Listening on websocket ['+path+']...'); + sockets.push(self); + delegate.openTime = new Date().getTime(); + }; + delegate.onclose = function() { + + // Remove from sockets arrays + var index = _.findIndex(sockets, function(socket){return socket.path === path;}); + if (index >= 0) { + sockets.splice(index,1); + } + + // If close event comes from Cesium + if (delegate.closing) { + delegate = null; + } + + // If unexpected close event, reopen the socket (fix #535) + else { + console.debug('[http] Unexpected close of websocket ['+path+'] (open '+ (new Date().getTime() - delegate.openTime) +'ms ago): re-opening...'); + + delegate = null; + + // Loop, but without the already registered callback + _open(self, null, params); + } + }; }); } if (callback) callbacks.push(callback); @@ -194,14 +227,14 @@ angular.module('cesium.http.services', ['cesium.cache.services']) send: function(data) { return _waitOpen() .then(function(){ - sock.send(data); + delegate.send(data); }); }, close: function() { - if (sock) { - console.debug('[http] Stopping websocket ['+path+']...'); - sock.close(); - sock = null; + if (delegate) { + delegate.closing = true; + console.debug('[http] Closing websocket ['+path+']...'); + delegate.close(); callbacks = []; } } diff --git a/www/js/services/network-services.js b/www/js/services/network-services.js index 2a49997c44072e208bae78a042fea73cc709144c..f6e98214cadc5baa295098e34d434b79ef842c40 100644 --- a/www/js/services/network-services.js +++ b/www/js/services/network-services.js @@ -308,7 +308,7 @@ angular.module('cesium.network.services', ['ngApi', 'cesium.bma.services', 'cesi // Apply filter if (!applyPeerFilter(peer)) return $q.when(); - if (!data.filter.online || (data.filter.online === 'all' && peer.status === 'DOWN')) { + if (!data.filter.online || (data.filter.online === 'all' && peer.status === 'DOWN') || !peer.getHost() /*fix #537*/) { peer.online = false; return $q.when(peer); } @@ -337,7 +337,7 @@ angular.module('cesium.network.services', ['ngApi', 'cesium.bma.services', 'cesi return $q.when(peer); } - peer.api = peer.api || BMA.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl()); + peer.api = peer.api || BMA.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl()); // Get current block return peer.api.blockchain.current()