diff --git a/app/controllers/socket.js b/app/controllers/socket.js index 8802a1e9..e69a7348 100644 --- a/app/controllers/socket.js +++ b/app/controllers/socket.js @@ -9,6 +9,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('subscribe to '+topic); socket.join(topic); }); }); diff --git a/public/js/controllers/address.js b/public/js/controllers/address.js index 7af59e51..6276230c 100644 --- a/public/js/controllers/address.js +++ b/public/js/controllers/address.js @@ -7,8 +7,8 @@ angular.module('insight.address').controller('AddressController', '$location', 'Global', 'Address', - 'socket', - function ($scope, $rootScope, $routeParams, $location, Global, Address, socket) { + 'get_socket', + function ($scope, $rootScope, $routeParams, $location, Global, Address, get_socket) { $scope.global = Global; $scope.findOne = function() { @@ -21,9 +21,8 @@ angular.module('insight.address').controller('AddressController', $location.path('/'); }); }; - socket.on('connect', function() { - socket.emit('subscribe', $routeParams.addrStr); - }); + var socket = get_socket($scope); + socket.emit('subscribe', $routeParams.addrStr); $scope.params = $routeParams; }]); diff --git a/public/js/controllers/footer.js b/public/js/controllers/footer.js index 56ee28fa..611cfc82 100644 --- a/public/js/controllers/footer.js +++ b/public/js/controllers/footer.js @@ -1,13 +1,12 @@ 'use strict'; -angular.module('insight.system').controller('FooterController', ['$scope', 'Global', 'socket', 'Status', function ($scope, Global, socket, Status) { +angular.module('insight.system').controller('FooterController', + ['$scope', + 'Global', + 'Status', + function ($scope, Global, Status) { $scope.global = Global; - socket.on('block', function(block) { -console.log('[footer.js:14]',block); //TODO - console.log('Block received! ' + JSON.stringify(block)); - }); - $scope.getFooter = function() { Status.get({ q: 'getInfo' diff --git a/public/js/controllers/index.js b/public/js/controllers/index.js index 22ea12f8..e733d751 100755 --- a/public/js/controllers/index.js +++ b/public/js/controllers/index.js @@ -6,15 +6,14 @@ angular.module('insight.system').controller('IndexController', ['$scope', '$rootScope', 'Global', - 'socket', + 'get_socket', 'Blocks', 'Transactions', - function($scope, $rootScope, Global, socket, Blocks, Transactions) { + function($scope, $rootScope, Global, get_socket, Blocks, Transactions) { $scope.global = Global; - socket.on('connect', function() { - socket.emit('subscribe', 'inv'); - }); + var socket = get_socket($scope); + socket.emit('subscribe', 'inv'); //show errors $scope.flashMessage = $rootScope.flashMessage || null; diff --git a/public/js/controllers/transactions.js b/public/js/controllers/transactions.js index be8a61bf..33e0469d 100644 --- a/public/js/controllers/transactions.js +++ b/public/js/controllers/transactions.js @@ -2,14 +2,14 @@ angular.module('insight.transactions').controller('transactionsController', ['$scope', + '$rootScope', '$routeParams', '$location', 'Global', 'Transaction', 'TransactionsByBlock', 'TransactionsByAddress', - 'socket', - function ($scope, $routeParams, $location, Global, Transaction, TransactionsByBlock, TransactionsByAddress, socket) { + function ($scope, $rootScope, $routeParams, $location, Global, Transaction, TransactionsByBlock, TransactionsByAddress) { $scope.global = Global; $scope.findThis = function() { @@ -43,10 +43,10 @@ angular.module('insight.transactions').controller('transactionsController', $scope.txs = txs; }); }; - socket.on('tx', function(tx) { + /*socket.on('tx', function(tx) { console.log('Incoming message for new transaction!', tx); $scope.findTx(tx.txid); - }); + });*/ $scope.txs = []; diff --git a/public/js/services/socket.js b/public/js/services/socket.js index 2ffe741c..9ed679c3 100644 --- a/public/js/services/socket.js +++ b/public/js/services/socket.js @@ -1,26 +1,62 @@ 'use strict'; -angular.module('insight.socket').factory('socket', ['$rootScope', function($rootScope) { - var socket = io.connect(); - return { - on: function(eventName, callback) { - socket.on(eventName, function() { - var args = arguments; - $rootScope.$apply(function() { - callback.apply(socket, args); - }); - }); - }, - emit: function(eventName, data, callback) { - socket.emit(eventName, data, function() { - var args = arguments; - $rootScope.$apply(function() { - if (callback) { - callback.apply(socket, args); - } - }); - }); - } - }; +var ScopedSocket = function(socket, $rootScope) { + this.socket = socket; + this.$rootScope = $rootScope; + this.listeners = []; +}; + +ScopedSocket.prototype.removeAllListeners = function() { + console.log('remove all listeners'); + for (var i = 0; i < this.listeners.length; i++) { + var details = this.listeners[i]; + console.log('removing listener '+i); + this.socket.removeListener(details.event, details.fn); + } + this.listeners = []; +}; + +ScopedSocket.prototype.on = function(event, callback) { + var socket = this.socket; + var $rootScope = this.$rootScope; + + + 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 + }); +}; + +ScopedSocket.prototype.emit = function(event, data, callback) { + 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); + } + }); + }); +}; + +angular.module('insight.socket').factory('get_socket', ['$rootScope', function($rootScope) { + var socket = io.connect(); + return function(scope) { + var scopedSocket = new ScopedSocket(socket, $rootScope); + scope.$on('$destroy', function() { + scopedSocket.removeAllListeners(); + }); + return scopedSocket; + }; }]);