Source: connection/packet_manager.js

/** @namespace XMPP
    @desc      Routes XMPP packets to and from Orion User Server.
*/
var XMPP = XMPP ||
{
    /* properties */
    
    'subscription_packets': {},
    'registered_starlets' : [],
	'queue'				  : [],
    
    'connection'          : null,
    'reconnect'           : 0,
    'ping'                : 0,
    'internet_status'     : 1,
    
    /* callbacks */
    
    'onPresence': function (presence)
    {
        var ptype = $(presence).attr('type');
        
        !~$.inArray(ptype, ['orion_ping']) && log(L_FUNC, 'XMPP.onPresence', presence);

        0 && !~$.inArray(ptype,
        [
            'orion_ping',
            'peerstatus',
            'extension',
            'presence',
            'dialpad_call',
            'new_caller_info'
        ])
        && console.log('PRES', presence);
        
        //Connection.onPing(); // any incoming traffic shows connection is alive
        
        // route
        
        switch (ptype) // alphabetical
        {
            // !! NEW
            
            case 'userSettings'          : Processor.userSettings          (presence);                           return true;
            
            // !! OLD
            
            case 'add_group'             : Processor.add_group             (presence, 'add_group');              return true;
            case 'add_group_extension'   : Processor.add_group_extension   (presence, 'add_group_extension');    return true;
            case 'api_broadcast'         : Processor.xmpp.onBroadcast      (presence);                           return true;
            case 'available'             :
                
                log(L_DEBUG, 'XMPP.onPresence', 'available');
                //Connection.onConnect();
                return true;
                
            case 'availability_status'   : Processor.first_roster          (presence, 'availability_status');    return true;
            //case 'call_recording'        : Processor.call_recording        (presence, 'call_recording');         return true;
            //case 'call_recording_filter' : Processor.call_recording        (presence, 'call_recording');         return true;
            case 'chat_status'           : Processor.chat_status           (presence, 'chat_status');            return true;
            case 'conference'            : Processor.conference            (presence, 'conference');             return true;
            case 'conference_event'      : Processor.conferencesEvent      (presence, 'conference_event');       return true;
            case 'create_fax_bucket'     : Processor.create_fax_bucket     (presence, 'create_fax_bucket');      return true;
            case 'delete_fax'            : Processor.delete_fax            (presence, 'delete_fax');             return true;
            case 'delete_fax_bucket'     : Processor.delete_fax_bucket     (presence, 'delete_fax_bucket');      return true;
            case 'dialpad_call'          :
                
                if ($(presence).find('extension_id').text() == 0) { return true; }
                Processor.dialpad_call(presence);
                return true;
                
            case 'dialpad_key'           :
                
                log(L_INFO, 'received a dialpad key');
                Processor.dialpad_key(presence);
                return true;
                
            case 'error'                 :
                
                if ($(presence).find('error').find('conflict').length > 0)
                {
                    var obj = $pres({'to': $(presence).attr('from') + '_sub_' + Math.floor((Math.random() * 100) + 1)})
                                .c('x', {'xmlns': 'http://jabber.org/protocol/muc'});
                    
                    this.send(obj);
                }
                return true;
            
            case 'extension'             : Processor.extension             (presence, 'extension');              return true;
            case 'fax'                   :
                
                log(L_INFO, 'STARFAX INIT: PTYPE FAX');
                Processor.fax(presence, 'fax');
                return true;
                
            case 'fax_filter'            : Processor.fax_messages          (presence, 'fax_messages');           return true;
            case 'fax_messages'          : Processor.fax_messages          (presence, 'fax_messages');           return true;
            case 'fax_status'            :                                                                       return true;
            case 'file_upload_token'     : Processor.file_upload_token     (presence, 'file_upload_token');      return true;
            case 'first_roster'          : Processor.first_roster          (presence, 'first_roster');           return true;
            case 'framework_update'      : Processor.frameworkUpdate       (presence);                           return true;
            case 'get_starlets'          :
                
                log(L_DEBUG, 'XMPP.onPresence', 'get_starlets');
                //Connection.onConnect();
                return true;
                
            case 'group_invites'         : Processor.group_invites         (presence, 'group_invites');          return true; // chat
            case 'group_roster'          : Processor.group_roster          (presence, 'group_roster');           return true;
            case 'groups'                : Processor.groups                (presence, 'groups');                 return true;
            case 'hold'                  : Processor.xmpp.hold              (presence);                           return true;
            case 'join_update'           :
                
                log(L_INFO, 'received join_update packet: ' + $(presence).attr('to').text() + ' | id: ' + $(presence).attr('user_id').text());
                
                var msg = "<div id='" + $(presence).attr('to').text() + "' class='message notice'>" +
                    "<div style='display:none' id='timestamp'>" + new Date().getTime() + "</div>" + 
                    "<div class='nick center'>" +
                    "sub_" + $(presence).attr('user_id').text() + "_ has joined.</div></div>";
                
                amplify.publish('starchat_message', msg);
                return true;
                
            case 'location_chat_status'  : Processor.location_chat_status  (presence, 'location_chat_status');   return true;
            case 'location_status'       : Processor.location_status       (presence, 'location_status');        return true;
            case 'locations'             : Processor.locations             (presence, 'locations');              return true;
            case 'move_fax'              : Processor.move_fax              (presence, 'move_fax');               return true;
            case 'mycall'                : Processor.mycalls               (presence, 'mycall');                 return true;
            case 'mycall_filter'         : Processor.mycalls               (presence, 'mycall');                 return true;
            case 'mycalls'               : Processor.mycalls               (presence, 'mycall');                 return true;
            case 'mycalls_filter'        : Processor.mycalls               (presence, 'mycall');                 return true;
            //case 'new_call_recording'    : Processor.call_recording        (presence, 'new_call_recording');     return true;
            case 'new_caller_info'       : Processor.new_caller_info       (presence);                           return true;
            case 'new_fax'               : Processor.fax                   (presence, 'new_fax');                return true;
            case 'notes_info'            : Processor.notes_info            (presence, 'notes_info');             return true;
            case 'orion_connection'      : Processor.orion_connection      (presence);                           return true;
            case 'orion_ping'            : /*Connection.onPong();*/                                              return true;
            case 'orion_user_settings'   : Processor.orion_user_settings   (presence);                           return true;
            case 'parked'                : Processor.parked                (presence);                           return true;
            case 'peerstatus'            : Processor.peerstatus            (presence, 'peerstatus');             return true;
            case 'ping'                  : /*Connection.onPing();*/                                              return true;
            case 'pong'                  : Connection.onPong();                                                  return true;
            case 'pop'                   : Processor.pop                   (presence, 'pop');                    return true;
            case 'presence'              : Processor.presence              (presence);                           return true;
            case 'privacy_setting'       : Processor.privacy_setting       (presence, 'privacy_setting');        return true;
            case 'receive_chat'          : Processor.receive_chat          (presence, 'receive_chat');           return true;
            case 'remove_group'          : Processor.remove_group          (presence, 'remove_group');           return true;
            case 'remove_group_extension': Processor.remove_group_extension(presence, 'remove_group_extension'); return true;
            case 'rename'                : Processor.rename                (presence);                           return true;
            case 'rename_fax_bucket'     : Processor.rename_fax_bucket     (presence, 'rename_fax_bucket');      return true;
            case 'rename_group'          : Processor.rename_group          (presence, 'rename_group');           return true;
            case 'roster'                : Processor.roster                (presence, 'roster');                 return true;
            case 'settings'              : Processor.settings              (presence);                           return true;
            case 'status'                : Processor.status                (presence);                           return true;
            case 'unavailable'           :
                
                //log(L_INFO, 'received unavailable presence: ' + $(presence).attr('from'));
                //amplify.publish('user_disconnected', $(presence).attr('from').split('/').pop());
                
                Processor.chatmessages(presence, true);
                return true;
                
            case 'update_locations'      : Processor.locations             (presence, 'update_locations');       return true;
            case 'update_roster'         : Processor.roster                (presence, 'update_roster');          return true;
            case 'user_extensions'       :                                                                       return true;
            case 'voicemail'             : Processor.voicemail             (presence, 'voicemail');              return true;
            case 'voicemail_filter'      : Processor.voicemail             (presence, 'voicemail');              return true;
            default                      : // chat events
                
                $(presence).find('x').attr('xmlns') === 'http://jabber.org/protocol/muc#user'
                    && Processor.chatmessages(presence, true);
                
                return true;
        }
    },
    
    'onPublicMessage': function (message)
    {
        log(L_FUNC, 'XMPP.onPublicMessage', message);
        //console.log('onPublicMessage: ', message);
       // Connection.onPing(); // any incoming traffic shows connection is alive
        Processor.chatmessages(message);
        return true;
    },
    
    /* methods */
    
    'connect': function (username, password, domain, url)
    {
        log(L_MAIN, 'XMPP.connect', arguments);
        
        Connection.username = username;
        Connection.password = password;
        Connection.domain   = domain;
        Connection.url      = url;
        
	//console.log('----------', Connection.internet, this.connection );
        if (Connection.internet && this.connection === null)
        {
            var conn   = new Strophe.Connection(Connection.url);
            
            conn.connect(Connection.username + '@' + Connection.domain, Connection.password, function (status)
            {
                switch (status)
                {
                    case Strophe.Status.AUTHENTICATING:
			log(L_INFO , 'XMPP.connect', 'authenticating');
			Connection.onPong();
			break;
		    
                    case Strophe.Status.AUTHFAIL:
                        
                        log(L_ERROR, 'XMPP.connect', 'authentication fail');
                        XMPP.connection = null;
                        //Connection.onDisconnect();
                        OrionConnection.logoffApplication();
                        break;
                        
                    case Strophe.Status.CONNECTING: log(L_INFO , 'XMPP.connect', 'connecting'); break;
                    case Strophe.Status.CONNFAIL:
                        
                        log(L_ERROR, 'XMPP.connect', 'connection fail');
                        XMPP.connection = null;
                        Connection.onDisconnect();
                        break;
                        
                    case Strophe.Status.CONNECTED:
                        
                        log(L_MAIN, 'XMPP.connect', 'connected');
                        
                        if (XMPP.connection === null)
                        {
                            XMPP.connection = conn;
                            
                            XMPP.connection.addHandler(XMPP.onPresence        , null, 'presence'             );
	                        XMPP.connection.addHandler(XMPP.onPublicMessage   , null, 'message' , 'groupchat');
                            //XMPP.connection.addHandler(XMPP.on_private_message, null, 'message' , 'chat'     );
                            
                            XMPP.send($pres({'name': 'presence', 'category': 'update', 'type': 'subscribe_packet'}));
							// New packet to initialize the client. Replaces the old get_starlets.
							XMPP.send($pres({'user_id': Connection.my_user_id, 'location_id': Connection.my_location, 'type': 'initialize'}));
                            //XMPP.send($pres({'type': 'available'}));//.c({'platform': ''}, {'version': ''})); // new 2.0 initial presence
                            
                            //Connection.onPing();
                            Connection.onConnect();
                        }
                        
                        break;
                        
                    case Strophe.Status.DISCONNECTING: log(L_INFO , 'XMPP.connect', 'disconnecting'); break;
                    case Strophe.Status.DISCONNECTED:
                        
                        log(L_MAIN, 'XMPP.connect', 'disconnected');
                        XMPP.connection = null;
                        Connection.onDisconnect();
                        
                        break;
                        
                    case Strophe.Status.ERROR:
                        
                        log(L_ERROR, 'XMPP.connect', 'connection error');
                        XMPP.connection = null;
                        Connection.onDisconnect();
                        break;
                        
                    default: log(L_INFO , 'XMPP.connect', 'status ' + status); break;
                }
            });
        }
    },
    
    'disconnect': function () { this.connection && this.connection.disconnect(); },
    
    'send': function (packet)
    {
        log(L_INFO, 'XMPP.send', packet);
        
		XMPP.queue.push(packet);
		!XMPP.sendInterval && (XMPP.sendInterval = setInterval(function(){
			if (XMPP.queue.length) {
				var item = XMPP.queue.shift();
				XMPP.connection !== null && XMPP.connection.send(item);
			} else {
				clearInterval(XMPP.sendInterval);
				XMPP.sendInterval = null;
			}
		}, 500))
    }

};