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