PageSourceSearch

https://www.ratifyme.com/src/app/js/js-socket.io.min.js?v=91d1ee5

js ratifyme.com collected 2026-09-24 14:00:09 UTC 143,526 bytes, 4,386 lines download raw bytes

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

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.