@vicaniddouglas/js_aide 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1487,5 +1487,5 @@ var e1=Object.defineProperty;var sI=Object.getOwnPropertyDescriptor;var rI=Objec
1487
1487
  <button class="confirm-btn">Confirm Location</button>
1488
1488
  </div>
1489
1489
  </div>
1490
- `,l4(),document.body.appendChild(N),H4(),N}function p2(N,A){if(!N){alert("please provide an `onConfirm` callback!");return}let I=u4();return I._callbacks={onConfirm:N,onCancel:A},d4(I),I}var B1=class{constructor(A){this.viewConfigs=A,this.loadedStyles=new Set,this.currentView=null,this.currentModule=null}async loadView(A){if(!A)return;let I=A.replace("-view",""),O=document.getElementById(A);if(!O)return;let U=this.viewConfigs[I];if(!U){console.error(`\u274C No config found for view: ${I}`);return}if(this.currentView!==I){this.currentView&&await this.unloadView(this.currentView);try{console.log(`Loading HTML: ${U.html}`);let E=await fetch(U.html);if(!E.ok)throw new Error(`HTTP ${E.status}`);let K=await E.text();O.innerHTML=K,U.css&&(console.log(`Loading CSS: ${U.css}`),await this.loadCSS(I,U.css)),U.js&&(console.log(`Loading JS: ${U.js}`),await this.loadJS(I,U.js)),this.currentView=I,console.log(`View loaded: ${I}`)}catch(E){console.error(`Failed to load view ${I}:`,E),O.innerHTML=`<p style="color: red; padding: 20px;">Error loading ${I}: ${E.message}</p>`}}}async loadCSS(A,I){let O=`style-${A}`,U=document.getElementById(O);U&&U.remove();let E=document.createElement("link");return E.id=O,E.rel="stylesheet",E.href=I,new Promise(K=>{E.onload=()=>{this.loadedStyles.add(A),console.log(`CSS loaded: ${I}`),K()},E.onerror=()=>{console.log(`CSS failed to load: ${I} (continuing anyway)`),K()},document.head.appendChild(E)})}async loadJS(A,I){try{let O=await import(I);this.currentModule=O,console.log("module====>",O),O.init&&typeof O.init=="function"&&(console.log(`Initializing ${A}...`),O.init()),console.log(`JS loaded: ${I}`)}catch(O){console.log(`No JS module for ${A} or error:`,O)}}async unloadView(A){console.log(`Unloading view: ${A}`);let I=document.getElementById(`style-${A}`);I&&(I.remove(),this.loadedStyles.delete(A)),this.currentModule&&this.currentModule.cleanup&&(console.log(`Cleaning up ${A}...`),this.currentModule.cleanup()),this.currentModule=null,this.currentView=null}};var uA={threshold:0,rootMargin:"0px",root:null,triggerOnce:!1},LA=new Map;function Z4(N,A){return`${N?N.id||N.tagName+N.className:"viewport"}::${A}`}var C1=class{constructor(A,I,O){this.onEnter=A,this.onExit=I,this.options=O,this.currentlyIntersecting=!1}};function m4(N,A){let I=Z4(N,A);return LA.has(I)||LA.set(I,{observer:null,callbacks:new Map,root:N,rootMargin:A,thresholds:new Set([0])}),LA.get(I)}function p4(N){let A=new Set([0]);return N.callbacks.forEach(I=>{I.forEach(O=>{let U=O.options.threshold;Array.isArray(U)?U.forEach(E=>A.add(E)):typeof U=="number"&&A.add(U)})}),Array.from(A).sort((I,O)=>I-O)}function g4(N){let A=p4(N);if(N.observer){let I=Array.from(N.observer.thresholds);if(I.length===A.length&&I.every((U,E)=>U===A[E]))return;N.observer.disconnect()}N.observer=new IntersectionObserver(I=>{f4(N,I)},{root:N.root,rootMargin:N.rootMargin,threshold:A}),N.callbacks.forEach((I,O)=>{N.observer.observe(O)}),N.thresholds=new Set(A)}function f4(N,A){A.forEach(I=>{let O=I.target,U=N.callbacks.get(O);if(!U)return;let E=I.isIntersecting,K=I.intersectionRatio;Array.from(U).forEach(R=>{var Y,P;let{onEnter:M,onExit:L,options:G}=R,T=(Y=G.threshold)!=null?Y:uA.threshold,W=(P=G.triggerOnce)!=null?P:uA.triggerOnce,t=Array.isArray(T)?T.some(s=>K>=s):K>=T;E&&t&&!R.currentlyIntersecting&&(R.currentlyIntersecting=!0,M&&typeof M=="function"&&M(O,I),W&&f2(N,O,R)),!E&&R.currentlyIntersecting&&(R.currentlyIntersecting=!1,L&&typeof L=="function"&&L(O,I))}),U.size===0&&(N.callbacks.delete(O),N.observer&&N.observer.unobserve(O))})}function a1(N,A={}){var R,M,L,G;let I=w4(N);if(!I)return()=>{};let{onEnter:O,onExit:U}=A;if(!O&&!U)return console.warn("[IntersectionWatcher] No callbacks provided. At least onEnter or onExit required."),()=>{};let E={threshold:(R=A.threshold)!=null?R:uA.threshold,rootMargin:(M=A.rootMargin)!=null?M:uA.rootMargin,root:(L=A.root)!=null?L:uA.root,triggerOnce:(G=A.triggerOnce)!=null?G:uA.triggerOnce},K=m4(E.root,E.rootMargin),B=new C1(O,U,E);return K.callbacks.has(I)||K.callbacks.set(I,new Set),K.callbacks.get(I).add(B),g4(K),K.observer.observe(I),()=>{f2(K,I,B)}}function g2(N,A={}){if(typeof N!="string")return console.warn("[IntersectionWatcher] watchAll requires a CSS selector string."),()=>{};let I=document.querySelectorAll(N);if(I.length===0)return console.warn(`[IntersectionWatcher] No elements found for selector: "${N}"`),()=>{};let O=Array.from(I).map(U=>a1(U,A));return()=>{O.forEach(U=>U())}}function f2(N,A,I){let O=N.callbacks.get(A);if(O&&(O.delete(I),O.size===0&&(N.callbacks.delete(A),N.observer&&N.observer.unobserve(A)),N.callbacks.size===0)){N.observer&&(N.observer.disconnect(),N.observer=null);for(let[U,E]of LA)if(E===N){LA.delete(U);break}}}function w4(N){if(typeof N=="string"){let A=document.querySelector(N);return A||(console.warn(`[IntersectionWatcher] Element not found: "${N}"`),null)}return N instanceof Element?N:(console.warn("[IntersectionWatcher] Invalid target. Must be Element or selector string."),null)}function P1(){LA.forEach(N=>{N.observer&&(N.observer.disconnect(),N.observer=null),N.callbacks.clear()}),LA.clear()}function w2(N){for(let A of LA.values())if(A.callbacks.has(N))return!0;return!1}function v2(){let N=0,A=0;return LA.forEach(I=>{N+=I.callbacks.size,I.callbacks.forEach(O=>{A+=O.size})}),{elements:N,callbacks:A,pools:LA.size}}typeof window<"u"&&window.addEventListener("beforeunload",()=>{P1()});var C={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4},V2={level:C.ERROR,timestamps:!0,colors:!0,output:null,namespaces:{}},FA={reset:"\x1B[0m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",namespace:"\x1B[35m"},c1=class N{constructor(A,I={}){if(typeof A!="string")throw new TypeError("Logger namespace must be a string");this.namespace=A,this.config={...V2,...I}}debug(...A){this._log(C.DEBUG,"DEBUG",...A)}info(...A){this._log(C.INFO,"INFO",...A)}warn(...A){this._log(C.WARN,"WARN",...A)}error(...A){this._log(C.ERROR,"ERROR",...A)}isDebugEnabled(){return this._shouldLog(C.DEBUG)}child(A){return new N(`${this.namespace}:${A}`,this.config)}_log(A,I,...O){if(!this._shouldLog(A))return;let U=this._formatMessage(I,...O);this._output(A,U)}_shouldLog(A){let I=this.config.namespaces[this.namespace];return I!==void 0?A>=I:A>=this.config.level}_formatMessage(A,...I){let O=[];if(this.config.timestamps&&O.push(`[${new Date().toISOString()}]`),this.config.colors){let U=FA[A.toLowerCase()]||FA.reset;O.push(`${U}[${A}]${FA.reset}`)}else O.push(`[${A}]`);return this.config.colors?O.push(`${FA.namespace}[${this.namespace}]${FA.reset}`):O.push(`[${this.namespace}]`),O.push(...I),O}_output(A,I){if(this.config.output){this.config.output(A,...I);return}A>=C.ERROR?console.error(...I):A>=C.WARN?console.warn(...I):console.log(...I)}},l1={...V2},R1=new Map;function S(N){if(R1.has(N))return R1.get(N);let A=new c1(N,l1);return R1.set(N,A),A}function y2(N){if(typeof N.level=="string"){let A={debug:C.DEBUG,info:C.INFO,warn:C.WARN,error:C.ERROR,silent:C.SILENT};N.level=A[N.level.toLowerCase()]||C.INFO}N.namespaces&&Object.keys(N.namespaces).forEach(A=>{let I=N.namespaces[A];if(typeof I=="string"){let O={debug:C.DEBUG,info:C.INFO,warn:C.WARN,error:C.ERROR,silent:C.SILENT};N.namespaces[A]=O[I.toLowerCase()]||C.INFO}}),l1={...l1,...N},R1.clear()}var v4=S("browser"),J1=class{constructor(){this._detectAll()}_detectAll(){if(this.isBrowser=typeof window<"u"&&typeof document<"u",this.isNode=!this.isBrowser&&typeof process<"u",!this.isBrowser){this._setNonBrowserDefaults();return}this.hasWebSocket=typeof window.WebSocket<"u",this.hasLocalStorage=this._checkStorage("localStorage"),this.hasSessionStorage=this._checkStorage("sessionStorage"),this.hasIndexedDB=this._checkIndexedDB(),this.hasBlob=typeof Blob<"u",this.hasArrayBuffer=typeof ArrayBuffer<"u",this.hasDataView=typeof DataView<"u",this.hasTypedArrays=typeof Uint8Array<"u",this.hasCrypto=typeof crypto<"u"&&typeof crypto.getRandomValues<"u",this.hasWorker=typeof Worker<"u",this.hasSharedWorker=typeof SharedWorker<"u",this.hasServiceWorker=typeof navigator<"u"&&"serviceWorker"in navigator,this.hasNetworkInfo=typeof navigator<"u"&&"connection"in navigator,this.hasBatteryInfo=typeof navigator<"u"&&"getBattery"in navigator,this.userAgent=navigator.userAgent,this.browserInfo=this._identifyBrowser(),this.osInfo=this._identifyOS(),this.isMobile=this._detectMobile(),this.isTablet=this._detectTablet(),this.screenSize={width:window.screen.width,height:window.screen.height},this.pixelRatio=window.devicePixelRatio||1,this.touchSupport="ontouchstart"in window||navigator.maxTouchPoints>0,this.hasPerformanceAPI=typeof performance<"u",this.deviceMemory=navigator.deviceMemory||4,this.hardwareConcurrency=navigator.hardwareConcurrency||2,v4.debug("Browser capabilities detected",{hasWebSocket:this.hasWebSocket,browser:this.browserInfo.name,mobile:this.isMobile,memory:this.deviceMemory})}_setNonBrowserDefaults(){this.hasWebSocket=!1,this.hasLocalStorage=!1,this.hasSessionStorage=!1,this.hasIndexedDB=!1,this.hasBlob=!1,this.hasArrayBuffer=!0,this.hasDataView=!0,this.hasTypedArrays=!0,this.hasCrypto=!1,this.hasWorker=!1,this.hasSharedWorker=!1,this.hasServiceWorker=!1,this.hasNetworkInfo=!1,this.hasBatteryInfo=!1,this.isMobile=!1,this.isTablet=!1,this.touchSupport=!1,this.hasPerformanceAPI=!0,this.deviceMemory=4,this.hardwareConcurrency=2,this.browserInfo={name:"node",version:process.version},this.osInfo={name:process.platform}}_checkStorage(A){try{let I=window[A],O="__websocket_test__";return I.setItem(O,"test"),I.removeItem(O),!0}catch{return!1}}_checkIndexedDB(){try{return typeof window.indexedDB<"u"}catch{return!1}}_identifyBrowser(){var U,E,K,B,R;let A=this.userAgent,I="unknown",O="unknown";return A.indexOf("Firefox")>-1?(I="firefox",O=((U=A.match(/Firefox\/(\d+\.\d+)/))==null?void 0:U[1])||"unknown"):A.indexOf("Chrome")>-1&&A.indexOf("Edg")===-1?(I="chrome",O=((E=A.match(/Chrome\/(\d+\.\d+)/))==null?void 0:E[1])||"unknown"):A.indexOf("Safari")>-1&&A.indexOf("Chrome")===-1?(I="safari",O=((K=A.match(/Version\/(\d+\.\d+)/))==null?void 0:K[1])||"unknown"):A.indexOf("Edg")>-1?(I="edge",O=((B=A.match(/Edg\/(\d+\.\d+)/))==null?void 0:B[1])||"unknown"):(A.indexOf("MSIE")>-1||A.indexOf("Trident")>-1)&&(I="ie",O=((R=A.match(/(?:MSIE |rv:)(\d+\.\d+)/))==null?void 0:R[1])||"unknown"),{name:I,version:O}}_identifyOS(){let A=this.userAgent,I="unknown",O="unknown";if(A.indexOf("Windows")>-1)I="windows",A.indexOf("Windows NT 10.0")>-1?O="10":A.indexOf("Windows NT 6.3")>-1?O="8.1":A.indexOf("Windows NT 6.2")>-1?O="8":A.indexOf("Windows NT 6.1")>-1&&(O="7");else if(A.indexOf("Mac OS X")>-1){I="macos";let U=A.match(/Mac OS X (\d+[._]\d+[._]\d+)/);U&&(O=U[1].replace(/_/g,"."))}else if(A.indexOf("Android")>-1){I="android";let U=A.match(/Android (\d+\.\d+)/);U&&(O=U[1])}else if(A.indexOf("iOS")>-1||A.indexOf("iPhone")>-1||A.indexOf("iPad")>-1){I="ios";let U=A.match(/OS (\d+[_\d]+) like Mac/);U&&(O=U[1].replace(/_/g,"."))}else A.indexOf("Linux")>-1&&(I="linux");return{name:I,version:O}}_detectMobile(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(this.userAgent)}_detectTablet(){return/iPad|Android(?!.*Mobile)|Tablet/i.test(this.userAgent)}getRecommendedTransports(){let A=[];return this.hasWebSocket&&A.push("websocket"),typeof EventSource<"u"&&A.push("eventsource"),A.push("polling"),A}hasMemoryConstraints(){return this.isMobile||this.deviceMemory<=2}getMaxQueueSize(){return this.hasMemoryConstraints()?100:1e3}isLegacyBrowser(){let{name:A,version:I}=this.browserInfo,O=parseFloat(I);return A==="ie"||A==="firefox"&&O<50||A==="chrome"&&O<50||A==="safari"&&O<10}},h1=null;function p(){return h1||(h1=new J1),h1}function F2(){return p().hasWebSocket}function x2(){return p().isMobile}function b2(){if(!p().hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:A.type||"unknown",effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData||!1}:null}var W6=p();function V(N=""){let A=Date.now().toString(36),I=Math.random().toString(36).substring(2,10),O=`${A}${I}`;return N?`${N}_${O}`:O}function _2(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,N=>{let A=Math.random()*16|0;return(N==="x"?A:A&3|8).toString(16)})}function ZA(N){if(typeof N!="string"||N.trim()===""||!N.startsWith("ws://")&&!N.startsWith("wss://"))return!1;try{let A=new URL(N);return A.hostname&&A.hostname.includes(".")}catch{return!1}}function d1(N,A=null){if(typeof N!="string")return A;try{return JSON.parse(N)}catch{return A}}function u1(N,A=0){try{let I=new WeakSet;return JSON.stringify(N,(O,U)=>{if(typeof U=="object"&&U!==null){if(I.has(U))return"[Circular]";I.add(U)}return U},A)}catch{return""}}function xA(N){if(N===null||typeof N!="object")return N;if(N instanceof Date)return new Date(N.getTime());if(N instanceof Array)return N.map(A=>xA(A));if(N instanceof Object){let A={};return Object.keys(N).forEach(I=>{A[I]=xA(N[I])}),A}return N}function Z1(N,A){let I=xA(N);return!A||typeof A!="object"||Object.keys(A).forEach(O=>{let U=A[O],E=I[O];U instanceof Array?I[O]=xA(U):U instanceof Object&&E instanceof Object?I[O]=Z1(E,U):I[O]=xA(U)}),I}function iA(N,A={}){let{baseDelay:I=1e3,maxDelay:O=3e4,jitter:U=!0}=A,E=I*Math.pow(2,N);if(E=Math.min(E,O),U){let K=.8+.4*Math.random();E=Math.floor(E*K)}return E}function mA(N){return new Promise(A=>setTimeout(A,N))}function nA(){let N,A;return{promise:new Promise((O,U)=>{N=O,A=U}),resolve:N,reject:A}}function M1(N){if(N==null)return 0;if(typeof N=="string")return new Blob([N]).size;if(N instanceof Blob)return N.size;if(N instanceof ArrayBuffer||N instanceof DataView||ArrayBuffer.isView(N))return N.byteLength;if(typeof N=="object"){let A=u1(N);return A?new Blob([A]).size:0}return new Blob([String(N)]).size}function L1(N,A){return Date.now()>N+A}function k2(N,A){let I=N+A-Date.now();return Math.max(0,I)}function bA(N,A){return Object.values(A).includes(N)}function _A(N){return typeof N!="string"?!1:N==="/"?!0:/^\/[a-zA-Z0-9_-]+(\/[a-zA-Z0-9_-]+)*$/.test(N)}var SA=S("network"),g={OFFLINE:"offline",ONLINE:"online",DEGRADED:"degraded",CHECKING:"checking"},$={UNKNOWN:"unknown",ETHERNET:"ethernet",WIFI:"wifi",CELLULAR:"cellular",NONE:"none"},p1=class{constructor(){this.browser=p(),this.listeners=new Map,this.status={state:g.CHECKING,type:$.UNKNOWN,effectiveType:null,downlink:null,rtt:null,lastChanged:Date.now(),since:Date.now()},this._checkInterval=null,this._checking=!1,this._initialized=!1,this.browser.isBrowser&&this._initBrowserListeners()}_initBrowserListeners(){if(window.addEventListener("online",()=>this._handleBrowserOnline()),window.addEventListener("offline",()=>this._handleBrowserOffline()),this.browser.hasNetworkInfo){let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;A&&A.addEventListener("change",()=>this._handleConnectionChange())}this._startPeriodicChecks(),this._checkStatus().then(()=>{this._initialized=!0,SA.info("Network monitor initialized",this.status)}),SA.debug("Network listeners initialized")}_startPeriodicChecks(){this._checkInterval=setInterval(()=>{this._checkStatus()},3e4)}_handleBrowserOnline(){SA.info("Browser reported online"),this._checkStatus(!0)}_handleBrowserOffline(){SA.warn("Browser reported offline"),this._updateStatus({state:g.OFFLINE,type:$.NONE,lastChanged:Date.now()})}_handleConnectionChange(){SA.debug("Network connection changed"),this._checkStatus(!0)}async _checkStatus(A=!1){if(this._checking)return this.status;this._checking=!0,this._updateStatus({state:g.CHECKING});try{if(!this._getBasicOnlineStatus()){this._updateStatus({state:g.OFFLINE,type:$.NONE},A);return}let O=this._getNetworkInfo();if(!await this._verifyConnectivity()){this._updateStatus({state:g.DEGRADED,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt},A);return}let E=this._determineNetworkQuality(O);this._updateStatus({state:E,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt,lastChanged:this.status.state!==E?Date.now():this.status.lastChanged},A)}catch(I){SA.error("Error checking network status:",I)}finally{this._checking=!1}}_getBasicOnlineStatus(){return typeof navigator>"u"||typeof navigator.onLine!="boolean"?!0:navigator.onLine}_getNetworkInfo(){if(!this.browser.hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:this._mapConnectionType(A.type),effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData}:null}_mapConnectionType(A){return A&&{wifi:$.WIFI,cellular:$.CELLULAR,ethernet:$.ETHERNET,none:$.NONE,unknown:$.UNKNOWN}[A]||$.UNKNOWN}async _verifyConnectivity(){if(!this._getBasicOnlineStatus())return!1;let A=["https://www.google.com/favicon.ico","https://www.cloudflare.com/favicon.ico","https://www.github.com/favicon.ico"];for(let I of A)try{let O=new AbortController,U=setTimeout(()=>O.abort(),3e3),E=await fetch(I,{method:"HEAD",mode:"no-cors",cache:"no-cache",signal:O.signal});return clearTimeout(U),!0}catch{continue}return!1}_determineNetworkQuality(A){return A&&(A.effectiveType&&(A.effectiveType==="slow-2g"||A.effectiveType==="2g")||A.rtt&&A.rtt>500||A.downlink&&A.downlink<.5)?g.DEGRADED:g.ONLINE}_updateStatus(A,I=!1){let O={...this.status};this.status={...this.status,...A},(I||O.state!==this.status.state||O.type!==this.status.type)&&(SA.info(`Network status changed: ${O.state} -> ${this.status.state}`,{type:this.status.type,effectiveType:this.status.effectiveType}),this._notifyListeners(O,this.status))}_notifyListeners(A,I){this.listeners.forEach((O,U)=>{try{O(I,A)}catch(E){SA.error(`Error in listener ${U}:`,E)}})}getStatus(){return{...this.status}}isOnline(){return this.status.state===g.ONLINE||this.status.state===g.DEGRADED}isFullyOnline(){return this.status.state===g.ONLINE}isOffline(){return this.status.state===g.OFFLINE}onChange(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}waitForOnline(A=3e4){let I=nA();if(this.isOnline())return I.resolve(),I.promise;let O=setTimeout(()=>{U(),I.reject(new Error(`Timeout waiting for network after ${A}ms`))},A),U=this.onChange(E=>{(E.state===g.ONLINE||E.state===g.DEGRADED)&&(clearTimeout(O),U(),I.resolve())});return I.promise}async checkNow(){return await this._checkStatus(!0),this.getStatus()}destroy(){this._checkInterval&&(clearInterval(this._checkInterval),this._checkInterval=null),this.listeners.clear(),SA.debug("Network monitor destroyed")}},m1=null;function UA(){return m1||(m1=new p1),m1}function G1(){return UA().isOnline()}function q2(N){return UA().onChange(N)}var r6=UA();var f=S("heartbeat"),EA={PING_SENT:"ping_sent",PONG_RECEIVED:"pong_received",MISSED:"missed",DEAD:"dead",LATENCY_UPDATED:"latency_updated"},w={STOPPED:"stopped",RUNNING:"running",WAITING:"waiting",FAILED:"failed"},g1=class{constructor(A={}){this.options={interval:3e4,timeout:1e4,maxMissed:2,adaptive:!0,...A},this.network=UA(),this.state=w.STOPPED,this.pingInterval=null,this.pingTimeout=null,this.missedCount=0,this.lastPingTime=0,this.lastPongTime=0,this.latency=null,this.latencyHistory=[],this.pingId=0,this.listeners=new Map,this.pendingPings=new Map,this._sendPing=this._sendPing.bind(this),this._handlePongTimeout=this._handlePongTimeout.bind(this),this._onNetworkChange=this._onNetworkChange.bind(this),f.debug("Heartbeat manager created",this.options)}start(){if(this.state!==w.STOPPED){f.warn("Heartbeat already running or failed");return}if(!this.network.isOnline()){f.info("Network offline, heartbeat will start when online"),this.network.onChange(this._onNetworkChange);return}this.state=w.RUNNING,this.missedCount=0,this._schedulePing(),f.info("Heartbeat started"),this._emit(EA.PING_SENT,{state:this.state})}stop(){this.state=w.STOPPED,this._clearTimers(),this.missedCount=0,this.pendingPings.clear(),f.info("Heartbeat stopped")}reset(){this.stop(),this.missedCount=0,this.latency=null,this.pendingPings.clear(),f.debug("Heartbeat reset")}pongReceived(A){let I=Date.now();this.lastPongTime=I;let O=null,U=null;if(A&&A.id)O=A.id,U=this.pendingPings.get(O)||null,this.pendingPings.delete(O);else{let E=Array.from(this.pendingPings.entries()).sort((K,B)=>B[1]-K[1])[0];E&&(O=E[0],U=E[1],this.pendingPings.delete(O))}if(U){let E=I-U;this._updateLatency(E)}this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null),this.missedCount=0,this.state=w.RUNNING,f.debug("Pong received",{pingId:O,latency:this.latency,missed:this.missedCount}),this._emit(EA.PONG_RECEIVED,{latency:this.latency,pingId:O}),this._schedulePing()}getStatus(){return{state:this.state,missed:this.missedCount,latency:this.latency,lastPing:this.lastPingTime,lastPong:this.lastPongTime,uptime:this.lastPingTime?Date.now()-this.lastPingTime:0}}getLatency(){return this.latency}isHealthy(){return this.state===w.RUNNING&&this.missedCount===0}isFailing(){return this.state===w.FAILED||this.missedCount>=this.options.maxMissed}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}_schedulePing(){this._clearTimers();let A=this.options.interval;this.options.adaptive&&this.network.getStatus().state==="degraded"&&(A=A*1.5),this.pingInterval=setTimeout(()=>{this._sendPing()},A)}_sendPing(){if(this.state===w.STOPPED)return;if(!this.network.isOnline()){f.debug("Network offline, skipping ping"),this._schedulePing();return}let A=Date.now();this.lastPingTime=A;let I=this.pingId++;this.pendingPings.set(I,A);try{let O={type:"ping",id:I,timestamp:A};this.options.sendPing(O),f.debug("Ping sent",{pingId:I}),this._emit(EA.PING_SENT,{pingId:I})}catch(O){f.error("Failed to send ping:",O),this._handlePongTimeout();return}this.state=w.WAITING,this.pingTimeout=setTimeout(()=>{this._handlePongTimeout(I)},this.options.timeout)}_handlePongTimeout(A){if(this.missedCount++,f.warn("Pong timeout",{pingId:A,missed:this.missedCount,max:this.options.maxMissed}),this._emit(EA.MISSED,{pingId:A,missed:this.missedCount,total:this.options.maxMissed}),this.pendingPings.delete(A),this.missedCount>=this.options.maxMissed){this._handleDeadConnection();return}this.state=w.RUNNING,this._schedulePing()}_handleDeadConnection(){this.state=w.FAILED,f.error("Heartbeat failed - connection appears dead",{missed:this.missedCount,lastPing:this.lastPingTime,lastPong:this.lastPongTime}),this._emit(EA.DEAD,{missed:this.missedCount,latency:this.latency}),this.stop()}_updateLatency(A){this.latencyHistory.push(A),this.latencyHistory.length>10&&this.latencyHistory.shift();let I=this.latencyHistory.reduce((O,U)=>O+U,0)/this.latencyHistory.length;this.latency=Math.round(I),this._emit(EA.LATENCY_UPDATED,{latency:this.latency,raw:A})}_onNetworkChange(A){A.state==="online"&&this.state===w.STOPPED&&(f.info("Network restored, starting heartbeat"),this.start()),A.state==="offline"&&this.state!==w.STOPPED&&(f.info("Network offline, stopping heartbeat"),this.stop())}_clearTimers(){this.pingInterval&&(clearTimeout(this.pingInterval),this.pingInterval=null),this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){f.error("Error in heartbeat listener:",U)}})}};function T1(N){return new g1(N)}var l=S("connection"),J={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTING:"disconnecting",RECONNECTING:"reconnecting",FAILED:"failed"},KA={INTENTIONAL:"intentional",NETWORK_LOST:"network_lost",SERVER_CLOSED:"server_closed",TIMEOUT:"timeout",HEARTBEAT_FAILED:"heartbeat_failed",ERROR:"error"},_={CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnect_failed",FAILED:"failed",STATE_CHANGED:"state_changed",STATS_UPDATED:"stats_updated"},f1=class{constructor(A,I={}){if(!ZA(A))throw new Error(`Invalid WebSocket URL: ${A}`);this.url=A,this.options={timeout:1e4,autoConnect:!1,reconnect:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},createWebSocket:O=>new WebSocket(O),...I},this.network=UA(),this.browser=p(),this.state=J.DISCONNECTED,this.ws=null,this.heartbeat=null,this.connectionAttempts=0,this.reconnectAttempts=0,this.lastConnectedAt=null,this.lastDisconnectedAt=null,this.disconnectReason=null,this.stats={connectedAt:null,disconnectedAt:null,connectionDuration:0,messagesSent:0,messagesReceived:0,bytesSent:0,bytesReceived:0,reconnectCount:0},this._connectionPromise=null,this._connectionResolve=null,this._connectionReject=null,this._disconnectPromise=null,this._disconnectResolve=null,this._reconnectTimer=null,this.listeners=new Map,this._networkUnsubscribe=this.network.onChange(O=>this._onNetworkChange(O)),this._handleOpen=this._handleOpen.bind(this),this._handleMessage=this._handleMessage.bind(this),this._handleClose=this._handleClose.bind(this),this._handleError=this._handleError.bind(this),this._handleHeartbeatEvent=this._handleHeartbeatEvent.bind(this),l.info("Connection manager created",{url:A}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}connect(){return this.state===J.CONNECTED?Promise.resolve():this.state===J.CONNECTING&&this._connectionPromise?this._connectionPromise:this.network.isOnline()?(this._setState(J.CONNECTING),this.reconnectAttempts=0,this.disconnectReason=null,this._connectionPromise=new Promise((A,I)=>{this._connectionResolve=A,this._connectionReject=I}),this._performConnection(),this._connectionPromise):(l.warn("Cannot connect: network offline"),Promise.reject(new Error("Network offline")))}disconnect(A=1e3,I=""){if(this.state===J.DISCONNECTED)return Promise.resolve();if(this._clearReconnectTimer(),this.disconnectReason=KA.INTENTIONAL,this._setState(J.DISCONNECTING),this._disconnectPromise=new Promise(O=>{this._disconnectResolve=O}),this.heartbeat&&this.heartbeat.stop(),this.ws){this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null;try{this.ws.close(A,I)}catch(O){l.error("Error closing WebSocket:",O)}}else this._cleanup(),this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null);return this._disconnectPromise}async reconnect(){return l.info("Forcing reconnection"),this.state!==J.DISCONNECTED&&await this.disconnect(1e3,"Forced reconnection"),await mA(100),this.connect()}getStatus(){let A=Date.now();return{state:this.state,url:this.url,connectedAt:this.stats.connectedAt,disconnectedAt:this.stats.disconnectedAt,uptime:this.stats.connectedAt?A-this.stats.connectedAt:0,reconnectAttempts:this.reconnectAttempts,reconnectCount:this.stats.reconnectCount,disconnectReason:this.disconnectReason,messages:{sent:this.stats.messagesSent,received:this.stats.messagesReceived},bytes:{sent:this.stats.bytesSent,received:this.stats.bytesReceived},heartbeat:this.heartbeat?this.heartbeat.getStatus():null,network:this.network.getStatus()}}isConnected(){return this.state===J.CONNECTED}isHealthy(){return this.isConnected()&&(!this.heartbeat||this.heartbeat.isHealthy())}send(A){if(!this.isConnected()||!this.ws)throw new Error("Not connected");try{typeof A=="string"?this.stats.bytesSent+=new Blob([A]).size:A instanceof Blob?this.stats.bytesSent+=A.size:A instanceof ArrayBuffer&&(this.stats.bytesSent+=A.byteLength),this.ws.send(A),this.stats.messagesSent++}catch(I){throw l.error("Send failed:",I),I}}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}destroy(){l.info("Destroying connection manager"),this.state!==J.DISCONNECTED&&this.disconnect(1e3,"Manager destroyed"),this._networkUnsubscribe&&this._networkUnsubscribe(),this._clearReconnectTimer(),this.listeners.clear()}_performConnection(){if(!this.network.isOnline()){this._handleConnectionFailure(new Error("Network offline"),!0);return}l.info("Connecting...",{attempt:this.reconnectAttempts+1,url:this.url});try{this.ws=this.options.createWebSocket(this.url),this.ws.onopen=this._handleOpen,this.ws.onmessage=this._handleMessage,this.ws.onclose=this._handleClose,this.ws.onerror=this._handleError,this._connectionTimeout=setTimeout(()=>{if(this.state===J.CONNECTING){let A=new Error(`Connection timeout after ${this.options.timeout}ms`);this._handleConnectionFailure(A)}},this.options.timeout)}catch(A){this._handleConnectionFailure(A)}}_handleOpen(A){l.info("WebSocket opened"),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null);let I=Date.now();this.lastConnectedAt=I,this.stats.connectedAt=I,this.stats.disconnectedAt=null,this.reconnectAttempts>0&&this.stats.reconnectCount++,this.reconnectAttempts=0,this.options.heartbeat.enabled&&this._setupHeartbeat(),this._setState(J.CONNECTED),this._connectionResolve&&(this._connectionResolve(),this._connectionResolve=null,this._connectionReject=null),this._emit(_.CONNECTED,{timestamp:I})}_handleMessage(A){if(this.stats.messagesReceived++,typeof A.data=="string"?this.stats.bytesReceived+=new Blob([A.data]).size:A.data instanceof Blob?this.stats.bytesReceived+=A.data.size:A.data instanceof ArrayBuffer&&(this.stats.bytesReceived+=A.data.byteLength),this.heartbeat)try{let I=JSON.parse(A.data);if(I.type==="pong"){this.heartbeat.pongReceived(I);return}}catch{}this._emit("message",A.data)}_handleClose(A){l.info("WebSocket closed",{code:A.code,reason:A.reason,wasClean:A.wasClean});let I=this.disconnectReason===KA.INTENTIONAL;if(this.lastDisconnectedAt=Date.now(),this.stats.disconnectedAt=Date.now(),this.stats.connectedAt&&(this.stats.connectionDuration+=this.lastDisconnectedAt-this.stats.connectedAt),this.heartbeat&&(this.heartbeat.stop(),this.heartbeat=null),this._cleanup(),I){this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null),this._emit(_.DISCONNECTED,{reason:KA.INTENTIONAL,code:A.code});return}let O;this.network.isOnline()?A.code===1006?O=KA.TIMEOUT:O=KA.SERVER_CLOSED:O=KA.NETWORK_LOST,this.disconnectReason=O,this._handleReconnection(O,A)}_handleError(A){l.error("WebSocket error",A),this._emit("error",A)}_handleConnectionFailure(A,I=!1){l.error("Connection failed:",A.message),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),this._cleanup(),this._connectionReject&&(this._connectionReject(A),this._connectionResolve=null,this._connectionReject=null);let O=I?KA.NETWORK_LOST:KA.ERROR;this._handleReconnection(O,null,A)}_handleReconnection(A,I,O){if(this._setState(J.RECONNECTING),this.disconnectReason=A,this._emit(_.DISCONNECTED,{reason:A,code:I==null?void 0:I.code,error:O==null?void 0:O.message}),this.reconnectAttempts>=this.options.reconnect.maxAttempts){l.error("Max reconnection attempts reached",{attempts:this.reconnectAttempts}),this._setState(J.FAILED),this._emit(_.FAILED,{reason:"max_attempts",attempts:this.reconnectAttempts});return}let U=iA(this.reconnectAttempts,this.options.reconnect);l.info(`Reconnecting in ${U}ms`,{attempt:this.reconnectAttempts+1,max:this.options.reconnect.maxAttempts}),this._emit(_.RECONNECTING,{attempt:this.reconnectAttempts+1,maxAttempts:this.options.reconnect.maxAttempts,delay:U}),this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this.reconnectAttempts++,this._performConnection()},U)}_onNetworkChange(A){l.debug("Network changed:",A.state),A.state==="online"&&(this.state===J.RECONNECTING||this.state===J.DISCONNECTED)&&(l.info("Network restored, retrying connection"),this._clearReconnectTimer(),this._performConnection()),A.state==="offline"&&this.isConnected()&&l.warn("Network lost, connection will likely fail")}_handleHeartbeatEvent(A,I){A===EA.DEAD&&(l.error("Heartbeat dead, reconnecting"),this.disconnectReason=KA.HEARTBEAT_FAILED,this.ws&&this.ws.close()),A===EA.LATENCY_UPDATED&&this._emit("latency",{latency:I.latency})}_setupHeartbeat(){this.ws&&(this.heartbeat=T1({interval:this.options.heartbeat.interval,timeout:this.options.heartbeat.timeout,sendPing:A=>{try{this.ws.send(JSON.stringify(A)),this.stats.messagesSent++}catch(I){l.error("Failed to send ping:",I)}}}),this.heartbeat.onEvent(this._handleHeartbeatEvent),this.heartbeat.start())}_setState(A){let I=this.state;I!==A&&(this.state=A,l.debug(`State: ${I} -> ${A}`),this._emit(_.STATE_CHANGED,{from:I,to:A}))}_cleanup(){this.ws&&(this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null,this.ws=null),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null)}_clearReconnectTimer(){this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){l.error("Error in event listener:",U)}})}};function W1(N,A={}){return new f1(N,A)}var H=S("transport"),Z={WEBSOCKET:"websocket",EVENTSOURCE:"eventsource",POLLING:"polling",NONE:"none"},D={IDLE:"idle",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTED:"disconnected",FAILED:"failed"},e={CONNECT:"connect",MESSAGE:"message",DISCONNECT:"disconnect",ERROR:"error",TRANSPORT_CHANGED:"transport_changed"},kA=class{constructor(A,I={}){this.url=A,this.options=I,this.state=D.IDLE,this.listeners=new Map}connect(){throw new Error("Not implemented")}disconnect(){throw new Error("Not implemented")}send(A){throw new Error("Not implemented")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){H.error("Error in event listener:",E)}})}getState(){return this.state}getType(){return Z.NONE}},w1=class extends kA{constructor(A,I={}){super(A,I),this.ws=null,this.pendingMessages=[],this.type=Z.WEBSOCKET}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,H.info("WebSocket connecting to:",this.url);try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{for(H.info("WebSocket connected"),this.state=D.CONNECTED;this.pendingMessages.length>0;){let A=this.pendingMessages.shift();this.send(A)}this._emit(e.CONNECT,{transport:this.type})},this.ws.onmessage=A=>{this._emit(e.MESSAGE,A.data)},this.ws.onclose=A=>{H.info("WebSocket closed",{code:A.code,reason:A.reason}),this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{code:A.code,reason:A.reason,wasClean:A.wasClean})},this.ws.onerror=A=>{H.error("WebSocket error:",A),this._emit(e.ERROR,A)}}catch(A){H.error("WebSocket creation failed:",A),this.state=D.FAILED,this._emit(e.ERROR,A)}}}disconnect(){this.ws&&(this.ws.close(1e3,"Intentional disconnect"),this.ws=null),this.state=D.DISCONNECTED,this.pendingMessages=[]}send(A){if(this.state===D.CONNECTED&&this.ws)try{return this.ws.send(A),!0}catch(I){return H.error("WebSocket send failed:",I),!1}else return this.pendingMessages.push(A),!1}},v1=class extends kA{constructor(A,I={}){super(A,I),this.es=null,this.sendQueue=[],this.type=Z.EVENTSOURCE,this.connectUrl=A,this.sendUrl=A.replace(/^ws/,"http").replace(/^wss/,"https")}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,H.info("EventSource connecting to:",this.connectUrl);try{this.es=new EventSource(this.connectUrl),this.es.onopen=()=>{H.info("EventSource connected"),this.state=D.CONNECTED,this._emit(e.CONNECT,{transport:this.type})},this.es.onmessage=A=>{this._emit(e.MESSAGE,A.data)},this.es.onerror=A=>{H.error("EventSource error:",A),this.state===D.CONNECTED&&(this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"error"})),this._emit(e.ERROR,A)}}catch(A){H.error("EventSource creation failed:",A),this.state=D.FAILED,this._emit(e.ERROR,A)}}}disconnect(){this.es&&(this.es.close(),this.es=null),this.state=D.DISCONNECTED,this.sendQueue=[]}send(A){if(this.state!==D.CONNECTED)return this.sendQueue.push(A),!1;try{return fetch(this.sendUrl,{method:"POST",body:A,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(I=>{H.error("EventSource send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return H.error("EventSource send failed:",I),!1}}},V1=class extends kA{constructor(A,I={}){super(A,I),this.pollingInterval=I.pollingInterval||3e3,this.pollingActive=!1,this.sendQueue=[],this.messageQueue=[],this.pollTimeout=null,this.type=Z.POLLING,this.baseUrl=A.replace(/^ws/,"http").replace(/^wss/,"https"),this.pollUrl=`${this.baseUrl}/poll`,this.sendUrl=`${this.baseUrl}/send`}getType(){return this.type}connect(){this.state===D.IDLE&&(this.state=D.CONNECTING,H.info("Polling connecting to:",this.baseUrl),this.pollingActive=!0,this._poll(),this.state=D.CONNECTED,this._emit(e.CONNECT,{transport:this.type}))}disconnect(){this.pollingActive=!1,this.pollTimeout&&(clearTimeout(this.pollTimeout),this.pollTimeout=null),this.state=D.DISCONNECTED,this.sendQueue=[],this.messageQueue=[]}send(A){if(this.state!==D.CONNECTED)return this.sendQueue.push(A),!1;try{return fetch(this.sendUrl,{method:"POST",body:A,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(I=>{H.error("Polling send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return H.error("Polling send failed:",I),!1}}async _poll(){if(this.pollingActive){try{let A=new AbortController,I=setTimeout(()=>A.abort(),3e4),O=await fetch(this.pollUrl,{method:"GET",signal:A.signal,headers:{"Cache-Control":"no-cache"}});if(clearTimeout(I),O.ok){let U=await O.text();U&&this._emit(e.MESSAGE,U)}}catch(A){if(A.name==="AbortError")H.debug("Poll timeout, restarting");else if(H.error("Poll failed:",A),this._emit(e.ERROR,A),!navigator.onLine){this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"network_lost"});return}}this.pollingActive&&(this.pollTimeout=setTimeout(()=>this._poll(),this.pollingInterval))}}},y1=class{constructor(A,I={}){this.url=A,this.options={transports:[Z.WEBSOCKET,Z.EVENTSOURCE,Z.POLLING],timeout:1e4,pollingInterval:3e3,...I},this.browser=p(),this.network=UA(),this.currentTransport=null,this.transportType=Z.NONE,this.state=D.IDLE,this.listeners=new Map,this.availableTransports=this._getAvailableTransports(),H.info("Transport manager created",{available:this.availableTransports})}async connect(){if(this.state===D.CONNECTED)return;if(this.state=D.CONNECTING,!this.network.isOnline()){let I=new Error("Network offline");throw this._emit(e.ERROR,I),I}for(let I of this.availableTransports){H.info(`Trying transport: ${I}`);try{await this._tryTransport(I),H.info(`Connected using ${I}`),this.transportType=I,this.state=D.CONNECTED,this._emit(e.TRANSPORT_CHANGED,{transport:I}),this._emit(e.CONNECT,{transport:I});return}catch(O){H.warn(`Transport ${I} failed:`,O.message)}}this.state=D.FAILED;let A=new Error("No transport available");throw this._emit(e.ERROR,A),A}disconnect(){this.currentTransport&&(this.currentTransport.disconnect(),this.currentTransport=null),this.transportType=Z.NONE,this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"intentional"})}send(A){return!this.currentTransport||this.state!==D.CONNECTED?!1:this.currentTransport.send(A)}getTransportType(){return this.transportType}getState(){return this.state}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_tryTransport(A){return new Promise((I,O)=>{let U;switch(A){case Z.WEBSOCKET:U=new w1(this.url,this.options);break;case Z.EVENTSOURCE:U=new v1(this.url,this.options);break;case Z.POLLING:U=new V1(this.url,this.options);break;default:O(new Error(`Unknown transport: ${A}`));return}let E,K,B=()=>{E&&E(),K&&K(),clearTimeout(R)},R=setTimeout(()=>{U.disconnect(),B(),O(new Error(`Transport ${A} timeout`))},this.options.timeout);E=U.on(e.CONNECT,()=>{this.currentTransport=U,this._forwardTransportEvents(U),B(),I()}),K=U.on(e.ERROR,M=>{B(),O(M||new Error(`Transport ${A} failed`))}),U.connect()})}_forwardTransportEvents(A){[e.MESSAGE,e.DISCONNECT,e.ERROR].forEach(O=>{A.on(O,U=>{this._emit(O,U),O===e.DISCONNECT&&(this.state=D.DISCONNECTED)})})}_getAvailableTransports(){return this.options.transports.filter(A=>{switch(A){case Z.WEBSOCKET:return this.browser.hasWebSocket;case Z.EVENTSOURCE:return typeof EventSource<"u";case Z.POLLING:return!0;default:return!1}})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){H.error("Error in event listener:",E)}})}};function Y1(N,A={}){return new y1(N,A)}var qA=S("client"),V4={autoConnect:!1,timeout:1e4,reconnect:!0,reconnectOptions:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},transport:{transports:["websocket","eventsource","polling"],pollingInterval:3e3},debug:!1},F1=class{constructor(A,I={}){if(!ZA(A))throw new TypeError(`Invalid WebSocket URL: ${A}`);this.url=A,this.options=Z1(V4,I),this.options.debug&&qA.debug("Debug mode enabled"),this.browser=p(),this.transport=Y1(A,{transports:this.options.transport.transports,timeout:this.options.timeout,pollingInterval:this.options.transport.pollingInterval}),this.connection=W1(A,{timeout:this.options.timeout,reconnect:{maxAttempts:this.options.reconnectOptions.maxAttempts,baseDelay:this.options.reconnectOptions.baseDelay,maxDelay:this.options.reconnectOptions.maxDelay,jitter:this.options.reconnectOptions.jitter},heartbeat:this.options.heartbeat,createWebSocket:null,transport:this.transport}),this.messageHandlers=new Map,this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.messageCounter=0,this.pendingAcks=new Map,this._handleConnectionEvent=this._handleConnectionEvent.bind(this),this._handleTransportMessage=this._handleTransportMessage.bind(this),this._setupEventForwarding(),qA.info("WebSocket client created",{url:A,options:this.options,browser:this.browser.browserInfo.name}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}_setupEventForwarding(){this.connection.onEvent((A,I)=>{this._handleConnectionEvent(A,I)}),this.transport.on(e.MESSAGE,A=>{this._handleTransportMessage(A)}),this.transport.on(e.ERROR,A=>{this._triggerEvent("error",A)})}_handleConnectionEvent(A,I){switch(A){case _.CONNECTED:this._triggerEvent("open",I);break;case _.DISCONNECTED:this._triggerEvent("close",I);break;case _.RECONNECTING:this._triggerEvent("reconnectAttempt",{attempt:I.attempt,maxAttempts:I.maxAttempts,delay:I.delay});break;case _.FAILED:this._triggerEvent("error",new Error(`Connection failed: ${I.reason}`));break;case"latency":this._triggerEvent("latency",I);break}}_handleTransportMessage(A){let I=A;if(typeof A=="string")try{I=JSON.parse(A)}catch{}if(I&&I.type==="ack"&&I.id){this._handleAck(I.id,I);return}I&&I.type&&this.messageHandlers.has(I.type)&&this.messageHandlers.get(I.type).forEach(U=>{try{U(I.data||I)}catch(E){qA.error("Error in message handler:",E)}}),this._triggerEvent("message",I)}_handleAck(A,I){if(this.pendingAcks.has(A)){let{resolve:O,reject:U}=this.pendingAcks.get(A);I.success?O(I.result||I):U(new Error(I.error||"Unknown error")),this.pendingAcks.delete(A)}}connect(){return this.connection.connect()}disconnect(A=1e3,I=""){return this.connection.disconnect(A,I)}send(A){if(!this.isConnected())throw new Error("Not connected");let I=A;A&&typeof A=="object"&&!(A instanceof ArrayBuffer)&&!(A instanceof Blob)&&(I=JSON.stringify(A)),this.connection.send(I)}sendWithAck(A,I,O=1e4){if(!this.isConnected())return Promise.reject(new Error("Not connected"));let U=`${Date.now()}-${this.messageCounter++}`,E=nA(),K={type:A,data:I,id:U,ack:!0},B=setTimeout(()=>{this.pendingAcks.has(U)&&(this.pendingAcks.delete(U),E.reject(new Error("Acknowledgement timeout")))},O);return this.pendingAcks.set(U,{resolve:R=>{clearTimeout(B),E.resolve(R)},reject:R=>{clearTimeout(B),E.reject(R)}}),this.connection.send(JSON.stringify(K)),E.promise}onMessage(A,I){return this.messageHandlers.has(A)||this.messageHandlers.set(A,[]),this.messageHandlers.get(A).push(I),this}offMessage(A,I){if(!this.messageHandlers.has(A))return this;if(I){let O=this.messageHandlers.get(A),U=O.indexOf(I);U!==-1&&O.splice(U,1)}else this.messageHandlers.delete(A);return this}on(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(typeof I!="function")throw new TypeError("Handler must be a function");return this.eventHandlers[A]||(this.eventHandlers[A]=[]),this.eventHandlers[A].push(I),this}off(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(!this.eventHandlers[A])return this;if(I){let U=this.eventHandlers[A].indexOf(I);U!==-1&&this.eventHandlers[A].splice(U,1)}else this.eventHandlers[A]=[];return this}_triggerEvent(A,I){(this.eventHandlers[A]||[]).forEach(U=>{try{U(I)}catch(E){qA.error(`Error in ${A} handler:`,E)}})}isConnected(){return this.connection.isConnected()}isHealthy(){return this.connection.isHealthy()}getStatus(){var O,U,E;let A=this.connection.getStatus(),I=G1();return{connected:this.isConnected(),state:A.state,url:this.url,transport:this.transport.getTransportType(),latency:(O=A.heartbeat)==null?void 0:O.latency,uptime:A.uptime,messagesSent:(U=A.messages)==null?void 0:U.sent,messagesReceived:(E=A.messages)==null?void 0:E.received,reconnectAttempts:A.reconnectAttempts,networkOnline:I,browser:this.browser.browserInfo.name}}reconnect(){return this.connection.reconnect()}getTransportType(){return this.transport.getTransportType()}destroy(){qA.info("Destroying client"),this.disconnect(1e3,"Client destroyed"),this.messageHandlers.clear(),this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.pendingAcks.clear()}},z2=F1;var HA=S("packet"),j={MESSAGE:"message",EVENT:"event",COMMAND:"command",RESPONSE:"response",ERROR:"error",PING:"ping",PONG:"pong",JOIN:"join",LEAVE:"leave",PRESENCE:"presence",ACK:"ack",AUTH:"auth",SYSTEM:"system"},tA={CRITICAL:"critical",HIGH:"high",NORMAL:"normal",LOW:"low"},zA={AT_MOST_ONCE:"at_most_once",AT_LEAST_ONCE:"at_least_once",EXACTLY_ONCE:"exactly_once"},y4="1.0",$2=256*1024,F4=6e4;function j2(N){return N&&typeof N.id=="string"&&bA(N.type,j)&&N.timestamp&&typeof N.timestamp=="number"}var cA=class N{constructor(A,I,O={}){if(!bA(A,j)){if(typeof A!="string")throw new Error(`Invalid message type: ${A}. Must be a string.`);HA.warn(`Unknown message type: ${A}. Using custom type.`)}if(O.namespace&&!_A(O.namespace))throw new Error(`Invalid namespace: ${O.namespace}. Must start with / and contain only letters, numbers, underscores, and hyphens.`);if(O.priority&&!bA(O.priority,tA))throw new Error(`Invalid priority: ${O.priority}. Must be one of: ${Object.values(tA).join(", ")}`);if(O.deliveryGuarantee&&!bA(O.deliveryGuarantee,zA))throw new Error(`Invalid delivery guarantee: ${O.deliveryGuarantee}. Must be one of: ${Object.values(zA).join(", ")}`);this.id=O.id||V("pkt"),this.type=A,this.payload=I,this.timestamp=Date.now(),this.version=y4,this.priority=O.priority||tA.NORMAL,this.requiresAck=O.requiresAck||!1,this.ttl=O.ttl||F4,this.namespace=O.namespace||"/",this.deliveryGuarantee=O.deliveryGuarantee||zA.AT_MOST_ONCE,this.metadata=O.metadata||{},this.from=O.from||null,this.inResponseTo=O.inResponseTo||null,this._checkSize(),HA.debug("Packet created",{id:this.id,type:this.type,namespace:this.namespace,size:this.getSize()})}_checkSize(){let A=this.getSize();A>$2&&HA.warn("Packet exceeds recommended size",{size:A,max:$2,id:this.id,type:this.type})}getSize(){return M1(this)}isExpired(){return L1(this.timestamp,this.ttl)}getRemainingTTL(){return k2(this.timestamp,this.ttl)}createResponse(A,I={}){return new N(j.RESPONSE,A,{...I,inResponseTo:this.id,namespace:this.namespace,priority:I.priority||this.priority})}createError(A,I={},O=500){return new N(j.ERROR,{code:O,message:A,details:I,originalType:this.type,originalId:this.id},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}createAck(A=null){return new N(j.ACK,{originalId:this.id,result:A,timestamp:Date.now()},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}serialize(){let A={id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo},I=u1(A);return I||(HA.error("Failed to serialize packet",{id:this.id}),null)}toObject(){return{id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo,size:this.getSize(),expired:this.isExpired()}}static deserialize(A){let I=typeof A=="string"?d1(A):A;if(!I)return HA.error("Failed to parse packet data"),null;if(!j2(I))return HA.error("Invalid packet structure",I),null;try{return new N(I.type,I.payload,{id:I.id,priority:I.priority,requiresAck:I.requiresAck,ttl:I.ttl,namespace:I.namespace,deliveryGuarantee:I.deliveryGuarantee,metadata:I.metadata,from:I.from,inResponseTo:I.inResponseTo})}catch(O){return HA.error("Failed to create packet from data:",O),null}}static isValid(A){let I=typeof A=="string"?d1(A):A;return j2(I)}static fromRaw(A){return typeof A=="string"?N.deserialize(A):A instanceof Blob||A instanceof ArrayBuffer?new N(j.MESSAGE,A,{metadata:{binary:!0}}):(HA.warn("Unsupported raw data type:",typeof A),null)}};function Q2(N,A,I={}){return new cA(N,A,I)}function X2(N,A,I={}){return new cA(j.EVENT,{event:N,data:A},{priority:tA.LOW,...I})}function AI(N,A,I={}){return new cA(j.COMMAND,{command:N,params:A},{requiresAck:!0,priority:tA.HIGH,...I})}var k=S("router"),pA={EXACT:"exact",WILDCARD:"wildcard",REGEX:"regex",FUNCTION:"function"},II={CRITICAL:100,HIGH:200,NORMAL:300,LOW:400,FALLBACK:500},Q={PRE:"pre",POST:"post",AROUND:"around"},x1=class{constructor(A,I,O={}){this.pattern=A,this.handler=I,this.matchType=O.matchType||pA.EXACT,this.priority=O.priority||II.NORMAL,this.namespace=O.namespace||null,this.description=O.description||A.toString(),this.id=`${Date.now()}-${Math.random().toString(36).substring(2,8)}`,this.created=Date.now(),this.callCount=0,this.lastCalled=null}matches(A){if(this.namespace&&A.namespace!==this.namespace)return!1;let I=A.type;switch(this.matchType){case pA.EXACT:return I===this.pattern;case pA.WILDCARD:return this._matchWildcard(I,this.pattern);case pA.REGEX:return this.pattern.test(I);case pA.FUNCTION:return this.pattern(A);default:return!1}}execute(A,I){this.callCount++,this.lastCalled=Date.now();try{return this.handler(A,I)}catch(O){throw k.error(`Handler ${this.description} failed:`,O),O}}_matchWildcard(A,I){if(I==="*")return!0;let O=I.replace(/\./g,"\\.").replace(/\*/g,".*");return new RegExp(`^${O}$`).test(A)}getStats(){return{id:this.id,description:this.description,matchType:this.matchType,priority:this.priority,namespace:this.namespace,callCount:this.callCount,lastCalled:this.lastCalled,created:this.created}}},b1=class N{constructor(A={}){this.options={catchErrors:!0,asyncHandlers:!1,maxHandlersPerRoute:10,logHandling:!0,...A},this.routes=new Map,this.namespaces=new Map,this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this.stats={routesProcessed:0,handlersExecuted:0,errorsCaught:0,lastRoute:null},this._setupDefaultHandlers(),k.info("Router created")}_setupDefaultHandlers(){this.on("*",A=>{k.debug("Unhandled message type:",A.type)},{matchType:pA.WILDCARD,priority:II.FALLBACK,description:"Catch-all handler"}),this.on(j.ERROR,A=>{k.error("Received error packet:",A.payload)},{description:"Error handler"})}on(A,I,O={}){if(typeof I!="function")throw new TypeError("Handler must be a function");let U=new x1(A,I,O),E=this._getRouteKey(A,O.namespace);this.routes.has(E)||this.routes.set(E,[]);let K=this.routes.get(E);return K.length>=this.options.maxHandlersPerRoute&&k.warn(`Max handlers (${this.options.maxHandlersPerRoute}) reached for route:`,E),K.push(U),K.sort((B,R)=>B.priority-R.priority),k.debug("Handler registered",{pattern:A,namespace:O.namespace,priority:O.priority}),()=>{this.off(A,I,O.namespace)}}off(A,I,O){let U=this._getRouteKey(A,O),E=this.routes.get(U);if(!E)return;let K=E.findIndex(B=>B.handler===I);K!==-1&&(E.splice(K,1),k.debug("Handler removed",{pattern:A,namespace:O})),E.length===0&&this.routes.delete(U)}once(A,I,O={}){let U=(E,K)=>{I(E,K),this.off(A,U,O.namespace)};this.on(A,U,O)}route(A,I={}){this.stats.routesProcessed++,this.stats.lastRoute=Date.now(),this._runMiddleware(Q.PRE,A,I);let O=this._findHandlers(A);if(O.length===0){k.debug("No handlers for packet type:",A.type);return}k.debug("Routing packet",{type:A.type,namespace:A.namespace,handlers:O.length});let U=[];for(let E of O)try{let K=this._runAroundMiddleware(A,I,E);if(K!==void 0)U.push(K);else{let B=E.execute(A,I);U.push(B)}this.stats.handlersExecuted++}catch(K){if(this.stats.errorsCaught++,this.options.catchErrors)k.error("Handler error:",K);else throw K}return this._runMiddleware(Q.POST,A,I,U),this.options.asyncHandlers?Promise.all(U):U}namespace(A){if(!this.namespaces.has(A)){let I=new N(this.options);I.on=(O,U,E={})=>this.on(O,U,{...E,namespace:A}),I.off=(O,U,E={})=>this.off(O,U,A),this.namespaces.set(A,I)}return this.namespaces.get(A)}use(A,I){if(!this.middleware[A])throw new Error(`Invalid middleware type: ${A}`);this.middleware[A].push(I),k.debug("Middleware added",{type:A})}removeMiddleware(A,I){let O=this.middleware[A].indexOf(I);O!==-1&&this.middleware[A].splice(O,1)}_findHandlers(A){let I=[];for(let[O,U]of this.routes)if(this._routeCouldMatch(O,A)){let E=U.filter(K=>K.matches(A));I.push(...E)}return I.sort((O,U)=>O.priority-U.priority),I}_routeCouldMatch(A,I){let[O,U,E]=A.split("|");return!(U&&U!==I.namespace)}_getRouteKey(A,I){return`${A instanceof RegExp?"regex":typeof A}|${I||""}|${A}`}_runMiddleware(A,I,O,U=null){for(let E of this.middleware[A])try{E(I,O,U)}catch(K){k.error(`Middleware (${A}) error:`,K)}}_runAroundMiddleware(A,I,O){let U;for(let E of this.middleware[Q.AROUND])if(U=E(A,I,(B,R)=>O.execute(B,R)),U!==void 0)break;return U}getRoutes(){let A=[];for(let[I,O]of this.routes)A.push({key:I,handlers:O.map(U=>U.getStats())});return A}getStats(){return{...this.stats,totalRoutes:this.routes.size,totalHandlers:Array.from(this.routes.values()).reduce((A,I)=>A+I.length,0),middlewareCount:{pre:this.middleware[Q.PRE].length,post:this.middleware[Q.POST].length,around:this.middleware[Q.AROUND].length},namespaces:this.namespaces.size}}reset(){this.routes.clear(),this.namespaces.clear(),this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this._setupDefaultHandlers(),k.info("Router reset")}};function OI(N={}){return new b1(N)}var BA=S("namespace"),oA={CREATED:"created",DESTROYED:"destroyed",USER_JOINED:"user_joined",USER_LEFT:"user_left",ERROR:"error"},x4={autoCreateRooms:!0,maxRooms:100,broadcastPresence:!0,persistState:!1,authRequired:!1},gA=class N{constructor(A,I,O={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);this.path=A,this.socket=I,this.options={...x4,...O},this.id=V("ns"),this.router=OI({catchErrors:!0}),this.rooms=new Map,this.users=new Map,this.children=new Map,this.handlers={[oA.CREATED]:[],[oA.DESTROYED]:[],[oA.USER_JOINED]:[],[oA.USER_LEFT]:[],[oA.ERROR]:[]},this.state={created:Date.now(),messageCount:0,userCount:0,roomCount:0},this._handleMessage=this._handleMessage.bind(this),BA.info("Namespace created",{path:this.path,id:this.id})}on(A,I){if(typeof I!="function")throw new TypeError("Handler must be a function");return this.router.on(A,(O,U)=>{I(O.payload,U)}),this}onMessage(A,I){return this.on(A,I)}emit(A,I,O={}){let U={type:A,data:I,namespace:this.path,timestamp:Date.now()};if(this.state.messageCount++,O.ack)return this.socket.sendWithAck(A,U,O.timeout);this.socket.send(U)}broadcast(A,I,O=[]){this.emit("broadcast",{event:A,data:I,except:O,namespace:this.path})}async joinRoom(A,I){if(!this.rooms.has(A)){if(this.rooms.size>=this.options.maxRooms)return BA.warn("Max rooms reached",{namespace:this.path}),!1;this.rooms.set(A,new Set)}return this.rooms.get(A).add(I),this.state.roomCount=this.rooms.size,BA.debug("User joined room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_joined",{room:A,userId:I},[I]),!0}leaveRoom(A,I){let O=this.rooms.get(A);O&&(O.delete(I),O.size===0&&this.rooms.delete(A),BA.debug("User left room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_left",{room:A,userId:I},[I]))}getRoomUsers(A){let I=this.rooms.get(A);return I?Array.from(I):[]}getRooms(){return Array.from(this.rooms.keys())}addUser(A,I={}){this.users.set(A,{...I,joined:Date.now(),rooms:[]}),this.state.userCount=this.users.size,BA.debug("User added to namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"online",data:I})}removeUser(A){for(let[I,O]of this.rooms)O.has(A)&&this.leaveRoom(I,A);this.users.delete(A),this.state.userCount=this.users.size,BA.debug("User removed from namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"offline"})}namespace(A,I={}){let O=this.path==="/"?A:`${this.path}${A}`;if(!this.children.has(O)){let U=new N(O,this.socket,{...this.options,...I});this.children.set(O,U)}return this.children.get(O)}_handleMessage(A){return A.namespace!==this.path?!1:(this.router.route(A,{namespace:this,socket:this.socket}),!0)}hasUser(A){return this.users.has(A)}getStats(){return{...this.state,path:this.path,id:this.id,userCount:this.users.size,roomCount:this.rooms.size,childCount:this.children.size}}destroy(){this.rooms.clear(),this.users.clear();for(let A of this.children.values())A.destroy();this.children.clear(),BA.info("Namespace destroyed",{path:this.path}),this._emit(oA.DESTROYED,{path:this.path,id:this.id})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){BA.error(`Error in ${A} handler:`,E)}})}_on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),this}},$A=class{constructor(A,I={}){this.socket=A,this.options=I,this.root=new gA("/",A,I),this.namespaces=new Map,this.namespaces.set("/",this.root),this._setupMessageHandler(),BA.info("NamespaceManager created")}_setupMessageHandler(){this.socket.on("message",A=>{let I=this.namespaces.get(A.namespace||"/");I&&I._handleMessage(A)})}of(A,I={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);if(this.namespaces.has(A))return this.namespaces.get(A);let O=new gA(A,this.socket,{...this.options,...I});return this.namespaces.set(A,O),BA.info("Namespace created via manager",{path:A}),O}list(){return Array.from(this.namespaces.keys())}remove(A){if(A==="/")throw new Error("Cannot remove root namespace");let I=this.namespaces.get(A);I&&(I.destroy(),this.namespaces.delete(A))}broadcastAll(A,I){for(let O of this.namespaces.values())O.broadcast(A,I)}getStats(){let A={};for(let[I,O]of this.namespaces)A[I]=O.getStats();return A}destroy(){for(let A of this.namespaces.values())A.destroy();this.namespaces.clear(),BA.info("NamespaceManager destroyed")}};function NI(N,A={}){return new $A(N,A)}var y=S("rooms"),q={USER_JOINED:"user_joined",USER_LEFT:"user_left",ROOM_CREATED:"room_created",ROOM_DESTROYED:"room_destroyed",ROOM_MESSAGE:"room_message",ROOM_UPDATED:"room_updated",ERROR:"error"},k1={PUBLIC:"public",PRIVATE:"private",HIDDEN:"hidden"},jA={TEMPORARY:"temporary",PERSISTENT:"persistent",ANONYMOUS:"anonymous"},b4={maxUsers:100,visibility:k1.PUBLIC,type:jA.TEMPORARY,broadcastPresence:!0,persistMessages:!1,maxHistory:100,inviteOnly:!1},_1=class{constructor(A,I={}){this.userId=A,this.joinedAt=Date.now(),this.lastActivity=Date.now(),this.role=I.role||"member",this.metadata=I.metadata||{},this.presence="online"}updateActivity(){this.lastActivity=Date.now()}setPresence(A){this.presence=A,this.updateActivity()}toJSON(){return{userId:this.userId,joinedAt:this.joinedAt,lastActivity:this.lastActivity,role:this.role,metadata:this.metadata,presence:this.presence}}},fA=class{constructor(A,I={}){this.name=A,this.id=V("room"),this.options={...b4,...I},this.members=new Map,this.messageHistory=[],this.metadata={...this.options.metadata,createdAt:Date.now(),createdBy:null},this.state={active:!0,memberCount:0,messageCount:0,lastActivity:Date.now()},this.handlers={[q.USER_JOINED]:[],[q.USER_LEFT]:[],[q.ROOM_MESSAGE]:[],[q.ROOM_UPDATED]:[],[q.ERROR]:[]},y.info("Room created",{name:this.name,id:this.id,visibility:this.options.visibility})}addMember(A,I={}){if(this.members.has(A))return y.debug("User already in room",{userId:A,room:this.name}),!1;if(this.members.size>=this.options.maxUsers)return y.warn("Room full",{room:this.name,max:this.options.maxUsers}),this._emit(q.ERROR,{code:"room_full",message:"Room has reached maximum capacity"}),!1;if(this.options.inviteOnly&&!I.invited)return y.warn("Attempt to join invite-only room",{userId:A,room:this.name}),!1;let O=new _1(A,I);return this.members.set(A,O),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User joined room",{userId:A,room:this.name,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_JOINED,{userId:A,room:this.name,timestamp:Date.now(),memberData:O.toJSON()}),!0}removeMember(A,I="left"){if(!this.members.has(A))return!1;let O=this.members.get(A);return this.members.delete(A),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User left room",{userId:A,room:this.name,reason:I,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_LEFT,{userId:A,room:this.name,reason:I,timestamp:Date.now(),memberData:O.toJSON()}),this.options.type===jA.TEMPORARY&&this.members.size===0&&this.destroy("Room empty"),!0}hasMember(A){return this.members.has(A)}getMember(A){let I=this.members.get(A);return I?I.toJSON():null}getMembers(){return Array.from(this.members.values()).map(A=>A.toJSON())}getMemberCount(){return this.members.size}message(A,I,O={}){if(!this.members.has(A)&&this.options.type!==jA.ANONYMOUS)throw new Error(`User ${A} is not in room ${this.name}`);let U={id:V("msg"),room:this.name,userId:A,message:I,timestamp:Date.now(),type:O.type||"message",metadata:O.metadata||{}};return this.members.has(A)&&this.members.get(A).updateActivity(),this.state.messageCount++,this.state.lastActivity=Date.now(),this.options.persistMessages&&(this.messageHistory.push(U),this.messageHistory.length>this.options.maxHistory&&(this.messageHistory=this.messageHistory.slice(-this.options.maxHistory))),y.debug("Room message",{room:this.name,userId:A,msgId:U.id}),this._emit(q.ROOM_MESSAGE,U),U.id}broadcast(A,I,O=[]){let U={room:this.name,event:A,data:I,timestamp:Date.now()};this._emit(A,U,O)}update(A,I=null){this.metadata={...this.metadata,...A,updatedAt:Date.now(),updatedBy:I},this._emit(q.ROOM_UPDATED,{room:this.name,updates:A,userId:I,timestamp:Date.now()})}getInfo(){return{id:this.id,name:this.name,options:{...this.options},metadata:{...this.metadata},state:{...this.state},memberCount:this.members.size,messageCount:this.state.messageCount}}getHistory(A=this.options.maxHistory){return this.messageHistory.slice(-A)}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}destroy(A="Room destroyed"){this.state.active=!1,y.info("Room destroyed",{name:this.name,id:this.id,reason:A,memberCount:this.members.size}),this._emit(q.ROOM_DESTROYED,{room:this.name,reason:A,timestamp:Date.now()}),this.members.clear(),this.messageHistory=[],this.handlers={}}_emit(A,I,O=[]){(this.handlers[A]||[]).forEach(E=>{try{E(I,O)}catch(K){y.error(`Error in ${A} handler:`,K)}})}},QA=class{constructor(A={}){this.options=A,this.rooms=new Map,this.roomIds=new Map,this.userRooms=new Map,y.info("RoomManager created")}createRoom(A,I={}){if(this.rooms.has(A))throw new Error(`Room "${A}" already exists`);let O=new fA(A,{...this.options,...I});return this.rooms.set(A,O),this.roomIds.set(O.id,A),y.info("Room created via manager",{name:A,id:O.id}),O}getOrCreateRoom(A,I={}){return this.rooms.has(A)?this.rooms.get(A):this.createRoom(A,I)}getRoom(A){return this.rooms.get(A)}getRoomById(A){let I=this.roomIds.get(A);return I?this.rooms.get(I):void 0}removeRoom(A,I="Room removed"){let O=this.rooms.get(A);O&&(O.getMembers().forEach(U=>{let E=this.userRooms.get(U.userId);E&&(E.delete(A),E.size===0&&this.userRooms.delete(U.userId))}),O.destroy(I),this.rooms.delete(A),this.roomIds.delete(O.id),y.info("Room removed",{name:A}))}addUserToRoom(A,I,O={}){let U=this.rooms.get(I);if(!U)return y.warn("Room not found",{roomName:I}),!1;let E=U.addMember(A,O);return E&&(this.userRooms.has(A)||this.userRooms.set(A,new Set),this.userRooms.get(A).add(I)),E}removeUserFromRoom(A,I,O="left"){let U=this.rooms.get(I);if(U){U.removeMember(A,O);let E=this.userRooms.get(A);E&&(E.delete(I),E.size===0&&this.userRooms.delete(A))}}removeUserFromAllRooms(A,I="disconnected"){let O=this.userRooms.get(A);O&&O.forEach(U=>{this.removeUserFromRoom(A,U,I)})}getUserRooms(A){let I=this.userRooms.get(A);return I?Array.from(I):[]}listRooms(A={}){let I=Array.from(this.rooms.values());return A.visibility&&(I=I.filter(O=>O.options.visibility===A.visibility)),A.hasMember&&(I=I.filter(O=>O.hasMember(A.hasMember))),A.minMembers&&(I=I.filter(O=>O.getMemberCount()>=A.minMembers)),I.map(O=>O.getInfo())}broadcastToRooms(A,I,O){A.forEach(U=>{let E=this.rooms.get(U);E&&E.broadcast(I,O)})}getStats(){let A={};for(let[I,O]of this.rooms)A[I]={memberCount:O.getMemberCount(),messageCount:O.state.messageCount,type:O.options.type};return{totalRooms:this.rooms.size,totalUsersInRooms:this.userRooms.size,rooms:A}}destroy(){for(let A of this.rooms.values())A.destroy("Manager destroyed");this.rooms.clear(),this.roomIds.clear(),this.userRooms.clear(),y.info("RoomManager destroyed")}};function UI(N={}){return new QA(N)}function EI(N,A={}){return new fA(N,A)}var F=S("presence"),d={ONLINE:"online",AWAY:"away",BUSY:"busy",OFFLINE:"offline",CONNECTING:"connecting",RECONNECTING:"reconnecting"},KI={TYPING:"typing",TYPING_STOPPED:"typing_stopped",VIEWING:"viewing",EDITING:"editing",IDLE:"idle"},o={STATE_CHANGED:"state_changed",ACTIVITY_UPDATED:"activity_updated",USER_ONLINE:"user_online",USER_OFFLINE:"user_offline",TYPING_STARTED:"typing_started",TYPING_STOPPED:"typing_stopped",SUBSCRIBED:"subscribed",UNSUBSCRIBED:"unsubscribed",ERROR:"error"},q1={heartbeatInterval:3e4,offlineTimeout:7e4,idleTimeout:3e5,broadcastChanges:!0,trackTyping:!0,typingTimeout:3e3,maxSubscribers:1e3,persistHistory:!1,maxHistory:100},z1=class{constructor(A,I={}){this.userId=A,this.state=d.CONNECTING,this.previousState=null,this.metadata={name:I.name||A,avatar:I.avatar||null,email:I.email||null,...I.metadata},this.lastSeen=Date.now(),this.lastActivity=Date.now(),this.lastStateChange=Date.now(),this.currentActivity=null,this.typingIn=new Set,this.typingTimeout=null,this.lastHeartbeat=Date.now(),this.heartbeatTimer=null,this.subscribers=new Set,this.history=[],this.status=I.status||null,this.statusMessage=I.statusMessage||"",F.debug("UserPresence created",{userId:A})}updateState(A,I=null){if(this.state===A)return null;this.previousState=this.state,this.state=A,this.lastStateChange=Date.now(),A===d.ONLINE&&(this.lastHeartbeat=Date.now());let O={userId:this.userId,from:this.previousState,to:this.state,timestamp:this.lastStateChange,reason:I};return this._addToHistory("state_change",O),F.debug("Presence state changed",O),O}updateActivity(A,I={}){this.lastActivity=Date.now(),this.currentActivity={type:A,data:I,timestamp:this.lastActivity},this.state===d.AWAY&&this.updateState(d.ONLINE,"activity"),F.debug("Activity updated",{userId:this.userId,activity:A})}startTyping(A){return this.typingIn.has(A)?!1:(this.typingIn.add(A),this.typingTimeout&&(clearTimeout(this.typingTimeout),this.typingTimeout=null),F.debug("Started typing",{userId:this.userId,room:A}),!0)}stopTyping(A){return this.typingIn.has(A)?(this.typingIn.delete(A),F.debug("Stopped typing",{userId:this.userId,room:A}),!0):!1}isTyping(A){return this.typingIn.has(A)}getTypingRooms(){return Array.from(this.typingIn)}heartbeat(){this.lastHeartbeat=Date.now(),this.lastSeen=this.lastHeartbeat}isHeartbeatStale(A){return Date.now()-this.lastHeartbeat>A}addSubscriber(A){this.subscribers.add(A)}removeSubscriber(A){this.subscribers.delete(A)}getSubscribers(){return Array.from(this.subscribers)}getInfo(){return{userId:this.userId,state:this.state,previousState:this.previousState,metadata:this.metadata,lastSeen:this.lastSeen,lastActivity:this.lastActivity,lastStateChange:this.lastStateChange,currentActivity:this.currentActivity,typingIn:this.getTypingRooms(),status:this.status,statusMessage:this.statusMessage,subscribers:this.subscribers.size}}_addToHistory(A,I){let O={type:A,data:I,timestamp:Date.now()};this.history.push(O),this.history.length>q1.maxHistory&&(this.history=this.history.slice(-q1.maxHistory))}},XA=class{constructor(A={}){this.options={...q1,...A},this.users=new Map,this.roomPresence=new Map,this.userSubscriptions=new Map,this.heartbeatInterval=null,this._startHeartbeatCheck(),this.handlers={[o.STATE_CHANGED]:[],[o.ACTIVITY_UPDATED]:[],[o.USER_ONLINE]:[],[o.USER_OFFLINE]:[],[o.TYPING_STARTED]:[],[o.TYPING_STOPPED]:[],[o.SUBSCRIBED]:[],[o.UNSUBSCRIBED]:[],[o.ERROR]:[]},this.stats={totalUsers:0,onlineUsers:0,awayUsers:0,busyUsers:0,totalSubscriptions:0,typingEvents:0,stateChanges:0},F.info("PresenceManager created",this.options)}registerUser(A,I={}){if(this.users.has(A))return this.users.get(A);let O=new z1(A,I);return this.users.set(A,O),this.stats.totalUsers=this.users.size,F.debug("User registered",{userId:A}),O}unregisterUser(A,I="user_left"){if(this.users.get(A)){this.updateUserState(A,d.OFFLINE,I);for(let[U,E]of this.roomPresence)E.has(A)&&E.delete(A);this.userSubscriptions.delete(A),this.users.delete(A),this.stats.totalUsers=this.users.size,F.debug("User unregistered",{userId:A,reason:I})}}updateUserState(A,I,O=null){let U=this.users.get(A);if(!U)return F.warn("User not found",{userId:A}),!1;let E=U.updateState(I,O);return E&&(this.stats.stateChanges++,I===d.ONLINE?(this.stats.onlineUsers++,this._emit(o.USER_ONLINE,{userId:A,metadata:U.metadata,timestamp:E.timestamp})):I===d.OFFLINE&&(this.stats.onlineUsers=Math.max(0,this.stats.onlineUsers-1),this._emit(o.USER_OFFLINE,{userId:A,timestamp:E.timestamp})),this.options.broadcastChanges&&this._broadcastToSubscribers(A,o.STATE_CHANGED,E),this._emit(o.STATE_CHANGED,E)),!0}recordActivity(A,I,O={}){let U=this.users.get(A);U&&(U.updateActivity(I,O),this._emit(o.ACTIVITY_UPDATED,{userId:A,activity:I,data:O,timestamp:Date.now()}))}startTyping(A,I){let O=this.users.get(A);!O||!this.options.trackTyping||O.startTyping(I)&&(this.stats.typingEvents++,this._broadcastToRoom(I,o.TYPING_STARTED,{userId:A,room:I,timestamp:Date.now()}),this._emit(o.TYPING_STARTED,{userId:A,room:I,timestamp:Date.now()}),setTimeout(()=>{this.stopTyping(A,I,!0)},this.options.typingTimeout))}stopTyping(A,I,O=!1){let U=this.users.get(A);U&&U.stopTyping(I)&&(this._broadcastToRoom(I,o.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}),this._emit(o.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}))}userJoinedRoom(A,I){this.roomPresence.has(I)||this.roomPresence.set(I,new Set),this.roomPresence.get(I).add(A),F.debug("User joined room presence",{userId:A,room:I})}userLeftRoom(A,I){let O=this.roomPresence.get(I);O&&(O.delete(A),this.stopTyping(A,I),O.size===0&&this.roomPresence.delete(I))}subscribe(A,I){let O=this.users.get(I);return O?O.getSubscribers().length>=this.options.maxSubscribers?(this._emit(o.ERROR,{code:"max_subscribers",message:"User has reached maximum subscribers",userId:I}),!1):(O.addSubscriber(A),this.userSubscriptions.has(A)||this.userSubscriptions.set(A,new Set),this.userSubscriptions.get(A).add(I),this.stats.totalSubscriptions++,this._emit(o.SUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()}),!0):(F.warn("Cannot subscribe to non-existent user",{targetUserId:I}),!1)}unsubscribe(A,I){let O=this.users.get(I);O&&O.removeSubscriber(A);let U=this.userSubscriptions.get(A);U&&(U.delete(I),U.size===0&&this.userSubscriptions.delete(A)),this.stats.totalSubscriptions=Math.max(0,this.stats.totalSubscriptions-1),this._emit(o.UNSUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()})}getUserPresence(A){let I=this.users.get(A);return I?I.getInfo():null}getRoomUsers(A,I=!0){let O=this.roomPresence.get(A)||new Set;return I?Array.from(O).map(U=>this.getUserPresence(U)).filter(Boolean):Array.from(O)}getTypingUsers(A){var O;let I=[];for(let[U,E]of this.users)E.isTyping(A)&&I.push({userId:U,metadata:E.metadata,startedAt:(O=E.currentActivity)==null?void 0:O.timestamp});return I}heartbeat(A){let I=this.users.get(A);I&&(I.heartbeat(),I.state===d.OFFLINE&&this.updateUserState(A,d.ONLINE,"heartbeat"))}getStats(){let A=0,I=0,O=0,U=0;for(let E of this.users.values())switch(E.state){case d.ONLINE:A++;break;case d.AWAY:I++;break;case d.BUSY:O++;break;case d.OFFLINE:U++;break}return{...this.stats,online:A,away:I,busy:O,offline:U,totalRooms:this.roomPresence.size,activeSubscriptions:this.userSubscriptions.size}}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}_startHeartbeatCheck(){this.heartbeatInterval=setInterval(()=>{this._checkHeartbeats()},this.options.heartbeatInterval)}_checkHeartbeats(){let A=Date.now();for(let[I,O]of this.users)O.state!==d.OFFLINE&&O.isHeartbeatStale(this.options.offlineTimeout)?(F.debug("Heartbeat stale, marking offline",{userId:I}),this.updateUserState(I,d.OFFLINE,"heartbeat_timeout")):O.state===d.ONLINE&&A-O.lastActivity>this.options.idleTimeout&&this.updateUserState(I,d.AWAY,"idle")}_broadcastToSubscribers(A,I,O){let U=this.users.get(A);if(!U)return;U.getSubscribers().forEach(K=>{this._emit(I,{...O,for:K})})}_broadcastToRoom(A,I,O){(this.roomPresence.get(A)||new Set).forEach(E=>{this._emit(I,{...O,for:E})})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){F.error(`Error in ${A} handler:`,E)}})}destroy(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.users.clear(),this.roomPresence.clear(),this.userSubscriptions.clear(),this.handlers={},F.info("PresenceManager destroyed")}};function BI(N={}){return new XA(N)}function RI(N,A,I){let O=null,U=!1;return{start(){U||(N.startTyping(A,I),U=!0),O&&clearTimeout(O),O=setTimeout(()=>{this.stop()},3e3)},stop(){U&&(N.stopTyping(A,I),U=!1),O&&(clearTimeout(O),O=null)},isTyping(){return U}}}var z=S("ack"),m={PENDING:"pending",ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",FAILED:"failed",CANCELLED:"cancelled"},lA={ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",RETRY:"retry",FAILED:"failed",CANCELLED:"cancelled",LATENCY_UPDATED:"latency_updated"},_4={timeout:1e4,maxRetries:3,retryBaseDelay:1e3,retryMaxDelay:3e4,exponentialBackoff:!0,cleanupInterval:6e4,maxAckAge:3e5,trackLatency:!0},$1=class{constructor(A,I){this.messageId=A,this.state=m.PENDING,this.sentAt=Date.now(),this.lastAttempt=this.sentAt,this.attempts=0,this.timeout=I.timeout,this.maxRetries=I.maxRetries,this.sendCallback=I.sendCallback,this.metadata=I.metadata||{},this.ackReceivedAt=null,this.deferred=nA(),this._setTimeout(),z.debug("Ack entry created",{messageId:A,timeout:this.timeout,maxRetries:this.maxRetries})}_setTimeout(){this.timeoutId=setTimeout(()=>{this._handleTimeout()},this.timeout)}_handleTimeout(){this.attempts++,this.attempts>=this.maxRetries?(this.state=m.FAILED,this.deferred.reject(new Error(`Max retries (${this.maxRetries}) exceeded for message ${this.messageId}`)),z.warn("Message failed permanently",{messageId:this.messageId,attempts:this.attempts})):(this.state=m.TIMEOUT,this._scheduleRetry())}_scheduleRetry(){let A=iA(this.attempts-1,{baseDelay:this.metadata.retryBaseDelay||1e3,maxDelay:this.metadata.retryMaxDelay||3e4,jitter:!0});z.debug("Scheduling retry",{messageId:this.messageId,attempt:this.attempts,delay:A}),this.retryTimeout=setTimeout(()=>{this.lastAttempt=Date.now(),this.sendCallback(this.messageId),this._setTimeout()},A)}acknowledge(A){if(this.state===m.PENDING||this.state===m.TIMEOUT){this.state=m.ACKNOWLEDGED,this.ackReceivedAt=Date.now(),this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout);let I=this.ackReceivedAt-this.sentAt;this.deferred.resolve({messageId:this.messageId,data:A,latency:I,attempts:this.attempts+1}),z.debug("Message acknowledged",{messageId:this.messageId,latency:I,attempts:this.attempts+1})}}cancel(A="Cancelled"){this.state=m.CANCELLED,this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout),this.deferred.reject(new Error(A)),z.debug("Ack cancelled",{messageId:this.messageId,reason:A})}getStats(){return{messageId:this.messageId,state:this.state,sentAt:this.sentAt,lastAttempt:this.lastAttempt,attempts:this.attempts,ackReceivedAt:this.ackReceivedAt,latency:this.ackReceivedAt?this.ackReceivedAt-this.sentAt:null,metadata:this.metadata}}isExpired(A){return this.state===m.ACKNOWLEDGED?Date.now()-this.ackReceivedAt>A:this.state===m.FAILED||this.state===m.CANCELLED?Date.now()-this.lastAttempt>A:!1}},wA=class{constructor(A={}){this.options={..._4,...A},this.pending=new Map,this.completed=new Map,this.listeners=new Map,this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],this._startCleanup(),z.info("AckManager created",this.options)}track(A,I,O={}){if(this.pending.has(A))return z.warn("Message already being tracked",{messageId:A}),this.pending.get(A).deferred.promise;let U={timeout:O.timeout||this.options.timeout,maxRetries:O.maxRetries||this.options.maxRetries,retryBaseDelay:O.retryBaseDelay||this.options.retryBaseDelay,retryMaxDelay:O.retryMaxDelay||this.options.retryMaxDelay,sendCallback:I,metadata:O.metadata},E=new $1(A,U);this.pending.set(A,E),this.stats.totalTracked++;try{I(A)}catch(K){z.error("Initial send failed:",K),E.cancel(`Send failed: ${K.message}`)}return E.deferred.promise.then(K=>{this._handleAcknowledgement(A,K)}).catch(K=>{this._handleFailure(A,K)}),E.deferred.promise}acknowledge(A,I=null){let O=this.pending.get(A);if(!O){z.debug("Ack for untracked message (maybe already completed)",{messageId:A});return}O.acknowledge(I)}cancel(A,I="Cancelled"){let O=this.pending.get(A);O&&(O.cancel(I),this.pending.delete(A),this.stats.cancelled++)}isPending(A){return this.pending.has(A)}getStatus(A){let I=this.pending.get(A)||this.completed.get(A);return I?I.getStats():null}waitForAll(A,I=3e4){let O=A.map(U=>{let E=this.pending.get(U);return E?E.deferred.promise:Promise.reject(new Error(`Message ${U} not tracked`))});return Promise.all(O)}waitForAny(A){let I=A.map(O=>{let U=this.pending.get(O);return U?U.deferred.promise:Promise.reject(new Error(`Message ${O} not tracked`))});return Promise.race(I)}getPending(){return Array.from(this.pending.values()).map(A=>A.getStats())}getCompleted(){return Array.from(this.completed.values()).map(A=>A.getStats())}getStats(){let A=this.stats.acknowledged>0?this.stats.totalLatency/this.stats.acknowledged:0;return{...this.stats,avgLatency:A,pendingCount:this.pending.size,completedCount:this.completed.size,minLatency:this.stats.minLatency===1/0?0:this.stats.minLatency,maxLatency:this.stats.maxLatency,latencyHistory:this.latencyHistory.slice(-10)}}reset(){this.pending.forEach((A,I)=>{A.cancel("Manager reset")}),this.pending.clear(),this.completed.clear(),this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],z.info("AckManager reset")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_handleAcknowledgement(A,I){let O=this.pending.get(A);O&&(this.stats.acknowledged++,I.latency&&(this.stats.totalLatency+=I.latency,this.stats.minLatency=Math.min(this.stats.minLatency,I.latency),this.stats.maxLatency=Math.max(this.stats.maxLatency,I.latency),this.options.trackLatency&&(this.latencyHistory.push({messageId:A,latency:I.latency,timestamp:Date.now()}),this.latencyHistory.length>100&&this.latencyHistory.shift(),this._emit(lA.LATENCY_UPDATED,{latency:I.latency,avgLatency:this.stats.totalLatency/this.stats.acknowledged}))),this.pending.delete(A),this.completed.set(A,O),this._emit(lA.ACKNOWLEDGED,{messageId:A,attempts:I.attempts,latency:I.latency}))}_handleFailure(A,I){let O=this.pending.get(A);O&&(O.state===m.FAILED?(this.stats.failed++,this._emit(lA.FAILED,{messageId:A,error:I.message})):O.state===m.TIMEOUT?(this.stats.timedOut++,this.stats.retries+=O.attempts,this._emit(lA.TIMEOUT,{messageId:A,attempt:O.attempts})):O.state===m.CANCELLED&&(this.stats.cancelled++,this._emit(lA.CANCELLED,{messageId:A,reason:I.message})),(O.state===m.FAILED||O.state===m.CANCELLED)&&(this.pending.delete(A),this.completed.set(A,O)))}_startCleanup(){this.cleanupInterval=setInterval(()=>{this._cleanup()},this.options.cleanupInterval)}_cleanup(){let A=0;for(let[I,O]of this.completed)O.isExpired(this.options.maxAckAge)&&(this.completed.delete(I),A++);A>0&&z.debug("Cleaned up old ack entries",{cleaned:A})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){z.error(`Error in ${A} listener:`,E)}})}destroy(){this.cleanupInterval&&clearInterval(this.cleanupInterval),this.reset(),this.listeners.clear(),z.info("AckManager destroyed")}};function MI(N={}){return new wA(N)}function LI(N,A,I={}){return new wA(I).track(N,A,I)}var h=S("queue"),X={PENDING:"pending",PROCESSING:"processing",SENT:"sent",FAILED:"failed",DISCARDED:"discarded"},GA={ITEM_ADDED:"item_added",ITEM_REMOVED:"item_removed",ITEM_STATE_CHANGED:"item_state_changed",PROCESSING_STARTED:"processing_started",PROCESSING_STOPPED:"processing_stopped",QUEUE_FULL:"queue_full",QUEUE_EMPTIED:"queue_emptied"},RA={CRITICAL:0,HIGH:1,NORMAL:2,LOW:3},j1={maxSize:1e3,maxAge:10080*60*1e3,autoProcess:!0,batchSize:10,batchDelay:100,maxRetries:5,preserveOrder:!0,dropOldestWhenFull:!0},Q1=class N{constructor(A,I={}){this.id=I.id||V("q"),this.data=A,this.priority=I.priority||RA.NORMAL,this.state=X.PENDING,this.createdAt=Date.now(),this.updatedAt=this.createdAt,this.retries=I.retries||0,this.maxRetries=I.maxRetries||j1.maxRetries,this.ttl=I.ttl||j1.maxAge,this.metadata=I.metadata||{},this.error=null,this.size=M1(A),this.sequence=Date.now()+Math.random(),h.debug("Queue item created",{id:this.id,priority:this.priority,size:this.size})}setState(A,I=null){let O=this.state;return this.state=A,this.updatedAt=Date.now(),I&&(this.error=I),h.debug("Item state changed",{id:this.id,from:O,to:A,retries:this.retries}),{oldState:O,newState:A}}incrementRetry(){return this.retries++,this.updatedAt=Date.now(),this.retries}isExpired(){return L1(this.createdAt,this.ttl)}hasExceededRetries(){return this.retries>=this.maxRetries}getAge(){return Date.now()-this.createdAt}toJSON(){return{id:this.id,data:this.data,priority:this.priority,state:this.state,createdAt:this.createdAt,updatedAt:this.updatedAt,retries:this.retries,maxRetries:this.maxRetries,ttl:this.ttl,metadata:this.metadata,error:this.error,size:this.size,sequence:this.sequence}}static fromJSON(A){let I=new N(A.data,{id:A.id,priority:A.priority,retries:A.retries,maxRetries:A.maxRetries,ttl:A.ttl,metadata:A.metadata});return I.state=A.state,I.createdAt=A.createdAt,I.updatedAt=A.updatedAt,I.error=A.error,I.sequence=A.sequence,I}},A1=class{constructor(A={}){this.options={...j1,...A},this.items=new Map,this.pendingIds=[],this.priorityBuckets={[RA.CRITICAL]:new Set,[RA.HIGH]:new Set,[RA.NORMAL]:new Set,[RA.LOW]:new Set},this.isProcessing=!1,this.processingPromise=null,this.processor=null,this.stats={totalAdded:0,totalProcessed:0,totalFailed:0,totalDiscarded:0,totalExpired:0,currentSize:0,peakSize:0,averageProcessTime:0},this.listeners=new Map,this.processingTimes=[],h.info("QueueManager created",this.options)}add(A,I={}){if(this.items.size>=this.options.maxSize)if(this.options.dropOldestWhenFull)this._dropOldest();else throw h.warn("Queue full, rejecting new item"),this._emit(GA.QUEUE_FULL,{size:this.items.size}),new Error("Queue is full");let O=new Q1(A,{priority:I.priority,ttl:I.ttl,metadata:I.metadata,maxRetries:this.options.maxRetries});return this.items.set(O.id,O),this.pendingIds.push(O.id),this.priorityBuckets[O.priority].add(O.id),this.stats.totalAdded++,this.stats.currentSize=this.items.size,this.stats.peakSize=Math.max(this.stats.peakSize,this.items.size),h.debug("Item added to queue",{id:O.id,priority:O.priority,queueSize:this.items.size}),this._emit(GA.ITEM_ADDED,{id:O.id,priority:O.priority,queueSize:this.items.size}),this.options.autoProcess&&this.processor&&!this.isProcessing&&this.process(),O.id}addBatch(A){return A.map(I=>Array.isArray(I)?this.add(I[0],I[1]):this.add(I))}remove(A){let I=this.items.get(A);if(!I)return!1;this.items.delete(A);let O=this.pendingIds.indexOf(A);return O!==-1&&this.pendingIds.splice(O,1),this.priorityBuckets[I.priority].delete(A),this.stats.currentSize=this.items.size,h.debug("Item removed from queue",{id:A}),this._emit(GA.ITEM_REMOVED,{id:A,priority:I.priority,queueSize:this.items.size}),!0}get(A){let I=this.items.get(A);return I?this._toPublicItem(I):null}getAll(A={}){let I=Array.from(this.items.values());return A.state&&(I=I.filter(O=>O.state===A.state)),A.priority!==void 0&&(I=I.filter(O=>O.priority===A.priority)),I.sort((O,U)=>O.priority!==U.priority?O.priority-U.priority:O.sequence-U.sequence),I.map(O=>this._toPublicItem(O))}size(){return this.items.size}isEmpty(){return this.items.size===0}isFull(){return this.items.size>=this.options.maxSize}setProcessor(A){if(typeof A!="function")throw new TypeError("Processor must be a function");this.processor=A}async process(){if(!this.processor){h.warn("No processor set, cannot process queue");return}if(this.isProcessing)return this.processingPromise;if(this.isEmpty()){h.debug("Queue empty, nothing to process");return}this.isProcessing=!0,this._emit(GA.PROCESSING_STARTED,{size:this.items.size}),h.info("Started processing queue",{size:this.items.size}),this.processingPromise=this._processQueue();try{await this.processingPromise}finally{this.isProcessing=!1,this.processingPromise=null,this._emit(GA.PROCESSING_STOPPED,{remaining:this.items.size}),this.isEmpty()&&this._emit(GA.QUEUE_EMPTIED)}}stopProcessing(){this.isProcessing=!1,h.info("Processing stopped")}clear(){this.items.clear(),this.pendingIds=[],Object.keys(this.priorityBuckets).forEach(A=>{this.priorityBuckets[A].clear()}),this.stats.currentSize=0,h.info("Queue cleared"),this._emit(GA.QUEUE_EMPTIED)}retryFailed(A){let I=0;for(let O of this.items.values())O.state===X.FAILED&&(O.setState(X.PENDING),O.retries=0,I++);h.info(`Retrying ${I} failed items`)}getStats(){let A={},I={};for(let O of this.items.values())A[O.state]=(A[O.state]||0)+1,I[O.priority]=(I[O.priority]||0)+1;return{...this.stats,currentSize:this.items.size,stateCounts:A,priorityCounts:I,isProcessing:this.isProcessing,isEmpty:this.isEmpty(),isFull:this.isFull(),oldestItem:this._getOldestItemAge(),newestItem:this._getNewestItemAge()}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}async _processQueue(){let A=Date.now(),I=0,O=0;try{for(;this.isProcessing&&!this.isEmpty();){let U=this._getNextBatch();if(U.length===0)break;for(let E of U){if(!this.isProcessing)break;try{E.setState(X.PROCESSING),await this.processor(this._toPublicItem(E))?(this.remove(E.id),I++,this.stats.totalProcessed++,this._emit(GA.ITEM_STATE_CHANGED,{id:E.id,state:X.SENT})):(this._handleFailure(E),O++)}catch(K){h.error("Error processing item:",K),this._handleFailure(E,K.message),O++}}this.options.batchDelay>0&&!this.isEmpty()&&await new Promise(E=>setTimeout(E,this.options.batchDelay))}}finally{let U=Date.now()-A;this.processingTimes.push(U),this.processingTimes.length>10&&this.processingTimes.shift(),this.stats.averageProcessTime=this.processingTimes.reduce((E,K)=>E+K,0)/this.processingTimes.length,h.info("Queue processing complete",{processed:I,failed:O,remaining:this.items.size,time:U})}}_getNextBatch(){let A=[],I=this.options.batchSize,O=[RA.CRITICAL,RA.HIGH,RA.NORMAL,RA.LOW];for(let U of O){if(A.length>=I)break;let E=this.priorityBuckets[U],K=I-A.length,B=Array.from(E).map(R=>this.items.get(R)).filter(R=>R&&R.state===X.PENDING).sort((R,M)=>R.sequence-M.sequence).slice(0,K);A.push(...B)}return A}_handleFailure(A,I=null){A.incrementRetry(),A.hasExceededRetries()?(A.setState(X.DISCARDED,I),this.remove(A.id),this.stats.totalDiscarded++,h.warn("Item discarded (max retries)",{id:A.id,retries:A.retries})):(A.setState(X.FAILED,I),this.stats.totalFailed++,h.debug("Item failed, will retry",{id:A.id,retries:A.retries}))}_dropOldest(){if(this.pendingIds.length===0)return;let A=this.pendingIds[0],I=this.items.get(A);I&&(I.setState(X.DISCARDED,"Queue full - dropped"),this.remove(A),this.stats.totalDiscarded++,h.warn("Dropped oldest item (queue full)",{id:A,age:I.getAge()}))}_removeExpired(){let A=0;for(let[I,O]of this.items)O.isExpired()&&(O.setState(X.DISCARDED,"Expired"),this.remove(I),A++,this.stats.totalExpired++);A>0&&h.info(`Removed ${A} expired items`)}_getOldestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[0],I=this.items.get(A);return I?I.getAge():null}_getNewestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[this.pendingIds.length-1],I=this.items.get(A);return I?I.getAge():null}_toPublicItem(A){return{id:A.id,data:A.data,priority:A.priority,state:A.state,createdAt:A.createdAt,updatedAt:A.updatedAt,retries:A.retries,maxRetries:A.maxRetries,metadata:A.metadata,error:A.error,size:A.size}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){h.error(`Error in ${A} listener:`,E)}})}destroy(){this.stopProcessing(),this.clear(),this.listeners.clear(),this.processor=null,h.info("QueueManager destroyed")}};function S1(N={}){return new A1(N)}var i=S("storage"),AA={INITIALIZED:"initialized",ITEM_STORED:"item_stored",ITEM_RETRIEVED:"item_retrieved",ITEM_DELETED:"item_deleted",CLEARED:"cleared",ERROR:"error",STORAGE_FULL:"storage_full"},n={INDEXED_DB:"indexeddb",LOCAL_STORAGE:"localstorage",MEMORY:"memory"},k4={dbName:"websocket_queue",storeName:"messages",dbVersion:1,maxItems:1e4,maxSize:5*1024*1024,autoInit:!0,storageType:null},X1=class{constructor(A={}){this.options={...k4,...A},this.browser=p(),this.initialized=!1,this.initializing=!1,this.storageType=null,this.db=null,this.memoryStore=new Map,this.stats={itemsStored:0,itemsRetrieved:0,itemsDeleted:0,storageCleared:0,errors:0,estimatedSize:0},this.listeners=new Map,this._initPromise=null,this.options.autoInit&&this.init(),i.info("StorageManager created")}async init(){if(!this.initialized){if(this.initializing)return this._initPromise;this.initializing=!0,this._initPromise=this._initialize();try{await this._initPromise,this.initialized=!0,i.info("Storage initialized",{type:this.storageType}),this._emit(AA.INITIALIZED,{type:this.storageType})}catch(A){throw i.error("Storage initialization failed:",A),this._emit(AA.ERROR,{error:A.message}),A}finally{this.initializing=!1}}}async setItem(A,I){await this._ensureInitialized();try{let O=this._getItemSize(I);switch(this.stats.estimatedSize+O>this.options.maxSize&&(i.warn("Storage size limit approaching"),this._emit(AA.STORAGE_FULL,{size:this.stats.estimatedSize,max:this.options.maxSize})),this.storageType){case n.INDEXED_DB:await this._setItemIndexedDB(A,I);break;case n.LOCAL_STORAGE:this._setItemLocalStorage(A,I);break;case n.MEMORY:this._setItemMemory(A,I);break}this.stats.itemsStored++,this.stats.estimatedSize+=O,i.debug("Item stored",{key:A,size:O}),this._emit(AA.ITEM_STORED,{key:A,size:O})}catch(O){throw this.stats.errors++,i.error("Failed to store item:",O),this._emit(AA.ERROR,{key:A,error:O.message}),O}}async getItem(A){await this._ensureInitialized();try{let I=null;switch(this.storageType){case n.INDEXED_DB:I=await this._getItemIndexedDB(A);break;case n.LOCAL_STORAGE:I=this._getItemLocalStorage(A);break;case n.MEMORY:I=this._getItemMemory(A);break}return I!=null&&(this.stats.itemsRetrieved++,i.debug("Item retrieved",{key:A}),this._emit(AA.ITEM_RETRIEVED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to retrieve item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),null}}async removeItem(A){await this._ensureInitialized();try{let I=!1;switch(this.storageType){case n.INDEXED_DB:I=await this._removeItemIndexedDB(A);break;case n.LOCAL_STORAGE:I=this._removeItemLocalStorage(A);break;case n.MEMORY:I=this._removeItemMemory(A);break}return I&&(this.stats.itemsDeleted++,i.debug("Item removed",{key:A}),this._emit(AA.ITEM_DELETED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to remove item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),!1}}async getAll(){await this._ensureInitialized();try{let A=[];switch(this.storageType){case n.INDEXED_DB:A=await this._getAllIndexedDB();break;case n.LOCAL_STORAGE:A=this._getAllLocalStorage();break;case n.MEMORY:A=this._getAllMemory();break}return i.debug("Retrieved all items",{count:A.length}),A}catch(A){return this.stats.errors++,i.error("Failed to get all items:",A),this._emit(AA.ERROR,{error:A.message}),[]}}async clear(){await this._ensureInitialized();try{switch(this.storageType){case n.INDEXED_DB:await this._clearIndexedDB();break;case n.LOCAL_STORAGE:this._clearLocalStorage();break;case n.MEMORY:this._clearMemory();break}this.stats.storageCleared++,this.stats.estimatedSize=0,i.info("Storage cleared"),this._emit(AA.CLEARED)}catch(A){this.stats.errors++,i.error("Failed to clear storage:",A),this._emit(AA.ERROR,{error:A.message})}}async count(){await this._ensureInitialized();try{switch(this.storageType){case n.INDEXED_DB:return await this._countIndexedDB();case n.LOCAL_STORAGE:return this._countLocalStorage();case n.MEMORY:return this.memoryStore.size;default:return 0}}catch(A){return this.stats.errors++,i.error("Failed to count items:",A),0}}getStats(){return{...this.stats,storageType:this.storageType,initialized:this.initialized,maxItems:this.options.maxItems,maxSize:this.options.maxSize,usagePercent:this.stats.estimatedSize/this.options.maxSize*100}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}async _initialize(){switch(this.storageType=await this._detectStorageType(),i.info(`Using storage type: ${this.storageType}`),this.storageType){case n.INDEXED_DB:await this._initIndexedDB();break;case n.LOCAL_STORAGE:this._initLocalStorage();break;case n.MEMORY:this._initMemory();break}await this._updateStats()}async _detectStorageType(){if(this.options.storageType)return this.options.storageType;if(this.browser.hasIndexedDB)try{if(await this._testIndexedDB())return n.INDEXED_DB}catch(A){i.warn("IndexedDB test failed:",A)}if(this.browser.hasLocalStorage)try{return this._testLocalStorage(),n.LOCAL_STORAGE}catch(A){i.warn("localStorage test failed:",A)}return n.MEMORY}_testIndexedDB(){return new Promise(A=>{try{let I=indexedDB.open("__test__",1);I.onerror=()=>A(!1),I.onsuccess=()=>{I.result.close(),indexedDB.deleteDatabase("__test__"),A(!0)}}catch{A(!1)}})}_testLocalStorage(){let A="__test__";return localStorage.setItem(A,"test"),localStorage.removeItem(A),!0}_initIndexedDB(){return new Promise((A,I)=>{let O=indexedDB.open(this.options.dbName,this.options.dbVersion);O.onerror=U=>{I(new Error(`IndexedDB error: ${U.target.error}`))},O.onsuccess=U=>{this.db=U.target.result,this.db.onversionchange=()=>{this.db.close(),i.warn("Database upgraded elsewhere, reloading")},A()},O.onupgradeneeded=U=>{let E=U.target.result;if(!E.objectStoreNames.contains(this.options.storeName)){let K=E.createObjectStore(this.options.storeName,{keyPath:"id"});K.createIndex("timestamp","timestamp"),K.createIndex("priority","priority"),K.createIndex("state","state"),i.info("Created IndexedDB store")}}})}_initLocalStorage(){let A=localStorage.getItem(this._getStoreKey());if(A)try{let I=JSON.parse(A);Array.isArray(I)&&i.info(`Loaded ${I.length} items from localStorage`)}catch{i.warn("Corrupted localStorage data, clearing"),localStorage.removeItem(this._getStoreKey())}}_initMemory(){this.memoryStore.clear(),i.info("Using memory storage")}_getStoreKey(){return`${this.options.dbName}_${this.options.storeName}`}_getItemSize(A){try{let I=JSON.stringify(A);return new Blob([I]).size}catch{return 0}}async _ensureInitialized(){this.initialized||await this.init()}async _updateStats(){let A=await this.getAll();this.stats.estimatedSize=A.reduce((I,O)=>I+this._getItemSize(O),0)}async _setItemIndexedDB(A,I){return new Promise((O,U)=>{let K=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName),B={id:A,data:I,timestamp:Date.now()},R=K.put(B);R.onsuccess=()=>O(),R.onerror=()=>U(R.error)})}async _getItemIndexedDB(A){return new Promise((I,O)=>{let K=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).get(A);K.onsuccess=()=>{I(K.result?K.result.data:null)},K.onerror=()=>O(K.error)})}async _removeItemIndexedDB(A){return new Promise((I,O)=>{let K=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName).delete(A);K.onsuccess=()=>I(!0),K.onerror=()=>O(K.error)})}async _getAllIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).getAll();E.onsuccess=()=>{let K=E.result.map(B=>({key:B.id,...B.data}));A(K)},E.onerror=()=>I(E.error)})}async _clearIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName).clear();E.onsuccess=()=>A(),E.onerror=()=>I(E.error)})}async _countIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).count();E.onsuccess=()=>A(E.result),E.onerror=()=>I(E.error)})}_setItemLocalStorage(A,I){let O=this._getAllLocalStorage(),U=O.find(E=>E.key===A);U?(U.data=I,U.timestamp=Date.now()):O.push({key:A,data:I,timestamp:Date.now()}),localStorage.setItem(this._getStoreKey(),JSON.stringify(O))}_getItemLocalStorage(A){let O=this._getAllLocalStorage().find(U=>U.key===A);return O?O.data:null}_removeItemLocalStorage(A){let I=this._getAllLocalStorage(),O=I.filter(U=>U.key!==A);return localStorage.setItem(this._getStoreKey(),JSON.stringify(O)),I.length!==O.length}_getAllLocalStorage(){let A=localStorage.getItem(this._getStoreKey());if(!A)return[];try{return JSON.parse(A)}catch{return[]}}_clearLocalStorage(){localStorage.removeItem(this._getStoreKey())}_countLocalStorage(){return this._getAllLocalStorage().length}_setItemMemory(A,I){this.memoryStore.set(A,{data:I,timestamp:Date.now()})}_getItemMemory(A){let I=this.memoryStore.get(A);return I?I.data:null}_removeItemMemory(A){return this.memoryStore.delete(A)}_getAllMemory(){return Array.from(this.memoryStore.entries()).map(([A,I])=>({key:A,...I.data}))}_clearMemory(){this.memoryStore.clear()}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){i.error(`Error in ${A} listener:`,E)}})}destroy(){this.db&&(this.db.close(),this.db=null),this.memoryStore.clear(),this.listeners.clear(),this.initialized=!1,i.info("StorageManager destroyed")}};function A2(N={}){return new X1(N)}var x=S("retry"),IA={EXPONENTIAL:"exponential",LINEAR:"linear",FIXED:"fixed",FIBONACCI:"fibonacci",IMMEDIATE:"immediate"},CA={ALL:"all",NETWORK:"network",SERVER:"server",TIMEOUT:"timeout",CUSTOM:"custom"},TA={BEFORE_RETRY:"before_retry",AFTER_RETRY:"after_retry",MAX_RETRIES_REACHED:"max_retries_reached",CANCELLED:"cancelled",CIRCUIT_OPENED:"circuit_opened",CIRCUIT_CLOSED:"circuit_closed"},MA={CLOSED:"closed",OPEN:"open",HALF_OPEN:"half_open"},GI={maxAttempts:5,initialDelay:1e3,maxDelay:3e4,strategy:IA.EXPONENTIAL,factor:2,jitter:!0,retryCondition:CA.ALL,customCondition:null,circuitBreaker:{enabled:!0,failureThreshold:5,openTimeout:3e4,successThreshold:2},resetOnSuccess:!0},I2=class{constructor(A,I,O={}){this.operation=A,this.options=I,this.metadata=O,this.attempt=0,this.startTime=Date.now(),this.lastError=null,this.cancelled=!1,this.deferred=nA(),this.results=[],this.errors=[],x.debug("Retry context created",{maxAttempts:I.maxAttempts,strategy:I.strategy})}getNextDelay(){if(this.attempt===0)return 0;switch(this.options.strategy){case IA.EXPONENTIAL:return this._exponentialDelay();case IA.LINEAR:return this._linearDelay();case IA.FIBONACCI:return this._fibonacciDelay();case IA.FIXED:return this.options.initialDelay;case IA.IMMEDIATE:return 0;default:return this._exponentialDelay()}}_exponentialDelay(){return iA(this.attempt-1,{baseDelay:this.options.initialDelay,maxDelay:this.options.maxDelay,jitter:this.options.jitter})}_linearDelay(){let A=this.options.initialDelay*this.attempt;return this.options.jitter&&(A=A*(.8+.4*Math.random())),Math.min(A,this.options.maxDelay)}_fibonacciDelay(){let A=O=>O<=1?1:A(O-1)+A(O-2),I=this.options.initialDelay*A(this.attempt);return this.options.jitter&&(I=I*(.8+.4*Math.random())),Math.min(I,this.options.maxDelay)}shouldRetry(A){return this.attempt>=this.options.maxAttempts||this.cancelled?!1:this._checkCondition(A)}_checkCondition(A){switch(this.options.retryCondition){case CA.ALL:return!0;case CA.NETWORK:return this._isNetworkError(A);case CA.SERVER:return this._isServerError(A);case CA.TIMEOUT:return this._isTimeoutError(A);case CA.CUSTOM:return this.options.customCondition?this.options.customCondition(A):!0;default:return!0}}_isNetworkError(A){return["ECONNREFUSED","ECONNRESET","ENOTFOUND","ETIMEDOUT","NetworkError","network offline"].some(O=>{var U,E;return((U=A.message)==null?void 0:U.includes(O))||((E=A.code)==null?void 0:E.includes(O))})}_isServerError(A){return A.status>=500||A.statusCode>=500}_isTimeoutError(A){var I;return((I=A.message)==null?void 0:I.includes("timeout"))||A.code==="ETIMEDOUT"}recordResult(A){this.results.push({attempt:this.attempt,result:A,timestamp:Date.now()})}recordError(A){this.lastError=A,this.errors.push({attempt:this.attempt,error:A.message,timestamp:Date.now()})}getStats(){var A;return{attempt:this.attempt,startTime:this.startTime,elapsed:Date.now()-this.startTime,lastError:(A=this.lastError)==null?void 0:A.message,results:this.results,errors:this.errors,cancelled:this.cancelled}}},O2=class{constructor(A){this.options=A,this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,this.lastFailure=null,x.debug("Circuit breaker created",A)}isClosed(){return this.state===MA.CLOSED}isOpen(){return this.state===MA.OPEN}isHalfOpen(){return this.state===MA.HALF_OPEN}recordSuccess(){this.successCount++,this.failureCount=0,this.state===MA.HALF_OPEN&&this.successCount>=this.options.successThreshold&&this._close()}recordFailure(A){this.lastFailure=A,this.failureCount++,this.successCount=0,this.state===MA.CLOSED?this.failureCount>=this.options.failureThreshold&&this._open():this.state===MA.HALF_OPEN&&this._open()}checkHalfOpen(){return this.state===MA.OPEN&&this.openTime&&Date.now()-this.openTime>=this.options.openTimeout?(this._halfOpen(),!0):!1}_open(){this.state=MA.OPEN,this.openTime=Date.now(),this.successCount=0,x.warn("Circuit opened",{failures:this.failureCount,timeout:this.options.openTimeout})}_close(){this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,x.info("Circuit closed")}_halfOpen(){this.state=MA.HALF_OPEN,this.successCount=0,x.info("Circuit half-open, testing recovery")}getStats(){var A;return{state:this.state,failureCount:this.failureCount,successCount:this.successCount,openTime:this.openTime,lastFailure:(A=this.lastFailure)==null?void 0:A.message}}},aA=class{constructor(A={}){this.options=this._mergeOptions(A),this.circuitBreaker=this.options.circuitBreaker.enabled?new O2(this.options.circuitBreaker):null,this.contexts=new Map,this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},this.listeners=new Map,x.info("RetryManager created",{strategy:this.options.strategy,maxAttempts:this.options.maxAttempts})}async execute(A,I={},O={}){var K;if((K=this.circuitBreaker)!=null&&K.isOpen())if(this.circuitBreaker.checkHalfOpen())this._emit(TA.CIRCUIT_HALF_OPEN);else{let B=new Error("Circuit breaker is open");throw this._emit(TA.CIRCUIT_OPENED,{error:B}),B}let U=new I2(A,{...this.options,...I},O),E=Date.now()+Math.random().toString(36);this.contexts.set(E,U),this.stats.totalExecutions++;try{let B=await this._executeWithRetry(U);return this.circuitBreaker&&this.circuitBreaker.recordSuccess(),this.stats.successfulExecutions++,B}catch(B){throw this.circuitBreaker&&(this.circuitBreaker.recordFailure(B),this.circuitBreaker.isOpen()&&(this.stats.circuitOpens++,this._emit(TA.CIRCUIT_OPENED,{error:B}))),this.stats.failedExecutions++,B}finally{this.contexts.delete(E)}}async _executeWithRetry(A){for(;;){A.attempt++;try{x.debug(`Attempt ${A.attempt}`,A.metadata);let I=await A.operation();return A.recordResult(I),A.attempt>1&&x.info(`Succeeded after ${A.attempt} attempts`),this.options.resetOnSuccess,I}catch(I){if(A.recordError(I),x.debug(`Attempt ${A.attempt} failed:`,I.message),!A.shouldRetry(I))throw this._emit(TA.MAX_RETRIES_REACHED,{attempts:A.attempt,error:I.message}),I;let O=A.getNextDelay();x.debug(`Retrying in ${O}ms (attempt ${A.attempt}/${A.options.maxAttempts})`),this.stats.totalRetries++,this._emit(TA.BEFORE_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts,delay:O,error:I.message}),O>0&&await mA(O),this._emit(TA.AFTER_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts})}}}cancelAll(A="Cancelled by user"){this.contexts.forEach((I,O)=>{I.cancelled=!0,this._emit(TA.CANCELLED,{id:O,reason:A})}),this.contexts.clear(),x.info("All retries cancelled",{reason:A})}getStats(){var I;let A=((I=this.circuitBreaker)==null?void 0:I.getStats())||null;return{...this.stats,circuitBreaker:A,activeRetries:this.contexts.size,currentOptions:{...this.options}}}resetStats(){this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},x.info("Retry stats reset")}resetCircuitBreaker(){this.circuitBreaker&&(this.circuitBreaker._close(),this._emit(TA.CIRCUIT_CLOSED))}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_mergeOptions(A){let I={...GI,...A};return A.circuitBreaker&&(I.circuitBreaker={...GI.circuitBreaker,...A.circuitBreaker}),I}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){x.error(`Error in ${A} listener:`,E)}})}destroy(){this.cancelAll("Manager destroyed"),this.listeners.clear(),x.info("RetryManager destroyed")}};function t1(N={}){return new aA(N)}async function TI(N,A={}){return new aA({maxAttempts:2,...A}).execute(N)}async function WI(N,A=5){return new aA({maxAttempts:A,strategy:IA.EXPONENTIAL}).execute(N)}async function YI(N,A=1e3,I=5){return new aA({maxAttempts:I,strategy:IA.FIXED,initialDelay:A}).execute(N)}var a=S("recovery"),eA={IDLE:"idle",SCANNING:"scanning",RESTORING:"restoring",COMPLETED:"completed",FAILED:"failed"},WA={RECOVERY_STARTED:"recovery_started",RECOVERY_PROGRESS:"recovery_progress",RECOVERY_COMPLETED:"recovery_completed",RECOVERY_FAILED:"recovery_failed",STATE_SAVED:"state_saved",STATE_RESTORED:"state_restored",CHECKPOINT_CREATED:"checkpoint_created"},hA={FULL:"full",MINIMAL:"minimal",VERIFIED:"verified",CONNECTION_ONLY:"connection_only"},q4={strategy:hA.FULL,maxStateAge:10080*60*1e3,autoRecover:!0,enableCheckpoints:!0,checkpointInterval:300*1e3,maxCheckpoints:5,verifyWithServer:!0,recoveryTimeout:3e4,replayQueue:!0,restoreSubscriptions:!0,restorePresence:!0},N2=class N{constructor(A,I={}){this.id=V("ckpt"),this.timestamp=Date.now(),this.state=A,this.metadata=I,this.size=this._calculateSize()}_calculateSize(){try{return new Blob([JSON.stringify(this.state)]).size}catch{return 0}}isExpired(A){return Date.now()-this.timestamp>A}toJSON(){return{id:this.id,timestamp:this.timestamp,state:this.state,metadata:this.metadata,size:this.size}}static fromJSON(A){let I=new N(A.state,A.metadata);return I.id=A.id,I.timestamp=A.timestamp,I}},I1=class{constructor(A={}){this.options={...q4,...A},this.state=eA.IDLE,this.sessionId=this._generateSessionId(),this.currentState=null,this.storage=A2({dbName:"websocket_recovery",storeName:"state",autoInit:!0}),this.queue=S1({maxSize:1e3,autoProcess:!1}),this.retry=t1({maxAttempts:3,strategy:IA.EXPONENTIAL}),this.checkpoints=[],this.checkpointTimer=null,this.stats={recoveriesAttempted:0,recoveriesSuccessful:0,recoveriesFailed:0,statesSaved:0,statesRestored:0,checkpointsCreated:0,lastRecoveryTime:null,lastRecoveryDuration:null},this.listeners=new Map,this.options.enableCheckpoints&&this._startCheckpointTimer(),this.options.autoRecover&&setTimeout(()=>this.recover(),0),a.info("RecoveryManager created",{sessionId:this.sessionId,strategy:this.options.strategy})}async saveState(A,I={}){let O={sessionId:this.sessionId,timestamp:Date.now(),state:{...A,_version:1},metadata:{...I,strategy:this.options.strategy}};try{await this.storage.setItem("current_state",O),this.currentState=O,this.stats.statesSaved++,a.debug("State saved",{timestamp:O.timestamp,metadata:I}),this._emit(WA.STATE_SAVED,{timestamp:O.timestamp,metadata:I}),this.options.enableCheckpoints&&await this._createCheckpoint(A,I)}catch(U){throw a.error("Failed to save state:",U),U}}async recover(){if(this.state===eA.RECOVERING)return a.warn("Recovery already in progress"),null;this.state=eA.SCANNING,this.stats.recoveriesAttempted++,this._emit(WA.RECOVERY_STARTED,{sessionId:this.sessionId,strategy:this.options.strategy});let A=Date.now();try{let I=await this._findRecoverableState();if(!I)return a.info("No recoverable state found"),this.state=eA.IDLE,null;this.state=eA.RESTORING;let O;switch(this.options.strategy){case hA.FULL:O=await this._fullRecovery(I);break;case hA.MINIMAL:O=await this._minimalRecovery(I);break;case hA.VERIFIED:O=await this._verifiedRecovery(I);break;case hA.CONNECTION_ONLY:O=await this._connectionOnlyRecovery(I);break;default:O=await this._fullRecovery(I)}return this.options.verifyWithServer&&O&&(O=await this._verifyWithServer(O)),this.options.replayQueue&&O&&await this._replayQueue(),this.stats.recoveriesSuccessful++,this.stats.statesRestored++,this.stats.lastRecoveryTime=Date.now(),this.stats.lastRecoveryDuration=Date.now()-A,this.state=eA.COMPLETED,a.info("Recovery completed",{duration:this.stats.lastRecoveryDuration,hasState:!!O}),this._emit(WA.RECOVERY_COMPLETED,{duration:this.stats.lastRecoveryDuration,state:O}),O}catch(I){return this.state=eA.FAILED,this.stats.recoveriesFailed++,a.error("Recovery failed:",I),this._emit(WA.RECOVERY_FAILED,{error:I.message}),null}}async createCheckpoint(A,I={}){return this._createCheckpoint(A,I)}async listCheckpoints(){try{return await this.storage.getItem("checkpoints")||[]}catch{return[]}}async restoreFromCheckpoint(A){let O=(await this.listCheckpoints()).find(U=>U.id===A);return O?(a.info("Restoring from checkpoint",{id:A,timestamp:O.timestamp}),O.state):(a.warn("Checkpoint not found",{checkpointId:A}),null)}async clear(){await this.storage.clear(),this.checkpoints=[],this.currentState=null,a.info("Recovery state cleared")}getStats(){return{...this.stats,state:this.state,sessionId:this.sessionId,hasSavedState:!!this.currentState,checkpointCount:this.checkpoints.length,options:{...this.options}}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_generateSessionId(){let A=localStorage.getItem("websocket_session_id");if(A)return A;let I=V("sess");return localStorage.setItem("websocket_session_id",I),I}async _findRecoverableState(){try{let A=await this.storage.getItem("current_state");if(A&&!this._isStateExpired(A))return a.debug("Found current state",{age:Date.now()-A.timestamp}),{type:"current",state:A};let O=(await this.listCheckpoints()).filter(U=>!U.isExpired(this.options.maxStateAge));if(O.length>0){let U=O.sort((E,K)=>K.timestamp-E.timestamp)[0];return a.debug("Found checkpoint",{timestamp:U.timestamp}),{type:"checkpoint",state:U.state}}return null}catch(A){return a.error("Error finding recoverable state:",A),null}}_isStateExpired(A){return Date.now()-A.timestamp>this.options.maxStateAge}async _fullRecovery(A){let I=A.state;return a.info("Performing full recovery",{type:A.type,timestamp:I.timestamp}),this._emit(WA.RECOVERY_PROGRESS,{phase:"full",percent:50}),I.state}async _minimalRecovery(A){let I=A.state;a.info("Performing minimal recovery",{type:A.type});let O={},U=["userId","sessionToken","connectionId"];for(let E of U)I.state[E]&&(O[E]=I.state[E]);return this._emit(WA.RECOVERY_PROGRESS,{phase:"minimal",percent:75}),O}async _verifiedRecovery(A){let I=A.state;return a.info("Performing verified recovery"),I.state}async _connectionOnlyRecovery(A){let I=A.state;return a.info("Performing connection-only recovery"),{connectionId:I.state.connectionId,lastMessageId:I.state.lastMessageId}}async _verifyWithServer(A){return A}async _replayQueue(){let A=await this.storage.getItem("queue")||[];if(A.length!==0){a.info(`Replaying ${A.length} queued messages`);for(let I of A)await this.queue.add(I.data,{priority:I.priority,metadata:{recovered:!0}});this._emit(WA.RECOVERY_PROGRESS,{phase:"replay",count:A.length})}}async _createCheckpoint(A,I){try{let O=new N2(A,I),U=await this.storage.getItem("checkpoints")||[];U.push(O.toJSON()),U.sort((E,K)=>K.timestamp-E.timestamp),U.length>this.options.maxCheckpoints&&(U=U.slice(0,this.options.maxCheckpoints)),await this.storage.setItem("checkpoints",U),this.stats.checkpointsCreated++,a.debug("Checkpoint created",{id:O.id,size:O.size}),this._emit(WA.CHECKPOINT_CREATED,{id:O.id,timestamp:O.timestamp,size:O.size})}catch(O){a.error("Failed to create checkpoint:",O)}}_startCheckpointTimer(){this.checkpointTimer=setInterval(async()=>{this.currentState&&await this._createCheckpoint(this.currentState.state,this.currentState.metadata)},this.options.checkpointInterval)}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){a.error(`Error in ${A} listener:`,E)}})}destroy(){this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.storage.destroy(),this.queue.destroy(),this.listeners.clear(),a.info("RecoveryManager destroyed")}};function SI(N={}){return new I1(N)}function tI(N,A={}){let I=A2({dbName:"persistent_state",storeName:N,...A});return{async save(O){await I.setItem(N,{data:O,timestamp:Date.now()})},async load(){let O=await I.getItem(N);return(O==null?void 0:O.data)||null},async clear(){await I.removeItem(N)}}}var eI=z2;
1490
+ `,l4(),document.body.appendChild(N),H4(),N}function p2(N,A){if(!N){alert("please provide an `onConfirm` callback!");return}let I=u4();return I._callbacks={onConfirm:N,onCancel:A},d4(I),I}var B1=class{constructor(A){this.viewConfigs=A,this.loadedStyles=new Set,this.currentView=null,this.currentModule=null}async loadView(A){if(!A)return;let I=A.replace("-view",""),O=document.getElementById(A);if(!O)return;let U=this.viewConfigs[I];if(!U){console.error(`\u274C No config found for view: ${I}`);return}if(this.currentView!==I){this.currentView&&await this.unloadView(this.currentView);try{U.css&&(console.log(`Loading CSS: ${U.css}`),await this.loadCSS(I,U.css)),console.log(`Loading HTML: ${U.html}`);let E=await fetch(U.html);if(!E.ok)throw new Error(`HTTP ${E.status}`);let K=await E.text();O.innerHTML=K,U.js&&(console.log(`Loading JS: ${U.js}`),await this.loadJS(I,U.js)),this.currentView=I,console.log(`View loaded: ${I}`)}catch(E){console.error(`Failed to load view ${I}:`,E),O.innerHTML=`<p style="color: red; padding: 20px;">Error loading ${I}: ${E.message}</p>`}}}async loadCSS(A,I){let O=`style-${A}`,U=document.getElementById(O);U&&U.remove();let E=document.createElement("link");return E.id=O,E.rel="stylesheet",E.href=I,new Promise(K=>{E.onload=()=>{this.loadedStyles.add(A),console.log(`CSS loaded: ${I}`),K()},E.onerror=()=>{console.log(`CSS failed to load: ${I} (continuing anyway)`),K()},document.head.appendChild(E)})}async loadJS(A,I){try{let O=await import(I);this.currentModule=O,console.log("module====>",O),O.init&&typeof O.init=="function"&&(console.log(`Initializing ${A}...`),O.init()),console.log(`JS loaded: ${I}`)}catch(O){console.log(`No JS module for ${A} or error:`,O)}}async unloadView(A){console.log(`Unloading view: ${A}`);let I=document.getElementById(`style-${A}`);I&&(I.remove(),this.loadedStyles.delete(A)),this.currentModule&&this.currentModule.cleanup&&(console.log(`Cleaning up ${A}...`),this.currentModule.cleanup()),this.currentModule=null,this.currentView=null}};var uA={threshold:0,rootMargin:"0px",root:null,triggerOnce:!1},LA=new Map;function Z4(N,A){return`${N?N.id||N.tagName+N.className:"viewport"}::${A}`}var C1=class{constructor(A,I,O){this.onEnter=A,this.onExit=I,this.options=O,this.currentlyIntersecting=!1}};function m4(N,A){let I=Z4(N,A);return LA.has(I)||LA.set(I,{observer:null,callbacks:new Map,root:N,rootMargin:A,thresholds:new Set([0])}),LA.get(I)}function p4(N){let A=new Set([0]);return N.callbacks.forEach(I=>{I.forEach(O=>{let U=O.options.threshold;Array.isArray(U)?U.forEach(E=>A.add(E)):typeof U=="number"&&A.add(U)})}),Array.from(A).sort((I,O)=>I-O)}function g4(N){let A=p4(N);if(N.observer){let I=Array.from(N.observer.thresholds);if(I.length===A.length&&I.every((U,E)=>U===A[E]))return;N.observer.disconnect()}N.observer=new IntersectionObserver(I=>{f4(N,I)},{root:N.root,rootMargin:N.rootMargin,threshold:A}),N.callbacks.forEach((I,O)=>{N.observer.observe(O)}),N.thresholds=new Set(A)}function f4(N,A){A.forEach(I=>{let O=I.target,U=N.callbacks.get(O);if(!U)return;let E=I.isIntersecting,K=I.intersectionRatio;Array.from(U).forEach(R=>{var Y,P;let{onEnter:M,onExit:L,options:G}=R,T=(Y=G.threshold)!=null?Y:uA.threshold,W=(P=G.triggerOnce)!=null?P:uA.triggerOnce,t=Array.isArray(T)?T.some(s=>K>=s):K>=T;E&&t&&!R.currentlyIntersecting&&(R.currentlyIntersecting=!0,M&&typeof M=="function"&&M(O,I),W&&f2(N,O,R)),!E&&R.currentlyIntersecting&&(R.currentlyIntersecting=!1,L&&typeof L=="function"&&L(O,I))}),U.size===0&&(N.callbacks.delete(O),N.observer&&N.observer.unobserve(O))})}function a1(N,A={}){var R,M,L,G;let I=w4(N);if(!I)return()=>{};let{onEnter:O,onExit:U}=A;if(!O&&!U)return console.warn("[IntersectionWatcher] No callbacks provided. At least onEnter or onExit required."),()=>{};let E={threshold:(R=A.threshold)!=null?R:uA.threshold,rootMargin:(M=A.rootMargin)!=null?M:uA.rootMargin,root:(L=A.root)!=null?L:uA.root,triggerOnce:(G=A.triggerOnce)!=null?G:uA.triggerOnce},K=m4(E.root,E.rootMargin),B=new C1(O,U,E);return K.callbacks.has(I)||K.callbacks.set(I,new Set),K.callbacks.get(I).add(B),g4(K),K.observer.observe(I),()=>{f2(K,I,B)}}function g2(N,A={}){if(typeof N!="string")return console.warn("[IntersectionWatcher] watchAll requires a CSS selector string."),()=>{};let I=document.querySelectorAll(N);if(I.length===0)return console.warn(`[IntersectionWatcher] No elements found for selector: "${N}"`),()=>{};let O=Array.from(I).map(U=>a1(U,A));return()=>{O.forEach(U=>U())}}function f2(N,A,I){let O=N.callbacks.get(A);if(O&&(O.delete(I),O.size===0&&(N.callbacks.delete(A),N.observer&&N.observer.unobserve(A)),N.callbacks.size===0)){N.observer&&(N.observer.disconnect(),N.observer=null);for(let[U,E]of LA)if(E===N){LA.delete(U);break}}}function w4(N){if(typeof N=="string"){let A=document.querySelector(N);return A||(console.warn(`[IntersectionWatcher] Element not found: "${N}"`),null)}return N instanceof Element?N:(console.warn("[IntersectionWatcher] Invalid target. Must be Element or selector string."),null)}function P1(){LA.forEach(N=>{N.observer&&(N.observer.disconnect(),N.observer=null),N.callbacks.clear()}),LA.clear()}function w2(N){for(let A of LA.values())if(A.callbacks.has(N))return!0;return!1}function v2(){let N=0,A=0;return LA.forEach(I=>{N+=I.callbacks.size,I.callbacks.forEach(O=>{A+=O.size})}),{elements:N,callbacks:A,pools:LA.size}}typeof window<"u"&&window.addEventListener("beforeunload",()=>{P1()});var C={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4},V2={level:C.ERROR,timestamps:!0,colors:!0,output:null,namespaces:{}},FA={reset:"\x1B[0m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",namespace:"\x1B[35m"},c1=class N{constructor(A,I={}){if(typeof A!="string")throw new TypeError("Logger namespace must be a string");this.namespace=A,this.config={...V2,...I}}debug(...A){this._log(C.DEBUG,"DEBUG",...A)}info(...A){this._log(C.INFO,"INFO",...A)}warn(...A){this._log(C.WARN,"WARN",...A)}error(...A){this._log(C.ERROR,"ERROR",...A)}isDebugEnabled(){return this._shouldLog(C.DEBUG)}child(A){return new N(`${this.namespace}:${A}`,this.config)}_log(A,I,...O){if(!this._shouldLog(A))return;let U=this._formatMessage(I,...O);this._output(A,U)}_shouldLog(A){let I=this.config.namespaces[this.namespace];return I!==void 0?A>=I:A>=this.config.level}_formatMessage(A,...I){let O=[];if(this.config.timestamps&&O.push(`[${new Date().toISOString()}]`),this.config.colors){let U=FA[A.toLowerCase()]||FA.reset;O.push(`${U}[${A}]${FA.reset}`)}else O.push(`[${A}]`);return this.config.colors?O.push(`${FA.namespace}[${this.namespace}]${FA.reset}`):O.push(`[${this.namespace}]`),O.push(...I),O}_output(A,I){if(this.config.output){this.config.output(A,...I);return}A>=C.ERROR?console.error(...I):A>=C.WARN?console.warn(...I):console.log(...I)}},l1={...V2},R1=new Map;function S(N){if(R1.has(N))return R1.get(N);let A=new c1(N,l1);return R1.set(N,A),A}function y2(N){if(typeof N.level=="string"){let A={debug:C.DEBUG,info:C.INFO,warn:C.WARN,error:C.ERROR,silent:C.SILENT};N.level=A[N.level.toLowerCase()]||C.INFO}N.namespaces&&Object.keys(N.namespaces).forEach(A=>{let I=N.namespaces[A];if(typeof I=="string"){let O={debug:C.DEBUG,info:C.INFO,warn:C.WARN,error:C.ERROR,silent:C.SILENT};N.namespaces[A]=O[I.toLowerCase()]||C.INFO}}),l1={...l1,...N},R1.clear()}var v4=S("browser"),J1=class{constructor(){this._detectAll()}_detectAll(){if(this.isBrowser=typeof window<"u"&&typeof document<"u",this.isNode=!this.isBrowser&&typeof process<"u",!this.isBrowser){this._setNonBrowserDefaults();return}this.hasWebSocket=typeof window.WebSocket<"u",this.hasLocalStorage=this._checkStorage("localStorage"),this.hasSessionStorage=this._checkStorage("sessionStorage"),this.hasIndexedDB=this._checkIndexedDB(),this.hasBlob=typeof Blob<"u",this.hasArrayBuffer=typeof ArrayBuffer<"u",this.hasDataView=typeof DataView<"u",this.hasTypedArrays=typeof Uint8Array<"u",this.hasCrypto=typeof crypto<"u"&&typeof crypto.getRandomValues<"u",this.hasWorker=typeof Worker<"u",this.hasSharedWorker=typeof SharedWorker<"u",this.hasServiceWorker=typeof navigator<"u"&&"serviceWorker"in navigator,this.hasNetworkInfo=typeof navigator<"u"&&"connection"in navigator,this.hasBatteryInfo=typeof navigator<"u"&&"getBattery"in navigator,this.userAgent=navigator.userAgent,this.browserInfo=this._identifyBrowser(),this.osInfo=this._identifyOS(),this.isMobile=this._detectMobile(),this.isTablet=this._detectTablet(),this.screenSize={width:window.screen.width,height:window.screen.height},this.pixelRatio=window.devicePixelRatio||1,this.touchSupport="ontouchstart"in window||navigator.maxTouchPoints>0,this.hasPerformanceAPI=typeof performance<"u",this.deviceMemory=navigator.deviceMemory||4,this.hardwareConcurrency=navigator.hardwareConcurrency||2,v4.debug("Browser capabilities detected",{hasWebSocket:this.hasWebSocket,browser:this.browserInfo.name,mobile:this.isMobile,memory:this.deviceMemory})}_setNonBrowserDefaults(){this.hasWebSocket=!1,this.hasLocalStorage=!1,this.hasSessionStorage=!1,this.hasIndexedDB=!1,this.hasBlob=!1,this.hasArrayBuffer=!0,this.hasDataView=!0,this.hasTypedArrays=!0,this.hasCrypto=!1,this.hasWorker=!1,this.hasSharedWorker=!1,this.hasServiceWorker=!1,this.hasNetworkInfo=!1,this.hasBatteryInfo=!1,this.isMobile=!1,this.isTablet=!1,this.touchSupport=!1,this.hasPerformanceAPI=!0,this.deviceMemory=4,this.hardwareConcurrency=2,this.browserInfo={name:"node",version:process.version},this.osInfo={name:process.platform}}_checkStorage(A){try{let I=window[A],O="__websocket_test__";return I.setItem(O,"test"),I.removeItem(O),!0}catch{return!1}}_checkIndexedDB(){try{return typeof window.indexedDB<"u"}catch{return!1}}_identifyBrowser(){var U,E,K,B,R;let A=this.userAgent,I="unknown",O="unknown";return A.indexOf("Firefox")>-1?(I="firefox",O=((U=A.match(/Firefox\/(\d+\.\d+)/))==null?void 0:U[1])||"unknown"):A.indexOf("Chrome")>-1&&A.indexOf("Edg")===-1?(I="chrome",O=((E=A.match(/Chrome\/(\d+\.\d+)/))==null?void 0:E[1])||"unknown"):A.indexOf("Safari")>-1&&A.indexOf("Chrome")===-1?(I="safari",O=((K=A.match(/Version\/(\d+\.\d+)/))==null?void 0:K[1])||"unknown"):A.indexOf("Edg")>-1?(I="edge",O=((B=A.match(/Edg\/(\d+\.\d+)/))==null?void 0:B[1])||"unknown"):(A.indexOf("MSIE")>-1||A.indexOf("Trident")>-1)&&(I="ie",O=((R=A.match(/(?:MSIE |rv:)(\d+\.\d+)/))==null?void 0:R[1])||"unknown"),{name:I,version:O}}_identifyOS(){let A=this.userAgent,I="unknown",O="unknown";if(A.indexOf("Windows")>-1)I="windows",A.indexOf("Windows NT 10.0")>-1?O="10":A.indexOf("Windows NT 6.3")>-1?O="8.1":A.indexOf("Windows NT 6.2")>-1?O="8":A.indexOf("Windows NT 6.1")>-1&&(O="7");else if(A.indexOf("Mac OS X")>-1){I="macos";let U=A.match(/Mac OS X (\d+[._]\d+[._]\d+)/);U&&(O=U[1].replace(/_/g,"."))}else if(A.indexOf("Android")>-1){I="android";let U=A.match(/Android (\d+\.\d+)/);U&&(O=U[1])}else if(A.indexOf("iOS")>-1||A.indexOf("iPhone")>-1||A.indexOf("iPad")>-1){I="ios";let U=A.match(/OS (\d+[_\d]+) like Mac/);U&&(O=U[1].replace(/_/g,"."))}else A.indexOf("Linux")>-1&&(I="linux");return{name:I,version:O}}_detectMobile(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(this.userAgent)}_detectTablet(){return/iPad|Android(?!.*Mobile)|Tablet/i.test(this.userAgent)}getRecommendedTransports(){let A=[];return this.hasWebSocket&&A.push("websocket"),typeof EventSource<"u"&&A.push("eventsource"),A.push("polling"),A}hasMemoryConstraints(){return this.isMobile||this.deviceMemory<=2}getMaxQueueSize(){return this.hasMemoryConstraints()?100:1e3}isLegacyBrowser(){let{name:A,version:I}=this.browserInfo,O=parseFloat(I);return A==="ie"||A==="firefox"&&O<50||A==="chrome"&&O<50||A==="safari"&&O<10}},h1=null;function p(){return h1||(h1=new J1),h1}function F2(){return p().hasWebSocket}function x2(){return p().isMobile}function b2(){if(!p().hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:A.type||"unknown",effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData||!1}:null}var W6=p();function V(N=""){let A=Date.now().toString(36),I=Math.random().toString(36).substring(2,10),O=`${A}${I}`;return N?`${N}_${O}`:O}function _2(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,N=>{let A=Math.random()*16|0;return(N==="x"?A:A&3|8).toString(16)})}function ZA(N){if(typeof N!="string"||N.trim()===""||!N.startsWith("ws://")&&!N.startsWith("wss://"))return!1;try{let A=new URL(N);return A.hostname&&A.hostname.includes(".")}catch{return!1}}function d1(N,A=null){if(typeof N!="string")return A;try{return JSON.parse(N)}catch{return A}}function u1(N,A=0){try{let I=new WeakSet;return JSON.stringify(N,(O,U)=>{if(typeof U=="object"&&U!==null){if(I.has(U))return"[Circular]";I.add(U)}return U},A)}catch{return""}}function xA(N){if(N===null||typeof N!="object")return N;if(N instanceof Date)return new Date(N.getTime());if(N instanceof Array)return N.map(A=>xA(A));if(N instanceof Object){let A={};return Object.keys(N).forEach(I=>{A[I]=xA(N[I])}),A}return N}function Z1(N,A){let I=xA(N);return!A||typeof A!="object"||Object.keys(A).forEach(O=>{let U=A[O],E=I[O];U instanceof Array?I[O]=xA(U):U instanceof Object&&E instanceof Object?I[O]=Z1(E,U):I[O]=xA(U)}),I}function iA(N,A={}){let{baseDelay:I=1e3,maxDelay:O=3e4,jitter:U=!0}=A,E=I*Math.pow(2,N);if(E=Math.min(E,O),U){let K=.8+.4*Math.random();E=Math.floor(E*K)}return E}function mA(N){return new Promise(A=>setTimeout(A,N))}function nA(){let N,A;return{promise:new Promise((O,U)=>{N=O,A=U}),resolve:N,reject:A}}function M1(N){if(N==null)return 0;if(typeof N=="string")return new Blob([N]).size;if(N instanceof Blob)return N.size;if(N instanceof ArrayBuffer||N instanceof DataView||ArrayBuffer.isView(N))return N.byteLength;if(typeof N=="object"){let A=u1(N);return A?new Blob([A]).size:0}return new Blob([String(N)]).size}function L1(N,A){return Date.now()>N+A}function k2(N,A){let I=N+A-Date.now();return Math.max(0,I)}function bA(N,A){return Object.values(A).includes(N)}function _A(N){return typeof N!="string"?!1:N==="/"?!0:/^\/[a-zA-Z0-9_-]+(\/[a-zA-Z0-9_-]+)*$/.test(N)}var SA=S("network"),g={OFFLINE:"offline",ONLINE:"online",DEGRADED:"degraded",CHECKING:"checking"},$={UNKNOWN:"unknown",ETHERNET:"ethernet",WIFI:"wifi",CELLULAR:"cellular",NONE:"none"},p1=class{constructor(){this.browser=p(),this.listeners=new Map,this.status={state:g.CHECKING,type:$.UNKNOWN,effectiveType:null,downlink:null,rtt:null,lastChanged:Date.now(),since:Date.now()},this._checkInterval=null,this._checking=!1,this._initialized=!1,this.browser.isBrowser&&this._initBrowserListeners()}_initBrowserListeners(){if(window.addEventListener("online",()=>this._handleBrowserOnline()),window.addEventListener("offline",()=>this._handleBrowserOffline()),this.browser.hasNetworkInfo){let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;A&&A.addEventListener("change",()=>this._handleConnectionChange())}this._startPeriodicChecks(),this._checkStatus().then(()=>{this._initialized=!0,SA.info("Network monitor initialized",this.status)}),SA.debug("Network listeners initialized")}_startPeriodicChecks(){this._checkInterval=setInterval(()=>{this._checkStatus()},3e4)}_handleBrowserOnline(){SA.info("Browser reported online"),this._checkStatus(!0)}_handleBrowserOffline(){SA.warn("Browser reported offline"),this._updateStatus({state:g.OFFLINE,type:$.NONE,lastChanged:Date.now()})}_handleConnectionChange(){SA.debug("Network connection changed"),this._checkStatus(!0)}async _checkStatus(A=!1){if(this._checking)return this.status;this._checking=!0,this._updateStatus({state:g.CHECKING});try{if(!this._getBasicOnlineStatus()){this._updateStatus({state:g.OFFLINE,type:$.NONE},A);return}let O=this._getNetworkInfo();if(!await this._verifyConnectivity()){this._updateStatus({state:g.DEGRADED,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt},A);return}let E=this._determineNetworkQuality(O);this._updateStatus({state:E,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt,lastChanged:this.status.state!==E?Date.now():this.status.lastChanged},A)}catch(I){SA.error("Error checking network status:",I)}finally{this._checking=!1}}_getBasicOnlineStatus(){return typeof navigator>"u"||typeof navigator.onLine!="boolean"?!0:navigator.onLine}_getNetworkInfo(){if(!this.browser.hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:this._mapConnectionType(A.type),effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData}:null}_mapConnectionType(A){return A&&{wifi:$.WIFI,cellular:$.CELLULAR,ethernet:$.ETHERNET,none:$.NONE,unknown:$.UNKNOWN}[A]||$.UNKNOWN}async _verifyConnectivity(){if(!this._getBasicOnlineStatus())return!1;let A=["https://www.google.com/favicon.ico","https://www.cloudflare.com/favicon.ico","https://www.github.com/favicon.ico"];for(let I of A)try{let O=new AbortController,U=setTimeout(()=>O.abort(),3e3),E=await fetch(I,{method:"HEAD",mode:"no-cors",cache:"no-cache",signal:O.signal});return clearTimeout(U),!0}catch{continue}return!1}_determineNetworkQuality(A){return A&&(A.effectiveType&&(A.effectiveType==="slow-2g"||A.effectiveType==="2g")||A.rtt&&A.rtt>500||A.downlink&&A.downlink<.5)?g.DEGRADED:g.ONLINE}_updateStatus(A,I=!1){let O={...this.status};this.status={...this.status,...A},(I||O.state!==this.status.state||O.type!==this.status.type)&&(SA.info(`Network status changed: ${O.state} -> ${this.status.state}`,{type:this.status.type,effectiveType:this.status.effectiveType}),this._notifyListeners(O,this.status))}_notifyListeners(A,I){this.listeners.forEach((O,U)=>{try{O(I,A)}catch(E){SA.error(`Error in listener ${U}:`,E)}})}getStatus(){return{...this.status}}isOnline(){return this.status.state===g.ONLINE||this.status.state===g.DEGRADED}isFullyOnline(){return this.status.state===g.ONLINE}isOffline(){return this.status.state===g.OFFLINE}onChange(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}waitForOnline(A=3e4){let I=nA();if(this.isOnline())return I.resolve(),I.promise;let O=setTimeout(()=>{U(),I.reject(new Error(`Timeout waiting for network after ${A}ms`))},A),U=this.onChange(E=>{(E.state===g.ONLINE||E.state===g.DEGRADED)&&(clearTimeout(O),U(),I.resolve())});return I.promise}async checkNow(){return await this._checkStatus(!0),this.getStatus()}destroy(){this._checkInterval&&(clearInterval(this._checkInterval),this._checkInterval=null),this.listeners.clear(),SA.debug("Network monitor destroyed")}},m1=null;function UA(){return m1||(m1=new p1),m1}function G1(){return UA().isOnline()}function q2(N){return UA().onChange(N)}var r6=UA();var f=S("heartbeat"),EA={PING_SENT:"ping_sent",PONG_RECEIVED:"pong_received",MISSED:"missed",DEAD:"dead",LATENCY_UPDATED:"latency_updated"},w={STOPPED:"stopped",RUNNING:"running",WAITING:"waiting",FAILED:"failed"},g1=class{constructor(A={}){this.options={interval:3e4,timeout:1e4,maxMissed:2,adaptive:!0,...A},this.network=UA(),this.state=w.STOPPED,this.pingInterval=null,this.pingTimeout=null,this.missedCount=0,this.lastPingTime=0,this.lastPongTime=0,this.latency=null,this.latencyHistory=[],this.pingId=0,this.listeners=new Map,this.pendingPings=new Map,this._sendPing=this._sendPing.bind(this),this._handlePongTimeout=this._handlePongTimeout.bind(this),this._onNetworkChange=this._onNetworkChange.bind(this),f.debug("Heartbeat manager created",this.options)}start(){if(this.state!==w.STOPPED){f.warn("Heartbeat already running or failed");return}if(!this.network.isOnline()){f.info("Network offline, heartbeat will start when online"),this.network.onChange(this._onNetworkChange);return}this.state=w.RUNNING,this.missedCount=0,this._schedulePing(),f.info("Heartbeat started"),this._emit(EA.PING_SENT,{state:this.state})}stop(){this.state=w.STOPPED,this._clearTimers(),this.missedCount=0,this.pendingPings.clear(),f.info("Heartbeat stopped")}reset(){this.stop(),this.missedCount=0,this.latency=null,this.pendingPings.clear(),f.debug("Heartbeat reset")}pongReceived(A){let I=Date.now();this.lastPongTime=I;let O=null,U=null;if(A&&A.id)O=A.id,U=this.pendingPings.get(O)||null,this.pendingPings.delete(O);else{let E=Array.from(this.pendingPings.entries()).sort((K,B)=>B[1]-K[1])[0];E&&(O=E[0],U=E[1],this.pendingPings.delete(O))}if(U){let E=I-U;this._updateLatency(E)}this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null),this.missedCount=0,this.state=w.RUNNING,f.debug("Pong received",{pingId:O,latency:this.latency,missed:this.missedCount}),this._emit(EA.PONG_RECEIVED,{latency:this.latency,pingId:O}),this._schedulePing()}getStatus(){return{state:this.state,missed:this.missedCount,latency:this.latency,lastPing:this.lastPingTime,lastPong:this.lastPongTime,uptime:this.lastPingTime?Date.now()-this.lastPingTime:0}}getLatency(){return this.latency}isHealthy(){return this.state===w.RUNNING&&this.missedCount===0}isFailing(){return this.state===w.FAILED||this.missedCount>=this.options.maxMissed}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}_schedulePing(){this._clearTimers();let A=this.options.interval;this.options.adaptive&&this.network.getStatus().state==="degraded"&&(A=A*1.5),this.pingInterval=setTimeout(()=>{this._sendPing()},A)}_sendPing(){if(this.state===w.STOPPED)return;if(!this.network.isOnline()){f.debug("Network offline, skipping ping"),this._schedulePing();return}let A=Date.now();this.lastPingTime=A;let I=this.pingId++;this.pendingPings.set(I,A);try{let O={type:"ping",id:I,timestamp:A};this.options.sendPing(O),f.debug("Ping sent",{pingId:I}),this._emit(EA.PING_SENT,{pingId:I})}catch(O){f.error("Failed to send ping:",O),this._handlePongTimeout();return}this.state=w.WAITING,this.pingTimeout=setTimeout(()=>{this._handlePongTimeout(I)},this.options.timeout)}_handlePongTimeout(A){if(this.missedCount++,f.warn("Pong timeout",{pingId:A,missed:this.missedCount,max:this.options.maxMissed}),this._emit(EA.MISSED,{pingId:A,missed:this.missedCount,total:this.options.maxMissed}),this.pendingPings.delete(A),this.missedCount>=this.options.maxMissed){this._handleDeadConnection();return}this.state=w.RUNNING,this._schedulePing()}_handleDeadConnection(){this.state=w.FAILED,f.error("Heartbeat failed - connection appears dead",{missed:this.missedCount,lastPing:this.lastPingTime,lastPong:this.lastPongTime}),this._emit(EA.DEAD,{missed:this.missedCount,latency:this.latency}),this.stop()}_updateLatency(A){this.latencyHistory.push(A),this.latencyHistory.length>10&&this.latencyHistory.shift();let I=this.latencyHistory.reduce((O,U)=>O+U,0)/this.latencyHistory.length;this.latency=Math.round(I),this._emit(EA.LATENCY_UPDATED,{latency:this.latency,raw:A})}_onNetworkChange(A){A.state==="online"&&this.state===w.STOPPED&&(f.info("Network restored, starting heartbeat"),this.start()),A.state==="offline"&&this.state!==w.STOPPED&&(f.info("Network offline, stopping heartbeat"),this.stop())}_clearTimers(){this.pingInterval&&(clearTimeout(this.pingInterval),this.pingInterval=null),this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){f.error("Error in heartbeat listener:",U)}})}};function T1(N){return new g1(N)}var l=S("connection"),J={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTING:"disconnecting",RECONNECTING:"reconnecting",FAILED:"failed"},KA={INTENTIONAL:"intentional",NETWORK_LOST:"network_lost",SERVER_CLOSED:"server_closed",TIMEOUT:"timeout",HEARTBEAT_FAILED:"heartbeat_failed",ERROR:"error"},_={CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnect_failed",FAILED:"failed",STATE_CHANGED:"state_changed",STATS_UPDATED:"stats_updated"},f1=class{constructor(A,I={}){if(!ZA(A))throw new Error(`Invalid WebSocket URL: ${A}`);this.url=A,this.options={timeout:1e4,autoConnect:!1,reconnect:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},createWebSocket:O=>new WebSocket(O),...I},this.network=UA(),this.browser=p(),this.state=J.DISCONNECTED,this.ws=null,this.heartbeat=null,this.connectionAttempts=0,this.reconnectAttempts=0,this.lastConnectedAt=null,this.lastDisconnectedAt=null,this.disconnectReason=null,this.stats={connectedAt:null,disconnectedAt:null,connectionDuration:0,messagesSent:0,messagesReceived:0,bytesSent:0,bytesReceived:0,reconnectCount:0},this._connectionPromise=null,this._connectionResolve=null,this._connectionReject=null,this._disconnectPromise=null,this._disconnectResolve=null,this._reconnectTimer=null,this.listeners=new Map,this._networkUnsubscribe=this.network.onChange(O=>this._onNetworkChange(O)),this._handleOpen=this._handleOpen.bind(this),this._handleMessage=this._handleMessage.bind(this),this._handleClose=this._handleClose.bind(this),this._handleError=this._handleError.bind(this),this._handleHeartbeatEvent=this._handleHeartbeatEvent.bind(this),l.info("Connection manager created",{url:A}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}connect(){return this.state===J.CONNECTED?Promise.resolve():this.state===J.CONNECTING&&this._connectionPromise?this._connectionPromise:this.network.isOnline()?(this._setState(J.CONNECTING),this.reconnectAttempts=0,this.disconnectReason=null,this._connectionPromise=new Promise((A,I)=>{this._connectionResolve=A,this._connectionReject=I}),this._performConnection(),this._connectionPromise):(l.warn("Cannot connect: network offline"),Promise.reject(new Error("Network offline")))}disconnect(A=1e3,I=""){if(this.state===J.DISCONNECTED)return Promise.resolve();if(this._clearReconnectTimer(),this.disconnectReason=KA.INTENTIONAL,this._setState(J.DISCONNECTING),this._disconnectPromise=new Promise(O=>{this._disconnectResolve=O}),this.heartbeat&&this.heartbeat.stop(),this.ws){this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null;try{this.ws.close(A,I)}catch(O){l.error("Error closing WebSocket:",O)}}else this._cleanup(),this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null);return this._disconnectPromise}async reconnect(){return l.info("Forcing reconnection"),this.state!==J.DISCONNECTED&&await this.disconnect(1e3,"Forced reconnection"),await mA(100),this.connect()}getStatus(){let A=Date.now();return{state:this.state,url:this.url,connectedAt:this.stats.connectedAt,disconnectedAt:this.stats.disconnectedAt,uptime:this.stats.connectedAt?A-this.stats.connectedAt:0,reconnectAttempts:this.reconnectAttempts,reconnectCount:this.stats.reconnectCount,disconnectReason:this.disconnectReason,messages:{sent:this.stats.messagesSent,received:this.stats.messagesReceived},bytes:{sent:this.stats.bytesSent,received:this.stats.bytesReceived},heartbeat:this.heartbeat?this.heartbeat.getStatus():null,network:this.network.getStatus()}}isConnected(){return this.state===J.CONNECTED}isHealthy(){return this.isConnected()&&(!this.heartbeat||this.heartbeat.isHealthy())}send(A){if(!this.isConnected()||!this.ws)throw new Error("Not connected");try{typeof A=="string"?this.stats.bytesSent+=new Blob([A]).size:A instanceof Blob?this.stats.bytesSent+=A.size:A instanceof ArrayBuffer&&(this.stats.bytesSent+=A.byteLength),this.ws.send(A),this.stats.messagesSent++}catch(I){throw l.error("Send failed:",I),I}}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}destroy(){l.info("Destroying connection manager"),this.state!==J.DISCONNECTED&&this.disconnect(1e3,"Manager destroyed"),this._networkUnsubscribe&&this._networkUnsubscribe(),this._clearReconnectTimer(),this.listeners.clear()}_performConnection(){if(!this.network.isOnline()){this._handleConnectionFailure(new Error("Network offline"),!0);return}l.info("Connecting...",{attempt:this.reconnectAttempts+1,url:this.url});try{this.ws=this.options.createWebSocket(this.url),this.ws.onopen=this._handleOpen,this.ws.onmessage=this._handleMessage,this.ws.onclose=this._handleClose,this.ws.onerror=this._handleError,this._connectionTimeout=setTimeout(()=>{if(this.state===J.CONNECTING){let A=new Error(`Connection timeout after ${this.options.timeout}ms`);this._handleConnectionFailure(A)}},this.options.timeout)}catch(A){this._handleConnectionFailure(A)}}_handleOpen(){l.info("WebSocket opened"),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null);let A=Date.now();this.lastConnectedAt=A,this.stats.connectedAt=A,this.stats.disconnectedAt=null,this.reconnectAttempts>0&&this.stats.reconnectCount++,this.reconnectAttempts=0,this.options.heartbeat.enabled&&this._setupHeartbeat(),this._setState(J.CONNECTED),this._connectionResolve&&(this._connectionResolve(),this._connectionResolve=null,this._connectionReject=null),this._emit(_.CONNECTED,{timestamp:A})}_handleMessage(A){if(this.stats.messagesReceived++,typeof A.data=="string"?this.stats.bytesReceived+=new Blob([A.data]).size:A.data instanceof Blob?this.stats.bytesReceived+=A.data.size:A.data instanceof ArrayBuffer&&(this.stats.bytesReceived+=A.data.byteLength),this.heartbeat)try{let I=JSON.parse(A.data);if(I.type==="pong"){this.heartbeat.pongReceived(I);return}}catch{}this._emit("message",A.data)}_handleClose(A){l.info("WebSocket closed",{code:A.code,reason:A.reason,wasClean:A.wasClean});let I=this.disconnectReason===KA.INTENTIONAL;if(this.lastDisconnectedAt=Date.now(),this.stats.disconnectedAt=Date.now(),this.stats.connectedAt&&(this.stats.connectionDuration+=this.lastDisconnectedAt-this.stats.connectedAt),this.heartbeat&&(this.heartbeat.stop(),this.heartbeat=null),this._cleanup(),I){this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null),this._emit(_.DISCONNECTED,{reason:KA.INTENTIONAL,code:A.code});return}let O;this.network.isOnline()?A.code===1006?O=KA.TIMEOUT:O=KA.SERVER_CLOSED:O=KA.NETWORK_LOST,this.disconnectReason=O,this._handleReconnection(O,A)}_handleError(A){l.error("WebSocket error",A),this._emit("error",A)}_handleConnectionFailure(A,I=!1){l.error("Connection failed:",A.message),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),this._cleanup(),this._connectionReject&&(this._connectionReject(A),this._connectionResolve=null,this._connectionReject=null);let O=I?KA.NETWORK_LOST:KA.ERROR;this._handleReconnection(O,null,A)}_handleReconnection(A,I,O){if(this._setState(J.RECONNECTING),this.disconnectReason=A,this._emit(_.DISCONNECTED,{reason:A,code:I==null?void 0:I.code,error:O==null?void 0:O.message}),this.reconnectAttempts>=this.options.reconnect.maxAttempts){l.error("Max reconnection attempts reached",{attempts:this.reconnectAttempts}),this._setState(J.FAILED),this._emit(_.FAILED,{reason:"max_attempts",attempts:this.reconnectAttempts});return}let U=iA(this.reconnectAttempts,this.options.reconnect);l.info(`Reconnecting in ${U}ms`,{attempt:this.reconnectAttempts+1,max:this.options.reconnect.maxAttempts}),this._emit(_.RECONNECTING,{attempt:this.reconnectAttempts+1,maxAttempts:this.options.reconnect.maxAttempts,delay:U}),this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this.reconnectAttempts++,this._performConnection()},U)}_onNetworkChange(A){l.debug("Network changed:",A.state),A.state==="online"&&(this.state===J.RECONNECTING||this.state===J.DISCONNECTED)&&(l.info("Network restored, retrying connection"),this._clearReconnectTimer(),this._performConnection()),A.state==="offline"&&this.isConnected()&&l.warn("Network lost, connection will likely fail")}_handleHeartbeatEvent(A,I){A===EA.DEAD&&(l.error("Heartbeat dead, reconnecting"),this.disconnectReason=KA.HEARTBEAT_FAILED,this.ws&&this.ws.close()),A===EA.LATENCY_UPDATED&&this._emit("latency",{latency:I.latency})}_setupHeartbeat(){this.ws&&(this.heartbeat=T1({interval:this.options.heartbeat.interval,timeout:this.options.heartbeat.timeout,sendPing:A=>{try{this.ws.send(JSON.stringify(A)),this.stats.messagesSent++}catch(I){l.error("Failed to send ping:",I)}}}),this.heartbeat.onEvent(this._handleHeartbeatEvent),this.heartbeat.start())}_setState(A){let I=this.state;I!==A&&(this.state=A,l.debug(`State: ${I} -> ${A}`),this._emit(_.STATE_CHANGED,{from:I,to:A}))}_cleanup(){this.ws&&(this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null,this.ws=null),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null)}_clearReconnectTimer(){this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){l.error("Error in event listener:",U)}})}};function W1(N,A={}){return new f1(N,A)}var H=S("transport"),Z={WEBSOCKET:"websocket",EVENTSOURCE:"eventsource",POLLING:"polling",NONE:"none"},D={IDLE:"idle",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTED:"disconnected",FAILED:"failed"},e={CONNECT:"connect",MESSAGE:"message",DISCONNECT:"disconnect",ERROR:"error",TRANSPORT_CHANGED:"transport_changed"},kA=class{constructor(A,I={}){this.url=A,this.options=I,this.state=D.IDLE,this.listeners=new Map}connect(){throw new Error("Not implemented")}disconnect(){throw new Error("Not implemented")}send(A){throw new Error("Not implemented")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){H.error("Error in event listener:",E)}})}getState(){return this.state}getType(){return Z.NONE}},w1=class extends kA{constructor(A,I={}){super(A,I),this.ws=null,this.pendingMessages=[],this.type=Z.WEBSOCKET}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,H.info("WebSocket connecting to:",this.url);try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{for(H.info("WebSocket connected"),this.state=D.CONNECTED;this.pendingMessages.length>0;){let A=this.pendingMessages.shift();this.send(A)}this._emit(e.CONNECT,{transport:this.type})},this.ws.onmessage=A=>{this._emit(e.MESSAGE,A.data)},this.ws.onclose=A=>{H.info("WebSocket closed",{code:A.code,reason:A.reason}),this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{code:A.code,reason:A.reason,wasClean:A.wasClean})},this.ws.onerror=A=>{H.error("WebSocket error:",A),this._emit(e.ERROR,A)}}catch(A){H.error("WebSocket creation failed:",A),this.state=D.FAILED,this._emit(e.ERROR,A)}}}disconnect(){this.ws&&(this.ws.close(1e3,"Intentional disconnect"),this.ws=null),this.state=D.DISCONNECTED,this.pendingMessages=[]}send(A){if(this.state===D.CONNECTED&&this.ws)try{return this.ws.send(A),!0}catch(I){return H.error("WebSocket send failed:",I),!1}else return this.pendingMessages.push(A),!1}},v1=class extends kA{constructor(A,I={}){super(A,I),this.es=null,this.sendQueue=[],this.type=Z.EVENTSOURCE,this.connectUrl=A,this.sendUrl=A.replace(/^ws/,"http").replace(/^wss/,"https")}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,H.info("EventSource connecting to:",this.connectUrl);try{this.es=new EventSource(this.connectUrl),this.es.onopen=()=>{H.info("EventSource connected"),this.state=D.CONNECTED,this._emit(e.CONNECT,{transport:this.type})},this.es.onmessage=A=>{this._emit(e.MESSAGE,A.data)},this.es.onerror=A=>{H.error("EventSource error:",A),this.state===D.CONNECTED&&(this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"error"})),this._emit(e.ERROR,A)}}catch(A){H.error("EventSource creation failed:",A),this.state=D.FAILED,this._emit(e.ERROR,A)}}}disconnect(){this.es&&(this.es.close(),this.es=null),this.state=D.DISCONNECTED,this.sendQueue=[]}send(A){if(this.state!==D.CONNECTED)return this.sendQueue.push(A),!1;try{return fetch(this.sendUrl,{method:"POST",body:A,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(I=>{H.error("EventSource send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return H.error("EventSource send failed:",I),!1}}},V1=class extends kA{constructor(A,I={}){super(A,I),this.pollingInterval=I.pollingInterval||3e3,this.pollingActive=!1,this.sendQueue=[],this.messageQueue=[],this.pollTimeout=null,this.type=Z.POLLING,this.baseUrl=A.replace(/^ws/,"http").replace(/^wss/,"https"),this.pollUrl=`${this.baseUrl}/poll`,this.sendUrl=`${this.baseUrl}/send`}getType(){return this.type}connect(){this.state===D.IDLE&&(this.state=D.CONNECTING,H.info("Polling connecting to:",this.baseUrl),this.pollingActive=!0,this._poll(),this.state=D.CONNECTED,this._emit(e.CONNECT,{transport:this.type}))}disconnect(){this.pollingActive=!1,this.pollTimeout&&(clearTimeout(this.pollTimeout),this.pollTimeout=null),this.state=D.DISCONNECTED,this.sendQueue=[],this.messageQueue=[]}send(A){if(this.state!==D.CONNECTED)return this.sendQueue.push(A),!1;try{return fetch(this.sendUrl,{method:"POST",body:A,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(I=>{H.error("Polling send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return H.error("Polling send failed:",I),!1}}async _poll(){if(this.pollingActive){try{let A=new AbortController,I=setTimeout(()=>A.abort(),3e4),O=await fetch(this.pollUrl,{method:"GET",signal:A.signal,headers:{"Cache-Control":"no-cache"}});if(clearTimeout(I),O.ok){let U=await O.text();U&&this._emit(e.MESSAGE,U)}}catch(A){if(A.name==="AbortError")H.debug("Poll timeout, restarting");else if(H.error("Poll failed:",A),this._emit(e.ERROR,A),!navigator.onLine){this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"network_lost"});return}}this.pollingActive&&(this.pollTimeout=setTimeout(()=>this._poll(),this.pollingInterval))}}},y1=class{constructor(A,I={}){this.url=A,this.options={transports:[Z.WEBSOCKET,Z.EVENTSOURCE,Z.POLLING],timeout:1e4,pollingInterval:3e3,...I},this.browser=p(),this.network=UA(),this.currentTransport=null,this.transportType=Z.NONE,this.state=D.IDLE,this.listeners=new Map,this.availableTransports=this._getAvailableTransports(),H.info("Transport manager created",{available:this.availableTransports})}async connect(){if(this.state===D.CONNECTED)return;if(this.state=D.CONNECTING,!this.network.isOnline()){let I=new Error("Network offline");throw this._emit(e.ERROR,I),I}for(let I of this.availableTransports){H.info(`Trying transport: ${I}`);try{await this._tryTransport(I),H.info(`Connected using ${I}`),this.transportType=I,this.state=D.CONNECTED,this._emit(e.TRANSPORT_CHANGED,{transport:I}),this._emit(e.CONNECT,{transport:I});return}catch(O){H.warn(`Transport ${I} failed:`,O.message)}}this.state=D.FAILED;let A=new Error("No transport available");throw this._emit(e.ERROR,A),A}disconnect(){this.currentTransport&&(this.currentTransport.disconnect(),this.currentTransport=null),this.transportType=Z.NONE,this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"intentional"})}send(A){return!this.currentTransport||this.state!==D.CONNECTED?!1:this.currentTransport.send(A)}getTransportType(){return this.transportType}getState(){return this.state}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_tryTransport(A){return new Promise((I,O)=>{let U;switch(A){case Z.WEBSOCKET:U=new w1(this.url,this.options);break;case Z.EVENTSOURCE:U=new v1(this.url,this.options);break;case Z.POLLING:U=new V1(this.url,this.options);break;default:O(new Error(`Unknown transport: ${A}`));return}let E,K,B=()=>{E&&E(),K&&K(),clearTimeout(R)},R=setTimeout(()=>{U.disconnect(),B(),O(new Error(`Transport ${A} timeout`))},this.options.timeout);E=U.on(e.CONNECT,()=>{this.currentTransport=U,this._forwardTransportEvents(U),B(),I()}),K=U.on(e.ERROR,M=>{B(),O(M||new Error(`Transport ${A} failed`))}),U.connect()})}_forwardTransportEvents(A){[e.MESSAGE,e.DISCONNECT,e.ERROR].forEach(O=>{A.on(O,U=>{this._emit(O,U),O===e.DISCONNECT&&(this.state=D.DISCONNECTED)})})}_getAvailableTransports(){return this.options.transports.filter(A=>{switch(A){case Z.WEBSOCKET:return this.browser.hasWebSocket;case Z.EVENTSOURCE:return typeof EventSource<"u";case Z.POLLING:return!0;default:return!1}})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){H.error("Error in event listener:",E)}})}};function Y1(N,A={}){return new y1(N,A)}var qA=S("client"),V4={autoConnect:!1,timeout:1e4,reconnect:!0,reconnectOptions:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},transport:{transports:["websocket","eventsource","polling"],pollingInterval:3e3},debug:!1},F1=class{constructor(A,I={}){if(!ZA(A))throw new TypeError(`Invalid WebSocket URL: ${A}`);this.url=A,this.options=Z1(V4,I),this.options.debug&&qA.debug("Debug mode enabled"),this.browser=p(),this.transport=Y1(A,{transports:this.options.transport.transports,timeout:this.options.timeout,pollingInterval:this.options.transport.pollingInterval}),this.connection=W1(A,{timeout:this.options.timeout,reconnect:{maxAttempts:this.options.reconnectOptions.maxAttempts,baseDelay:this.options.reconnectOptions.baseDelay,maxDelay:this.options.reconnectOptions.maxDelay,jitter:this.options.reconnectOptions.jitter},heartbeat:this.options.heartbeat,createWebSocket:null,transport:this.transport}),this.messageHandlers=new Map,this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.messageCounter=0,this.pendingAcks=new Map,this._handleConnectionEvent=this._handleConnectionEvent.bind(this),this._handleTransportMessage=this._handleTransportMessage.bind(this),this._setupEventForwarding(),qA.info("WebSocket client created",{url:A,options:this.options,browser:this.browser.browserInfo.name}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}_setupEventForwarding(){this.connection.onEvent((A,I)=>{this._handleConnectionEvent(A,I)}),this.transport.on(e.MESSAGE,A=>{this._handleTransportMessage(A)}),this.transport.on(e.ERROR,A=>{this._triggerEvent("error",A)})}_handleConnectionEvent(A,I){switch(A){case _.CONNECTED:this._triggerEvent("open",I);break;case _.DISCONNECTED:this._triggerEvent("close",I);break;case _.RECONNECTING:this._triggerEvent("reconnectAttempt",{attempt:I.attempt,maxAttempts:I.maxAttempts,delay:I.delay});break;case _.FAILED:this._triggerEvent("error",new Error(`Connection failed: ${I.reason}`));break;case"latency":this._triggerEvent("latency",I);break}}_handleTransportMessage(A){let I=A;if(typeof A=="string")try{I=JSON.parse(A)}catch{}if(I&&I.type==="ack"&&I.id){this._handleAck(I.id,I);return}I&&I.type&&this.messageHandlers.has(I.type)&&this.messageHandlers.get(I.type).forEach(U=>{try{U(I.data||I)}catch(E){qA.error("Error in message handler:",E)}}),this._triggerEvent("message",I)}_handleAck(A,I){if(this.pendingAcks.has(A)){let{resolve:O,reject:U}=this.pendingAcks.get(A);I.success?O(I.result||I):U(new Error(I.error||"Unknown error")),this.pendingAcks.delete(A)}}connect(){return this.connection.connect()}disconnect(A=1e3,I=""){return this.connection.disconnect(A,I)}send(A){if(!this.isConnected())throw new Error("Not connected");let I=A;A&&typeof A=="object"&&!(A instanceof ArrayBuffer)&&!(A instanceof Blob)&&(I=JSON.stringify(A)),this.connection.send(I)}sendWithAck(A,I,O=1e4){if(!this.isConnected())return Promise.reject(new Error("Not connected"));let U=`${Date.now()}-${this.messageCounter++}`,E=nA(),K={type:A,data:I,id:U,ack:!0},B=setTimeout(()=>{this.pendingAcks.has(U)&&(this.pendingAcks.delete(U),E.reject(new Error("Acknowledgement timeout")))},O);return this.pendingAcks.set(U,{resolve:R=>{clearTimeout(B),E.resolve(R)},reject:R=>{clearTimeout(B),E.reject(R)}}),this.connection.send(JSON.stringify(K)),E.promise}onMessage(A,I){return this.messageHandlers.has(A)||this.messageHandlers.set(A,[]),this.messageHandlers.get(A).push(I),this}offMessage(A,I){if(!this.messageHandlers.has(A))return this;if(I){let O=this.messageHandlers.get(A),U=O.indexOf(I);U!==-1&&O.splice(U,1)}else this.messageHandlers.delete(A);return this}on(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(typeof I!="function")throw new TypeError("Handler must be a function");return this.eventHandlers[A]||(this.eventHandlers[A]=[]),this.eventHandlers[A].push(I),this}off(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(!this.eventHandlers[A])return this;if(I){let U=this.eventHandlers[A].indexOf(I);U!==-1&&this.eventHandlers[A].splice(U,1)}else this.eventHandlers[A]=[];return this}_triggerEvent(A,I){(this.eventHandlers[A]||[]).forEach(U=>{try{U(I)}catch(E){qA.error(`Error in ${A} handler:`,E)}})}isConnected(){return this.connection.isConnected()}isHealthy(){return this.connection.isHealthy()}getStatus(){var O,U,E;let A=this.connection.getStatus(),I=G1();return{connected:this.isConnected(),state:A.state,url:this.url,transport:this.transport.getTransportType(),latency:(O=A.heartbeat)==null?void 0:O.latency,uptime:A.uptime,messagesSent:(U=A.messages)==null?void 0:U.sent,messagesReceived:(E=A.messages)==null?void 0:E.received,reconnectAttempts:A.reconnectAttempts,networkOnline:I,browser:this.browser.browserInfo.name}}reconnect(){return this.connection.reconnect()}getTransportType(){return this.transport.getTransportType()}destroy(){qA.info("Destroying client"),this.disconnect(1e3,"Client destroyed"),this.messageHandlers.clear(),this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.pendingAcks.clear()}},z2=F1;var HA=S("packet"),j={MESSAGE:"message",EVENT:"event",COMMAND:"command",RESPONSE:"response",ERROR:"error",PING:"ping",PONG:"pong",JOIN:"join",LEAVE:"leave",PRESENCE:"presence",ACK:"ack",AUTH:"auth",SYSTEM:"system"},tA={CRITICAL:"critical",HIGH:"high",NORMAL:"normal",LOW:"low"},zA={AT_MOST_ONCE:"at_most_once",AT_LEAST_ONCE:"at_least_once",EXACTLY_ONCE:"exactly_once"},y4="1.0",$2=256*1024,F4=6e4;function j2(N){return N&&typeof N.id=="string"&&bA(N.type,j)&&N.timestamp&&typeof N.timestamp=="number"}var cA=class N{constructor(A,I,O={}){if(!bA(A,j)){if(typeof A!="string")throw new Error(`Invalid message type: ${A}. Must be a string.`);HA.warn(`Unknown message type: ${A}. Using custom type.`)}if(O.namespace&&!_A(O.namespace))throw new Error(`Invalid namespace: ${O.namespace}. Must start with / and contain only letters, numbers, underscores, and hyphens.`);if(O.priority&&!bA(O.priority,tA))throw new Error(`Invalid priority: ${O.priority}. Must be one of: ${Object.values(tA).join(", ")}`);if(O.deliveryGuarantee&&!bA(O.deliveryGuarantee,zA))throw new Error(`Invalid delivery guarantee: ${O.deliveryGuarantee}. Must be one of: ${Object.values(zA).join(", ")}`);this.id=O.id||V("pkt"),this.type=A,this.payload=I,this.timestamp=Date.now(),this.version=y4,this.priority=O.priority||tA.NORMAL,this.requiresAck=O.requiresAck||!1,this.ttl=O.ttl||F4,this.namespace=O.namespace||"/",this.deliveryGuarantee=O.deliveryGuarantee||zA.AT_MOST_ONCE,this.metadata=O.metadata||{},this.from=O.from||null,this.inResponseTo=O.inResponseTo||null,this._checkSize(),HA.debug("Packet created",{id:this.id,type:this.type,namespace:this.namespace,size:this.getSize()})}_checkSize(){let A=this.getSize();A>$2&&HA.warn("Packet exceeds recommended size",{size:A,max:$2,id:this.id,type:this.type})}getSize(){return M1(this)}isExpired(){return L1(this.timestamp,this.ttl)}getRemainingTTL(){return k2(this.timestamp,this.ttl)}createResponse(A,I={}){return new N(j.RESPONSE,A,{...I,inResponseTo:this.id,namespace:this.namespace,priority:I.priority||this.priority})}createError(A,I={},O=500){return new N(j.ERROR,{code:O,message:A,details:I,originalType:this.type,originalId:this.id},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}createAck(A=null){return new N(j.ACK,{originalId:this.id,result:A,timestamp:Date.now()},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}serialize(){let A={id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo},I=u1(A);return I||(HA.error("Failed to serialize packet",{id:this.id}),null)}toObject(){return{id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo,size:this.getSize(),expired:this.isExpired()}}static deserialize(A){let I=typeof A=="string"?d1(A):A;if(!I)return HA.error("Failed to parse packet data"),null;if(!j2(I))return HA.error("Invalid packet structure",I),null;try{return new N(I.type,I.payload,{id:I.id,priority:I.priority,requiresAck:I.requiresAck,ttl:I.ttl,namespace:I.namespace,deliveryGuarantee:I.deliveryGuarantee,metadata:I.metadata,from:I.from,inResponseTo:I.inResponseTo})}catch(O){return HA.error("Failed to create packet from data:",O),null}}static isValid(A){let I=typeof A=="string"?d1(A):A;return j2(I)}static fromRaw(A){return typeof A=="string"?N.deserialize(A):A instanceof Blob||A instanceof ArrayBuffer?new N(j.MESSAGE,A,{metadata:{binary:!0}}):(HA.warn("Unsupported raw data type:",typeof A),null)}};function Q2(N,A,I={}){return new cA(N,A,I)}function X2(N,A,I={}){return new cA(j.EVENT,{event:N,data:A},{priority:tA.LOW,...I})}function AI(N,A,I={}){return new cA(j.COMMAND,{command:N,params:A},{requiresAck:!0,priority:tA.HIGH,...I})}var k=S("router"),pA={EXACT:"exact",WILDCARD:"wildcard",REGEX:"regex",FUNCTION:"function"},II={CRITICAL:100,HIGH:200,NORMAL:300,LOW:400,FALLBACK:500},Q={PRE:"pre",POST:"post",AROUND:"around"},x1=class{constructor(A,I,O={}){this.pattern=A,this.handler=I,this.matchType=O.matchType||pA.EXACT,this.priority=O.priority||II.NORMAL,this.namespace=O.namespace||null,this.description=O.description||A.toString(),this.id=`${Date.now()}-${Math.random().toString(36).substring(2,8)}`,this.created=Date.now(),this.callCount=0,this.lastCalled=null}matches(A){if(this.namespace&&A.namespace!==this.namespace)return!1;let I=A.type;switch(this.matchType){case pA.EXACT:return I===this.pattern;case pA.WILDCARD:return this._matchWildcard(I,this.pattern);case pA.REGEX:return this.pattern.test(I);case pA.FUNCTION:return this.pattern(A);default:return!1}}execute(A,I){this.callCount++,this.lastCalled=Date.now();try{return this.handler(A,I)}catch(O){throw k.error(`Handler ${this.description} failed:`,O),O}}_matchWildcard(A,I){if(I==="*")return!0;let O=I.replace(/\./g,"\\.").replace(/\*/g,".*");return new RegExp(`^${O}$`).test(A)}getStats(){return{id:this.id,description:this.description,matchType:this.matchType,priority:this.priority,namespace:this.namespace,callCount:this.callCount,lastCalled:this.lastCalled,created:this.created}}},b1=class N{constructor(A={}){this.options={catchErrors:!0,asyncHandlers:!1,maxHandlersPerRoute:10,logHandling:!0,...A},this.routes=new Map,this.namespaces=new Map,this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this.stats={routesProcessed:0,handlersExecuted:0,errorsCaught:0,lastRoute:null},this._setupDefaultHandlers(),k.info("Router created")}_setupDefaultHandlers(){this.on("*",A=>{k.debug("Unhandled message type:",A.type)},{matchType:pA.WILDCARD,priority:II.FALLBACK,description:"Catch-all handler"}),this.on(j.ERROR,A=>{k.error("Received error packet:",A.payload)},{description:"Error handler"})}on(A,I,O={}){if(typeof I!="function")throw new TypeError("Handler must be a function");let U=new x1(A,I,O),E=this._getRouteKey(A,O.namespace);this.routes.has(E)||this.routes.set(E,[]);let K=this.routes.get(E);return K.length>=this.options.maxHandlersPerRoute&&k.warn(`Max handlers (${this.options.maxHandlersPerRoute}) reached for route:`,E),K.push(U),K.sort((B,R)=>B.priority-R.priority),k.debug("Handler registered",{pattern:A,namespace:O.namespace,priority:O.priority}),()=>{this.off(A,I,O.namespace)}}off(A,I,O){let U=this._getRouteKey(A,O),E=this.routes.get(U);if(!E)return;let K=E.findIndex(B=>B.handler===I);K!==-1&&(E.splice(K,1),k.debug("Handler removed",{pattern:A,namespace:O})),E.length===0&&this.routes.delete(U)}once(A,I,O={}){let U=(E,K)=>{I(E,K),this.off(A,U,O.namespace)};this.on(A,U,O)}route(A,I={}){this.stats.routesProcessed++,this.stats.lastRoute=Date.now(),this._runMiddleware(Q.PRE,A,I);let O=this._findHandlers(A);if(O.length===0){k.debug("No handlers for packet type:",A.type);return}k.debug("Routing packet",{type:A.type,namespace:A.namespace,handlers:O.length});let U=[];for(let E of O)try{let K=this._runAroundMiddleware(A,I,E);if(K!==void 0)U.push(K);else{let B=E.execute(A,I);U.push(B)}this.stats.handlersExecuted++}catch(K){if(this.stats.errorsCaught++,this.options.catchErrors)k.error("Handler error:",K);else throw K}return this._runMiddleware(Q.POST,A,I,U),this.options.asyncHandlers?Promise.all(U):U}namespace(A){if(!this.namespaces.has(A)){let I=new N(this.options);I.on=(O,U,E={})=>this.on(O,U,{...E,namespace:A}),I.off=(O,U,E={})=>this.off(O,U,A),this.namespaces.set(A,I)}return this.namespaces.get(A)}use(A,I){if(!this.middleware[A])throw new Error(`Invalid middleware type: ${A}`);this.middleware[A].push(I),k.debug("Middleware added",{type:A})}removeMiddleware(A,I){let O=this.middleware[A].indexOf(I);O!==-1&&this.middleware[A].splice(O,1)}_findHandlers(A){let I=[];for(let[O,U]of this.routes)if(this._routeCouldMatch(O,A)){let E=U.filter(K=>K.matches(A));I.push(...E)}return I.sort((O,U)=>O.priority-U.priority),I}_routeCouldMatch(A,I){let[O,U,E]=A.split("|");return!(U&&U!==I.namespace)}_getRouteKey(A,I){return`${A instanceof RegExp?"regex":typeof A}|${I||""}|${A}`}_runMiddleware(A,I,O,U=null){for(let E of this.middleware[A])try{E(I,O,U)}catch(K){k.error(`Middleware (${A}) error:`,K)}}_runAroundMiddleware(A,I,O){let U;for(let E of this.middleware[Q.AROUND])if(U=E(A,I,(B,R)=>O.execute(B,R)),U!==void 0)break;return U}getRoutes(){let A=[];for(let[I,O]of this.routes)A.push({key:I,handlers:O.map(U=>U.getStats())});return A}getStats(){return{...this.stats,totalRoutes:this.routes.size,totalHandlers:Array.from(this.routes.values()).reduce((A,I)=>A+I.length,0),middlewareCount:{pre:this.middleware[Q.PRE].length,post:this.middleware[Q.POST].length,around:this.middleware[Q.AROUND].length},namespaces:this.namespaces.size}}reset(){this.routes.clear(),this.namespaces.clear(),this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this._setupDefaultHandlers(),k.info("Router reset")}};function OI(N={}){return new b1(N)}var BA=S("namespace"),oA={CREATED:"created",DESTROYED:"destroyed",USER_JOINED:"user_joined",USER_LEFT:"user_left",ERROR:"error"},x4={autoCreateRooms:!0,maxRooms:100,broadcastPresence:!0,persistState:!1,authRequired:!1},gA=class N{constructor(A,I,O={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);this.path=A,this.socket=I,this.options={...x4,...O},this.id=V("ns"),this.router=OI({catchErrors:!0}),this.rooms=new Map,this.users=new Map,this.children=new Map,this.handlers={[oA.CREATED]:[],[oA.DESTROYED]:[],[oA.USER_JOINED]:[],[oA.USER_LEFT]:[],[oA.ERROR]:[]},this.state={created:Date.now(),messageCount:0,userCount:0,roomCount:0},this._handleMessage=this._handleMessage.bind(this),BA.info("Namespace created",{path:this.path,id:this.id})}on(A,I){if(typeof I!="function")throw new TypeError("Handler must be a function");return this.router.on(A,(O,U)=>{I(O.payload,U)}),this}onMessage(A,I){return this.on(A,I)}emit(A,I,O={}){let U={type:A,data:I,namespace:this.path,timestamp:Date.now()};if(this.state.messageCount++,O.ack)return this.socket.sendWithAck(A,U,O.timeout);this.socket.send(U)}broadcast(A,I,O=[]){this.emit("broadcast",{event:A,data:I,except:O,namespace:this.path})}async joinRoom(A,I){if(!this.rooms.has(A)){if(this.rooms.size>=this.options.maxRooms)return BA.warn("Max rooms reached",{namespace:this.path}),!1;this.rooms.set(A,new Set)}return this.rooms.get(A).add(I),this.state.roomCount=this.rooms.size,BA.debug("User joined room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_joined",{room:A,userId:I},[I]),!0}leaveRoom(A,I){let O=this.rooms.get(A);O&&(O.delete(I),O.size===0&&this.rooms.delete(A),BA.debug("User left room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_left",{room:A,userId:I},[I]))}getRoomUsers(A){let I=this.rooms.get(A);return I?Array.from(I):[]}getRooms(){return Array.from(this.rooms.keys())}addUser(A,I={}){this.users.set(A,{...I,joined:Date.now(),rooms:[]}),this.state.userCount=this.users.size,BA.debug("User added to namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"online",data:I})}removeUser(A){for(let[I,O]of this.rooms)O.has(A)&&this.leaveRoom(I,A);this.users.delete(A),this.state.userCount=this.users.size,BA.debug("User removed from namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"offline"})}namespace(A,I={}){let O=this.path==="/"?A:`${this.path}${A}`;if(!this.children.has(O)){let U=new N(O,this.socket,{...this.options,...I});this.children.set(O,U)}return this.children.get(O)}_handleMessage(A){return A.namespace!==this.path?!1:(this.router.route(A,{namespace:this,socket:this.socket}),!0)}hasUser(A){return this.users.has(A)}getStats(){return{...this.state,path:this.path,id:this.id,userCount:this.users.size,roomCount:this.rooms.size,childCount:this.children.size}}destroy(){this.rooms.clear(),this.users.clear();for(let A of this.children.values())A.destroy();this.children.clear(),BA.info("Namespace destroyed",{path:this.path}),this._emit(oA.DESTROYED,{path:this.path,id:this.id})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){BA.error(`Error in ${A} handler:`,E)}})}_on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),this}},$A=class{constructor(A,I={}){this.socket=A,this.options=I,this.root=new gA("/",A,I),this.namespaces=new Map,this.namespaces.set("/",this.root),this._setupMessageHandler(),BA.info("NamespaceManager created")}_setupMessageHandler(){this.socket.on("message",A=>{let I=this.namespaces.get(A.namespace||"/");I&&I._handleMessage(A)})}of(A,I={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);if(this.namespaces.has(A))return this.namespaces.get(A);let O=new gA(A,this.socket,{...this.options,...I});return this.namespaces.set(A,O),BA.info("Namespace created via manager",{path:A}),O}list(){return Array.from(this.namespaces.keys())}remove(A){if(A==="/")throw new Error("Cannot remove root namespace");let I=this.namespaces.get(A);I&&(I.destroy(),this.namespaces.delete(A))}broadcastAll(A,I){for(let O of this.namespaces.values())O.broadcast(A,I)}getStats(){let A={};for(let[I,O]of this.namespaces)A[I]=O.getStats();return A}destroy(){for(let A of this.namespaces.values())A.destroy();this.namespaces.clear(),BA.info("NamespaceManager destroyed")}};function NI(N,A={}){return new $A(N,A)}var y=S("rooms"),q={USER_JOINED:"user_joined",USER_LEFT:"user_left",ROOM_CREATED:"room_created",ROOM_DESTROYED:"room_destroyed",ROOM_MESSAGE:"room_message",ROOM_UPDATED:"room_updated",ERROR:"error"},k1={PUBLIC:"public",PRIVATE:"private",HIDDEN:"hidden"},jA={TEMPORARY:"temporary",PERSISTENT:"persistent",ANONYMOUS:"anonymous"},b4={maxUsers:100,visibility:k1.PUBLIC,type:jA.TEMPORARY,broadcastPresence:!0,persistMessages:!1,maxHistory:100,inviteOnly:!1},_1=class{constructor(A,I={}){this.userId=A,this.joinedAt=Date.now(),this.lastActivity=Date.now(),this.role=I.role||"member",this.metadata=I.metadata||{},this.presence="online"}updateActivity(){this.lastActivity=Date.now()}setPresence(A){this.presence=A,this.updateActivity()}toJSON(){return{userId:this.userId,joinedAt:this.joinedAt,lastActivity:this.lastActivity,role:this.role,metadata:this.metadata,presence:this.presence}}},fA=class{constructor(A,I={}){this.name=A,this.id=V("room"),this.options={...b4,...I},this.members=new Map,this.messageHistory=[],this.metadata={...this.options.metadata,createdAt:Date.now(),createdBy:null},this.state={active:!0,memberCount:0,messageCount:0,lastActivity:Date.now()},this.handlers={[q.USER_JOINED]:[],[q.USER_LEFT]:[],[q.ROOM_MESSAGE]:[],[q.ROOM_UPDATED]:[],[q.ERROR]:[]},y.info("Room created",{name:this.name,id:this.id,visibility:this.options.visibility})}addMember(A,I={}){if(this.members.has(A))return y.debug("User already in room",{userId:A,room:this.name}),!1;if(this.members.size>=this.options.maxUsers)return y.warn("Room full",{room:this.name,max:this.options.maxUsers}),this._emit(q.ERROR,{code:"room_full",message:"Room has reached maximum capacity"}),!1;if(this.options.inviteOnly&&!I.invited)return y.warn("Attempt to join invite-only room",{userId:A,room:this.name}),!1;let O=new _1(A,I);return this.members.set(A,O),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User joined room",{userId:A,room:this.name,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_JOINED,{userId:A,room:this.name,timestamp:Date.now(),memberData:O.toJSON()}),!0}removeMember(A,I="left"){if(!this.members.has(A))return!1;let O=this.members.get(A);return this.members.delete(A),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User left room",{userId:A,room:this.name,reason:I,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_LEFT,{userId:A,room:this.name,reason:I,timestamp:Date.now(),memberData:O.toJSON()}),this.options.type===jA.TEMPORARY&&this.members.size===0&&this.destroy("Room empty"),!0}hasMember(A){return this.members.has(A)}getMember(A){let I=this.members.get(A);return I?I.toJSON():null}getMembers(){return Array.from(this.members.values()).map(A=>A.toJSON())}getMemberCount(){return this.members.size}message(A,I,O={}){if(!this.members.has(A)&&this.options.type!==jA.ANONYMOUS)throw new Error(`User ${A} is not in room ${this.name}`);let U={id:V("msg"),room:this.name,userId:A,message:I,timestamp:Date.now(),type:O.type||"message",metadata:O.metadata||{}};return this.members.has(A)&&this.members.get(A).updateActivity(),this.state.messageCount++,this.state.lastActivity=Date.now(),this.options.persistMessages&&(this.messageHistory.push(U),this.messageHistory.length>this.options.maxHistory&&(this.messageHistory=this.messageHistory.slice(-this.options.maxHistory))),y.debug("Room message",{room:this.name,userId:A,msgId:U.id}),this._emit(q.ROOM_MESSAGE,U),U.id}broadcast(A,I,O=[]){let U={room:this.name,event:A,data:I,timestamp:Date.now()};this._emit(A,U,O)}update(A,I=null){this.metadata={...this.metadata,...A,updatedAt:Date.now(),updatedBy:I},this._emit(q.ROOM_UPDATED,{room:this.name,updates:A,userId:I,timestamp:Date.now()})}getInfo(){return{id:this.id,name:this.name,options:{...this.options},metadata:{...this.metadata},state:{...this.state},memberCount:this.members.size,messageCount:this.state.messageCount}}getHistory(A=this.options.maxHistory){return this.messageHistory.slice(-A)}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}destroy(A="Room destroyed"){this.state.active=!1,y.info("Room destroyed",{name:this.name,id:this.id,reason:A,memberCount:this.members.size}),this._emit(q.ROOM_DESTROYED,{room:this.name,reason:A,timestamp:Date.now()}),this.members.clear(),this.messageHistory=[],this.handlers={}}_emit(A,I,O=[]){(this.handlers[A]||[]).forEach(E=>{try{E(I,O)}catch(K){y.error(`Error in ${A} handler:`,K)}})}},QA=class{constructor(A={}){this.options=A,this.rooms=new Map,this.roomIds=new Map,this.userRooms=new Map,y.info("RoomManager created")}createRoom(A,I={}){if(this.rooms.has(A))throw new Error(`Room "${A}" already exists`);let O=new fA(A,{...this.options,...I});return this.rooms.set(A,O),this.roomIds.set(O.id,A),y.info("Room created via manager",{name:A,id:O.id}),O}getOrCreateRoom(A,I={}){return this.rooms.has(A)?this.rooms.get(A):this.createRoom(A,I)}getRoom(A){return this.rooms.get(A)}getRoomById(A){let I=this.roomIds.get(A);return I?this.rooms.get(I):void 0}removeRoom(A,I="Room removed"){let O=this.rooms.get(A);O&&(O.getMembers().forEach(U=>{let E=this.userRooms.get(U.userId);E&&(E.delete(A),E.size===0&&this.userRooms.delete(U.userId))}),O.destroy(I),this.rooms.delete(A),this.roomIds.delete(O.id),y.info("Room removed",{name:A}))}addUserToRoom(A,I,O={}){let U=this.rooms.get(I);if(!U)return y.warn("Room not found",{roomName:I}),!1;let E=U.addMember(A,O);return E&&(this.userRooms.has(A)||this.userRooms.set(A,new Set),this.userRooms.get(A).add(I)),E}removeUserFromRoom(A,I,O="left"){let U=this.rooms.get(I);if(U){U.removeMember(A,O);let E=this.userRooms.get(A);E&&(E.delete(I),E.size===0&&this.userRooms.delete(A))}}removeUserFromAllRooms(A,I="disconnected"){let O=this.userRooms.get(A);O&&O.forEach(U=>{this.removeUserFromRoom(A,U,I)})}getUserRooms(A){let I=this.userRooms.get(A);return I?Array.from(I):[]}listRooms(A={}){let I=Array.from(this.rooms.values());return A.visibility&&(I=I.filter(O=>O.options.visibility===A.visibility)),A.hasMember&&(I=I.filter(O=>O.hasMember(A.hasMember))),A.minMembers&&(I=I.filter(O=>O.getMemberCount()>=A.minMembers)),I.map(O=>O.getInfo())}broadcastToRooms(A,I,O){A.forEach(U=>{let E=this.rooms.get(U);E&&E.broadcast(I,O)})}getStats(){let A={};for(let[I,O]of this.rooms)A[I]={memberCount:O.getMemberCount(),messageCount:O.state.messageCount,type:O.options.type};return{totalRooms:this.rooms.size,totalUsersInRooms:this.userRooms.size,rooms:A}}destroy(){for(let A of this.rooms.values())A.destroy("Manager destroyed");this.rooms.clear(),this.roomIds.clear(),this.userRooms.clear(),y.info("RoomManager destroyed")}};function UI(N={}){return new QA(N)}function EI(N,A={}){return new fA(N,A)}var F=S("presence"),d={ONLINE:"online",AWAY:"away",BUSY:"busy",OFFLINE:"offline",CONNECTING:"connecting",RECONNECTING:"reconnecting"},KI={TYPING:"typing",TYPING_STOPPED:"typing_stopped",VIEWING:"viewing",EDITING:"editing",IDLE:"idle"},o={STATE_CHANGED:"state_changed",ACTIVITY_UPDATED:"activity_updated",USER_ONLINE:"user_online",USER_OFFLINE:"user_offline",TYPING_STARTED:"typing_started",TYPING_STOPPED:"typing_stopped",SUBSCRIBED:"subscribed",UNSUBSCRIBED:"unsubscribed",ERROR:"error"},q1={heartbeatInterval:3e4,offlineTimeout:7e4,idleTimeout:3e5,broadcastChanges:!0,trackTyping:!0,typingTimeout:3e3,maxSubscribers:1e3,persistHistory:!1,maxHistory:100},z1=class{constructor(A,I={}){this.userId=A,this.state=d.CONNECTING,this.previousState=null,this.metadata={name:I.name||A,avatar:I.avatar||null,email:I.email||null,...I.metadata},this.lastSeen=Date.now(),this.lastActivity=Date.now(),this.lastStateChange=Date.now(),this.currentActivity=null,this.typingIn=new Set,this.typingTimeout=null,this.lastHeartbeat=Date.now(),this.heartbeatTimer=null,this.subscribers=new Set,this.history=[],this.status=I.status||null,this.statusMessage=I.statusMessage||"",F.debug("UserPresence created",{userId:A})}updateState(A,I=null){if(this.state===A)return null;this.previousState=this.state,this.state=A,this.lastStateChange=Date.now(),A===d.ONLINE&&(this.lastHeartbeat=Date.now());let O={userId:this.userId,from:this.previousState,to:this.state,timestamp:this.lastStateChange,reason:I};return this._addToHistory("state_change",O),F.debug("Presence state changed",O),O}updateActivity(A,I={}){this.lastActivity=Date.now(),this.currentActivity={type:A,data:I,timestamp:this.lastActivity},this.state===d.AWAY&&this.updateState(d.ONLINE,"activity"),F.debug("Activity updated",{userId:this.userId,activity:A})}startTyping(A){return this.typingIn.has(A)?!1:(this.typingIn.add(A),this.typingTimeout&&(clearTimeout(this.typingTimeout),this.typingTimeout=null),F.debug("Started typing",{userId:this.userId,room:A}),!0)}stopTyping(A){return this.typingIn.has(A)?(this.typingIn.delete(A),F.debug("Stopped typing",{userId:this.userId,room:A}),!0):!1}isTyping(A){return this.typingIn.has(A)}getTypingRooms(){return Array.from(this.typingIn)}heartbeat(){this.lastHeartbeat=Date.now(),this.lastSeen=this.lastHeartbeat}isHeartbeatStale(A){return Date.now()-this.lastHeartbeat>A}addSubscriber(A){this.subscribers.add(A)}removeSubscriber(A){this.subscribers.delete(A)}getSubscribers(){return Array.from(this.subscribers)}getInfo(){return{userId:this.userId,state:this.state,previousState:this.previousState,metadata:this.metadata,lastSeen:this.lastSeen,lastActivity:this.lastActivity,lastStateChange:this.lastStateChange,currentActivity:this.currentActivity,typingIn:this.getTypingRooms(),status:this.status,statusMessage:this.statusMessage,subscribers:this.subscribers.size}}_addToHistory(A,I){let O={type:A,data:I,timestamp:Date.now()};this.history.push(O),this.history.length>q1.maxHistory&&(this.history=this.history.slice(-q1.maxHistory))}},XA=class{constructor(A={}){this.options={...q1,...A},this.users=new Map,this.roomPresence=new Map,this.userSubscriptions=new Map,this.heartbeatInterval=null,this._startHeartbeatCheck(),this.handlers={[o.STATE_CHANGED]:[],[o.ACTIVITY_UPDATED]:[],[o.USER_ONLINE]:[],[o.USER_OFFLINE]:[],[o.TYPING_STARTED]:[],[o.TYPING_STOPPED]:[],[o.SUBSCRIBED]:[],[o.UNSUBSCRIBED]:[],[o.ERROR]:[]},this.stats={totalUsers:0,onlineUsers:0,awayUsers:0,busyUsers:0,totalSubscriptions:0,typingEvents:0,stateChanges:0},F.info("PresenceManager created",this.options)}registerUser(A,I={}){if(this.users.has(A))return this.users.get(A);let O=new z1(A,I);return this.users.set(A,O),this.stats.totalUsers=this.users.size,F.debug("User registered",{userId:A}),O}unregisterUser(A,I="user_left"){if(this.users.get(A)){this.updateUserState(A,d.OFFLINE,I);for(let[U,E]of this.roomPresence)E.has(A)&&E.delete(A);this.userSubscriptions.delete(A),this.users.delete(A),this.stats.totalUsers=this.users.size,F.debug("User unregistered",{userId:A,reason:I})}}updateUserState(A,I,O=null){let U=this.users.get(A);if(!U)return F.warn("User not found",{userId:A}),!1;let E=U.updateState(I,O);return E&&(this.stats.stateChanges++,I===d.ONLINE?(this.stats.onlineUsers++,this._emit(o.USER_ONLINE,{userId:A,metadata:U.metadata,timestamp:E.timestamp})):I===d.OFFLINE&&(this.stats.onlineUsers=Math.max(0,this.stats.onlineUsers-1),this._emit(o.USER_OFFLINE,{userId:A,timestamp:E.timestamp})),this.options.broadcastChanges&&this._broadcastToSubscribers(A,o.STATE_CHANGED,E),this._emit(o.STATE_CHANGED,E)),!0}recordActivity(A,I,O={}){let U=this.users.get(A);U&&(U.updateActivity(I,O),this._emit(o.ACTIVITY_UPDATED,{userId:A,activity:I,data:O,timestamp:Date.now()}))}startTyping(A,I){let O=this.users.get(A);!O||!this.options.trackTyping||O.startTyping(I)&&(this.stats.typingEvents++,this._broadcastToRoom(I,o.TYPING_STARTED,{userId:A,room:I,timestamp:Date.now()}),this._emit(o.TYPING_STARTED,{userId:A,room:I,timestamp:Date.now()}),setTimeout(()=>{this.stopTyping(A,I,!0)},this.options.typingTimeout))}stopTyping(A,I,O=!1){let U=this.users.get(A);U&&U.stopTyping(I)&&(this._broadcastToRoom(I,o.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}),this._emit(o.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}))}userJoinedRoom(A,I){this.roomPresence.has(I)||this.roomPresence.set(I,new Set),this.roomPresence.get(I).add(A),F.debug("User joined room presence",{userId:A,room:I})}userLeftRoom(A,I){let O=this.roomPresence.get(I);O&&(O.delete(A),this.stopTyping(A,I),O.size===0&&this.roomPresence.delete(I))}subscribe(A,I){let O=this.users.get(I);return O?O.getSubscribers().length>=this.options.maxSubscribers?(this._emit(o.ERROR,{code:"max_subscribers",message:"User has reached maximum subscribers",userId:I}),!1):(O.addSubscriber(A),this.userSubscriptions.has(A)||this.userSubscriptions.set(A,new Set),this.userSubscriptions.get(A).add(I),this.stats.totalSubscriptions++,this._emit(o.SUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()}),!0):(F.warn("Cannot subscribe to non-existent user",{targetUserId:I}),!1)}unsubscribe(A,I){let O=this.users.get(I);O&&O.removeSubscriber(A);let U=this.userSubscriptions.get(A);U&&(U.delete(I),U.size===0&&this.userSubscriptions.delete(A)),this.stats.totalSubscriptions=Math.max(0,this.stats.totalSubscriptions-1),this._emit(o.UNSUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()})}getUserPresence(A){let I=this.users.get(A);return I?I.getInfo():null}getRoomUsers(A,I=!0){let O=this.roomPresence.get(A)||new Set;return I?Array.from(O).map(U=>this.getUserPresence(U)).filter(Boolean):Array.from(O)}getTypingUsers(A){var O;let I=[];for(let[U,E]of this.users)E.isTyping(A)&&I.push({userId:U,metadata:E.metadata,startedAt:(O=E.currentActivity)==null?void 0:O.timestamp});return I}heartbeat(A){let I=this.users.get(A);I&&(I.heartbeat(),I.state===d.OFFLINE&&this.updateUserState(A,d.ONLINE,"heartbeat"))}getStats(){let A=0,I=0,O=0,U=0;for(let E of this.users.values())switch(E.state){case d.ONLINE:A++;break;case d.AWAY:I++;break;case d.BUSY:O++;break;case d.OFFLINE:U++;break}return{...this.stats,online:A,away:I,busy:O,offline:U,totalRooms:this.roomPresence.size,activeSubscriptions:this.userSubscriptions.size}}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}_startHeartbeatCheck(){this.heartbeatInterval=setInterval(()=>{this._checkHeartbeats()},this.options.heartbeatInterval)}_checkHeartbeats(){let A=Date.now();for(let[I,O]of this.users)O.state!==d.OFFLINE&&O.isHeartbeatStale(this.options.offlineTimeout)?(F.debug("Heartbeat stale, marking offline",{userId:I}),this.updateUserState(I,d.OFFLINE,"heartbeat_timeout")):O.state===d.ONLINE&&A-O.lastActivity>this.options.idleTimeout&&this.updateUserState(I,d.AWAY,"idle")}_broadcastToSubscribers(A,I,O){let U=this.users.get(A);if(!U)return;U.getSubscribers().forEach(K=>{this._emit(I,{...O,for:K})})}_broadcastToRoom(A,I,O){(this.roomPresence.get(A)||new Set).forEach(E=>{this._emit(I,{...O,for:E})})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){F.error(`Error in ${A} handler:`,E)}})}destroy(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.users.clear(),this.roomPresence.clear(),this.userSubscriptions.clear(),this.handlers={},F.info("PresenceManager destroyed")}};function BI(N={}){return new XA(N)}function RI(N,A,I){let O=null,U=!1;return{start(){U||(N.startTyping(A,I),U=!0),O&&clearTimeout(O),O=setTimeout(()=>{this.stop()},3e3)},stop(){U&&(N.stopTyping(A,I),U=!1),O&&(clearTimeout(O),O=null)},isTyping(){return U}}}var z=S("ack"),m={PENDING:"pending",ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",FAILED:"failed",CANCELLED:"cancelled"},lA={ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",RETRY:"retry",FAILED:"failed",CANCELLED:"cancelled",LATENCY_UPDATED:"latency_updated"},_4={timeout:1e4,maxRetries:3,retryBaseDelay:1e3,retryMaxDelay:3e4,exponentialBackoff:!0,cleanupInterval:6e4,maxAckAge:3e5,trackLatency:!0},$1=class{constructor(A,I){this.messageId=A,this.state=m.PENDING,this.sentAt=Date.now(),this.lastAttempt=this.sentAt,this.attempts=0,this.timeout=I.timeout,this.maxRetries=I.maxRetries,this.sendCallback=I.sendCallback,this.metadata=I.metadata||{},this.ackReceivedAt=null,this.deferred=nA(),this._setTimeout(),z.debug("Ack entry created",{messageId:A,timeout:this.timeout,maxRetries:this.maxRetries})}_setTimeout(){this.timeoutId=setTimeout(()=>{this._handleTimeout()},this.timeout)}_handleTimeout(){this.attempts++,this.attempts>=this.maxRetries?(this.state=m.FAILED,this.deferred.reject(new Error(`Max retries (${this.maxRetries}) exceeded for message ${this.messageId}`)),z.warn("Message failed permanently",{messageId:this.messageId,attempts:this.attempts})):(this.state=m.TIMEOUT,this._scheduleRetry())}_scheduleRetry(){let A=iA(this.attempts-1,{baseDelay:this.metadata.retryBaseDelay||1e3,maxDelay:this.metadata.retryMaxDelay||3e4,jitter:!0});z.debug("Scheduling retry",{messageId:this.messageId,attempt:this.attempts,delay:A}),this.retryTimeout=setTimeout(()=>{this.lastAttempt=Date.now(),this.sendCallback(this.messageId),this._setTimeout()},A)}acknowledge(A){if(this.state===m.PENDING||this.state===m.TIMEOUT){this.state=m.ACKNOWLEDGED,this.ackReceivedAt=Date.now(),this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout);let I=this.ackReceivedAt-this.sentAt;this.deferred.resolve({messageId:this.messageId,data:A,latency:I,attempts:this.attempts+1}),z.debug("Message acknowledged",{messageId:this.messageId,latency:I,attempts:this.attempts+1})}}cancel(A="Cancelled"){this.state=m.CANCELLED,this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout),this.deferred.reject(new Error(A)),z.debug("Ack cancelled",{messageId:this.messageId,reason:A})}getStats(){return{messageId:this.messageId,state:this.state,sentAt:this.sentAt,lastAttempt:this.lastAttempt,attempts:this.attempts,ackReceivedAt:this.ackReceivedAt,latency:this.ackReceivedAt?this.ackReceivedAt-this.sentAt:null,metadata:this.metadata}}isExpired(A){return this.state===m.ACKNOWLEDGED?Date.now()-this.ackReceivedAt>A:this.state===m.FAILED||this.state===m.CANCELLED?Date.now()-this.lastAttempt>A:!1}},wA=class{constructor(A={}){this.options={..._4,...A},this.pending=new Map,this.completed=new Map,this.listeners=new Map,this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],this._startCleanup(),z.info("AckManager created",this.options)}track(A,I,O={}){if(this.pending.has(A))return z.warn("Message already being tracked",{messageId:A}),this.pending.get(A).deferred.promise;let U={timeout:O.timeout||this.options.timeout,maxRetries:O.maxRetries||this.options.maxRetries,retryBaseDelay:O.retryBaseDelay||this.options.retryBaseDelay,retryMaxDelay:O.retryMaxDelay||this.options.retryMaxDelay,sendCallback:I,metadata:O.metadata},E=new $1(A,U);this.pending.set(A,E),this.stats.totalTracked++;try{I(A)}catch(K){z.error("Initial send failed:",K),E.cancel(`Send failed: ${K.message}`)}return E.deferred.promise.then(K=>{this._handleAcknowledgement(A,K)}).catch(K=>{this._handleFailure(A,K)}),E.deferred.promise}acknowledge(A,I=null){let O=this.pending.get(A);if(!O){z.debug("Ack for untracked message (maybe already completed)",{messageId:A});return}O.acknowledge(I)}cancel(A,I="Cancelled"){let O=this.pending.get(A);O&&(O.cancel(I),this.pending.delete(A),this.stats.cancelled++)}isPending(A){return this.pending.has(A)}getStatus(A){let I=this.pending.get(A)||this.completed.get(A);return I?I.getStats():null}waitForAll(A,I=3e4){let O=A.map(U=>{let E=this.pending.get(U);return E?E.deferred.promise:Promise.reject(new Error(`Message ${U} not tracked`))});return Promise.all(O)}waitForAny(A){let I=A.map(O=>{let U=this.pending.get(O);return U?U.deferred.promise:Promise.reject(new Error(`Message ${O} not tracked`))});return Promise.race(I)}getPending(){return Array.from(this.pending.values()).map(A=>A.getStats())}getCompleted(){return Array.from(this.completed.values()).map(A=>A.getStats())}getStats(){let A=this.stats.acknowledged>0?this.stats.totalLatency/this.stats.acknowledged:0;return{...this.stats,avgLatency:A,pendingCount:this.pending.size,completedCount:this.completed.size,minLatency:this.stats.minLatency===1/0?0:this.stats.minLatency,maxLatency:this.stats.maxLatency,latencyHistory:this.latencyHistory.slice(-10)}}reset(){this.pending.forEach((A,I)=>{A.cancel("Manager reset")}),this.pending.clear(),this.completed.clear(),this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],z.info("AckManager reset")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_handleAcknowledgement(A,I){let O=this.pending.get(A);O&&(this.stats.acknowledged++,I.latency&&(this.stats.totalLatency+=I.latency,this.stats.minLatency=Math.min(this.stats.minLatency,I.latency),this.stats.maxLatency=Math.max(this.stats.maxLatency,I.latency),this.options.trackLatency&&(this.latencyHistory.push({messageId:A,latency:I.latency,timestamp:Date.now()}),this.latencyHistory.length>100&&this.latencyHistory.shift(),this._emit(lA.LATENCY_UPDATED,{latency:I.latency,avgLatency:this.stats.totalLatency/this.stats.acknowledged}))),this.pending.delete(A),this.completed.set(A,O),this._emit(lA.ACKNOWLEDGED,{messageId:A,attempts:I.attempts,latency:I.latency}))}_handleFailure(A,I){let O=this.pending.get(A);O&&(O.state===m.FAILED?(this.stats.failed++,this._emit(lA.FAILED,{messageId:A,error:I.message})):O.state===m.TIMEOUT?(this.stats.timedOut++,this.stats.retries+=O.attempts,this._emit(lA.TIMEOUT,{messageId:A,attempt:O.attempts})):O.state===m.CANCELLED&&(this.stats.cancelled++,this._emit(lA.CANCELLED,{messageId:A,reason:I.message})),(O.state===m.FAILED||O.state===m.CANCELLED)&&(this.pending.delete(A),this.completed.set(A,O)))}_startCleanup(){this.cleanupInterval=setInterval(()=>{this._cleanup()},this.options.cleanupInterval)}_cleanup(){let A=0;for(let[I,O]of this.completed)O.isExpired(this.options.maxAckAge)&&(this.completed.delete(I),A++);A>0&&z.debug("Cleaned up old ack entries",{cleaned:A})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){z.error(`Error in ${A} listener:`,E)}})}destroy(){this.cleanupInterval&&clearInterval(this.cleanupInterval),this.reset(),this.listeners.clear(),z.info("AckManager destroyed")}};function MI(N={}){return new wA(N)}function LI(N,A,I={}){return new wA(I).track(N,A,I)}var h=S("queue"),X={PENDING:"pending",PROCESSING:"processing",SENT:"sent",FAILED:"failed",DISCARDED:"discarded"},GA={ITEM_ADDED:"item_added",ITEM_REMOVED:"item_removed",ITEM_STATE_CHANGED:"item_state_changed",PROCESSING_STARTED:"processing_started",PROCESSING_STOPPED:"processing_stopped",QUEUE_FULL:"queue_full",QUEUE_EMPTIED:"queue_emptied"},RA={CRITICAL:0,HIGH:1,NORMAL:2,LOW:3},j1={maxSize:1e3,maxAge:10080*60*1e3,autoProcess:!0,batchSize:10,batchDelay:100,maxRetries:5,preserveOrder:!0,dropOldestWhenFull:!0},Q1=class N{constructor(A,I={}){this.id=I.id||V("q"),this.data=A,this.priority=I.priority||RA.NORMAL,this.state=X.PENDING,this.createdAt=Date.now(),this.updatedAt=this.createdAt,this.retries=I.retries||0,this.maxRetries=I.maxRetries||j1.maxRetries,this.ttl=I.ttl||j1.maxAge,this.metadata=I.metadata||{},this.error=null,this.size=M1(A),this.sequence=Date.now()+Math.random(),h.debug("Queue item created",{id:this.id,priority:this.priority,size:this.size})}setState(A,I=null){let O=this.state;return this.state=A,this.updatedAt=Date.now(),I&&(this.error=I),h.debug("Item state changed",{id:this.id,from:O,to:A,retries:this.retries}),{oldState:O,newState:A}}incrementRetry(){return this.retries++,this.updatedAt=Date.now(),this.retries}isExpired(){return L1(this.createdAt,this.ttl)}hasExceededRetries(){return this.retries>=this.maxRetries}getAge(){return Date.now()-this.createdAt}toJSON(){return{id:this.id,data:this.data,priority:this.priority,state:this.state,createdAt:this.createdAt,updatedAt:this.updatedAt,retries:this.retries,maxRetries:this.maxRetries,ttl:this.ttl,metadata:this.metadata,error:this.error,size:this.size,sequence:this.sequence}}static fromJSON(A){let I=new N(A.data,{id:A.id,priority:A.priority,retries:A.retries,maxRetries:A.maxRetries,ttl:A.ttl,metadata:A.metadata});return I.state=A.state,I.createdAt=A.createdAt,I.updatedAt=A.updatedAt,I.error=A.error,I.sequence=A.sequence,I}},A1=class{constructor(A={}){this.options={...j1,...A},this.items=new Map,this.pendingIds=[],this.priorityBuckets={[RA.CRITICAL]:new Set,[RA.HIGH]:new Set,[RA.NORMAL]:new Set,[RA.LOW]:new Set},this.isProcessing=!1,this.processingPromise=null,this.processor=null,this.stats={totalAdded:0,totalProcessed:0,totalFailed:0,totalDiscarded:0,totalExpired:0,currentSize:0,peakSize:0,averageProcessTime:0},this.listeners=new Map,this.processingTimes=[],h.info("QueueManager created",this.options)}add(A,I={}){if(this.items.size>=this.options.maxSize)if(this.options.dropOldestWhenFull)this._dropOldest();else throw h.warn("Queue full, rejecting new item"),this._emit(GA.QUEUE_FULL,{size:this.items.size}),new Error("Queue is full");let O=new Q1(A,{priority:I.priority,ttl:I.ttl,metadata:I.metadata,maxRetries:this.options.maxRetries});return this.items.set(O.id,O),this.pendingIds.push(O.id),this.priorityBuckets[O.priority].add(O.id),this.stats.totalAdded++,this.stats.currentSize=this.items.size,this.stats.peakSize=Math.max(this.stats.peakSize,this.items.size),h.debug("Item added to queue",{id:O.id,priority:O.priority,queueSize:this.items.size}),this._emit(GA.ITEM_ADDED,{id:O.id,priority:O.priority,queueSize:this.items.size}),this.options.autoProcess&&this.processor&&!this.isProcessing&&this.process(),O.id}addBatch(A){return A.map(I=>Array.isArray(I)?this.add(I[0],I[1]):this.add(I))}remove(A){let I=this.items.get(A);if(!I)return!1;this.items.delete(A);let O=this.pendingIds.indexOf(A);return O!==-1&&this.pendingIds.splice(O,1),this.priorityBuckets[I.priority].delete(A),this.stats.currentSize=this.items.size,h.debug("Item removed from queue",{id:A}),this._emit(GA.ITEM_REMOVED,{id:A,priority:I.priority,queueSize:this.items.size}),!0}get(A){let I=this.items.get(A);return I?this._toPublicItem(I):null}getAll(A={}){let I=Array.from(this.items.values());return A.state&&(I=I.filter(O=>O.state===A.state)),A.priority!==void 0&&(I=I.filter(O=>O.priority===A.priority)),I.sort((O,U)=>O.priority!==U.priority?O.priority-U.priority:O.sequence-U.sequence),I.map(O=>this._toPublicItem(O))}size(){return this.items.size}isEmpty(){return this.items.size===0}isFull(){return this.items.size>=this.options.maxSize}setProcessor(A){if(typeof A!="function")throw new TypeError("Processor must be a function");this.processor=A}async process(){if(!this.processor){h.warn("No processor set, cannot process queue");return}if(this.isProcessing)return this.processingPromise;if(this.isEmpty()){h.debug("Queue empty, nothing to process");return}this.isProcessing=!0,this._emit(GA.PROCESSING_STARTED,{size:this.items.size}),h.info("Started processing queue",{size:this.items.size}),this.processingPromise=this._processQueue();try{await this.processingPromise}finally{this.isProcessing=!1,this.processingPromise=null,this._emit(GA.PROCESSING_STOPPED,{remaining:this.items.size}),this.isEmpty()&&this._emit(GA.QUEUE_EMPTIED)}}stopProcessing(){this.isProcessing=!1,h.info("Processing stopped")}clear(){this.items.clear(),this.pendingIds=[],Object.keys(this.priorityBuckets).forEach(A=>{this.priorityBuckets[A].clear()}),this.stats.currentSize=0,h.info("Queue cleared"),this._emit(GA.QUEUE_EMPTIED)}retryFailed(A){let I=0;for(let O of this.items.values())O.state===X.FAILED&&(O.setState(X.PENDING),O.retries=0,I++);h.info(`Retrying ${I} failed items`)}getStats(){let A={},I={};for(let O of this.items.values())A[O.state]=(A[O.state]||0)+1,I[O.priority]=(I[O.priority]||0)+1;return{...this.stats,currentSize:this.items.size,stateCounts:A,priorityCounts:I,isProcessing:this.isProcessing,isEmpty:this.isEmpty(),isFull:this.isFull(),oldestItem:this._getOldestItemAge(),newestItem:this._getNewestItemAge()}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}async _processQueue(){let A=Date.now(),I=0,O=0;try{for(;this.isProcessing&&!this.isEmpty();){let U=this._getNextBatch();if(U.length===0)break;for(let E of U){if(!this.isProcessing)break;try{E.setState(X.PROCESSING),await this.processor(this._toPublicItem(E))?(this.remove(E.id),I++,this.stats.totalProcessed++,this._emit(GA.ITEM_STATE_CHANGED,{id:E.id,state:X.SENT})):(this._handleFailure(E),O++)}catch(K){h.error("Error processing item:",K),this._handleFailure(E,K.message),O++}}this.options.batchDelay>0&&!this.isEmpty()&&await new Promise(E=>setTimeout(E,this.options.batchDelay))}}finally{let U=Date.now()-A;this.processingTimes.push(U),this.processingTimes.length>10&&this.processingTimes.shift(),this.stats.averageProcessTime=this.processingTimes.reduce((E,K)=>E+K,0)/this.processingTimes.length,h.info("Queue processing complete",{processed:I,failed:O,remaining:this.items.size,time:U})}}_getNextBatch(){let A=[],I=this.options.batchSize,O=[RA.CRITICAL,RA.HIGH,RA.NORMAL,RA.LOW];for(let U of O){if(A.length>=I)break;let E=this.priorityBuckets[U],K=I-A.length,B=Array.from(E).map(R=>this.items.get(R)).filter(R=>R&&R.state===X.PENDING).sort((R,M)=>R.sequence-M.sequence).slice(0,K);A.push(...B)}return A}_handleFailure(A,I=null){A.incrementRetry(),A.hasExceededRetries()?(A.setState(X.DISCARDED,I),this.remove(A.id),this.stats.totalDiscarded++,h.warn("Item discarded (max retries)",{id:A.id,retries:A.retries})):(A.setState(X.FAILED,I),this.stats.totalFailed++,h.debug("Item failed, will retry",{id:A.id,retries:A.retries}))}_dropOldest(){if(this.pendingIds.length===0)return;let A=this.pendingIds[0],I=this.items.get(A);I&&(I.setState(X.DISCARDED,"Queue full - dropped"),this.remove(A),this.stats.totalDiscarded++,h.warn("Dropped oldest item (queue full)",{id:A,age:I.getAge()}))}_removeExpired(){let A=0;for(let[I,O]of this.items)O.isExpired()&&(O.setState(X.DISCARDED,"Expired"),this.remove(I),A++,this.stats.totalExpired++);A>0&&h.info(`Removed ${A} expired items`)}_getOldestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[0],I=this.items.get(A);return I?I.getAge():null}_getNewestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[this.pendingIds.length-1],I=this.items.get(A);return I?I.getAge():null}_toPublicItem(A){return{id:A.id,data:A.data,priority:A.priority,state:A.state,createdAt:A.createdAt,updatedAt:A.updatedAt,retries:A.retries,maxRetries:A.maxRetries,metadata:A.metadata,error:A.error,size:A.size}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){h.error(`Error in ${A} listener:`,E)}})}destroy(){this.stopProcessing(),this.clear(),this.listeners.clear(),this.processor=null,h.info("QueueManager destroyed")}};function S1(N={}){return new A1(N)}var i=S("storage"),AA={INITIALIZED:"initialized",ITEM_STORED:"item_stored",ITEM_RETRIEVED:"item_retrieved",ITEM_DELETED:"item_deleted",CLEARED:"cleared",ERROR:"error",STORAGE_FULL:"storage_full"},n={INDEXED_DB:"indexeddb",LOCAL_STORAGE:"localstorage",MEMORY:"memory"},k4={dbName:"websocket_queue",storeName:"messages",dbVersion:1,maxItems:1e4,maxSize:5*1024*1024,autoInit:!0,storageType:null},X1=class{constructor(A={}){this.options={...k4,...A},this.browser=p(),this.initialized=!1,this.initializing=!1,this.storageType=null,this.db=null,this.memoryStore=new Map,this.stats={itemsStored:0,itemsRetrieved:0,itemsDeleted:0,storageCleared:0,errors:0,estimatedSize:0},this.listeners=new Map,this._initPromise=null,this.options.autoInit&&this.init(),i.info("StorageManager created")}async init(){if(!this.initialized){if(this.initializing)return this._initPromise;this.initializing=!0,this._initPromise=this._initialize();try{await this._initPromise,this.initialized=!0,i.info("Storage initialized",{type:this.storageType}),this._emit(AA.INITIALIZED,{type:this.storageType})}catch(A){throw i.error("Storage initialization failed:",A),this._emit(AA.ERROR,{error:A.message}),A}finally{this.initializing=!1}}}async setItem(A,I){await this._ensureInitialized();try{let O=this._getItemSize(I);switch(this.stats.estimatedSize+O>this.options.maxSize&&(i.warn("Storage size limit approaching"),this._emit(AA.STORAGE_FULL,{size:this.stats.estimatedSize,max:this.options.maxSize})),this.storageType){case n.INDEXED_DB:await this._setItemIndexedDB(A,I);break;case n.LOCAL_STORAGE:this._setItemLocalStorage(A,I);break;case n.MEMORY:this._setItemMemory(A,I);break}this.stats.itemsStored++,this.stats.estimatedSize+=O,i.debug("Item stored",{key:A,size:O}),this._emit(AA.ITEM_STORED,{key:A,size:O})}catch(O){throw this.stats.errors++,i.error("Failed to store item:",O),this._emit(AA.ERROR,{key:A,error:O.message}),O}}async getItem(A){await this._ensureInitialized();try{let I=null;switch(this.storageType){case n.INDEXED_DB:I=await this._getItemIndexedDB(A);break;case n.LOCAL_STORAGE:I=this._getItemLocalStorage(A);break;case n.MEMORY:I=this._getItemMemory(A);break}return I!=null&&(this.stats.itemsRetrieved++,i.debug("Item retrieved",{key:A}),this._emit(AA.ITEM_RETRIEVED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to retrieve item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),null}}async removeItem(A){await this._ensureInitialized();try{let I=!1;switch(this.storageType){case n.INDEXED_DB:I=await this._removeItemIndexedDB(A);break;case n.LOCAL_STORAGE:I=this._removeItemLocalStorage(A);break;case n.MEMORY:I=this._removeItemMemory(A);break}return I&&(this.stats.itemsDeleted++,i.debug("Item removed",{key:A}),this._emit(AA.ITEM_DELETED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to remove item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),!1}}async getAll(){await this._ensureInitialized();try{let A=[];switch(this.storageType){case n.INDEXED_DB:A=await this._getAllIndexedDB();break;case n.LOCAL_STORAGE:A=this._getAllLocalStorage();break;case n.MEMORY:A=this._getAllMemory();break}return i.debug("Retrieved all items",{count:A.length}),A}catch(A){return this.stats.errors++,i.error("Failed to get all items:",A),this._emit(AA.ERROR,{error:A.message}),[]}}async clear(){await this._ensureInitialized();try{switch(this.storageType){case n.INDEXED_DB:await this._clearIndexedDB();break;case n.LOCAL_STORAGE:this._clearLocalStorage();break;case n.MEMORY:this._clearMemory();break}this.stats.storageCleared++,this.stats.estimatedSize=0,i.info("Storage cleared"),this._emit(AA.CLEARED)}catch(A){this.stats.errors++,i.error("Failed to clear storage:",A),this._emit(AA.ERROR,{error:A.message})}}async count(){await this._ensureInitialized();try{switch(this.storageType){case n.INDEXED_DB:return await this._countIndexedDB();case n.LOCAL_STORAGE:return this._countLocalStorage();case n.MEMORY:return this.memoryStore.size;default:return 0}}catch(A){return this.stats.errors++,i.error("Failed to count items:",A),0}}getStats(){return{...this.stats,storageType:this.storageType,initialized:this.initialized,maxItems:this.options.maxItems,maxSize:this.options.maxSize,usagePercent:this.stats.estimatedSize/this.options.maxSize*100}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}async _initialize(){switch(this.storageType=await this._detectStorageType(),i.info(`Using storage type: ${this.storageType}`),this.storageType){case n.INDEXED_DB:await this._initIndexedDB();break;case n.LOCAL_STORAGE:this._initLocalStorage();break;case n.MEMORY:this._initMemory();break}await this._updateStats()}async _detectStorageType(){if(this.options.storageType)return this.options.storageType;if(this.browser.hasIndexedDB)try{if(await this._testIndexedDB())return n.INDEXED_DB}catch(A){i.warn("IndexedDB test failed:",A)}if(this.browser.hasLocalStorage)try{return this._testLocalStorage(),n.LOCAL_STORAGE}catch(A){i.warn("localStorage test failed:",A)}return n.MEMORY}_testIndexedDB(){return new Promise(A=>{try{let I=indexedDB.open("__test__",1);I.onerror=()=>A(!1),I.onsuccess=()=>{I.result.close(),indexedDB.deleteDatabase("__test__"),A(!0)}}catch{A(!1)}})}_testLocalStorage(){let A="__test__";return localStorage.setItem(A,"test"),localStorage.removeItem(A),!0}_initIndexedDB(){return new Promise((A,I)=>{let O=indexedDB.open(this.options.dbName,this.options.dbVersion);O.onerror=U=>{I(new Error(`IndexedDB error: ${U.target.error}`))},O.onsuccess=U=>{this.db=U.target.result,this.db.onversionchange=()=>{this.db.close(),i.warn("Database upgraded elsewhere, reloading")},A()},O.onupgradeneeded=U=>{let E=U.target.result;if(!E.objectStoreNames.contains(this.options.storeName)){let K=E.createObjectStore(this.options.storeName,{keyPath:"id"});K.createIndex("timestamp","timestamp"),K.createIndex("priority","priority"),K.createIndex("state","state"),i.info("Created IndexedDB store")}}})}_initLocalStorage(){let A=localStorage.getItem(this._getStoreKey());if(A)try{let I=JSON.parse(A);Array.isArray(I)&&i.info(`Loaded ${I.length} items from localStorage`)}catch{i.warn("Corrupted localStorage data, clearing"),localStorage.removeItem(this._getStoreKey())}}_initMemory(){this.memoryStore.clear(),i.info("Using memory storage")}_getStoreKey(){return`${this.options.dbName}_${this.options.storeName}`}_getItemSize(A){try{let I=JSON.stringify(A);return new Blob([I]).size}catch{return 0}}async _ensureInitialized(){this.initialized||await this.init()}async _updateStats(){let A=await this.getAll();this.stats.estimatedSize=A.reduce((I,O)=>I+this._getItemSize(O),0)}async _setItemIndexedDB(A,I){return new Promise((O,U)=>{let K=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName),B={id:A,data:I,timestamp:Date.now()},R=K.put(B);R.onsuccess=()=>O(),R.onerror=()=>U(R.error)})}async _getItemIndexedDB(A){return new Promise((I,O)=>{let K=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).get(A);K.onsuccess=()=>{I(K.result?K.result.data:null)},K.onerror=()=>O(K.error)})}async _removeItemIndexedDB(A){return new Promise((I,O)=>{let K=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName).delete(A);K.onsuccess=()=>I(!0),K.onerror=()=>O(K.error)})}async _getAllIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).getAll();E.onsuccess=()=>{let K=E.result.map(B=>({key:B.id,...B.data}));A(K)},E.onerror=()=>I(E.error)})}async _clearIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName).clear();E.onsuccess=()=>A(),E.onerror=()=>I(E.error)})}async _countIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).count();E.onsuccess=()=>A(E.result),E.onerror=()=>I(E.error)})}_setItemLocalStorage(A,I){let O=this._getAllLocalStorage(),U=O.find(E=>E.key===A);U?(U.data=I,U.timestamp=Date.now()):O.push({key:A,data:I,timestamp:Date.now()}),localStorage.setItem(this._getStoreKey(),JSON.stringify(O))}_getItemLocalStorage(A){let O=this._getAllLocalStorage().find(U=>U.key===A);return O?O.data:null}_removeItemLocalStorage(A){let I=this._getAllLocalStorage(),O=I.filter(U=>U.key!==A);return localStorage.setItem(this._getStoreKey(),JSON.stringify(O)),I.length!==O.length}_getAllLocalStorage(){let A=localStorage.getItem(this._getStoreKey());if(!A)return[];try{return JSON.parse(A)}catch{return[]}}_clearLocalStorage(){localStorage.removeItem(this._getStoreKey())}_countLocalStorage(){return this._getAllLocalStorage().length}_setItemMemory(A,I){this.memoryStore.set(A,{data:I,timestamp:Date.now()})}_getItemMemory(A){let I=this.memoryStore.get(A);return I?I.data:null}_removeItemMemory(A){return this.memoryStore.delete(A)}_getAllMemory(){return Array.from(this.memoryStore.entries()).map(([A,I])=>({key:A,...I.data}))}_clearMemory(){this.memoryStore.clear()}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){i.error(`Error in ${A} listener:`,E)}})}destroy(){this.db&&(this.db.close(),this.db=null),this.memoryStore.clear(),this.listeners.clear(),this.initialized=!1,i.info("StorageManager destroyed")}};function A2(N={}){return new X1(N)}var x=S("retry"),IA={EXPONENTIAL:"exponential",LINEAR:"linear",FIXED:"fixed",FIBONACCI:"fibonacci",IMMEDIATE:"immediate"},CA={ALL:"all",NETWORK:"network",SERVER:"server",TIMEOUT:"timeout",CUSTOM:"custom"},TA={BEFORE_RETRY:"before_retry",AFTER_RETRY:"after_retry",MAX_RETRIES_REACHED:"max_retries_reached",CANCELLED:"cancelled",CIRCUIT_OPENED:"circuit_opened",CIRCUIT_CLOSED:"circuit_closed"},MA={CLOSED:"closed",OPEN:"open",HALF_OPEN:"half_open"},GI={maxAttempts:5,initialDelay:1e3,maxDelay:3e4,strategy:IA.EXPONENTIAL,factor:2,jitter:!0,retryCondition:CA.ALL,customCondition:null,circuitBreaker:{enabled:!0,failureThreshold:5,openTimeout:3e4,successThreshold:2},resetOnSuccess:!0},I2=class{constructor(A,I,O={}){this.operation=A,this.options=I,this.metadata=O,this.attempt=0,this.startTime=Date.now(),this.lastError=null,this.cancelled=!1,this.deferred=nA(),this.results=[],this.errors=[],x.debug("Retry context created",{maxAttempts:I.maxAttempts,strategy:I.strategy})}getNextDelay(){if(this.attempt===0)return 0;switch(this.options.strategy){case IA.EXPONENTIAL:return this._exponentialDelay();case IA.LINEAR:return this._linearDelay();case IA.FIBONACCI:return this._fibonacciDelay();case IA.FIXED:return this.options.initialDelay;case IA.IMMEDIATE:return 0;default:return this._exponentialDelay()}}_exponentialDelay(){return iA(this.attempt-1,{baseDelay:this.options.initialDelay,maxDelay:this.options.maxDelay,jitter:this.options.jitter})}_linearDelay(){let A=this.options.initialDelay*this.attempt;return this.options.jitter&&(A=A*(.8+.4*Math.random())),Math.min(A,this.options.maxDelay)}_fibonacciDelay(){let A=O=>O<=1?1:A(O-1)+A(O-2),I=this.options.initialDelay*A(this.attempt);return this.options.jitter&&(I=I*(.8+.4*Math.random())),Math.min(I,this.options.maxDelay)}shouldRetry(A){return this.attempt>=this.options.maxAttempts||this.cancelled?!1:this._checkCondition(A)}_checkCondition(A){switch(this.options.retryCondition){case CA.ALL:return!0;case CA.NETWORK:return this._isNetworkError(A);case CA.SERVER:return this._isServerError(A);case CA.TIMEOUT:return this._isTimeoutError(A);case CA.CUSTOM:return this.options.customCondition?this.options.customCondition(A):!0;default:return!0}}_isNetworkError(A){return["ECONNREFUSED","ECONNRESET","ENOTFOUND","ETIMEDOUT","NetworkError","network offline"].some(O=>{var U,E;return((U=A.message)==null?void 0:U.includes(O))||((E=A.code)==null?void 0:E.includes(O))})}_isServerError(A){return A.status>=500||A.statusCode>=500}_isTimeoutError(A){var I;return((I=A.message)==null?void 0:I.includes("timeout"))||A.code==="ETIMEDOUT"}recordResult(A){this.results.push({attempt:this.attempt,result:A,timestamp:Date.now()})}recordError(A){this.lastError=A,this.errors.push({attempt:this.attempt,error:A.message,timestamp:Date.now()})}getStats(){var A;return{attempt:this.attempt,startTime:this.startTime,elapsed:Date.now()-this.startTime,lastError:(A=this.lastError)==null?void 0:A.message,results:this.results,errors:this.errors,cancelled:this.cancelled}}},O2=class{constructor(A){this.options=A,this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,this.lastFailure=null,x.debug("Circuit breaker created",A)}isClosed(){return this.state===MA.CLOSED}isOpen(){return this.state===MA.OPEN}isHalfOpen(){return this.state===MA.HALF_OPEN}recordSuccess(){this.successCount++,this.failureCount=0,this.state===MA.HALF_OPEN&&this.successCount>=this.options.successThreshold&&this._close()}recordFailure(A){this.lastFailure=A,this.failureCount++,this.successCount=0,this.state===MA.CLOSED?this.failureCount>=this.options.failureThreshold&&this._open():this.state===MA.HALF_OPEN&&this._open()}checkHalfOpen(){return this.state===MA.OPEN&&this.openTime&&Date.now()-this.openTime>=this.options.openTimeout?(this._halfOpen(),!0):!1}_open(){this.state=MA.OPEN,this.openTime=Date.now(),this.successCount=0,x.warn("Circuit opened",{failures:this.failureCount,timeout:this.options.openTimeout})}_close(){this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,x.info("Circuit closed")}_halfOpen(){this.state=MA.HALF_OPEN,this.successCount=0,x.info("Circuit half-open, testing recovery")}getStats(){var A;return{state:this.state,failureCount:this.failureCount,successCount:this.successCount,openTime:this.openTime,lastFailure:(A=this.lastFailure)==null?void 0:A.message}}},aA=class{constructor(A={}){this.options=this._mergeOptions(A),this.circuitBreaker=this.options.circuitBreaker.enabled?new O2(this.options.circuitBreaker):null,this.contexts=new Map,this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},this.listeners=new Map,x.info("RetryManager created",{strategy:this.options.strategy,maxAttempts:this.options.maxAttempts})}async execute(A,I={},O={}){var K;if((K=this.circuitBreaker)!=null&&K.isOpen())if(this.circuitBreaker.checkHalfOpen())this._emit(TA.CIRCUIT_HALF_OPEN);else{let B=new Error("Circuit breaker is open");throw this._emit(TA.CIRCUIT_OPENED,{error:B}),B}let U=new I2(A,{...this.options,...I},O),E=Date.now()+Math.random().toString(36);this.contexts.set(E,U),this.stats.totalExecutions++;try{let B=await this._executeWithRetry(U);return this.circuitBreaker&&this.circuitBreaker.recordSuccess(),this.stats.successfulExecutions++,B}catch(B){throw this.circuitBreaker&&(this.circuitBreaker.recordFailure(B),this.circuitBreaker.isOpen()&&(this.stats.circuitOpens++,this._emit(TA.CIRCUIT_OPENED,{error:B}))),this.stats.failedExecutions++,B}finally{this.contexts.delete(E)}}async _executeWithRetry(A){for(;;){A.attempt++;try{x.debug(`Attempt ${A.attempt}`,A.metadata);let I=await A.operation();return A.recordResult(I),A.attempt>1&&x.info(`Succeeded after ${A.attempt} attempts`),this.options.resetOnSuccess,I}catch(I){if(A.recordError(I),x.debug(`Attempt ${A.attempt} failed:`,I.message),!A.shouldRetry(I))throw this._emit(TA.MAX_RETRIES_REACHED,{attempts:A.attempt,error:I.message}),I;let O=A.getNextDelay();x.debug(`Retrying in ${O}ms (attempt ${A.attempt}/${A.options.maxAttempts})`),this.stats.totalRetries++,this._emit(TA.BEFORE_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts,delay:O,error:I.message}),O>0&&await mA(O),this._emit(TA.AFTER_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts})}}}cancelAll(A="Cancelled by user"){this.contexts.forEach((I,O)=>{I.cancelled=!0,this._emit(TA.CANCELLED,{id:O,reason:A})}),this.contexts.clear(),x.info("All retries cancelled",{reason:A})}getStats(){var I;let A=((I=this.circuitBreaker)==null?void 0:I.getStats())||null;return{...this.stats,circuitBreaker:A,activeRetries:this.contexts.size,currentOptions:{...this.options}}}resetStats(){this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},x.info("Retry stats reset")}resetCircuitBreaker(){this.circuitBreaker&&(this.circuitBreaker._close(),this._emit(TA.CIRCUIT_CLOSED))}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_mergeOptions(A){let I={...GI,...A};return A.circuitBreaker&&(I.circuitBreaker={...GI.circuitBreaker,...A.circuitBreaker}),I}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){x.error(`Error in ${A} listener:`,E)}})}destroy(){this.cancelAll("Manager destroyed"),this.listeners.clear(),x.info("RetryManager destroyed")}};function t1(N={}){return new aA(N)}async function TI(N,A={}){return new aA({maxAttempts:2,...A}).execute(N)}async function WI(N,A=5){return new aA({maxAttempts:A,strategy:IA.EXPONENTIAL}).execute(N)}async function YI(N,A=1e3,I=5){return new aA({maxAttempts:I,strategy:IA.FIXED,initialDelay:A}).execute(N)}var a=S("recovery"),eA={IDLE:"idle",SCANNING:"scanning",RESTORING:"restoring",COMPLETED:"completed",FAILED:"failed"},WA={RECOVERY_STARTED:"recovery_started",RECOVERY_PROGRESS:"recovery_progress",RECOVERY_COMPLETED:"recovery_completed",RECOVERY_FAILED:"recovery_failed",STATE_SAVED:"state_saved",STATE_RESTORED:"state_restored",CHECKPOINT_CREATED:"checkpoint_created"},hA={FULL:"full",MINIMAL:"minimal",VERIFIED:"verified",CONNECTION_ONLY:"connection_only"},q4={strategy:hA.FULL,maxStateAge:10080*60*1e3,autoRecover:!0,enableCheckpoints:!0,checkpointInterval:300*1e3,maxCheckpoints:5,verifyWithServer:!0,recoveryTimeout:3e4,replayQueue:!0,restoreSubscriptions:!0,restorePresence:!0},N2=class N{constructor(A,I={}){this.id=V("ckpt"),this.timestamp=Date.now(),this.state=A,this.metadata=I,this.size=this._calculateSize()}_calculateSize(){try{return new Blob([JSON.stringify(this.state)]).size}catch{return 0}}isExpired(A){return Date.now()-this.timestamp>A}toJSON(){return{id:this.id,timestamp:this.timestamp,state:this.state,metadata:this.metadata,size:this.size}}static fromJSON(A){let I=new N(A.state,A.metadata);return I.id=A.id,I.timestamp=A.timestamp,I}},I1=class{constructor(A={}){this.options={...q4,...A},this.state=eA.IDLE,this.sessionId=this._generateSessionId(),this.currentState=null,this.storage=A2({dbName:"websocket_recovery",storeName:"state",autoInit:!0}),this.queue=S1({maxSize:1e3,autoProcess:!1}),this.retry=t1({maxAttempts:3,strategy:IA.EXPONENTIAL}),this.checkpoints=[],this.checkpointTimer=null,this.stats={recoveriesAttempted:0,recoveriesSuccessful:0,recoveriesFailed:0,statesSaved:0,statesRestored:0,checkpointsCreated:0,lastRecoveryTime:null,lastRecoveryDuration:null},this.listeners=new Map,this.options.enableCheckpoints&&this._startCheckpointTimer(),this.options.autoRecover&&setTimeout(()=>this.recover(),0),a.info("RecoveryManager created",{sessionId:this.sessionId,strategy:this.options.strategy})}async saveState(A,I={}){let O={sessionId:this.sessionId,timestamp:Date.now(),state:{...A,_version:1},metadata:{...I,strategy:this.options.strategy}};try{await this.storage.setItem("current_state",O),this.currentState=O,this.stats.statesSaved++,a.debug("State saved",{timestamp:O.timestamp,metadata:I}),this._emit(WA.STATE_SAVED,{timestamp:O.timestamp,metadata:I}),this.options.enableCheckpoints&&await this._createCheckpoint(A,I)}catch(U){throw a.error("Failed to save state:",U),U}}async recover(){if(this.state===eA.RECOVERING)return a.warn("Recovery already in progress"),null;this.state=eA.SCANNING,this.stats.recoveriesAttempted++,this._emit(WA.RECOVERY_STARTED,{sessionId:this.sessionId,strategy:this.options.strategy});let A=Date.now();try{let I=await this._findRecoverableState();if(!I)return a.info("No recoverable state found"),this.state=eA.IDLE,null;this.state=eA.RESTORING;let O;switch(this.options.strategy){case hA.FULL:O=await this._fullRecovery(I);break;case hA.MINIMAL:O=await this._minimalRecovery(I);break;case hA.VERIFIED:O=await this._verifiedRecovery(I);break;case hA.CONNECTION_ONLY:O=await this._connectionOnlyRecovery(I);break;default:O=await this._fullRecovery(I)}return this.options.verifyWithServer&&O&&(O=await this._verifyWithServer(O)),this.options.replayQueue&&O&&await this._replayQueue(),this.stats.recoveriesSuccessful++,this.stats.statesRestored++,this.stats.lastRecoveryTime=Date.now(),this.stats.lastRecoveryDuration=Date.now()-A,this.state=eA.COMPLETED,a.info("Recovery completed",{duration:this.stats.lastRecoveryDuration,hasState:!!O}),this._emit(WA.RECOVERY_COMPLETED,{duration:this.stats.lastRecoveryDuration,state:O}),O}catch(I){return this.state=eA.FAILED,this.stats.recoveriesFailed++,a.error("Recovery failed:",I),this._emit(WA.RECOVERY_FAILED,{error:I.message}),null}}async createCheckpoint(A,I={}){return this._createCheckpoint(A,I)}async listCheckpoints(){try{return await this.storage.getItem("checkpoints")||[]}catch{return[]}}async restoreFromCheckpoint(A){let O=(await this.listCheckpoints()).find(U=>U.id===A);return O?(a.info("Restoring from checkpoint",{id:A,timestamp:O.timestamp}),O.state):(a.warn("Checkpoint not found",{checkpointId:A}),null)}async clear(){await this.storage.clear(),this.checkpoints=[],this.currentState=null,a.info("Recovery state cleared")}getStats(){return{...this.stats,state:this.state,sessionId:this.sessionId,hasSavedState:!!this.currentState,checkpointCount:this.checkpoints.length,options:{...this.options}}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_generateSessionId(){let A=localStorage.getItem("websocket_session_id");if(A)return A;let I=V("sess");return localStorage.setItem("websocket_session_id",I),I}async _findRecoverableState(){try{let A=await this.storage.getItem("current_state");if(A&&!this._isStateExpired(A))return a.debug("Found current state",{age:Date.now()-A.timestamp}),{type:"current",state:A};let O=(await this.listCheckpoints()).filter(U=>!U.isExpired(this.options.maxStateAge));if(O.length>0){let U=O.sort((E,K)=>K.timestamp-E.timestamp)[0];return a.debug("Found checkpoint",{timestamp:U.timestamp}),{type:"checkpoint",state:U.state}}return null}catch(A){return a.error("Error finding recoverable state:",A),null}}_isStateExpired(A){return Date.now()-A.timestamp>this.options.maxStateAge}async _fullRecovery(A){let I=A.state;return a.info("Performing full recovery",{type:A.type,timestamp:I.timestamp}),this._emit(WA.RECOVERY_PROGRESS,{phase:"full",percent:50}),I.state}async _minimalRecovery(A){let I=A.state;a.info("Performing minimal recovery",{type:A.type});let O={},U=["userId","sessionToken","connectionId"];for(let E of U)I.state[E]&&(O[E]=I.state[E]);return this._emit(WA.RECOVERY_PROGRESS,{phase:"minimal",percent:75}),O}async _verifiedRecovery(A){let I=A.state;return a.info("Performing verified recovery"),I.state}async _connectionOnlyRecovery(A){let I=A.state;return a.info("Performing connection-only recovery"),{connectionId:I.state.connectionId,lastMessageId:I.state.lastMessageId}}async _verifyWithServer(A){return A}async _replayQueue(){let A=await this.storage.getItem("queue")||[];if(A.length!==0){a.info(`Replaying ${A.length} queued messages`);for(let I of A)await this.queue.add(I.data,{priority:I.priority,metadata:{recovered:!0}});this._emit(WA.RECOVERY_PROGRESS,{phase:"replay",count:A.length})}}async _createCheckpoint(A,I){try{let O=new N2(A,I),U=await this.storage.getItem("checkpoints")||[];U.push(O.toJSON()),U.sort((E,K)=>K.timestamp-E.timestamp),U.length>this.options.maxCheckpoints&&(U=U.slice(0,this.options.maxCheckpoints)),await this.storage.setItem("checkpoints",U),this.stats.checkpointsCreated++,a.debug("Checkpoint created",{id:O.id,size:O.size}),this._emit(WA.CHECKPOINT_CREATED,{id:O.id,timestamp:O.timestamp,size:O.size})}catch(O){a.error("Failed to create checkpoint:",O)}}_startCheckpointTimer(){this.checkpointTimer=setInterval(async()=>{this.currentState&&await this._createCheckpoint(this.currentState.state,this.currentState.metadata)},this.options.checkpointInterval)}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){a.error(`Error in ${A} listener:`,E)}})}destroy(){this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.storage.destroy(),this.queue.destroy(),this.listeners.clear(),a.info("RecoveryManager destroyed")}};function SI(N={}){return new I1(N)}function tI(N,A={}){let I=A2({dbName:"persistent_state",storeName:N,...A});return{async save(O){await I.setItem(N,{data:O,timestamp:Date.now()})},async load(){let O=await I.getItem(N);return(O==null?void 0:O.data)||null},async clear(){await I.removeItem(N)}}}var eI=z2;
1491
1491
  //# sourceMappingURL=js_aide.cjs.js.map