'use strict'; var ScopedSocket = function(socket, $rootScope) { this.socket = socket; this.$rootScope = $rootScope; this.listeners = []; }; 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 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('copay.socket').factory('Socket', function($rootScope) { var server = 'http://' + config.socket.host + ':' + config.socket.port; var socket = io.connect(server, { 'reconnect': true, 'reconnection delay': 500, }); 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; }; });