All Downloads are FREE. Search and download functionalities are using the official Maven repository.

js.RT.Channel.js Maven / Gradle / Ivy

The newest version!

	/**
	 * RT Channel
	 */
	RT.Channel = function(url, cfg){
		
		var localTransports = Object.keys(RT.transports);
		
		/**
		 * Default config
		 */
		this.cfg = cfg = RT.extend({
			/**
			 * fatal error callback
			 */
			onError: function(msg){},
			
			/**
			 * Log function
			 */
			log: function(level, msg){},
			
			/**
			 * All enabled transports
			 */
			transports: localTransports,
			
			/**
			 * Websocket config
			 */
			websocket: {
				url: location.protocol.replace("http", "ws") + "//" + location.host + location.pathname.substring(0, location.pathname.lastIndexOf("/")+1) + "rt/websocket"
			}
			
			//TODO: onConnection loss
		}, cfg);
		
		
		cfg.log("INFO", "RT version: " + RT.version);
		cfg.log("INFO", "RT Instance created with url: " + url + " and enabled transports: " + cfg.transports);
		
		/**
		 * Self reference
		 */
		var self = this;

		/**
		 * Event handler
		 */
		this.events = new RT.Events;
		
		//Map event functions to parent
		this.on = this.events.on.bind(this.events);
		this.off = this.events.off.bind(this.events);
		this.once = this.events.once.bind(this.events);
		this.fire = this.events.fire.bind(this.events);
		
		/**
		 * Close handlers
		 */
		this.closeHandlers = [];
		
		this.close = function(){
			cfg.log("INFO", "Stopping RT instance");
			self.closeHandlers.forEach(function(h){ h(); });
		};
		
		
		cfg.log("DEBUG", "Quering status from server");
		
		RT.getJSON(url)
		.then(function(status){
			
			var availableTransports = status.transports;
			
			if (status.version !== RT.version)
				cfg.log("WARN", "Version mismatch, js=" + RT.version + " server=" + status.version);
			
			cfg.log("DEBUG", "Available server-transports: " + availableTransports);
			
			if (!availableTransports)
				return cfg.onError("invalid transports: " + availableTransports);
			
			/**
			 * Check enabled transport
			 */
			var checkTransport = function(name){
				return availableTransports.indexOf(name) >= 0 && cfg.transports.indexOf(name) >= 0;
			};
			
			var transportList = [];
			
			//TODO: more dynamic
			
			if (checkTransport("longpoll")){
				//Longpoll
				cfg.log("DEBUG", "Enabling longpoll transport");
				transportList.push(RT.transports.longpoll);
			}
			
			if (checkTransport("sse")){
				//SSE
				cfg.log("DEBUG", "Enabling sse transport");
				transportList.push(RT.transports.sse);
			}

			if (checkTransport("websocket")){
				//Websocket
				cfg.log("DEBUG", "Enabling websocket transport");
				transportList.push(RT.transports.websocket);
			}
			
			var transport = undefined;

			cfg.log("DEBUG", "My id: " + status.clientId);

			var createTransport = function(){
				
				if (transportList.length == 0){
					cfg.log("ERROR", "No more transports");
					cfg.onError("No more transports");
					return;
				}
								
				transport = transportList.pop();
				
				var instance = new transport(url, self, cfg, createTransport);
			};
			
			//Create initial transport
			createTransport();
		})
		.fail(function(status){
			cfg.log("ERROR", "Connection error: " + msg);
			cfg.onError("Connection error: " + msg);
		});

	};





© 2015 - 2025 Weber Informatics LLC | Privacy Policy