From 42c193dfd5b2aa3f3d1ac9c59cee5143faaa36c8 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 13 Feb 2014 16:24:17 -0300 Subject: [PATCH 1/2] sockets now autoreconnect after disconnection --- app/controllers/socket.js | 23 ++++--- public/src/js/controllers/address.js | 66 +++++++++---------- public/src/js/controllers/header.js | 52 ++++++++------- public/src/js/controllers/index.js | 69 ++++++++++---------- public/src/js/controllers/status.js | 73 +++++++++++---------- public/src/js/services/socket.js | 95 +++++++++++++++------------- 6 files changed, 196 insertions(+), 182 deletions(-) diff --git a/app/controllers/socket.js b/app/controllers/socket.js index 5175ab5..4288c82 100644 --- a/app/controllers/socket.js +++ b/app/controllers/socket.js @@ -10,6 +10,7 @@ module.exports.init = function(app, io_ext) { ios.set('log level', 1); // reduce logging ios.sockets.on('connection', function(socket) { socket.on('subscribe', function(topic) { + console.log('someone subscribed to ' + topic); socket.join(topic); }); }); @@ -19,33 +20,35 @@ module.exports.broadcastTx = function(tx) { if (ios) { var t = {}; if (typeof tx === 'string') { - t = { txid: tx }; - } - else { + t = { + txid: tx + }; + } else { t = tx; // Outputs var valueOut = 0; - t.vout.forEach( function(o) { + t.vout.forEach(function(o) { valueOut += o.value * util.COIN; }); t.valueOut = parseInt(valueOut) / util.COIN; } - ios.sockets.in('inv').emit('tx', t); + ios.sockets. in ('inv').emit('tx', t); } }; module.exports.broadcastBlock = function(block) { - if (ios) ios.sockets.in('inv').emit('block', block); + if (ios) ios.sockets. in ('inv').emit('block', block); }; module.exports.broadcastAddressTx = function(address, tx) { - if (ios) ios.sockets.in(address).emit(address, tx); + console.log('bcatx = '+address+' '+tx); + if (ios) ios.sockets. in (address).emit(address, tx); }; module.exports.broadcastSyncInfo = function(historicSync) { - if (ios) { - ios.sockets.in('sync').emit('status', historicSync); - } + if (ios) { + ios.sockets. in ('sync').emit('status', historicSync); + } }; diff --git a/public/src/js/controllers/address.js b/public/src/js/controllers/address.js index 415cf63..6c181da 100644 --- a/public/src/js/controllers/address.js +++ b/public/src/js/controllers/address.js @@ -1,41 +1,41 @@ 'use strict'; angular.module('insight.address').controller('AddressController', -function($scope, $rootScope, $routeParams, $location, Global, Address, getSocket) { - $scope.global = Global; + function($scope, $rootScope, $routeParams, $location, Global, Address, getSocket) { + $scope.global = Global; - $scope.findOne = function() { - $rootScope.currentAddr = $routeParams.addrStr; + $scope.findOne = function() { + $rootScope.currentAddr = $routeParams.addrStr; - Address.get({ - addrStr: $routeParams.addrStr - }, - function(address) { - $rootScope.titleDetail = address.addrStr.substring(0,7) + '...'; - $rootScope.flashMessage = null; - $scope.address = address; - }, - function(e) { - if (e.status === 400) { - $rootScope.flashMessage = 'Invalid Address: ' + $routeParams.addrStr; - } - else if (e.status === 503) { - $rootScope.flashMessage = 'Backend Error. ' + e.data; - } - else { - $rootScope.flashMessage = 'Address Not Found'; - } - $location.path('/'); + Address.get({ + addrStr: $routeParams.addrStr + }, + function(address) { + $rootScope.titleDetail = address.addrStr.substring(0, 7) + '...'; + $rootScope.flashMessage = null; + $scope.address = address; + }, + function(e) { + if (e.status === 400) { + $rootScope.flashMessage = 'Invalid Address: ' + $routeParams.addrStr; + } else if (e.status === 503) { + $rootScope.flashMessage = 'Backend Error. ' + e.data; + } else { + $rootScope.flashMessage = 'Address Not Found'; + } + $location.path('/'); + }); + }; + + var socket = getSocket($scope); + socket.on('connect', function() { + socket.emit('subscribe', $routeParams.addrStr); + socket.on($routeParams.addrStr, function(tx) { + console.log('AddressTx event received ' + tx); + $rootScope.$broadcast('tx', tx); + }); }); - }; - var socket = getSocket($scope); - socket.emit('subscribe', $routeParams.addrStr); - socket.on($routeParams.addrStr, function(tx) { - console.log('AddressTx event received ' + tx); - $rootScope.$broadcast('tx', tx); + $scope.params = $routeParams; + }); - - $scope.params = $routeParams; - -}); diff --git a/public/src/js/controllers/header.js b/public/src/js/controllers/header.js index 3837bbc..4493e9d 100644 --- a/public/src/js/controllers/header.js +++ b/public/src/js/controllers/header.js @@ -2,41 +2,39 @@ angular.module('insight.system').controller('HeaderController', function($scope, $rootScope, getSocket, Global, Block) { - $scope.global = Global; + $scope.global = Global; - $rootScope.currency = { - factor: 1, - bitstamp: 0, - symbol: 'BTC' - }; + $rootScope.currency = { + factor: 1, + bitstamp: 0, + symbol: 'BTC' + }; - $scope.menu = [ - { + $scope.menu = [{ 'title': 'Blocks', 'link': 'blocks' - }, - { + }, { 'title': 'Status', 'link': 'status' - } - ]; + }]; - var socket = getSocket($scope); - socket.emit('subscribe', 'inv'); + var _getBlock = function(hash) { + Block.get({ + blockHash: hash + }, function(res) { + $scope.totalBlocks = res.height; + }); + }; - var _getBlock = function(hash) { - Block.get({ - blockHash: hash - }, function(res) { - $scope.totalBlocks = res.height; + var socket = getSocket($scope); + socket.on('connect', function() { + socket.emit('subscribe', 'inv'); + + socket.on('block', function(block) { + var blockHash = block.toString(); + _getBlock(blockHash); + }); }); - }; - socket.on('block', function(block) { - var blockHash = block.toString(); - console.log('Updated Blocks Height!'); - _getBlock(blockHash); + $rootScope.isCollapsed = true; }); - - $rootScope.isCollapsed = true; -}); diff --git a/public/src/js/controllers/index.js b/public/src/js/controllers/index.js index 0df5ba5..8552d6e 100644 --- a/public/src/js/controllers/index.js +++ b/public/src/js/controllers/index.js @@ -5,40 +5,43 @@ var BLOCKS_DISPLAYED = 5; angular.module('insight.system').controller('IndexController', function($scope, Global, getSocket, Blocks) { - $scope.global = Global; + $scope.global = Global; + + var _getBlocks = function() { + Blocks.get({ + limit: BLOCKS_DISPLAYED + }, function(res) { + $scope.blocks = res.blocks; + $scope.blocksLength = res.lenght; + }); + }; + + var socket = getSocket($scope); + socket.on('connect', function() { + socket.emit('subscribe', 'inv'); + + socket.on('tx', function(tx) { + $scope.txs.unshift(tx); + if (parseInt($scope.txs.length, 10) >= parseInt(TRANSACTION_DISPLAYED, 10)) { + $scope.txs = $scope.txs.splice(0, TRANSACTION_DISPLAYED); + } + }); + + socket.on('block', function() { + _getBlocks(); + }); - var _getBlocks = function() { - Blocks.get({ - limit: BLOCKS_DISPLAYED - }, function(res) { - $scope.blocks = res.blocks; - $scope.blocksLength = res.lenght; }); - }; - - var socket = getSocket($scope); - socket.emit('subscribe', 'inv'); - socket.on('tx', function(tx) { - $scope.txs.unshift(tx); - if (parseInt($scope.txs.length, 10) >= parseInt(TRANSACTION_DISPLAYED, 10)) { - $scope.txs = $scope.txs.splice(0, TRANSACTION_DISPLAYED); - } + $scope.humanSince = function(time) { + var m = moment.unix(time); + return m.max().fromNow(); + }; + + $scope.index = function() { + _getBlocks(); + }; + + $scope.txs = []; + $scope.blocks = []; }); - - socket.on('block', function() { - _getBlocks(); - }); - - $scope.humanSince = function(time) { - var m = moment.unix(time); - return m.max().fromNow(); - }; - - $scope.index = function() { - _getBlocks(); - }; - - $scope.txs = []; - $scope.blocks = []; -}); diff --git a/public/src/js/controllers/status.js b/public/src/js/controllers/status.js index 8a67644..6d45303 100644 --- a/public/src/js/controllers/status.js +++ b/public/src/js/controllers/status.js @@ -1,41 +1,44 @@ 'use strict'; angular.module('insight.status').controller('StatusController', -function($scope, $routeParams, $location, Global, Status, Sync, getSocket) { - $scope.global = Global; + function($scope, $routeParams, $location, Global, Status, Sync, getSocket) { + $scope.global = Global; - $scope.getStatus = function(q) { - Status.get({ - q: 'get' + q - }, - function(d) { - $scope.loaded = 1; - angular.extend($scope, d); - }, - function(e) { - $scope.error = 'API ERROR: ' + e.data; + $scope.getStatus = function(q) { + Status.get({ + q: 'get' + q + }, + function(d) { + $scope.loaded = 1; + angular.extend($scope, d); + }, + function(e) { + $scope.error = 'API ERROR: ' + e.data; + }); + }; + + var _onSyncUpdate = function(sync) { + $scope.sync = sync; + }; + + $scope.getSync = function() { + Sync.get({}, + function(sync) { + _onSyncUpdate(sync); + }, + function(e) { + var err = 'Could not get sync information' + e.toString(); + $scope.sync = { + error: err + }; + }); + }; + + var socket = getSocket($scope); + socket.on('connect', function() { + socket.emit('subscribe', 'sync'); + socket.on('status', function(sync) { + _onSyncUpdate(sync); + }); }); - }; - - var _onSyncUpdate = function(sync) { - $scope.sync = sync; - }; - - $scope.getSync = function() { - Sync.get({}, - function(sync) { - _onSyncUpdate(sync); - }, - function(e) { - var err = 'Could not get sync information' + e.toString(); - $scope.sync = { error: err }; - }); - }; - - var socket = getSocket($scope); - socket.emit('subscribe', 'sync'); - socket.on('status', function(sync) { - _onSyncUpdate(sync); }); -}); - diff --git a/public/src/js/services/socket.js b/public/src/js/services/socket.js index a2bf1e4..e82be3b 100644 --- a/public/src/js/services/socket.js +++ b/public/src/js/services/socket.js @@ -1,64 +1,71 @@ 'use strict'; var ScopedSocket = function(socket, $rootScope) { - this.socket = socket; - this.$rootScope = $rootScope; - this.listeners = []; + this.socket = socket; + this.$rootScope = $rootScope; + this.listeners = []; }; -ScopedSocket.prototype.removeAllListeners = function() { - for (var i = 0; i < this.listeners.length; i++) { - var details = this.listeners[i]; - this.socket.removeListener(details.event, details.fn); - } +ScopedSocket.prototype.removeAllListeners = function(opts) { + if (!opts) opts = {}; + for (var i = 0; i < this.listeners.length; i++) { + var details = this.listeners[i]; + if (opts.skipConnect && details.event === 'connect') { + continue; + } + this.socket.removeListener(details.event, details.fn); + } this.listeners = []; }; ScopedSocket.prototype.on = function(event, callback) { - var socket = this.socket; - var $rootScope = this.$rootScope; + var socket = this.socket; + var $rootScope = this.$rootScope; - var wrapped_callback = function() { - var args = arguments; - $rootScope.$apply(function() { - callback.apply(socket, args); - }); - }; + var wrapped_callback = function() { + var args = arguments; + $rootScope.$apply(function() { + callback.apply(socket, args); + }); + }; socket.on(event, wrapped_callback); - this.listeners.push({ - event: event, - fn: wrapped_callback - }); + this.listeners.push({ + event: event, + fn: wrapped_callback + }); }; ScopedSocket.prototype.emit = function(event, data, callback) { - var socket = this.socket; - var $rootScope = this.$rootScope; + var socket = this.socket; + var $rootScope = this.$rootScope; - socket.emit(event, data, function() { - var args = arguments; - $rootScope.$apply(function() { - if (callback) { - callback.apply(socket, args); - } - }); - }); + socket.emit(event, data, function() { + var args = arguments; + $rootScope.$apply(function() { + if (callback) { + callback.apply(socket, args); + } + }); + }); }; angular.module('insight.socket').factory('getSocket', -function($rootScope) { - var socket = io.connect(null, { - 'reconnect': true, - 'reconnection delay': 500, -}); - return function(scope) { - var scopedSocket = new ScopedSocket(socket, $rootScope); - scope.$on('$routeChangeStart', function() { + function($rootScope) { + var socket = io.connect(null, { + 'reconnect': true, + 'reconnection delay': 500, }); - scope.$on('$destroy', function() { - scopedSocket.removeAllListeners(); - }); - return scopedSocket; - }; -}); + return function(scope) { + var scopedSocket = new ScopedSocket(socket, $rootScope); + scope.$on('$destroy', function() { + scopedSocket.removeAllListeners(); + }); + socket.on('connect', function() { + scopedSocket.removeAllListeners({ + skipConnect: true + }); + }); + return scopedSocket; + }; + }); From 9cbf8702540172ec76290a24a38732d95a458041 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 13 Feb 2014 16:25:34 -0300 Subject: [PATCH 2/2] remove a log --- app/controllers/socket.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/socket.js b/app/controllers/socket.js index 4288c82..50d5733 100644 --- a/app/controllers/socket.js +++ b/app/controllers/socket.js @@ -10,7 +10,6 @@ module.exports.init = function(app, io_ext) { ios.set('log level', 1); // reduce logging ios.sockets.on('connection', function(socket) { socket.on('subscribe', function(topic) { - console.log('someone subscribed to ' + topic); socket.join(topic); }); });