(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, !0); if (i)return i(o, !0); 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 < r.length; 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); opts.hostname = uri.host; opts.secure = uri.protocol == "https" || uri.protocol == "wss"; opts.port = uri.port; if (uri.query)opts.query = uri.query } else if (opts.host) { opts.hostname = parseuri(opts.host).host } this.secure = null != opts.secure ? opts.secure : global.location && "https:" == location.protocol; if (opts.hostname && !opts.port) { opts.port = this.secure ? "443" : "80" } this.agent = opts.agent || false; this.hostname = opts.hostname || (global.location ? location.hostname : "localhost"); this.port = opts.port || (global.location && location.port ? location.port : 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 = (opts.path || "/engine.io").replace(/\/$/, "") + "/"; 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 && Object.keys(opts.extraHeaders).length > 0) { this.extraHeaders = opts.extraHeaders } } this.open() } Socket.priorWebsocketSuccess = false; Emitter(Socket.prototype); Socket.protocol = parser.protocol; 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 = parser.protocol; query.transport = name; if (this.id)query.sid = this.id; var transport = new transports[name]({ agent: this.agent, hostname: this.hostname, port: this.port, 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 === this.transports.length) { var self = this; setTimeout(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(); this.open(); return } transport.open(); 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); transport.send([{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); transport.send([{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); transport.open() }; 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 = this.upgrades.length; 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 = setTimeout(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 = setTimeout(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 === this.writeBuffer.length) { this.emit("drain") } else { this.flush() } }; Socket.prototype.flush = function () { if ("closed" != this.readyState && this.transport.writable && !this.upgrading && this.writeBuffer.length) { debug("flushing %d packets in socket", this.writeBuffer.length); this.transport.send(this.writeBuffer); this.prevBufferLen = this.writeBuffer.length; 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 = upgrades.length; 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; this.hostname = opts.hostname; this.port = opts.port; 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) { this.write(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:" == location.protocol; var port = location.port; if (!port) { port = isSSL ? 443 : 80 } xd = opts.hostname != location.hostname || port != opts.port; 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 = callbacks.length; 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 = document.createElement("script"); if (this.script) { this.script.parentNode.removeChild(this.script); this.script = null } script.async = true; script.src = this.uri(); script.onerror = function (e) { self.onError("jsonp poll error", e) }; var insertAt = document.getElementsByTagName("script")[0]; if (insertAt) { insertAt.parentNode.insertBefore(script, insertAt) } else { (document.head || document.body).appendChild(script) } this.script = script; var isUAgecko = "undefined" != typeof navigator && /gecko/i.test(navigator.userAgent); if (isUAgecko) { setTimeout(function () { var iframe = document.createElement("iframe"); document.body.appendChild(iframe); document.body.removeChild(iframe) }, 100) } }; JSONPPolling.prototype.doWrite = function (data, fn) { var self = this; if (!this.form) { var form = document.createElement("form"); var area = document.createElement("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"; form.target = id; form.method = "POST"; form.setAttribute("accept-charset", "utf-8"); area.name = "d"; form.appendChild(area); document.body.appendChild(form); this.form = form; this.area = area } this.form.action = 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 = '