CORD-772 Example UI Extension

Change-Id: I66f9236620a56219cc84a5f7ed5be719751db3bd
diff --git a/typings/globals/socket.io-client/index.d.ts b/typings/globals/socket.io-client/index.d.ts
new file mode 100644
index 0000000..db58959
--- /dev/null
+++ b/typings/globals/socket.io-client/index.d.ts
@@ -0,0 +1,663 @@
+// Generated by typings
+// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/7de6c3dd94feaeb21f20054b9f30d5dabc5efabd/socket.io-client/socket.io-client.d.ts
+declare var io: SocketIOClientStatic;
+
+declare module 'socket.io-client' {
+	export = io;
+}
+
+interface SocketIOClientStatic {
+
+	/**
+	 * Looks up an existing 'Manager' for multiplexing. If the user summons:
+	 * 	'io( 'http://localhost/a' );'
+	 * 	'io( 'http://localhost/b' );'
+	 *
+	 * We reuse the existing instance based on the same scheme/port/host, and
+	 * we initialize sockets for each namespace. If autoConnect isn't set to
+	 * false in the options, then we'll automatically connect
+	 * @param uri The uri that we'll connect to, including the namespace, where '/' is the default one (e.g. http://localhost:4000/somenamespace)
+	 * @opts Any connect options that we want to pass along
+	 * @return A Socket object
+	 */
+	( uri: string, opts?: SocketIOClient.ConnectOpts ): SocketIOClient.Socket;
+
+	/**
+	 * Auto-connects to the window location and defalt namespace.
+	 * E.g. window.protocol + '//' + window.host + ':80/'
+	 * @opts Any connect options that we want to pass along
+	 * @return A Socket object
+	 */
+	( opts?: SocketIOClient.ConnectOpts ): SocketIOClient.Socket;
+
+	/**
+	 * @see the default constructor (io(uri, opts))
+	 */
+	connect( uri: string, opts?: SocketIOClient.ConnectOpts ): SocketIOClient.Socket;
+
+	/**
+	 * @see the default constructor (io(opts))
+	 */
+	connect( opts?: SocketIOClient.ConnectOpts ): SocketIOClient.Socket;
+
+	/**
+	 * The socket.io protocol revision number this client works with
+	 * @default 4
+	 */
+	protocol: number;
+
+	/**
+	 * Socket constructor - exposed for the standalone build
+	 */
+	Socket: SocketIOClient.Socket;
+
+	/**
+	 * Manager constructor - exposed for the standalone build
+	 */
+	Manager: SocketIOClient.ManagerStatic;
+}
+
+declare namespace SocketIOClient {
+
+	/**
+	 * The base emiter class, used by Socket and Manager
+	 */
+	interface Emitter {
+		/**
+		 * Adds a listener for a particular event. Calling multiple times will add
+		 * multiple listeners
+		 * @param event The event that we're listening for
+		 * @param fn The function to call when we get the event. Parameters depend on the
+		 * event in question
+		 * @return This Emitter
+		 */
+		on( event: string, fn: Function ):Emitter;
+
+		/**
+		 * @see on( event, fn )
+		 */
+		addEventListener( event: string, fn: Function ):Emitter;
+
+		/**
+		 * Adds a listener for a particular event that will be invoked
+		 * a single time before being automatically removed
+		 * @param event The event that we're listening for
+		 * @param fn The function to call when we get the event. Parameters depend on
+		 * the event in question
+		 * @return This Emitter
+		 */
+		once( event: string, fn: Function ):Emitter;
+
+		/**
+		 * Removes a listener for a particular type of event. This will either
+		 * remove a specific listener, or all listeners for this type of event
+		 * @param event The event that we want to remove the listener of
+		 * @param fn The function to remove, or null if we want to remove all functions
+		 * @return This Emitter
+		 */
+		off( event: string, fn?: Function ):Emitter;
+
+		/**
+		 * @see off( event, fn )
+		 */
+		removeListener( event: string, fn?: Function ):Emitter;
+
+		/**
+		 * @see off( event, fn )
+		 */
+		removeEventListener( event: string, fn?: Function ):Emitter;
+
+		/**
+		 * Removes all event listeners on this object
+		 * @return This Emitter
+		 */
+		removeAllListeners():Emitter;
+
+		/**
+		 * Emits 'event' with the given args
+		 * @param event The event that we want to emit
+		 * @param args Optional arguments to emit with the event
+		 * @return Emitter
+		 */
+		emit( event: string, ...args: any[] ):Emitter;
+
+		/**
+		 * Returns all the callbacks for a particular event
+		 * @param event The event that we're looking for the callbacks of
+		 * @return An array of callback Functions, or an empty array if we don't have any
+		 */
+		listeners( event: string ):Function[];
+
+		/**
+		 * Returns if we have listeners for a particular event
+		 * @param event The event that we want to check if we've listeners for
+		 * @return True if we have listeners for this event, false otherwise
+		 */
+		hasListeners( event: string ):boolean;
+	}
+
+	/**
+	 * The Socket static interface
+	 */
+	interface SocketStatic {
+
+		/**
+		 * Creates a new Socket, used for communicating with a specific namespace
+		 * @param io The Manager that's controlling this socket
+		 * @param nsp The namespace that this socket is for (@default '/')
+		 * @return A new Socket
+		 */
+		( io: SocketIOClient.Manager, nsp: string ): Socket;
+
+		/**
+		 * Creates a new Socket, used for communicating with a specific namespace
+		 * @param io The Manager that's controlling this socket
+		 * @param nsp The namespace that this socket is for (@default '/')
+		 * @return A new Socket
+		 */
+		new ( url: string, opts: any ): SocketIOClient.Manager;
+	}
+
+	/**
+	 * The Socket that we use to connect to a Namespace on the server
+	 */
+	interface Socket extends Emitter {
+
+		/**
+		 * The Manager that's controller this socket
+		 */
+		io: SocketIOClient.Manager;
+
+		/**
+		 * The namespace that this socket is for
+		 * @default '/'
+		 */
+		nsp: string;
+
+		/**
+		 * The ID of the socket; matches the server ID and is set when we're connected, and cleared
+		 * when we're disconnected
+		 */
+		id: string;
+
+		/**
+		 * Are we currently connected?
+		 * @default false
+		 */
+		connected: boolean;
+
+		/**
+		 * Are we currently disconnected?
+		 * @default true
+		 */
+		disconnected: boolean;
+
+		/**
+		 * Opens our socket so that it connects. If the 'autoConnect' option for io is
+		 * true (default), then this is called automatically when the Socket is created
+		 */
+		open(): Socket;
+
+		/**
+		 * @see open();
+		 */
+		connect(): Socket;
+
+		/**
+		 * Sends a 'message' event
+		 * @param args Any optional arguments that we want to send
+		 * @see emit
+		 * @return This Socket
+		 */
+		send( ...args: any[] ):Socket;
+
+		/**
+		 * An override of the base emit. If the event is one of:
+		 * 	connect
+		 * 	connect_error
+		 * 	connect_timeout
+		 * 	connecting
+		 * 	disconnect
+		 * 	error
+		 * 	reconnect
+		 * 	reconnect_attempt
+		 * 	reconnect_failed
+		 * 	reconnect_error
+		 * 	reconnecting
+		 * 	ping
+		 * 	pong
+		 * then the event is emitted normally. Otherwise, if we're connected, the
+		 * event is sent. Otherwise, it's buffered.
+		 *
+		 * If the last argument is a function, then it will be called
+		 * as an 'ack' when the response is received. The parameter(s) of the
+		 * ack will be whatever data is returned from the event
+		 * @param event The event that we're emitting
+		 * @param args Optional arguments to send with the event
+		 * @return This Socket
+		 */
+		emit( event: string, ...args: any[] ):Socket;
+
+		/**
+		 * Disconnects the socket manually
+		 * @return This Socket
+		 */
+		close():Socket;
+
+		/**
+		 * @see close()
+		 */
+		disconnect():Socket;
+
+		/**
+		* Sets the compress flag.
+		* @param compress If `true`, compresses the sending data
+		* @return this Socket
+		*/
+		compress(compress: boolean):Socket;
+	}
+
+	/**
+	 * The Manager static interface
+	 */
+	interface ManagerStatic {
+		/**
+		 * Creates a new Manager
+		 * @param uri The URI that we're connecting to (e.g. http://localhost:4000)
+		 * @param opts Any connection options that we want to use (and pass to engine.io)
+		 * @return A Manager
+		 */
+		( uri: string, opts?: SocketIOClient.ConnectOpts ): SocketIOClient.Manager;
+
+		/**
+		 * Creates a new Manager with the default URI (window host)
+		 * @param opts Any connection options that we want to use (and pass to engine.io)
+		 */
+		( opts: SocketIOClient.ConnectOpts ):SocketIOClient.Manager;
+
+		/**
+		 * @see default constructor
+		 */
+		new ( uri: string, opts?: SocketIOClient.ConnectOpts ): SocketIOClient.Manager;
+
+		/**
+		 * @see default constructor
+		 */
+		new ( opts: SocketIOClient.ConnectOpts ):SocketIOClient.Manager;
+	}
+
+	/**
+	 * The Manager class handles all the Namespaces and Sockets that we're using
+	 */
+	interface Manager extends Emitter {
+
+		/**
+		 * All the namespaces currently controlled by this Manager, and the Sockets
+		 * that we're using to communicate with them
+		 */
+		nsps: { [namespace:string]: Socket };
+
+		/**
+		 * The connect options that we used when creating this Manager
+		 */
+		opts: SocketIOClient.ConnectOpts;
+
+		/**
+		 * The state of the Manager. Either 'closed', 'opening', or 'open'
+		 */
+		readyState: string;
+
+		/**
+		 * The URI that this manager is for (host + port), e.g. 'http://localhost:4000'
+		 */
+		uri: string;
+
+		/**
+		 * The currently connected sockets
+		 */
+		connecting: Socket[];
+
+		/**
+		 * If we should auto connect (also used when creating Sockets). Set via the
+		 * opts object
+		 */
+		autoConnect: boolean;
+
+		/**
+		 * Gets if we should reconnect automatically
+		 * @default true
+		 */
+		reconnection(): boolean;
+
+		/**
+		 * Sets if we should reconnect automatically
+		 * @param v True if we should reconnect automatically, false otherwise
+		 * @default true
+		 * @return This Manager
+		 */
+		reconnection( v: boolean ): Manager;
+
+		/**
+		 * Gets the number of reconnection attempts we should try before giving up
+		 * @default Infinity
+		 */
+		reconnectionAttempts(): number;
+
+		/**
+		 * Sets the number of reconnection attempts we should try before giving up
+		 * @param v The number of attempts we should do before giving up
+		 * @default Infinity
+		 * @return This Manager
+		 */
+		reconnectionAttempts( v: number ): Manager;
+
+		/**
+		 * Gets the delay in milliseconds between each reconnection attempt
+		 * @default 1000
+		 */
+		reconnectionDelay(): number;
+
+		/**
+		 * Sets the delay in milliseconds between each reconnection attempt
+		 * @param v The delay in milliseconds
+		 * @default 1000
+		 * @return This Manager
+		 */
+		reconnectionDelay( v: number ): Manager;
+
+		/**
+		 * Gets the max reconnection delay in milliseconds between each reconnection
+		 * attempt
+		 * @default 5000
+		 */
+		reconnectionDelayMax(): number;
+
+		/**
+		 * Sets the max reconnection delay in milliseconds between each reconnection
+		 * attempt
+		 * @param v The max reconnection dleay in milliseconds
+		 * @return This Manager
+		 */
+		reconnectionDelayMax( v: number ): Manager;
+
+		/**
+		 * Gets the randomisation factor used in the exponential backoff jitter
+		 * when reconnecting
+		 * @default 0.5
+		 */
+		randomizationFactor(): number;
+
+		/**
+		 * Sets the randomisation factor used in the exponential backoff jitter
+		 * when reconnecting
+		 * @param The reconnection randomisation factor
+		 * @default 0.5
+		 * @return This Manager
+		 */
+		randomizationFactor( v: number ): Manager;
+
+		/**
+		 * Gets the timeout in milliseconds for our connection attempts
+		 * @default 20000
+		 */
+		timeout(): number;
+
+		/**
+		 * Sets the timeout in milliseconds for our connection attempts
+		 * @param The connection timeout milliseconds
+		 * @return This Manager
+		 */
+		timeout(v: boolean): Manager;
+
+		/**
+		 * Sets the current transport socket and opens our connection
+		 * @param fn An optional callback to call when our socket has either opened, or
+		 * failed. It can take one optional parameter of type Error
+		 * @return This Manager
+		 */
+		open( fn?: (err?: any) => void ): Manager;
+
+		/**
+		 * @see open( fn );
+		 */
+		connect( fn?: (err?: any) => void ): Manager;
+
+		/**
+		 * Creates a new Socket for the given namespace
+		 * @param nsp The namespace that this Socket is for
+		 * @return A new Socket, or if one has already been created for this namespace,
+		 * an existing one
+		 */
+		socket( nsp: string ): Socket;
+	}
+
+	/**
+	 * Options we can pass to the socket when connecting
+	 */
+	interface ConnectOpts {
+
+		/**
+		 * Should we force a new Manager for this connection?
+		 * @default false
+		 */
+		forceNew?: boolean;
+
+		/**
+		 * Should we multiplex our connection (reuse existing Manager) ?
+		 * @default true
+		 */
+		multiplex?: boolean;
+
+		/**
+		 * The path to get our client file from, in the case of the server
+		 * serving it
+		 * @default '/socket.io'
+		 */
+		path?: string;
+
+		/**
+		 * Should we allow reconnections?
+		 * @default true
+		 */
+		reconnection?: boolean;
+
+		/**
+		 * How many reconnection attempts should we try?
+		 * @default Infinity
+		 */
+		reconnectionAttempts?: number;
+
+		/**
+		 * The time delay in milliseconds between reconnection attempts
+		 * @default 1000
+		 */
+		reconnectionDelay?: number;
+
+		/**
+		 * The max time delay in milliseconds between reconnection attempts
+		 * @default 5000
+		 */
+		reconnectionDelayMax?: number;
+
+		/**
+		 * Used in the exponential backoff jitter when reconnecting
+		 * @default 0.5
+		 */
+		randomizationFactor?: number;
+
+		/**
+		 * The timeout in milliseconds for our connection attempt
+		 * @default 20000
+		 */
+		timeout?: number;
+
+		/**
+		 * Should we automically connect?
+		 * @default true
+		 */
+		autoConnect?: boolean;
+
+		/**
+		 * The host that we're connecting to. Set from the URI passed when connecting
+		 */
+		host?: string;
+
+		/**
+		 * The hostname for our connection. Set from the URI passed when connecting
+		 */
+		hostname?: string;
+
+		/**
+		 * If this is a secure connection. Set from the URI passed when connecting
+		 */
+		secure?: boolean;
+
+		/**
+		 * The port for our connection. Set from the URI passed when connecting
+		 */
+		port?: string;
+
+		/**
+		 * Any query parameters in our uri. Set from the URI passed when connecting
+		 */
+		query?: Object;
+
+		/**
+		 * `http.Agent` to use, defaults to `false` (NodeJS only)
+		 */
+		agent?: string|boolean;
+
+		/**
+		 * Whether the client should try to upgrade the transport from
+		 * long-polling to something better.
+		 * @default true
+		 */
+		upgrade?: boolean;
+
+		/**
+		 * Forces JSONP for polling transport.
+		 */
+		forceJSONP?: boolean;
+
+		/**
+		 * Determines whether to use JSONP when necessary for polling. If
+		 * disabled (by settings to false) an error will be emitted (saying
+		 * "No transports available") if no other transports are available.
+		 * If another transport is available for opening a connection (e.g.
+		 * WebSocket) that transport will be used instead.
+		 * @default true
+		 */
+		jsonp?: boolean;
+
+		/**
+		 * Forces base 64 encoding for polling transport even when XHR2
+		 * responseType is available and WebSocket even if the used standard
+		 * supports binary.
+		 */
+		forceBase64?: boolean;
+
+		/**
+		 * Enables XDomainRequest for IE8 to avoid loading bar flashing with
+		 * click sound. default to `false` because XDomainRequest has a flaw
+		 * of not sending cookie.
+		 * @default false
+		 */
+		enablesXDR?: boolean;
+
+		/**
+		 * The param name to use as our timestamp key
+		 * @default 't'
+		 */
+		timestampParam?: string;
+
+		/**
+		 * Whether to add the timestamp with each transport request. Note: this
+		 * is ignored if the browser is IE or Android, in which case requests
+		 * are always stamped
+		 * @default false
+		 */
+		timestampRequests?: boolean;
+
+		/**
+		 * A list of transports to try (in order). Engine.io always attempts to
+		 * connect directly with the first one, provided the feature detection test
+		 * for it passes.
+		 * @default ['polling','websocket']
+		 */
+		transports?: string[];
+
+		/**
+		 * The port the policy server listens on
+		 * @default 843
+		 */
+		policyPost?: number;
+
+		/**
+		 * If true and if the previous websocket connection to the server succeeded,
+		 * the connection attempt will bypass the normal upgrade process and will
+		 * initially try websocket. A connection attempt following a transport error
+		 * will use the normal upgrade process. It is recommended you turn this on
+		 * only when using SSL/TLS connections, or if you know that your network does
+		 * not block websockets.
+		 * @default false
+		 */
+		rememberUpgrade?: boolean;
+
+		/**
+		 * Are we only interested in transports that support binary?
+		 */
+		onlyBinaryUpgrades?: boolean;
+
+		/**
+		 * (SSL) Certificate, Private key and CA certificates to use for SSL.
+		 * Can be used in Node.js client environment to manually specify
+		 * certificate information.
+		 */
+		pfx?: string;
+
+		/**
+		 * (SSL) Private key to use for SSL. Can be used in Node.js client
+		 * environment to manually specify certificate information.
+		 */
+		key?: string;
+
+		/**
+		 * (SSL) A string or passphrase for the private key or pfx. Can be
+		 * used in Node.js client environment to manually specify certificate
+		 * information.
+		 */
+		passphrase?: string
+
+		/**
+		 * (SSL) Public x509 certificate to use. Can be used in Node.js client
+		 * environment to manually specify certificate information.
+		 */
+		cert?: string;
+
+		/**
+		 * (SSL) An authority certificate or array of authority certificates to
+		 * check the remote host against.. Can be used in Node.js client
+		 * environment to manually specify certificate information.
+		 */
+		ca?: string|string[];
+
+		/**
+		 * (SSL) A string describing the ciphers to use or exclude. Consult the
+		 * [cipher format list]
+		 * (http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT) for
+		 * details on the format.. Can be used in Node.js client environment to
+		 * manually specify certificate information.
+		 */
+		ciphers?: string;
+
+		/**
+		 * (SSL) If true, the server certificate is verified against the list of
+		 * supplied CAs. An 'error' event is emitted if verification fails.
+		 * Verification happens at the connection level, before the HTTP request
+		 * is sent. Can be used in Node.js client environment to manually specify
+		 * certificate information.
+		 */
+		rejectUnauthorized?: boolean;
+
+	}
+}