|
|
/* * @license * angular-socket-io v0.7.0 * (c) 2014 Brian Ford http://briantford.com
* License: MIT */
angular.module('btford.socket-io', []). provider('socketFactory', function () {
'use strict';
// when forwarding events, prefix the event name
var defaultPrefix = 'socket:', ioSocket;
// expose to provider
this.$get = ['$rootScope', '$timeout', function ($rootScope, $timeout) {
var asyncAngularify = function (socket, callback) { return callback ? function () { var args = arguments; $timeout(function () { callback.apply(socket, args); }, 0); } : angular.noop; };
return function socketFactory (options) { options = options || {}; var socket = options.ioSocket || io.connect(); var prefix = options.prefix === undefined ? defaultPrefix : options.prefix ; var defaultScope = options.scope || $rootScope;
var addListener = function (eventName, callback) { socket.on(eventName, callback.__ng = asyncAngularify(socket, callback)); };
var addOnceListener = function (eventName, callback) { socket.once(eventName, callback.__ng = asyncAngularify(socket, callback)); };
var wrappedSocket = { on: addListener, addListener: addListener, once: addOnceListener,
emit: function (eventName, data, callback) { var lastIndex = arguments.length - 1; var callback = arguments[lastIndex]; if(typeof callback == 'function') { callback = asyncAngularify(socket, callback); arguments[lastIndex] = callback; } return socket.emit.apply(socket, arguments); },
removeListener: function (ev, fn) { if (fn && fn.__ng) { arguments[1] = fn.__ng; } return socket.removeListener.apply(socket, arguments); },
removeAllListeners: function() { return socket.removeAllListeners.apply(socket, arguments); },
disconnect: function (close) { return socket.disconnect(close); },
connect: function() { return socket.connect(); },
// when socket.on('someEvent', fn (data) { ... }),
// call scope.$broadcast('someEvent', data)
forward: function (events, scope) { if (events instanceof Array === false) { events = [events]; } if (!scope) { scope = defaultScope; } events.forEach(function (eventName) { var prefixedEvent = prefix + eventName; var forwardBroadcast = asyncAngularify(socket, function () { Array.prototype.unshift.call(arguments, prefixedEvent); scope.$broadcast.apply(scope, arguments); }); scope.$on('$destroy', function () { socket.removeListener(eventName, forwardBroadcast); }); socket.on(eventName, forwardBroadcast); }); } };
return wrappedSocket; }; }]; });
|