PageSourceSearch

https://traderfox.de/socket.io/socket.io.js

js traderfox.de collected 2026-09-24 12:59:03 UTC 154,232 bytes, 4,908 lines download raw bytes

1/*!
2 * Socket.IO v4.8.1
3 * (c) 2014-2024
vendor: 28,173 bytes, lines 3-902
3 Guillermo Rauch
4 * Released under the MIT License.
5 */
6(function (global, factory) {
7  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8  typeof define === 'function' && define.amd ? define(factory) :
9  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.io = factory());
10})(this, (function () { 'use strict';
11
12  function _arrayLikeToArray(r, a) {
13    (null == a || a > r.length) && (a = r.length);
14    for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
15    return n;
16  }
17  function _arrayWithoutHoles(r) {
18    if (Array.isArray(r)) return _arrayLikeToArray(r);
19  }
20  function _construct(t, e, r) {
21    if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);
22    var o = [null];
23    o.push.apply(o, e);
24    var p = new (t.bind.apply(t, o))();
25    return r && _setPrototypeOf(p, r.prototype), p;
26  }
27  function _defineProperties(e, r) {
28    for (var t = 0; t < r.length; t++) {
29      var o = r[t];
30      o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
31    }
32  }
33  function _createClass(e, r, t) {
34    return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
35      writable: !1
36    }), e;
37  }
38  function _createForOfIteratorHelper(r, e) {
39    var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
40    if (!t) {
41      if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
42        t && (r = t);
43        var n = 0,
44          F = function () {};
45        return {
46          s: F,
47          n: function () {
48            return n >= r.length ? {
49              done: !0
50            } : {
51              done: !1,
52              value: r[n++]
53            };
54          },
55          e: function (r) {
56            throw r;
57          },
58          f: F
59        };
60      }
61      throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
62    }
63    var o,
64      a = !0,
65      u = !1;
66    return {
67      s: function () {
68        t = t.call(r);
69      },
70      n: function () {
71        var r = t.next();
72        return a = r.done, r;
73      },
74      e: function (r) {
75        u = !0, o = r;
76      },
77      f: function () {
78        try {
79          a || null == t.return || t.return();
80        } finally {
81          if (u) throw o;
82        }
83      }
84    };
85  }
86  function _extends() {
87    return _extends = Object.assign ? Object.assign.bind() : function (n) {
88      for (var e = 1; e < arguments.length; e++) {
89        var t = arguments[e];
90        for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
91      }
92      return n;
93    }, _extends.apply(null, arguments);
94  }
95  function _getPrototypeOf(t) {
96    return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
97      return t.__proto__ || Object.getPrototypeOf(t);
98    }, _getPrototypeOf(t);
99  }
100  function _inheritsLoose(t, o) {
101    t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o);
102  }
103  function _isNativeFunction(t) {
104    try {
105      return -1 !== Function.toString.call(t).indexOf("[native code]");
106    } catch (n) {
107      return "function" == typeof t;
108    }
109  }
110  function _isNativeReflectConstruct() {
111    try {
112      var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
113    } catch (t) {}
114    return (_isNativeReflectConstruct = function () {
115      return !!t;
116    })();
117  }
118  function _iterableToArray(r) {
119    if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
120  }
121  function _nonIterableSpread() {
122    throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
123  }
124  function _setPrototypeOf(t, e) {
125    return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
126      return t.__proto__ = e, t;
127    }, _setPrototypeOf(t, e);
128  }
129  function _toConsumableArray(r) {
130    return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
131  }
132  function _toPrimitive(t, r) {
133    if ("object" != typeof t || !t) return t;
134    var e = t[Symbol.toPrimitive];
135    if (void 0 !== e) {
136      var i = e.call(t, r || "default");
137      if ("object" != typeof i) return i;
138      throw new TypeError("@@toPrimitive must return a primitive value.");
139    }
140    return ("string" === r ? String : Number)(t);
141  }
142  function _toPropertyKey(t) {
143    var i = _toPrimitive(t, "string");
144    return "symbol" == typeof i ? i : i + "";
145  }
146  function _typeof(o) {
147    "@babel/helpers - typeof";
148
149    return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
150      return typeof o;
151    } : function (o) {
152      return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
153    }, _typeof(o);
154  }
155  function _unsupportedIterableToArray(r, a) {
156    if (r) {
157      if ("string" == typeof r) return _arrayLikeToArray(r, a);
158      var t = {}.toString.call(r).slice(8, -1);
159      return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
160    }
161  }
162  function _wrapNativeSuper(t) {
163    var r = "function" == typeof Map ? new Map() : void 0;
164    return _wrapNativeSuper = function (t) {
165      if (null === t || !_isNativeFunction(t)) return t;
166      if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function");
167      if (void 0 !== r) {
168        if (r.has(t)) return r.get(t);
169        r.set(t, Wrapper);
170      }
171      function Wrapper() {
172        return _construct(t, arguments, _getPrototypeOf(this).constructor);
173      }
174      return Wrapper.prototype = Object.create(t.prototype, {
175        constructor: {
176          value: Wrapper,
177          enumerable: !1,
178          writable: !0,
179          configurable: !0
180        }
181      }), _setPrototypeOf(Wrapper, t);
182    }, _wrapNativeSuper(t);
183  }
184
185  var PACKET_TYPES = Object.create(null); // no Map = no polyfill
186  PACKET_TYPES["open"] = "0";
187  PACKET_TYPES["close"] = "1";
188  PACKET_TYPES["ping"] = "2";
189  PACKET_TYPES["pong"] = "3";
190  PACKET_TYPES["message"] = "4";
191  PACKET_TYPES["upgrade"] = "5";
192  PACKET_TYPES["noop"] = "6";
193  var PACKET_TYPES_REVERSE = Object.create(null);
194  Object.keys(PACKET_TYPES).forEach(function (key) {
195    PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;
196  });
197  var ERROR_PACKET = {
198    type: "error",
199    data: "parser error"
200  };
201
202  var withNativeBlob$1 = typeof Blob === "function" || typeof Blob !== "undefined" && Object.prototype.toString.call(Blob) === "[object BlobConstructor]";
203  var withNativeArrayBuffer$2 = typeof ArrayBuffer === "function";
204  // ArrayBuffer.isView method is not defined in IE10
205  var isView$1 = function isView(obj) {
206    return typeof ArrayBuffer.isView === "function" ? ArrayBuffer.isView(obj) : obj && obj.buffer instanceof ArrayBuffer;
207  };
208  var encodePacket = function encodePacket(_ref, supportsBinary, callback) {
209    var type = _ref.type,
210      data = _ref.data;
211    if (withNativeBlob$1 && data instanceof Blob) {
212      if (supportsBinary) {
213        return callback(data);
214      } else {
215        return encodeBlobAsBase64(data, callback);
216      }
217    } else if (withNativeArrayBuffer$2 && (data instanceof ArrayBuffer || isView$1(data))) {
218      if (supportsBinary) {
219        return callback(data);
220      } else {
221        return encodeBlobAsBase64(new Blob([data]), callback);
222      }
223    }
224    // plain string
225    return callback(PACKET_TYPES[type] + (data || ""));
226  };
227  var encodeBlobAsBase64 = function encodeBlobAsBase64(data, callback) {
228    var fileReader = new FileReader();
229    fileReader.onload = function () {
230      var content = fileReader.result.split(",")[1];
231      callback("b" + (content || ""));
232    };
233    return fileReader.readAsDataURL(data);
234  };
235  function toArray(data) {
236    if (data instanceof Uint8Array) {
237      return data;
238    } else if (data instanceof ArrayBuffer) {
239      return new Uint8Array(data);
240    } else {
241      return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
242    }
243  }
244  var TEXT_ENCODER;
245  function encodePacketToBinary(packet, callback) {
246    if (withNativeBlob$1 && packet.data instanceof Blob) {
247      return packet.data.arrayBuffer().then(toArray).then(callback);
248    } else if (withNativeArrayBuffer$2 && (packet.data instanceof ArrayBuffer || isView$1(packet.data))) {
249      return callback(toArray(packet.data));
250    }
251    encodePacket(packet, false, function (encoded) {
252      if (!TEXT_ENCODER) {
253        TEXT_ENCODER = new TextEncoder();
254      }
255      callback(TEXT_ENCODER.encode(encoded));
256    });
257  }
258
259  // imported from https://github.com/socketio/base64-arraybuffer
260  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
261  // Use a lookup table to find the index.
262  var lookup$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);
263  for (var i = 0; i < chars.length; i++) {
264    lookup$1[chars.charCodeAt(i)] = i;
265  }
266  var decode$1 = function decode(base64) {
267    var bufferLength = base64.length * 0.75,
268      len = base64.length,
269      i,
270      p = 0,
271      encoded1,
272      encoded2,
273      encoded3,
274      encoded4;
275    if (base64[base64.length - 1] === '=') {
276      bufferLength--;
277      if (base64[base64.length - 2] === '=') {
278        bufferLength--;
279      }
280    }
281    var arraybuffer = new ArrayBuffer(bufferLength),
282      bytes = new Uint8Array(arraybuffer);
283    for (i = 0; i < len; i += 4) {
284      encoded1 = lookup$1[base64.charCodeAt(i)];
285      encoded2 = lookup$1[base64.charCodeAt(i + 1)];
286      encoded3 = lookup$1[base64.charCodeAt(i + 2)];
287      encoded4 = lookup$1[base64.charCodeAt(i + 3)];
288      bytes[p++] = encoded1 << 2 | encoded2 >> 4;
289      bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;
290      bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
291    }
292    return arraybuffer;
293  };
294
295  var withNativeArrayBuffer$1 = typeof ArrayBuffer === "function";
296  var decodePacket = function decodePacket(encodedPacket, binaryType) {
297    if (typeof encodedPacket !== "string") {
298      return {
299        type: "message",
300        data: mapBinary(encodedPacket, binaryType)
301      };
302    }
303    var type = encodedPacket.charAt(0);
304    if (type === "b") {
305      return {
306        type: "message",
307        data: decodeBase64Packet(encodedPacket.substring(1), binaryType)
308      };
309    }
310    var packetType = PACKET_TYPES_REVERSE[type];
311    if (!packetType) {
312      return ERROR_PACKET;
313    }
314    return encodedPacket.length > 1 ? {
315      type: PACKET_TYPES_REVERSE[type],
316      data: encodedPacket.substring(1)
317    } : {
318      type: PACKET_TYPES_REVERSE[type]
319    };
320  };
321  var decodeBase64Packet = function decodeBase64Packet(data, binaryType) {
322    if (withNativeArrayBuffer$1) {
323      var decoded = decode$1(data);
324      return mapBinary(decoded, binaryType);
325    } else {
326      return {
327        base64: true,
328        data: data
329      }; // fallback for old browsers
330    }
331  };
332  var mapBinary = function mapBinary(data, binaryType) {
333    switch (binaryType) {
334      case "blob":
335        if (data instanceof Blob) {
336          // from WebSocket + binaryType "blob"
337          return data;
338        } else {
339          // from HTTP long-polling or WebTransport
340          return new Blob([data]);
341        }
342      case "arraybuffer":
343      default:
344        if (data instanceof ArrayBuffer) {
345          // from HTTP long-polling (base64) or WebSocket + binaryType "arraybuffer"
346          return data;
347        } else {
348          // from WebTransport (Uint8Array)
349          return data.buffer;
350        }
351    }
352  };
353
354  var SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text
355  var encodePayload = function encodePayload(packets, callback) {
356    // some packets may be added to the array while encoding, so the initial length must be saved
357    var length = packets.length;
358    var encodedPackets = new Array(length);
359    var count = 0;
360    packets.forEach(function (packet, i) {
361      // force base64 encoding for binary packets
362      encodePacket(packet, false, function (encodedPacket) {
363        encodedPackets[i] = encodedPacket;
364        if (++count === length) {
365          callback(encodedPackets.join(SEPARATOR));
366        }
367      });
368    });
369  };
370  var decodePayload = function decodePayload(encodedPayload, binaryType) {
371    var encodedPackets = encodedPayload.split(SEPARATOR);
372    var packets = [];
373    for (var i = 0; i < encodedPackets.length; i++) {
374      var decodedPacket = decodePacket(encodedPackets[i], binaryType);
375      packets.push(decodedPacket);
376      if (decodedPacket.type === "error") {
377        break;
378      }
379    }
380    return packets;
381  };
382  function createPacketEncoderStream() {
383    return new TransformStream({
384      transform: function transform(packet, controller) {
385        encodePacketToBinary(packet, function (encodedPacket) {
386          var payloadLength = encodedPacket.length;
387          var header;
388          // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length
389          if (payloadLength < 126) {
390            header = new Uint8Array(1);
391            new DataView(header.buffer).setUint8(0, payloadLength);
392          } else if (payloadLength < 65536) {
393            header = new Uint8Array(3);
394            var view = new DataView(header.buffer);
395            view.setUint8(0, 126);
396            view.setUint16(1, payloadLength);
397          } else {
398            header = new Uint8Array(9);
399            var _view = new DataView(header.buffer);
400            _view.setUint8(0, 127);
401            _view.setBigUint64(1, BigInt(payloadLength));
402          }
403          // first bit indicates whether the payload is plain text (0) or binary (1)
404          if (packet.data && typeof packet.data !== "string") {
405            header[0] |= 0x80;
406          }
407          controller.enqueue(header);
408          controller.enqueue(encodedPacket);
409        });
410      }
411    });
412  }
413  var TEXT_DECODER;
414  function totalLength(chunks) {
415    return chunks.reduce(function (acc, chunk) {
416      return acc + chunk.length;
417    }, 0);
418  }
419  function concatChunks(chunks, size) {
420    if (chunks[0].length === size) {
421      return chunks.shift();
422    }
423    var buffer = new Uint8Array(size);
424    var j = 0;
425    for (var i = 0; i < size; i++) {
426      buffer[i] = chunks[0][j++];
427      if (j === chunks[0].length) {
428        chunks.shift();
429        j = 0;
430      }
431    }
432    if (chunks.length && j < chunks[0].length) {
433      chunks[0] = chunks[0].slice(j);
434    }
435    return buffer;
436  }
437  function createPacketDecoderStream(maxPayload, binaryType) {
438    if (!TEXT_DECODER) {
439      TEXT_DECODER = new TextDecoder();
440    }
441    var chunks = [];
442    var state = 0 /* State.READ_HEADER */;
443    var expectedLength = -1;
444    var isBinary = false;
445    return new TransformStream({
446      transform: function transform(chunk, controller) {
447        chunks.push(chunk);
448        while (true) {
449          if (state === 0 /* State.READ_HEADER */) {
450            if (totalLength(chunks) < 1) {
451              break;
452            }
453            var header = concatChunks(chunks, 1);
454            isBinary = (header[0] & 0x80) === 0x80;
455            expectedLength = header[0] & 0x7f;
456            if (expectedLength < 126) {
457              state = 3 /* State.READ_PAYLOAD */;
458            } else if (expectedLength === 126) {
459              state = 1 /* State.READ_EXTENDED_LENGTH_16 */;
460            } else {
461              state = 2 /* State.READ_EXTENDED_LENGTH_64 */;
462            }
463          } else if (state === 1 /* State.READ_EXTENDED_LENGTH_16 */) {
464            if (totalLength(chunks) < 2) {
465              break;
466            }
467            var headerArray = concatChunks(chunks, 2);
468            expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);
469            state = 3 /* State.READ_PAYLOAD */;
470          } else if (state === 2 /* State.READ_EXTENDED_LENGTH_64 */) {
471            if (totalLength(chunks) < 8) {
472              break;
473            }
474            var _headerArray = concatChunks(chunks, 8);
475            var view = new DataView(_headerArray.buffer, _headerArray.byteOffset, _headerArray.length);
476            var n = view.getUint32(0);
477            if (n > Math.pow(2, 53 - 32) - 1) {
478              // the maximum safe integer in JavaScript is 2^53 - 1
479              controller.enqueue(ERROR_PACKET);
480              break;
481            }
482            expectedLength = n * Math.pow(2, 32) + view.getUint32(4);
483            state = 3 /* State.READ_PAYLOAD */;
484          } else {
485            if (totalLength(chunks) < expectedLength) {
486              break;
487            }
488            var data = concatChunks(chunks, expectedLength);
489            controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));
490            state = 0 /* State.READ_HEADER */;
491          }
492          if (expectedLength === 0 || expectedLength > maxPayload) {
493            controller.enqueue(ERROR_PACKET);
494            break;
495          }
496        }
497      }
498    });
499  }
500  var protocol$1 = 4;
501
502  /**
503   * Initialize a new `Emitter`.
504   *
505   * @api public
506   */
507
508  function Emitter(obj) {
509    if (obj) return mixin(obj);
510  }
511
512  /**
513   * Mixin the emitter properties.
514   *
515   * @param {Object} obj
516   * @return {Object}
517   * @api private
518   */
519
520  function mixin(obj) {
521    for (var key in Emitter.prototype) {
522      obj[key] = Emitter.prototype[key];
523    }
524    return obj;
525  }
526
527  /**
528   * Listen on the given `event` with `fn`.
529   *
530   * @param {String} event
531   * @param {Function} fn
532   * @return {Emitter}
533   * @api public
534   */
535
536  Emitter.prototype.on = Emitter.prototype.addEventListener = function (event, fn) {
537    this._callbacks = this._callbacks || {};
538    (this._callbacks['$' + event] = this._callbacks['$' + event] || []).push(fn);
539    return this;
540  };
541
542  /**
543   * Adds an `event` listener that will be invoked a single
544   * time then automatically removed.
545   *
546   * @param {String} event
547   * @param {Function} fn
548   * @return {Emitter}
549   * @api public
550   */
551
552  Emitter.prototype.once = function (event, fn) {
553    function on() {
554      this.off(event, on);
555      fn.apply(this, arguments);
556    }
557    on.fn = fn;
558    this.on(event, on);
559    return this;
560  };
561
562  /**
563   * Remove the given callback for `event` or all
564   * registered callbacks.
565   *
566   * @param {String} event
567   * @param {Function} fn
568   * @return {Emitter}
569   * @api public
570   */
571
572  Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function (event, fn) {
573    this._callbacks = this._callbacks || {};
574
575    // all
576    if (0 == arguments.length) {
577      this._callbacks = {};
578      return this;
579    }
580
581    // specific event
582    var callbacks = this._callbacks['$' + event];
583    if (!callbacks) return this;
584
585    // remove all handlers
586    if (1 == arguments.length) {
587      delete this._callbacks['$' + event];
588      return this;
589    }
590
591    // remove specific handler
592    var cb;
593    for (var i = 0; i < callbacks.length; i++) {
594      cb = callbacks[i];
595      if (cb === fn || cb.fn === fn) {
596        callbacks.splice(i, 1);
597        break;
598      }
599    }
600
601    // Remove event specific arrays for event types that no
602    // one is subscribed for to avoid memory leak.
603    if (callbacks.length === 0) {
604      delete this._callbacks['$' + event];
605    }
606    return this;
607  };
608
609  /**
610   * Emit `event` with the given args.
611   *
612   * @param {String} event
613   * @param {Mixed} ...
614   * @return {Emitter}
615   */
616
617  Emitter.prototype.emit = function (event) {
618    this._callbacks = this._callbacks || {};
619    var args = new Array(arguments.length - 1),
620      callbacks = this._callbacks['$' + event];
621    for (var i = 1; i < arguments.length; i++) {
622      args[i - 1] = arguments[i];
623    }
624    if (callbacks) {
625      callbacks = callbacks.slice(0);
626      for (var i = 0, len = callbacks.length; i < len; ++i) {
627        callbacks[i].apply(this, args);
628      }
629    }
630    return this;
631  };
632
633  // alias used for reserved events (protected method)
634  Emitter.prototype.emitReserved = Emitter.prototype.emit;
635
636  /**
637   * Return array of callbacks for `event`.
638   *
639   * @param {String} event
640   * @return {Array}
641   * @api public
642   */
643
644  Emitter.prototype.listeners = function (event) {
645    this._callbacks = this._callbacks || {};
646    return this._callbacks['$' + event] || [];
647  };
648
649  /**
650   * Check if this emitter has `event` handlers.
651   *
652   * @param {String} event
653   * @return {Boolean}
654   * @api public
655   */
656
657  Emitter.prototype.hasListeners = function (event) {
658    return !!this.listeners(event).length;
659  };
660
661  var nextTick = function () {
662    var isPromiseAvailable = typeof Promise === "function" && typeof Promise.resolve === "function";
663    if (isPromiseAvailable) {
664      return function (cb) {
665        return Promise.resolve().then(cb);
666      };
667    } else {
668      return function (cb, setTimeoutFn) {
669        return setTimeoutFn(cb, 0);
670      };
671    }
672  }();
673  var globalThisShim = function () {
674    if (typeof self !== "undefined") {
675      return self;
676    } else if (typeof window !== "undefined") {
677      return window;
678    } else {
679      return Function("return this")();
680    }
681  }();
682  var defaultBinaryType = "arraybuffer";
683  function createCookieJar() {}
684
685  function pick(obj) {
686    for (var _len = arguments.length, attr = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
687      attr[_key - 1] = arguments[_key];
688    }
689    return attr.reduce(function (acc, k) {
690      if (obj.hasOwnProperty(k)) {
691        acc[k] = obj[k];
692      }
693      return acc;
694    }, {});
695  }
696  // Keep a reference to the real timeout functions so they can be used when overridden
697  var NATIVE_SET_TIMEOUT = globalThisShim.setTimeout;
698  var NATIVE_CLEAR_TIMEOUT = globalThisShim.clearTimeout;
699  function installTimerFunctions(obj, opts) {
700    if (opts.useNativeTimers) {
701      obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThisShim);
702      obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThisShim);
703    } else {
704      obj.setTimeoutFn = globalThisShim.setTimeout.bind(globalThisShim);
705      obj.clearTimeoutFn = globalThisShim.clearTimeout.bind(globalThisShim);
706    }
707  }
708  // base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)
709  var BASE64_OVERHEAD = 1.33;
710  // we could also have used `new Blob([obj]).size`, but it isn't supported in IE9
711  function byteLength(obj) {
712    if (typeof obj === "string") {
713      return utf8Length(obj);
714    }
715    // arraybuffer or blob
716    return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);
717  }
718  function utf8Length(str) {
719    var c = 0,
720      length = 0;
721    for (var i = 0, l = str.length; i < l; i++) {
722      c = str.charCodeAt(i);
723      if (c < 0x80) {
724        length += 1;
725      } else if (c < 0x800) {
726        length += 2;
727      } else if (c < 0xd800 || c >= 0xe000) {
728        length += 3;
729      } else {
730        i++;
731        length += 4;
732      }
733    }
734    return length;
735  }
736  /**
737   * Generates a random 8-characters string.
738   */
739  function randomString() {
740    return Date.now().toString(36).substring(3) + Math.random().toString(36).substring(2, 5);
741  }
742
743  // imported from https://github.com/galkn/querystring
744  /**
745   * Compiles a querystring
746   * Returns string representation of the object
747   *
748   * @param {Object}
749   * @api private
750   */
751  function encode(obj) {
752    var str = '';
753    for (var i in obj) {
754      if (obj.hasOwnProperty(i)) {
755        if (str.length) str += '&';
756        str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);
757      }
758    }
759    return str;
760  }
761  /**
762   * Parses a simple querystring into an object
763   *
764   * @param {String} qs
765   * @api private
766   */
767  function decode(qs) {
768    var qry = {};
769    var pairs = qs.split('&');
770    for (var i = 0, l = pairs.length; i < l; i++) {
771      var pair = pairs[i].split('=');
772      qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
773    }
774    return qry;
775  }
776
777  var TransportError = /*#__PURE__*/function (_Error) {
778    function TransportError(reason, description, context) {
779      var _this;
780      _this = _Error.call(this, reason) || this;
781      _this.description = description;
782      _this.context = context;
783      _this.type = "TransportError";
784      return _this;
785    }
786    _inheritsLoose(TransportError, _Error);
787    return TransportError;
788  }( /*#__PURE__*/_wrapNativeSuper(Error));
789  var Transport = /*#__PURE__*/function (_Emitter) {
790    /**
791     * Transport abstract constructor.
792     *
793     * @param {Object} opts - options
794     * @protected
795     */
796    function Transport(opts) {
797      var _this2;
798      _this2 = _Emitter.call(this) || this;
799      _this2.writable = false;
800      installTimerFunctions(_this2, opts);
801      _this2.opts = opts;
802      _this2.query = opts.query;
803      _this2.socket = opts.socket;
804      _this2.supportsBinary = !opts.forceBase64;
805      return _this2;
806    }
807    /**
808     * Emits an error.
809     *
810     * @param {String} reason
811     * @param description
812     * @param context - the error context
813     * @return {Transport} for chaining
814     * @protected
815     */
816    _inheritsLoose(Transport, _Emitter);
817    var _proto = Transport.prototype;
818    _proto.onError = function onError(reason, description, context) {
819      _Emitter.prototype.emitReserved.call(this, "error", new TransportError(reason, description, context));
820      return this;
821    }
822    /**
823     * Opens the transport.
824     */;
825    _proto.open = function open() {
826      this.readyState = "opening";
827      this.doOpen();
828      return this;
829    }
830    /**
831     * Closes the transport.
832     */;
833    _proto.close = function close() {
834      if (this.readyState === "opening" || this.readyState === "open") {
835        this.doClose();
836        this.onClose();
837      }
838      return this;
839    }
840    /**
841     * Sends multiple packets.
842     *
843     * @param {Array} packets
844     */;
845    _proto.send = function send(packets) {
846      if (this.readyState === "open") {
847        this.write(packets);
848      }
849    }
850    /**
851     * Called upon open
852     *
853     * @protected
854     */;
855    _proto.onOpen = function onOpen() {
856      this.readyState = "open";
857      this.writable = true;
858      _Emitter.prototype.emitReserved.call(this, "open");
859    }
860    /**
861     * Called with data.
862     *
863     * @param {String} data
864     * @protected
865     */;
866    _proto.onData = function onData(data) {
867      var packet = decodePacket(data, this.socket.binaryType);
868      this.onPacket(packet);
869    }
870    /**
871     * Called with a decoded packet.
872     *
873     * @protected
874     */;
875    _proto.onPacket = function onPacket(packet) {
876      _Emitter.prototype.emitReserved.call(this, "packet", packet);
877    }
878    /**
879     * Called upon close.
880     *
881     * @protected
882     */;
883    _proto.onClose = function onClose(details) {
884      this.readyState = "closed";
885      _Emitter.prototype.emitReserved.call(this, "close", details);
886    }
887    /**
888     * Pauses the transport, in order not to lose packets during an upgrade.
889     *
890     * @param onPause
891     */;
892    _proto.pause = function pause(onPause) {};
893    _proto.createUri = function createUri(schema) {
894      var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
895      return schema + "://" + this._hostname() + this._port() + this.opts.path + this._query(query);
896    };
897    _proto._hostname = function _hostname() {
898      var hostname = this.opts.hostname;
899      return hostname.indexOf(":") === -1 ? hostname : "[" + hostname + "]";
900    };
901    _proto._port = function _port() {
902      if (this.opts.port && (this.opts.secure && Number(this.opts.port
902 !== 443)
vendor: 56,507 bytes, lines 902-2672
902 || !this.opts.secure && Number(this.opts.port) !== 80)) {
903        return ":" + this.opts.port;
904      } else {
905        return "";
906      }
907    };
908    _proto._query = function _query(query) {
909      var encodedQuery = encode(query);
910      return encodedQuery.length ? "?" + encodedQuery : "";
911    };
912    return Transport;
913  }(Emitter);
914
915  var Polling = /*#__PURE__*/function (_Transport) {
916    function Polling() {
917      var _this;
918      _this = _Transport.apply(this, arguments) || this;
919      _this._polling = false;
920      return _this;
921    }
922    _inheritsLoose(Polling, _Transport);
923    var _proto = Polling.prototype;
924    /**
925     * Opens the socket (triggers polling). We write a PING message to determine
926     * when the transport is open.
927     *
928     * @protected
929     */
930    _proto.doOpen = function doOpen() {
931      this._poll();
932    }
933    /**
934     * Pauses polling.
935     *
936     * @param {Function} onPause - callback upon buffers are flushed and transport is paused
937     * @package
938     */;
939    _proto.pause = function pause(onPause) {
940      var _this2 = this;
941      this.readyState = "pausing";
942      var pause = function pause() {
943        _this2.readyState = "paused";
944        onPause();
945      };
946      if (this._polling || !this.writable) {
947        var total = 0;
948        if (this._polling) {
949          total++;
950          this.once("pollComplete", function () {
951            --total || pause();
952          });
953        }
954        if (!this.writable) {
955          total++;
956          this.once("drain", function () {
957            --total || pause();
958          });
959        }
960      } else {
961        pause();
962      }
963    }
964    /**
965     * Starts polling cycle.
966     *
967     * @private
968     */;
969    _proto._poll = function _poll() {
970      this._polling = true;
971      this.doPoll();
972      this.emitReserved("poll");
973    }
974    /**
975     * Overloads onData to detect payloads.
976     *
977     * @protected
978     */;
979    _proto.onData = function onData(data) {
980      var _this3 = this;
981      var callback = function callback(packet) {
982        // if its the first message we consider the transport open
983        if ("opening" === _this3.readyState && packet.type === "open") {
984          _this3.onOpen();
985        }
986        // if its a close packet, we close the ongoing requests
987        if ("close" === packet.type) {
988          _this3.onClose({
989            description: "transport closed by the server"
990          });
991          return false;
992        }
993        // otherwise bypass onData and handle the message
994        _this3.onPacket(packet);
995      };
996      // decode payload
997      decodePayload(data, this.socket.binaryType).forEach(callback);
998      // if an event did not trigger closing
999      if ("closed" !== this.readyState) {
1000        // if we got data we're not polling
1001        this._polling = false;
1002        this.emitReserved("pollComplete");
1003        if ("open" === this.readyState) {
1004          this._poll();
1005        }
1006      }
1007    }
1008    /**
1009     * For polling, send a close packet.
1010     *
1011     * @protected
1012     */;
1013    _proto.doClose = function doClose() {
1014      var _this4 = this;
1015      var close = function close() {
1016        _this4.write([{
1017          type: "close"
1018        }]);
1019      };
1020      if ("open" === this.readyState) {
1021        close();
1022      } else {
1023        // in case we're trying to close while
1024        // handshaking is in progress (GH-164)
1025        this.once("open", close);
1026      }
1027    }
1028    /**
1029     * Writes a packets payload.
1030     *
1031     * @param {Array} packets - data packets
1032     * @protected
1033     */;
1034    _proto.write = function write(packets) {
1035      var _this5 = this;
1036      this.writable = false;
1037      encodePayload(packets, function (data) {
1038        _this5.doWrite(data, function () {
1039          _this5.writable = true;
1040          _this5.emitReserved("drain");
1041        });
1042      });
1043    }
1044    /**
1045     * Generates uri for connection.
1046     *
1047     * @private
1048     */;
1049    _proto.uri = function uri() {
1050      var schema = this.opts.secure ? "https" : "http";
1051      var query = this.query || {};
1052      // cache busting is forced
1053      if (false !== this.opts.timestampRequests) {
1054        query[this.opts.timestampParam] = randomString();
1055      }
1056      if (!this.supportsBinary && !query.sid) {
1057        query.b64 = 1;
1058      }
1059      return this.createUri(schema, query);
1060    };
1061    return _createClass(Polling, [{
1062      key: "name",
1063      get: function get() {
1064        return "polling";
1065      }
1066    }]);
1067  }(Transport);
1068
1069  // imported from https://github.com/component/has-cors
1070  var value = false;
1071  try {
1072    value = typeof XMLHttpRequest !== 'undefined' && 'withCredentials' in new XMLHttpRequest();
1073  } catch (err) {
1074    // if XMLHttp support is disabled in IE then it will throw
1075    // when trying to create
1076  }
1077  var hasCORS = value;
1078
1079  function empty() {}
1080  var BaseXHR = /*#__PURE__*/function (_Polling) {
1081    /**
1082     * XHR Polling constructor.
1083     *
1084     * @param {Object} opts
1085     * @package
1086     */
1087    function BaseXHR(opts) {
1088      var _this;
1089      _this = _Polling.call(this, opts) || this;
1090      if (typeof location !== "undefined") {
1091        var isSSL = "https:" === location.protocol;
1092        var port = location.port;
1093        // some user agents have empty `location.port`
1094        if (!port) {
1095          port = isSSL ? "443" : "80";
1096        }
1097        _this.xd = typeof location !== "undefined" && opts.hostname !== location.hostname || port !== opts.port;
1098      }
1099      return _this;
1100    }
1101    /**
1102     * Sends data.
1103     *
1104     * @param {String} data to send.
1105     * @param {Function} called upon flush.
1106     * @private
1107     */
1108    _inheritsLoose(BaseXHR, _Polling);
1109    var _proto = BaseXHR.prototype;
1110    _proto.doWrite = function doWrite(data, fn) {
1111      var _this2 = this;
1112      var req = this.request({
1113        method: "POST",
1114        data: data
1115      });
1116      req.on("success", fn);
1117      req.on("error", function (xhrStatus, context) {
1118        _this2.onError("xhr post error", xhrStatus, context);
1119      });
1120    }
1121    /**
1122     * Starts a poll cycle.
1123     *
1124     * @private
1125     */;
1126    _proto.doPoll = function doPoll() {
1127      var _this3 = this;
1128      var req = this.request();
1129      req.on("data", this.onData.bind(this));
1130      req.on("error", function (xhrStatus, context) {
1131        _this3.onError("xhr poll error", xhrStatus, context);
1132      });
1133      this.pollXhr = req;
1134    };
1135    return BaseXHR;
1136  }(Polling);
1137  var Request = /*#__PURE__*/function (_Emitter) {
1138    /**
1139     * Request constructor
1140     *
1141     * @param {Object} options
1142     * @package
1143     */
1144    function Request(createRequest, uri, opts) {
1145      var _this4;
1146      _this4 = _Emitter.call(this) || this;
1147      _this4.createRequest = createRequest;
1148      installTimerFunctions(_this4, opts);
1149      _this4._opts = opts;
1150      _this4._method = opts.method || "GET";
1151      _this4._uri = uri;
1152      _this4._data = undefined !== opts.data ? opts.data : null;
1153      _this4._create();
1154      return _this4;
1155    }
1156    /**
1157     * Creates the XHR object and sends the request.
1158     *
1159     * @private
1160     */
1161    _inheritsLoose(Request, _Emitter);
1162    var _proto2 = Request.prototype;
1163    _proto2._create = function _create() {
1164      var _this5 = this;
1165      var _a;
1166      var opts = pick(this._opts, "agent", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "autoUnref");
1167      opts.xdomain = !!this._opts.xd;
1168      var xhr = this._xhr = this.createRequest(opts);
1169      try {
1170        xhr.open(this._method, this._uri, true);
1171        try {
1172          if (this._opts.extraHeaders) {
1173            // @ts-ignore
1174            xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);
1175            for (var i in this._opts.extraHeaders) {
1176              if (this._opts.extraHeaders.hasOwnProperty(i)) {
1177                xhr.setRequestHeader(i, this._opts.extraHeaders[i]);
1178              }
1179            }
1180          }
1181        } catch (e) {}
1182        if ("POST" === this._method) {
1183          try {
1184            xhr.setRequestHeader("Content-type", "text/plain;charset=UTF-8");
1185          } catch (e) {}
1186        }
1187        try {
1188          xhr.setRequestHeader("Accept", "*/*");
1189        } catch (e) {}
1190        (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);
1191        // ie6 check
1192        if ("withCredentials" in xhr) {
1193          xhr.withCredentials = this._opts.withCredentials;
1194        }
1195        if (this._opts.requestTimeout) {
1196          xhr.timeout = this._opts.requestTimeout;
1197        }
1198        xhr.onreadystatechange = function () {
1199          var _a;
1200          if (xhr.readyState === 3) {
1201            (_a = _this5._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(
1202            // @ts-ignore
1203            xhr.getResponseHeader("set-cookie"));
1204          }
1205          if (4 !== xhr.readyState) return;
1206          if (200 === xhr.status || 1223 === xhr.status) {
1207            _this5._onLoad();
1208          } else {
1209            // make sure the `error` event handler that's user-set
1210            // does not throw in the same tick and gets caught here
1211            _this5.setTimeoutFn(function () {
1212              _this5._onError(typeof xhr.status === "number" ? xhr.status : 0);
1213            }, 0);
1214          }
1215        };
1216        xhr.send(this._data);
1217      } catch (e) {
1218        // Need to defer since .create() is called directly from the constructor
1219        // and thus the 'error' event can only be only bound *after* this exception
1220        // occurs.  Therefore, also, we cannot throw here at all.
1221        this.setTimeoutFn(function () {
1222          _this5._onError(e);
1223        }, 0);
1224        return;
1225      }
1226      if (typeof document !== "undefined") {
1227        this._index = Request.requestsCount++;
1228        Request.requests[this._index] = this;
1229      }
1230    }
1231    /**
1232     * Called upon error.
1233     *
1234     * @private
1235     */;
1236    _proto2._onError = function _onError(err) {
1237      this.emitReserved("error", err, this._xhr);
1238      this._cleanup(true);
1239    }
1240    /**
1241     * Cleans up house.
1242     *
1243     * @private
1244     */;
1245    _proto2._cleanup = function _cleanup(fromError) {
1246      if ("undefined" === typeof this._xhr || null === this._xhr) {
1247        return;
1248      }
1249      this._xhr.onreadystatechange = empty;
1250      if (fromError) {
1251        try {
1252          this._xhr.abort();
1253        } catch (e) {}
1254      }
1255      if (typeof document !== "undefined") {
1256        delete Request.requests[this._index];
1257      }
1258      this._xhr = null;
1259    }
1260    /**
1261     * Called upon load.
1262     *
1263     * @private
1264     */;
1265    _proto2._onLoad = function _onLoad() {
1266      var data = this._xhr.responseText;
1267      if (data !== null) {
1268        this.emitReserved("data", data);
1269        this.emitReserved("success");
1270        this._cleanup();
1271      }
1272    }
1273    /**
1274     * Aborts the request.
1275     *
1276     * @package
1277     */;
1278    _proto2.abort = function abort() {
1279      this._cleanup();
1280    };
1281    return Request;
1282  }(Emitter);
1283  Request.requestsCount = 0;
1284  Request.requests = {};
1285  /**
1286   * Aborts pending requests when unloading the window. This is needed to prevent
1287   * memory leaks (e.g. when using IE) and to ensure that no spurious error is
1288   * emitted.
1289   */
1290  if (typeof document !== "undefined") {
1291    // @ts-ignore
1292    if (typeof attachEvent === "function") {
1293      // @ts-ignore
1294      attachEvent("onunload", unloadHandler);
1295    } else if (typeof addEventListener === "function") {
1296      var terminationEvent = "onpagehide" in globalThisShim ? "pagehide" : "unload";
1297      addEventListener(terminationEvent, unloadHandler, false);
1298    }
1299  }
1300  function unloadHandler() {
1301    for (var i in Request.requests) {
1302      if (Request.requests.hasOwnProperty(i)) {
1303        Request.requests[i].abort();
1304      }
1305    }
1306  }
1307  var hasXHR2 = function () {
1308    var xhr = newRequest({
1309      xdomain: false
1310    });
1311    return xhr && xhr.responseType !== null;
1312  }();
1313  /**
1314   * HTTP long-polling based on the built-in `XMLHttpRequest` object.
1315   *
1316   * Usage: browser
1317   *
1318   * @see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
1319   */
1320  var XHR = /*#__PURE__*/function (_BaseXHR) {
1321    function XHR(opts) {
1322      var _this6;
1323      _this6 = _BaseXHR.call(this, opts) || this;
1324      var forceBase64 = opts && opts.forceBase64;
1325      _this6.supportsBinary = hasXHR2 && !forceBase64;
1326      return _this6;
1327    }
1328    _inheritsLoose(XHR, _BaseXHR);
1329    var _proto3 = XHR.prototype;
1330    _proto3.request = function request() {
1331      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1332      _extends(opts, {
1333        xd: this.xd
1334      }, this.opts);
1335      return new Request(newRequest, this.uri(), opts);
1336    };
1337    return XHR;
1338  }(BaseXHR);
1339  function newRequest(opts) {
1340    var xdomain = opts.xdomain;
1341    // XMLHttpRequest can be disabled on IE
1342    try {
1343      if ("undefined" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {
1344        return new XMLHttpRequest();
1345      }
1346    } catch (e) {}
1347    if (!xdomain) {
1348      try {
1349        return new globalThisShim[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP");
1350      } catch (e) {}
1351    }
1352  }
1353
1354  // detect ReactNative environment
1355  var isReactNative = typeof navigator !== "undefined" && typeof navigator.product === "string" && navigator.product.toLowerCase() === "reactnative";
1356  var BaseWS = /*#__PURE__*/function (_Transport) {
1357    function BaseWS() {
1358      return _Transport.apply(this, arguments) || this;
1359    }
1360    _inheritsLoose(BaseWS, _Transport);
1361    var _proto = BaseWS.prototype;
1362    _proto.doOpen = function doOpen() {
1363      var uri = this.uri();
1364      var protocols = this.opts.protocols;
1365      // React Native only supports the 'headers' option, and will print a warning if anything else is passed
1366      var opts = isReactNative ? {} : pick(this.opts, "agent", "perMessageDeflate", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "localAddress", "protocolVersion", "origin", "maxPayload", "family", "checkServerIdentity");
1367      if (this.opts.extraHeaders) {
1368        opts.headers = this.opts.extraHeaders;
1369      }
1370      try {
1371        this.ws = this.createSocket(uri, protocols, opts);
1372      } catch (err) {
1373        return this.emitReserved("error", err);
1374      }
1375      this.ws.binaryType = this.socket.binaryType;
1376      this.addEventListeners();
1377    }
1378    /**
1379     * Adds event listeners to the socket
1380     *
1381     * @private
1382     */;
1383    _proto.addEventListeners = function addEventListeners() {
1384      var _this = this;
1385      this.ws.onopen = function () {
1386        if (_this.opts.autoUnref) {
1387          _this.ws._socket.unref();
1388        }
1389        _this.onOpen();
1390      };
1391      this.ws.onclose = function (closeEvent) {
1392        return _this.onClose({
1393          description: "websocket connection closed",
1394          context: closeEvent
1395        });
1396      };
1397      this.ws.onmessage = function (ev) {
1398        return _this.onData(ev.data);
1399      };
1400      this.ws.onerror = function (e) {
1401        return _this.onError("websocket error", e);
1402      };
1403    };
1404    _proto.write = function write(packets) {
1405      var _this2 = this;
1406      this.writable = false;
1407      // encodePacket efficient as it uses WS framing
1408      // no need for encodePayload
1409      var _loop = function _loop() {
1410        var packet = packets[i];
1411        var lastPacket = i === packets.length - 1;
1412        encodePacket(packet, _this2.supportsBinary, function (data) {
1413          // Sometimes the websocket has already been closed but the browser didn't
1414          // have a chance of informing us about it yet, in that case send will
1415          // throw an error
1416          try {
1417            _this2.doWrite(packet, data);
1418          } catch (e) {}
1419          if (lastPacket) {
1420            // fake drain
1421            // defer to next tick to allow Socket to clear writeBuffer
1422            nextTick(function () {
1423              _this2.writable = true;
1424              _this2.emitReserved("drain");
1425            }, _this2.setTimeoutFn);
1426          }
1427        });
1428      };
1429      for (var i = 0; i < packets.length; i++) {
1430        _loop();
1431      }
1432    };
1433    _proto.doClose = function doClose() {
1434      if (typeof this.ws !== "undefined") {
1435        this.ws.onerror = function () {};
1436        this.ws.close();
1437        this.ws = null;
1438      }
1439    }
1440    /**
1441     * Generates uri for connection.
1442     *
1443     * @private
1444     */;
1445    _proto.uri = function uri() {
1446      var schema = this.opts.secure ? "wss" : "ws";
1447      var query = this.query || {};
1448      // append timestamp to URI
1449      if (this.opts.timestampRequests) {
1450        query[this.opts.timestampParam] = randomString();
1451      }
1452      // communicate binary support capabilities
1453      if (!this.supportsBinary) {
1454        query.b64 = 1;
1455      }
1456      return this.createUri(schema, query);
1457    };
1458    return _createClass(BaseWS, [{
1459      key: "name",
1460      get: function get() {
1461        return "websocket";
1462      }
1463    }]);
1464  }(Transport);
1465  var WebSocketCtor = globalThisShim.WebSocket || globalThisShim.MozWebSocket;
1466  /**
1467   * WebSocket transport based on the built-in `WebSocket` object.
1468   *
1469   * Usage: browser, Node.js (since v21), Deno, Bun
1470   *
1471   * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
1472   * @see https://caniuse.com/mdn-api_websocket
1473   * @see https://nodejs.org/api/globals.html#websocket
1474   */
1475  var WS = /*#__PURE__*/function (_BaseWS) {
1476    function WS() {
1477      return _BaseWS.apply(this, arguments) || this;
1478    }
1479    _inheritsLoose(WS, _BaseWS);
1480    var _proto2 = WS.prototype;
1481    _proto2.createSocket = function createSocket(uri, protocols, opts) {
1482      return !isReactNative ? protocols ? new WebSocketCtor(uri, protocols) : new WebSocketCtor(uri) : new WebSocketCtor(uri, protocols, opts);
1483    };
1484    _proto2.doWrite = function doWrite(_packet, data) {
1485      this.ws.send(data);
1486    };
1487    return WS;
1488  }(BaseWS);
1489
1490  /**
1491   * WebTransport transport based on the built-in `WebTransport` object.
1492   *
1493   * Usage: browser, Node.js (with the `@fails-components/webtransport` package)
1494   *
1495   * @see https://developer.mozilla.org/en-US/docs/Web/API/WebTransport
1496   * @see https://caniuse.com/webtransport
1497   */
1498  var WT = /*#__PURE__*/function (_Transport) {
1499    function WT() {
1500      return _Transport.apply(this, arguments) || this;
1501    }
1502    _inheritsLoose(WT, _Transport);
1503    var _proto = WT.prototype;
1504    _proto.doOpen = function doOpen() {
1505      var _this = this;
1506      try {
1507        // @ts-ignore
1508        this._transport = new WebTransport(this.createUri("https"), this.opts.transportOptions[this.name]);
1509      } catch (err) {
1510        return this.emitReserved("error", err);
1511      }
1512      this._transport.closed.then(function () {
1513        _this.onClose();
1514      })["catch"](function (err) {
1515        _this.onError("webtransport error", err);
1516      });
1517      // note: we could have used async/await, but that would require some additional polyfills
1518      this._transport.ready.then(function () {
1519        _this._transport.createBidirectionalStream().then(function (stream) {
1520          var decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, _this.socket.binaryType);
1521          var reader = stream.readable.pipeThrough(decoderStream).getReader();
1522          var encoderStream = createPacketEncoderStream();
1523          encoderStream.readable.pipeTo(stream.writable);
1524          _this._writer = encoderStream.writable.getWriter();
1525          var read = function read() {
1526            reader.read().then(function (_ref) {
1527              var done = _ref.done,
1528                value = _ref.value;
1529              if (done) {
1530                return;
1531              }
1532              _this.onPacket(value);
1533              read();
1534            })["catch"](function (err) {});
1535          };
1536          read();
1537          var packet = {
1538            type: "open"
1539          };
1540          if (_this.query.sid) {
1541            packet.data = "{\"sid\":\"".concat(_this.query.sid, "\"}");
1542          }
1543          _this._writer.write(packet).then(function () {
1544            return _this.onOpen();
1545          });
1546        });
1547      });
1548    };
1549    _proto.write = function write(packets) {
1550      var _this2 = this;
1551      this.writable = false;
1552      var _loop = function _loop() {
1553        var packet = packets[i];
1554        var lastPacket = i === packets.length - 1;
1555        _this2._writer.write(packet).then(function () {
1556          if (lastPacket) {
1557            nextTick(function () {
1558              _this2.writable = true;
1559              _this2.emitReserved("drain");
1560            }, _this2.setTimeoutFn);
1561          }
1562        });
1563      };
1564      for (var i = 0; i < packets.length; i++) {
1565        _loop();
1566      }
1567    };
1568    _proto.doClose = function doClose() {
1569      var _a;
1570      (_a = this._transport) === null || _a === void 0 ? void 0 : _a.close();
1571    };
1572    return _createClass(WT, [{
1573      key: "name",
1574      get: function get() {
1575        return "webtransport";
1576      }
1577    }]);
1578  }(Transport);
1579
1580  var transports = {
1581    websocket: WS,
1582    webtransport: WT,
1583    polling: XHR
1584  };
1585
1586  // imported from https://github.com/galkn/parseuri
1587  /**
1588   * Parses a URI
1589   *
1590   * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.
1591   *
1592   * See:
1593   * - https://developer.mozilla.org/en-US/docs/Web/API/URL
1594   * - https://caniuse.com/url
1595   * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B
1596   *
1597   * History of the parse() method:
1598   * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c
1599   * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3
1600   * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242
1601   *
1602   * @author Steven Levithan <stevenlevithan.com> (MIT license)
1603   * @api private
1604   */
1605  var re = /^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;
1606  var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'];
1607  function parse(str) {
1608    if (str.length > 8000) {
1609      throw "URI too long";
1610    }
1611    var src = str,
1612      b = str.indexOf('['),
1613      e = str.indexOf(']');
1614    if (b != -1 && e != -1) {
1615      str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);
1616    }
1617    var m = re.exec(str || ''),
1618      uri = {},
1619      i = 14;
1620    while (i--) {
1621      uri[parts[i]] = m[i] || '';
1622    }
1623    if (b != -1 && e != -1) {
1624      uri.source = src;
1625      uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');
1626      uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');
1627      uri.ipv6uri = true;
1628    }
1629    uri.pathNames = pathNames(uri, uri['path']);
1630    uri.queryKey = queryKey(uri, uri['query']);
1631    return uri;
1632  }
1633  function pathNames(obj, path) {
1634    var regx = /\/{2,9}/g,
1635      names = path.replace(regx, "/").split("/");
1636    if (path.slice(0, 1) == '/' || path.length === 0) {
1637      names.splice(0, 1);
1638    }
1639    if (path.slice(-1) == '/') {
1640      names.splice(names.length - 1, 1);
1641    }
1642    return names;
1643  }
1644  function queryKey(uri, query) {
1645    var data = {};
1646    query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {
1647      if ($1) {
1648        data[$1] = $2;
1649      }
1650    });
1651    return data;
1652  }
1653
1654  var withEventListeners = typeof addEventListener === "function" && typeof removeEventListener === "function";
1655  var OFFLINE_EVENT_LISTENERS = [];
1656  if (withEventListeners) {
1657    // within a ServiceWorker, any event handler for the 'offline' event must be added on the initial evaluation of the
1658    // script, so we create one single event listener here which will forward the event to the socket instances
1659    addEventListener("offline", function () {
1660      OFFLINE_EVENT_LISTENERS.forEach(function (listener) {
1661        return listener();
1662      });
1663    }, false);
1664  }
1665  /**
1666   * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
1667   * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
1668   *
1669   * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that
1670   * successfully establishes the connection.
1671   *
1672   * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.
1673   *
1674   * @example
1675   * import { SocketWithoutUpgrade, WebSocket } from "engine.io-client";
1676   *
1677   * const socket = new SocketWithoutUpgrade({
1678   *   transports: [WebSocket]
1679   * });
1680   *
1681   * socket.on("open", () => {
1682   *   socket.send("hello");
1683   * });
1684   *
1685   * @see SocketWithUpgrade
1686   * @see Socket
1687   */
1688  var SocketWithoutUpgrade = /*#__PURE__*/function (_Emitter) {
1689    /**
1690     * Socket constructor.
1691     *
1692     * @param {String|Object} uri - uri or options
1693     * @param {Object} opts - options
1694     */
1695    function SocketWithoutUpgrade(uri, opts) {
1696      var _this;
1697      _this = _Emitter.call(this) || this;
1698      _this.binaryType = defaultBinaryType;
1699      _this.writeBuffer = [];
1700      _this._prevBufferLen = 0;
1701      _this._pingInterval = -1;
1702      _this._pingTimeout = -1;
1703      _this._maxPayload = -1;
1704      /**
1705       * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the
1706       * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.
1707       */
1708      _this._pingTimeoutTime = Infinity;
1709      if (uri && "object" === _typeof(uri)) {
1710        opts = uri;
1711        uri = null;
1712      }
1713      if (uri) {
1714        var parsedUri = parse(uri);
1715        opts.hostname = parsedUri.host;
1716        opts.secure = parsedUri.protocol === "https" || parsedUri.protocol === "wss";
1717        opts.port = parsedUri.port;
1718        if (parsedUri.query) opts.query = parsedUri.query;
1719      } else if (opts.host) {
1720        opts.hostname = parse(opts.host).host;
1721      }
1722      installTimerFunctions(_this, opts);
1723      _this.secure = null != opts.secure ? opts.secure : typeof location !== "undefined" && "https:" === location.protocol;
1724      if (opts.hostname && !opts.port) {
1725        // if no port is specified manually, use the protocol default
1726        opts.port = _this.secure ? "443" : "80";
1727      }
1728      _this.hostname = opts.hostname || (typeof location !== "undefined" ? location.hostname : "localhost");
1729      _this.port = opts.port || (typeof location !== "undefined" && location.port ? location.port : _this.secure ? "443" : "80");
1730      _this.transports = [];
1731      _this._transportsByName = {};
1732      opts.transports.forEach(function (t) {
1733        var transportName = t.prototype.name;
1734        _this.transports.push(transportName);
1735        _this._transportsByName[transportName] = t;
1736      });
1737      _this.opts = _extends({
1738        path: "/engine.io",
1739        agent: false,
1740        withCredentials: false,
1741        upgrade: true,
1742        timestampParam: "t",
1743        rememberUpgrade: false,
1744        addTrailingSlash: true,
1745        rejectUnauthorized: true,
1746        perMessageDeflate: {
1747          threshold: 1024
1748        },
1749        transportOptions: {},
1750        closeOnBeforeunload: false
1751      }, opts);
1752      _this.opts.path = _this.opts.path.replace(/\/$/, "") + (_this.opts.addTrailingSlash ? "/" : "");
1753      if (typeof _this.opts.query === "string") {
1754        _this.opts.query = decode(_this.opts.query);
1755      }
1756      if (withEventListeners) {
1757        if (_this.opts.closeOnBeforeunload) {
1758          // Firefox closes the connection when the "beforeunload" event is emitted but not Chrome. This event listener
1759          // ensures every browser behaves the same (no "disconnect" event at the Socket.IO level when the page is
1760          // closed/reloaded)
1761          _this._beforeunloadEventListener = function () {
1762            if (_this.transport) {
1763              // silently close the transport
1764              _this.transport.removeAllListeners();
1765              _this.transport.close();
1766            }
1767          };
1768          addEventListener("beforeunload", _this._beforeunloadEventListener, false);
1769        }
1770        if (_this.hostname !== "localhost") {
1771          _this._offlineEventListener = function () {
1772            _this._onClose("transport close", {
1773              description: "network connection lost"
1774            });
1775          };
1776          OFFLINE_EVENT_LISTENERS.push(_this._offlineEventListener);
1777        }
1778      }
1779      if (_this.opts.withCredentials) {
1780        _this._cookieJar = createCookieJar();
1781      }
1782      _this._open();
1783      return _this;
1784    }
1785    /**
1786     * Creates transport of the given type.
1787     *
1788     * @param {String} name - transport name
1789     * @return {Transport}
1790     * @private
1791     */
1792    _inheritsLoose(SocketWithoutUpgrade, _Emitter);
1793    var _proto = SocketWithoutUpgrade.prototype;
1794    _proto.createTransport = function createTransport(name) {
1795      var query = _extends({}, this.opts.query);
1796      // append engine.io protocol identifier
1797      query.EIO = protocol$1;
1798      // transport name
1799      query.transport = name;
1800      // session id if we already have one
1801      if (this.id) query.sid = this.id;
1802      var opts = _extends({}, this.opts, {
1803        query: query,
1804        socket: this,
1805        hostname: this.hostname,
1806        secure: this.secure,
1807        port: this.port
1808      }, this.opts.transportOptions[name]);
1809      return new this._transportsByName[name](opts);
1810    }
1811    /**
1812     * Initializes transport to use and starts probe.
1813     *
1814     * @private
1815     */;
1816    _proto._open = function _open() {
1817      var _this2 = this;
1818      if (this.transports.length === 0) {
1819        // Emit error on next tick so it can be listened to
1820        this.setTimeoutFn(function () {
1821          _this2.emitReserved("error", "No transports available");
1822        }, 0);
1823        return;
1824      }
1825      var transportName = this.opts.rememberUpgrade && SocketWithoutUpgrade.priorWebsocketSuccess && this.transports.indexOf("websocket") !== -1 ? "websocket" : this.transports[0];
1826      this.readyState = "opening";
1827      var transport = this.createTransport(transportName);
1828      transport.open();
1829      this.setTransport(transport);
1830    }
1831    /**
1832     * Sets the current transport. Disables the existing one (if any).
1833     *
1834     * @private
1835     */;
1836    _proto.setTransport = function setTransport(transport) {
1837      var _this3 = this;
1838      if (this.transport) {
1839        this.transport.removeAllListeners();
1840      }
1841      // set up transport
1842      this.transport = transport;
1843      // set up transport listeners
1844      transport.on("drain", this._onDrain.bind(this)).on("packet", this._onPacket.bind(this)).on("error", this._onError.bind(this)).on("close", function (reason) {
1845        return _this3._onClose("transport close", reason);
1846      });
1847    }
1848    /**
1849     * Called when connection is deemed open.
1850     *
1851     * @private
1852     */;
1853    _proto.onOpen = function onOpen() {
1854      this.readyState = "open";
1855      SocketWithoutUpgrade.priorWebsocketSuccess = "websocket" === this.transport.name;
1856      this.emitReserved("open");
1857      this.flush();
1858    }
1859    /**
1860     * Handles a packet.
1861     *
1862     * @private
1863     */;
1864    _proto._onPacket = function _onPacket(packet) {
1865      if ("opening" === this.readyState || "open" === this.readyState || "closing" === this.readyState) {
1866        this.emitReserved("packet", packet);
1867        // Socket is live - any packet counts
1868        this.emitReserved("heartbeat");
1869        switch (packet.type) {
1870          case "open":
1871            this.onHandshake(JSON.parse(packet.data));
1872            break;
1873          case "ping":
1874            this._sendPacket("pong");
1875            this.emitReserved("ping");
1876            this.emitReserved("pong");
1877            this._resetPingTimeout();
1878            break;
1879          case "error":
1880            var err = new Error("server error");
1881            // @ts-ignore
1882            err.code = packet.data;
1883            this._onError(err);
1884            break;
1885          case "message":
1886            this.emitReserved("data", packet.data);
1887            this.emitReserved("message", packet.data);
1888            break;
1889        }
1890      }
1891    }
1892    /**
1893     * Called upon handshake completion.
1894     *
1895     * @param {Object} data - handshake obj
1896     * @private
1897     */;
1898    _proto.onHandshake = function onHandshake(data) {
1899      this.emitReserved("handshake", data);
1900      this.id = data.sid;
1901      this.transport.query.sid = data.sid;
1902      this._pingInterval = data.pingInterval;
1903      this._pingTimeout = data.pingTimeout;
1904      this._maxPayload = data.maxPayload;
1905      this.onOpen();
1906      // In case open handler closes socket
1907      if ("closed" === this.readyState) return;
1908      this._resetPingTimeout();
1909    }
1910    /**
1911     * Sets and resets ping timeout timer based on server pings.
1912     *
1913     * @private
1914     */;
1915    _proto._resetPingTimeout = function _resetPingTimeout() {
1916      var _this4 = this;
1917      this.clearTimeoutFn(this._pingTimeoutTimer);
1918      var delay = this._pingInterval + this._pingTimeout;
1919      this._pingTimeoutTime = Date.now() + delay;
1920      this._pingTimeoutTimer = this.setTimeoutFn(function () {
1921        _this4._onClose("ping timeout");
1922      }, delay);
1923      if (this.opts.autoUnref) {
1924        this._pingTimeoutTimer.unref();
1925      }
1926    }
1927    /**
1928     * Called on `drain` event
1929     *
1930     * @private
1931     */;
1932    _proto._onDrain = function _onDrain() {
1933      this.writeBuffer.splice(0, this._prevBufferLen);
1934      // setting prevBufferLen = 0 is very important
1935      // for example, when upgrading, upgrade packet is sent over,
1936      // and a nonzero prevBufferLen could cause problems on `drain`
1937      this._prevBufferLen = 0;
1938      if (0 === this.writeBuffer.length) {
1939        this.emitReserved("drain");
1940      } else {
1941        this.flush();
1942      }
1943    }
1944    /**
1945     * Flush write buffers.
1946     *
1947     * @private
1948     */;
1949    _proto.flush = function flush() {
1950      if ("closed" !== this.readyState && this.transport.writable && !this.upgrading && this.writeBuffer.length) {
1951        var packets = this._getWritablePackets();
1952        this.transport.send(packets);
1953        // keep track of current length of writeBuffer
1954        // splice writeBuffer and callbackBuffer on `drain`
1955        this._prevBufferLen = packets.length;
1956        this.emitReserved("flush");
1957      }
1958    }
1959    /**
1960     * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP
1961     * long-polling)
1962     *
1963     * @private
1964     */;
1965    _proto._getWritablePackets = function _getWritablePackets() {
1966      var shouldCheckPayloadSize = this._maxPayload && this.transport.name === "polling" && this.writeBuffer.length > 1;
1967      if (!shouldCheckPayloadSize) {
1968        return this.writeBuffer;
1969      }
1970      var payloadSize = 1; // first packet type
1971      for (var i = 0; i < this.writeBuffer.length; i++) {
1972        var data = this.writeBuffer[i].data;
1973        if (data) {
1974          payloadSize += byteLength(data);
1975        }
1976        if (i > 0 && payloadSize > this._maxPayload) {
1977          return this.writeBuffer.slice(0, i);
1978        }
1979        payloadSize += 2; // separator + packet type
1980      }
1981      return this.writeBuffer;
1982    }
1983    /**
1984     * Checks whether the heartbeat timer has expired but the socket has not yet been notified.
1985     *
1986     * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the
1987     * `write()` method then the message would not be buffered by the Socket.IO client.
1988     *
1989     * @return {boolean}
1990     * @private
1991     */
1992    /* private */;
1993    _proto._hasPingExpired = function _hasPingExpired() {
1994      var _this5 = this;
1995      if (!this._pingTimeoutTime) return true;
1996      var hasExpired = Date.now() > this._pingTimeoutTime;
1997      if (hasExpired) {
1998        this._pingTimeoutTime = 0;
1999        nextTick(function () {
2000          _this5._onClose("ping timeout");
2001        }, this.setTimeoutFn);
2002      }
2003      return hasExpired;
2004    }
2005    /**
2006     * Sends a message.
2007     *
2008     * @param {String} msg - message.
2009     * @param {Object} options.
2010     * @param {Function} fn - callback function.
2011     * @return {Socket} for chaining.
2012     */;
2013    _proto.write = function write(msg, options, fn) {
2014      this._sendPacket("message", msg, options, fn);
2015      return this;
2016    }
2017    /**
2018     * Sends a message. Alias of {@link Socket#write}.
2019     *
2020     * @param {String} msg - message.
2021     * @param {Object} options.
2022     * @param {Function} fn - callback function.
2023     * @return {Socket} for chaining.
2024     */;
2025    _proto.send = function send(msg, options, fn) {
2026      this._sendPacket("message", msg, options, fn);
2027      return this;
2028    }
2029    /**
2030     * Sends a packet.
2031     *
2032     * @param {String} type: packet type.
2033     * @param {String} data.
2034     * @param {Object} options.
2035     * @param {Function} fn - callback function.
2036     * @private
2037     */;
2038    _proto._sendPacket = function _sendPacket(type, data, options, fn) {
2039      if ("function" === typeof data) {
2040        fn = data;
2041        data = undefined;
2042      }
2043      if ("function" === typeof options) {
2044        fn = options;
2045        options = null;
2046      }
2047      if ("closing" === this.readyState || "closed" === this.readyState) {
2048        return;
2049      }
2050      options = options || {};
2051      options.compress = false !== options.compress;
2052      var packet = {
2053        type: type,
2054        data: data,
2055        options: options
2056      };
2057      this.emitReserved("packetCreate", packet);
2058      this.writeBuffer.push(packet);
2059      if (fn) this.once("flush", fn);
2060      this.flush();
2061    }
2062    /**
2063     * Closes the connection.
2064     */;
2065    _proto.close = function close() {
2066      var _this6 = this;
2067      var close = function close() {
2068        _this6._onClose("forced close");
2069        _this6.transport.close();
2070      };
2071      var cleanupAndClose = function cleanupAndClose() {
2072        _this6.off("upgrade", cleanupAndClose);
2073        _this6.off("upgradeError", cleanupAndClose);
2074        close();
2075      };
2076      var waitForUpgrade = function waitForUpgrade() {
2077        // wait for upgrade to finish since we can't send packets while pausing a transport
2078        _this6.once("upgrade", cleanupAndClose);
2079        _this6.once("upgradeError", cleanupAndClose);
2080      };
2081      if ("opening" === this.readyState || "open" === this.readyState) {
2082        this.readyState = "closing";
2083        if (this.writeBuffer.length) {
2084          this.once("drain", function () {
2085            if (_this6.upgrading) {
2086              waitForUpgrade();
2087            } else {
2088              close();
2089            }
2090          });
2091        } else if (this.upgrading) {
2092          waitForUpgrade();
2093        } else {
2094          close();
2095        }
2096      }
2097      return this;
2098    }
2099    /**
2100     * Called upon transport error
2101     *
2102     * @private
2103     */;
2104    _proto._onError = function _onError(err) {
2105      SocketWithoutUpgrade.priorWebsocketSuccess = false;
2106      if (this.opts.tryAllTransports && this.transports.length > 1 && this.readyState === "opening") {
2107        this.transports.shift();
2108        return this._open();
2109      }
2110      this.emitReserved("error", err);
2111      this._onClose("transport error", err);
2112    }
2113    /**
2114     * Called upon transport close.
2115     *
2116     * @private
2117     */;
2118    _proto._onClose = function _onClose(reason, description) {
2119      if ("opening" === this.readyState || "open" === this.readyState || "closing" === this.readyState) {
2120        // clear timers
2121        this.clearTimeoutFn(this._pingTimeoutTimer);
2122        // stop event from firing again for transport
2123        this.transport.removeAllListeners("close");
2124        // ensure transport won't stay open
2125        this.transport.close();
2126        // ignore further transport communication
2127        this.transport.removeAllListeners();
2128        if (withEventListeners) {
2129          if (this._beforeunloadEventListener) {
2130            removeEventListener("beforeunload", this._beforeunloadEventListener, false);
2131          }
2132          if (this._offlineEventListener) {
2133            var i = OFFLINE_EVENT_LISTENERS.indexOf(this._offlineEventListener);
2134            if (i !== -1) {
2135              OFFLINE_EVENT_LISTENERS.splice(i, 1);
2136            }
2137          }
2138        }
2139        // set ready state
2140        this.readyState = "closed";
2141        // clear session id
2142        this.id = null;
2143        // emit close event
2144        this.emitReserved("close", reason, description);
2145        // clean buffers after, so users can still
2146        // grab the buffers on `close` event
2147        this.writeBuffer = [];
2148        this._prevBufferLen = 0;
2149      }
2150    };
2151    return SocketWithoutUpgrade;
2152  }(Emitter);
2153  SocketWithoutUpgrade.protocol = protocol$1;
2154  /**
2155   * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
2156   * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
2157   *
2158   * This class comes with an upgrade mechanism, which means that once the connection is established with the first
2159   * low-level transport, it will try to upgrade to a better transport.
2160   *
2161   * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.
2162   *
2163   * @example
2164   * import { SocketWithUpgrade, WebSocket } from "engine.io-client";
2165   *
2166   * const socket = new SocketWithUpgrade({
2167   *   transports: [WebSocket]
2168   * });
2169   *
2170   * socket.on("open", () => {
2171   *   socket.send("hello");
2172   * });
2173   *
2174   * @see SocketWithoutUpgrade
2175   * @see Socket
2176   */
2177  var SocketWithUpgrade = /*#__PURE__*/function (_SocketWithoutUpgrade) {
2178    function SocketWithUpgrade() {
2179      var _this7;
2180      _this7 = _SocketWithoutUpgrade.apply(this, arguments) || this;
2181      _this7._upgrades = [];
2182      return _this7;
2183    }
2184    _inheritsLoose(SocketWithUpgrade, _SocketWithoutUpgrade);
2185    var _proto2 = SocketWithUpgrade.prototype;
2186    _proto2.onOpen = function onOpen() {
2187      _SocketWithoutUpgrade.prototype.onOpen.call(this);
2188      if ("open" === this.readyState && this.opts.upgrade) {
2189        for (var i = 0; i < this._upgrades.length; i++) {
2190          this._probe(this._upgrades[i]);
2191        }
2192      }
2193    }
2194    /**
2195     * Probes a transport.
2196     *
2197     * @param {String} name - transport name
2198     * @private
2199     */;
2200    _proto2._probe = function _probe(name) {
2201      var _this8 = this;
2202      var transport = this.createTransport(name);
2203      var failed = false;
2204      SocketWithoutUpgrade.priorWebsocketSuccess = false;
2205      var onTransportOpen = function onTransportOpen() {
2206        if (failed) return;
2207        transport.send([{
2208          type: "ping",
2209          data: "probe"
2210        }]);
2211        transport.once("packet", function (msg) {
2212          if (failed) return;
2213          if ("pong" === msg.type && "probe" === msg.data) {
2214            _this8.upgrading = true;
2215            _this8.emitReserved("upgrading", transport);
2216            if (!transport) return;
2217            SocketWithoutUpgrade.priorWebsocketSuccess = "websocket" === transport.name;
2218            _this8.transport.pause(function () {
2219              if (failed) return;
2220              if ("closed" === _this8.readyState) return;
2221              cleanup();
2222              _this8.setTransport(transport);
2223              transport.send([{
2224                type: "upgrade"
2225              }]);
2226              _this8.emitReserved("upgrade", transport);
2227              transport = null;
2228              _this8.upgrading = false;
2229              _this8.flush();
2230            });
2231          } else {
2232            var err = new Error("probe error");
2233            // @ts-ignore
2234            err.transport = transport.name;
2235            _this8.emitReserved("upgradeError", err);
2236          }
2237        });
2238      };
2239      function freezeTransport() {
2240        if (failed) return;
2241        // Any callback called by transport should be ignored since now
2242        failed = true;
2243        cleanup();
2244        transport.close();
2245        transport = null;
2246      }
2247      // Handle any error that happens while probing
2248      var onerror = function onerror(err) {
2249        var error = new Error("probe error: " + err);
2250        // @ts-ignore
2251        error.transport = transport.name;
2252        freezeTransport();
2253        _this8.emitReserved("upgradeError", error);
2254      };
2255      function onTransportClose() {
2256        onerror("transport closed");
2257      }
2258      // When the socket is closed while we're probing
2259      function onclose() {
2260        onerror("socket closed");
2261      }
2262      // When the socket is upgraded while we're probing
2263      function onupgrade(to) {
2264        if (transport && to.name !== transport.name) {
2265          freezeTransport();
2266        }
2267      }
2268      // Remove all listeners on the transport and on self
2269      var cleanup = function cleanup() {
2270        transport.removeListener("open", onTransportOpen);
2271        transport.removeListener("error", onerror);
2272        transport.removeListener("close", onTransportClose);
2273        _this8.off("close", onclose);
2274        _this8.off("upgrading", onupgrade);
2275      };
2276      transport.once("open", onTransportOpen);
2277      transport.once("error", onerror);
2278      transport.once("close", onTransportClose);
2279      this.once("close", onclose);
2280      this.once("upgrading", onupgrade);
2281      if (this._upgrades.indexOf("webtransport") !== -1 && name !== "webtransport") {
2282        // favor WebTransport
2283        this.setTimeoutFn(function () {
2284          if (!failed) {
2285            transport.open();
2286          }
2287        }, 200);
2288      } else {
2289        transport.open();
2290      }
2291    };
2292    _proto2.onHandshake = function onHandshake(data) {
2293      this._upgrades = this._filterUpgrades(data.upgrades);
2294      _SocketWithoutUpgrade.prototype.onHandshake.call(this, data);
2295    }
2296    /**
2297     * Filters upgrades, returning only those matching client transports.
2298     *
2299     * @param {Array} upgrades - server upgrades
2300     * @private
2301     */;
2302    _proto2._filterUpgrades = function _filterUpgrades(upgrades) {
2303      var filteredUpgrades = [];
2304      for (var i = 0; i < upgrades.length; i++) {
2305        if (~this.transports.indexOf(upgrades[i])) filteredUpgrades.push(upgrades[i]);
2306      }
2307      return filteredUpgrades;
2308    };
2309    return SocketWithUpgrade;
2310  }(SocketWithoutUpgrade);
2311  /**
2312   * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
2313   * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
2314   *
2315   * This class comes with an upgrade mechanism, which means that once the connection is established with the first
2316   * low-level transport, it will try to upgrade to a better transport.
2317   *
2318   * @example
2319   * import { Socket } from "engine.io-client";
2320   *
2321   * const socket = new Socket();
2322   *
2323   * socket.on("open", () => {
2324   *   socket.send("hello");
2325   * });
2326   *
2327   * @see SocketWithoutUpgrade
2328   * @see SocketWithUpgrade
2329   */
2330  var Socket$1 = /*#__PURE__*/function (_SocketWithUpgrade) {
2331    function Socket(uri) {
2332      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2333      var o = _typeof(uri) === "object" ? uri : opts;
2334      if (!o.transports || o.transports && typeof o.transports[0] === "string") {
2335        o.transports = (o.transports || ["polling", "websocket", "webtransport"]).map(function (transportName) {
2336          return transports[transportName];
2337        }).filter(function (t) {
2338          return !!t;
2339        });
2340      }
2341      return _SocketWithUpgrade.call(this, uri, o) || this;
2342    }
2343    _inheritsLoose(Socket, _SocketWithUpgrade);
2344    return Socket;
2345  }(SocketWithUpgrade);
2346
2347  Socket$1.protocol;
2348
2349  function getDefaultExportFromCjs (x) {
2350  	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
2351  }
2352
2353  var browser = {exports: {}};
2354
2355  var ms;
2356  var hasRequiredMs;
2357  function requireMs() {
2358    if (hasRequiredMs) return ms;
2359    hasRequiredMs = 1;
2360    var s = 1000;
2361    var m = s * 60;
2362    var h = m * 60;
2363    var d = h * 24;
2364    var w = d * 7;
2365    var y = d * 365.25;
2366
2367    /**
2368     * Parse or format the given `val`.
2369     *
2370     * Options:
2371     *
2372     *  - `long` verbose formatting [false]
2373     *
2374     * @param {String|Number} val
2375     * @param {Object} [options]
2376     * @throws {Error} throw an error if val is not a non-empty string or a number
2377     * @return {String|Number}
2378     * @api public
2379     */
2380
2381    ms = function ms(val, options) {
2382      options = options || {};
2383      var type = _typeof(val);
2384      if (type === 'string' && val.length > 0) {
2385        return parse(val);
2386      } else if (type === 'number' && isFinite(val)) {
2387        return options["long"] ? fmtLong(val) : fmtShort(val);
2388      }
2389      throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));
2390    };
2391
2392    /**
2393     * Parse the given `str` and return milliseconds.
2394     *
2395     * @param {String} str
2396     * @return {Number}
2397     * @api private
2398     */
2399
2400    function parse(str) {
2401      str = String(str);
2402      if (str.length > 100) {
2403        return;
2404      }
2405      var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
2406      if (!match) {
2407        return;
2408      }
2409      var n = parseFloat(match[1]);
2410      var type = (match[2] || 'ms').toLowerCase();
2411      switch (type) {
2412        case 'years':
2413        case 'year':
2414        case 'yrs':
2415        case 'yr':
2416        case 'y':
2417          return n * y;
2418        case 'weeks':
2419        case 'week':
2420        case 'w':
2421          return n * w;
2422        case 'days':
2423        case 'day':
2424        case 'd':
2425          return n * d;
2426        case 'hours':
2427        case 'hour':
2428        case 'hrs':
2429        case 'hr':
2430        case 'h':
2431          return n * h;
2432        case 'minutes':
2433        case 'minute':
2434        case 'mins':
2435        case 'min':
2436        case 'm':
2437          return n * m;
2438        case 'seconds':
2439        case 'second':
2440        case 'secs':
2441        case 'sec':
2442        case 's':
2443          return n * s;
2444        case 'milliseconds':
2445        case 'millisecond':
2446        case 'msecs':
2447        case 'msec':
2448        case 'ms':
2449          return n;
2450        default:
2451          return undefined;
2452      }
2453    }
2454
2455    /**
2456     * Short format for `ms`.
2457     *
2458     * @param {Number} ms
2459     * @return {String}
2460     * @api private
2461     */
2462
2463    function fmtShort(ms) {
2464      var msAbs = Math.abs(ms);
2465      if (msAbs >= d) {
2466        return Math.round(ms / d) + 'd';
2467      }
2468      if (msAbs >= h) {
2469        return Math.round(ms / h) + 'h';
2470      }
2471      if (msAbs >= m) {
2472        return Math.round(ms / m) + 'm';
2473      }
2474      if (msAbs >= s) {
2475        return Math.round(ms / s) + 's';
2476      }
2477      return ms + 'ms';
2478    }
2479
2480    /**
2481     * Long format for `ms`.
2482     *
2483     * @param {Number} ms
2484     * @return {String}
2485     * @api private
2486     */
2487
2488    function fmtLong(ms) {
2489      var msAbs = Math.abs(ms);
2490      if (msAbs >= d) {
2491        return plural(ms, msAbs, d, 'day');
2492      }
2493      if (msAbs >= h) {
2494        return plural(ms, msAbs, h, 'hour');
2495      }
2496      if (msAbs >= m) {
2497        return plural(ms, msAbs, m, 'minute');
2498      }
2499      if (msAbs >= s) {
2500        return plural(ms, msAbs, s, 'second');
2501      }
2502      return ms + ' ms';
2503    }
2504
2505    /**
2506     * Pluralization helper.
2507     */
2508
2509    function plural(ms, msAbs, n, name) {
2510      var isPlural = msAbs >= n * 1.5;
2511      return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
2512    }
2513    return ms;
2514  }
2515
2516  /**
2517   * This is the common logic for both the Node.js and web browser
2518   * implementations of `debug()`.
2519   */
2520
2521  function setup(env) {
2522    createDebug.debug = createDebug;
2523    createDebug["default"] = createDebug;
2524    createDebug.coerce = coerce;
2525    createDebug.disable = disable;
2526    createDebug.enable = enable;
2527    createDebug.enabled = enabled;
2528    createDebug.humanize = requireMs();
2529    createDebug.destroy = destroy;
2530    Object.keys(env).forEach(function (key) {
2531      createDebug[key] = env[key];
2532    });
2533
2534    /**
2535    * The currently active debug mode names, and names to skip.
2536    */
2537
2538    createDebug.names = [];
2539    createDebug.skips = [];
2540
2541    /**
2542    * Map of special "%n" handling functions, for the debug "format" argument.
2543    *
2544    * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
2545    */
2546    createDebug.formatters = {};
2547
2548    /**
2549    * Selects a color for a debug namespace
2550    * @param {String} namespace The namespace string for the debug instance to be colored
2551    * @return {Number|String} An ANSI color code for the given namespace
2552    * @api private
2553    */
2554    function selectColor(namespace) {
2555      var hash = 0;
2556      for (var i = 0; i < namespace.length; i++) {
2557        hash = (hash << 5) - hash + namespace.charCodeAt(i);
2558        hash |= 0; // Convert to 32bit integer
2559      }
2560      return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
2561    }
2562    createDebug.selectColor = selectColor;
2563
2564    /**
2565    * Create a debugger with the given `namespace`.
2566    *
2567    * @param {String} namespace
2568    * @return {Function}
2569    * @api public
2570    */
2571    function createDebug(namespace) {
2572      var prevTime;
2573      var enableOverride = null;
2574      var namespacesCache;
2575      var enabledCache;
2576      function debug() {
2577        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2578          args[_key] = arguments[_key];
2579        }
2580        // Disabled?
2581        if (!debug.enabled) {
2582          return;
2583        }
2584        var self = debug;
2585
2586        // Set `diff` timestamp
2587        var curr = Number(new Date());
2588        var ms = curr - (prevTime || curr);
2589        self.diff = ms;
2590        self.prev = prevTime;
2591        self.curr = curr;
2592        prevTime = curr;
2593        args[0] = createDebug.coerce(args[0]);
2594        if (typeof args[0] !== 'string') {
2595          // Anything else let's inspect with %O
2596          args.unshift('%O');
2597        }
2598
2599        // Apply any `formatters` transformations
2600        var index = 0;
2601        args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
2602          // If we encounter an escaped % then don't increase the array index
2603          if (match === '%%') {
2604            return '%';
2605          }
2606          index++;
2607          var formatter = createDebug.formatters[format];
2608          if (typeof formatter === 'function') {
2609            var val = args[index];
2610            match = formatter.call(self, val);
2611
2612            // Now we need to remove `args[index]` since it's inlined in the `format`
2613            args.splice(index, 1);
2614            index--;
2615          }
2616          return match;
2617        });
2618
2619        // Apply env-specific formatting (colors, etc.)
2620        createDebug.formatArgs.call(self, args);
2621        var logFn = self.log || createDebug.log;
2622        logFn.apply(self, args);
2623      }
2624      debug.namespace = namespace;
2625      debug.useColors = createDebug.useColors();
2626      debug.color = createDebug.selectColor(namespace);
2627      debug.extend = extend;
2628      debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
2629
2630      Object.defineProperty(debug, 'enabled', {
2631        enumerable: true,
2632        configurable: false,
2633        get: function get() {
2634          if (enableOverride !== null) {
2635            return enableOverride;
2636          }
2637          if (namespacesCache !== createDebug.namespaces) {
2638            namespacesCache = createDebug.namespaces;
2639            enabledCache = createDebug.enabled(namespace);
2640          }
2641          return enabledCache;
2642        },
2643        set: function set(v) {
2644          enableOverride = v;
2645        }
2646      });
2647
2648      // Env-specific initialization logic for debug instances
2649      if (typeof createDebug.init === 'function') {
2650        createDebug.init(debug);
2651      }
2652      return debug;
2653    }
2654    function extend(namespace, delimiter) {
2655      var newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
2656      newDebug.log = this.log;
2657      return newDebug;
2658    }
2659
2660    /**
2661    * Enables a debug mode by namespaces. This can include modes
2662    * separated by a colon and wildcards.
2663    *
2664    * @param {String} namespaces
2665    * @api public
2666    */
2667    function enable(namespaces) {
2668      createDebug.save(namespaces);
2669      createDebug.namespaces = namespaces;
2670      createDebug.names = [];
2671      createDebug.skips = [];
2672      var 
2672i;
2673      var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
2674      var len = split.length;
2675      for (i = 0; i < len; i++) {
2676        if (!split[i]) {
2677          // ignore empty strings
2678          continue;
2679        }
2680        namespaces = split[i].replace(/\*/g, '.*?');
2681        if (namespaces[0] === '-') {
2682          createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
2683        } else {
2684          createDebug.names.push(new RegExp('^' + namespaces + '$'));
2685        }
2686      }
2687    }
2688
2689    /**
2690    * Disable debug output.
2691    *
2692    * @return {String} namespaces
2693    * @api public
2694    */
2695    function disable() {
2696      var namespaces = [].concat(_toConsumableArray(createDebug.names.map(toNamespace)), _toConsumableArray(createDebug.skips.map(toNamespace).map(function (namespace) {
2697        return '-' + namespace;
2698      }))).join(',');
2699      createDebug.enable('');
2700      return namespaces;
2701    }
2702
2703    /**
2704    * Returns true if the given mode name is enabled, false otherwise.
2705    *
2706    * @param {String} name
2707    * @return {Boolean}
2708    * @api public
2709    */
2710    function enabled(name) {
2711      if (name[name.length - 1] === '*') {
2712        return true;
2713      }
2714      var i;
2715      var len;
2716      for (i = 0, len = createDebug.skips.length; i < len; i++) {
2717        if (createDebug.skips[i].test(name)) {
2718          return false;
2719        }
2720      }
2721      for (i = 0, len = createDebug.names.length; i < len; i++) {
2722        if (createDebug.names[i].test(name)) {
2723          return true;
2724        }
2725      }
2726      return false;
2727    }
2728
2729    /**
2730    * Convert regexp to namespace
2731    *
2732    * @param {RegExp} regxep
2733    * @return {String} namespace
2734    * @api private
2735    */
2736    function toNamespace(regexp) {
2737      return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, '*');
2738    }
2739
2740    /**
2741    * Coerce `val`.
2742    *
2743    * @param {Mixed} val
2744    * @return {Mixed}
2745    * @api private
2746    */
2747    function coerce(val) {
2748      if (val instanceof Error) {
2749        return val.stack || val.message;
2750      }
2751      return val;
2752    }
2753
2754    /**
2755    * XXX DO NOT USE. This is a temporary stub function.
2756    * XXX It WILL be removed in the next major release.
2757    */
2758    function destroy() {
2759      console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
2760    }
2761    createDebug.enable(createDebug.load());
2762    return createDebug;
2763  }
2764  var common = setup;
2765
2766  /* eslint-env browser */
2767  browser.exports;
2768  (function (module, exports) {
2769    /**
2770     * This is the web browser implementation of `debug()`.
2771     */
2772
2773    exports.formatArgs = formatArgs;
2774    exports.save = save;
2775    exports.load = load;
2776    exports.useColors = useColors;
2777    exports.storage = localstorage();
2778    exports.destroy = function () {
2779      var warned = false;
2780      return function () {
2781        if (!warned) {
2782          warned = true;
2783          console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
2784        }
2785      };
2786    }();
2787
2788    /**
2789     * Colors.
2790     */
2791
2792    exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00
vendor: 4,167 bytes, lines 2792-2897
2792FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
2793
2794    /**
2795     * Currently only WebKit-based Web Inspectors, Firefox >= v31,
2796     * and the Firebug extension (any Firefox version) are known
2797     * to support "%c" CSS customizations.
2798     *
2799     * TODO: add a `localStorage` variable to explicitly enable/disable colors
2800     */
2801
2802    // eslint-disable-next-line complexity
2803    function useColors() {
2804      // NB: In an Electron preload script, document will be defined but not fully
2805      // initialized. Since we know we're in Chrome, we'll just detect this case
2806      // explicitly
2807      if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
2808        return true;
2809      }
2810
2811      // Internet Explorer and Edge do not support colors.
2812      if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
2813        return false;
2814      }
2815
2816      // Is webkit? http://stackoverflow.com/a/16459606/376773
2817      // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
2818      return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance ||
2819      // Is firebug? http://stackoverflow.com/a/398120/376773
2820      typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) ||
2821      // Is firefox >= v31?
2822      // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
2823      typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 ||
2824      // Double check webkit in userAgent just in case we are in a worker
2825      typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
2826    }
2827
2828    /**
2829     * Colorize log arguments if enabled.
2830     *
2831     * @api public
2832     */
2833
2834    function formatArgs(args) {
2835      args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);
2836      if (!this.useColors) {
2837        return;
2838      }
2839      var c = 'color: ' + this.color;
2840      args.splice(1, 0, c, 'color: inherit');
2841
2842      // The final "%c" is somewhat tricky, because there could be other
2843      // arguments passed either before or after the %c, so we need to
2844      // figure out the correct index to insert the CSS into
2845      var index = 0;
2846      var lastC = 0;
2847      args[0].replace(/%[a-zA-Z%]/g, function (match) {
2848        if (match === '%%') {
2849          return;
2850        }
2851        index++;
2852        if (match === '%c') {
2853          // We only are interested in the *last* %c
2854          // (the user may have provided their own)
2855          lastC = index;
2856        }
2857      });
2858      args.splice(lastC, 0, c);
2859    }
2860
2861    /**
2862     * Invokes `console.debug()` when available.
2863     * No-op when `console.debug` is not a "function".
2864     * If `console.debug` is not available, falls back
2865     * to `console.log`.
2866     *
2867     * @api public
2868     */
2869    exports.log = console.debug || console.log || function () {};
2870
2871    /**
2872     * Save `namespaces`.
2873     *
2874     * @param {String} namespaces
2875     * @api private
2876     */
2877    function save(namespaces) {
2878      try {
2879        if (namespaces) {
2880          exports.storage.setItem('debug', namespaces);
2881        } else {
2882          exports.storage.removeItem('debug');
2883        }
2884      } catch (error) {
2885        // Swallow
2886        // XXX (@Qix-) should we be logging these?
2887      }
2888    }
2889
2890    /**
2891     * Load `namespaces`.
2892     *
2893     * @return {String} returns the previously persisted debug modes
2894     * @api private
2895     */
2896    function load() {
2897      var r;
2898      try {
2899        r = exports.storage.getItem('debug
vendor: 29,906 bytes, lines 2899-3831
2899');
2900      } catch (error) {
2901        // Swallow
2902        // XXX (@Qix-) should we be logging these?
2903      }
2904
2905      // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
2906      if (!r && typeof process !== 'undefined' && 'env' in process) {
2907        r = process.env.DEBUG;
2908      }
2909      return r;
2910    }
2911
2912    /**
2913     * Localstorage attempts to return the localstorage.
2914     *
2915     * This is necessary because safari throws
2916     * when a user disables cookies/localstorage
2917     * and you attempt to access it.
2918     *
2919     * @return {LocalStorage}
2920     * @api private
2921     */
2922
2923    function localstorage() {
2924      try {
2925        // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
2926        // The Browser also has localStorage in the global context.
2927        return localStorage;
2928      } catch (error) {
2929        // Swallow
2930        // XXX (@Qix-) should we be logging these?
2931      }
2932    }
2933    module.exports = common(exports);
2934    var formatters = module.exports.formatters;
2935
2936    /**
2937     * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
2938     */
2939
2940    formatters.j = function (v) {
2941      try {
2942        return JSON.stringify(v);
2943      } catch (error) {
2944        return '[UnexpectedJSONParseError]: ' + error.message;
2945      }
2946    };
2947  })(browser, browser.exports);
2948  var browserExports = browser.exports;
2949  var debugModule = /*@__PURE__*/getDefaultExportFromCjs(browserExports);
2950
2951  var debug$3 = debugModule("socket.io-client:url"); // debug()
2952  /**
2953   * URL parser.
2954   *
2955   * @param uri - url
2956   * @param path - the request path of the connection
2957   * @param loc - An object meant to mimic window.location.
2958   *        Defaults to window.location.
2959   * @public
2960   */
2961  function url(uri) {
2962    var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
2963    var loc = arguments.length > 2 ? arguments[2] : undefined;
2964    var obj = uri;
2965    // default to window.location
2966    loc = loc || typeof location !== "undefined" && location;
2967    if (null == uri) uri = loc.protocol + "//" + loc.host;
2968    // relative path support
2969    if (typeof uri === "string") {
2970      if ("/" === uri.charAt(0)) {
2971        if ("/" === uri.charAt(1)) {
2972          uri = loc.protocol + uri;
2973        } else {
2974          uri = loc.host + uri;
2975        }
2976      }
2977      if (!/^(https?|wss?):\/\//.test(uri)) {
2978        debug$3("protocol-less url %s", uri);
2979        if ("undefined" !== typeof loc) {
2980          uri = loc.protocol + "//" + uri;
2981        } else {
2982          uri = "https://" + uri;
2983        }
2984      }
2985      // parse
2986      debug$3("parse %s", uri);
2987      obj = parse(uri);
2988    }
2989    // make sure we treat `localhost:80` and `localhost` equally
2990    if (!obj.port) {
2991      if (/^(http|ws)$/.test(obj.protocol)) {
2992        obj.port = "80";
2993      } else if (/^(http|ws)s$/.test(obj.protocol)) {
2994        obj.port = "443";
2995      }
2996    }
2997    obj.path = obj.path || "/";
2998    var ipv6 = obj.host.indexOf(":") !== -1;
2999    var host = ipv6 ? "[" + obj.host + "]" : obj.host;
3000    // define unique id
3001    obj.id = obj.protocol + "://" + host + ":" + obj.port + path;
3002    // define href
3003    obj.href = obj.protocol + "://" + host + (loc && loc.port === obj.port ? "" : ":" + obj.port);
3004    return obj;
3005  }
3006
3007  var withNativeArrayBuffer = typeof ArrayBuffer === "function";
3008  var isView = function isView(obj) {
3009    return typeof ArrayBuffer.isView === "function" ? ArrayBuffer.isView(obj) : obj.buffer instanceof ArrayBuffer;
3010  };
3011  var toString = Object.prototype.toString;
3012  var withNativeBlob = typeof Blob === "function" || typeof Blob !== "undefined" && toString.call(Blob) === "[object BlobConstructor]";
3013  var withNativeFile = typeof File === "function" || typeof File !== "undefined" && toString.call(File) === "[object FileConstructor]";
3014  /**
3015   * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.
3016   *
3017   * @private
3018   */
3019  function isBinary(obj) {
3020    return withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj)) || withNativeBlob && obj instanceof Blob || withNativeFile && obj instanceof File;
3021  }
3022  function hasBinary(obj, toJSON) {
3023    if (!obj || _typeof(obj) !== "object") {
3024      return false;
3025    }
3026    if (Array.isArray(obj)) {
3027      for (var i = 0, l = obj.length; i < l; i++) {
3028        if (hasBinary(obj[i])) {
3029          return true;
3030        }
3031      }
3032      return false;
3033    }
3034    if (isBinary(obj)) {
3035      return true;
3036    }
3037    if (obj.toJSON && typeof obj.toJSON === "function" && arguments.length === 1) {
3038      return hasBinary(obj.toJSON(), true);
3039    }
3040    for (var key in obj) {
3041      if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {
3042        return true;
3043      }
3044    }
3045    return false;
3046  }
3047
3048  /**
3049   * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.
3050   *
3051   * @param {Object} packet - socket.io event packet
3052   * @return {Object} with deconstructed packet and list of buffers
3053   * @public
3054   */
3055  function deconstructPacket(packet) {
3056    var buffers = [];
3057    var packetData = packet.data;
3058    var pack = packet;
3059    pack.data = _deconstructPacket(packetData, buffers);
3060    pack.attachments = buffers.length; // number of binary 'attachments'
3061    return {
3062      packet: pack,
3063      buffers: buffers
3064    };
3065  }
3066  function _deconstructPacket(data, buffers) {
3067    if (!data) return data;
3068    if (isBinary(data)) {
3069      var placeholder = {
3070        _placeholder: true,
3071        num: buffers.length
3072      };
3073      buffers.push(data);
3074      return placeholder;
3075    } else if (Array.isArray(data)) {
3076      var newData = new Array(data.length);
3077      for (var i = 0; i < data.length; i++) {
3078        newData[i] = _deconstructPacket(data[i], buffers);
3079      }
3080      return newData;
3081    } else if (_typeof(data) === "object" && !(data instanceof Date)) {
3082      var _newData = {};
3083      for (var key in data) {
3084        if (Object.prototype.hasOwnProperty.call(data, key)) {
3085          _newData[key] = _deconstructPacket(data[key], buffers);
3086        }
3087      }
3088      return _newData;
3089    }
3090    return data;
3091  }
3092  /**
3093   * Reconstructs a binary packet from its placeholder packet and buffers
3094   *
3095   * @param {Object} packet - event packet with placeholders
3096   * @param {Array} buffers - binary buffers to put in placeholder positions
3097   * @return {Object} reconstructed packet
3098   * @public
3099   */
3100  function reconstructPacket(packet, buffers) {
3101    packet.data = _reconstructPacket(packet.data, buffers);
3102    delete packet.attachments; // no longer useful
3103    return packet;
3104  }
3105  function _reconstructPacket(data, buffers) {
3106    if (!data) return data;
3107    if (data && data._placeholder === true) {
3108      var isIndexValid = typeof data.num === "number" && data.num >= 0 && data.num < buffers.length;
3109      if (isIndexValid) {
3110        return buffers[data.num]; // appropriate buffer (should be natural order anyway)
3111      } else {
3112        throw new Error("illegal attachments");
3113      }
3114    } else if (Array.isArray(data)) {
3115      for (var i = 0; i < data.length; i++) {
3116        data[i] = _reconstructPacket(data[i], buffers);
3117      }
3118    } else if (_typeof(data) === "object") {
3119      for (var key in data) {
3120        if (Object.prototype.hasOwnProperty.call(data, key)) {
3121          data[key] = _reconstructPacket(data[key], buffers);
3122        }
3123      }
3124    }
3125    return data;
3126  }
3127
3128  /**
3129   * These strings must not be used as event names, as they have a special meaning.
3130   */
3131  var RESERVED_EVENTS$1 = ["connect",
3132  // used on the client side
3133  "connect_error",
3134  // used on the client side
3135  "disconnect",
3136  // used on both sides
3137  "disconnecting",
3138  // used on the server side
3139  "newListener",
3140  // used by the Node.js EventEmitter
3141  "removeListener" // used by the Node.js EventEmitter
3142  ];
3143  /**
3144   * Protocol version.
3145   *
3146   * @public
3147   */
3148  var protocol = 5;
3149  var PacketType;
3150  (function (PacketType) {
3151    PacketType[PacketType["CONNECT"] = 0] = "CONNECT";
3152    PacketType[PacketType["DISCONNECT"] = 1] = "DISCONNECT";
3153    PacketType[PacketType["EVENT"] = 2] = "EVENT";
3154    PacketType[PacketType["ACK"] = 3] = "ACK";
3155    PacketType[PacketType["CONNECT_ERROR"] = 4] = "CONNECT_ERROR";
3156    PacketType[PacketType["BINARY_EVENT"] = 5] = "BINARY_EVENT";
3157    PacketType[PacketType["BINARY_ACK"] = 6] = "BINARY_ACK";
3158  })(PacketType || (PacketType = {}));
3159  /**
3160   * A socket.io Encoder instance
3161   */
3162  var Encoder = /*#__PURE__*/function () {
3163    /**
3164     * Encoder constructor
3165     *
3166     * @param {function} replacer - custom replacer to pass down to JSON.parse
3167     */
3168    function Encoder(replacer) {
3169      this.replacer = replacer;
3170    }
3171    /**
3172     * Encode a packet as a single string if non-binary, or as a
3173     * buffer sequence, depending on packet type.
3174     *
3175     * @param {Object} obj - packet object
3176     */
3177    var _proto = Encoder.prototype;
3178    _proto.encode = function encode(obj) {
3179      if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {
3180        if (hasBinary(obj)) {
3181          return this.encodeAsBinary({
3182            type: obj.type === PacketType.EVENT ? PacketType.BINARY_EVENT : PacketType.BINARY_ACK,
3183            nsp: obj.nsp,
3184            data: obj.data,
3185            id: obj.id
3186          });
3187        }
3188      }
3189      return [this.encodeAsString(obj)];
3190    }
3191    /**
3192     * Encode packet as string.
3193     */;
3194    _proto.encodeAsString = function encodeAsString(obj) {
3195      // first is type
3196      var str = "" + obj.type;
3197      // attachments if we have them
3198      if (obj.type === PacketType.BINARY_EVENT || obj.type === PacketType.BINARY_ACK) {
3199        str += obj.attachments + "-";
3200      }
3201      // if we have a namespace other than `/`
3202      // we append it followed by a comma `,`
3203      if (obj.nsp && "/" !== obj.nsp) {
3204        str += obj.nsp + ",";
3205      }
3206      // immediately followed by the id
3207      if (null != obj.id) {
3208        str += obj.id;
3209      }
3210      // json data
3211      if (null != obj.data) {
3212        str += JSON.stringify(obj.data, this.replacer);
3213      }
3214      return str;
3215    }
3216    /**
3217     * Encode packet as 'buffer sequence' by removing blobs, and
3218     * deconstructing packet into object with placeholders and
3219     * a list of buffers.
3220     */;
3221    _proto.encodeAsBinary = function encodeAsBinary(obj) {
3222      var deconstruction = deconstructPacket(obj);
3223      var pack = this.encodeAsString(deconstruction.packet);
3224      var buffers = deconstruction.buffers;
3225      buffers.unshift(pack); // add packet info to beginning of data list
3226      return buffers; // write all the buffers
3227    };
3228    return Encoder;
3229  }();
3230  /**
3231   * A socket.io Decoder instance
3232   *
3233   * @return {Object} decoder
3234   */
3235  var Decoder = /*#__PURE__*/function (_Emitter) {
3236    /**
3237     * Decoder constructor
3238     *
3239     * @param {function} reviver - custom reviver to pass down to JSON.stringify
3240     */
3241    function Decoder(reviver) {
3242      var _this;
3243      _this = _Emitter.call(this) || this;
3244      _this.reviver = reviver;
3245      return _this;
3246    }
3247    /**
3248     * Decodes an encoded packet string into packet JSON.
3249     *
3250     * @param {String} obj - encoded packet
3251     */
3252    _inheritsLoose(Decoder, _Emitter);
3253    var _proto2 = Decoder.prototype;
3254    _proto2.add = function add(obj) {
3255      var packet;
3256      if (typeof obj === "string") {
3257        if (this.reconstructor) {
3258          throw new Error("got plaintext data when reconstructing a packet");
3259        }
3260        packet = this.decodeString(obj);
3261        var isBinaryEvent = packet.type === PacketType.BINARY_EVENT;
3262        if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {
3263          packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;
3264          // binary packet's json
3265          this.reconstructor = new BinaryReconstructor(packet);
3266          // no attachments, labeled binary but no binary data to follow
3267          if (packet.attachments === 0) {
3268            _Emitter.prototype.emitReserved.call(this, "decoded", packet);
3269          }
3270        } else {
3271          // non-binary full packet
3272          _Emitter.prototype.emitReserved.call(this, "decoded", packet);
3273        }
3274      } else if (isBinary(obj) || obj.base64) {
3275        // raw binary data
3276        if (!this.reconstructor) {
3277          throw new Error("got binary data when not reconstructing a packet");
3278        } else {
3279          packet = this.reconstructor.takeBinaryData(obj);
3280          if (packet) {
3281            // received final buffer
3282            this.reconstructor = null;
3283            _Emitter.prototype.emitReserved.call(this, "decoded", packet);
3284          }
3285        }
3286      } else {
3287        throw new Error("Unknown type: " + obj);
3288      }
3289    }
3290    /**
3291     * Decode a packet String (JSON data)
3292     *
3293     * @param {String} str
3294     * @return {Object} packet
3295     */;
3296    _proto2.decodeString = function decodeString(str) {
3297      var i = 0;
3298      // look up type
3299      var p = {
3300        type: Number(str.charAt(0))
3301      };
3302      if (PacketType[p.type] === undefined) {
3303        throw new Error("unknown packet type " + p.type);
3304      }
3305      // look up attachments if type binary
3306      if (p.type === PacketType.BINARY_EVENT || p.type === PacketType.BINARY_ACK) {
3307        var start = i + 1;
3308        while (str.charAt(++i) !== "-" && i != str.length) {}
3309        var buf = str.substring(start, i);
3310        if (buf != Number(buf) || str.charAt(i) !== "-") {
3311          throw new Error("Illegal attachments");
3312        }
3313        p.attachments = Number(buf);
3314      }
3315      // look up namespace (if any)
3316      if ("/" === str.charAt(i + 1)) {
3317        var _start = i + 1;
3318        while (++i) {
3319          var c = str.charAt(i);
3320          if ("," === c) break;
3321          if (i === str.length) break;
3322        }
3323        p.nsp = str.substring(_start, i);
3324      } else {
3325        p.nsp = "/";
3326      }
3327      // look up id
3328      var next = str.charAt(i + 1);
3329      if ("" !== next && Number(next) == next) {
3330        var _start2 = i + 1;
3331        while (++i) {
3332          var _c = str.charAt(i);
3333          if (null == _c || Number(_c) != _c) {
3334            --i;
3335            break;
3336          }
3337          if (i === str.length) break;
3338        }
3339        p.id = Number(str.substring(_start2, i + 1));
3340      }
3341      // look up json data
3342      if (str.charAt(++i)) {
3343        var payload = this.tryParse(str.substr(i));
3344        if (Decoder.isPayloadValid(p.type, payload)) {
3345          p.data = payload;
3346        } else {
3347          throw new Error("invalid payload");
3348        }
3349      }
3350      return p;
3351    };
3352    _proto2.tryParse = function tryParse(str) {
3353      try {
3354        return JSON.parse(str, this.reviver);
3355      } catch (e) {
3356        return false;
3357      }
3358    };
3359    Decoder.isPayloadValid = function isPayloadValid(type, payload) {
3360      switch (type) {
3361        case PacketType.CONNECT:
3362          return isObject(payload);
3363        case PacketType.DISCONNECT:
3364          return payload === undefined;
3365        case PacketType.CONNECT_ERROR:
3366          return typeof payload === "string" || isObject(payload);
3367        case PacketType.EVENT:
3368        case PacketType.BINARY_EVENT:
3369          return Array.isArray(payload) && (typeof payload[0] === "number" || typeof payload[0] === "string" && RESERVED_EVENTS$1.indexOf(payload[0]) === -1);
3370        case PacketType.ACK:
3371        case PacketType.BINARY_ACK:
3372          return Array.isArray(payload);
3373      }
3374    }
3375    /**
3376     * Deallocates a parser's resources
3377     */;
3378    _proto2.destroy = function destroy() {
3379      if (this.reconstructor) {
3380        this.reconstructor.finishedReconstruction();
3381        this.reconstructor = null;
3382      }
3383    };
3384    return Decoder;
3385  }(Emitter);
3386  /**
3387   * A manager of a binary event's 'buffer sequence'. Should
3388   * be constructed whenever a packet of type BINARY_EVENT is
3389   * decoded.
3390   *
3391   * @param {Object} packet
3392   * @return {BinaryReconstructor} initialized reconstructor
3393   */
3394  var BinaryReconstructor = /*#__PURE__*/function () {
3395    function BinaryReconstructor(packet) {
3396      this.packet = packet;
3397      this.buffers = [];
3398      this.reconPack = packet;
3399    }
3400    /**
3401     * Method to be called when binary data received from connection
3402     * after a BINARY_EVENT packet.
3403     *
3404     * @param {Buffer | ArrayBuffer} binData - the raw binary data received
3405     * @return {null | Object} returns null if more binary data is expected or
3406     *   a reconstructed packet object if all buffers have been received.
3407     */
3408    var _proto3 = BinaryReconstructor.prototype;
3409    _proto3.takeBinaryData = function takeBinaryData(binData) {
3410      this.buffers.push(binData);
3411      if (this.buffers.length === this.reconPack.attachments) {
3412        // done with buffer list
3413        var packet = reconstructPacket(this.reconPack, this.buffers);
3414        this.finishedReconstruction();
3415        return packet;
3416      }
3417      return null;
3418    }
3419    /**
3420     * Cleans up binary packet reconstruction variables.
3421     */;
3422    _proto3.finishedReconstruction = function finishedReconstruction() {
3423      this.reconPack = null;
3424      this.buffers = [];
3425    };
3426    return BinaryReconstructor;
3427  }();
3428  function isNamespaceValid(nsp) {
3429    return typeof nsp === "string";
3430  }
3431  // see https://caniuse.com/mdn-javascript_builtins_number_isinteger
3432  var isInteger = Number.isInteger || function (value) {
3433    return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
3434  };
3435  function isAckIdValid(id) {
3436    return id === undefined || isInteger(id);
3437  }
3438  // see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript
3439  function isObject(value) {
3440    return Object.prototype.toString.call(value) === "[object Object]";
3441  }
3442  function isDataValid(type, payload) {
3443    switch (type) {
3444      case PacketType.CONNECT:
3445        return payload === undefined || isObject(payload);
3446      case PacketType.DISCONNECT:
3447        return payload === undefined;
3448      case PacketType.EVENT:
3449        return Array.isArray(payload) && (typeof payload[0] === "number" || typeof payload[0] === "string" && RESERVED_EVENTS$1.indexOf(payload[0]) === -1);
3450      case PacketType.ACK:
3451        return Array.isArray(payload);
3452      case PacketType.CONNECT_ERROR:
3453        return typeof payload === "string" || isObject(payload);
3454      default:
3455        return false;
3456    }
3457  }
3458  function isPacketValid(packet) {
3459    return isNamespaceValid(packet.nsp) && isAckIdValid(packet.id) && isDataValid(packet.type, packet.data);
3460  }
3461
3462  var parser = /*#__PURE__*/Object.freeze({
3463    __proto__: null,
3464    protocol: protocol,
3465    get PacketType () { return PacketType; },
3466    Encoder: Encoder,
3467    Decoder: Decoder,
3468    isPacketValid: isPacketValid
3469  });
3470
3471  function on(obj, ev, fn) {
3472    obj.on(ev, fn);
3473    return function subDestroy() {
3474      obj.off(ev, fn);
3475    };
3476  }
3477
3478  var debug$2 = debugModule("socket.io-client:socket"); // debug()
3479  /**
3480   * Internal events.
3481   * These events can't be emitted by the user.
3482   */
3483  var RESERVED_EVENTS = Object.freeze({
3484    connect: 1,
3485    connect_error: 1,
3486    disconnect: 1,
3487    disconnecting: 1,
3488    // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener
3489    newListener: 1,
3490    removeListener: 1
3491  });
3492  /**
3493   * A Socket is the fundamental class for interacting with the server.
3494   *
3495   * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.
3496   *
3497   * @example
3498   * const socket = io();
3499   *
3500   * socket.on("connect", () => {
3501   *   console.log("connected");
3502   * });
3503   *
3504   * // send an event to the server
3505   * socket.emit("foo", "bar");
3506   *
3507   * socket.on("foobar", () => {
3508   *   // an event was received from the server
3509   * });
3510   *
3511   * // upon disconnection
3512   * socket.on("disconnect", (reason) => {
3513   *   console.log(`disconnected due to ${reason}`);
3514   * });
3515   */
3516  var Socket = /*#__PURE__*/function (_Emitter) {
3517    /**
3518     * `Socket` constructor.
3519     */
3520    function Socket(io, nsp, opts) {
3521      var _this;
3522      _this = _Emitter.call(this) || this;
3523      /**
3524       * Whether the socket is currently connected to the server.
3525       *
3526       * @example
3527       * const socket = io();
3528       *
3529       * socket.on("connect", () => {
3530       *   console.log(socket.connected); // true
3531       * });
3532       *
3533       * socket.on("disconnect", () => {
3534       *   console.log(socket.connected); // false
3535       * });
3536       */
3537      _this.connected = false;
3538      /**
3539       * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will
3540       * be transmitted by the server.
3541       */
3542      _this.recovered = false;
3543      /**
3544       * Buffer for packets received before the CONNECT packet
3545       */
3546      _this.receiveBuffer = [];
3547      /**
3548       * Buffer for packets that will be sent once the socket is connected
3549       */
3550      _this.sendBuffer = [];
3551      /**
3552       * The queue of packets to be sent with retry in case of failure.
3553       *
3554       * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.
3555       * @private
3556       */
3557      _this._queue = [];
3558      /**
3559       * A sequence to generate the ID of the {@link QueuedPacket}.
3560       * @private
3561       */
3562      _this._queueSeq = 0;
3563      _this.ids = 0;
3564      /**
3565       * A map containing acknowledgement handlers.
3566       *
3567       * The `withError` attribute is used to differentiate handlers that accept an error as first argument:
3568       *
3569       * - `socket.emit("test", (err, value) => { ... })` with `ackTimeout` option
3570       * - `socket.timeout(5000).emit("test", (err, value) => { ... })`
3571       * - `const value = await socket.emitWithAck("test")`
3572       *
3573       * From those that don't:
3574       *
3575       * - `socket.emit("test", (value) => { ... });`
3576       *
3577       * In the first case, the handlers will be called with an error when:
3578       *
3579       * - the timeout is reached
3580       * - the socket gets disconnected
3581       *
3582       * In the second case, the handlers will be simply discarded upon disconnection, since the client will never receive
3583       * an acknowledgement from the server.
3584       *
3585       * @private
3586       */
3587      _this.acks = {};
3588      _this.flags = {};
3589      _this.io = io;
3590      _this.nsp = nsp;
3591      if (opts && opts.auth) {
3592        _this.auth = opts.auth;
3593      }
3594      _this._opts = _extends({}, opts);
3595      if (_this.io._autoConnect) _this.open();
3596      return _this;
3597    }
3598    /**
3599     * Whether the socket is currently disconnected
3600     *
3601     * @example
3602     * const socket = io();
3603     *
3604     * socket.on("connect", () => {
3605     *   console.log(socket.disconnected); // false
3606     * });
3607     *
3608     * socket.on("disconnect", () => {
3609     *   console.log(socket.disconnected); // true
3610     * });
3611     */
3612    _inheritsLoose(Socket, _Emitter);
3613    var _proto = Socket.prototype;
3614    /**
3615     * Subscribe to open, close and packet events
3616     *
3617     * @private
3618     */
3619    _proto.subEvents = function subEvents() {
3620      if (this.subs) return;
3621      var io = this.io;
3622      this.subs = [on(io, "open", this.onopen.bind(this)), on(io, "packet", this.onpacket.bind(this)), on(io, "error", this.onerror.bind(this)), on(io, "close", this.onclose.bind(this))];
3623    }
3624    /**
3625     * Whether the Socket will try to reconnect when its Manager connects or reconnects.
3626     *
3627     * @example
3628     * const socket = io();
3629     *
3630     * console.log(socket.active); // true
3631     *
3632     * socket.on("disconnect", (reason) => {
3633     *   if (reason === "io server disconnect") {
3634     *     // the disconnection was initiated by the server, you need to manually reconnect
3635     *     console.log(socket.active); // false
3636     *   }
3637     *   // else the socket will automatically try to reconnect
3638     *   console.log(socket.active); // true
3639     * });
3640     */;
3641    /**
3642     * "Opens" the socket.
3643     *
3644     * @example
3645     * const socket = io({
3646     *   autoConnect: false
3647     * });
3648     *
3649     * socket.connect();
3650     */
3651    _proto.connect = function connect() {
3652      if (this.connected) return this;
3653      this.subEvents();
3654      if (!this.io["_reconnecting"]) this.io.open(); // ensure open
3655      if ("open" === this.io._readyState) this.onopen();
3656      return this;
3657    }
3658    /**
3659     * Alias for {@link connect()}.
3660     */;
3661    _proto.open = function open() {
3662      return this.connect();
3663    }
3664    /**
3665     * Sends a `message` event.
3666     *
3667     * This method mimics the WebSocket.send() method.
3668     *
3669     * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send
3670     *
3671     * @example
3672     * socket.send("hello");
3673     *
3674     * // this is equivalent to
3675     * socket.emit("message", "hello");
3676     *
3677     * @return self
3678     */;
3679    _proto.send = function send() {
3680      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3681        args[_key] = arguments[_key];
3682      }
3683      args.unshift("message");
3684      this.emit.apply(this, args);
3685      return this;
3686    }
3687    /**
3688     * Override `emit`.
3689     * If the event is in `events`, it's emitted normally.
3690     *
3691     * @example
3692     * socket.emit("hello", "world");
3693     *
3694     * // all serializable datastructures are supported (no need to call JSON.stringify)
3695     * socket.emit("hello", 1, "2", { 3: ["4"], 5: Uint8Array.from([6]) });
3696     *
3697     * // with an acknowledgement from the server
3698     * socket.emit("hello", "world", (val) => {
3699     *   // ...
3700     * });
3701     *
3702     * @return self
3703     */;
3704    _proto.emit = function emit(ev) {
3705      var _a, _b, _c;
3706      if (RESERVED_EVENTS.hasOwnProperty(ev)) {
3707        throw new Error('"' + ev.toString() + '" is a reserved event name');
3708      }
3709      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
3710        args[_key2 - 1] = arguments[_key2];
3711      }
3712      args.unshift(ev);
3713      if (this._opts.retries && !this.flags.fromQueue && !this.flags["volatile"]) {
3714        this._addToQueue(args);
3715        return this;
3716      }
3717      var packet = {
3718        type: PacketType.EVENT,
3719        data: args
3720      };
3721      packet.options = {};
3722      packet.options.compress = this.flags.compress !== false;
3723      // event ack callback
3724      if ("function" === typeof args[args.length - 1]) {
3725        var id = this.ids++;
3726        debug$2("emitting packet with ack id %d", id);
3727        var ack = args.pop();
3728        this._registerAckCallback(id, ack);
3729        packet.id = id;
3730      }
3731      var isTransportWritable = (_b = (_a = this.io.engine) === null || _a === void 0 ? void 0 : _a.transport) === null || _b === void 0 ? void 0 : _b.writable;
3732      var isConnected = this.connected && !((_c = this.io.engine) === null || _c === void 0 ? void 0 : _c._hasPingExpired());
3733      var discardPacket = this.flags["volatile"] && !isTransportWritable;
3734      if (discardPacket) {
3735        debug$2("discard packet as the transport is not currently writable");
3736      } else if (isConnected) {
3737        this.notifyOutgoingListeners(packet);
3738        this.packet(packet);
3739      } else {
3740        this.sendBuffer.push(packet);
3741      }
3742      this.flags = {};
3743      return this;
3744    }
3745    /**
3746     * @private
3747     */;
3748    _proto._registerAckCallback = function _registerAckCallback(id, ack) {
3749      var _this2 = this;
3750      var _a;
3751      var timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;
3752      if (timeout === undefined) {
3753        this.acks[id] = ack;
3754        return;
3755      }
3756      // @ts-ignore
3757      var timer = this.io.setTimeoutFn(function () {
3758        delete _this2.acks[id];
3759        for (var i = 0; i < _this2.sendBuffer.length; i++) {
3760          if (_this2.sendBuffer[i].id === id) {
3761            debug$2("removing packet with ack id %d from the buffer", id);
3762            _this2.sendBuffer.splice(i, 1);
3763          }
3764        }
3765        debug$2("event with ack id %d has timed out after %d ms", id, timeout);
3766        ack.call(_this2, new Error("operation has timed out"));
3767      }, timeout);
3768      var fn = function fn() {
3769        // @ts-ignore
3770        _this2.io.clearTimeoutFn(timer);
3771        for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
3772          args[_key3] = arguments[_key3];
3773        }
3774        ack.apply(_this2, args);
3775      };
3776      fn.withError = true;
3777      this.acks[id] = fn;
3778    }
3779    /**
3780     * Emits an event and waits for an acknowledgement
3781     *
3782     * @example
3783     * // without timeout
3784     * const response = await socket.emitWithAck("hello", "world");
3785     *
3786     * // with a specific timeout
3787     * try {
3788     *   const response = await socket.timeout(1000).emitWithAck("hello", "world");
3789     * } catch (err) {
3790     *   // the server did not acknowledge the event in the given delay
3791     * }
3792     *
3793     * @return a Promise that will be fulfilled when the server acknowledges the event
3794     */;
3795    _proto.emitWithAck = function emitWithAck(ev) {
3796      var _this3 = this;
3797      for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
3798        args[_key4 - 1] = arguments[_key4];
3799      }
3800      return new Promise(function (resolve, reject) {
3801        var fn = function fn(arg1, arg2) {
3802          return arg1 ? reject(arg1) : resolve(arg2);
3803        };
3804        fn.withError = true;
3805        args.push(fn);
3806        _this3.emit.apply(_this3, [ev].concat(args));
3807      });
3808    }
3809    /**
3810     * Add the packet to the queue.
3811     * @param args
3812     * @private
3813     */;
3814    _proto._addToQueue = function _addToQueue(args) {
3815      var _this4 = this;
3816      var ack;
3817      if (typeof args[args.length - 1] === "function") {
3818        ack = args.pop();
3819      }
3820      var packet = {
3821        id: this._queueSeq++,
3822        tryCount: 0,
3823        pending: false,
3824        args: args,
3825        flags: _extends({
3826          fromQueue: true
3827        }, this.flags)
3828      };
3829      args.push(function (err) {
3830        if (packet !== _this4._queue[0]) {
3831          
3831// the packet has already been acknowledged
3832          return
vendor: 8,202 bytes, lines 3832-4103
3832;
3833        }
3834        var hasError = err !== null;
3835        if (hasError) {
3836          if (packet.tryCount > _this4._opts.retries) {
3837            debug$2("packet [%d] is discarded after %d tries", packet.id, packet.tryCount);
3838            _this4._queue.shift();
3839            if (ack) {
3840              ack(err);
3841            }
3842          }
3843        } else {
3844          debug$2("packet [%d] was successfully sent", packet.id);
3845          _this4._queue.shift();
3846          if (ack) {
3847            for (var _len5 = arguments.length, responseArgs = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
3848              responseArgs[_key5 - 1] = arguments[_key5];
3849            }
3850            ack.apply(void 0, [null].concat(responseArgs));
3851          }
3852        }
3853        packet.pending = false;
3854        return _this4._drainQueue();
3855      });
3856      this._queue.push(packet);
3857      this._drainQueue();
3858    }
3859    /**
3860     * Send the first packet of the queue, and wait for an acknowledgement from the server.
3861     * @param force - whether to resend a packet that has not been acknowledged yet
3862     *
3863     * @private
3864     */;
3865    _proto._drainQueue = function _drainQueue() {
3866      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
3867      debug$2("draining queue");
3868      if (!this.connected || this._queue.length === 0) {
3869        return;
3870      }
3871      var packet = this._queue[0];
3872      if (packet.pending && !force) {
3873        debug$2("packet [%d] has already been sent and is waiting for an ack", packet.id);
3874        return;
3875      }
3876      packet.pending = true;
3877      packet.tryCount++;
3878      debug$2("sending packet [%d] (try n°%d)", packet.id, packet.tryCount);
3879      this.flags = packet.flags;
3880      this.emit.apply(this, packet.args);
3881    }
3882    /**
3883     * Sends a packet.
3884     *
3885     * @param packet
3886     * @private
3887     */;
3888    _proto.packet = function packet(_packet) {
3889      _packet.nsp = this.nsp;
3890      this.io._packet(_packet);
3891    }
3892    /**
3893     * Called upon engine `open`.
3894     *
3895     * @private
3896     */;
3897    _proto.onopen = function onopen() {
3898      var _this5 = this;
3899      debug$2("transport is open - connecting");
3900      if (typeof this.auth == "function") {
3901        this.auth(function (data) {
3902          _this5._sendConnectPacket(data);
3903        });
3904      } else {
3905        this._sendConnectPacket(this.auth);
3906      }
3907    }
3908    /**
3909     * Sends a CONNECT packet to initiate the Socket.IO session.
3910     *
3911     * @param data
3912     * @private
3913     */;
3914    _proto._sendConnectPacket = function _sendConnectPacket(data) {
3915      this.packet({
3916        type: PacketType.CONNECT,
3917        data: this._pid ? _extends({
3918          pid: this._pid,
3919          offset: this._lastOffset
3920        }, data) : data
3921      });
3922    }
3923    /**
3924     * Called upon engine or manager `error`.
3925     *
3926     * @param err
3927     * @private
3928     */;
3929    _proto.onerror = function onerror(err) {
3930      if (!this.connected) {
3931        this.emitReserved("connect_error", err);
3932      }
3933    }
3934    /**
3935     * Called upon engine `close`.
3936     *
3937     * @param reason
3938     * @param description
3939     * @private
3940     */;
3941    _proto.onclose = function onclose(reason, description) {
3942      debug$2("close (%s)", reason);
3943      this.connected = false;
3944      delete this.id;
3945      this.emitReserved("disconnect", reason, description);
3946      this._clearAcks();
3947    }
3948    /**
3949     * Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from
3950     * the server.
3951     *
3952     * @private
3953     */;
3954    _proto._clearAcks = function _clearAcks() {
3955      var _this6 = this;
3956      Object.keys(this.acks).forEach(function (id) {
3957        var isBuffered = _this6.sendBuffer.some(function (packet) {
3958          return String(packet.id) === id;
3959        });
3960        if (!isBuffered) {
3961          // note: handlers that do not accept an error as first argument are ignored here
3962          var ack = _this6.acks[id];
3963          delete _this6.acks[id];
3964          if (ack.withError) {
3965            ack.call(_this6, new Error("socket has been disconnected"));
3966          }
3967        }
3968      });
3969    }
3970    /**
3971     * Called with socket packet.
3972     *
3973     * @param packet
3974     * @private
3975     */;
3976    _proto.onpacket = function onpacket(packet) {
3977      var sameNamespace = packet.nsp === this.nsp;
3978      if (!sameNamespace) return;
3979      switch (packet.type) {
3980        case PacketType.CONNECT:
3981          if (packet.data && packet.data.sid) {
3982            this.onconnect(packet.data.sid, packet.data.pid);
3983          } else {
3984            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/)"));
3985          }
3986          break;
3987        case PacketType.EVENT:
3988        case PacketType.BINARY_EVENT:
3989          this.onevent(packet);
3990          break;
3991        case PacketType.ACK:
3992        case PacketType.BINARY_ACK:
3993          this.onack(packet);
3994          break;
3995        case PacketType.DISCONNECT:
3996          this.ondisconnect();
3997          break;
3998        case PacketType.CONNECT_ERROR:
3999          this.destroy();
4000          var err = new Error(packet.data.message);
4001          // @ts-ignore
4002          err.data = packet.data.data;
4003          this.emitReserved("connect_error", err);
4004          break;
4005      }
4006    }
4007    /**
4008     * Called upon a server event.
4009     *
4010     * @param packet
4011     * @private
4012     */;
4013    _proto.onevent = function onevent(packet) {
4014      var args = packet.data || [];
4015      debug$2("emitting event %j", args);
4016      if (null != packet.id) {
4017        debug$2("attaching ack callback to event");
4018        args.push(this.ack(packet.id));
4019      }
4020      if (this.connected) {
4021        this.emitEvent(args);
4022      } else {
4023        this.receiveBuffer.push(Object.freeze(args));
4024      }
4025    };
4026    _proto.emitEvent = function emitEvent(args) {
4027      if (this._anyListeners && this._anyListeners.length) {
4028        var listeners = this._anyListeners.slice();
4029        var _iterator = _createForOfIteratorHelper(listeners),
4030          _step;
4031        try {
4032          for (_iterator.s(); !(_step = _iterator.n()).done;) {
4033            var listener = _step.value;
4034            listener.apply(this, args);
4035          }
4036        } catch (err) {
4037          _iterator.e(err);
4038        } finally {
4039          _iterator.f();
4040        }
4041      }
4042      _Emitter.prototype.emit.apply(this, args);
4043      if (this._pid && args.length && typeof args[args.length - 1] === "string") {
4044        this._lastOffset = args[args.length - 1];
4045      }
4046    }
4047    /**
4048     * Produces an ack callback to emit with an event.
4049     *
4050     * @private
4051     */;
4052    _proto.ack = function ack(id) {
4053      var self = this;
4054      var sent = false;
4055      return function () {
4056        // prevent double callbacks
4057        if (sent) return;
4058        sent = true;
4059        for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
4060          args[_key6] = arguments[_key6];
4061        }
4062        debug$2("sending ack %j", args);
4063        self.packet({
4064          type: PacketType.ACK,
4065          id: id,
4066          data: args
4067        });
4068      };
4069    }
4070    /**
4071     * Called upon a server acknowledgement.
4072     *
4073     * @param packet
4074     * @private
4075     */;
4076    _proto.onack = function onack(packet) {
4077      var ack = this.acks[packet.id];
4078      if (typeof ack !== "function") {
4079        debug$2("bad ack %s", packet.id);
4080        return;
4081      }
4082      delete this.acks[packet.id];
4083      debug$2("calling ack %s with %j", packet.id, packet.data);
4084      // @ts-ignore FIXME ack is incorrectly inferred as 'never'
4085      if (ack.withError) {
4086        packet.data.unshift(null);
4087      }
4088      // @ts-ignore
4089      ack.apply(this, packet.data);
4090    }
4091    /**
4092     * Called upon server connect.
4093     *
4094     * @private
4095     */;
4096    _proto.onconnect = function onconnect(id, pid) {
4097      debug$2("socket connected with id %s", id);
4098      this.id = id;
4099      this.recovered = pid && this._pid === pid;
4100      this._pid = pid; // defined only if connection state recovery is enabled
4101      this.connected = true;
4102      this.emitBuffered();
4103      this.
4103emitReserved("connect");
4104      this._drainQueue(true
vendor: 23,374 bytes, lines 4104-4908
4104);
4105    }
4106    /**
4107     * Emit buffered events (received and emitted).
4108     *
4109     * @private
4110     */;
4111    _proto.emitBuffered = function emitBuffered() {
4112      var _this7 = this;
4113      this.receiveBuffer.forEach(function (args) {
4114        return _this7.emitEvent(args);
4115      });
4116      this.receiveBuffer = [];
4117      this.sendBuffer.forEach(function (packet) {
4118        _this7.notifyOutgoingListeners(packet);
4119        _this7.packet(packet);
4120      });
4121      this.sendBuffer = [];
4122    }
4123    /**
4124     * Called upon server disconnect.
4125     *
4126     * @private
4127     */;
4128    _proto.ondisconnect = function ondisconnect() {
4129      debug$2("server disconnect (%s)", this.nsp);
4130      this.destroy();
4131      this.onclose("io server disconnect");
4132    }
4133    /**
4134     * Called upon forced client/server side disconnections,
4135     * this method ensures the manager stops tracking us and
4136     * that reconnections don't get triggered for this.
4137     *
4138     * @private
4139     */;
4140    _proto.destroy = function destroy() {
4141      if (this.subs) {
4142        // clean subscriptions to avoid reconnections
4143        this.subs.forEach(function (subDestroy) {
4144          return subDestroy();
4145        });
4146        this.subs = undefined;
4147      }
4148      this.io["_destroy"](this);
4149    }
4150    /**
4151     * Disconnects the socket manually. In that case, the socket will not try to reconnect.
4152     *
4153     * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.
4154     *
4155     * @example
4156     * const socket = io();
4157     *
4158     * socket.on("disconnect", (reason) => {
4159     *   // console.log(reason); prints "io client disconnect"
4160     * });
4161     *
4162     * socket.disconnect();
4163     *
4164     * @return self
4165     */;
4166    _proto.disconnect = function disconnect() {
4167      if (this.connected) {
4168        debug$2("performing disconnect (%s)", this.nsp);
4169        this.packet({
4170          type: PacketType.DISCONNECT
4171        });
4172      }
4173      // remove socket from pool
4174      this.destroy();
4175      if (this.connected) {
4176        // fire events
4177        this.onclose("io client disconnect");
4178      }
4179      return this;
4180    }
4181    /**
4182     * Alias for {@link disconnect()}.
4183     *
4184     * @return self
4185     */;
4186    _proto.close = function close() {
4187      return this.disconnect();
4188    }
4189    /**
4190     * Sets the compress flag.
4191     *
4192     * @example
4193     * socket.compress(false).emit("hello");
4194     *
4195     * @param compress - if `true`, compresses the sending data
4196     * @return self
4197     */;
4198    _proto.compress = function compress(_compress) {
4199      this.flags.compress = _compress;
4200      return this;
4201    }
4202    /**
4203     * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not
4204     * ready to send messages.
4205     *
4206     * @example
4207     * socket.volatile.emit("hello"); // the server may or may not receive it
4208     *
4209     * @returns self
4210     */;
4211    /**
4212     * Sets a modifier for a subsequent event emission that the callback will be called with an error when the
4213     * given number of milliseconds have elapsed without an acknowledgement from the server:
4214     *
4215     * @example
4216     * socket.timeout(5000).emit("my-event", (err) => {
4217     *   if (err) {
4218     *     // the server did not acknowledge the event in the given delay
4219     *   }
4220     * });
4221     *
4222     * @returns self
4223     */
4224    _proto.timeout = function timeout(_timeout) {
4225      this.flags.timeout = _timeout;
4226      return this;
4227    }
4228    /**
4229     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
4230     * callback.
4231     *
4232     * @example
4233     * socket.onAny((event, ...args) => {
4234     *   console.log(`got ${event}`);
4235     * });
4236     *
4237     * @param listener
4238     */;
4239    _proto.onAny = function onAny(listener) {
4240      this._anyListeners = this._anyListeners || [];
4241      this._anyListeners.push(listener);
4242      return this;
4243    }
4244    /**
4245     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
4246     * callback. The listener is added to the beginning of the listeners array.
4247     *
4248     * @example
4249     * socket.prependAny((event, ...args) => {
4250     *   console.log(`got event ${event}`);
4251     * });
4252     *
4253     * @param listener
4254     */;
4255    _proto.prependAny = function prependAny(listener) {
4256      this._anyListeners = this._anyListeners || [];
4257      this._anyListeners.unshift(listener);
4258      return this;
4259    }
4260    /**
4261     * Removes the listener that will be fired when any event is emitted.
4262     *
4263     * @example
4264     * const catchAllListener = (event, ...args) => {
4265     *   console.log(`got event ${event}`);
4266     * }
4267     *
4268     * socket.onAny(catchAllListener);
4269     *
4270     * // remove a specific listener
4271     * socket.offAny(catchAllListener);
4272     *
4273     * // or remove all listeners
4274     * socket.offAny();
4275     *
4276     * @param listener
4277     */;
4278    _proto.offAny = function offAny(listener) {
4279      if (!this._anyListeners) {
4280        return this;
4281      }
4282      if (listener) {
4283        var listeners = this._anyListeners;
4284        for (var i = 0; i < listeners.length; i++) {
4285          if (listener === listeners[i]) {
4286            listeners.splice(i, 1);
4287            return this;
4288          }
4289        }
4290      } else {
4291        this._anyListeners = [];
4292      }
4293      return this;
4294    }
4295    /**
4296     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,
4297     * e.g. to remove listeners.
4298     */;
4299    _proto.listenersAny = function listenersAny() {
4300      return this._anyListeners || [];
4301    }
4302    /**
4303     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
4304     * callback.
4305     *
4306     * Note: acknowledgements sent to the server are not included.
4307     *
4308     * @example
4309     * socket.onAnyOutgoing((event, ...args) => {
4310     *   console.log(`sent event ${event}`);
4311     * });
4312     *
4313     * @param listener
4314     */;
4315    _proto.onAnyOutgoing = function onAnyOutgoing(listener) {
4316      this._anyOutgoingListeners = this._anyOutgoingListeners || [];
4317      this._anyOutgoingListeners.push(listener);
4318      return this;
4319    }
4320    /**
4321     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
4322     * callback. The listener is added to the beginning of the listeners array.
4323     *
4324     * Note: acknowledgements sent to the server are not included.
4325     *
4326     * @example
4327     * socket.prependAnyOutgoing((event, ...args) => {
4328     *   console.log(`sent event ${event}`);
4329     * });
4330     *
4331     * @param listener
4332     */;
4333    _proto.prependAnyOutgoing = function prependAnyOutgoing(listener) {
4334      this._anyOutgoingListeners = this._anyOutgoingListeners || [];
4335      this._anyOutgoingListeners.unshift(listener);
4336      return this;
4337    }
4338    /**
4339     * Removes the listener that will be fired when any event is emitted.
4340     *
4341     * @example
4342     * const catchAllListener = (event, ...args) => {
4343     *   console.log(`sent event ${event}`);
4344     * }
4345     *
4346     * socket.onAnyOutgoing(catchAllListener);
4347     *
4348     * // remove a specific listener
4349     * socket.offAnyOutgoing(catchAllListener);
4350     *
4351     * // or remove all listeners
4352     * socket.offAnyOutgoing();
4353     *
4354     * @param [listener] - the catch-all listener (optional)
4355     */;
4356    _proto.offAnyOutgoing = function offAnyOutgoing(listener) {
4357      if (!this._anyOutgoingListeners) {
4358        return this;
4359      }
4360      if (listener) {
4361        var listeners = this._anyOutgoingListeners;
4362        for (var i = 0; i < listeners.length; i++) {
4363          if (listener === listeners[i]) {
4364            listeners.splice(i, 1);
4365            return this;
4366          }
4367        }
4368      } else {
4369        this._anyOutgoingListeners = [];
4370      }
4371      return this;
4372    }
4373    /**
4374     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,
4375     * e.g. to remove listeners.
4376     */;
4377    _proto.listenersAnyOutgoing = function listenersAnyOutgoing() {
4378      return this._anyOutgoingListeners || [];
4379    }
4380    /**
4381     * Notify the listeners for each packet sent
4382     *
4383     * @param packet
4384     *
4385     * @private
4386     */;
4387    _proto.notifyOutgoingListeners = function notifyOutgoingListeners(packet) {
4388      if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {
4389        var listeners = this._anyOutgoingListeners.slice();
4390        var _iterator2 = _createForOfIteratorHelper(listeners),
4391          _step2;
4392        try {
4393          for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
4394            var listener = _step2.value;
4395            listener.apply(this, packet.data);
4396          }
4397        } catch (err) {
4398          _iterator2.e(err);
4399        } finally {
4400          _iterator2.f();
4401        }
4402      }
4403    };
4404    return _createClass(Socket, [{
4405      key: "disconnected",
4406      get: function get() {
4407        return !this.connected;
4408      }
4409    }, {
4410      key: "active",
4411      get: function get() {
4412        return !!this.subs;
4413      }
4414    }, {
4415      key: "volatile",
4416      get: function get() {
4417        this.flags["volatile"] = true;
4418        return this;
4419      }
4420    }]);
4421  }(Emitter);
4422
4423  /**
4424   * Initialize backoff timer with `opts`.
4425   *
4426   * - `min` initial timeout in milliseconds [100]
4427   * - `max` max timeout [10000]
4428   * - `jitter` [0]
4429   * - `factor` [2]
4430   *
4431   * @param {Object} opts
4432   * @api public
4433   */
4434  function Backoff(opts) {
4435    opts = opts || {};
4436    this.ms = opts.min || 100;
4437    this.max = opts.max || 10000;
4438    this.factor = opts.factor || 2;
4439    this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;
4440    this.attempts = 0;
4441  }
4442  /**
4443   * Return the backoff duration.
4444   *
4445   * @return {Number}
4446   * @api public
4447   */
4448  Backoff.prototype.duration = function () {
4449    var ms = this.ms * Math.pow(this.factor, this.attempts++);
4450    if (this.jitter) {
4451      var rand = Math.random();
4452      var deviation = Math.floor(rand * this.jitter * ms);
4453      ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;
4454    }
4455    return Math.min(ms, this.max) | 0;
4456  };
4457  /**
4458   * Reset the number of attempts.
4459   *
4460   * @api public
4461   */
4462  Backoff.prototype.reset = function () {
4463    this.attempts = 0;
4464  };
4465  /**
4466   * Set the minimum duration
4467   *
4468   * @api public
4469   */
4470  Backoff.prototype.setMin = function (min) {
4471    this.ms = min;
4472  };
4473  /**
4474   * Set the maximum duration
4475   *
4476   * @api public
4477   */
4478  Backoff.prototype.setMax = function (max) {
4479    this.max = max;
4480  };
4481  /**
4482   * Set the jitter
4483   *
4484   * @api public
4485   */
4486  Backoff.prototype.setJitter = function (jitter) {
4487    this.jitter = jitter;
4488  };
4489
4490  var debug$1 = debugModule("socket.io-client:manager"); // debug()
4491  var Manager = /*#__PURE__*/function (_Emitter) {
4492    function Manager(uri, opts) {
4493      var _this;
4494      var _a;
4495      _this = _Emitter.call(this) || this;
4496      _this.nsps = {};
4497      _this.subs = [];
4498      if (uri && "object" === _typeof(uri)) {
4499        opts = uri;
4500        uri = undefined;
4501      }
4502      opts = opts || {};
4503      opts.path = opts.path || "/socket.io";
4504      _this.opts = opts;
4505      installTimerFunctions(_this, opts);
4506      _this.reconnection(opts.reconnection !== false);
4507      _this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);
4508      _this.reconnectionDelay(opts.reconnectionDelay || 1000);
4509      _this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);
4510      _this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);
4511      _this.backoff = new Backoff({
4512        min: _this.reconnectionDelay(),
4513        max: _this.reconnectionDelayMax(),
4514        jitter: _this.randomizationFactor()
4515      });
4516      _this.timeout(null == opts.timeout ? 20000 : opts.timeout);
4517      _this._readyState = "closed";
4518      _this.uri = uri;
4519      var _parser = opts.parser || parser;
4520      _this.encoder = new _parser.Encoder();
4521      _this.decoder = new _parser.Decoder();
4522      _this._autoConnect = opts.autoConnect !== false;
4523      if (_this._autoConnect) _this.open();
4524      return _this;
4525    }
4526    _inheritsLoose(Manager, _Emitter);
4527    var _proto = Manager.prototype;
4528    _proto.reconnection = function reconnection(v) {
4529      if (!arguments.length) return this._reconnection;
4530      this._reconnection = !!v;
4531      if (!v) {
4532        this.skipReconnect = true;
4533      }
4534      return this;
4535    };
4536    _proto.reconnectionAttempts = function reconnectionAttempts(v) {
4537      if (v === undefined) return this._reconnectionAttempts;
4538      this._reconnectionAttempts = v;
4539      return this;
4540    };
4541    _proto.reconnectionDelay = function reconnectionDelay(v) {
4542      var _a;
4543      if (v === undefined) return this._reconnectionDelay;
4544      this._reconnectionDelay = v;
4545      (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);
4546      return this;
4547    };
4548    _proto.randomizationFactor = function randomizationFactor(v) {
4549      var _a;
4550      if (v === undefined) return this._randomizationFactor;
4551      this._randomizationFactor = v;
4552      (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);
4553      return this;
4554    };
4555    _proto.reconnectionDelayMax = function reconnectionDelayMax(v) {
4556      var _a;
4557      if (v === undefined) return this._reconnectionDelayMax;
4558      this._reconnectionDelayMax = v;
4559      (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);
4560      return this;
4561    };
4562    _proto.timeout = function timeout(v) {
4563      if (!arguments.length) return this._timeout;
4564      this._timeout = v;
4565      return this;
4566    }
4567    /**
4568     * Starts trying to reconnect if reconnection is enabled and we have not
4569     * started reconnecting yet
4570     *
4571     * @private
4572     */;
4573    _proto.maybeReconnectOnOpen = function maybeReconnectOnOpen() {
4574      // Only try to reconnect if it's the first time we're connecting
4575      if (!this._reconnecting && this._reconnection && this.backoff.attempts === 0) {
4576        // keeps reconnection from firing twice for the same reconnection loop
4577        this.reconnect();
4578      }
4579    }
4580    /**
4581     * Sets the current transport `socket`.
4582     *
4583     * @param {Function} fn - optional, callback
4584     * @return self
4585     * @public
4586     */;
4587    _proto.open = function open(fn) {
4588      var _this2 = this;
4589      debug$1("readyState %s", this._readyState);
4590      if (~this._readyState.indexOf("open")) return this;
4591      debug$1("opening %s", this.uri);
4592      this.engine = new Socket$1(this.uri, this.opts);
4593      var socket = this.engine;
4594      var self = this;
4595      this._readyState = "opening";
4596      this.skipReconnect = false;
4597      // emit `open`
4598      var openSubDestroy = on(socket, "open", function () {
4599        self.onopen();
4600        fn && fn();
4601      });
4602      var onError = function onError(err) {
4603        debug$1("error");
4604        _this2.cleanup();
4605        _this2._readyState = "closed";
4606        _this2.emitReserved("error", err);
4607        if (fn) {
4608          fn(err);
4609        } else {
4610          // Only do this if there is no fn to handle the error
4611          _this2.maybeReconnectOnOpen();
4612        }
4613      };
4614      // emit `error`
4615      var errorSub = on(socket, "error", onError);
4616      if (false !== this._timeout) {
4617        var timeout = this._timeout;
4618        debug$1("connect attempt will timeout after %d", timeout);
4619        // set timer
4620        var timer = this.setTimeoutFn(function () {
4621          debug$1("connect attempt timed out after %d", timeout);
4622          openSubDestroy();
4623          onError(new Error("timeout"));
4624          socket.close();
4625        }, timeout);
4626        if (this.opts.autoUnref) {
4627          timer.unref();
4628        }
4629        this.subs.push(function () {
4630          _this2.clearTimeoutFn(timer);
4631        });
4632      }
4633      this.subs.push(openSubDestroy);
4634      this.subs.push(errorSub);
4635      return this;
4636    }
4637    /**
4638     * Alias for open()
4639     *
4640     * @return self
4641     * @public
4642     */;
4643    _proto.connect = function connect(fn) {
4644      return this.open(fn);
4645    }
4646    /**
4647     * Called upon transport open.
4648     *
4649     * @private
4650     */;
4651    _proto.onopen = function onopen() {
4652      debug$1("open");
4653      // clear old subs
4654      this.cleanup();
4655      // mark as open
4656      this._readyState = "open";
4657      this.emitReserved("open");
4658      // add new subs
4659      var socket = this.engine;
4660      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)),
4661      // @ts-ignore
4662      on(this.decoder, "decoded", this.ondecoded.bind(this)));
4663    }
4664    /**
4665     * Called upon a ping.
4666     *
4667     * @private
4668     */;
4669    _proto.onping = function onping() {
4670      this.emitReserved("ping");
4671    }
4672    /**
4673     * Called with data.
4674     *
4675     * @private
4676     */;
4677    _proto.ondata = function ondata(data) {
4678      try {
4679        this.decoder.add(data);
4680      } catch (e) {
4681        this.onclose("parse error", e);
4682      }
4683    }
4684    /**
4685     * Called when parser fully decodes a packet.
4686     *
4687     * @private
4688     */;
4689    _proto.ondecoded = function ondecoded(packet) {
4690      var _this3 = this;
4691      // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a "parse error"
4692      nextTick(function () {
4693        _this3.emitReserved("packet", packet);
4694      }, this.setTimeoutFn);
4695    }
4696    /**
4697     * Called upon socket error.
4698     *
4699     * @private
4700     */;
4701    _proto.onerror = function onerror(err) {
4702      debug$1("error", err);
4703      this.emitReserved("error", err);
4704    }
4705    /**
4706     * Creates a new socket for the given `nsp`.
4707     *
4708     * @return {Socket}
4709     * @public
4710     */;
4711    _proto.socket = function socket(nsp, opts) {
4712      var socket = this.nsps[nsp];
4713      if (!socket) {
4714        socket = new Socket(this, nsp, opts);
4715        this.nsps[nsp] = socket;
4716      } else if (this._autoConnect && !socket.active) {
4717        socket.connect();
4718      }
4719      return socket;
4720    }
4721    /**
4722     * Called upon a socket close.
4723     *
4724     * @param socket
4725     * @private
4726     */;
4727    _proto._destroy = function _destroy(socket) {
4728      var nsps = Object.keys(this.nsps);
4729      for (var _i = 0, _nsps = nsps; _i < _nsps.length; _i++) {
4730        var nsp = _nsps[_i];
4731        var _socket = this.nsps[nsp];
4732        if (_socket.active) {
4733          debug$1("socket %s is still active, skipping close", nsp);
4734          return;
4735        }
4736      }
4737      this._close();
4738    }
4739    /**
4740     * Writes a packet.
4741     *
4742     * @param packet
4743     * @private
4744     */;
4745    _proto._packet = function _packet(packet) {
4746      debug$1("writing packet %j", packet);
4747      var encodedPackets = this.encoder.encode(packet);
4748      for (var i = 0; i < encodedPackets.length; i++) {
4749        this.engine.write(encodedPackets[i], packet.options);
4750      }
4751    }
4752    /**
4753     * Clean up transport subscriptions and packet buffer.
4754     *
4755     * @private
4756     */;
4757    _proto.cleanup = function cleanup() {
4758      debug$1("cleanup");
4759      this.subs.forEach(function (subDestroy) {
4760        return subDestroy();
4761      });
4762      this.subs.length = 0;
4763      this.decoder.destroy();
4764    }
4765    /**
4766     * Close the current socket.
4767     *
4768     * @private
4769     */;
4770    _proto._close = function _close() {
4771      debug$1("disconnect");
4772      this.skipReconnect = true;
4773      this._reconnecting = false;
4774      this.onclose("forced close");
4775    }
4776    /**
4777     * Alias for close()
4778     *
4779     * @private
4780     */;
4781    _proto.disconnect = function disconnect() {
4782      return this._close();
4783    }
4784    /**
4785     * Called when:
4786     *
4787     * - the low-level engine is closed
4788     * - the parser encountered a badly formatted packet
4789     * - all sockets are disconnected
4790     *
4791     * @private
4792     */;
4793    _proto.onclose = function onclose(reason, description) {
4794      var _a;
4795      debug$1("closed due to %s", reason);
4796      this.cleanup();
4797      (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close();
4798      this.backoff.reset();
4799      this._readyState = "closed";
4800      this.emitReserved("close", reason, description);
4801      if (this._reconnection && !this.skipReconnect) {
4802        this.reconnect();
4803      }
4804    }
4805    /**
4806     * Attempt a reconnection.
4807     *
4808     * @private
4809     */;
4810    _proto.reconnect = function reconnect() {
4811      var _this4 = this;
4812      if (this._reconnecting || this.skipReconnect) return this;
4813      var self = this;
4814      if (this.backoff.attempts >= this._reconnectionAttempts) {
4815        debug$1("reconnect failed");
4816        this.backoff.reset();
4817        this.emitReserved("reconnect_failed");
4818        this._reconnecting = false;
4819      } else {
4820        var delay = this.backoff.duration();
4821        debug$1("will wait %dms before reconnect attempt", delay);
4822        this._reconnecting = true;
4823        var timer = this.setTimeoutFn(function () {
4824          if (self.skipReconnect) return;
4825          debug$1("attempting reconnect");
4826          _this4.emitReserved("reconnect_attempt", self.backoff.attempts);
4827          // check again for the case socket closed in above events
4828          if (self.skipReconnect) return;
4829          self.open(function (err) {
4830            if (err) {
4831              debug$1("reconnect attempt error");
4832              self._reconnecting = false;
4833              self.reconnect();
4834              _this4.emitReserved("reconnect_error", err);
4835            } else {
4836              debug$1("reconnect success");
4837              self.onreconnect();
4838            }
4839          });
4840        }, delay);
4841        if (this.opts.autoUnref) {
4842          timer.unref();
4843        }
4844        this.subs.push(function () {
4845          _this4.clearTimeoutFn(timer);
4846        });
4847      }
4848    }
4849    /**
4850     * Called upon successful reconnect.
4851     *
4852     * @private
4853     */;
4854    _proto.onreconnect = function onreconnect() {
4855      var attempt = this.backoff.attempts;
4856      this._reconnecting = false;
4857      this.backoff.reset();
4858      this.emitReserved("reconnect", attempt);
4859    };
4860    return Manager;
4861  }(Emitter);
4862
4863  var debug = debugModule("socket.io-client"); // debug()
4864  /**
4865   * Managers cache.
4866   */
4867  var cache = {};
4868  function lookup(uri, opts) {
4869    if (_typeof(uri) === "object") {
4870      opts = uri;
4871      uri = undefined;
4872    }
4873    opts = opts || {};
4874    var parsed = url(uri, opts.path || "/socket.io");
4875    var source = parsed.source;
4876    var id = parsed.id;
4877    var path = parsed.path;
4878    var sameNamespace = cache[id] && path in cache[id]["nsps"];
4879    var newConnection = opts.forceNew || opts["force new connection"] || false === opts.multiplex || sameNamespace;
4880    var io;
4881    if (newConnection) {
4882      debug("ignoring socket cache for %s", source);
4883      io = new Manager(source, opts);
4884    } else {
4885      if (!cache[id]) {
4886        debug("new io instance for %s", source);
4887        cache[id] = new Manager(source, opts);
4888      }
4889      io = cache[id];
4890    }
4891    if (parsed.query && !opts.query) {
4892      opts.query = parsed.queryKey;
4893    }
4894    return io.socket(parsed.path, opts);
4895  }
4896  // so that "lookup" can be used both as a function (e.g. `io(...)`) and as a
4897  // namespace (e.g. `io.connect(...)`), for backward compatibility
4898  _extends(lookup, {
4899    Manager: Manager,
4900    Socket: Socket,
4901    io: lookup,
4902    connect: lookup
4903  });
4904
4905  return lookup;
4906
4907}));
4908//# sourceMappingURL=socket.io.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.