PageRenderTime 60ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/public/src/js/services/socket.js

https://github.com/barmatz/insight
JavaScript | 71 lines | 63 code | 8 blank | 0 comment | 5 complexity | 3eb602c6eaafb6639fade93fad25bbf4 MD5 | raw file
  1. 'use strict';
  2. var ScopedSocket = function(socket, $rootScope) {
  3. this.socket = socket;
  4. this.$rootScope = $rootScope;
  5. this.listeners = [];
  6. };
  7. ScopedSocket.prototype.removeAllListeners = function(opts) {
  8. if (!opts) opts = {};
  9. for (var i = 0; i < this.listeners.length; i++) {
  10. var details = this.listeners[i];
  11. if (opts.skipConnect && details.event === 'connect') {
  12. continue;
  13. }
  14. this.socket.removeListener(details.event, details.fn);
  15. }
  16. this.listeners = [];
  17. };
  18. ScopedSocket.prototype.on = function(event, callback) {
  19. var socket = this.socket;
  20. var $rootScope = this.$rootScope;
  21. var wrapped_callback = function() {
  22. var args = arguments;
  23. $rootScope.$apply(function() {
  24. callback.apply(socket, args);
  25. });
  26. };
  27. socket.on(event, wrapped_callback);
  28. this.listeners.push({
  29. event: event,
  30. fn: wrapped_callback
  31. });
  32. };
  33. ScopedSocket.prototype.emit = function(event, data, callback) {
  34. var socket = this.socket;
  35. var $rootScope = this.$rootScope;
  36. socket.emit(event, data, function() {
  37. var args = arguments;
  38. $rootScope.$apply(function() {
  39. if (callback) {
  40. callback.apply(socket, args);
  41. }
  42. });
  43. });
  44. };
  45. angular.module('insight.socket').factory('getSocket',
  46. function($rootScope) {
  47. var socket = io.connect(null, {
  48. 'reconnect': true,
  49. 'reconnection delay': 500,
  50. });
  51. return function(scope) {
  52. var scopedSocket = new ScopedSocket(socket, $rootScope);
  53. scope.$on('$destroy', function() {
  54. scopedSocket.removeAllListeners();
  55. });
  56. socket.on('connect', function() {
  57. scopedSocket.removeAllListeners({
  58. skipConnect: true
  59. });
  60. });
  61. return scopedSocket;
  62. };
  63. });