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