| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | angular.module('chatServices', []).factory('Connection', function($rootScope, $timeout, $interval, $location) {  var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket;  var chatSocket = null;  var ping = null;  var service = {    username: '',    error: null,    messages: [],    isConnected: function() {      return this.username != '';    },    addListener: function(f) {      messageListeners.add(f);    }  };  function wrap(func) {    return function() {      var args = arguments;      $timeout(function() {        func.apply(null, args);      });    }  };  function makeid() {    var text = "";    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";    for( var i=0; i < 5; i++ )      text += possible.charAt(Math.floor(Math.random() * possible.length));    return text;  }  function getRoom() {    if(!$location.path()) {      $location.path(makeid());    }    return $location.path();  }  service.connect = function(username) {    service.error = null;    chatSocket = new WS(jsRoutes.controllers.Application.chat(username, getRoom()).webSocketURL());    chatSocket.onmessage = wrap(function(event) {      var message = JSON.parse(event.data);      if(message.error) {        service.error = message.error;      }      if(message.kind != "pong") {        $rootScope.$broadcast('ws:message', message);      }    });    chatSocket.onopen = wrap(function() {      $rootScope.$broadcast('ws:connected', username);      service.username = username;      ping = $interval(function() {        service.send('/ping');      }, 60000, 0, false);    });    chatSocket.onclose = wrap(function() {      $rootScope.$broadcast('ws:disconnected');      service.username = '';      $interval.cancel(ping);    });  }  service.disconnect = function() {    chatSocket.close();    chatSocket = null;  }  service.send = function(message) {    chatSocket.send(JSON.stringify({text: message}));  }  return service;}).factory('Chat', function($rootScope, Connection) {  var service = {    username: '',    messages: [],    receive: function(message) {      if(arguments.length == 3) {        message = {          kind: arguments[0],          user: arguments[1],          message: arguments[2]        };      }      service.messages.push(message);    },    getError: function() {      return Connection.error;    },    connect: Connection.connect,    disconnect: Connection.disconnect,    isConnected: Connection.isConnected,    send: Connection.send  };  $rootScope.$on('ws:connected', function(event, username) {    service.username = username;  });  $rootScope.$on('ws:message', function(event, message) {    if(message.kind == "talk") {      service.receive(message);    }    else if(message.kind == "join") {      service.receive("join", message.user, " has joined.");    }    else if(message.kind == "quit") {      service.receive("quit", message.user, " has left.");    }  });  $rootScope.$on('ws:disconnected', function() {    service.messages = [];    service.username = '';  });  if(Connection.isConnected()) {    service.username = Connection.username;  }  return service;})
 |