(function (f){ if (typeof exports === "object" && typeof module !== "undefined") { module.exports = f(); } else if (typeof define === "function" && define.amd) { define([] , f); } else { var g; if (typeof window !== "undefined") { g = window; } else if (typeof global !== "undefined") { g = global; } else if (typeof self !== "undefined") { g = self; } else { g = this; } g.io = f(); } } )(function (){ var define, module, exports; return (function e(t, n, r){ function s(o, u){ if (!n[o]) { if (!t[o]) { var a = typeof require == "function" && require; if (!u && a) return a(o, true ); if (i) return i(o, true ); var f = new Error("Cannot find module '" + o + "'"); throw f.code = "MODULE_NOT_FOUND", f } var l = n[o] = { exports: { } } ; t[o][0].call(l.exports, function (e){ var n = t[o][1][e]; return s(n? n: e); } , l, l.exports, e, t, n, r); } return n[o].exports; } var i = typeof require == "function" && require; for (var o = 0; o < _AN_Read_length("length", r); o++ )s(r[o]); return s; } )({ 1: [function (_dereq_, module, exports){ module.exports = _dereq_('./lib/'); } , { "./lib/": 2} ] , 2: [function (_dereq_, module, exports){ module.exports = _dereq_('./socket'); module.exports.parser = _dereq_('engine.io-parser'); } , { "./socket": 3, "engine.io-parser": 19} ] , 3: [function (_dereq_, module, exports){ (function (global){ var transports = _dereq_('./transports'); var Emitter = _dereq_('component-emitter'); var debug = _dereq_('debug')('engine.io-client:socket'); var index = _dereq_('indexof'); var parser = _dereq_('engine.io-parser'); var parseuri = _dereq_('parseuri'); var parsejson = _dereq_('parsejson'); var parseqs = _dereq_('parseqs'); module.exports = Socket; function noop(){ } function Socket(uri, opts){ if (!(this instanceof Socket)) return new Socket(uri, opts); opts = opts || { } ; if (uri && 'object' == typeof uri) { opts = uri; uri = null ; } if (uri) { uri = parseuri(uri); _AN_Write_hostname('hostname', opts, false , _AN_Read_host('host', uri)); opts.secure = _AN_Read_protocol('protocol', uri) == 'https' || _AN_Read_protocol('protocol', uri) == 'wss'; _AN_Write_port('port', opts, false , _AN_Read_port('port', uri)); if (uri.query) opts.query = uri.query; } else if (opts.host) { _AN_Write_hostname('hostname', opts, false , _AN_Read_host('host', parseuri(_AN_Read_host('host', opts)))); } this.secure = null != opts.secure? opts.secure: (_AN_Read_location('location', global) && 'https:' == _AN_Read_protocol('protocol', _AN_Read_location('location', window))); if (_AN_Read_hostname('hostname', opts) && !_AN_Read_port('port', opts)) { _AN_Write_port('port', opts, false , this.secure? '443': '80'); } this.agent = opts.agent || false ; _AN_Write_hostname('hostname', this, false , _AN_Read_hostname('hostname', opts) || (_AN_Read_location('location', global)? _AN_Read_hostname('hostname', _AN_Read_location('location', window)): 'localhost')); _AN_Write_port('port', this, false , _AN_Read_port('port', opts) || (_AN_Read_location('location', global) && _AN_Read_port('port', _AN_Read_location('location', window))? _AN_Read_port('port', _AN_Read_location('location', window)): (this.secure? 443: 80))); this.query = opts.query || { } ; if ('string' == typeof this.query) this.query = parseqs.decode(this.query); this.upgrade = false !== opts.upgrade; this.path = _AN_Call_replace('replace', (opts.path || '/engine.io'), /\/$/, '') + '/'; this.forceJSONP = !!opts.forceJSONP; this.jsonp = false !== opts.jsonp; this.forceBase64 = !!opts.forceBase64; this.enablesXDR = !!opts.enablesXDR; this.timestampParam = opts.timestampParam || 't'; this.timestampRequests = opts.timestampRequests; this.transports = opts.transports || ['polling', 'websocket'] ; this.readyState = ''; this.writeBuffer = [] ; this.policyPort = opts.policyPort || 843; this.rememberUpgrade = opts.rememberUpgrade || false ; this.binaryType = null ; this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades; this.perMessageDeflate = false !== opts.perMessageDeflate? (opts.perMessageDeflate || { } ): false ; if (true === this.perMessageDeflate) this.perMessageDeflate = { } ; if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) { this.perMessageDeflate.threshold = 1024; } this.pfx = opts.pfx || null ; this.key = opts.key || null ; this.passphrase = opts.passphrase || null ; this.cert = opts.cert || null ; this.ca = opts.ca || null ; this.ciphers = opts.ciphers || null ; this.rejectUnauthorized = opts.rejectUnauthorized === undefined? null : opts.rejectUnauthorized; var freeGlobal = typeof global == 'object' && global; if (freeGlobal.global === freeGlobal) { if (opts.extraHeaders && _AN_Read_length('length', Object.keys(opts.extraHeaders)) > 0) { this.extraHeaders = opts.extraHeaders; } } _AN_Call_open('open', this); } Socket.priorWebsocketSuccess = false ; Emitter(Socket.prototype); _AN_Write_protocol('protocol', Socket, false , _AN_Read_protocol('protocol', parser)); Socket.Socket = Socket; Socket.Transport = _dereq_('./transport'); Socket.transports = _dereq_('./transports'); Socket.parser = _dereq_('engine.io-parser'); Socket.prototype.createTransport = function (name){ debug('creating transport "%s"', name); var query = clone(this.query); query.EIO = _AN_Read_protocol('protocol', parser); query.transport = name; if (this.id) query.sid = this.id; var transport = new transports[name]({ agent: this.agent, hostname: (_AN_Read_hostname('hostname', this)), port: (_AN_Read_port('port', this)), secure: this.secure, path: this.path, query: query, forceJSONP: this.forceJSONP, jsonp: this.jsonp, forceBase64: this.forceBase64, enablesXDR: this.enablesXDR, timestampRequests: this.timestampRequests, timestampParam: this.timestampParam, policyPort: this.policyPort, socket: this, pfx: this.pfx, key: this.key, passphrase: this.passphrase, cert: this.cert, ca: this.ca, ciphers: this.ciphers, rejectUnauthorized: this.rejectUnauthorized, perMessageDeflate: this.perMessageDeflate, extraHeaders: this.extraHeaders} ); return transport; } ; function clone(obj){ var o = { } ; for (var i in obj){ if (obj.hasOwnProperty(i)) { o[i] = obj[i]; } } return o; } Socket.prototype.open = function (){ var transport; if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') != -1) { transport = 'websocket'; } else if (0 === _AN_Read_length('length', this.transports)) { var self = this; _AN_Call_settimeout('setTimeout', window, function (){ self.emit('error', 'No transports available'); } , 0); return ; } else { transport = this.transports[0]; } this.readyState = 'opening'; try { transport = this.createTransport(transport); } catch (e) { this.transports.shift(); _AN_Call_open('open', this); return ; } _AN_Call_open('open', transport); this.setTransport(transport); } ; Socket.prototype.setTransport = function (transport){ debug('setting transport %s', transport.name); var self = this; if (this.transport) { debug('clearing existing transport %s', this.transport.name); this.transport.removeAllListeners(); } this.transport = transport; transport.on('drain', function (){ self.onDrain(); } ).on('packet', function (packet){ self.onPacket(packet); } ).on('error', function (e){ self.onError(e); } ).on('close', function (){ self.onClose('transport close'); } ); } ; Socket.prototype.probe = function (name){ debug('probing transport "%s"', name); var transport = this.createTransport(name, { probe: 1} ), failed = false , self = this; Socket.priorWebsocketSuccess = false ; function onTransportOpen(){ if (self.onlyBinaryUpgrades) { var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary; failed = failed || upgradeLosesBinary; } if (failed) return ; debug('probe transport "%s" opened', name); _AN_Call_send('send', transport, [{ type: 'ping', data: 'probe'} ] ); transport.once('packet', function (msg){ if (failed) return ; if ('pong' == msg.type && 'probe' == msg.data) { debug('probe transport "%s" pong', name); self.upgrading = true ; self.emit('upgrading', transport); if (!transport) return ; Socket.priorWebsocketSuccess = 'websocket' == transport.name; debug('pausing current transport "%s"', self.transport.name); self.transport.pause(function (){ if (failed) return ; if ('closed' == self.readyState) return ; debug('changing transport and sending upgrade packet'); cleanup(); self.setTransport(transport); _AN_Call_send('send', transport, [{ type: 'upgrade'} ] ); self.emit('upgrade', transport); transport = null ; self.upgrading = false ; self.flush(); } ); } else { debug('probe transport "%s" failed', name); var err = new Error('probe error'); err.transport = transport.name; self.emit('upgradeError', err); } } ); } function freezeTransport(){ if (failed) return ; failed = true ; cleanup(); transport.close(); transport = null ; } function onerror(err){ var error = new Error('probe error: ' + err); error.transport = transport.name; freezeTransport(); debug('probe transport "%s" failed because of error: %s', name, err); self.emit('upgradeError', error); } function onTransportClose(){ onerror("transport closed"); } function onclose(){ onerror("socket closed"); } function onupgrade(to){ if (transport && to.name != transport.name) { debug('"%s" works - aborting "%s"', to.name, transport.name); freezeTransport(); } } function cleanup(){ transport.removeListener('open', onTransportOpen); transport.removeListener('error', onerror); transport.removeListener('close', onTransportClose); self.removeListener('close', onclose); self.removeListener('upgrading', onupgrade); } transport.once('open', onTransportOpen); transport.once('error', onerror); transport.once('close', onTransportClose); this.once('close', onclose); this.once('upgrading', onupgrade); _AN_Call_open('open', transport); } ; Socket.prototype.onOpen = function (){ debug('socket open'); this.readyState = 'open'; Socket.priorWebsocketSuccess = 'websocket' == this.transport.name; this.emit('open'); this.flush(); if ('open' == this.readyState && this.upgrade && this.transport.pause) { debug('starting upgrade probes'); for (var i = 0, l = _AN_Read_length('length', this.upgrades); i < l; i++ ){ this.probe(this.upgrades[i]); } } } ; Socket.prototype.onPacket = function (packet){ if ('opening' == this.readyState || 'open' == this.readyState) { debug('socket receive: type "%s", data "%s"', packet.type, packet.data); this.emit('packet', packet); this.emit('heartbeat'); switch (packet.type){ case 'open': this.onHandshake(parsejson(packet.data)); break ; case 'pong': this.setPing(); this.emit('pong'); break ; case 'error': var err = new Error('server error'); err.code = packet.data; this.onError(err); break ; case 'message': this.emit('data', packet.data); this.emit('message', packet.data); break ; } } else { debug('packet received with socket readyState "%s"', this.readyState); } } ; Socket.prototype.onHandshake = function (data){ this.emit('handshake', data); this.id = data.sid; this.transport.query.sid = data.sid; this.upgrades = this.filterUpgrades(data.upgrades); this.pingInterval = data.pingInterval; this.pingTimeout = data.pingTimeout; this.onOpen(); if ('closed' == this.readyState) return ; this.setPing(); this.removeListener('heartbeat', this.onHeartbeat); this.on('heartbeat', this.onHeartbeat); } ; Socket.prototype.onHeartbeat = function (timeout){ clearTimeout(this.pingTimeoutTimer); var self = this; self.pingTimeoutTimer = _AN_Call_settimeout('setTimeout', window, function (){ if ('closed' == self.readyState) return ; self.onClose('ping timeout'); } , timeout || (self.pingInterval + self.pingTimeout)); } ; Socket.prototype.setPing = function (){ var self = this; clearTimeout(self.pingIntervalTimer); self.pingIntervalTimer = _AN_Call_settimeout('setTimeout', window, function (){ debug('writing ping packet - expecting pong within %sms', self.pingTimeout); self.ping(); self.onHeartbeat(self.pingTimeout); } , self.pingInterval); } ; Socket.prototype.ping = function (){ var self = this; this.sendPacket('ping', function (){ self.emit('ping'); } ); } ; Socket.prototype.onDrain = function (){ this.writeBuffer.splice(0, this.prevBufferLen); this.prevBufferLen = 0; if (0 === _AN_Read_length('length', this.writeBuffer)) { this.emit('drain'); } else { this.flush(); } } ; Socket.prototype.flush = function (){ if ('closed' != this.readyState && this.transport.writable && !this.upgrading && _AN_Read_length('length', this.writeBuffer)) { debug('flushing %d packets in socket', _AN_Read_length('length', this.writeBuffer)); _AN_Call_send('send', this.transport, this.writeBuffer); this.prevBufferLen = _AN_Read_length('length', this.writeBuffer); this.emit('flush'); } } ; Socket.prototype.write = Socket.prototype.send = function (msg, options, fn){ this.sendPacket('message', msg, options, fn); return this; } ; Socket.prototype.sendPacket = function (type, data, options, fn){ if ('function' == typeof data) { fn = data; data = undefined; } if ('function' == typeof options) { fn = options; options = null ; } if ('closing' == this.readyState || 'closed' == this.readyState) { return ; } options = options || { } ; options.compress = false !== options.compress; var packet = { type: type, data: data, options: options} ; this.emit('packetCreate', packet); this.writeBuffer.push(packet); if (fn) this.once('flush', fn); this.flush(); } ; Socket.prototype.close = function (){ if ('opening' == this.readyState || 'open' == this.readyState) { this.readyState = 'closing'; var self = this; if (this.writeBuffer.length) { this.once('drain', function (){ if (this.upgrading) { waitForUpgrade(); } else { close(); } } ); } else if (this.upgrading) { waitForUpgrade(); } else { close(); } } function close(){ self.onClose('forced close'); debug('socket closing - telling transport to close'); self.transport.close(); } function cleanupAndClose(){ self.removeListener('upgrade', cleanupAndClose); self.removeListener('upgradeError', cleanupAndClose); close(); } function waitForUpgrade(){ self.once('upgrade', cleanupAndClose); self.once('upgradeError', cleanupAndClose); } return this; } ; Socket.prototype.onError = function (err){ debug('socket error %j', err); Socket.priorWebsocketSuccess = false ; this.emit('error', err); this.onClose('transport error', err); } ; Socket.prototype.onClose = function (reason, desc){ if ('opening' == this.readyState || 'open' == this.readyState || 'closing' == this.readyState) { debug('socket close with reason: "%s"', reason); var self = this; clearTimeout(this.pingIntervalTimer); clearTimeout(this.pingTimeoutTimer); this.transport.removeAllListeners('close'); this.transport.close(); this.transport.removeAllListeners(); this.readyState = 'closed'; this.id = null ; this.emit('close', reason, desc); self.writeBuffer = [] ; self.prevBufferLen = 0; } } ; Socket.prototype.filterUpgrades = function (upgrades){ var filteredUpgrades = [] ; for (var i = 0, j = _AN_Read_length('length', upgrades); i < j; i++ ){ if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]); } return filteredUpgrades; } ; } ).call(this, typeof self !== "undefined"? self: typeof window !== "undefined"? window: typeof global !== "undefined"? global: { } ); } , { "./transport": 4, "./transports": 5, "component-emitter": 15, "debug": 17, "engine.io-parser": 19, "indexof": 23, "parsejson": 26, "parseqs": 27, "parseuri": 28} ] , 4: [function (_dereq_, module, exports){ var parser = _dereq_('engine.io-parser'); var Emitter = _dereq_('component-emitter'); module.exports = Transport; function Transport(opts){ this.path = opts.path; _AN_Write_hostname('hostname', this, false , _AN_Read_hostname('hostname', opts)); _AN_Write_port('port', this, false , _AN_Read_port('port', opts)); this.secure = opts.secure; this.query = opts.query; this.timestampParam = opts.timestampParam; this.timestampRequests = opts.timestampRequests; this.readyState = ''; this.agent = opts.agent || false ; this.socket = opts.socket; this.enablesXDR = opts.enablesXDR; this.pfx = opts.pfx; this.key = opts.key; this.passphrase = opts.passphrase; this.cert = opts.cert; this.ca = opts.ca; this.ciphers = opts.ciphers; this.rejectUnauthorized = opts.rejectUnauthorized; this.extraHeaders = opts.extraHeaders; } Emitter(Transport.prototype); Transport.prototype.onError = function (msg, desc){ var err = new Error(msg); err.type = 'TransportError'; err.description = desc; this.emit('error', err); return this; } ; Transport.prototype.open = function (){ if ('closed' == this.readyState || '' == this.readyState) { this.readyState = 'opening'; this.doOpen(); } return this; } ; Transport.prototype.close = function (){ if ('opening' == this.readyState || 'open' == this.readyState) { this.doClose(); this.onClose(); } return this; } ; Transport.prototype.send = function (packets){ if ('open' == this.readyState) { _AN_Call_write('write', this, packets); } else { throw new Error('Transport not open') } } ; Transport.prototype.onOpen = function (){ this.readyState = 'open'; this.writable = true ; this.emit('open'); } ; Transport.prototype.onData = function (data){ var packet = parser.decodePacket(data, this.socket.binaryType); this.onPacket(packet); } ; Transport.prototype.onPacket = function (packet){ this.emit('packet', packet); } ; Transport.prototype.onClose = function (){ this.readyState = 'closed'; this.emit('close'); } ; } , { "component-emitter": 15, "engine.io-parser": 19} ] , 5: [function (_dereq_, module, exports){ (function (global){ var XMLHttpRequest = _dereq_('xmlhttprequest-ssl'); var XHR = _dereq_('./polling-xhr'); var JSONP = _dereq_('./polling-jsonp'); var websocket = _dereq_('./websocket'); exports.polling = polling; exports.websocket = websocket; function polling(opts){ var xhr; var xd = false ; var xs = false ; var jsonp = false !== opts.jsonp; if (global.location) { var isSSL = 'https:' == _AN_Read_protocol('protocol', _AN_Read_location('location', window)); var port = _AN_Read_port('port', _AN_Read_location('location', window)); if (!port) { port = isSSL? 443: 80; } xd = _AN_Read_hostname('hostname', opts) != _AN_Read_hostname('hostname', _AN_Read_location('location', window)) || port != _AN_Read_port('port', opts); xs = opts.secure != isSSL; } opts.xdomain = xd; opts.xscheme = xs; xhr = new XMLHttpRequest(opts); if ('open' in xhr && !opts.forceJSONP) { return new XHR(opts); } else { if (!jsonp) throw new Error('JSONP disabled') return new JSONP(opts); } } } ).call(this, typeof self !== "undefined"? self: typeof window !== "undefined"? window: typeof global !== "undefined"? global: { } ); } , { "./polling-jsonp": 6, "./polling-xhr": 7, "./websocket": 9, "xmlhttprequest-ssl": 10} ] , 6: [function (_dereq_, module, exports){ (function (global){ var Polling = _dereq_('./polling'); var inherit = _dereq_('component-inherit'); module.exports = JSONPPolling; var rNewline = /\n/g; var rEscapedNewline = /\\n/g; var callbacks; var index = 0; function empty(){ } function JSONPPolling(opts){ Polling.call(this, opts); this.query = this.query || { } ; if (!callbacks) { if (!global.___eio) global.___eio = [] ; callbacks = global.___eio; } this.index = _AN_Read_length('length', callbacks); var self = this; callbacks.push(function (msg){ self.onData(msg); } ); this.query.j = this.index; if (global.document && global.addEventListener) { global.addEventListener('beforeunload', function (){ if (self.script) self.script.onerror = empty; } , false ); } } inherit(JSONPPolling, Polling); JSONPPolling.prototype.supportsBinary = false ; JSONPPolling.prototype.doClose = function (){ if (this.script) { this.script.parentNode.removeChild(this.script); this.script = null ; } if (this.form) { this.form.parentNode.removeChild(this.form); this.form = null ; this.iframe = null ; } Polling.prototype.doClose.call(this); } ; JSONPPolling.prototype.doPoll = function (){ var self = this; var script = _AN_Call_createelement('createElement', document, 'script'); if (this.script) { this.script.parentNode.removeChild(this.script); this.script = null ; } script.async = true ; _AN_Write_src('src', script, false , this.uri()); script.onerror = function (e){ self.onError('jsonp poll error', e); } ; var insertAt = _AN_Call_getelementsbytagname('getElementsByTagName', document, 'script')[0]; if (insertAt) { insertAt.parentNode.insertBefore(script, insertAt); } else { _AN_Call_appendchild('appendChild', (document.head || document.body), script); } this.script = script; var isUAgecko = 'undefined' != typeof navigator && /gecko/i.test(navigator.userAgent); if (isUAgecko) { _AN_Call_settimeout('setTimeout', window, function (){ var iframe = _AN_Call_createelement('createElement', document, 'iframe'); _AN_Call_appendchild('appendChild', document.body, iframe); document.body.removeChild(iframe); } , 100); } } ; JSONPPolling.prototype.doWrite = function (data, fn){ var self = this; if (!this.form) { var form = _AN_Call_createelement('createElement', document, 'form'); var area = _AN_Call_createelement('createElement', document, 'textarea'); var id = this.iframeId = 'eio_iframe_' + this.index; var iframe; form.className = 'socketio'; form.style.position = 'absolute'; form.style.top = '-1000px'; form.style.left = '-1000px'; _AN_Write_target('target', form, false , id); form.method = 'POST'; _AN_Call_setattribute('setAttribute', form, 'accept-charset', 'utf-8'); area.name = 'd'; _AN_Call_appendchild('appendChild', form, area); _AN_Call_appendchild('appendChild', document.body, form); this.form = form; this.area = area; } _AN_Write_action('action', this.form, false , this.uri()); function complete(){ initIframe(); fn(); } function initIframe(){ if (self.iframe) { try { self.form.removeChild(self.iframe); } catch (e) { self.onError('jsonp polling iframe removal error', e); } } try { var html = '