{"ast":null,"code":"const transports = require(\"./transports/index\");\n\nconst Emitter = require(\"component-emitter\");\n\nconst debug = require(\"debug\")(\"engine.io-client:socket\");\n\nconst parser = require(\"engine.io-parser\");\n\nconst parseuri = require(\"parseuri\");\n\nconst parseqs = require(\"parseqs\");\n\nclass Socket extends Emitter {\n  /**\n   * Socket constructor.\n   *\n   * @param {String|Object} uri or options\n   * @param {Object} options\n   * @api public\n   */\n  constructor(uri, opts = {}) {\n    super();\n\n    if (uri && \"object\" === typeof uri) {\n      opts = uri;\n      uri = null;\n    }\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) opts.query = uri.query;\n    } else if (opts.host) {\n      opts.hostname = parseuri(opts.host).host;\n    }\n\n    this.secure = null != opts.secure ? opts.secure : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n\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\n    this.hostname = opts.hostname || (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n    this.port = opts.port || (typeof location !== \"undefined\" && location.port ? location.port : this.secure ? 443 : 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      jsonp: true,\n      timestampParam: \"t\",\n      rememberUpgrade: false,\n      rejectUnauthorized: true,\n      perMessageDeflate: {\n        threshold: 1024\n      },\n      transportOptions: {}\n    }, opts);\n    this.opts.path = this.opts.path.replace(/\\/$/, \"\") + \"/\";\n\n    if (typeof this.opts.query === \"string\") {\n      this.opts.query = parseqs.decode(this.opts.query);\n    } // set on handshake\n\n\n    this.id = null;\n    this.upgrades = null;\n    this.pingInterval = null;\n    this.pingTimeout = null; // set on heartbeat\n\n    this.pingTimeoutTimer = null;\n\n    if (typeof addEventListener === \"function\") {\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\n        addEventListener(\"offline\", this.offlineEventListener, false);\n      }\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\n\n  createTransport(name) {\n    debug('creating transport \"%s\"', name);\n    const query = clone(this.opts.query); // append engine.io protocol identifier\n\n    query.EIO = parser.protocol; // transport name\n\n    query.transport = name; // session id if we already have one\n\n    if (this.id) 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    debug(\"options: %j\", opts);\n    return new transports[name](opts);\n  }\n  /**\n   * Initializes transport to use and starts probe.\n   *\n   * @api private\n   */\n\n\n  open() {\n    let transport;\n\n    if (this.opts.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf(\"websocket\") !== -1) {\n      transport = \"websocket\";\n    } else if (0 === this.transports.length) {\n      // Emit error on next tick so it can be listened to\n      const self = this;\n      setTimeout(function () {\n        self.emit(\"error\", \"No transports available\");\n      }, 0);\n      return;\n    } else {\n      transport = this.transports[0];\n    }\n\n    this.readyState = \"opening\"; // Retry with the next transport if the transport is disabled (jsonp: false)\n\n    try {\n      transport = this.createTransport(transport);\n    } catch (e) {\n      debug(\"error while creating transport: %s\", e);\n      this.transports.shift();\n      this.open();\n      return;\n    }\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\n\n  setTransport(transport) {\n    debug(\"setting transport %s\", transport.name);\n    const self = this;\n\n    if (this.transport) {\n      debug(\"clearing existing transport %s\", this.transport.name);\n      this.transport.removeAllListeners();\n    } // set up transport\n\n\n    this.transport = transport; // set up transport listeners\n\n    transport.on(\"drain\", function () {\n      self.onDrain();\n    }).on(\"packet\", function (packet) {\n      self.onPacket(packet);\n    }).on(\"error\", function (e) {\n      self.onError(e);\n    }).on(\"close\", function () {\n      self.onClose(\"transport close\");\n    });\n  }\n  /**\n   * Probes a transport.\n   *\n   * @param {String} transport name\n   * @api private\n   */\n\n\n  probe(name) {\n    debug('probing transport \"%s\"', name);\n    let transport = this.createTransport(name, {\n      probe: 1\n    });\n    let failed = false;\n    const self = this;\n    Socket.priorWebsocketSuccess = false;\n\n    function onTransportOpen() {\n      if (self.onlyBinaryUpgrades) {\n        const upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n        failed = failed || upgradeLosesBinary;\n      }\n\n      if (failed) return;\n      debug('probe transport \"%s\" opened', name);\n      transport.send([{\n        type: \"ping\",\n        data: \"probe\"\n      }]);\n      transport.once(\"packet\", function (msg) {\n        if (failed) return;\n\n        if (\"pong\" === msg.type && \"probe\" === msg.data) {\n          debug('probe transport \"%s\" pong', name);\n          self.upgrading = true;\n          self.emit(\"upgrading\", transport);\n          if (!transport) return;\n          Socket.priorWebsocketSuccess = \"websocket\" === transport.name;\n          debug('pausing current transport \"%s\"', self.transport.name);\n          self.transport.pause(function () {\n            if (failed) return;\n            if (\"closed\" === self.readyState) return;\n            debug(\"changing transport and sending upgrade packet\");\n            cleanup();\n            self.setTransport(transport);\n            transport.send([{\n              type: \"upgrade\"\n            }]);\n            self.emit(\"upgrade\", transport);\n            transport = null;\n            self.upgrading = false;\n            self.flush();\n          });\n        } else {\n          debug('probe transport \"%s\" failed', name);\n          const err = new Error(\"probe error\");\n          err.transport = transport.name;\n          self.emit(\"upgradeError\", err);\n        }\n      });\n    }\n\n    function freezeTransport() {\n      if (failed) return; // Any callback called by transport should be ignored since now\n\n      failed = true;\n      cleanup();\n      transport.close();\n      transport = null;\n    } // Handle any error that happens while probing\n\n\n    function onerror(err) {\n      const error = new Error(\"probe error: \" + err);\n      error.transport = transport.name;\n      freezeTransport();\n      debug('probe transport \"%s\" failed because of error: %s', name, err);\n      self.emit(\"upgradeError\", error);\n    }\n\n    function onTransportClose() {\n      onerror(\"transport closed\");\n    } // When the socket is closed while we're probing\n\n\n    function onclose() {\n      onerror(\"socket closed\");\n    } // When the socket is upgraded while we're probing\n\n\n    function onupgrade(to) {\n      if (transport && to.name !== transport.name) {\n        debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n        freezeTransport();\n      }\n    } // Remove all listeners on the transport and on self\n\n\n    function cleanup() {\n      transport.removeListener(\"open\", onTransportOpen);\n      transport.removeListener(\"error\", onerror);\n      transport.removeListener(\"close\", onTransportClose);\n      self.removeListener(\"close\", onclose);\n      self.removeListener(\"upgrading\", onupgrade);\n    }\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 public\n   */\n\n\n  onOpen() {\n    debug(\"socket open\");\n    this.readyState = \"open\";\n    Socket.priorWebsocketSuccess = \"websocket\" === this.transport.name;\n    this.emit(\"open\");\n    this.flush(); // we check for `readyState` in case an `open`\n    // listener already closed the socket\n\n    if (\"open\" === this.readyState && this.opts.upgrade && this.transport.pause) {\n      debug(\"starting upgrade probes\");\n      let i = 0;\n      const l = this.upgrades.length;\n\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\n\n  onPacket(packet) {\n    if (\"opening\" === this.readyState || \"open\" === this.readyState || \"closing\" === this.readyState) {\n      debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n      this.emit(\"packet\", packet); // Socket is live - any packet counts\n\n      this.emit(\"heartbeat\");\n\n      switch (packet.type) {\n        case \"open\":\n          this.onHandshake(JSON.parse(packet.data));\n          break;\n\n        case \"ping\":\n          this.resetPingTimeout();\n          this.sendPacket(\"pong\");\n          this.emit(\"pong\");\n          break;\n\n        case \"error\":\n          const err = new Error(\"server error\");\n          err.code = packet.data;\n          this.onError(err);\n          break;\n\n        case \"message\":\n          this.emit(\"data\", packet.data);\n          this.emit(\"message\", packet.data);\n          break;\n      }\n    } else {\n      debug('packet received with socket readyState \"%s\"', this.readyState);\n    }\n  }\n  /**\n   * Called upon handshake completion.\n   *\n   * @param {Object} handshake obj\n   * @api private\n   */\n\n\n  onHandshake(data) {\n    this.emit(\"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(); // In case open handler closes socket\n\n    if (\"closed\" === this.readyState) return;\n    this.resetPingTimeout();\n  }\n  /**\n   * Sets and resets ping timeout timer based on server pings.\n   *\n   * @api private\n   */\n\n\n  resetPingTimeout() {\n    clearTimeout(this.pingTimeoutTimer);\n    this.pingTimeoutTimer = setTimeout(() => {\n      this.onClose(\"ping timeout\");\n    }, this.pingInterval + this.pingTimeout);\n\n    if (this.opts.autoUnref) {\n      this.pingTimeoutTimer.unref();\n    }\n  }\n  /**\n   * Called on `drain` event\n   *\n   * @api private\n   */\n\n\n  onDrain() {\n    this.writeBuffer.splice(0, this.prevBufferLen); // 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\n    this.prevBufferLen = 0;\n\n    if (0 === this.writeBuffer.length) {\n      this.emit(\"drain\");\n    } else {\n      this.flush();\n    }\n  }\n  /**\n   * Flush write buffers.\n   *\n   * @api private\n   */\n\n\n  flush() {\n    if (\"closed\" !== this.readyState && this.transport.writable && !this.upgrading && this.writeBuffer.length) {\n      debug(\"flushing %d packets in socket\", this.writeBuffer.length);\n      this.transport.send(this.writeBuffer); // keep track of current length of writeBuffer\n      // splice writeBuffer and callbackBuffer on `drain`\n\n      this.prevBufferLen = this.writeBuffer.length;\n      this.emit(\"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\n\n  write(msg, options, fn) {\n    this.sendPacket(\"message\", msg, options, fn);\n    return this;\n  }\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\n\n  sendPacket(type, data, options, fn) {\n    if (\"function\" === typeof data) {\n      fn = data;\n      data = undefined;\n    }\n\n    if (\"function\" === typeof options) {\n      fn = options;\n      options = null;\n    }\n\n    if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n      return;\n    }\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.emit(\"packetCreate\", packet);\n    this.writeBuffer.push(packet);\n    if (fn) this.once(\"flush\", fn);\n    this.flush();\n  }\n  /**\n   * Closes the connection.\n   *\n   * @api private\n   */\n\n\n  close() {\n    const self = this;\n\n    if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n      this.readyState = \"closing\";\n\n      if (this.writeBuffer.length) {\n        this.once(\"drain\", function () {\n          if (this.upgrading) {\n            waitForUpgrade();\n          } else {\n            close();\n          }\n        });\n      } else if (this.upgrading) {\n        waitForUpgrade();\n      } else {\n        close();\n      }\n    }\n\n    function close() {\n      self.onClose(\"forced close\");\n      debug(\"socket closing - telling transport to close\");\n      self.transport.close();\n    }\n\n    function cleanupAndClose() {\n      self.removeListener(\"upgrade\", cleanupAndClose);\n      self.removeListener(\"upgradeError\", cleanupAndClose);\n      close();\n    }\n\n    function waitForUpgrade() {\n      // wait for upgrade to finish since we can't send packets while pausing a transport\n      self.once(\"upgrade\", cleanupAndClose);\n      self.once(\"upgradeError\", cleanupAndClose);\n    }\n\n    return this;\n  }\n  /**\n   * Called upon transport error\n   *\n   * @api private\n   */\n\n\n  onError(err) {\n    debug(\"socket error %j\", err);\n    Socket.priorWebsocketSuccess = false;\n    this.emit(\"error\", err);\n    this.onClose(\"transport error\", err);\n  }\n  /**\n   * Called upon transport close.\n   *\n   * @api private\n   */\n\n\n  onClose(reason, desc) {\n    if (\"opening\" === this.readyState || \"open\" === this.readyState || \"closing\" === this.readyState) {\n      debug('socket close with reason: \"%s\"', reason);\n      const self = this; // clear timers\n\n      clearTimeout(this.pingIntervalTimer);\n      clearTimeout(this.pingTimeoutTimer); // stop event from firing again for transport\n\n      this.transport.removeAllListeners(\"close\"); // ensure transport won't stay open\n\n      this.transport.close(); // ignore further transport communication\n\n      this.transport.removeAllListeners();\n\n      if (typeof removeEventListener === \"function\") {\n        removeEventListener(\"offline\", this.offlineEventListener, false);\n      } // set ready state\n\n\n      this.readyState = \"closed\"; // clear session id\n\n      this.id = null; // emit close event\n\n      this.emit(\"close\", reason, desc); // clean buffers after, so users can still\n      // grab the buffers on `close` event\n\n      self.writeBuffer = [];\n      self.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\n\n  filterUpgrades(upgrades) {\n    const filteredUpgrades = [];\n    let i = 0;\n    const j = upgrades.length;\n\n    for (; i < j; i++) {\n      if (~this.transports.indexOf(upgrades[i])) filteredUpgrades.push(upgrades[i]);\n    }\n\n    return filteredUpgrades;\n  }\n\n}\n\nSocket.priorWebsocketSuccess = false;\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\nfunction clone(obj) {\n  const o = {};\n\n  for (let i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n\n  return o;\n}\n\nmodule.exports = Socket;","map":{"version":3,"sources":["C:/laragon/www/iot.mksolusi/DriverOPCDA/frontend/node_modules/engine.io-client/lib/socket.js"],"names":["transports","require","Emitter","debug","parser","parseuri","parseqs","Socket","constructor","uri","opts","hostname","host","secure","protocol","port","query","location","readyState","writeBuffer","prevBufferLen","Object","assign","path","agent","withCredentials","upgrade","jsonp","timestampParam","rememberUpgrade","rejectUnauthorized","perMessageDeflate","threshold","transportOptions","replace","decode","id","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","addEventListener","transport","removeAllListeners","close","offlineEventListener","onClose","open","createTransport","name","clone","EIO","sid","socket","priorWebsocketSuccess","indexOf","length","self","setTimeout","emit","e","shift","setTransport","on","onDrain","packet","onPacket","onError","probe","failed","onTransportOpen","onlyBinaryUpgrades","upgradeLosesBinary","supportsBinary","send","type","data","once","msg","upgrading","pause","cleanup","flush","err","Error","freezeTransport","onerror","error","onTransportClose","onclose","onupgrade","to","removeListener","onOpen","i","l","onHandshake","JSON","parse","resetPingTimeout","sendPacket","code","filterUpgrades","clearTimeout","autoUnref","unref","splice","writable","write","options","fn","undefined","compress","push","waitForUpgrade","cleanupAndClose","reason","desc","pingIntervalTimer","removeEventListener","filteredUpgrades","j","obj","o","hasOwnProperty","module","exports"],"mappings":"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","sourcesContent":["const transports = require(\"./transports/index\");\nconst Emitter = require(\"component-emitter\");\nconst debug = require(\"debug\")(\"engine.io-client:socket\");\nconst parser = require(\"engine.io-parser\");\nconst parseuri = require(\"parseuri\");\nconst parseqs = require(\"parseqs\");\n\nclass Socket extends Emitter {\n  /**\n   * Socket constructor.\n   *\n   * @param {String|Object} uri or options\n   * @param {Object} options\n   * @api public\n   */\n  constructor(uri, opts = {}) {\n    super();\n\n    if (uri && \"object\" === typeof uri) {\n      opts = uri;\n      uri = null;\n    }\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) opts.query = uri.query;\n    } else if (opts.host) {\n      opts.hostname = parseuri(opts.host).host;\n    }\n\n    this.secure =\n      null != opts.secure\n        ? opts.secure\n        : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n\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\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\n    this.transports = opts.transports || [\"polling\", \"websocket\"];\n    this.readyState = \"\";\n    this.writeBuffer = [];\n    this.prevBufferLen = 0;\n\n    this.opts = Object.assign(\n      {\n        path: \"/engine.io\",\n        agent: false,\n        withCredentials: false,\n        upgrade: true,\n        jsonp: true,\n        timestampParam: \"t\",\n        rememberUpgrade: false,\n        rejectUnauthorized: true,\n        perMessageDeflate: {\n          threshold: 1024\n        },\n        transportOptions: {}\n      },\n      opts\n    );\n\n    this.opts.path = this.opts.path.replace(/\\/$/, \"\") + \"/\";\n\n    if (typeof this.opts.query === \"string\") {\n      this.opts.query = parseqs.decode(this.opts.query);\n    }\n\n    // set on handshake\n    this.id = null;\n    this.upgrades = null;\n    this.pingInterval = null;\n    this.pingTimeout = null;\n\n    // set on heartbeat\n    this.pingTimeoutTimer = null;\n\n    if (typeof addEventListener === \"function\") {\n      addEventListener(\n        \"beforeunload\",\n        () => {\n          if (this.transport) {\n            // silently close the transport\n            this.transport.removeAllListeners();\n            this.transport.close();\n          }\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\n    this.open();\n  }\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    debug('creating transport \"%s\"', name);\n    const query = clone(this.opts.query);\n\n    // append engine.io protocol identifier\n    query.EIO = parser.protocol;\n\n    // transport name\n    query.transport = name;\n\n    // session id if we already have one\n    if (this.id) query.sid = this.id;\n\n    const opts = Object.assign(\n      {},\n      this.opts.transportOptions[name],\n      this.opts,\n      {\n        query,\n        socket: this,\n        hostname: this.hostname,\n        secure: this.secure,\n        port: this.port\n      }\n    );\n\n    debug(\"options: %j\", opts);\n\n    return new transports[name](opts);\n  }\n\n  /**\n   * Initializes transport to use and starts probe.\n   *\n   * @api private\n   */\n  open() {\n    let transport;\n    if (\n      this.opts.rememberUpgrade &&\n      Socket.priorWebsocketSuccess &&\n      this.transports.indexOf(\"websocket\") !== -1\n    ) {\n      transport = \"websocket\";\n    } else if (0 === this.transports.length) {\n      // Emit error on next tick so it can be listened to\n      const self = this;\n      setTimeout(function() {\n        self.emit(\"error\", \"No transports available\");\n      }, 0);\n      return;\n    } else {\n      transport = this.transports[0];\n    }\n    this.readyState = \"opening\";\n\n    // Retry with the next transport if the transport is disabled (jsonp: false)\n    try {\n      transport = this.createTransport(transport);\n    } catch (e) {\n      debug(\"error while creating transport: %s\", e);\n      this.transports.shift();\n      this.open();\n      return;\n    }\n\n    transport.open();\n    this.setTransport(transport);\n  }\n\n  /**\n   * Sets the current transport. Disables the existing one (if any).\n   *\n   * @api private\n   */\n  setTransport(transport) {\n    debug(\"setting transport %s\", transport.name);\n    const self = this;\n\n    if (this.transport) {\n      debug(\"clearing existing transport %s\", this.transport.name);\n      this.transport.removeAllListeners();\n    }\n\n    // set up transport\n    this.transport = transport;\n\n    // set up transport listeners\n    transport\n      .on(\"drain\", function() {\n        self.onDrain();\n      })\n      .on(\"packet\", function(packet) {\n        self.onPacket(packet);\n      })\n      .on(\"error\", function(e) {\n        self.onError(e);\n      })\n      .on(\"close\", function() {\n        self.onClose(\"transport close\");\n      });\n  }\n\n  /**\n   * Probes a transport.\n   *\n   * @param {String} transport name\n   * @api private\n   */\n  probe(name) {\n    debug('probing transport \"%s\"', name);\n    let transport = this.createTransport(name, { probe: 1 });\n    let failed = false;\n    const self = this;\n\n    Socket.priorWebsocketSuccess = false;\n\n    function onTransportOpen() {\n      if (self.onlyBinaryUpgrades) {\n        const upgradeLosesBinary =\n          !this.supportsBinary && self.transport.supportsBinary;\n        failed = failed || upgradeLosesBinary;\n      }\n      if (failed) return;\n\n      debug('probe transport \"%s\" opened', name);\n      transport.send([{ type: \"ping\", data: \"probe\" }]);\n      transport.once(\"packet\", function(msg) {\n        if (failed) return;\n        if (\"pong\" === msg.type && \"probe\" === msg.data) {\n          debug('probe transport \"%s\" pong', name);\n          self.upgrading = true;\n          self.emit(\"upgrading\", transport);\n          if (!transport) return;\n          Socket.priorWebsocketSuccess = \"websocket\" === transport.name;\n\n          debug('pausing current transport \"%s\"', self.transport.name);\n          self.transport.pause(function() {\n            if (failed) return;\n            if (\"closed\" === self.readyState) return;\n            debug(\"changing transport and sending upgrade packet\");\n\n            cleanup();\n\n            self.setTransport(transport);\n            transport.send([{ type: \"upgrade\" }]);\n            self.emit(\"upgrade\", transport);\n            transport = null;\n            self.upgrading = false;\n            self.flush();\n          });\n        } else {\n          debug('probe transport \"%s\" failed', name);\n          const err = new Error(\"probe error\");\n          err.transport = transport.name;\n          self.emit(\"upgradeError\", err);\n        }\n      });\n    }\n\n    function freezeTransport() {\n      if (failed) return;\n\n      // Any callback called by transport should be ignored since now\n      failed = true;\n\n      cleanup();\n\n      transport.close();\n      transport = null;\n    }\n\n    // Handle any error that happens while probing\n    function onerror(err) {\n      const error = new Error(\"probe error: \" + err);\n      error.transport = transport.name;\n\n      freezeTransport();\n\n      debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n      self.emit(\"upgradeError\", error);\n    }\n\n    function onTransportClose() {\n      onerror(\"transport closed\");\n    }\n\n    // When the socket is closed while we're probing\n    function onclose() {\n      onerror(\"socket closed\");\n    }\n\n    // When the socket is upgraded while we're probing\n    function onupgrade(to) {\n      if (transport && to.name !== transport.name) {\n        debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n        freezeTransport();\n      }\n    }\n\n    // Remove all listeners on the transport and on self\n    function cleanup() {\n      transport.removeListener(\"open\", onTransportOpen);\n      transport.removeListener(\"error\", onerror);\n      transport.removeListener(\"close\", onTransportClose);\n      self.removeListener(\"close\", onclose);\n      self.removeListener(\"upgrading\", onupgrade);\n    }\n\n    transport.once(\"open\", onTransportOpen);\n    transport.once(\"error\", onerror);\n    transport.once(\"close\", onTransportClose);\n\n    this.once(\"close\", onclose);\n    this.once(\"upgrading\", onupgrade);\n\n    transport.open();\n  }\n\n  /**\n   * Called when connection is deemed open.\n   *\n   * @api public\n   */\n  onOpen() {\n    debug(\"socket open\");\n    this.readyState = \"open\";\n    Socket.priorWebsocketSuccess = \"websocket\" === this.transport.name;\n    this.emit(\"open\");\n    this.flush();\n\n    // we check for `readyState` in case an `open`\n    // listener already closed the socket\n    if (\n      \"open\" === this.readyState &&\n      this.opts.upgrade &&\n      this.transport.pause\n    ) {\n      debug(\"starting upgrade probes\");\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  /**\n   * Handles a packet.\n   *\n   * @api private\n   */\n  onPacket(packet) {\n    if (\n      \"opening\" === this.readyState ||\n      \"open\" === this.readyState ||\n      \"closing\" === this.readyState\n    ) {\n      debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n      this.emit(\"packet\", packet);\n\n      // Socket is live - any packet counts\n      this.emit(\"heartbeat\");\n\n      switch (packet.type) {\n        case \"open\":\n          this.onHandshake(JSON.parse(packet.data));\n          break;\n\n        case \"ping\":\n          this.resetPingTimeout();\n          this.sendPacket(\"pong\");\n          this.emit(\"pong\");\n          break;\n\n        case \"error\":\n          const err = new Error(\"server error\");\n          err.code = packet.data;\n          this.onError(err);\n          break;\n\n        case \"message\":\n          this.emit(\"data\", packet.data);\n          this.emit(\"message\", packet.data);\n          break;\n      }\n    } else {\n      debug('packet received with socket readyState \"%s\"', this.readyState);\n    }\n  }\n\n  /**\n   * Called upon handshake completion.\n   *\n   * @param {Object} handshake obj\n   * @api private\n   */\n  onHandshake(data) {\n    this.emit(\"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) return;\n    this.resetPingTimeout();\n  }\n\n  /**\n   * Sets and resets ping timeout timer based on server pings.\n   *\n   * @api private\n   */\n  resetPingTimeout() {\n    clearTimeout(this.pingTimeoutTimer);\n    this.pingTimeoutTimer = setTimeout(() => {\n      this.onClose(\"ping timeout\");\n    }, this.pingInterval + this.pingTimeout);\n    if (this.opts.autoUnref) {\n      this.pingTimeoutTimer.unref();\n    }\n  }\n\n  /**\n   * Called on `drain` event\n   *\n   * @api private\n   */\n  onDrain() {\n    this.writeBuffer.splice(0, this.prevBufferLen);\n\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\n    if (0 === this.writeBuffer.length) {\n      this.emit(\"drain\");\n    } else {\n      this.flush();\n    }\n  }\n\n  /**\n   * Flush write buffers.\n   *\n   * @api private\n   */\n  flush() {\n    if (\n      \"closed\" !== this.readyState &&\n      this.transport.writable &&\n      !this.upgrading &&\n      this.writeBuffer.length\n    ) {\n      debug(\"flushing %d packets in socket\", 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.emit(\"flush\");\n    }\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\n  send(msg, options, fn) {\n    this.sendPacket(\"message\", msg, options, fn);\n    return this;\n  }\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\n    if (\"function\" === typeof options) {\n      fn = options;\n      options = null;\n    }\n\n    if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n      return;\n    }\n\n    options = options || {};\n    options.compress = false !== options.compress;\n\n    const packet = {\n      type: type,\n      data: data,\n      options: options\n    };\n    this.emit(\"packetCreate\", packet);\n    this.writeBuffer.push(packet);\n    if (fn) this.once(\"flush\", fn);\n    this.flush();\n  }\n\n  /**\n   * Closes the connection.\n   *\n   * @api private\n   */\n  close() {\n    const self = this;\n\n    if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n      this.readyState = \"closing\";\n\n      if (this.writeBuffer.length) {\n        this.once(\"drain\", function() {\n          if (this.upgrading) {\n            waitForUpgrade();\n          } else {\n            close();\n          }\n        });\n      } else if (this.upgrading) {\n        waitForUpgrade();\n      } else {\n        close();\n      }\n    }\n\n    function close() {\n      self.onClose(\"forced close\");\n      debug(\"socket closing - telling transport to close\");\n      self.transport.close();\n    }\n\n    function cleanupAndClose() {\n      self.removeListener(\"upgrade\", cleanupAndClose);\n      self.removeListener(\"upgradeError\", cleanupAndClose);\n      close();\n    }\n\n    function waitForUpgrade() {\n      // wait for upgrade to finish since we can't send packets while pausing a transport\n      self.once(\"upgrade\", cleanupAndClose);\n      self.once(\"upgradeError\", cleanupAndClose);\n    }\n\n    return this;\n  }\n\n  /**\n   * Called upon transport error\n   *\n   * @api private\n   */\n  onError(err) {\n    debug(\"socket error %j\", err);\n    Socket.priorWebsocketSuccess = false;\n    this.emit(\"error\", err);\n    this.onClose(\"transport error\", err);\n  }\n\n  /**\n   * Called upon transport close.\n   *\n   * @api private\n   */\n  onClose(reason, desc) {\n    if (\n      \"opening\" === this.readyState ||\n      \"open\" === this.readyState ||\n      \"closing\" === this.readyState\n    ) {\n      debug('socket close with reason: \"%s\"', reason);\n      const self = this;\n\n      // clear timers\n      clearTimeout(this.pingIntervalTimer);\n      clearTimeout(this.pingTimeoutTimer);\n\n      // stop event from firing again for transport\n      this.transport.removeAllListeners(\"close\");\n\n      // ensure transport won't stay open\n      this.transport.close();\n\n      // ignore further transport communication\n      this.transport.removeAllListeners();\n\n      if (typeof removeEventListener === \"function\") {\n        removeEventListener(\"offline\", this.offlineEventListener, false);\n      }\n\n      // set ready state\n      this.readyState = \"closed\";\n\n      // clear session id\n      this.id = null;\n\n      // emit close event\n      this.emit(\"close\", reason, desc);\n\n      // clean buffers after, so users can still\n      // grab the buffers on `close` event\n      self.writeBuffer = [];\n      self.prevBufferLen = 0;\n    }\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}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\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\nmodule.exports = Socket;\n"]},"metadata":{},"sourceType":"script"}