/** * engine.io-client * Copyright(c) 2011 LearnBoost * MIT Licensed */ /** * Inheritance. * * @param {Function} ctor a * @param {Function} ctor b * @api public */ exports.inherits = function inherits (a, b) { function c () { } c.prototype = b.prototype; a.prototype = new c; } /** * UA / engines detection namespace. * * @namespace */ exports.ua = {}; /** * Whether the UA supports CORS for XHR. * * @api public */ exports.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { try { var a = new XMLHttpRequest(); } catch (e) { return false; } return a.withCredentials != undefined; })(); /** * Detect webkit. * * @api public */ exports.ua.webkit = 'undefined' != typeof navigator && /webkit/i.test(navigator.userAgent); /** * Detect gecko. * * @api public */ exports.ua.gecko = 'undefined' != typeof navigator && /gecko/i.test(navigator.userAgent); /** * XHR request helper. * * @param {Boolean} whether we need xdomain * @api private */ exports.request = function request (xdomain) { // if node var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; return new XMLHttpRequest(); // end if (xdomain && 'undefined' != typeof XDomainRequest) { return new XDomainRequest(); } // XMLHttpRequest can be disabled on IE try { if ('undefined' != typeof XMLHttpRequest && (!xdomain || exports.ua.hasCORS)) { return new XMLHttpRequest(); } } catch (e) { } if (!xdomain) { try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) { } } }; /** * Parses an URI * * @author Steven Levithan (MIT license) * @api public */ var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; var parts = [ 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host' , 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor' ]; exports.parseUri = function (str) { var m = re.exec(str || '') , uri = {} , i = 14; while (i--) { uri[parts[i]] = m[i] || ''; } return uri; }; /** * Compiles a querystring * * @param {Object} * @api public */ exports.qs = function (obj) { var str = ''; for (var i in obj) { if (obj.hasOwnProperty(i)) { if (str.length) str += '&'; str += i + '=' + encodeURIComponent(obj[i]); } } return str; };