{"version":3,"file":"socket.io.min.js","sources":["../node_modules/parseuri/index.js","../node_modules/has-cors/index.js","../node_modules/engine.io-client/build/esm/globalThis.browser.js","../node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js","../node_modules/engine.io-client/build/esm/util.js","../node_modules/@socket.io/component-emitter/index.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/commons.js","../node_modules/engine.io-client/node_modules/base64-arraybuffer/dist/base64-arraybuffer.es5.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/yeast/index.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/index.js","../node_modules/engine.io-client/build/esm/transport.js","../node_modules/parseqs/index.js","../node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/engine.io-client/build/esm/transports/polling-xhr.js","../node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js","../node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/engine.io-client/build/esm/socket.js","../node_modules/socket.io-parser/build/esm/is-binary.js","../node_modules/socket.io-parser/build/esm/binary.js","../node_modules/socket.io-parser/build/esm/index.js","../build/esm/on.js","../build/esm/socket.js","../node_modules/backo2/index.js","../build/esm/manager.js","../build/esm/index.js","../build/esm/url.js"],"sourcesContent":["/**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\n\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nvar parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\n\nmodule.exports = function parseuri(str) {\n    var src = str,\n        b = str.indexOf('['),\n        e = str.indexOf(']');\n\n    if (b != -1 && e != -1) {\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n    }\n\n    var m = re.exec(str || ''),\n        uri = {},\n        i = 14;\n\n    while (i--) {\n        uri[parts[i]] = m[i] || '';\n    }\n\n    if (b != -1 && e != -1) {\n        uri.source = src;\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n        uri.ipv6uri = true;\n    }\n\n    uri.pathNames = pathNames(uri, uri['path']);\n    uri.queryKey = queryKey(uri, uri['query']);\n\n    return uri;\n};\n\nfunction pathNames(obj, path) {\n    var regx = /\\/{2,9}/g,\n        names = path.replace(regx, \"/\").split(\"/\");\n\n    if (path.substr(0, 1) == '/' || path.length === 0) {\n        names.splice(0, 1);\n    }\n    if (path.substr(path.length - 1, 1) == '/') {\n        names.splice(names.length - 1, 1);\n    }\n\n    return names;\n}\n\nfunction queryKey(uri, query) {\n    var data = {};\n\n    query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n        if ($1) {\n            data[$1] = $2;\n        }\n    });\n\n    return data;\n}\n","\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n","export default (() => {\n    if (typeof self !== \"undefined\") {\n        return self;\n    }\n    else if (typeof window !== \"undefined\") {\n        return window;\n    }\n    else {\n        return Function(\"return this\")();\n    }\n})();\n","// browser shim for xmlhttprequest module\nimport hasCORS from \"has-cors\";\nimport globalThis from \"../globalThis.js\";\nexport default function (opts) {\n    const xdomain = opts.xdomain;\n    // XMLHttpRequest can be disabled on IE\n    try {\n        if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n            return new XMLHttpRequest();\n        }\n    }\n    catch (e) { }\n    if (!xdomain) {\n        try {\n            return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n        }\n        catch (e) { }\n    }\n}\n","import globalThis from \"./globalThis.js\";\nexport function pick(obj, ...attr) {\n    return attr.reduce((acc, k) => {\n        if (obj.hasOwnProperty(k)) {\n            acc[k] = obj[k];\n        }\n        return acc;\n    }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n    if (opts.useNativeTimers) {\n        obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n        obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n    }\n    else {\n        obj.setTimeoutFn = setTimeout.bind(globalThis);\n        obj.clearTimeoutFn = clearTimeout.bind(globalThis);\n    }\n}\n","\n/**\n * Expose `Emitter`.\n */\n\nexports.Emitter = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  function on() {\n    this.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks['$' + event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks['$' + event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n\n  // Remove event specific arrays for event types that no\n  // one is subscribed for to avoid memory leak.\n  if (callbacks.length === 0) {\n    delete this._callbacks['$' + event];\n  }\n\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n\n  var args = new Array(arguments.length - 1)\n    , callbacks = this._callbacks['$' + event];\n\n  for (var i = 1; i < arguments.length; i++) {\n    args[i - 1] = arguments[i];\n  }\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach(key => {\n    PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n    for (i = 0; i < len; i += 3) {\n        base64 += chars[bytes[i] >> 2];\n        base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n        base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n        base64 += chars[bytes[i + 2] & 63];\n    }\n    if (len % 3 === 2) {\n        base64 = base64.substring(0, base64.length - 1) + '=';\n    }\n    else if (len % 3 === 1) {\n        base64 = base64.substring(0, base64.length - 2) + '==';\n    }\n    return base64;\n};\nvar decode = function (base64) {\n    var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n    if (base64[base64.length - 1] === '=') {\n        bufferLength--;\n        if (base64[base64.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n    var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n    for (i = 0; i < len; i += 4) {\n        encoded1 = lookup[base64.charCodeAt(i)];\n        encoded2 = lookup[base64.charCodeAt(i + 1)];\n        encoded3 = lookup[base64.charCodeAt(i + 2)];\n        encoded4 = lookup[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return arraybuffer;\n};\n\nexport { decode, encode };\n//# sourceMappingURL=base64-arraybuffer.es5.js.map\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = obj => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n    if (withNativeBlob && data instanceof Blob) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(data, callback);\n        }\n    }\n    else if (withNativeArrayBuffer &&\n        (data instanceof ArrayBuffer || isView(data))) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(new Blob([data]), callback);\n        }\n    }\n    // plain string\n    return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n    const fileReader = new FileReader();\n    fileReader.onload = function () {\n        const content = fileReader.result.split(\",\")[1];\n        callback(\"b\" + content);\n    };\n    return fileReader.readAsDataURL(data);\n};\nexport default encodePacket;\n","'use strict';\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE } from \"./commons.js\";\nimport { decode } from \"base64-arraybuffer\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst decodePacket = (encodedPacket, binaryType) => {\n    if (typeof encodedPacket !== \"string\") {\n        return {\n            type: \"message\",\n            data: mapBinary(encodedPacket, binaryType)\n        };\n    }\n    const type = encodedPacket.charAt(0);\n    if (type === \"b\") {\n        return {\n            type: \"message\",\n            data: decodeBase64Packet(encodedPacket.substring(1), binaryType)\n        };\n    }\n    const packetType = PACKET_TYPES_REVERSE[type];\n    if (!packetType) {\n        return ERROR_PACKET;\n    }\n    return encodedPacket.length > 1\n        ? {\n            type: PACKET_TYPES_REVERSE[type],\n            data: encodedPacket.substring(1)\n        }\n        : {\n            type: PACKET_TYPES_REVERSE[type]\n        };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n    if (withNativeArrayBuffer) {\n        const decoded = decode(data);\n        return mapBinary(decoded, binaryType);\n    }\n    else {\n        return { base64: true, data }; // fallback for old browsers\n    }\n};\nconst mapBinary = (data, binaryType) => {\n    switch (binaryType) {\n        case \"blob\":\n            return data instanceof ArrayBuffer ? new Blob([data]) : data;\n        case \"arraybuffer\":\n        default:\n            return data; // assuming the data is already an ArrayBuffer\n    }\n};\nexport default decodePacket;\n","import encodePacket from \"./encodePacket.js\";\nimport decodePacket from \"./decodePacket.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n    // some packets may be added to the array while encoding, so the initial length must be saved\n    const length = packets.length;\n    const encodedPackets = new Array(length);\n    let count = 0;\n    packets.forEach((packet, i) => {\n        // force base64 encoding for binary packets\n        encodePacket(packet, false, encodedPacket => {\n            encodedPackets[i] = encodedPacket;\n            if (++count === length) {\n                callback(encodedPackets.join(SEPARATOR));\n            }\n        });\n    });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n    const encodedPackets = encodedPayload.split(SEPARATOR);\n    const packets = [];\n    for (let i = 0; i < encodedPackets.length; i++) {\n        const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n        packets.push(decodedPacket);\n        if (decodedPacket.type === \"error\") {\n            break;\n        }\n    }\n    return packets;\n};\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload };\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nexport class Transport extends Emitter {\n    /**\n     * Transport abstract constructor.\n     *\n     * @param {Object} options.\n     * @api private\n     */\n    constructor(opts) {\n        super();\n        this.writable = false;\n        installTimerFunctions(this, opts);\n        this.opts = opts;\n        this.query = opts.query;\n        this.readyState = \"\";\n        this.socket = opts.socket;\n    }\n    /**\n     * Emits an error.\n     *\n     * @param {String} str\n     * @return {Transport} for chaining\n     * @api protected\n     */\n    onError(msg, desc) {\n        const err = new Error(msg);\n        // @ts-ignore\n        err.type = \"TransportError\";\n        // @ts-ignore\n        err.description = desc;\n        super.emit(\"error\", err);\n        return this;\n    }\n    /**\n     * Opens the transport.\n     *\n     * @api public\n     */\n    open() {\n        if (\"closed\" === this.readyState || \"\" === this.readyState) {\n            this.readyState = \"opening\";\n            this.doOpen();\n        }\n        return this;\n    }\n    /**\n     * Closes the transport.\n     *\n     * @api public\n     */\n    close() {\n        if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n            this.doClose();\n            this.onClose();\n        }\n        return this;\n    }\n    /**\n     * Sends multiple packets.\n     *\n     * @param {Array} packets\n     * @api public\n     */\n    send(packets) {\n        if (\"open\" === this.readyState) {\n            this.write(packets);\n        }\n        else {\n            // this might happen if the transport was silently closed in the beforeunload event handler\n        }\n    }\n    /**\n     * Called upon open\n     *\n     * @api protected\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        this.writable = true;\n        super.emit(\"open\");\n    }\n    /**\n     * Called with data.\n     *\n     * @param {String} data\n     * @api protected\n     */\n    onData(data) {\n        const packet = decodePacket(data, this.socket.binaryType);\n        this.onPacket(packet);\n    }\n    /**\n     * Called with a decoded packet.\n     *\n     * @api protected\n     */\n    onPacket(packet) {\n        super.emit(\"packet\", packet);\n    }\n    /**\n     * Called upon close.\n     *\n     * @api protected\n     */\n    onClose() {\n        this.readyState = \"closed\";\n        super.emit(\"close\");\n    }\n}\n","/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\n\nexports.encode = function (obj) {\n  var str = '';\n\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      if (str.length) str += '&';\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n    }\n  }\n\n  return str;\n};\n\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\n\nexports.decode = function(qs){\n  var qry = {};\n  var pairs = qs.split('&');\n  for (var i = 0, l = pairs.length; i < l; i++) {\n    var pair = pairs[i].split('=');\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n  }\n  return qry;\n};\n","import { Transport } from \"../transport.js\";\nimport yeast from \"yeast\";\nimport parseqs from \"parseqs\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nexport class Polling extends Transport {\n    constructor() {\n        super(...arguments);\n        this.polling = false;\n    }\n    /**\n     * Transport name.\n     */\n    get name() {\n        return \"polling\";\n    }\n    /**\n     * Opens the socket (triggers polling). We write a PING message to determine\n     * when the transport is open.\n     *\n     * @api private\n     */\n    doOpen() {\n        this.poll();\n    }\n    /**\n     * Pauses polling.\n     *\n     * @param {Function} callback upon buffers are flushed and transport is paused\n     * @api private\n     */\n    pause(onPause) {\n        this.readyState = \"pausing\";\n        const pause = () => {\n            this.readyState = \"paused\";\n            onPause();\n        };\n        if (this.polling || !this.writable) {\n            let total = 0;\n            if (this.polling) {\n                total++;\n                this.once(\"pollComplete\", function () {\n                    --total || pause();\n                });\n            }\n            if (!this.writable) {\n                total++;\n                this.once(\"drain\", function () {\n                    --total || pause();\n                });\n            }\n        }\n        else {\n            pause();\n        }\n    }\n    /**\n     * Starts polling cycle.\n     *\n     * @api public\n     */\n    poll() {\n        this.polling = true;\n        this.doPoll();\n        this.emit(\"poll\");\n    }\n    /**\n     * Overloads onData to detect payloads.\n     *\n     * @api private\n     */\n    onData(data) {\n        const callback = packet => {\n            // if its the first message we consider the transport open\n            if (\"opening\" === this.readyState && packet.type === \"open\") {\n                this.onOpen();\n            }\n            // if its a close packet, we close the ongoing requests\n            if (\"close\" === packet.type) {\n                this.onClose();\n                return false;\n            }\n            // otherwise bypass onData and handle the message\n            this.onPacket(packet);\n        };\n        // decode payload\n        decodePayload(data, this.socket.binaryType).forEach(callback);\n        // if an event did not trigger closing\n        if (\"closed\" !== this.readyState) {\n            // if we got data we're not polling\n            this.polling = false;\n            this.emit(\"pollComplete\");\n            if (\"open\" === this.readyState) {\n                this.poll();\n            }\n            else {\n            }\n        }\n    }\n    /**\n     * For polling, send a close packet.\n     *\n     * @api private\n     */\n    doClose() {\n        const close = () => {\n            this.write([{ type: \"close\" }]);\n        };\n        if (\"open\" === this.readyState) {\n            close();\n        }\n        else {\n            // in case we're trying to close while\n            // handshaking is in progress (GH-164)\n            this.once(\"open\", close);\n        }\n    }\n    /**\n     * Writes a packets payload.\n     *\n     * @param {Array} data packets\n     * @param {Function} drain callback\n     * @api private\n     */\n    write(packets) {\n        this.writable = false;\n        encodePayload(packets, data => {\n            this.doWrite(data, () => {\n                this.writable = true;\n                this.emit(\"drain\");\n            });\n        });\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @api private\n     */\n    uri() {\n        let query = this.query || {};\n        const schema = this.opts.secure ? \"https\" : \"http\";\n        let port = \"\";\n        // cache busting is forced\n        if (false !== this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = yeast();\n        }\n        if (!this.supportsBinary && !query.sid) {\n            query.b64 = 1;\n        }\n        // avoid port if default for schema\n        if (this.opts.port &&\n            ((\"https\" === schema && Number(this.opts.port) !== 443) ||\n                (\"http\" === schema && Number(this.opts.port) !== 80))) {\n            port = \":\" + this.opts.port;\n        }\n        const encodedQuery = parseqs.encode(query);\n        const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n        return (schema +\n            \"://\" +\n            (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n            port +\n            this.opts.path +\n            (encodedQuery.length ? \"?\" + encodedQuery : \"\"));\n    }\n}\n","/* global attachEvent */\nimport XMLHttpRequest from \"./xmlhttprequest.js\";\nimport globalThis from \"../globalThis.js\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { Polling } from \"./polling.js\";\n/**\n * Empty function\n */\nfunction empty() { }\nconst hasXHR2 = (function () {\n    const xhr = new XMLHttpRequest({\n        xdomain: false\n    });\n    return null != xhr.responseType;\n})();\nexport class XHR extends Polling {\n    /**\n     * XHR Polling constructor.\n     *\n     * @param {Object} opts\n     * @api public\n     */\n    constructor(opts) {\n        super(opts);\n        if (typeof location !== \"undefined\") {\n            const isSSL = \"https:\" === location.protocol;\n            let port = location.port;\n            // some user agents have empty `location.port`\n            if (!port) {\n                port = isSSL ? \"443\" : \"80\";\n            }\n            this.xd =\n                (typeof location !== \"undefined\" &&\n                    opts.hostname !== location.hostname) ||\n                    port !== opts.port;\n            this.xs = opts.secure !== isSSL;\n        }\n        /**\n         * XHR supports binary\n         */\n        const forceBase64 = opts && opts.forceBase64;\n        this.supportsBinary = hasXHR2 && !forceBase64;\n    }\n    /**\n     * Creates a request.\n     *\n     * @param {String} method\n     * @api private\n     */\n    request(opts = {}) {\n        Object.assign(opts, { xd: this.xd, xs: this.xs }, this.opts);\n        return new Request(this.uri(), opts);\n    }\n    /**\n     * Sends data.\n     *\n     * @param {String} data to send.\n     * @param {Function} called upon flush.\n     * @api private\n     */\n    doWrite(data, fn) {\n        const req = this.request({\n            method: \"POST\",\n            data: data\n        });\n        req.on(\"success\", fn);\n        req.on(\"error\", err => {\n            this.onError(\"xhr post error\", err);\n        });\n    }\n    /**\n     * Starts a poll cycle.\n     *\n     * @api private\n     */\n    doPoll() {\n        const req = this.request();\n        req.on(\"data\", this.onData.bind(this));\n        req.on(\"error\", err => {\n            this.onError(\"xhr poll error\", err);\n        });\n        this.pollXhr = req;\n    }\n}\nexport class Request extends Emitter {\n    /**\n     * Request constructor\n     *\n     * @param {Object} options\n     * @api public\n     */\n    constructor(uri, opts) {\n        super();\n        installTimerFunctions(this, opts);\n        this.opts = opts;\n        this.method = opts.method || \"GET\";\n        this.uri = uri;\n        this.async = false !== opts.async;\n        this.data = undefined !== opts.data ? opts.data : null;\n        this.create();\n    }\n    /**\n     * Creates the XHR object and sends the request.\n     *\n     * @api private\n     */\n    create() {\n        const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n        opts.xdomain = !!this.opts.xd;\n        opts.xscheme = !!this.opts.xs;\n        const xhr = (this.xhr = new XMLHttpRequest(opts));\n        try {\n            xhr.open(this.method, this.uri, this.async);\n            try {\n                if (this.opts.extraHeaders) {\n                    xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n                    for (let i in this.opts.extraHeaders) {\n                        if (this.opts.extraHeaders.hasOwnProperty(i)) {\n                            xhr.setRequestHeader(i, this.opts.extraHeaders[i]);\n                        }\n                    }\n                }\n            }\n            catch (e) { }\n            if (\"POST\" === this.method) {\n                try {\n                    xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n                }\n                catch (e) { }\n            }\n            try {\n                xhr.setRequestHeader(\"Accept\", \"*/*\");\n            }\n            catch (e) { }\n            // ie6 check\n            if (\"withCredentials\" in xhr) {\n                xhr.withCredentials = this.opts.withCredentials;\n            }\n            if (this.opts.requestTimeout) {\n                xhr.timeout = this.opts.requestTimeout;\n            }\n            xhr.onreadystatechange = () => {\n                if (4 !== xhr.readyState)\n                    return;\n                if (200 === xhr.status || 1223 === xhr.status) {\n                    this.onLoad();\n                }\n                else {\n                    // make sure the `error` event handler that's user-set\n                    // does not throw in the same tick and gets caught here\n                    this.setTimeoutFn(() => {\n                        this.onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n                    }, 0);\n                }\n            };\n            xhr.send(this.data);\n        }\n        catch (e) {\n            // Need to defer since .create() is called directly from the constructor\n            // and thus the 'error' event can only be only bound *after* this exception\n            // occurs.  Therefore, also, we cannot throw here at all.\n            this.setTimeoutFn(() => {\n                this.onError(e);\n            }, 0);\n            return;\n        }\n        if (typeof document !== \"undefined\") {\n            this.index = Request.requestsCount++;\n            Request.requests[this.index] = this;\n        }\n    }\n    /**\n     * Called upon successful response.\n     *\n     * @api private\n     */\n    onSuccess() {\n        this.emit(\"success\");\n        this.cleanup();\n    }\n    /**\n     * Called if we have data.\n     *\n     * @api private\n     */\n    onData(data) {\n        this.emit(\"data\", data);\n        this.onSuccess();\n    }\n    /**\n     * Called upon error.\n     *\n     * @api private\n     */\n    onError(err) {\n        this.emit(\"error\", err);\n        this.cleanup(true);\n    }\n    /**\n     * Cleans up house.\n     *\n     * @api private\n     */\n    cleanup(fromError) {\n        if (\"undefined\" === typeof this.xhr || null === this.xhr) {\n            return;\n        }\n        this.xhr.onreadystatechange = empty;\n        if (fromError) {\n            try {\n                this.xhr.abort();\n            }\n            catch (e) { }\n        }\n        if (typeof document !== \"undefined\") {\n            delete Request.requests[this.index];\n        }\n        this.xhr = null;\n    }\n    /**\n     * Called upon load.\n     *\n     * @api private\n     */\n    onLoad() {\n        const data = this.xhr.responseText;\n        if (data !== null) {\n            this.onData(data);\n        }\n    }\n    /**\n     * Aborts the request.\n     *\n     * @api public\n     */\n    abort() {\n        this.cleanup();\n    }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n    // @ts-ignore\n    if (typeof attachEvent === \"function\") {\n        // @ts-ignore\n        attachEvent(\"onunload\", unloadHandler);\n    }\n    else if (typeof addEventListener === \"function\") {\n        const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n        addEventListener(terminationEvent, unloadHandler, false);\n    }\n}\nfunction unloadHandler() {\n    for (let i in Request.requests) {\n        if (Request.requests.hasOwnProperty(i)) {\n            Request.requests[i].abort();\n        }\n    }\n}\n","import globalThis from \"../globalThis.js\";\nexport const nextTick = (() => {\n    const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n    if (isPromiseAvailable) {\n        return cb => Promise.resolve().then(cb);\n    }\n    else {\n        return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n    }\n})();\nexport const WebSocket = globalThis.WebSocket || globalThis.MozWebSocket;\nexport const usingBrowserWebSocket = true;\nexport const defaultBinaryType = \"arraybuffer\";\n","import { Transport } from \"../transport.js\";\nimport parseqs from \"parseqs\";\nimport yeast from \"yeast\";\nimport { pick } from \"../util.js\";\nimport { defaultBinaryType, nextTick, usingBrowserWebSocket, WebSocket } from \"./websocket-constructor.js\";\nimport { encodePacket } from \"engine.io-parser\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n    typeof navigator.product === \"string\" &&\n    navigator.product.toLowerCase() === \"reactnative\";\nexport class WS extends Transport {\n    /**\n     * WebSocket transport constructor.\n     *\n     * @api {Object} connection options\n     * @api public\n     */\n    constructor(opts) {\n        super(opts);\n        this.supportsBinary = !opts.forceBase64;\n    }\n    /**\n     * Transport name.\n     *\n     * @api public\n     */\n    get name() {\n        return \"websocket\";\n    }\n    /**\n     * Opens socket.\n     *\n     * @api private\n     */\n    doOpen() {\n        if (!this.check()) {\n            // let probe timeout\n            return;\n        }\n        const uri = this.uri();\n        const protocols = this.opts.protocols;\n        // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n        const opts = isReactNative\n            ? {}\n            : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n        if (this.opts.extraHeaders) {\n            opts.headers = this.opts.extraHeaders;\n        }\n        try {\n            this.ws =\n                usingBrowserWebSocket && !isReactNative\n                    ? protocols\n                        ? new WebSocket(uri, protocols)\n                        : new WebSocket(uri)\n                    : new WebSocket(uri, protocols, opts);\n        }\n        catch (err) {\n            return this.emit(\"error\", err);\n        }\n        this.ws.binaryType = this.socket.binaryType || defaultBinaryType;\n        this.addEventListeners();\n    }\n    /**\n     * Adds event listeners to the socket\n     *\n     * @api private\n     */\n    addEventListeners() {\n        this.ws.onopen = () => {\n            if (this.opts.autoUnref) {\n                this.ws._socket.unref();\n            }\n            this.onOpen();\n        };\n        this.ws.onclose = this.onClose.bind(this);\n        this.ws.onmessage = ev => this.onData(ev.data);\n        this.ws.onerror = e => this.onError(\"websocket error\", e);\n    }\n    /**\n     * Writes data to socket.\n     *\n     * @param {Array} array of packets.\n     * @api private\n     */\n    write(packets) {\n        this.writable = false;\n        // encodePacket efficient as it uses WS framing\n        // no need for encodePayload\n        for (let i = 0; i < packets.length; i++) {\n            const packet = packets[i];\n            const lastPacket = i === packets.length - 1;\n            encodePacket(packet, this.supportsBinary, data => {\n                // always create a new object (GH-437)\n                const opts = {};\n                if (!usingBrowserWebSocket) {\n                    if (packet.options) {\n                        opts.compress = packet.options.compress;\n                    }\n                    if (this.opts.perMessageDeflate) {\n                        const len = \"string\" === typeof data ? Buffer.byteLength(data) : data.length;\n                        if (len < this.opts.perMessageDeflate.threshold) {\n                            opts.compress = false;\n                        }\n                    }\n                }\n                // Sometimes the websocket has already been closed but the browser didn't\n                // have a chance of informing us about it yet, in that case send will\n                // throw an error\n                try {\n                    if (usingBrowserWebSocket) {\n                        // TypeError is thrown when passing the second argument on Safari\n                        this.ws.send(data);\n                    }\n                    else {\n                        this.ws.send(data, opts);\n                    }\n                }\n                catch (e) {\n                }\n                if (lastPacket) {\n                    // fake drain\n                    // defer to next tick to allow Socket to clear writeBuffer\n                    nextTick(() => {\n                        this.writable = true;\n                        this.emit(\"drain\");\n                    }, this.setTimeoutFn);\n                }\n            });\n        }\n    }\n    /**\n     * Closes socket.\n     *\n     * @api private\n     */\n    doClose() {\n        if (typeof this.ws !== \"undefined\") {\n            this.ws.close();\n            this.ws = null;\n        }\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @api private\n     */\n    uri() {\n        let query = this.query || {};\n        const schema = this.opts.secure ? \"wss\" : \"ws\";\n        let port = \"\";\n        // avoid port if default for schema\n        if (this.opts.port &&\n            ((\"wss\" === schema && Number(this.opts.port) !== 443) ||\n                (\"ws\" === schema && Number(this.opts.port) !== 80))) {\n            port = \":\" + this.opts.port;\n        }\n        // append timestamp to URI\n        if (this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = yeast();\n        }\n        // communicate binary support capabilities\n        if (!this.supportsBinary) {\n            query.b64 = 1;\n        }\n        const encodedQuery = parseqs.encode(query);\n        const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n        return (schema +\n            \"://\" +\n            (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n            port +\n            this.opts.path +\n            (encodedQuery.length ? \"?\" + encodedQuery : \"\"));\n    }\n    /**\n     * Feature detection for WebSocket.\n     *\n     * @return {Boolean} whether this transport is available.\n     * @api public\n     */\n    check() {\n        return (!!WebSocket &&\n            !(\"__initialize\" in WebSocket && this.name === WS.prototype.name));\n    }\n}\n","import { XHR } from \"./polling-xhr.js\";\nimport { WS } from \"./websocket.js\";\nexport const transports = {\n    websocket: WS,\n    polling: XHR\n};\n","import { transports } from \"./transports/index.js\";\nimport { installTimerFunctions } from \"./util.js\";\nimport parseqs from \"parseqs\";\nimport parseuri from \"parseuri\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nexport class Socket extends Emitter {\n    /**\n     * Socket constructor.\n     *\n     * @param {String|Object} uri or options\n     * @param {Object} opts - options\n     * @api public\n     */\n    constructor(uri, opts = {}) {\n        super();\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = null;\n        }\n        if (uri) {\n            uri = parseuri(uri);\n            opts.hostname = uri.host;\n            opts.secure = uri.protocol === \"https\" || uri.protocol === \"wss\";\n            opts.port = uri.port;\n            if (uri.query)\n                opts.query = uri.query;\n        }\n        else if (opts.host) {\n            opts.hostname = parseuri(opts.host).host;\n        }\n        installTimerFunctions(this, opts);\n        this.secure =\n            null != opts.secure\n                ? opts.secure\n                : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n        if (opts.hostname && !opts.port) {\n            // if no port is specified manually, use the protocol default\n            opts.port = this.secure ? \"443\" : \"80\";\n        }\n        this.hostname =\n            opts.hostname ||\n                (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n        this.port =\n            opts.port ||\n                (typeof location !== \"undefined\" && location.port\n                    ? location.port\n                    : this.secure\n                        ? \"443\"\n                        : \"80\");\n        this.transports = opts.transports || [\"polling\", \"websocket\"];\n        this.readyState = \"\";\n        this.writeBuffer = [];\n        this.prevBufferLen = 0;\n        this.opts = Object.assign({\n            path: \"/engine.io\",\n            agent: false,\n            withCredentials: false,\n            upgrade: true,\n            timestampParam: \"t\",\n            rememberUpgrade: false,\n            rejectUnauthorized: true,\n            perMessageDeflate: {\n                threshold: 1024\n            },\n            transportOptions: {},\n            closeOnBeforeunload: true\n        }, opts);\n        this.opts.path = this.opts.path.replace(/\\/$/, \"\") + \"/\";\n        if (typeof this.opts.query === \"string\") {\n            this.opts.query = parseqs.decode(this.opts.query);\n        }\n        // set on handshake\n        this.id = null;\n        this.upgrades = null;\n        this.pingInterval = null;\n        this.pingTimeout = null;\n        // set on heartbeat\n        this.pingTimeoutTimer = null;\n        if (typeof addEventListener === \"function\") {\n            if (this.opts.closeOnBeforeunload) {\n                // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n                // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n                // closed/reloaded)\n                addEventListener(\"beforeunload\", () => {\n                    if (this.transport) {\n                        // silently close the transport\n                        this.transport.removeAllListeners();\n                        this.transport.close();\n                    }\n                }, false);\n            }\n            if (this.hostname !== \"localhost\") {\n                this.offlineEventListener = () => {\n                    this.onClose(\"transport close\");\n                };\n                addEventListener(\"offline\", this.offlineEventListener, false);\n            }\n        }\n        this.open();\n    }\n    /**\n     * Creates transport of the given type.\n     *\n     * @param {String} transport name\n     * @return {Transport}\n     * @api private\n     */\n    createTransport(name) {\n        const query = clone(this.opts.query);\n        // append engine.io protocol identifier\n        query.EIO = protocol;\n        // transport name\n        query.transport = name;\n        // session id if we already have one\n        if (this.id)\n            query.sid = this.id;\n        const opts = Object.assign({}, this.opts.transportOptions[name], this.opts, {\n            query,\n            socket: this,\n            hostname: this.hostname,\n            secure: this.secure,\n            port: this.port\n        });\n        return new transports[name](opts);\n    }\n    /**\n     * Initializes transport to use and starts probe.\n     *\n     * @api private\n     */\n    open() {\n        let transport;\n        if (this.opts.rememberUpgrade &&\n            Socket.priorWebsocketSuccess &&\n            this.transports.indexOf(\"websocket\") !== -1) {\n            transport = \"websocket\";\n        }\n        else if (0 === this.transports.length) {\n            // Emit error on next tick so it can be listened to\n            this.setTimeoutFn(() => {\n                this.emitReserved(\"error\", \"No transports available\");\n            }, 0);\n            return;\n        }\n        else {\n            transport = this.transports[0];\n        }\n        this.readyState = \"opening\";\n        // Retry with the next transport if the transport is disabled (jsonp: false)\n        try {\n            transport = this.createTransport(transport);\n        }\n        catch (e) {\n            this.transports.shift();\n            this.open();\n            return;\n        }\n        transport.open();\n        this.setTransport(transport);\n    }\n    /**\n     * Sets the current transport. Disables the existing one (if any).\n     *\n     * @api private\n     */\n    setTransport(transport) {\n        if (this.transport) {\n            this.transport.removeAllListeners();\n        }\n        // set up transport\n        this.transport = transport;\n        // set up transport listeners\n        transport\n            .on(\"drain\", this.onDrain.bind(this))\n            .on(\"packet\", this.onPacket.bind(this))\n            .on(\"error\", this.onError.bind(this))\n            .on(\"close\", () => {\n            this.onClose(\"transport close\");\n        });\n    }\n    /**\n     * Probes a transport.\n     *\n     * @param {String} transport name\n     * @api private\n     */\n    probe(name) {\n        let transport = this.createTransport(name);\n        let failed = false;\n        Socket.priorWebsocketSuccess = false;\n        const onTransportOpen = () => {\n            if (failed)\n                return;\n            transport.send([{ type: \"ping\", data: \"probe\" }]);\n            transport.once(\"packet\", msg => {\n                if (failed)\n                    return;\n                if (\"pong\" === msg.type && \"probe\" === msg.data) {\n                    this.upgrading = true;\n                    this.emitReserved(\"upgrading\", transport);\n                    if (!transport)\n                        return;\n                    Socket.priorWebsocketSuccess = \"websocket\" === transport.name;\n                    this.transport.pause(() => {\n                        if (failed)\n                            return;\n                        if (\"closed\" === this.readyState)\n                            return;\n                        cleanup();\n                        this.setTransport(transport);\n                        transport.send([{ type: \"upgrade\" }]);\n                        this.emitReserved(\"upgrade\", transport);\n                        transport = null;\n                        this.upgrading = false;\n                        this.flush();\n                    });\n                }\n                else {\n                    const err = new Error(\"probe error\");\n                    // @ts-ignore\n                    err.transport = transport.name;\n                    this.emitReserved(\"upgradeError\", err);\n                }\n            });\n        };\n        function freezeTransport() {\n            if (failed)\n                return;\n            // Any callback called by transport should be ignored since now\n            failed = true;\n            cleanup();\n            transport.close();\n            transport = null;\n        }\n        // Handle any error that happens while probing\n        const onerror = err => {\n            const error = new Error(\"probe error: \" + err);\n            // @ts-ignore\n            error.transport = transport.name;\n            freezeTransport();\n            this.emitReserved(\"upgradeError\", error);\n        };\n        function onTransportClose() {\n            onerror(\"transport closed\");\n        }\n        // When the socket is closed while we're probing\n        function onclose() {\n            onerror(\"socket closed\");\n        }\n        // When the socket is upgraded while we're probing\n        function onupgrade(to) {\n            if (transport && to.name !== transport.name) {\n                freezeTransport();\n            }\n        }\n        // Remove all listeners on the transport and on self\n        const cleanup = () => {\n            transport.removeListener(\"open\", onTransportOpen);\n            transport.removeListener(\"error\", onerror);\n            transport.removeListener(\"close\", onTransportClose);\n            this.off(\"close\", onclose);\n            this.off(\"upgrading\", onupgrade);\n        };\n        transport.once(\"open\", onTransportOpen);\n        transport.once(\"error\", onerror);\n        transport.once(\"close\", onTransportClose);\n        this.once(\"close\", onclose);\n        this.once(\"upgrading\", onupgrade);\n        transport.open();\n    }\n    /**\n     * Called when connection is deemed open.\n     *\n     * @api private\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        Socket.priorWebsocketSuccess = \"websocket\" === this.transport.name;\n        this.emitReserved(\"open\");\n        this.flush();\n        // we check for `readyState` in case an `open`\n        // listener already closed the socket\n        if (\"open\" === this.readyState &&\n            this.opts.upgrade &&\n            this.transport.pause) {\n            let i = 0;\n            const l = this.upgrades.length;\n            for (; i < l; i++) {\n                this.probe(this.upgrades[i]);\n            }\n        }\n    }\n    /**\n     * Handles a packet.\n     *\n     * @api private\n     */\n    onPacket(packet) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            this.emitReserved(\"packet\", packet);\n            // Socket is live - any packet counts\n            this.emitReserved(\"heartbeat\");\n            switch (packet.type) {\n                case \"open\":\n                    this.onHandshake(JSON.parse(packet.data));\n                    break;\n                case \"ping\":\n                    this.resetPingTimeout();\n                    this.sendPacket(\"pong\");\n                    this.emitReserved(\"ping\");\n                    this.emitReserved(\"pong\");\n                    break;\n                case \"error\":\n                    const err = new Error(\"server error\");\n                    // @ts-ignore\n                    err.code = packet.data;\n                    this.onError(err);\n                    break;\n                case \"message\":\n                    this.emitReserved(\"data\", packet.data);\n                    this.emitReserved(\"message\", packet.data);\n                    break;\n            }\n        }\n        else {\n        }\n    }\n    /**\n     * Called upon handshake completion.\n     *\n     * @param {Object} data - handshake obj\n     * @api private\n     */\n    onHandshake(data) {\n        this.emitReserved(\"handshake\", data);\n        this.id = data.sid;\n        this.transport.query.sid = data.sid;\n        this.upgrades = this.filterUpgrades(data.upgrades);\n        this.pingInterval = data.pingInterval;\n        this.pingTimeout = data.pingTimeout;\n        this.onOpen();\n        // In case open handler closes socket\n        if (\"closed\" === this.readyState)\n            return;\n        this.resetPingTimeout();\n    }\n    /**\n     * Sets and resets ping timeout timer based on server pings.\n     *\n     * @api private\n     */\n    resetPingTimeout() {\n        this.clearTimeoutFn(this.pingTimeoutTimer);\n        this.pingTimeoutTimer = this.setTimeoutFn(() => {\n            this.onClose(\"ping timeout\");\n        }, this.pingInterval + this.pingTimeout);\n        if (this.opts.autoUnref) {\n            this.pingTimeoutTimer.unref();\n        }\n    }\n    /**\n     * Called on `drain` event\n     *\n     * @api private\n     */\n    onDrain() {\n        this.writeBuffer.splice(0, this.prevBufferLen);\n        // setting prevBufferLen = 0 is very important\n        // for example, when upgrading, upgrade packet is sent over,\n        // and a nonzero prevBufferLen could cause problems on `drain`\n        this.prevBufferLen = 0;\n        if (0 === this.writeBuffer.length) {\n            this.emitReserved(\"drain\");\n        }\n        else {\n            this.flush();\n        }\n    }\n    /**\n     * Flush write buffers.\n     *\n     * @api private\n     */\n    flush() {\n        if (\"closed\" !== this.readyState &&\n            this.transport.writable &&\n            !this.upgrading &&\n            this.writeBuffer.length) {\n            this.transport.send(this.writeBuffer);\n            // keep track of current length of writeBuffer\n            // splice writeBuffer and callbackBuffer on `drain`\n            this.prevBufferLen = this.writeBuffer.length;\n            this.emitReserved(\"flush\");\n        }\n    }\n    /**\n     * Sends a message.\n     *\n     * @param {String} message.\n     * @param {Function} callback function.\n     * @param {Object} options.\n     * @return {Socket} for chaining.\n     * @api public\n     */\n    write(msg, options, fn) {\n        this.sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    send(msg, options, fn) {\n        this.sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param {String} packet type.\n     * @param {String} data.\n     * @param {Object} options.\n     * @param {Function} callback function.\n     * @api private\n     */\n    sendPacket(type, data, options, fn) {\n        if (\"function\" === typeof data) {\n            fn = data;\n            data = undefined;\n        }\n        if (\"function\" === typeof options) {\n            fn = options;\n            options = null;\n        }\n        if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n            return;\n        }\n        options = options || {};\n        options.compress = false !== options.compress;\n        const packet = {\n            type: type,\n            data: data,\n            options: options\n        };\n        this.emitReserved(\"packetCreate\", packet);\n        this.writeBuffer.push(packet);\n        if (fn)\n            this.once(\"flush\", fn);\n        this.flush();\n    }\n    /**\n     * Closes the connection.\n     *\n     * @api public\n     */\n    close() {\n        const close = () => {\n            this.onClose(\"forced close\");\n            this.transport.close();\n        };\n        const cleanupAndClose = () => {\n            this.off(\"upgrade\", cleanupAndClose);\n            this.off(\"upgradeError\", cleanupAndClose);\n            close();\n        };\n        const waitForUpgrade = () => {\n            // wait for upgrade to finish since we can't send packets while pausing a transport\n            this.once(\"upgrade\", cleanupAndClose);\n            this.once(\"upgradeError\", cleanupAndClose);\n        };\n        if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n            this.readyState = \"closing\";\n            if (this.writeBuffer.length) {\n                this.once(\"drain\", () => {\n                    if (this.upgrading) {\n                        waitForUpgrade();\n                    }\n                    else {\n                        close();\n                    }\n                });\n            }\n            else if (this.upgrading) {\n                waitForUpgrade();\n            }\n            else {\n                close();\n            }\n        }\n        return this;\n    }\n    /**\n     * Called upon transport error\n     *\n     * @api private\n     */\n    onError(err) {\n        Socket.priorWebsocketSuccess = false;\n        this.emitReserved(\"error\", err);\n        this.onClose(\"transport error\", err);\n    }\n    /**\n     * Called upon transport close.\n     *\n     * @api private\n     */\n    onClose(reason, desc) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            // clear timers\n            this.clearTimeoutFn(this.pingTimeoutTimer);\n            // stop event from firing again for transport\n            this.transport.removeAllListeners(\"close\");\n            // ensure transport won't stay open\n            this.transport.close();\n            // ignore further transport communication\n            this.transport.removeAllListeners();\n            if (typeof removeEventListener === \"function\") {\n                removeEventListener(\"offline\", this.offlineEventListener, false);\n            }\n            // set ready state\n            this.readyState = \"closed\";\n            // clear session id\n            this.id = null;\n            // emit close event\n            this.emitReserved(\"close\", reason, desc);\n            // clean buffers after, so users can still\n            // grab the buffers on `close` event\n            this.writeBuffer = [];\n            this.prevBufferLen = 0;\n        }\n    }\n    /**\n     * Filters upgrades, returning only those matching client transports.\n     *\n     * @param {Array} server upgrades\n     * @api private\n     *\n     */\n    filterUpgrades(upgrades) {\n        const filteredUpgrades = [];\n        let i = 0;\n        const j = upgrades.length;\n        for (; i < j; i++) {\n            if (~this.transports.indexOf(upgrades[i]))\n                filteredUpgrades.push(upgrades[i]);\n        }\n        return filteredUpgrades;\n    }\n}\nSocket.protocol = protocol;\nfunction clone(obj) {\n    const o = {};\n    for (let i in obj) {\n        if (obj.hasOwnProperty(i)) {\n            o[i] = obj[i];\n        }\n    }\n    return o;\n}\n","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n    (typeof File !== \"undefined\" &&\n        toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n    return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n        (withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n    if (!obj || typeof obj !== \"object\") {\n        return false;\n    }\n    if (Array.isArray(obj)) {\n        for (let i = 0, l = obj.length; i < l; i++) {\n            if (hasBinary(obj[i])) {\n                return true;\n            }\n        }\n        return false;\n    }\n    if (isBinary(obj)) {\n        return true;\n    }\n    if (obj.toJSON &&\n        typeof obj.toJSON === \"function\" &&\n        arguments.length === 1) {\n        return hasBinary(obj.toJSON(), true);\n    }\n    for (const key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n            return true;\n        }\n    }\n    return false;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n    const buffers = [];\n    const packetData = packet.data;\n    const pack = packet;\n    pack.data = _deconstructPacket(packetData, buffers);\n    pack.attachments = buffers.length; // number of binary 'attachments'\n    return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (isBinary(data)) {\n        const placeholder = { _placeholder: true, num: buffers.length };\n        buffers.push(data);\n        return placeholder;\n    }\n    else if (Array.isArray(data)) {\n        const newData = new Array(data.length);\n        for (let i = 0; i < data.length; i++) {\n            newData[i] = _deconstructPacket(data[i], buffers);\n        }\n        return newData;\n    }\n    else if (typeof data === \"object\" && !(data instanceof Date)) {\n        const newData = {};\n        for (const key in data) {\n            if (data.hasOwnProperty(key)) {\n                newData[key] = _deconstructPacket(data[key], buffers);\n            }\n        }\n        return newData;\n    }\n    return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n    packet.data = _reconstructPacket(packet.data, buffers);\n    packet.attachments = undefined; // no longer useful\n    return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (data && data._placeholder) {\n        return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n    }\n    else if (Array.isArray(data)) {\n        for (let i = 0; i < data.length; i++) {\n            data[i] = _reconstructPacket(data[i], buffers);\n        }\n    }\n    else if (typeof data === \"object\") {\n        for (const key in data) {\n            if (data.hasOwnProperty(key)) {\n                data[key] = _reconstructPacket(data[key], buffers);\n            }\n        }\n    }\n    return data;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n    PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n    PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n    PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n    PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n    PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n    PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n    PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n    /**\n     * Encode a packet as a single string if non-binary, or as a\n     * buffer sequence, depending on packet type.\n     *\n     * @param {Object} obj - packet object\n     */\n    encode(obj) {\n        if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n            if (hasBinary(obj)) {\n                obj.type =\n                    obj.type === PacketType.EVENT\n                        ? PacketType.BINARY_EVENT\n                        : PacketType.BINARY_ACK;\n                return this.encodeAsBinary(obj);\n            }\n        }\n        return [this.encodeAsString(obj)];\n    }\n    /**\n     * Encode packet as string.\n     */\n    encodeAsString(obj) {\n        // first is type\n        let str = \"\" + obj.type;\n        // attachments if we have them\n        if (obj.type === PacketType.BINARY_EVENT ||\n            obj.type === PacketType.BINARY_ACK) {\n            str += obj.attachments + \"-\";\n        }\n        // if we have a namespace other than `/`\n        // we append it followed by a comma `,`\n        if (obj.nsp && \"/\" !== obj.nsp) {\n            str += obj.nsp + \",\";\n        }\n        // immediately followed by the id\n        if (null != obj.id) {\n            str += obj.id;\n        }\n        // json data\n        if (null != obj.data) {\n            str += JSON.stringify(obj.data);\n        }\n        return str;\n    }\n    /**\n     * Encode packet as 'buffer sequence' by removing blobs, and\n     * deconstructing packet into object with placeholders and\n     * a list of buffers.\n     */\n    encodeAsBinary(obj) {\n        const deconstruction = deconstructPacket(obj);\n        const pack = this.encodeAsString(deconstruction.packet);\n        const buffers = deconstruction.buffers;\n        buffers.unshift(pack); // add packet info to beginning of data list\n        return buffers; // write all the buffers\n    }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n    constructor() {\n        super();\n    }\n    /**\n     * Decodes an encoded packet string into packet JSON.\n     *\n     * @param {String} obj - encoded packet\n     */\n    add(obj) {\n        let packet;\n        if (typeof obj === \"string\") {\n            packet = this.decodeString(obj);\n            if (packet.type === PacketType.BINARY_EVENT ||\n                packet.type === PacketType.BINARY_ACK) {\n                // binary packet's json\n                this.reconstructor = new BinaryReconstructor(packet);\n                // no attachments, labeled binary but no binary data to follow\n                if (packet.attachments === 0) {\n                    super.emitReserved(\"decoded\", packet);\n                }\n            }\n            else {\n                // non-binary full packet\n                super.emitReserved(\"decoded\", packet);\n            }\n        }\n        else if (isBinary(obj) || obj.base64) {\n            // raw binary data\n            if (!this.reconstructor) {\n                throw new Error(\"got binary data when not reconstructing a packet\");\n            }\n            else {\n                packet = this.reconstructor.takeBinaryData(obj);\n                if (packet) {\n                    // received final buffer\n                    this.reconstructor = null;\n                    super.emitReserved(\"decoded\", packet);\n                }\n            }\n        }\n        else {\n            throw new Error(\"Unknown type: \" + obj);\n        }\n    }\n    /**\n     * Decode a packet String (JSON data)\n     *\n     * @param {String} str\n     * @return {Object} packet\n     */\n    decodeString(str) {\n        let i = 0;\n        // look up type\n        const p = {\n            type: Number(str.charAt(0)),\n        };\n        if (PacketType[p.type] === undefined) {\n            throw new Error(\"unknown packet type \" + p.type);\n        }\n        // look up attachments if type binary\n        if (p.type === PacketType.BINARY_EVENT ||\n            p.type === PacketType.BINARY_ACK) {\n            const start = i + 1;\n            while (str.charAt(++i) !== \"-\" && i != str.length) { }\n            const buf = str.substring(start, i);\n            if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n                throw new Error(\"Illegal attachments\");\n            }\n            p.attachments = Number(buf);\n        }\n        // look up namespace (if any)\n        if (\"/\" === str.charAt(i + 1)) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (\",\" === c)\n                    break;\n                if (i === str.length)\n                    break;\n            }\n            p.nsp = str.substring(start, i);\n        }\n        else {\n            p.nsp = \"/\";\n        }\n        // look up id\n        const next = str.charAt(i + 1);\n        if (\"\" !== next && Number(next) == next) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (null == c || Number(c) != c) {\n                    --i;\n                    break;\n                }\n                if (i === str.length)\n                    break;\n            }\n            p.id = Number(str.substring(start, i + 1));\n        }\n        // look up json data\n        if (str.charAt(++i)) {\n            const payload = tryParse(str.substr(i));\n            if (Decoder.isPayloadValid(p.type, payload)) {\n                p.data = payload;\n            }\n            else {\n                throw new Error(\"invalid payload\");\n            }\n        }\n        return p;\n    }\n    static isPayloadValid(type, payload) {\n        switch (type) {\n            case PacketType.CONNECT:\n                return typeof payload === \"object\";\n            case PacketType.DISCONNECT:\n                return payload === undefined;\n            case PacketType.CONNECT_ERROR:\n                return typeof payload === \"string\" || typeof payload === \"object\";\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                return Array.isArray(payload) && payload.length > 0;\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                return Array.isArray(payload);\n        }\n    }\n    /**\n     * Deallocates a parser's resources\n     */\n    destroy() {\n        if (this.reconstructor) {\n            this.reconstructor.finishedReconstruction();\n        }\n    }\n}\nfunction tryParse(str) {\n    try {\n        return JSON.parse(str);\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n    constructor(packet) {\n        this.packet = packet;\n        this.buffers = [];\n        this.reconPack = packet;\n    }\n    /**\n     * Method to be called when binary data received from connection\n     * after a BINARY_EVENT packet.\n     *\n     * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n     * @return {null | Object} returns null if more binary data is expected or\n     *   a reconstructed packet object if all buffers have been received.\n     */\n    takeBinaryData(binData) {\n        this.buffers.push(binData);\n        if (this.buffers.length === this.reconPack.attachments) {\n            // done with buffer list\n            const packet = reconstructPacket(this.reconPack, this.buffers);\n            this.finishedReconstruction();\n            return packet;\n        }\n        return null;\n    }\n    /**\n     * Cleans up binary packet reconstruction variables.\n     */\n    finishedReconstruction() {\n        this.reconPack = null;\n        this.buffers = [];\n    }\n}\n","export function on(obj, ev, fn) {\n    obj.on(ev, fn);\n    return function subDestroy() {\n        obj.off(ev, fn);\n    };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n    connect: 1,\n    connect_error: 1,\n    disconnect: 1,\n    disconnecting: 1,\n    // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n    newListener: 1,\n    removeListener: 1,\n});\nexport class Socket extends Emitter {\n    /**\n     * `Socket` constructor.\n     *\n     * @public\n     */\n    constructor(io, nsp, opts) {\n        super();\n        this.connected = false;\n        this.disconnected = true;\n        this.receiveBuffer = [];\n        this.sendBuffer = [];\n        this.ids = 0;\n        this.acks = {};\n        this.flags = {};\n        this.io = io;\n        this.nsp = nsp;\n        if (opts && opts.auth) {\n            this.auth = opts.auth;\n        }\n        if (this.io._autoConnect)\n            this.open();\n    }\n    /**\n     * Subscribe to open, close and packet events\n     *\n     * @private\n     */\n    subEvents() {\n        if (this.subs)\n            return;\n        const io = this.io;\n        this.subs = [\n            on(io, \"open\", this.onopen.bind(this)),\n            on(io, \"packet\", this.onpacket.bind(this)),\n            on(io, \"error\", this.onerror.bind(this)),\n            on(io, \"close\", this.onclose.bind(this)),\n        ];\n    }\n    /**\n     * Whether the Socket will try to reconnect when its Manager connects or reconnects\n     */\n    get active() {\n        return !!this.subs;\n    }\n    /**\n     * \"Opens\" the socket.\n     *\n     * @public\n     */\n    connect() {\n        if (this.connected)\n            return this;\n        this.subEvents();\n        if (!this.io[\"_reconnecting\"])\n            this.io.open(); // ensure open\n        if (\"open\" === this.io._readyState)\n            this.onopen();\n        return this;\n    }\n    /**\n     * Alias for connect()\n     */\n    open() {\n        return this.connect();\n    }\n    /**\n     * Sends a `message` event.\n     *\n     * @return self\n     * @public\n     */\n    send(...args) {\n        args.unshift(\"message\");\n        this.emit.apply(this, args);\n        return this;\n    }\n    /**\n     * Override `emit`.\n     * If the event is in `events`, it's emitted normally.\n     *\n     * @return self\n     * @public\n     */\n    emit(ev, ...args) {\n        if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n            throw new Error('\"' + ev + '\" is a reserved event name');\n        }\n        args.unshift(ev);\n        const packet = {\n            type: PacketType.EVENT,\n            data: args,\n        };\n        packet.options = {};\n        packet.options.compress = this.flags.compress !== false;\n        // event ack callback\n        if (\"function\" === typeof args[args.length - 1]) {\n            const id = this.ids++;\n            const ack = args.pop();\n            this._registerAckCallback(id, ack);\n            packet.id = id;\n        }\n        const isTransportWritable = this.io.engine &&\n            this.io.engine.transport &&\n            this.io.engine.transport.writable;\n        const discardPacket = this.flags.volatile && (!isTransportWritable || !this.connected);\n        if (discardPacket) {\n        }\n        else if (this.connected) {\n            this.packet(packet);\n        }\n        else {\n            this.sendBuffer.push(packet);\n        }\n        this.flags = {};\n        return this;\n    }\n    /**\n     * @private\n     */\n    _registerAckCallback(id, ack) {\n        const timeout = this.flags.timeout;\n        if (timeout === undefined) {\n            this.acks[id] = ack;\n            return;\n        }\n        // @ts-ignore\n        const timer = this.io.setTimeoutFn(() => {\n            delete this.acks[id];\n            for (let i = 0; i < this.sendBuffer.length; i++) {\n                if (this.sendBuffer[i].id === id) {\n                    this.sendBuffer.splice(i, 1);\n                }\n            }\n            ack.call(this, new Error(\"operation has timed out\"));\n        }, timeout);\n        this.acks[id] = (...args) => {\n            // @ts-ignore\n            this.io.clearTimeoutFn(timer);\n            ack.apply(this, [null, ...args]);\n        };\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param packet\n     * @private\n     */\n    packet(packet) {\n        packet.nsp = this.nsp;\n        this.io._packet(packet);\n    }\n    /**\n     * Called upon engine `open`.\n     *\n     * @private\n     */\n    onopen() {\n        if (typeof this.auth == \"function\") {\n            this.auth((data) => {\n                this.packet({ type: PacketType.CONNECT, data });\n            });\n        }\n        else {\n            this.packet({ type: PacketType.CONNECT, data: this.auth });\n        }\n    }\n    /**\n     * Called upon engine or manager `error`.\n     *\n     * @param err\n     * @private\n     */\n    onerror(err) {\n        if (!this.connected) {\n            this.emitReserved(\"connect_error\", err);\n        }\n    }\n    /**\n     * Called upon engine `close`.\n     *\n     * @param reason\n     * @private\n     */\n    onclose(reason) {\n        this.connected = false;\n        this.disconnected = true;\n        delete this.id;\n        this.emitReserved(\"disconnect\", reason);\n    }\n    /**\n     * Called with socket packet.\n     *\n     * @param packet\n     * @private\n     */\n    onpacket(packet) {\n        const sameNamespace = packet.nsp === this.nsp;\n        if (!sameNamespace)\n            return;\n        switch (packet.type) {\n            case PacketType.CONNECT:\n                if (packet.data && packet.data.sid) {\n                    const id = packet.data.sid;\n                    this.onconnect(id);\n                }\n                else {\n                    this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n                }\n                break;\n            case PacketType.EVENT:\n                this.onevent(packet);\n                break;\n            case PacketType.BINARY_EVENT:\n                this.onevent(packet);\n                break;\n            case PacketType.ACK:\n                this.onack(packet);\n                break;\n            case PacketType.BINARY_ACK:\n                this.onack(packet);\n                break;\n            case PacketType.DISCONNECT:\n                this.ondisconnect();\n                break;\n            case PacketType.CONNECT_ERROR:\n                this.destroy();\n                const err = new Error(packet.data.message);\n                // @ts-ignore\n                err.data = packet.data.data;\n                this.emitReserved(\"connect_error\", err);\n                break;\n        }\n    }\n    /**\n     * Called upon a server event.\n     *\n     * @param packet\n     * @private\n     */\n    onevent(packet) {\n        const args = packet.data || [];\n        if (null != packet.id) {\n            args.push(this.ack(packet.id));\n        }\n        if (this.connected) {\n            this.emitEvent(args);\n        }\n        else {\n            this.receiveBuffer.push(Object.freeze(args));\n        }\n    }\n    emitEvent(args) {\n        if (this._anyListeners && this._anyListeners.length) {\n            const listeners = this._anyListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, args);\n            }\n        }\n        super.emit.apply(this, args);\n    }\n    /**\n     * Produces an ack callback to emit with an event.\n     *\n     * @private\n     */\n    ack(id) {\n        const self = this;\n        let sent = false;\n        return function (...args) {\n            // prevent double callbacks\n            if (sent)\n                return;\n            sent = true;\n            self.packet({\n                type: PacketType.ACK,\n                id: id,\n                data: args,\n            });\n        };\n    }\n    /**\n     * Called upon a server acknowlegement.\n     *\n     * @param packet\n     * @private\n     */\n    onack(packet) {\n        const ack = this.acks[packet.id];\n        if (\"function\" === typeof ack) {\n            ack.apply(this, packet.data);\n            delete this.acks[packet.id];\n        }\n        else {\n        }\n    }\n    /**\n     * Called upon server connect.\n     *\n     * @private\n     */\n    onconnect(id) {\n        this.id = id;\n        this.connected = true;\n        this.disconnected = false;\n        this.emitBuffered();\n        this.emitReserved(\"connect\");\n    }\n    /**\n     * Emit buffered events (received and emitted).\n     *\n     * @private\n     */\n    emitBuffered() {\n        this.receiveBuffer.forEach((args) => this.emitEvent(args));\n        this.receiveBuffer = [];\n        this.sendBuffer.forEach((packet) => this.packet(packet));\n        this.sendBuffer = [];\n    }\n    /**\n     * Called upon server disconnect.\n     *\n     * @private\n     */\n    ondisconnect() {\n        this.destroy();\n        this.onclose(\"io server disconnect\");\n    }\n    /**\n     * Called upon forced client/server side disconnections,\n     * this method ensures the manager stops tracking us and\n     * that reconnections don't get triggered for this.\n     *\n     * @private\n     */\n    destroy() {\n        if (this.subs) {\n            // clean subscriptions to avoid reconnections\n            this.subs.forEach((subDestroy) => subDestroy());\n            this.subs = undefined;\n        }\n        this.io[\"_destroy\"](this);\n    }\n    /**\n     * Disconnects the socket manually.\n     *\n     * @return self\n     * @public\n     */\n    disconnect() {\n        if (this.connected) {\n            this.packet({ type: PacketType.DISCONNECT });\n        }\n        // remove socket from pool\n        this.destroy();\n        if (this.connected) {\n            // fire events\n            this.onclose(\"io client disconnect\");\n        }\n        return this;\n    }\n    /**\n     * Alias for disconnect()\n     *\n     * @return self\n     * @public\n     */\n    close() {\n        return this.disconnect();\n    }\n    /**\n     * Sets the compress flag.\n     *\n     * @param compress - if `true`, compresses the sending data\n     * @return self\n     * @public\n     */\n    compress(compress) {\n        this.flags.compress = compress;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n     * ready to send messages.\n     *\n     * @returns self\n     * @public\n     */\n    get volatile() {\n        this.flags.volatile = true;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n     * given number of milliseconds have elapsed without an acknowledgement from the server:\n     *\n     * ```\n     * socket.timeout(5000).emit(\"my-event\", (err) => {\n     *   if (err) {\n     *     // the server did not acknowledge the event in the given delay\n     *   }\n     * });\n     * ```\n     *\n     * @returns self\n     * @public\n     */\n    timeout(timeout) {\n        this.flags.timeout = timeout;\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * @param listener\n     * @public\n     */\n    onAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * @param listener\n     * @public\n     */\n    prependAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @param listener\n     * @public\n     */\n    offAny(listener) {\n        if (!this._anyListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     *\n     * @public\n     */\n    listenersAny() {\n        return this._anyListeners || [];\n    }\n}\n","\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n","import { Socket as Engine, installTimerFunctions, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport Backoff from \"backo2\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n    constructor(uri, opts) {\n        var _a;\n        super();\n        this.nsps = {};\n        this.subs = [];\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = undefined;\n        }\n        opts = opts || {};\n        opts.path = opts.path || \"/socket.io\";\n        this.opts = opts;\n        installTimerFunctions(this, opts);\n        this.reconnection(opts.reconnection !== false);\n        this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n        this.reconnectionDelay(opts.reconnectionDelay || 1000);\n        this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n        this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n        this.backoff = new Backoff({\n            min: this.reconnectionDelay(),\n            max: this.reconnectionDelayMax(),\n            jitter: this.randomizationFactor(),\n        });\n        this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n        this._readyState = \"closed\";\n        this.uri = uri;\n        const _parser = opts.parser || parser;\n        this.encoder = new _parser.Encoder();\n        this.decoder = new _parser.Decoder();\n        this._autoConnect = opts.autoConnect !== false;\n        if (this._autoConnect)\n            this.open();\n    }\n    reconnection(v) {\n        if (!arguments.length)\n            return this._reconnection;\n        this._reconnection = !!v;\n        return this;\n    }\n    reconnectionAttempts(v) {\n        if (v === undefined)\n            return this._reconnectionAttempts;\n        this._reconnectionAttempts = v;\n        return this;\n    }\n    reconnectionDelay(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelay;\n        this._reconnectionDelay = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n        return this;\n    }\n    randomizationFactor(v) {\n        var _a;\n        if (v === undefined)\n            return this._randomizationFactor;\n        this._randomizationFactor = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n        return this;\n    }\n    reconnectionDelayMax(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelayMax;\n        this._reconnectionDelayMax = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n        return this;\n    }\n    timeout(v) {\n        if (!arguments.length)\n            return this._timeout;\n        this._timeout = v;\n        return this;\n    }\n    /**\n     * Starts trying to reconnect if reconnection is enabled and we have not\n     * started reconnecting yet\n     *\n     * @private\n     */\n    maybeReconnectOnOpen() {\n        // Only try to reconnect if it's the first time we're connecting\n        if (!this._reconnecting &&\n            this._reconnection &&\n            this.backoff.attempts === 0) {\n            // keeps reconnection from firing twice for the same reconnection loop\n            this.reconnect();\n        }\n    }\n    /**\n     * Sets the current transport `socket`.\n     *\n     * @param {Function} fn - optional, callback\n     * @return self\n     * @public\n     */\n    open(fn) {\n        if (~this._readyState.indexOf(\"open\"))\n            return this;\n        this.engine = new Engine(this.uri, this.opts);\n        const socket = this.engine;\n        const self = this;\n        this._readyState = \"opening\";\n        this.skipReconnect = false;\n        // emit `open`\n        const openSubDestroy = on(socket, \"open\", function () {\n            self.onopen();\n            fn && fn();\n        });\n        // emit `error`\n        const errorSub = on(socket, \"error\", (err) => {\n            self.cleanup();\n            self._readyState = \"closed\";\n            this.emitReserved(\"error\", err);\n            if (fn) {\n                fn(err);\n            }\n            else {\n                // Only do this if there is no fn to handle the error\n                self.maybeReconnectOnOpen();\n            }\n        });\n        if (false !== this._timeout) {\n            const timeout = this._timeout;\n            if (timeout === 0) {\n                openSubDestroy(); // prevents a race condition with the 'open' event\n            }\n            // set timer\n            const timer = this.setTimeoutFn(() => {\n                openSubDestroy();\n                socket.close();\n                // @ts-ignore\n                socket.emit(\"error\", new Error(\"timeout\"));\n            }, timeout);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(function subDestroy() {\n                clearTimeout(timer);\n            });\n        }\n        this.subs.push(openSubDestroy);\n        this.subs.push(errorSub);\n        return this;\n    }\n    /**\n     * Alias for open()\n     *\n     * @return self\n     * @public\n     */\n    connect(fn) {\n        return this.open(fn);\n    }\n    /**\n     * Called upon transport open.\n     *\n     * @private\n     */\n    onopen() {\n        // clear old subs\n        this.cleanup();\n        // mark as open\n        this._readyState = \"open\";\n        this.emitReserved(\"open\");\n        // add new subs\n        const socket = this.engine;\n        this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n    }\n    /**\n     * Called upon a ping.\n     *\n     * @private\n     */\n    onping() {\n        this.emitReserved(\"ping\");\n    }\n    /**\n     * Called with data.\n     *\n     * @private\n     */\n    ondata(data) {\n        this.decoder.add(data);\n    }\n    /**\n     * Called when parser fully decodes a packet.\n     *\n     * @private\n     */\n    ondecoded(packet) {\n        this.emitReserved(\"packet\", packet);\n    }\n    /**\n     * Called upon socket error.\n     *\n     * @private\n     */\n    onerror(err) {\n        this.emitReserved(\"error\", err);\n    }\n    /**\n     * Creates a new socket for the given `nsp`.\n     *\n     * @return {Socket}\n     * @public\n     */\n    socket(nsp, opts) {\n        let socket = this.nsps[nsp];\n        if (!socket) {\n            socket = new Socket(this, nsp, opts);\n            this.nsps[nsp] = socket;\n        }\n        return socket;\n    }\n    /**\n     * Called upon a socket close.\n     *\n     * @param socket\n     * @private\n     */\n    _destroy(socket) {\n        const nsps = Object.keys(this.nsps);\n        for (const nsp of nsps) {\n            const socket = this.nsps[nsp];\n            if (socket.active) {\n                return;\n            }\n        }\n        this._close();\n    }\n    /**\n     * Writes a packet.\n     *\n     * @param packet\n     * @private\n     */\n    _packet(packet) {\n        const encodedPackets = this.encoder.encode(packet);\n        for (let i = 0; i < encodedPackets.length; i++) {\n            this.engine.write(encodedPackets[i], packet.options);\n        }\n    }\n    /**\n     * Clean up transport subscriptions and packet buffer.\n     *\n     * @private\n     */\n    cleanup() {\n        this.subs.forEach((subDestroy) => subDestroy());\n        this.subs.length = 0;\n        this.decoder.destroy();\n    }\n    /**\n     * Close the current socket.\n     *\n     * @private\n     */\n    _close() {\n        this.skipReconnect = true;\n        this._reconnecting = false;\n        this.onclose(\"forced close\");\n        if (this.engine)\n            this.engine.close();\n    }\n    /**\n     * Alias for close()\n     *\n     * @private\n     */\n    disconnect() {\n        return this._close();\n    }\n    /**\n     * Called upon engine close.\n     *\n     * @private\n     */\n    onclose(reason) {\n        this.cleanup();\n        this.backoff.reset();\n        this._readyState = \"closed\";\n        this.emitReserved(\"close\", reason);\n        if (this._reconnection && !this.skipReconnect) {\n            this.reconnect();\n        }\n    }\n    /**\n     * Attempt a reconnection.\n     *\n     * @private\n     */\n    reconnect() {\n        if (this._reconnecting || this.skipReconnect)\n            return this;\n        const self = this;\n        if (this.backoff.attempts >= this._reconnectionAttempts) {\n            this.backoff.reset();\n            this.emitReserved(\"reconnect_failed\");\n            this._reconnecting = false;\n        }\n        else {\n            const delay = this.backoff.duration();\n            this._reconnecting = true;\n            const timer = this.setTimeoutFn(() => {\n                if (self.skipReconnect)\n                    return;\n                this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n                // check again for the case socket closed in above events\n                if (self.skipReconnect)\n                    return;\n                self.open((err) => {\n                    if (err) {\n                        self._reconnecting = false;\n                        self.reconnect();\n                        this.emitReserved(\"reconnect_error\", err);\n                    }\n                    else {\n                        self.onreconnect();\n                    }\n                });\n            }, delay);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(function subDestroy() {\n                clearTimeout(timer);\n            });\n        }\n    }\n    /**\n     * Called upon successful reconnect.\n     *\n     * @private\n     */\n    onreconnect() {\n        const attempt = this.backoff.attempts;\n        this._reconnecting = false;\n        this.backoff.reset();\n        this.emitReserved(\"reconnect\", attempt);\n    }\n}\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n    if (typeof uri === \"object\") {\n        opts = uri;\n        uri = undefined;\n    }\n    opts = opts || {};\n    const parsed = url(uri, opts.path || \"/socket.io\");\n    const source = parsed.source;\n    const id = parsed.id;\n    const path = parsed.path;\n    const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n    const newConnection = opts.forceNew ||\n        opts[\"force new connection\"] ||\n        false === opts.multiplex ||\n        sameNamespace;\n    let io;\n    if (newConnection) {\n        io = new Manager(source, opts);\n    }\n    else {\n        if (!cache[id]) {\n            cache[id] = new Manager(source, opts);\n        }\n        io = cache[id];\n    }\n    if (parsed.query && !opts.query) {\n        opts.query = parsed.queryKey;\n    }\n    return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n    Manager,\n    Socket,\n    io: lookup,\n    connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\n","import parseuri from \"parseuri\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n *        Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n    let obj = uri;\n    // default to window.location\n    loc = loc || (typeof location !== \"undefined\" && location);\n    if (null == uri)\n        uri = loc.protocol + \"//\" + loc.host;\n    // relative path support\n    if (typeof uri === \"string\") {\n        if (\"/\" === uri.charAt(0)) {\n            if (\"/\" === uri.charAt(1)) {\n                uri = loc.protocol + uri;\n            }\n            else {\n                uri = loc.host + uri;\n            }\n        }\n        if (!/^(https?|wss?):\\/\\//.test(uri)) {\n            if (\"undefined\" !== typeof loc) {\n                uri = loc.protocol + \"//\" + uri;\n            }\n            else {\n                uri = \"https://\" + uri;\n            }\n        }\n        // parse\n        obj = parseuri(uri);\n    }\n    // make sure we treat `localhost:80` and `localhost` equally\n    if (!obj.port) {\n        if (/^(http|ws)$/.test(obj.protocol)) {\n            obj.port = \"80\";\n        }\n        else if (/^(http|ws)s$/.test(obj.protocol)) {\n            obj.port = \"443\";\n        }\n    }\n    obj.path = obj.path || \"/\";\n    const ipv6 = obj.host.indexOf(\":\") !== -1;\n    const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n    // define unique id\n    obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n    // define href\n    obj.href =\n        obj.protocol +\n            \"://\" +\n            host +\n            (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n    return obj;\n}\n"],"names":["re","parts","parseuri","str","src","b","indexOf","e","substring","replace","length","query","data","m","exec","uri","i","source","host","authority","ipv6uri","pathNames","obj","path","regx","names","split","substr","splice","queryKey","$0","$1","$2","hasCorsModule","XMLHttpRequest","err","self","window","Function","opts","xdomain","hasCORS","globalThis","concat","join","pick","attr","reduce","acc","k","hasOwnProperty","NATIVE_SET_TIMEOUT","setTimeout","NATIVE_CLEAR_TIMEOUT","clearTimeout","installTimerFunctions","useNativeTimers","setTimeoutFn","bind","clearTimeoutFn","Emitter","key","prototype","mixin","on","addEventListener","event","fn","_callbacks","this","push","once","off","apply","arguments","removeListener","removeAllListeners","removeEventListener","cb","callbacks","emit","args","Array","len","slice","emitReserved","listeners","hasListeners","PACKET_TYPES","Object","create","PACKET_TYPES_REVERSE","keys","forEach","ERROR_PACKET","type","withNativeBlob","Blob","toString","call","withNativeArrayBuffer","ArrayBuffer","encodePacket","supportsBinary","callback","encodeBlobAsBase64","isView","buffer","fileReader","FileReader","onload","content","result","readAsDataURL","chars","lookup","Uint8Array","charCodeAt","prev","decodePacket","encodedPacket","binaryType","mapBinary","charAt","decodeBase64Packet","decoded","base64","encoded1","encoded2","encoded3","encoded4","bufferLength","p","arraybuffer","bytes","decode","SEPARATOR","String","fromCharCode","Transport","writable","readyState","socket","msg","desc","Error","description","doOpen","doClose","onClose","packets","write","packet","onPacket","alphabet","map","seed","encode","num","encoded","Math","floor","yeast","now","Date","yeast_1","encodeURIComponent","qs","qry","pairs","l","pair","decodeURIComponent","Polling","polling","poll","onPause","pause","_this2","total","doPoll","encodedPayload","encodedPackets","decodedPacket","decodePayload","_this3","onOpen","close","_this4","count","encodePayload","_this5","doWrite","schema","secure","port","timestampRequests","timestampParam","sid","b64","Number","encodedQuery","parseqs","hostname","empty","hasXHR2","responseType","XHR","location","isSSL","protocol","xd","xs","forceBase64","Request","req","request","method","onError","onData","pollXhr","async","undefined","xscheme","xhr","open","extraHeaders","setDisableHeaderCheck","setRequestHeader","withCredentials","requestTimeout","timeout","onreadystatechange","status","onLoad","send","document","index","requestsCount","requests","cleanup","onSuccess","fromError","abort","responseText","attachEvent","unloadHandler","nextTick","Promise","resolve","then","WebSocket","MozWebSocket","isReactNative","navigator","product","toLowerCase","WS","check","protocols","headers","ws","addEventListeners","onopen","autoUnref","_socket","unref","onclose","onmessage","ev","onerror","lastPacket","name","transports","websocket","Socket","_this","writeBuffer","prevBufferLen","_extends","agent","upgrade","rememberUpgrade","rejectUnauthorized","perMessageDeflate","threshold","transportOptions","closeOnBeforeunload","id","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","transport","offlineEventListener","o","clone","EIO","priorWebsocketSuccess","createTransport","shift","setTransport","onDrain","failed","onTransportOpen","upgrading","flush","freezeTransport","error","onTransportClose","onupgrade","to","probe","onHandshake","JSON","parse","resetPingTimeout","sendPacket","code","filterUpgrades","options","compress","_this6","cleanupAndClose","waitForUpgrade","reason","filteredUpgrades","j","withNativeFile","File","isBinary","hasBinary","toJSON","_typeof","isArray","deconstructPacket","buffers","packetData","pack","_deconstructPacket","attachments","placeholder","_placeholder","newData","reconstructPacket","_reconstructPacket","PacketType","Encoder","EVENT","ACK","encodeAsString","BINARY_EVENT","BINARY_ACK","encodeAsBinary","nsp","stringify","deconstruction","unshift","Decoder","decodeString","reconstructor","BinaryReconstructor","takeBinaryData","start","buf","next","c","payload","tryParse","isPayloadValid","finishedReconstruction","CONNECT","DISCONNECT","CONNECT_ERROR","reconPack","binData","RESERVED_EVENTS","freeze","connect","connect_error","disconnect","disconnecting","newListener","io","connected","disconnected","receiveBuffer","sendBuffer","ids","acks","flags","auth","_autoConnect","subs","onpacket","subEvents","_readyState","ack","pop","_registerAckCallback","isTransportWritable","engine","discardPacket","timer","_packet","onconnect","onevent","onack","ondisconnect","destroy","message","emitEvent","_anyListeners","sent","emitBuffered","subDestroy","listener","backo2","Backoff","ms","min","max","factor","jitter","attempts","duration","pow","rand","random","deviation","reset","setMin","setMax","setJitter","Manager","_a","nsps","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","decoder","autoConnect","v","_reconnection","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","_reconnecting","reconnect","Engine","skipReconnect","openSubDestroy","errorSub","maybeReconnectOnOpen","onping","ondata","ondecoded","add","active","_close","delay","onreconnect","attempt","cache","parsed","loc","test","href","url","sameNamespace","forceNew","multiplex"],"mappings":"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"}