@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 K1=class{constructor(A,I="/"){this.validateRoutes(A,I),this.compiledRoutes=O
1487
1487
  <button class="confirm-btn">Confirm Location</button>
1488
1488
  </div>
1489
1489
  </div>
1490
- `,z3(),document.body.appendChild(N),F3(),N}function A4(N,A){if(!N){alert("please provide an `onConfirm` callback!");return}let I=X3();return I._callbacks={onConfirm:N,onCancel:A},Q3(I),I}var W1=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 lA={threshold:0,rootMargin:"0px",root:null,triggerOnce:!1},KA=new Map;function I4(N,A){return`${N?N.id||N.tagName+N.className:"viewport"}::${A}`}var Y1=class{constructor(A,I,O){this.onEnter=A,this.onExit=I,this.options=O,this.currentlyIntersecting=!1}};function O4(N,A){let I=I4(N,A);return KA.has(I)||KA.set(I,{observer:null,callbacks:new Map,root:N,rootMargin:A,thresholds:new Set([0])}),KA.get(I)}function N4(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 U4(N){let A=N4(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=>{E4(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 E4(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:lA.threshold,W=(P=G.triggerOnce)!=null?P:lA.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&&N2(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 O2(N,A={}){var R,M,L,G;let I=B4(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:lA.threshold,rootMargin:(M=A.rootMargin)!=null?M:lA.rootMargin,root:(L=A.root)!=null?L:lA.root,triggerOnce:(G=A.triggerOnce)!=null?G:lA.triggerOnce},K=O4(E.root,E.rootMargin),B=new Y1(O,U,E);return K.callbacks.has(I)||K.callbacks.set(I,new Set),K.callbacks.get(I).add(B),U4(K),K.observer.observe(I),()=>{N2(K,I,B)}}function K4(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=>O2(U,A));return()=>{O.forEach(U=>U())}}function N2(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 KA)if(E===N){KA.delete(U);break}}}function B4(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 U2(){KA.forEach(N=>{N.observer&&(N.observer.disconnect(),N.observer=null),N.callbacks.clear()}),KA.clear()}function R4(N){for(let A of KA.values())if(A.callbacks.has(N))return!0;return!1}function M4(){let N=0,A=0;return KA.forEach(I=>{N+=I.callbacks.size,I.callbacks.forEach(O=>{A+=O.size})}),{elements:N,callbacks:A,pools:KA.size}}typeof window<"u"&&window.addEventListener("beforeunload",()=>{U2()});var a={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4},E2={level:a.ERROR,timestamps:!0,colors:!0,output:null,namespaces:{}},gA={reset:"\x1B[0m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",namespace:"\x1B[35m"},S1=class N{constructor(A,I={}){if(typeof A!="string")throw new TypeError("Logger namespace must be a string");this.namespace=A,this.config={...E2,...I}}debug(...A){this._log(a.DEBUG,"DEBUG",...A)}info(...A){this._log(a.INFO,"INFO",...A)}warn(...A){this._log(a.WARN,"WARN",...A)}error(...A){this._log(a.ERROR,"ERROR",...A)}isDebugEnabled(){return this._shouldLog(a.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=gA[A.toLowerCase()]||gA.reset;O.push(`${U}[${A}]${gA.reset}`)}else O.push(`[${A}]`);return this.config.colors?O.push(`${gA.namespace}[${this.namespace}]${gA.reset}`):O.push(`[${this.namespace}]`),O.push(...I),O}_output(A,I){if(this.config.output){this.config.output(A,...I);return}A>=a.ERROR?console.error(...I):A>=a.WARN?console.warn(...I):console.log(...I)}},t1={...E2},$A=new Map;function S(N){if($A.has(N))return $A.get(N);let A=new S1(N,t1);return $A.set(N,A),A}function L4(N){if(typeof N.level=="string"){let A={debug:a.DEBUG,info:a.INFO,warn:a.WARN,error:a.ERROR,silent:a.SILENT};N.level=A[N.level.toLowerCase()]||a.INFO}N.namespaces&&Object.keys(N.namespaces).forEach(A=>{let I=N.namespaces[A];if(typeof I=="string"){let O={debug:a.DEBUG,info:a.INFO,warn:a.WARN,error:a.ERROR,silent:a.SILENT};N.namespaces[A]=O[I.toLowerCase()]||a.INFO}}),t1={...t1,...N},$A.clear()}var G4=S("browser"),D1=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,G4.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}},e1=null;function g(){return e1||(e1=new D1),e1}function T4(){return g().hasWebSocket}function W4(){return g().isMobile}function Y4(){if(!g().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 U6=g();function b(N=""){let A=Date.now().toString(36),I=Math.random().toString(36).substring(2,10),O=`${A}${I}`;return N?`${N}_${O}`:O}function S4(){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 wA(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 s1(N,A=null){if(typeof N!="string")return A;try{return JSON.parse(N)}catch{return A}}function r1(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 fA(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=>fA(A));if(N instanceof Object){let A={};return Object.keys(N).forEach(I=>{A[I]=fA(N[I])}),A}return N}function i1(N,A){let I=fA(N);return!A||typeof A!="object"||Object.keys(A).forEach(O=>{let U=A[O],E=I[O];U instanceof Array?I[O]=fA(U):U instanceof Object&&E instanceof Object?I[O]=i1(E,U):I[O]=fA(U)}),I}function oA(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 vA(N){return new Promise(A=>setTimeout(A,N))}function eA(){let N,A;return{promise:new Promise((O,U)=>{N=O,A=U}),resolve:N,reject:A}}function jA(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=r1(N);return A?new Blob([A]).size:0}return new Blob([String(N)]).size}function QA(N,A){return Date.now()>N+A}function K2(N,A){let I=N+A-Date.now();return Math.max(0,I)}function VA(N,A){return Object.values(A).includes(N)}function yA(N){return typeof N!="string"?!1:N==="/"?!0:/^\/[a-zA-Z0-9_-]+(\/[a-zA-Z0-9_-]+)*$/.test(N)}var TA=S("network"),Z={OFFLINE:"offline",ONLINE:"online",DEGRADED:"degraded",CHECKING:"checking"},q={UNKNOWN:"unknown",ETHERNET:"ethernet",WIFI:"wifi",CELLULAR:"cellular",NONE:"none"},H1=class{constructor(){this.browser=g(),this.listeners=new Map,this.status={state:Z.CHECKING,type:q.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,TA.info("Network monitor initialized",this.status)}),TA.debug("Network listeners initialized")}_startPeriodicChecks(){this._checkInterval=setInterval(()=>{this._checkStatus()},3e4)}_handleBrowserOnline(){TA.info("Browser reported online"),this._checkStatus(!0)}_handleBrowserOffline(){TA.warn("Browser reported offline"),this._updateStatus({state:Z.OFFLINE,type:q.NONE,lastChanged:Date.now()})}_handleConnectionChange(){TA.debug("Network connection changed"),this._checkStatus(!0)}async _checkStatus(A=!1){if(this._checking)return this.status;this._checking=!0,this._updateStatus({state:Z.CHECKING});try{if(!this._getBasicOnlineStatus()){this._updateStatus({state:Z.OFFLINE,type:q.NONE},A);return}let O=this._getNetworkInfo();if(!await this._verifyConnectivity()){this._updateStatus({state:Z.DEGRADED,type:(O==null?void 0:O.type)||q.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)||q.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){TA.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:q.WIFI,cellular:q.CELLULAR,ethernet:q.ETHERNET,none:q.NONE,unknown:q.UNKNOWN}[A]||q.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)?Z.DEGRADED:Z.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)&&(TA.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){TA.error(`Error in listener ${U}:`,E)}})}getStatus(){return{...this.status}}isOnline(){return this.status.state===Z.ONLINE||this.status.state===Z.DEGRADED}isFullyOnline(){return this.status.state===Z.ONLINE}isOffline(){return this.status.state===Z.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=eA();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===Z.ONLINE||E.state===Z.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(),TA.debug("Network monitor destroyed")}},n1=null;function BA(){return n1||(n1=new H1),n1}function o1(){return BA().isOnline()}function t4(N){return BA().onChange(N)}var G6=BA();var f=S("heartbeat"),RA={PING_SENT:"ping_sent",PONG_RECEIVED:"pong_received",MISSED:"missed",DEAD:"dead",LATENCY_UPDATED:"latency_updated"},v={STOPPED:"stopped",RUNNING:"running",WAITING:"waiting",FAILED:"failed"},C1=class{constructor(A={}){this.options={interval:3e4,timeout:1e4,maxMissed:2,adaptive:!0,...A},this.network=BA(),this.state=v.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!==v.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=v.RUNNING,this.missedCount=0,this._schedulePing(),f.info("Heartbeat started"),this._emit(RA.PING_SENT,{state:this.state})}stop(){this.state=v.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=v.RUNNING,f.debug("Pong received",{pingId:O,latency:this.latency,missed:this.missedCount}),this._emit(RA.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===v.RUNNING&&this.missedCount===0}isFailing(){return this.state===v.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===v.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(RA.PING_SENT,{pingId:I})}catch(O){f.error("Failed to send ping:",O),this._handlePongTimeout();return}this.state=v.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(RA.MISSED,{pingId:A,missed:this.missedCount,total:this.options.maxMissed}),this.pendingPings.delete(A),this.missedCount>=this.options.maxMissed){this._handleDeadConnection();return}this.state=v.RUNNING,this._schedulePing()}_handleDeadConnection(){this.state=v.FAILED,f.error("Heartbeat failed - connection appears dead",{missed:this.missedCount,lastPing:this.lastPingTime,lastPong:this.lastPongTime}),this._emit(RA.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(RA.LATENCY_UPDATED,{latency:this.latency,raw:A})}_onNetworkChange(A){A.state==="online"&&this.state===v.STOPPED&&(f.info("Network restored, starting heartbeat"),this.start()),A.state==="offline"&&this.state!==v.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 a1(N){return new C1(N)}var l=S("connection"),d={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTING:"disconnecting",RECONNECTING:"reconnecting",FAILED:"failed"},MA={INTENTIONAL:"intentional",NETWORK_LOST:"network_lost",SERVER_CLOSED:"server_closed",TIMEOUT:"timeout",HEARTBEAT_FAILED:"heartbeat_failed",ERROR:"error"},z={CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnect_failed",FAILED:"failed",STATE_CHANGED:"state_changed",STATS_UPDATED:"stats_updated"},P1=class{constructor(A,I={}){if(!wA(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=BA(),this.browser=g(),this.state=d.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===d.CONNECTED?Promise.resolve():this.state===d.CONNECTING&&this._connectionPromise?this._connectionPromise:this.network.isOnline()?(this._setState(d.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===d.DISCONNECTED)return Promise.resolve();if(this._clearReconnectTimer(),this.disconnectReason=MA.INTENTIONAL,this._setState(d.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(d.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null);return this._disconnectPromise}async reconnect(){return l.info("Forcing reconnection"),this.state!==d.DISCONNECTED&&await this.disconnect(1e3,"Forced reconnection"),await vA(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===d.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!==d.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===d.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(d.CONNECTED),this._connectionResolve&&(this._connectionResolve(),this._connectionResolve=null,this._connectionReject=null),this._emit(z.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===MA.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(d.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null),this._emit(z.DISCONNECTED,{reason:MA.INTENTIONAL,code:A.code});return}let O;this.network.isOnline()?A.code===1006?O=MA.TIMEOUT:O=MA.SERVER_CLOSED:O=MA.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?MA.NETWORK_LOST:MA.ERROR;this._handleReconnection(O,null,A)}_handleReconnection(A,I,O){if(this._setState(d.RECONNECTING),this.disconnectReason=A,this._emit(z.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(d.FAILED),this._emit(z.FAILED,{reason:"max_attempts",attempts:this.reconnectAttempts});return}let U=oA(this.reconnectAttempts,this.options.reconnect);l.info(`Reconnecting in ${U}ms`,{attempt:this.reconnectAttempts+1,max:this.options.reconnect.maxAttempts}),this._emit(z.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===d.RECONNECTING||this.state===d.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===RA.DEAD&&(l.error("Heartbeat dead, reconnecting"),this.disconnectReason=MA.HEARTBEAT_FAILED,this.ws&&this.ws.close()),A===RA.LATENCY_UPDATED&&this._emit("latency",{latency:I.latency})}_setupHeartbeat(){this.ws&&(this.heartbeat=a1({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(z.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 c1(N,A={}){return new P1(N,A)}var H=S("transport"),m={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"},FA=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 m.NONE}},l1=class extends FA{constructor(A,I={}){super(A,I),this.ws=null,this.pendingMessages=[],this.type=m.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}},h1=class extends FA{constructor(A,I={}){super(A,I),this.es=null,this.sendQueue=[],this.type=m.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}}},J1=class extends FA{constructor(A,I={}){super(A,I),this.pollingInterval=I.pollingInterval||3e3,this.pollingActive=!1,this.sendQueue=[],this.messageQueue=[],this.pollTimeout=null,this.type=m.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))}}},d1=class{constructor(A,I={}){this.url=A,this.options={transports:[m.WEBSOCKET,m.EVENTSOURCE,m.POLLING],timeout:1e4,pollingInterval:3e3,...I},this.browser=g(),this.network=BA(),this.currentTransport=null,this.transportType=m.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=m.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 m.WEBSOCKET:U=new l1(this.url,this.options);break;case m.EVENTSOURCE:U=new h1(this.url,this.options);break;case m.POLLING:U=new J1(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 m.WEBSOCKET:return this.browser.hasWebSocket;case m.EVENTSOURCE:return typeof EventSource<"u";case m.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 u1(N,A={}){return new d1(N,A)}var xA=S("client"),e4={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},Z1=class{constructor(A,I={}){if(!wA(A))throw new TypeError(`Invalid WebSocket URL: ${A}`);this.url=A,this.options=i1(e4,I),this.options.debug&&xA.debug("Debug mode enabled"),this.browser=g(),this.transport=u1(A,{transports:this.options.transport.transports,timeout:this.options.timeout,pollingInterval:this.options.transport.pollingInterval}),this.connection=c1(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(),xA.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 z.CONNECTED:this._triggerEvent("open",I);break;case z.DISCONNECTED:this._triggerEvent("close",I);break;case z.RECONNECTING:this._triggerEvent("reconnectAttempt",{attempt:I.attempt,maxAttempts:I.maxAttempts,delay:I.delay});break;case z.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){xA.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=eA(),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){xA.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=o1();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(){xA.info("Destroying client"),this.disconnect(1e3,"Client destroyed"),this.messageHandlers.clear(),this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.pendingAcks.clear()}},B2=Z1;var DA=S("packet"),IA={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"},sA={CRITICAL:"critical",HIGH:"high",NORMAL:"normal",LOW:"low"},XA={AT_MOST_ONCE:"at_most_once",AT_LEAST_ONCE:"at_least_once",EXACTLY_ONCE:"exactly_once"},D4="1.0",R2=256*1024,s4=6e4;function M2(N){return N&&typeof N.id=="string"&&VA(N.type,IA)&&N.timestamp&&typeof N.timestamp=="number"}var hA=class N{constructor(A,I,O={}){if(!VA(A,IA)){if(typeof A!="string")throw new Error(`Invalid message type: ${A}. Must be a string.`);DA.warn(`Unknown message type: ${A}. Using custom type.`)}if(O.namespace&&!yA(O.namespace))throw new Error(`Invalid namespace: ${O.namespace}. Must start with / and contain only letters, numbers, underscores, and hyphens.`);if(O.priority&&!VA(O.priority,sA))throw new Error(`Invalid priority: ${O.priority}. Must be one of: ${Object.values(sA).join(", ")}`);if(O.deliveryGuarantee&&!VA(O.deliveryGuarantee,XA))throw new Error(`Invalid delivery guarantee: ${O.deliveryGuarantee}. Must be one of: ${Object.values(XA).join(", ")}`);this.id=O.id||b("pkt"),this.type=A,this.payload=I,this.timestamp=Date.now(),this.version=D4,this.priority=O.priority||sA.NORMAL,this.requiresAck=O.requiresAck||!1,this.ttl=O.ttl||s4,this.namespace=O.namespace||"/",this.deliveryGuarantee=O.deliveryGuarantee||XA.AT_MOST_ONCE,this.metadata=O.metadata||{},this.from=O.from||null,this.inResponseTo=O.inResponseTo||null,this._checkSize(),DA.debug("Packet created",{id:this.id,type:this.type,namespace:this.namespace,size:this.getSize()})}_checkSize(){let A=this.getSize();A>R2&&DA.warn("Packet exceeds recommended size",{size:A,max:R2,id:this.id,type:this.type})}getSize(){return jA(this)}isExpired(){return QA(this.timestamp,this.ttl)}getRemainingTTL(){return K2(this.timestamp,this.ttl)}createResponse(A,I={}){return new N(IA.RESPONSE,A,{...I,inResponseTo:this.id,namespace:this.namespace,priority:I.priority||this.priority})}createError(A,I={},O=500){return new N(IA.ERROR,{code:O,message:A,details:I,originalType:this.type,originalId:this.id},{inResponseTo:this.id,namespace:this.namespace,priority:sA.HIGH})}createAck(A=null){return new N(IA.ACK,{originalId:this.id,result:A,timestamp:Date.now()},{inResponseTo:this.id,namespace:this.namespace,priority:sA.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=r1(A);return I||(DA.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"?s1(A):A;if(!I)return DA.error("Failed to parse packet data"),null;if(!M2(I))return DA.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 DA.error("Failed to create packet from data:",O),null}}static isValid(A){let I=typeof A=="string"?s1(A):A;return M2(I)}static fromRaw(A){return typeof A=="string"?N.deserialize(A):A instanceof Blob||A instanceof ArrayBuffer?new N(IA.MESSAGE,A,{metadata:{binary:!0}}):(DA.warn("Unsupported raw data type:",typeof A),null)}};function r4(N,A,I={}){return new hA(N,A,I)}function i4(N,A,I={}){return new hA(IA.EVENT,{event:N,data:A},{priority:sA.LOW,...I})}function n4(N,A,I={}){return new hA(IA.COMMAND,{command:N,params:A},{requiresAck:!0,priority:sA.HIGH,...I})}var _=S("router"),JA={EXACT:"exact",WILDCARD:"wildcard",REGEX:"regex",FUNCTION:"function"},L2={CRITICAL:100,HIGH:200,NORMAL:300,LOW:400,FALLBACK:500},$={PRE:"pre",POST:"post",AROUND:"around"},m1=class{constructor(A,I,O={}){this.pattern=A,this.handler=I,this.matchType=O.matchType||JA.EXACT,this.priority=O.priority||L2.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 JA.EXACT:return I===this.pattern;case JA.WILDCARD:return this._matchWildcard(I,this.pattern);case JA.REGEX:return this.pattern.test(I);case JA.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 _.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}}},p1=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={[$.PRE]:[],[$.POST]:[],[$.AROUND]:[]},this.stats={routesProcessed:0,handlersExecuted:0,errorsCaught:0,lastRoute:null},this._setupDefaultHandlers(),_.info("Router created")}_setupDefaultHandlers(){this.on("*",A=>{_.debug("Unhandled message type:",A.type)},{matchType:JA.WILDCARD,priority:L2.FALLBACK,description:"Catch-all handler"}),this.on(IA.ERROR,A=>{_.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 m1(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&&_.warn(`Max handlers (${this.options.maxHandlersPerRoute}) reached for route:`,E),K.push(U),K.sort((B,R)=>B.priority-R.priority),_.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),_.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($.PRE,A,I);let O=this._findHandlers(A);if(O.length===0){_.debug("No handlers for packet type:",A.type);return}_.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)_.error("Handler error:",K);else throw K}return this._runMiddleware($.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),_.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){_.error(`Middleware (${A}) error:`,K)}}_runAroundMiddleware(A,I,O){let U;for(let E of this.middleware[$.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[$.PRE].length,post:this.middleware[$.POST].length,around:this.middleware[$.AROUND].length},namespaces:this.namespaces.size}}reset(){this.routes.clear(),this.namespaces.clear(),this.middleware={[$.PRE]:[],[$.POST]:[],[$.AROUND]:[]},this._setupDefaultHandlers(),_.info("Router reset")}};function G2(N={}){return new p1(N)}var OA=S("namespace"),CA={CREATED:"created",DESTROYED:"destroyed",USER_JOINED:"user_joined",USER_LEFT:"user_left",ERROR:"error"},H4={autoCreateRooms:!0,maxRooms:100,broadcastPresence:!0,persistState:!1,authRequired:!1},bA=class N{constructor(A,I,O={}){if(!yA(A))throw new Error(`Invalid namespace path: ${A}`);this.path=A,this.socket=I,this.options={...H4,...O},this.id=b("ns"),this.router=G2({catchErrors:!0}),this.rooms=new Map,this.users=new Map,this.children=new Map,this.handlers={[CA.CREATED]:[],[CA.DESTROYED]:[],[CA.USER_JOINED]:[],[CA.USER_LEFT]:[],[CA.ERROR]:[]},this.state={created:Date.now(),messageCount:0,userCount:0,roomCount:0},this._handleMessage=this._handleMessage.bind(this),OA.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 OA.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,OA.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),OA.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,OA.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,OA.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(),OA.info("Namespace destroyed",{path:this.path}),this._emit(CA.DESTROYED,{path:this.path,id:this.id})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){OA.error(`Error in ${A} handler:`,E)}})}_on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),this}},A1=class{constructor(A,I={}){this.socket=A,this.options=I,this.root=new bA("/",A,I),this.namespaces=new Map,this.namespaces.set("/",this.root),this._setupMessageHandler(),OA.info("NamespaceManager created")}_setupMessageHandler(){this.socket.on("message",A=>{let I=this.namespaces.get(A.namespace||"/");I&&I._handleMessage(A)})}of(A,I={}){if(!yA(A))throw new Error(`Invalid namespace path: ${A}`);if(this.namespaces.has(A))return this.namespaces.get(A);let O=new bA(A,this.socket,{...this.options,...I});return this.namespaces.set(A,O),OA.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(),OA.info("NamespaceManager destroyed")}};function o4(N,A={}){return new A1(N,A)}var V=S("rooms"),j={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"},T2={PUBLIC:"public",PRIVATE:"private",HIDDEN:"hidden"},I1={TEMPORARY:"temporary",PERSISTENT:"persistent",ANONYMOUS:"anonymous"},C4={maxUsers:100,visibility:T2.PUBLIC,type:I1.TEMPORARY,broadcastPresence:!0,persistMessages:!1,maxHistory:100,inviteOnly:!1},g1=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}}},_A=class{constructor(A,I={}){this.name=A,this.id=b("room"),this.options={...C4,...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={[j.USER_JOINED]:[],[j.USER_LEFT]:[],[j.ROOM_MESSAGE]:[],[j.ROOM_UPDATED]:[],[j.ERROR]:[]},V.info("Room created",{name:this.name,id:this.id,visibility:this.options.visibility})}addMember(A,I={}){if(this.members.has(A))return V.debug("User already in room",{userId:A,room:this.name}),!1;if(this.members.size>=this.options.maxUsers)return V.warn("Room full",{room:this.name,max:this.options.maxUsers}),this._emit(j.ERROR,{code:"room_full",message:"Room has reached maximum capacity"}),!1;if(this.options.inviteOnly&&!I.invited)return V.warn("Attempt to join invite-only room",{userId:A,room:this.name}),!1;let O=new g1(A,I);return this.members.set(A,O),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),V.debug("User joined room",{userId:A,room:this.name,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(j.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(),V.debug("User left room",{userId:A,room:this.name,reason:I,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(j.USER_LEFT,{userId:A,room:this.name,reason:I,timestamp:Date.now(),memberData:O.toJSON()}),this.options.type===I1.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!==I1.ANONYMOUS)throw new Error(`User ${A} is not in room ${this.name}`);let U={id:b("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))),V.debug("Room message",{room:this.name,userId:A,msgId:U.id}),this._emit(j.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(j.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,V.info("Room destroyed",{name:this.name,id:this.id,reason:A,memberCount:this.members.size}),this._emit(j.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){V.error(`Error in ${A} handler:`,K)}})}},O1=class{constructor(A={}){this.options=A,this.rooms=new Map,this.roomIds=new Map,this.userRooms=new Map,V.info("RoomManager created")}createRoom(A,I={}){if(this.rooms.has(A))throw new Error(`Room "${A}" already exists`);let O=new _A(A,{...this.options,...I});return this.rooms.set(A,O),this.roomIds.set(O.id,A),V.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),V.info("Room removed",{name:A}))}addUserToRoom(A,I,O={}){let U=this.rooms.get(I);if(!U)return V.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(),V.info("RoomManager destroyed")}};function a4(N={}){return new O1(N)}function P4(N,A={}){return new _A(N,A)}var y=S("presence"),u={ONLINE:"online",AWAY:"away",BUSY:"busy",OFFLINE:"offline",CONNECTING:"connecting",RECONNECTING:"reconnecting"},c4={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"},f1={heartbeatInterval:3e4,offlineTimeout:7e4,idleTimeout:3e5,broadcastChanges:!0,trackTyping:!0,typingTimeout:3e3,maxSubscribers:1e3,persistHistory:!1,maxHistory:100},w1=class{constructor(A,I={}){this.userId=A,this.state=u.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||"",y.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===u.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),y.debug("Presence state changed",O),O}updateActivity(A,I={}){this.lastActivity=Date.now(),this.currentActivity={type:A,data:I,timestamp:this.lastActivity},this.state===u.AWAY&&this.updateState(u.ONLINE,"activity"),y.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),y.debug("Started typing",{userId:this.userId,room:A}),!0)}stopTyping(A){return this.typingIn.has(A)?(this.typingIn.delete(A),y.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>f1.maxHistory&&(this.history=this.history.slice(-f1.maxHistory))}},N1=class{constructor(A={}){this.options={...f1,...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},y.info("PresenceManager created",this.options)}registerUser(A,I={}){if(this.users.has(A))return this.users.get(A);let O=new w1(A,I);return this.users.set(A,O),this.stats.totalUsers=this.users.size,y.debug("User registered",{userId:A}),O}unregisterUser(A,I="user_left"){if(this.users.get(A)){this.updateUserState(A,u.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,y.debug("User unregistered",{userId:A,reason:I})}}updateUserState(A,I,O=null){let U=this.users.get(A);if(!U)return y.warn("User not found",{userId:A}),!1;let E=U.updateState(I,O);return E&&(this.stats.stateChanges++,I===u.ONLINE?(this.stats.onlineUsers++,this._emit(o.USER_ONLINE,{userId:A,metadata:U.metadata,timestamp:E.timestamp})):I===u.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),y.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):(y.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===u.OFFLINE&&this.updateUserState(A,u.ONLINE,"heartbeat"))}getStats(){let A=0,I=0,O=0,U=0;for(let E of this.users.values())switch(E.state){case u.ONLINE:A++;break;case u.AWAY:I++;break;case u.BUSY:O++;break;case u.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!==u.OFFLINE&&O.isHeartbeatStale(this.options.offlineTimeout)?(y.debug("Heartbeat stale, marking offline",{userId:I}),this.updateUserState(I,u.OFFLINE,"heartbeat_timeout")):O.state===u.ONLINE&&A-O.lastActivity>this.options.idleTimeout&&this.updateUserState(I,u.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){y.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={},y.info("PresenceManager destroyed")}};function l4(N={}){return new N1(N)}function h4(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 k=S("ack"),p={PENDING:"pending",ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",FAILED:"failed",CANCELLED:"cancelled"},dA={ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",RETRY:"retry",FAILED:"failed",CANCELLED:"cancelled",LATENCY_UPDATED:"latency_updated"},J4={timeout:1e4,maxRetries:3,retryBaseDelay:1e3,retryMaxDelay:3e4,exponentialBackoff:!0,cleanupInterval:6e4,maxAckAge:3e5,trackLatency:!0},v1=class{constructor(A,I){this.messageId=A,this.state=p.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=eA(),this._setTimeout(),k.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=p.FAILED,this.deferred.reject(new Error(`Max retries (${this.maxRetries}) exceeded for message ${this.messageId}`)),k.warn("Message failed permanently",{messageId:this.messageId,attempts:this.attempts})):(this.state=p.TIMEOUT,this._scheduleRetry())}_scheduleRetry(){let A=oA(this.attempts-1,{baseDelay:this.metadata.retryBaseDelay||1e3,maxDelay:this.metadata.retryMaxDelay||3e4,jitter:!0});k.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===p.PENDING||this.state===p.TIMEOUT){this.state=p.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}),k.debug("Message acknowledged",{messageId:this.messageId,latency:I,attempts:this.attempts+1})}}cancel(A="Cancelled"){this.state=p.CANCELLED,this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout),this.deferred.reject(new Error(A)),k.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===p.ACKNOWLEDGED?Date.now()-this.ackReceivedAt>A:this.state===p.FAILED||this.state===p.CANCELLED?Date.now()-this.lastAttempt>A:!1}},kA=class{constructor(A={}){this.options={...J4,...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(),k.info("AckManager created",this.options)}track(A,I,O={}){if(this.pending.has(A))return k.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 v1(A,U);this.pending.set(A,E),this.stats.totalTracked++;try{I(A)}catch(K){k.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){k.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=[],k.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(dA.LATENCY_UPDATED,{latency:I.latency,avgLatency:this.stats.totalLatency/this.stats.acknowledged}))),this.pending.delete(A),this.completed.set(A,O),this._emit(dA.ACKNOWLEDGED,{messageId:A,attempts:I.attempts,latency:I.latency}))}_handleFailure(A,I){let O=this.pending.get(A);O&&(O.state===p.FAILED?(this.stats.failed++,this._emit(dA.FAILED,{messageId:A,error:I.message})):O.state===p.TIMEOUT?(this.stats.timedOut++,this.stats.retries+=O.attempts,this._emit(dA.TIMEOUT,{messageId:A,attempt:O.attempts})):O.state===p.CANCELLED&&(this.stats.cancelled++,this._emit(dA.CANCELLED,{messageId:A,reason:I.message})),(O.state===p.FAILED||O.state===p.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&&k.debug("Cleaned up old ack entries",{cleaned:A})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){k.error(`Error in ${A} listener:`,E)}})}destroy(){this.cleanupInterval&&clearInterval(this.cleanupInterval),this.reset(),this.listeners.clear(),k.info("AckManager destroyed")}};function d4(N={}){return new kA(N)}function u4(N,A,I={}){return new kA(I).track(N,A,I)}var h=S("queue"),NA={PENDING:"pending",PROCESSING:"processing",SENT:"sent",FAILED:"failed",DISCARDED:"discarded"},WA={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"},LA={CRITICAL:0,HIGH:1,NORMAL:2,LOW:3},V1={maxSize:1e3,maxAge:10080*60*1e3,autoProcess:!0,batchSize:10,batchDelay:100,maxRetries:5,preserveOrder:!0,dropOldestWhenFull:!0},y1=class N{constructor(A,I={}){this.id=I.id||b("q"),this.data=A,this.priority=I.priority||LA.NORMAL,this.state=NA.PENDING,this.createdAt=Date.now(),this.updatedAt=this.createdAt,this.retries=I.retries||0,this.maxRetries=I.maxRetries||V1.maxRetries,this.ttl=I.ttl||V1.maxAge,this.metadata=I.metadata||{},this.error=null,this.size=jA(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 QA(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}},U1=class{constructor(A={}){this.options={...V1,...A},this.items=new Map,this.pendingIds=[],this.priorityBuckets={[LA.CRITICAL]:new Set,[LA.HIGH]:new Set,[LA.NORMAL]:new Set,[LA.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(WA.QUEUE_FULL,{size:this.items.size}),new Error("Queue is full");let O=new y1(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(WA.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(WA.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(WA.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(WA.PROCESSING_STOPPED,{remaining:this.items.size}),this.isEmpty()&&this._emit(WA.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(WA.QUEUE_EMPTIED)}retryFailed(A){let I=0;for(let O of this.items.values())O.state===NA.FAILED&&(O.setState(NA.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(NA.PROCESSING),await this.processor(this._toPublicItem(E))?(this.remove(E.id),I++,this.stats.totalProcessed++,this._emit(WA.ITEM_STATE_CHANGED,{id:E.id,state:NA.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=[LA.CRITICAL,LA.HIGH,LA.NORMAL,LA.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===NA.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(NA.DISCARDED,I),this.remove(A.id),this.stats.totalDiscarded++,h.warn("Item discarded (max retries)",{id:A.id,retries:A.retries})):(A.setState(NA.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(NA.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(NA.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 F1(N={}){return new U1(N)}var i=S("storage"),Q={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"},Z4={dbName:"websocket_queue",storeName:"messages",dbVersion:1,maxItems:1e4,maxSize:5*1024*1024,autoInit:!0,storageType:null},x1=class{constructor(A={}){this.options={...Z4,...A},this.browser=g(),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(Q.INITIALIZED,{type:this.storageType})}catch(A){throw i.error("Storage initialization failed:",A),this._emit(Q.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(Q.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(Q.ITEM_STORED,{key:A,size:O})}catch(O){throw this.stats.errors++,i.error("Failed to store item:",O),this._emit(Q.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(Q.ITEM_RETRIEVED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to retrieve item:",I),this._emit(Q.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(Q.ITEM_DELETED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to remove item:",I),this._emit(Q.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(Q.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(Q.CLEARED)}catch(A){this.stats.errors++,i.error("Failed to clear storage:",A),this._emit(Q.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 b1(N={}){return new x1(N)}var F=S("retry"),EA={EXPONENTIAL:"exponential",LINEAR:"linear",FIXED:"fixed",FIBONACCI:"fibonacci",IMMEDIATE:"immediate"},aA={ALL:"all",NETWORK:"network",SERVER:"server",TIMEOUT:"timeout",CUSTOM:"custom"},YA={BEFORE_RETRY:"before_retry",AFTER_RETRY:"after_retry",MAX_RETRIES_REACHED:"max_retries_reached",CANCELLED:"cancelled",CIRCUIT_OPENED:"circuit_opened",CIRCUIT_CLOSED:"circuit_closed"},UA={CLOSED:"closed",OPEN:"open",HALF_OPEN:"half_open"},W2={maxAttempts:5,initialDelay:1e3,maxDelay:3e4,strategy:EA.EXPONENTIAL,factor:2,jitter:!0,retryCondition:aA.ALL,customCondition:null,circuitBreaker:{enabled:!0,failureThreshold:5,openTimeout:3e4,successThreshold:2},resetOnSuccess:!0},_1=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=eA(),this.results=[],this.errors=[],F.debug("Retry context created",{maxAttempts:I.maxAttempts,strategy:I.strategy})}getNextDelay(){if(this.attempt===0)return 0;switch(this.options.strategy){case EA.EXPONENTIAL:return this._exponentialDelay();case EA.LINEAR:return this._linearDelay();case EA.FIBONACCI:return this._fibonacciDelay();case EA.FIXED:return this.options.initialDelay;case EA.IMMEDIATE:return 0;default:return this._exponentialDelay()}}_exponentialDelay(){return oA(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 aA.ALL:return!0;case aA.NETWORK:return this._isNetworkError(A);case aA.SERVER:return this._isServerError(A);case aA.TIMEOUT:return this._isTimeoutError(A);case aA.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}}},k1=class{constructor(A){this.options=A,this.state=UA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,this.lastFailure=null,F.debug("Circuit breaker created",A)}isClosed(){return this.state===UA.CLOSED}isOpen(){return this.state===UA.OPEN}isHalfOpen(){return this.state===UA.HALF_OPEN}recordSuccess(){this.successCount++,this.failureCount=0,this.state===UA.HALF_OPEN&&this.successCount>=this.options.successThreshold&&this._close()}recordFailure(A){this.lastFailure=A,this.failureCount++,this.successCount=0,this.state===UA.CLOSED?this.failureCount>=this.options.failureThreshold&&this._open():this.state===UA.HALF_OPEN&&this._open()}checkHalfOpen(){return this.state===UA.OPEN&&this.openTime&&Date.now()-this.openTime>=this.options.openTimeout?(this._halfOpen(),!0):!1}_open(){this.state=UA.OPEN,this.openTime=Date.now(),this.successCount=0,F.warn("Circuit opened",{failures:this.failureCount,timeout:this.options.openTimeout})}_close(){this.state=UA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,F.info("Circuit closed")}_halfOpen(){this.state=UA.HALF_OPEN,this.successCount=0,F.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}}},PA=class{constructor(A={}){this.options=this._mergeOptions(A),this.circuitBreaker=this.options.circuitBreaker.enabled?new k1(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,F.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(YA.CIRCUIT_HALF_OPEN);else{let B=new Error("Circuit breaker is open");throw this._emit(YA.CIRCUIT_OPENED,{error:B}),B}let U=new _1(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(YA.CIRCUIT_OPENED,{error:B}))),this.stats.failedExecutions++,B}finally{this.contexts.delete(E)}}async _executeWithRetry(A){for(;;){A.attempt++;try{F.debug(`Attempt ${A.attempt}`,A.metadata);let I=await A.operation();return A.recordResult(I),A.attempt>1&&F.info(`Succeeded after ${A.attempt} attempts`),this.options.resetOnSuccess,I}catch(I){if(A.recordError(I),F.debug(`Attempt ${A.attempt} failed:`,I.message),!A.shouldRetry(I))throw this._emit(YA.MAX_RETRIES_REACHED,{attempts:A.attempt,error:I.message}),I;let O=A.getNextDelay();F.debug(`Retrying in ${O}ms (attempt ${A.attempt}/${A.options.maxAttempts})`),this.stats.totalRetries++,this._emit(YA.BEFORE_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts,delay:O,error:I.message}),O>0&&await vA(O),this._emit(YA.AFTER_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts})}}}cancelAll(A="Cancelled by user"){this.contexts.forEach((I,O)=>{I.cancelled=!0,this._emit(YA.CANCELLED,{id:O,reason:A})}),this.contexts.clear(),F.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},F.info("Retry stats reset")}resetCircuitBreaker(){this.circuitBreaker&&(this.circuitBreaker._close(),this._emit(YA.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={...W2,...A};return A.circuitBreaker&&(I.circuitBreaker={...W2.circuitBreaker,...A.circuitBreaker}),I}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){F.error(`Error in ${A} listener:`,E)}})}destroy(){this.cancelAll("Manager destroyed"),this.listeners.clear(),F.info("RetryManager destroyed")}};function q1(N={}){return new PA(N)}async function m4(N,A={}){return new PA({maxAttempts:2,...A}).execute(N)}async function p4(N,A=5){return new PA({maxAttempts:A,strategy:EA.EXPONENTIAL}).execute(N)}async function g4(N,A=1e3,I=5){return new PA({maxAttempts:I,strategy:EA.FIXED,initialDelay:A}).execute(N)}var C=S("recovery"),rA={IDLE:"idle",SCANNING:"scanning",RESTORING:"restoring",COMPLETED:"completed",FAILED:"failed"},SA={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"},uA={FULL:"full",MINIMAL:"minimal",VERIFIED:"verified",CONNECTION_ONLY:"connection_only"},f4={strategy:uA.FULL,maxStateAge:10080*60*1e3,autoRecover:!0,enableCheckpoints:!0,checkpointInterval:300*1e3,maxCheckpoints:5,verifyWithServer:!0,recoveryTimeout:3e4,replayQueue:!0,restoreSubscriptions:!0,restorePresence:!0},z1=class N{constructor(A,I={}){this.id=b("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}},E1=class{constructor(A={}){this.options={...f4,...A},this.state=rA.IDLE,this.sessionId=this._generateSessionId(),this.currentState=null,this.storage=b1({dbName:"websocket_recovery",storeName:"state",autoInit:!0}),this.queue=F1({maxSize:1e3,autoProcess:!1}),this.retry=q1({maxAttempts:3,strategy:EA.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),C.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++,C.debug("State saved",{timestamp:O.timestamp,metadata:I}),this._emit(SA.STATE_SAVED,{timestamp:O.timestamp,metadata:I}),this.options.enableCheckpoints&&await this._createCheckpoint(A,I)}catch(U){throw C.error("Failed to save state:",U),U}}async recover(){if(this.state===rA.RECOVERING)return C.warn("Recovery already in progress"),null;this.state=rA.SCANNING,this.stats.recoveriesAttempted++,this._emit(SA.RECOVERY_STARTED,{sessionId:this.sessionId,strategy:this.options.strategy});let A=Date.now();try{let I=await this._findRecoverableState();if(!I)return C.info("No recoverable state found"),this.state=rA.IDLE,null;this.state=rA.RESTORING;let O;switch(this.options.strategy){case uA.FULL:O=await this._fullRecovery(I);break;case uA.MINIMAL:O=await this._minimalRecovery(I);break;case uA.VERIFIED:O=await this._verifiedRecovery(I);break;case uA.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=rA.COMPLETED,C.info("Recovery completed",{duration:this.stats.lastRecoveryDuration,hasState:!!O}),this._emit(SA.RECOVERY_COMPLETED,{duration:this.stats.lastRecoveryDuration,state:O}),O}catch(I){return this.state=rA.FAILED,this.stats.recoveriesFailed++,C.error("Recovery failed:",I),this._emit(SA.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?(C.info("Restoring from checkpoint",{id:A,timestamp:O.timestamp}),O.state):(C.warn("Checkpoint not found",{checkpointId:A}),null)}async clear(){await this.storage.clear(),this.checkpoints=[],this.currentState=null,C.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=b("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 C.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 C.debug("Found checkpoint",{timestamp:U.timestamp}),{type:"checkpoint",state:U.state}}return null}catch(A){return C.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 C.info("Performing full recovery",{type:A.type,timestamp:I.timestamp}),this._emit(SA.RECOVERY_PROGRESS,{phase:"full",percent:50}),I.state}async _minimalRecovery(A){let I=A.state;C.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(SA.RECOVERY_PROGRESS,{phase:"minimal",percent:75}),O}async _verifiedRecovery(A){let I=A.state;return C.info("Performing verified recovery"),I.state}async _connectionOnlyRecovery(A){let I=A.state;return C.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){C.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(SA.RECOVERY_PROGRESS,{phase:"replay",count:A.length})}}async _createCheckpoint(A,I){try{let O=new z1(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++,C.debug("Checkpoint created",{id:O.id,size:O.size}),this._emit(SA.CHECKPOINT_CREATED,{id:O.id,timestamp:O.timestamp,size:O.size})}catch(O){C.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){C.error(`Error in ${A} listener:`,E)}})}destroy(){this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.storage.destroy(),this.queue.destroy(),this.listeners.clear(),C.info("RecoveryManager destroyed")}};function w4(N={}){return new E1(N)}function v4(N,A={}){let I=b1({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 V4=B2;export{dA as AckEvent,kA as AckManager,p as AckState,c4 as ActivityType,W1 as AppLoader,T1 as CameraModal,z as ConnectionEvent,d as ConnectionState,G1 as DataExporter,XA as DeliveryGuarantee,MA as DisconnectReason,RA as HeartbeatEvent,v as HeartbeatState,a as LOG_LEVELS,HA as Locations,sA as MessagePriority,IA as MessageType,bA as Namespace,CA as NamespaceEvent,A1 as NamespaceManager,hA as Packet,o as PresenceEvent,N1 as PresenceManager,u as PresenceState,WA as QueueEvent,NA as QueueItemState,U1 as QueueManager,LA as QueuePriority,SA as RecoveryEvent,E1 as RecoveryManager,rA as RecoveryState,uA as RecoveryStrategy,aA as RetryCondition,YA as RetryEvent,PA as RetryManager,EA as RetryStrategy,_A as Room,j as RoomEvent,O1 as RoomManager,I1 as RoomType,T2 as RoomVisibility,K1 as Router,B1 as SmartInput,e as TransportEvent,D as TransportState,m as TransportType,V4 as WebSocketClient,z2 as abbreviateNumber,oA as calculateBackoff,L4 as configureLogger,d4 as createAckManager,n4 as createCommand,c1 as createConnection,i4 as createEvent,a1 as createHeartbeat,S as createLogger,r4 as createMessage,o4 as createNamespaces,v4 as createPersistentState,l4 as createPresenceManager,F1 as createQueue,w4 as createRecovery,q1 as createRetry,P4 as createRoom,a4 as createRoomManager,u1 as createTransport,h4 as createTypingIndicator,mA as dependencyManager,k2 as formatCurrency,j2 as formatNumberInput,q2 as formatPercentage,b as generateId,S4 as generateUUID,A4 as getAddress,g as getBrowserCapabilities,P2 as getCurrentDate,d2 as getDateAgo,J2 as getDateRange,u2 as getDateTomorrow,c2 as getDateYesterday,m2 as getDaysBetween,h2 as getEndDate,p2 as getFutureDate,Z2 as getFutureDateRange,Y4 as getNetworkInfo,BA as getNetworkMonitor,$2 as getNumericValue,o2 as getQueueStatus,Q2 as getRawInputValue,a2 as getRelativeTime,M4 as getWatcherStats,C2 as humanizeDate,y3 as icons,n2 as initRequestHandler,r2 as inputHandlers,H2 as interceptors,R4 as isBeingWatched,g2 as isFutureDate,W4 as isMobileDevice,o1 as isOnline,f2 as isPastDate,t4 as onNetworkChange,p4 as retryExponential,g4 as retryFixed,m4 as retryOnce,qA as roundToNearest,i2 as sendRequest,X2 as setInputValue,vA as sleep,U2 as stopWatchingAll,T4 as supportsWebSocket,l2 as timeAgo,I2 as unformatNumber,nA as validateDate,$1 as validateFieldByType,t2 as validateMandatoryFields,j1 as validateName,D2 as validateNameField,s2 as validatePhoneField,Q1 as validatePhoneNumber,wA as validateUrl,K4 as watchAll,O2 as watchElement,u4 as withAck};
1490
+ `,z3(),document.body.appendChild(N),F3(),N}function A4(N,A){if(!N){alert("please provide an `onConfirm` callback!");return}let I=X3();return I._callbacks={onConfirm:N,onCancel:A},Q3(I),I}var W1=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 lA={threshold:0,rootMargin:"0px",root:null,triggerOnce:!1},KA=new Map;function I4(N,A){return`${N?N.id||N.tagName+N.className:"viewport"}::${A}`}var Y1=class{constructor(A,I,O){this.onEnter=A,this.onExit=I,this.options=O,this.currentlyIntersecting=!1}};function O4(N,A){let I=I4(N,A);return KA.has(I)||KA.set(I,{observer:null,callbacks:new Map,root:N,rootMargin:A,thresholds:new Set([0])}),KA.get(I)}function N4(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 U4(N){let A=N4(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=>{E4(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 E4(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:lA.threshold,W=(P=G.triggerOnce)!=null?P:lA.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&&N2(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 O2(N,A={}){var R,M,L,G;let I=B4(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:lA.threshold,rootMargin:(M=A.rootMargin)!=null?M:lA.rootMargin,root:(L=A.root)!=null?L:lA.root,triggerOnce:(G=A.triggerOnce)!=null?G:lA.triggerOnce},K=O4(E.root,E.rootMargin),B=new Y1(O,U,E);return K.callbacks.has(I)||K.callbacks.set(I,new Set),K.callbacks.get(I).add(B),U4(K),K.observer.observe(I),()=>{N2(K,I,B)}}function K4(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=>O2(U,A));return()=>{O.forEach(U=>U())}}function N2(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 KA)if(E===N){KA.delete(U);break}}}function B4(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 U2(){KA.forEach(N=>{N.observer&&(N.observer.disconnect(),N.observer=null),N.callbacks.clear()}),KA.clear()}function R4(N){for(let A of KA.values())if(A.callbacks.has(N))return!0;return!1}function M4(){let N=0,A=0;return KA.forEach(I=>{N+=I.callbacks.size,I.callbacks.forEach(O=>{A+=O.size})}),{elements:N,callbacks:A,pools:KA.size}}typeof window<"u"&&window.addEventListener("beforeunload",()=>{U2()});var a={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4},E2={level:a.ERROR,timestamps:!0,colors:!0,output:null,namespaces:{}},gA={reset:"\x1B[0m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",namespace:"\x1B[35m"},S1=class N{constructor(A,I={}){if(typeof A!="string")throw new TypeError("Logger namespace must be a string");this.namespace=A,this.config={...E2,...I}}debug(...A){this._log(a.DEBUG,"DEBUG",...A)}info(...A){this._log(a.INFO,"INFO",...A)}warn(...A){this._log(a.WARN,"WARN",...A)}error(...A){this._log(a.ERROR,"ERROR",...A)}isDebugEnabled(){return this._shouldLog(a.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=gA[A.toLowerCase()]||gA.reset;O.push(`${U}[${A}]${gA.reset}`)}else O.push(`[${A}]`);return this.config.colors?O.push(`${gA.namespace}[${this.namespace}]${gA.reset}`):O.push(`[${this.namespace}]`),O.push(...I),O}_output(A,I){if(this.config.output){this.config.output(A,...I);return}A>=a.ERROR?console.error(...I):A>=a.WARN?console.warn(...I):console.log(...I)}},t1={...E2},$A=new Map;function S(N){if($A.has(N))return $A.get(N);let A=new S1(N,t1);return $A.set(N,A),A}function L4(N){if(typeof N.level=="string"){let A={debug:a.DEBUG,info:a.INFO,warn:a.WARN,error:a.ERROR,silent:a.SILENT};N.level=A[N.level.toLowerCase()]||a.INFO}N.namespaces&&Object.keys(N.namespaces).forEach(A=>{let I=N.namespaces[A];if(typeof I=="string"){let O={debug:a.DEBUG,info:a.INFO,warn:a.WARN,error:a.ERROR,silent:a.SILENT};N.namespaces[A]=O[I.toLowerCase()]||a.INFO}}),t1={...t1,...N},$A.clear()}var G4=S("browser"),D1=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,G4.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}},e1=null;function g(){return e1||(e1=new D1),e1}function T4(){return g().hasWebSocket}function W4(){return g().isMobile}function Y4(){if(!g().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 U6=g();function b(N=""){let A=Date.now().toString(36),I=Math.random().toString(36).substring(2,10),O=`${A}${I}`;return N?`${N}_${O}`:O}function S4(){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 wA(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 s1(N,A=null){if(typeof N!="string")return A;try{return JSON.parse(N)}catch{return A}}function r1(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 fA(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=>fA(A));if(N instanceof Object){let A={};return Object.keys(N).forEach(I=>{A[I]=fA(N[I])}),A}return N}function i1(N,A){let I=fA(N);return!A||typeof A!="object"||Object.keys(A).forEach(O=>{let U=A[O],E=I[O];U instanceof Array?I[O]=fA(U):U instanceof Object&&E instanceof Object?I[O]=i1(E,U):I[O]=fA(U)}),I}function oA(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 vA(N){return new Promise(A=>setTimeout(A,N))}function eA(){let N,A;return{promise:new Promise((O,U)=>{N=O,A=U}),resolve:N,reject:A}}function jA(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=r1(N);return A?new Blob([A]).size:0}return new Blob([String(N)]).size}function QA(N,A){return Date.now()>N+A}function K2(N,A){let I=N+A-Date.now();return Math.max(0,I)}function VA(N,A){return Object.values(A).includes(N)}function yA(N){return typeof N!="string"?!1:N==="/"?!0:/^\/[a-zA-Z0-9_-]+(\/[a-zA-Z0-9_-]+)*$/.test(N)}var TA=S("network"),Z={OFFLINE:"offline",ONLINE:"online",DEGRADED:"degraded",CHECKING:"checking"},q={UNKNOWN:"unknown",ETHERNET:"ethernet",WIFI:"wifi",CELLULAR:"cellular",NONE:"none"},H1=class{constructor(){this.browser=g(),this.listeners=new Map,this.status={state:Z.CHECKING,type:q.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,TA.info("Network monitor initialized",this.status)}),TA.debug("Network listeners initialized")}_startPeriodicChecks(){this._checkInterval=setInterval(()=>{this._checkStatus()},3e4)}_handleBrowserOnline(){TA.info("Browser reported online"),this._checkStatus(!0)}_handleBrowserOffline(){TA.warn("Browser reported offline"),this._updateStatus({state:Z.OFFLINE,type:q.NONE,lastChanged:Date.now()})}_handleConnectionChange(){TA.debug("Network connection changed"),this._checkStatus(!0)}async _checkStatus(A=!1){if(this._checking)return this.status;this._checking=!0,this._updateStatus({state:Z.CHECKING});try{if(!this._getBasicOnlineStatus()){this._updateStatus({state:Z.OFFLINE,type:q.NONE},A);return}let O=this._getNetworkInfo();if(!await this._verifyConnectivity()){this._updateStatus({state:Z.DEGRADED,type:(O==null?void 0:O.type)||q.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)||q.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){TA.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:q.WIFI,cellular:q.CELLULAR,ethernet:q.ETHERNET,none:q.NONE,unknown:q.UNKNOWN}[A]||q.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)?Z.DEGRADED:Z.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)&&(TA.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){TA.error(`Error in listener ${U}:`,E)}})}getStatus(){return{...this.status}}isOnline(){return this.status.state===Z.ONLINE||this.status.state===Z.DEGRADED}isFullyOnline(){return this.status.state===Z.ONLINE}isOffline(){return this.status.state===Z.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=eA();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===Z.ONLINE||E.state===Z.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(),TA.debug("Network monitor destroyed")}},n1=null;function BA(){return n1||(n1=new H1),n1}function o1(){return BA().isOnline()}function t4(N){return BA().onChange(N)}var G6=BA();var f=S("heartbeat"),RA={PING_SENT:"ping_sent",PONG_RECEIVED:"pong_received",MISSED:"missed",DEAD:"dead",LATENCY_UPDATED:"latency_updated"},v={STOPPED:"stopped",RUNNING:"running",WAITING:"waiting",FAILED:"failed"},C1=class{constructor(A={}){this.options={interval:3e4,timeout:1e4,maxMissed:2,adaptive:!0,...A},this.network=BA(),this.state=v.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!==v.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=v.RUNNING,this.missedCount=0,this._schedulePing(),f.info("Heartbeat started"),this._emit(RA.PING_SENT,{state:this.state})}stop(){this.state=v.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=v.RUNNING,f.debug("Pong received",{pingId:O,latency:this.latency,missed:this.missedCount}),this._emit(RA.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===v.RUNNING&&this.missedCount===0}isFailing(){return this.state===v.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===v.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(RA.PING_SENT,{pingId:I})}catch(O){f.error("Failed to send ping:",O),this._handlePongTimeout();return}this.state=v.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(RA.MISSED,{pingId:A,missed:this.missedCount,total:this.options.maxMissed}),this.pendingPings.delete(A),this.missedCount>=this.options.maxMissed){this._handleDeadConnection();return}this.state=v.RUNNING,this._schedulePing()}_handleDeadConnection(){this.state=v.FAILED,f.error("Heartbeat failed - connection appears dead",{missed:this.missedCount,lastPing:this.lastPingTime,lastPong:this.lastPongTime}),this._emit(RA.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(RA.LATENCY_UPDATED,{latency:this.latency,raw:A})}_onNetworkChange(A){A.state==="online"&&this.state===v.STOPPED&&(f.info("Network restored, starting heartbeat"),this.start()),A.state==="offline"&&this.state!==v.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 a1(N){return new C1(N)}var l=S("connection"),d={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTING:"disconnecting",RECONNECTING:"reconnecting",FAILED:"failed"},MA={INTENTIONAL:"intentional",NETWORK_LOST:"network_lost",SERVER_CLOSED:"server_closed",TIMEOUT:"timeout",HEARTBEAT_FAILED:"heartbeat_failed",ERROR:"error"},z={CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnect_failed",FAILED:"failed",STATE_CHANGED:"state_changed",STATS_UPDATED:"stats_updated"},P1=class{constructor(A,I={}){if(!wA(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=BA(),this.browser=g(),this.state=d.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===d.CONNECTED?Promise.resolve():this.state===d.CONNECTING&&this._connectionPromise?this._connectionPromise:this.network.isOnline()?(this._setState(d.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===d.DISCONNECTED)return Promise.resolve();if(this._clearReconnectTimer(),this.disconnectReason=MA.INTENTIONAL,this._setState(d.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(d.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null);return this._disconnectPromise}async reconnect(){return l.info("Forcing reconnection"),this.state!==d.DISCONNECTED&&await this.disconnect(1e3,"Forced reconnection"),await vA(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===d.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!==d.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===d.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(d.CONNECTED),this._connectionResolve&&(this._connectionResolve(),this._connectionResolve=null,this._connectionReject=null),this._emit(z.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===MA.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(d.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null),this._emit(z.DISCONNECTED,{reason:MA.INTENTIONAL,code:A.code});return}let O;this.network.isOnline()?A.code===1006?O=MA.TIMEOUT:O=MA.SERVER_CLOSED:O=MA.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?MA.NETWORK_LOST:MA.ERROR;this._handleReconnection(O,null,A)}_handleReconnection(A,I,O){if(this._setState(d.RECONNECTING),this.disconnectReason=A,this._emit(z.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(d.FAILED),this._emit(z.FAILED,{reason:"max_attempts",attempts:this.reconnectAttempts});return}let U=oA(this.reconnectAttempts,this.options.reconnect);l.info(`Reconnecting in ${U}ms`,{attempt:this.reconnectAttempts+1,max:this.options.reconnect.maxAttempts}),this._emit(z.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===d.RECONNECTING||this.state===d.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===RA.DEAD&&(l.error("Heartbeat dead, reconnecting"),this.disconnectReason=MA.HEARTBEAT_FAILED,this.ws&&this.ws.close()),A===RA.LATENCY_UPDATED&&this._emit("latency",{latency:I.latency})}_setupHeartbeat(){this.ws&&(this.heartbeat=a1({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(z.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 c1(N,A={}){return new P1(N,A)}var H=S("transport"),m={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"},FA=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 m.NONE}},l1=class extends FA{constructor(A,I={}){super(A,I),this.ws=null,this.pendingMessages=[],this.type=m.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}},h1=class extends FA{constructor(A,I={}){super(A,I),this.es=null,this.sendQueue=[],this.type=m.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}}},J1=class extends FA{constructor(A,I={}){super(A,I),this.pollingInterval=I.pollingInterval||3e3,this.pollingActive=!1,this.sendQueue=[],this.messageQueue=[],this.pollTimeout=null,this.type=m.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))}}},d1=class{constructor(A,I={}){this.url=A,this.options={transports:[m.WEBSOCKET,m.EVENTSOURCE,m.POLLING],timeout:1e4,pollingInterval:3e3,...I},this.browser=g(),this.network=BA(),this.currentTransport=null,this.transportType=m.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=m.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 m.WEBSOCKET:U=new l1(this.url,this.options);break;case m.EVENTSOURCE:U=new h1(this.url,this.options);break;case m.POLLING:U=new J1(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 m.WEBSOCKET:return this.browser.hasWebSocket;case m.EVENTSOURCE:return typeof EventSource<"u";case m.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 u1(N,A={}){return new d1(N,A)}var xA=S("client"),e4={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},Z1=class{constructor(A,I={}){if(!wA(A))throw new TypeError(`Invalid WebSocket URL: ${A}`);this.url=A,this.options=i1(e4,I),this.options.debug&&xA.debug("Debug mode enabled"),this.browser=g(),this.transport=u1(A,{transports:this.options.transport.transports,timeout:this.options.timeout,pollingInterval:this.options.transport.pollingInterval}),this.connection=c1(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(),xA.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 z.CONNECTED:this._triggerEvent("open",I);break;case z.DISCONNECTED:this._triggerEvent("close",I);break;case z.RECONNECTING:this._triggerEvent("reconnectAttempt",{attempt:I.attempt,maxAttempts:I.maxAttempts,delay:I.delay});break;case z.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){xA.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=eA(),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){xA.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=o1();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(){xA.info("Destroying client"),this.disconnect(1e3,"Client destroyed"),this.messageHandlers.clear(),this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.pendingAcks.clear()}},B2=Z1;var DA=S("packet"),IA={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"},sA={CRITICAL:"critical",HIGH:"high",NORMAL:"normal",LOW:"low"},XA={AT_MOST_ONCE:"at_most_once",AT_LEAST_ONCE:"at_least_once",EXACTLY_ONCE:"exactly_once"},D4="1.0",R2=256*1024,s4=6e4;function M2(N){return N&&typeof N.id=="string"&&VA(N.type,IA)&&N.timestamp&&typeof N.timestamp=="number"}var hA=class N{constructor(A,I,O={}){if(!VA(A,IA)){if(typeof A!="string")throw new Error(`Invalid message type: ${A}. Must be a string.`);DA.warn(`Unknown message type: ${A}. Using custom type.`)}if(O.namespace&&!yA(O.namespace))throw new Error(`Invalid namespace: ${O.namespace}. Must start with / and contain only letters, numbers, underscores, and hyphens.`);if(O.priority&&!VA(O.priority,sA))throw new Error(`Invalid priority: ${O.priority}. Must be one of: ${Object.values(sA).join(", ")}`);if(O.deliveryGuarantee&&!VA(O.deliveryGuarantee,XA))throw new Error(`Invalid delivery guarantee: ${O.deliveryGuarantee}. Must be one of: ${Object.values(XA).join(", ")}`);this.id=O.id||b("pkt"),this.type=A,this.payload=I,this.timestamp=Date.now(),this.version=D4,this.priority=O.priority||sA.NORMAL,this.requiresAck=O.requiresAck||!1,this.ttl=O.ttl||s4,this.namespace=O.namespace||"/",this.deliveryGuarantee=O.deliveryGuarantee||XA.AT_MOST_ONCE,this.metadata=O.metadata||{},this.from=O.from||null,this.inResponseTo=O.inResponseTo||null,this._checkSize(),DA.debug("Packet created",{id:this.id,type:this.type,namespace:this.namespace,size:this.getSize()})}_checkSize(){let A=this.getSize();A>R2&&DA.warn("Packet exceeds recommended size",{size:A,max:R2,id:this.id,type:this.type})}getSize(){return jA(this)}isExpired(){return QA(this.timestamp,this.ttl)}getRemainingTTL(){return K2(this.timestamp,this.ttl)}createResponse(A,I={}){return new N(IA.RESPONSE,A,{...I,inResponseTo:this.id,namespace:this.namespace,priority:I.priority||this.priority})}createError(A,I={},O=500){return new N(IA.ERROR,{code:O,message:A,details:I,originalType:this.type,originalId:this.id},{inResponseTo:this.id,namespace:this.namespace,priority:sA.HIGH})}createAck(A=null){return new N(IA.ACK,{originalId:this.id,result:A,timestamp:Date.now()},{inResponseTo:this.id,namespace:this.namespace,priority:sA.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=r1(A);return I||(DA.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"?s1(A):A;if(!I)return DA.error("Failed to parse packet data"),null;if(!M2(I))return DA.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 DA.error("Failed to create packet from data:",O),null}}static isValid(A){let I=typeof A=="string"?s1(A):A;return M2(I)}static fromRaw(A){return typeof A=="string"?N.deserialize(A):A instanceof Blob||A instanceof ArrayBuffer?new N(IA.MESSAGE,A,{metadata:{binary:!0}}):(DA.warn("Unsupported raw data type:",typeof A),null)}};function r4(N,A,I={}){return new hA(N,A,I)}function i4(N,A,I={}){return new hA(IA.EVENT,{event:N,data:A},{priority:sA.LOW,...I})}function n4(N,A,I={}){return new hA(IA.COMMAND,{command:N,params:A},{requiresAck:!0,priority:sA.HIGH,...I})}var _=S("router"),JA={EXACT:"exact",WILDCARD:"wildcard",REGEX:"regex",FUNCTION:"function"},L2={CRITICAL:100,HIGH:200,NORMAL:300,LOW:400,FALLBACK:500},$={PRE:"pre",POST:"post",AROUND:"around"},m1=class{constructor(A,I,O={}){this.pattern=A,this.handler=I,this.matchType=O.matchType||JA.EXACT,this.priority=O.priority||L2.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 JA.EXACT:return I===this.pattern;case JA.WILDCARD:return this._matchWildcard(I,this.pattern);case JA.REGEX:return this.pattern.test(I);case JA.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 _.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}}},p1=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={[$.PRE]:[],[$.POST]:[],[$.AROUND]:[]},this.stats={routesProcessed:0,handlersExecuted:0,errorsCaught:0,lastRoute:null},this._setupDefaultHandlers(),_.info("Router created")}_setupDefaultHandlers(){this.on("*",A=>{_.debug("Unhandled message type:",A.type)},{matchType:JA.WILDCARD,priority:L2.FALLBACK,description:"Catch-all handler"}),this.on(IA.ERROR,A=>{_.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 m1(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&&_.warn(`Max handlers (${this.options.maxHandlersPerRoute}) reached for route:`,E),K.push(U),K.sort((B,R)=>B.priority-R.priority),_.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),_.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($.PRE,A,I);let O=this._findHandlers(A);if(O.length===0){_.debug("No handlers for packet type:",A.type);return}_.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)_.error("Handler error:",K);else throw K}return this._runMiddleware($.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),_.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){_.error(`Middleware (${A}) error:`,K)}}_runAroundMiddleware(A,I,O){let U;for(let E of this.middleware[$.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[$.PRE].length,post:this.middleware[$.POST].length,around:this.middleware[$.AROUND].length},namespaces:this.namespaces.size}}reset(){this.routes.clear(),this.namespaces.clear(),this.middleware={[$.PRE]:[],[$.POST]:[],[$.AROUND]:[]},this._setupDefaultHandlers(),_.info("Router reset")}};function G2(N={}){return new p1(N)}var OA=S("namespace"),CA={CREATED:"created",DESTROYED:"destroyed",USER_JOINED:"user_joined",USER_LEFT:"user_left",ERROR:"error"},H4={autoCreateRooms:!0,maxRooms:100,broadcastPresence:!0,persistState:!1,authRequired:!1},bA=class N{constructor(A,I,O={}){if(!yA(A))throw new Error(`Invalid namespace path: ${A}`);this.path=A,this.socket=I,this.options={...H4,...O},this.id=b("ns"),this.router=G2({catchErrors:!0}),this.rooms=new Map,this.users=new Map,this.children=new Map,this.handlers={[CA.CREATED]:[],[CA.DESTROYED]:[],[CA.USER_JOINED]:[],[CA.USER_LEFT]:[],[CA.ERROR]:[]},this.state={created:Date.now(),messageCount:0,userCount:0,roomCount:0},this._handleMessage=this._handleMessage.bind(this),OA.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 OA.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,OA.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),OA.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,OA.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,OA.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(),OA.info("Namespace destroyed",{path:this.path}),this._emit(CA.DESTROYED,{path:this.path,id:this.id})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){OA.error(`Error in ${A} handler:`,E)}})}_on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),this}},A1=class{constructor(A,I={}){this.socket=A,this.options=I,this.root=new bA("/",A,I),this.namespaces=new Map,this.namespaces.set("/",this.root),this._setupMessageHandler(),OA.info("NamespaceManager created")}_setupMessageHandler(){this.socket.on("message",A=>{let I=this.namespaces.get(A.namespace||"/");I&&I._handleMessage(A)})}of(A,I={}){if(!yA(A))throw new Error(`Invalid namespace path: ${A}`);if(this.namespaces.has(A))return this.namespaces.get(A);let O=new bA(A,this.socket,{...this.options,...I});return this.namespaces.set(A,O),OA.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(),OA.info("NamespaceManager destroyed")}};function o4(N,A={}){return new A1(N,A)}var V=S("rooms"),j={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"},T2={PUBLIC:"public",PRIVATE:"private",HIDDEN:"hidden"},I1={TEMPORARY:"temporary",PERSISTENT:"persistent",ANONYMOUS:"anonymous"},C4={maxUsers:100,visibility:T2.PUBLIC,type:I1.TEMPORARY,broadcastPresence:!0,persistMessages:!1,maxHistory:100,inviteOnly:!1},g1=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}}},_A=class{constructor(A,I={}){this.name=A,this.id=b("room"),this.options={...C4,...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={[j.USER_JOINED]:[],[j.USER_LEFT]:[],[j.ROOM_MESSAGE]:[],[j.ROOM_UPDATED]:[],[j.ERROR]:[]},V.info("Room created",{name:this.name,id:this.id,visibility:this.options.visibility})}addMember(A,I={}){if(this.members.has(A))return V.debug("User already in room",{userId:A,room:this.name}),!1;if(this.members.size>=this.options.maxUsers)return V.warn("Room full",{room:this.name,max:this.options.maxUsers}),this._emit(j.ERROR,{code:"room_full",message:"Room has reached maximum capacity"}),!1;if(this.options.inviteOnly&&!I.invited)return V.warn("Attempt to join invite-only room",{userId:A,room:this.name}),!1;let O=new g1(A,I);return this.members.set(A,O),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),V.debug("User joined room",{userId:A,room:this.name,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(j.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(),V.debug("User left room",{userId:A,room:this.name,reason:I,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(j.USER_LEFT,{userId:A,room:this.name,reason:I,timestamp:Date.now(),memberData:O.toJSON()}),this.options.type===I1.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!==I1.ANONYMOUS)throw new Error(`User ${A} is not in room ${this.name}`);let U={id:b("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))),V.debug("Room message",{room:this.name,userId:A,msgId:U.id}),this._emit(j.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(j.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,V.info("Room destroyed",{name:this.name,id:this.id,reason:A,memberCount:this.members.size}),this._emit(j.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){V.error(`Error in ${A} handler:`,K)}})}},O1=class{constructor(A={}){this.options=A,this.rooms=new Map,this.roomIds=new Map,this.userRooms=new Map,V.info("RoomManager created")}createRoom(A,I={}){if(this.rooms.has(A))throw new Error(`Room "${A}" already exists`);let O=new _A(A,{...this.options,...I});return this.rooms.set(A,O),this.roomIds.set(O.id,A),V.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),V.info("Room removed",{name:A}))}addUserToRoom(A,I,O={}){let U=this.rooms.get(I);if(!U)return V.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(),V.info("RoomManager destroyed")}};function a4(N={}){return new O1(N)}function P4(N,A={}){return new _A(N,A)}var y=S("presence"),u={ONLINE:"online",AWAY:"away",BUSY:"busy",OFFLINE:"offline",CONNECTING:"connecting",RECONNECTING:"reconnecting"},c4={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"},f1={heartbeatInterval:3e4,offlineTimeout:7e4,idleTimeout:3e5,broadcastChanges:!0,trackTyping:!0,typingTimeout:3e3,maxSubscribers:1e3,persistHistory:!1,maxHistory:100},w1=class{constructor(A,I={}){this.userId=A,this.state=u.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||"",y.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===u.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),y.debug("Presence state changed",O),O}updateActivity(A,I={}){this.lastActivity=Date.now(),this.currentActivity={type:A,data:I,timestamp:this.lastActivity},this.state===u.AWAY&&this.updateState(u.ONLINE,"activity"),y.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),y.debug("Started typing",{userId:this.userId,room:A}),!0)}stopTyping(A){return this.typingIn.has(A)?(this.typingIn.delete(A),y.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>f1.maxHistory&&(this.history=this.history.slice(-f1.maxHistory))}},N1=class{constructor(A={}){this.options={...f1,...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},y.info("PresenceManager created",this.options)}registerUser(A,I={}){if(this.users.has(A))return this.users.get(A);let O=new w1(A,I);return this.users.set(A,O),this.stats.totalUsers=this.users.size,y.debug("User registered",{userId:A}),O}unregisterUser(A,I="user_left"){if(this.users.get(A)){this.updateUserState(A,u.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,y.debug("User unregistered",{userId:A,reason:I})}}updateUserState(A,I,O=null){let U=this.users.get(A);if(!U)return y.warn("User not found",{userId:A}),!1;let E=U.updateState(I,O);return E&&(this.stats.stateChanges++,I===u.ONLINE?(this.stats.onlineUsers++,this._emit(o.USER_ONLINE,{userId:A,metadata:U.metadata,timestamp:E.timestamp})):I===u.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),y.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):(y.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===u.OFFLINE&&this.updateUserState(A,u.ONLINE,"heartbeat"))}getStats(){let A=0,I=0,O=0,U=0;for(let E of this.users.values())switch(E.state){case u.ONLINE:A++;break;case u.AWAY:I++;break;case u.BUSY:O++;break;case u.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!==u.OFFLINE&&O.isHeartbeatStale(this.options.offlineTimeout)?(y.debug("Heartbeat stale, marking offline",{userId:I}),this.updateUserState(I,u.OFFLINE,"heartbeat_timeout")):O.state===u.ONLINE&&A-O.lastActivity>this.options.idleTimeout&&this.updateUserState(I,u.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){y.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={},y.info("PresenceManager destroyed")}};function l4(N={}){return new N1(N)}function h4(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 k=S("ack"),p={PENDING:"pending",ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",FAILED:"failed",CANCELLED:"cancelled"},dA={ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",RETRY:"retry",FAILED:"failed",CANCELLED:"cancelled",LATENCY_UPDATED:"latency_updated"},J4={timeout:1e4,maxRetries:3,retryBaseDelay:1e3,retryMaxDelay:3e4,exponentialBackoff:!0,cleanupInterval:6e4,maxAckAge:3e5,trackLatency:!0},v1=class{constructor(A,I){this.messageId=A,this.state=p.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=eA(),this._setTimeout(),k.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=p.FAILED,this.deferred.reject(new Error(`Max retries (${this.maxRetries}) exceeded for message ${this.messageId}`)),k.warn("Message failed permanently",{messageId:this.messageId,attempts:this.attempts})):(this.state=p.TIMEOUT,this._scheduleRetry())}_scheduleRetry(){let A=oA(this.attempts-1,{baseDelay:this.metadata.retryBaseDelay||1e3,maxDelay:this.metadata.retryMaxDelay||3e4,jitter:!0});k.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===p.PENDING||this.state===p.TIMEOUT){this.state=p.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}),k.debug("Message acknowledged",{messageId:this.messageId,latency:I,attempts:this.attempts+1})}}cancel(A="Cancelled"){this.state=p.CANCELLED,this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout),this.deferred.reject(new Error(A)),k.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===p.ACKNOWLEDGED?Date.now()-this.ackReceivedAt>A:this.state===p.FAILED||this.state===p.CANCELLED?Date.now()-this.lastAttempt>A:!1}},kA=class{constructor(A={}){this.options={...J4,...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(),k.info("AckManager created",this.options)}track(A,I,O={}){if(this.pending.has(A))return k.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 v1(A,U);this.pending.set(A,E),this.stats.totalTracked++;try{I(A)}catch(K){k.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){k.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=[],k.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(dA.LATENCY_UPDATED,{latency:I.latency,avgLatency:this.stats.totalLatency/this.stats.acknowledged}))),this.pending.delete(A),this.completed.set(A,O),this._emit(dA.ACKNOWLEDGED,{messageId:A,attempts:I.attempts,latency:I.latency}))}_handleFailure(A,I){let O=this.pending.get(A);O&&(O.state===p.FAILED?(this.stats.failed++,this._emit(dA.FAILED,{messageId:A,error:I.message})):O.state===p.TIMEOUT?(this.stats.timedOut++,this.stats.retries+=O.attempts,this._emit(dA.TIMEOUT,{messageId:A,attempt:O.attempts})):O.state===p.CANCELLED&&(this.stats.cancelled++,this._emit(dA.CANCELLED,{messageId:A,reason:I.message})),(O.state===p.FAILED||O.state===p.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&&k.debug("Cleaned up old ack entries",{cleaned:A})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){k.error(`Error in ${A} listener:`,E)}})}destroy(){this.cleanupInterval&&clearInterval(this.cleanupInterval),this.reset(),this.listeners.clear(),k.info("AckManager destroyed")}};function d4(N={}){return new kA(N)}function u4(N,A,I={}){return new kA(I).track(N,A,I)}var h=S("queue"),NA={PENDING:"pending",PROCESSING:"processing",SENT:"sent",FAILED:"failed",DISCARDED:"discarded"},WA={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"},LA={CRITICAL:0,HIGH:1,NORMAL:2,LOW:3},V1={maxSize:1e3,maxAge:10080*60*1e3,autoProcess:!0,batchSize:10,batchDelay:100,maxRetries:5,preserveOrder:!0,dropOldestWhenFull:!0},y1=class N{constructor(A,I={}){this.id=I.id||b("q"),this.data=A,this.priority=I.priority||LA.NORMAL,this.state=NA.PENDING,this.createdAt=Date.now(),this.updatedAt=this.createdAt,this.retries=I.retries||0,this.maxRetries=I.maxRetries||V1.maxRetries,this.ttl=I.ttl||V1.maxAge,this.metadata=I.metadata||{},this.error=null,this.size=jA(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 QA(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}},U1=class{constructor(A={}){this.options={...V1,...A},this.items=new Map,this.pendingIds=[],this.priorityBuckets={[LA.CRITICAL]:new Set,[LA.HIGH]:new Set,[LA.NORMAL]:new Set,[LA.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(WA.QUEUE_FULL,{size:this.items.size}),new Error("Queue is full");let O=new y1(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(WA.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(WA.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(WA.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(WA.PROCESSING_STOPPED,{remaining:this.items.size}),this.isEmpty()&&this._emit(WA.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(WA.QUEUE_EMPTIED)}retryFailed(A){let I=0;for(let O of this.items.values())O.state===NA.FAILED&&(O.setState(NA.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(NA.PROCESSING),await this.processor(this._toPublicItem(E))?(this.remove(E.id),I++,this.stats.totalProcessed++,this._emit(WA.ITEM_STATE_CHANGED,{id:E.id,state:NA.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=[LA.CRITICAL,LA.HIGH,LA.NORMAL,LA.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===NA.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(NA.DISCARDED,I),this.remove(A.id),this.stats.totalDiscarded++,h.warn("Item discarded (max retries)",{id:A.id,retries:A.retries})):(A.setState(NA.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(NA.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(NA.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 F1(N={}){return new U1(N)}var i=S("storage"),Q={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"},Z4={dbName:"websocket_queue",storeName:"messages",dbVersion:1,maxItems:1e4,maxSize:5*1024*1024,autoInit:!0,storageType:null},x1=class{constructor(A={}){this.options={...Z4,...A},this.browser=g(),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(Q.INITIALIZED,{type:this.storageType})}catch(A){throw i.error("Storage initialization failed:",A),this._emit(Q.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(Q.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(Q.ITEM_STORED,{key:A,size:O})}catch(O){throw this.stats.errors++,i.error("Failed to store item:",O),this._emit(Q.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(Q.ITEM_RETRIEVED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to retrieve item:",I),this._emit(Q.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(Q.ITEM_DELETED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to remove item:",I),this._emit(Q.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(Q.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(Q.CLEARED)}catch(A){this.stats.errors++,i.error("Failed to clear storage:",A),this._emit(Q.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 b1(N={}){return new x1(N)}var F=S("retry"),EA={EXPONENTIAL:"exponential",LINEAR:"linear",FIXED:"fixed",FIBONACCI:"fibonacci",IMMEDIATE:"immediate"},aA={ALL:"all",NETWORK:"network",SERVER:"server",TIMEOUT:"timeout",CUSTOM:"custom"},YA={BEFORE_RETRY:"before_retry",AFTER_RETRY:"after_retry",MAX_RETRIES_REACHED:"max_retries_reached",CANCELLED:"cancelled",CIRCUIT_OPENED:"circuit_opened",CIRCUIT_CLOSED:"circuit_closed"},UA={CLOSED:"closed",OPEN:"open",HALF_OPEN:"half_open"},W2={maxAttempts:5,initialDelay:1e3,maxDelay:3e4,strategy:EA.EXPONENTIAL,factor:2,jitter:!0,retryCondition:aA.ALL,customCondition:null,circuitBreaker:{enabled:!0,failureThreshold:5,openTimeout:3e4,successThreshold:2},resetOnSuccess:!0},_1=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=eA(),this.results=[],this.errors=[],F.debug("Retry context created",{maxAttempts:I.maxAttempts,strategy:I.strategy})}getNextDelay(){if(this.attempt===0)return 0;switch(this.options.strategy){case EA.EXPONENTIAL:return this._exponentialDelay();case EA.LINEAR:return this._linearDelay();case EA.FIBONACCI:return this._fibonacciDelay();case EA.FIXED:return this.options.initialDelay;case EA.IMMEDIATE:return 0;default:return this._exponentialDelay()}}_exponentialDelay(){return oA(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 aA.ALL:return!0;case aA.NETWORK:return this._isNetworkError(A);case aA.SERVER:return this._isServerError(A);case aA.TIMEOUT:return this._isTimeoutError(A);case aA.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}}},k1=class{constructor(A){this.options=A,this.state=UA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,this.lastFailure=null,F.debug("Circuit breaker created",A)}isClosed(){return this.state===UA.CLOSED}isOpen(){return this.state===UA.OPEN}isHalfOpen(){return this.state===UA.HALF_OPEN}recordSuccess(){this.successCount++,this.failureCount=0,this.state===UA.HALF_OPEN&&this.successCount>=this.options.successThreshold&&this._close()}recordFailure(A){this.lastFailure=A,this.failureCount++,this.successCount=0,this.state===UA.CLOSED?this.failureCount>=this.options.failureThreshold&&this._open():this.state===UA.HALF_OPEN&&this._open()}checkHalfOpen(){return this.state===UA.OPEN&&this.openTime&&Date.now()-this.openTime>=this.options.openTimeout?(this._halfOpen(),!0):!1}_open(){this.state=UA.OPEN,this.openTime=Date.now(),this.successCount=0,F.warn("Circuit opened",{failures:this.failureCount,timeout:this.options.openTimeout})}_close(){this.state=UA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,F.info("Circuit closed")}_halfOpen(){this.state=UA.HALF_OPEN,this.successCount=0,F.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}}},PA=class{constructor(A={}){this.options=this._mergeOptions(A),this.circuitBreaker=this.options.circuitBreaker.enabled?new k1(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,F.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(YA.CIRCUIT_HALF_OPEN);else{let B=new Error("Circuit breaker is open");throw this._emit(YA.CIRCUIT_OPENED,{error:B}),B}let U=new _1(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(YA.CIRCUIT_OPENED,{error:B}))),this.stats.failedExecutions++,B}finally{this.contexts.delete(E)}}async _executeWithRetry(A){for(;;){A.attempt++;try{F.debug(`Attempt ${A.attempt}`,A.metadata);let I=await A.operation();return A.recordResult(I),A.attempt>1&&F.info(`Succeeded after ${A.attempt} attempts`),this.options.resetOnSuccess,I}catch(I){if(A.recordError(I),F.debug(`Attempt ${A.attempt} failed:`,I.message),!A.shouldRetry(I))throw this._emit(YA.MAX_RETRIES_REACHED,{attempts:A.attempt,error:I.message}),I;let O=A.getNextDelay();F.debug(`Retrying in ${O}ms (attempt ${A.attempt}/${A.options.maxAttempts})`),this.stats.totalRetries++,this._emit(YA.BEFORE_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts,delay:O,error:I.message}),O>0&&await vA(O),this._emit(YA.AFTER_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts})}}}cancelAll(A="Cancelled by user"){this.contexts.forEach((I,O)=>{I.cancelled=!0,this._emit(YA.CANCELLED,{id:O,reason:A})}),this.contexts.clear(),F.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},F.info("Retry stats reset")}resetCircuitBreaker(){this.circuitBreaker&&(this.circuitBreaker._close(),this._emit(YA.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={...W2,...A};return A.circuitBreaker&&(I.circuitBreaker={...W2.circuitBreaker,...A.circuitBreaker}),I}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){F.error(`Error in ${A} listener:`,E)}})}destroy(){this.cancelAll("Manager destroyed"),this.listeners.clear(),F.info("RetryManager destroyed")}};function q1(N={}){return new PA(N)}async function m4(N,A={}){return new PA({maxAttempts:2,...A}).execute(N)}async function p4(N,A=5){return new PA({maxAttempts:A,strategy:EA.EXPONENTIAL}).execute(N)}async function g4(N,A=1e3,I=5){return new PA({maxAttempts:I,strategy:EA.FIXED,initialDelay:A}).execute(N)}var C=S("recovery"),rA={IDLE:"idle",SCANNING:"scanning",RESTORING:"restoring",COMPLETED:"completed",FAILED:"failed"},SA={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"},uA={FULL:"full",MINIMAL:"minimal",VERIFIED:"verified",CONNECTION_ONLY:"connection_only"},f4={strategy:uA.FULL,maxStateAge:10080*60*1e3,autoRecover:!0,enableCheckpoints:!0,checkpointInterval:300*1e3,maxCheckpoints:5,verifyWithServer:!0,recoveryTimeout:3e4,replayQueue:!0,restoreSubscriptions:!0,restorePresence:!0},z1=class N{constructor(A,I={}){this.id=b("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}},E1=class{constructor(A={}){this.options={...f4,...A},this.state=rA.IDLE,this.sessionId=this._generateSessionId(),this.currentState=null,this.storage=b1({dbName:"websocket_recovery",storeName:"state",autoInit:!0}),this.queue=F1({maxSize:1e3,autoProcess:!1}),this.retry=q1({maxAttempts:3,strategy:EA.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),C.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++,C.debug("State saved",{timestamp:O.timestamp,metadata:I}),this._emit(SA.STATE_SAVED,{timestamp:O.timestamp,metadata:I}),this.options.enableCheckpoints&&await this._createCheckpoint(A,I)}catch(U){throw C.error("Failed to save state:",U),U}}async recover(){if(this.state===rA.RECOVERING)return C.warn("Recovery already in progress"),null;this.state=rA.SCANNING,this.stats.recoveriesAttempted++,this._emit(SA.RECOVERY_STARTED,{sessionId:this.sessionId,strategy:this.options.strategy});let A=Date.now();try{let I=await this._findRecoverableState();if(!I)return C.info("No recoverable state found"),this.state=rA.IDLE,null;this.state=rA.RESTORING;let O;switch(this.options.strategy){case uA.FULL:O=await this._fullRecovery(I);break;case uA.MINIMAL:O=await this._minimalRecovery(I);break;case uA.VERIFIED:O=await this._verifiedRecovery(I);break;case uA.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=rA.COMPLETED,C.info("Recovery completed",{duration:this.stats.lastRecoveryDuration,hasState:!!O}),this._emit(SA.RECOVERY_COMPLETED,{duration:this.stats.lastRecoveryDuration,state:O}),O}catch(I){return this.state=rA.FAILED,this.stats.recoveriesFailed++,C.error("Recovery failed:",I),this._emit(SA.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?(C.info("Restoring from checkpoint",{id:A,timestamp:O.timestamp}),O.state):(C.warn("Checkpoint not found",{checkpointId:A}),null)}async clear(){await this.storage.clear(),this.checkpoints=[],this.currentState=null,C.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=b("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 C.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 C.debug("Found checkpoint",{timestamp:U.timestamp}),{type:"checkpoint",state:U.state}}return null}catch(A){return C.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 C.info("Performing full recovery",{type:A.type,timestamp:I.timestamp}),this._emit(SA.RECOVERY_PROGRESS,{phase:"full",percent:50}),I.state}async _minimalRecovery(A){let I=A.state;C.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(SA.RECOVERY_PROGRESS,{phase:"minimal",percent:75}),O}async _verifiedRecovery(A){let I=A.state;return C.info("Performing verified recovery"),I.state}async _connectionOnlyRecovery(A){let I=A.state;return C.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){C.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(SA.RECOVERY_PROGRESS,{phase:"replay",count:A.length})}}async _createCheckpoint(A,I){try{let O=new z1(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++,C.debug("Checkpoint created",{id:O.id,size:O.size}),this._emit(SA.CHECKPOINT_CREATED,{id:O.id,timestamp:O.timestamp,size:O.size})}catch(O){C.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){C.error(`Error in ${A} listener:`,E)}})}destroy(){this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.storage.destroy(),this.queue.destroy(),this.listeners.clear(),C.info("RecoveryManager destroyed")}};function w4(N={}){return new E1(N)}function v4(N,A={}){let I=b1({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 V4=B2;export{dA as AckEvent,kA as AckManager,p as AckState,c4 as ActivityType,W1 as AppLoader,T1 as CameraModal,z as ConnectionEvent,d as ConnectionState,G1 as DataExporter,XA as DeliveryGuarantee,MA as DisconnectReason,RA as HeartbeatEvent,v as HeartbeatState,a as LOG_LEVELS,HA as Locations,sA as MessagePriority,IA as MessageType,bA as Namespace,CA as NamespaceEvent,A1 as NamespaceManager,hA as Packet,o as PresenceEvent,N1 as PresenceManager,u as PresenceState,WA as QueueEvent,NA as QueueItemState,U1 as QueueManager,LA as QueuePriority,SA as RecoveryEvent,E1 as RecoveryManager,rA as RecoveryState,uA as RecoveryStrategy,aA as RetryCondition,YA as RetryEvent,PA as RetryManager,EA as RetryStrategy,_A as Room,j as RoomEvent,O1 as RoomManager,I1 as RoomType,T2 as RoomVisibility,K1 as Router,B1 as SmartInput,e as TransportEvent,D as TransportState,m as TransportType,V4 as WebSocketClient,z2 as abbreviateNumber,oA as calculateBackoff,L4 as configureLogger,d4 as createAckManager,n4 as createCommand,c1 as createConnection,i4 as createEvent,a1 as createHeartbeat,S as createLogger,r4 as createMessage,o4 as createNamespaces,v4 as createPersistentState,l4 as createPresenceManager,F1 as createQueue,w4 as createRecovery,q1 as createRetry,P4 as createRoom,a4 as createRoomManager,u1 as createTransport,h4 as createTypingIndicator,mA as dependencyManager,k2 as formatCurrency,j2 as formatNumberInput,q2 as formatPercentage,b as generateId,S4 as generateUUID,A4 as getAddress,g as getBrowserCapabilities,P2 as getCurrentDate,d2 as getDateAgo,J2 as getDateRange,u2 as getDateTomorrow,c2 as getDateYesterday,m2 as getDaysBetween,h2 as getEndDate,p2 as getFutureDate,Z2 as getFutureDateRange,Y4 as getNetworkInfo,BA as getNetworkMonitor,$2 as getNumericValue,o2 as getQueueStatus,Q2 as getRawInputValue,a2 as getRelativeTime,M4 as getWatcherStats,C2 as humanizeDate,y3 as icons,n2 as initRequestHandler,r2 as inputHandlers,H2 as interceptors,R4 as isBeingWatched,g2 as isFutureDate,W4 as isMobileDevice,o1 as isOnline,f2 as isPastDate,t4 as onNetworkChange,p4 as retryExponential,g4 as retryFixed,m4 as retryOnce,qA as roundToNearest,i2 as sendRequest,X2 as setInputValue,vA as sleep,U2 as stopWatchingAll,T4 as supportsWebSocket,l2 as timeAgo,I2 as unformatNumber,nA as validateDate,$1 as validateFieldByType,t2 as validateMandatoryFields,j1 as validateName,D2 as validateNameField,s2 as validatePhoneField,Q1 as validatePhoneNumber,wA as validateUrl,K4 as watchAll,O2 as watchElement,u4 as withAck};
1491
1491
  //# sourceMappingURL=js_aide.esm.js.map