@vicaniddouglas/js_aide 1.5.2 → 1.5.3
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.
package/dist/js_aide.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var e1=Object.defineProperty;var sI=Object.getOwnPropertyDescriptor;var rI=Object.getOwnPropertyNames;var iI=Object.prototype.hasOwnProperty;var nI=(N,A)=>{for(var I in A)e1(N,I,{get:A[I],enumerable:!0})},HI=(N,A,I,O)=>{if(A&&typeof A=="object"||typeof A=="function")for(let U of rI(A))!iI.call(N,U)&&U!==I&&e1(N,U,{get:()=>A[U],enumerable:!(O=sI(A,U))||O.enumerable});return N};var oI=N=>HI(e1({},"__esModule",{value:!0}),N);var z4={};nI(z4,{AckEvent:()=>lA,AckManager:()=>wA,AckState:()=>m,ActivityType:()=>KI,AppLoader:()=>B1,CameraModal:()=>E1,ConnectionEvent:()=>_,ConnectionState:()=>J,DataExporter:()=>U1,DeliveryGuarantee:()=>zA,DisconnectReason:()=>KA,HeartbeatEvent:()=>EA,HeartbeatState:()=>w,LOG_LEVELS:()=>
|
|
1
|
+
var e1=Object.defineProperty;var sI=Object.getOwnPropertyDescriptor;var rI=Object.getOwnPropertyNames;var iI=Object.prototype.hasOwnProperty;var nI=(N,A)=>{for(var I in A)e1(N,I,{get:A[I],enumerable:!0})},HI=(N,A,I,O)=>{if(A&&typeof A=="object"||typeof A=="function")for(let U of rI(A))!iI.call(N,U)&&U!==I&&e1(N,U,{get:()=>A[U],enumerable:!(O=sI(A,U))||O.enumerable});return N};var oI=N=>HI(e1({},"__esModule",{value:!0}),N);var z4={};nI(z4,{AckEvent:()=>lA,AckManager:()=>wA,AckState:()=>m,ActivityType:()=>KI,AppLoader:()=>B1,CameraModal:()=>E1,ConnectionEvent:()=>_,ConnectionState:()=>J,DataExporter:()=>U1,DeliveryGuarantee:()=>zA,DisconnectReason:()=>KA,HeartbeatEvent:()=>EA,HeartbeatState:()=>w,LOG_LEVELS:()=>a,Locations:()=>rA,MessagePriority:()=>tA,MessageType:()=>j,Namespace:()=>gA,NamespaceEvent:()=>oA,NamespaceManager:()=>$A,Packet:()=>cA,PresenceEvent:()=>C,PresenceManager:()=>XA,PresenceState:()=>d,QueueEvent:()=>GA,QueueItemState:()=>X,QueueManager:()=>A1,QueuePriority:()=>RA,RecoveryEvent:()=>WA,RecoveryManager:()=>I1,RecoveryState:()=>eA,RecoveryStrategy:()=>hA,RetryCondition:()=>CA,RetryEvent:()=>TA,RetryManager:()=>aA,RetryStrategy:()=>IA,Room:()=>fA,RoomEvent:()=>q,RoomManager:()=>QA,RoomType:()=>jA,RoomVisibility:()=>k1,Router:()=>O1,SmartInput:()=>N1,TransportEvent:()=>e,TransportState:()=>D,TransportType:()=>Z,WebSocketClient:()=>eI,abbreviateNumber:()=>h2,calculateBackoff:()=>iA,configureLogger:()=>y2,createAckManager:()=>MI,createCommand:()=>AI,createConnection:()=>W1,createEvent:()=>X2,createHeartbeat:()=>T1,createLogger:()=>S,createMessage:()=>Q2,createNamespaces:()=>NI,createPersistentState:()=>tI,createPresenceManager:()=>BI,createQueue:()=>S1,createRecovery:()=>SI,createRetry:()=>t1,createRoom:()=>EI,createRoomManager:()=>UI,createTransport:()=>Y1,createTypingIndicator:()=>RI,dependencyManager:()=>JA,formatCurrency:()=>c2,formatNumberInput:()=>d2,formatPercentage:()=>l2,generateId:()=>V,generateUUID:()=>_2,getAddress:()=>p2,getBrowserCapabilities:()=>p,getCurrentDate:()=>t2,getDateAgo:()=>i2,getDateRange:()=>r2,getDateTomorrow:()=>n2,getDateYesterday:()=>e2,getDaysBetween:()=>o2,getEndDate:()=>s2,getFutureDate:()=>C2,getFutureDateRange:()=>H2,getNetworkInfo:()=>b2,getNetworkMonitor:()=>UA,getNumericValue:()=>J2,getQueueStatus:()=>W2,getRawInputValue:()=>u2,getRelativeTime:()=>S2,getWatcherStats:()=>v2,humanizeDate:()=>Y2,icons:()=>m2,initRequestHandler:()=>G2,inputHandlers:()=>R2,interceptors:()=>T2,isBeingWatched:()=>w2,isFutureDate:()=>a2,isMobileDevice:()=>x2,isOnline:()=>G1,isPastDate:()=>P2,onNetworkChange:()=>q2,retryExponential:()=>WI,retryFixed:()=>YI,retryOnce:()=>TI,roundToNearest:()=>VA,sendRequest:()=>L2,setInputValue:()=>Z2,sleep:()=>mA,stopWatchingAll:()=>P1,supportsWebSocket:()=>F2,timeAgo:()=>D2,unformatNumber:()=>o1,validateDate:()=>sA,validateFieldByType:()=>D1,validateMandatoryFields:()=>U2,validateName:()=>s1,validateNameField:()=>K2,validatePhoneField:()=>B2,validatePhoneNumber:()=>r1,validateUrl:()=>ZA,watchAll:()=>g2,watchElement:()=>a1,withAck:()=>LI});module.exports=oI(z4);var O1=class{constructor(A,I="/"){this.validateRoutes(A,I),this.compiledRoutes=Object.entries(A).map(([O,U])=>({path:O,viewId:U,regex:this.pathToRegex(O)})),this.routes=A,this.defaultPath=I,this.currentViewId=null,this.beforeNavigate=null,this.isInitialized=!1,this.handlePopState=this.handlePopState.bind(this),this.handleInitialLoad=this.handleInitialLoad.bind(this),this.handleLinkClick=this.handleLinkClick.bind(this),this.initializeEventListeners()}pathToRegex(A){return new RegExp("^"+A.replace(/\//g,"\\/").replace(/:\w+/g,"([^\\/]+)")+"$")}matchRoute(A){for(let I of this.compiledRoutes){let O=A.match(I.regex);if(O){let U=this.extractParams(I,O);return{...I,params:U}}}return null}extractParams(A,I){let O={};return[...A.path.matchAll(/:(\w+)/g)].map(E=>E[1]).forEach((E,K)=>{O[E]=I[K+1]}),O}validateRoutes(A,I){if(!A||typeof A!="object"||Object.keys(A).length===0)throw new Error('Router: "routes" must be a non-empty object.');if(!A[I])throw new Error('Router: "defaultPath" must be a valid key in the routes object.')}initializeEventListeners(){window.addEventListener("popstate",this.handlePopState),window.addEventListener("click",this.handleLinkClick),document.readyState==="loading"?window.addEventListener("DOMContentLoaded",this.handleInitialLoad):this.handleInitialLoad()}handleLinkClick(A){let I=A.target.closest("a");if(I&&I.target!=="_blank"&&I.hostname===window.location.hostname&&!A.metaKey&&!A.ctrlKey&&!A.shiftKey&&!A.altKey){let O=I.pathname+I.search+I.hash;this.matchRoute(I.pathname)&&(A.preventDefault(),this.navigate(O))}}async navigate(A,I={}){let{replace:O=!1}=I,U=new URL(A,window.location.origin),E=U.pathname,K=this.matchRoute(E);if(!K)return console.error(`Router: Attempted to navigate to unknown route: "${E}".`),!1;if(this.beforeNavigate){console.log("entered b4 navigate");let R=await this.beforeNavigate(A,{from:this.getPathFromViewId(this.currentViewId),params:K.params,query:Object.fromEntries(U.searchParams),hash:U.hash});if(R===!1)return console.log(`Router: Navigation to "${A}" was blocked by route guard.`),!1;if(typeof R=="string")return this.navigate(R,{replace:!0})}return history[O?"replaceState":"pushState"]({path:A},"",A),await this.showView(A),this.emit("navigated",{path:A,pathname:E,params:K.params,query:Object.fromEntries(U.searchParams),hash:U.hash,previousPath:this.getPathFromViewId(this.currentViewId),replace:O}),!0}getPathFromViewId(A){if(!A)return null;let I=this.compiledRoutes.find(O=>O.viewId===A);return I?I.path:null}handleInitialLoad(){if(this.isInitialized)return;let A=window.location.pathname+window.location.search+window.location.hash;this.showView(A),this.isInitialized=!0,this.emit("initialized",{path:A})}handlePopState(A){var U;let I=window.location.pathname+window.location.search+window.location.hash,O=((U=A.state)==null?void 0:U.path)||I;this.showView(O),this.emit("popstate",{path:O,state:A.state})}async showView(A){let I=null;try{let O=new URL(A,window.location.origin),U=O.pathname;I=this.matchRoute(U),I||(console.warn(`Router: No match for "${U}", falling back to default.`),I=this.matchRoute(this.defaultPath));let E=I.viewId;if(this.currentViewId===E){this.emit("routeUpdate",{path:A,params:I.params,query:Object.fromEntries(O.searchParams),hash:O.hash});return}this.emit("beforeViewChange",{from:this.currentViewId,viewId:E,fromPath:this.getPathFromViewId(this.currentViewId),toPath:I.path,params:I.params}),this.currentViewId&&await this.hideView(this.currentViewId);let K=document.getElementById(E);if(K)K.beforeEnter&&typeof K.beforeEnter=="function"&&await K.beforeEnter(I.params),K.style.display="block",K.classList.add("router-view-active"),K.classList.remove("router-view-hidden"),this.currentViewId=E,this.emit("afterViewChange",{viewId:E,path:A,params:I.params,viewElement:K});else throw new Error(`View element with ID "${E}" not found.`)}catch(O){console.error(`Router: Failed to show view for path "${A}":`,O);let U=this.matchRoute(this.defaultPath);(I==null?void 0:I.viewId)!==(U==null?void 0:U.viewId)&&(console.log("Router: Falling back to default view"),await this.showView(this.defaultPath)),this.emit("error",{error:O,path:A})}}async hideView(A){let I=document.getElementById(A);I&&(this.emit("beforeViewHide",{viewId:A,viewElement:I}),I.beforeLeave&&typeof I.beforeLeave=="function"&&await I.beforeLeave(),I.style.display="none",I.classList.add("router-view-hidden"),I.classList.remove("router-view-active"),this.emit("afterViewHide",{viewId:A,viewElement:I}))}async hideAllViews(){let A=this.compiledRoutes.map(I=>this.hideView(I.viewId));await Promise.all(A)}emit(A,I={}){let O=new CustomEvent(`router:${A}`,{detail:{...I,timestamp:Date.now()}});window.dispatchEvent(O)}getCurrentRoute(){return{path:this.getPathFromViewId(this.currentViewId),viewId:this.currentViewId,viewElement:this.currentViewId?document.getElementById(this.currentViewId):null}}destroy(){window.removeEventListener("popstate",this.handlePopState),window.removeEventListener("DOMContentLoaded",this.handleInitialLoad),window.removeEventListener("click",this.handleLinkClick),this.isInitialized=!1,this.currentViewId=null,this.emit("destroyed")}async goToDefault(A={}){return await this.navigate(this.defaultPath,A)}hasRoute(A){return!!this.routes[A]}},CI=`
|
|
2
2
|
.router-view-hidden { display: none; }
|
|
3
3
|
.router-view-active { display: block; }
|
|
4
|
-
`;if(!document.querySelector("#router-default-styles")){let N=document.createElement("style");N.id="router-default-styles",N.textContent=CI,document.head.appendChild(N)}function U2(N){let A=!0;return Array.from(N).forEach(O=>{O.classList.remove("error-border");let U=O.parentElement,E=U==null?void 0:U.querySelector(".error-message");if(E&&E.remove(),!D1(O)&&(A=!1,O.classList.add("error-border"),U)){let B=document.createElement("small");B.textContent=aI(O),B.className="error-message",U.appendChild(B)}}),A}function D1(N){var A;if(N instanceof HTMLInputElement){let I=N;switch(I.type){case"checkbox":return I.checked;case"radio":{let O=I.name;return O?document.querySelector(`input[type="radio"][name="${O}"]:checked`)!==null:!1}case"file":return!!((A=I.files)!=null&&A.length);default:return!!I.value.trim()}}if(N instanceof HTMLTextAreaElement)return!!N.value.trim();if(N instanceof HTMLSelectElement){let I=N;return I.multiple?Array.from(I.selectedOptions).length>0:!!I.value}return!0}function aI(N){if(N instanceof HTMLInputElement)switch(N.type){case"checkbox":return"This checkbox must be checked";case"radio":return"Please select an option";case"file":return"Please select a file";default:return"This field is required"}return N instanceof HTMLSelectElement?N.multiple?"Please select at least one option":"Please select an option":"This field is required"}function s1(N,A={}){let{minLength:I=2,maxLength:O=100,allowNumbers:U=!1,allowSpecialChars:E=!0}=A;if(!N||typeof N!="string")return{isValid:!1,error:"Name is required and must be a string"};let K=N.trim();if(K.length===0)return{isValid:!1,error:"Name cannot be empty"};if(K.length<I)return{isValid:!1,error:`Name must be at least ${I} characters long`};if(K.length>O)return{isValid:!1,error:`Name cannot exceed ${O} characters`};for(let R of K){let M=R.charCodeAt(0),L=M>=65&&M<=90||M>=97&&M<=122,G=U&&M>=48&&M<=57;if(!(L||G||E&&(M===32||M===45||M===39)))return{isValid:!1,error:`Name contains invalid character: '${R}'`}}let B=!1;for(let R of K){let M=R.charCodeAt(0),L=M===32||M===45||M===39;if(L&&B)return{isValid:!1,error:"Name cannot have consecutive special characters"};B=L}return{isValid:!0,error:null,cleanedName:K}}function r1(N,A={}){let{strict:I=!0}=A;if(!N||typeof N!="string")return{isValid:!1,error:"Phone number is required and must be a string"};let O="";for(let K of N){let B=K.charCodeAt(0);B>=48&&B<=57&&(O+=K)}if(O.length!==10)return{isValid:!1,error:`Phone number must be 10 digits long (found ${O.length})`};for(let K=0;K<O.length;K++){let R=O[K].charCodeAt(0);if(R<48||R>57)return{isValid:!1,error:"Phone number can only contain digits"}}let U=["077","075","070","078","076","074"],E=O.substring(0,3);return U.includes(E)?I&&N.length!==10&&N.length!==O.length?{isValid:!1,error:"Phone number should contain only digits without spaces or other characters"}:{isValid:!0,error:null,cleanedNumber:O,prefix:E}:{isValid:!1,error:`Phone number must start with ${U.join(", ")}`}}function E2(N,A){N.classList.remove("error-border");let I=N.parentElement,O=I==null?void 0:I.querySelector(".error-message");if(O&&O.remove(),!A.isValid){if(N.classList.add("error-border"),I){let U=document.createElement("small");U.textContent=A.error,U.className="error-message",I.appendChild(U)}return!1}return!0}function K2(N,A={}){let I=s1(N.value,A);return E2(N,I)}function B2(N,A={}){let I=r1(N.value,A);return E2(N,I)}var R2={allowOnlyNumbers(N,A={}){let{allowDecimals:I=!0,maxDecimals:O=2,allowNegative:U=!1}=A;N.addEventListener("input",function(){let E=N.value,K="",B=0,R=!1,M=!1;for(let[L,G]of Array.from(E).entries()){if(G==="-"&&L===0&&U&&!M){K+=G,M=!0;continue}if(G==="."&&I&&!R){K+=G,R=!0;continue}if(!isNaN(G)&&G!==" "){if(R&&B>=O)continue;R&&B++,K+=G}}N.value=K})},formatNumberInput(N,A={}){let{maxDecimalPlaces:I=2,allowNegative:O=!1}=A;N.addEventListener("input",function(){let U=this.selectionStart,E=this.value,K=this.value,B=!1;O&&K.startsWith("-")&&(B=!0,K=K.substring(1));let R=K.split("."),M=R[0],L=R[1]||"",G="";for(let r of M)!isNaN(r)&&r!==" "&&(G+=r);let T="";for(let[r,u]of Array.from(L).entries()){if(r>=I)break;!isNaN(u)&&u!==" "&&(T+=u)}let W="",t=0;for(let r=G.length-1;r>=0;r--)W=G[r]+W,t++,t%3===0&&r!==0&&(W=","+W);W===""&&(W="0");let Y=B?"-"+W:W;T&&(Y+="."+T),this.value=Y;let
|
|
4
|
+
`;if(!document.querySelector("#router-default-styles")){let N=document.createElement("style");N.id="router-default-styles",N.textContent=CI,document.head.appendChild(N)}function U2(N){let A=!0;return Array.from(N).forEach(O=>{O.classList.remove("error-border");let U=O.parentElement,E=U==null?void 0:U.querySelector(".error-message");if(E&&E.remove(),!D1(O)&&(A=!1,O.classList.add("error-border"),U)){let B=document.createElement("small");B.textContent=aI(O),B.className="error-message",U.appendChild(B)}}),A}function D1(N){var A;if(N instanceof HTMLInputElement){let I=N;switch(I.type){case"checkbox":return I.checked;case"radio":{let O=I.name;return O?document.querySelector(`input[type="radio"][name="${O}"]:checked`)!==null:!1}case"file":return!!((A=I.files)!=null&&A.length);default:return!!I.value.trim()}}if(N instanceof HTMLTextAreaElement)return!!N.value.trim();if(N instanceof HTMLSelectElement){let I=N;return I.multiple?Array.from(I.selectedOptions).length>0:!!I.value}return!0}function aI(N){if(N instanceof HTMLInputElement)switch(N.type){case"checkbox":return"This checkbox must be checked";case"radio":return"Please select an option";case"file":return"Please select a file";default:return"This field is required"}return N instanceof HTMLSelectElement?N.multiple?"Please select at least one option":"Please select an option":"This field is required"}function s1(N,A={}){let{minLength:I=2,maxLength:O=100,allowNumbers:U=!1,allowSpecialChars:E=!0}=A;if(!N||typeof N!="string")return{isValid:!1,error:"Name is required and must be a string"};let K=N.trim();if(K.length===0)return{isValid:!1,error:"Name cannot be empty"};if(K.length<I)return{isValid:!1,error:`Name must be at least ${I} characters long`};if(K.length>O)return{isValid:!1,error:`Name cannot exceed ${O} characters`};for(let R of K){let M=R.charCodeAt(0),L=M>=65&&M<=90||M>=97&&M<=122,G=U&&M>=48&&M<=57;if(!(L||G||E&&(M===32||M===45||M===39)))return{isValid:!1,error:`Name contains invalid character: '${R}'`}}let B=!1;for(let R of K){let M=R.charCodeAt(0),L=M===32||M===45||M===39;if(L&&B)return{isValid:!1,error:"Name cannot have consecutive special characters"};B=L}return{isValid:!0,error:null,cleanedName:K}}function r1(N,A={}){let{strict:I=!0}=A;if(!N||typeof N!="string")return{isValid:!1,error:"Phone number is required and must be a string"};let O="";for(let K of N){let B=K.charCodeAt(0);B>=48&&B<=57&&(O+=K)}if(O.length!==10)return{isValid:!1,error:`Phone number must be 10 digits long (found ${O.length})`};for(let K=0;K<O.length;K++){let R=O[K].charCodeAt(0);if(R<48||R>57)return{isValid:!1,error:"Phone number can only contain digits"}}let U=["077","075","070","078","076","074"],E=O.substring(0,3);return U.includes(E)?I&&N.length!==10&&N.length!==O.length?{isValid:!1,error:"Phone number should contain only digits without spaces or other characters"}:{isValid:!0,error:null,cleanedNumber:O,prefix:E}:{isValid:!1,error:`Phone number must start with ${U.join(", ")}`}}function E2(N,A){N.classList.remove("error-border");let I=N.parentElement,O=I==null?void 0:I.querySelector(".error-message");if(O&&O.remove(),!A.isValid){if(N.classList.add("error-border"),I){let U=document.createElement("small");U.textContent=A.error,U.className="error-message",I.appendChild(U)}return!1}return!0}function K2(N,A={}){let I=s1(N.value,A);return E2(N,I)}function B2(N,A={}){let I=r1(N.value,A);return E2(N,I)}var R2={allowOnlyNumbers(N,A={}){let{allowDecimals:I=!0,maxDecimals:O=2,allowNegative:U=!1}=A;N.addEventListener("input",function(){let E=N.value,K="",B=0,R=!1,M=!1;for(let[L,G]of Array.from(E).entries()){if(G==="-"&&L===0&&U&&!M){K+=G,M=!0;continue}if(G==="."&&I&&!R){K+=G,R=!0;continue}if(!isNaN(G)&&G!==" "){if(R&&B>=O)continue;R&&B++,K+=G}}N.value=K})},formatNumberInput(N,A={}){let{maxDecimalPlaces:I=2,allowNegative:O=!1}=A;N.addEventListener("input",function(){let U=this.selectionStart,E=this.value,K=this.value,B=!1;O&&K.startsWith("-")&&(B=!0,K=K.substring(1));let R=K.split("."),M=R[0],L=R[1]||"",G="";for(let r of M)!isNaN(r)&&r!==" "&&(G+=r);let T="";for(let[r,u]of Array.from(L).entries()){if(r>=I)break;!isNaN(u)&&u!==" "&&(T+=u)}let W="",t=0;for(let r=G.length-1;r>=0;r--)W=G[r]+W,t++,t%3===0&&r!==0&&(W=","+W);W===""&&(W="0");let Y=B?"-"+W:W;T&&(Y+="."+T),this.value=Y;let i=Y.length-E.length,s=Math.max(0,U+i);this.setSelectionRange(s,s)})},provideOtherSelectOption(N,A={}){let{promptText:I="Enter custom option:",formatWithCommas:O=!1,validator:U=null}=A,E=prompt(I);if(E!==null&&E.trim()!==""){if(U&&typeof U=="function"){let B=U(E);if(B!==!0){alert(B||"Invalid input");return}}let K=document.createElement("option");if(K.value=E,O){let B="";for(let M=0;M<E.length;M++){let L=E[M];L!==","&&(B+=L)}let R=Number(B);K.text=!isNaN(R)&&B.trim()!==""?R.toLocaleString():E}else K.text=E;N.add(K),N.value=E}else N.selectedIndex=0},filterElementsByAnySelector(N,A,I=[],O={}){let{itemSelector:U=".record",caseSensitive:E=!1}=O;if(!I||I.length===0)throw new Error("No content selectors provided. Specify elements to search within.");N.addEventListener("input",function(){let K=E?this.value.trim():this.value.trim().toUpperCase(),B=A.querySelectorAll(U);for(let R=0;R<B.length;R++){let M=B[R];if(K===""){M.style.display="";continue}let L=!1;for(let G=0;G<I.length;G++){let T=I[G],W=M.querySelector(T);if(W){let t=W.textContent;if(E||(t=t.toUpperCase()),t.includes(K)){L=!0;break}}}M.style.display=L?"":"none"}})},characterCounter(N,A,I,O={}){let{showPercentage:U=!1,warningThreshold:E=10}=O,K=()=>{let B=N.value.length,R=I-B,M=Math.round(B/I*100),L;U?L=`${B}/${I} (${M}%)`:L=`${R} characters remaining`,A.textContent=L,R<0?(A.style.color="red",A.style.fontWeight="bold"):R<=E?(A.style.color="orange",A.style.fontWeight="bold"):(A.style.color="",A.style.fontWeight="")};N.addEventListener("input",K),K()}},N1=class N{constructor(){this.inputs={}}static get defaultCSS(){return`
|
|
5
5
|
/* \u2500\u2500 SmartInput default styles \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
6
6
|
Override any rule in your own stylesheet by targeting the same class.
|
|
7
7
|
Example: .smart-input { border-color: hotpink; }
|
|
@@ -96,7 +96,7 @@ var e1=Object.defineProperty;var sI=Object.getOwnPropertyDescriptor;var rI=Objec
|
|
|
96
96
|
color: #ef4444;
|
|
97
97
|
font-weight: 600;
|
|
98
98
|
}
|
|
99
|
-
`}static injectStyles(){if(document.querySelector("style[data-smart-input]"))return;let A=document.createElement("style");A.setAttribute("data-smart-input","");let I=document.head.firstChild;I?document.head.insertBefore(A,I):document.head.appendChild(A),A.textContent=N.defaultCSS}_createInputWrapper(A,I,O=[]){let U=document.createElement("div");U.className=["smart-input-wrapper",...O].join(" ");let E=document.createElement("label");return E.htmlFor=A,E.textContent=I,E.className="smart-input-label",U.appendChild(E),U}_mount(A,I){I.appendChild(A)}_makeHandle(A,I,O={}){return{element:A,getValue:O.getValue||(()=>A.value),setValue:O.setValue||(U=>{A.value=U}),clear:O.clear||(()=>{A.value=""}),destroy:O.destroy||(()=>{I.remove()})}}getInput(A){return this.inputs[A]||null}createNumberInput({id:A,labelText:I,container:O,placeholder:U="Enter numbers only",wrapperClasses:E=[],inputClasses:K=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let B=this._createInputWrapper(A,I,E),R=document.createElement("input");R.type="text",R.id=A,R.className=["smart-input","smart-input-number",...K].join(" "),R.placeholder=U,R.addEventListener("input",L=>{let G="";for(let T of L.target.value)"0123456789".includes(T)&&(G+=T);L.target.value=G}),B.appendChild(R),this._mount(B,O);let M=this._makeHandle(R,B);return this.inputs[A]=M,M}createFormattedNumberInput({id:A,labelText:I,container:O,placeholder:U="Enter amount (e.g., 1,234.56)",wrapperClasses:E=[],inputClasses:K=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let B=this._createInputWrapper(A,I,E),R=document.createElement("input");R.type="text",R.id=A,R.className=["smart-input","smart-input-formatted-number",...K].join(" "),R.placeholder=U;let M=G=>{let T="",W=!1;for(let r of G)"0123456789".includes(r)?T+=r:r==="."&&!W&&(T+=r,W=!0);let t=T.indexOf("."),Y=t>=0?T.substring(0,t):T,P=t>=0?T.substring(t):"",s="";if(Y.length>0){let r=Y.split("").reverse().join(""),u="";for(let c=0;c<r.length;c++)u+=r[c],(c+1)%3===0&&c+1!==r.length&&(u+=",");s=u.split("").reverse().join("")}return s+P};R.addEventListener("input",G=>{G.target.value=M(G.target.value)}),B.appendChild(R),this._mount(B,O);let L=this._makeHandle(R,B,{setValue:G=>{R.value=M(String(G))}});return this.inputs[A]=L,L}createSearchableInput({id:A,labelText:I,container:O,data:U=[],placeholder:E="Search...",wrapperClasses:K=[],inputClasses:B=[],dropdownClasses:R=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let M=this._createInputWrapper(A,I,["smart-input-searchable-wrapper",...K]),L=document.createElement("input");L.type="text",L.id=A,L.className=["smart-input","smart-input-searchable",...B].join(" "),L.placeholder=E;let G=document.createElement("ul");G.className=["smart-input-dropdown",...R].join(" ");let T=null,W=U,t=()=>G.classList.add("smart-input-dropdown-visible"),Y=()=>{G.classList.remove("smart-input-dropdown-visible"),L.setAttribute("data-value",T!=null?T:"")},P=u=>{let c=document.createDocumentFragment(),DA=u.toLowerCase(),PA=W.filter(OA=>OA.key.toLowerCase().includes(DA));if(PA.length>0){for(let OA of PA){let vA=document.createElement("li");vA.textContent=OA.key,vA.dataset.value=OA.value,vA.className="smart-input-dropdown-item",vA.addEventListener("mousedown",DI=>{DI.preventDefault(),L.value=OA.key,T=OA.value,Y(),L.focus()}),c.appendChild(vA)}G.replaceChildren(c),t()}else G.replaceChildren(),Y()};L.addEventListener("focus",()=>P(L.value)),L.addEventListener("input",()=>{T=null,P(L.value)}),L.addEventListener("blur",()=>{setTimeout(()=>{M.contains(document.activeElement)||Y()},150)});let s=new AbortController;document.addEventListener("click",u=>{M.contains(u.target)||Y()},{signal:s.signal}),M.appendChild(L),M.appendChild(G),this._mount(M,O);let r=this._makeHandle(L,M,{getValue:()=>T,setValue:({key:u,value:c})=>{L.value=u,T=c,L.setAttribute("data-value",c!=null?c:"")},clear:()=>{L.value="",T=null,L.removeAttribute("data-value"),Y()},destroy:()=>{s.abort(),M.remove()}});return r.setData=u=>{W=u,P(L.value)},this.inputs[A]=r,r}createLimitedTextInput({id:A,labelText:I,container:O,maxLength:U,allowedCharactersString:E="",placeholder:K="",wrapperClasses:B=[],inputClasses:R=[]}){if(!O)return console.error("SmartInput: container element is required"),null;if(!U)return console.error("SmartInput: maxLength is required for createLimitedTextInput"),null;let M=Math.max(1,Math.round(U*.1)),L=this._createInputWrapper(A,I,B),G=document.createElement("input");G.type="text",G.id=A,G.className=["smart-input","smart-input-limited",...R].join(" "),G.maxLength=U,G.placeholder=K||`Max ${U} characters`;let T=document.createElement("span");T.className="smart-input-char-count";let W=()=>{let Y=G.value.length,P=U-Y;T.textContent=`${Y} / ${U}`,T.classList.remove("smart-input-char-warn","smart-input-char-over"),P<0?T.classList.add("smart-input-char-over"):P<=M&&T.classList.add("smart-input-char-warn")};G.addEventListener("input",Y=>{if(E){let P="";for(let s of Y.target.value)E.includes(s)&&(P+=s);Y.target.value=P}W()}),W(),L.appendChild(G),L.appendChild(T),this._mount(L,O);let t=this._makeHandle(G,L,{setValue:Y=>{G.value=Y,W()},clear:()=>{G.value="",W()}});return this.inputs[A]=t,t}createAutoExpandingTextArea({id:A,labelText:I,container:O,placeholder:U="",minHeight:E=150,maxHeight:K=300,wrapperClasses:B=[],inputClasses:R=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let M=this._createInputWrapper(A,I,B),L=document.createElement("textarea");L.id=A,L.className=["smart-input","smart-input-textarea",...R].join(" "),L.placeholder=U,L.style.resize="none",L.style.overflowY="hidden",L.style.minHeight=`${E}px`;let G=()=>{L.style.height="auto";let W=L.scrollHeight,t=Math.min(Math.max(W,E),K);L.style.height=`${t}px`,W>K?L.style.overflowY="auto":L.style.overflowY="hidden"};L.addEventListener("input",G),M.appendChild(L),this._mount(M,O);let T=this._makeHandle(L,M,{setValue:W=>{L.value=W,G()},clear:()=>{L.value="",G()}});return setTimeout(G,0),this.inputs[A]=T,T}createSelectInput({id:A,labelText:I,container:O,optionsData:U=[],wrapperClasses:E=[],inputClasses:K=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let B=this._createInputWrapper(A,I,E),R=document.createElement("select");R.id=A,R.className=["smart-input","smart-input-select",...K].join(" ");for(let L of U){let G=document.createElement("option");G.value=L.value,G.textContent=L.key,R.appendChild(G)}B.appendChild(R),this._mount(B,O);let M=this._makeHandle(R,B,{getValue:()=>R.value,setValue:L=>{R.value=L},clear:()=>{R.selectedIndex=0}});return this.inputs[A]=M,M}};var v=(function(){let N={apiUrl:null,timeout:6e5,maxRetries:3,retryStrategy:"exponential",csrfToken:null,authToken:null,environment:"development",keys:{globalConfig:"APP_CONFIG",authToken:"auth_token",csrfToken:"csrf-token",csrfCookie:"XSRF-TOKEN"}};return{init(A={}){A.keys&&(N.keys={...N.keys,...A.keys}),window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1"?N.environment="development":N.environment="production";let I=N.keys.globalConfig;window[I]&&window[I].apiUrl&&(N.apiUrl=window[I].apiUrl,window[I].environment&&(N.environment=window[I].environment));let O=document.querySelector('meta[name="api-url"]');O&&(N.apiUrl=O.getAttribute("content")),Object.assign(N,A),this.validate()},validate(){!N.apiUrl&&N.environment==="production"&&console.warn("RequestHandler: API URL is missing in production environment.")},get:()=>N}})(),i1={getCsrfToken(){let N=v.get().keys;if(v.get().csrfToken)return v.get().csrfToken;let A=document.querySelector(`meta[name="${N.csrfToken}"]`);if(A)return A.getAttribute("content");let I=N.csrfCookie+"=",U=decodeURIComponent(document.cookie).split(";");for(let E=0;E<U.length;E++){let K=U[E].trim();if(K.indexOf(I)===0)return K.substring(I.length,K.length)}return null},getAuthToken(){let N=v.get().keys;return v.get().authToken?v.get().authToken:sessionStorage.getItem(N.authToken)||localStorage.getItem(N.authToken)},sanitizePayload(N){if(!N||typeof N!="object"||N instanceof FormData)return N;let A=JSON.parse(JSON.stringify(N)),I=O=>{for(let U in O)typeof O[U]=="string"?O[U]=O[U].replace(/<script\b[^>]*>([\s\S]*?)<\/script>/gim,"").replace(/javascript:/gim,""):typeof O[U]=="object"&&O[U]!==null&&I(O[U])};return I(A),A}},YA={request:[],response:[],error:[],addRequest(N,A){let I=Date.now()+Math.random();return this.request.push({id:I,onFulfilled:N,onRejected:A}),I},addResponse(N,A){let I=Date.now()+Math.random();return this.response.push({id:I,onFulfilled:N,onRejected:A}),I},clear(){this.request=[],this.response=[],this.error=[]}},M2=(function(){let N=[],A=0,I=3,O=()=>{if(A>=I||N.length===0)return;N.sort((E,K)=>K.priority-E.priority);let U=N.shift();A++,U.execute().finally(()=>{A--,O()})};return{add(U,E=0){return new Promise((K,B)=>{N.push({priority:E,execute:()=>U().then(K).catch(B)}),O()})},getStatus:()=>({active:A,pending:N.length}),clear:()=>{N.length=0}}})(),L2=async function(N={}){let I={...{method:"POST",endpoint:"",payload:null,headers:{},timeout:v.get().timeout,maxRetries:v.get().maxRetries,retryStrategy:v.get().retryStrategy,useQueue:!1,priority:0,responseType:"json",showLoading:null},...N};for(let K of YA.request)try{K.onFulfilled&&(I=await K.onFulfilled(I))}catch(B){if(K.onRejected)return K.onRejected(B);throw B}let O=async(K=0)=>{I.showLoading&&I.showLoading(!0);try{let B=new XMLHttpRequest,R=I.endpoint.startsWith("http")?I.endpoint:`${v.get().apiUrl}/${I.endpoint.replace(/^\//,"")}`;return await new Promise((M,L)=>{B.open(I.method,R,!0),B.timeout=I.timeout;let G=i1.getCsrfToken();G&&B.setRequestHeader("X-CSRF-Token",G);let T=i1.getAuthToken();T&&B.setRequestHeader("Authorization",`Bearer ${T}`),B.setRequestHeader("X-Requested-With","XMLHttpRequest");let W=I.headers||{};!Object.keys(W).some(s=>s.toLowerCase()==="content-type")&&!(I.payload instanceof FormData)&&B.setRequestHeader("Content-Type","application/json"),Object.keys(W).forEach(s=>{B.setRequestHeader(s,W[s])}),B.onload=async()=>{I.showLoading&&I.showLoading(!1);let s;try{s=I.responseType==="json"?JSON.parse(B.responseText):B.response}catch{s=B.responseText}let r={},u=B.getAllResponseHeaders();if(u&&u.trim().split(/[\r\n]+/).forEach(c=>{let DA=c.split(": "),PA=DA.shift(),OA=DA.join(": ");r[PA.toLowerCase()]=OA}),B.status>=200&&B.status<300){if(s&&s.status===!1){let PA={message:s.log||"UNKNOWN ERROR",status:B.status,data:s,headers:r};for(let OA of YA.response)OA.onFulfilled&&await OA.onFulfilled({...PA,url:R});L(PA);return}let c={data:s.data||s,status:B.status,url:R,headers:r};for(let DA of YA.response)DA.onFulfilled&&(c=await DA.onFulfilled(c));M(c.data)}else U(B,K,O,r,s,L)},B.onerror=()=>U(B,K,O,{},null,L),B.ontimeout=()=>U({status:408},K,O,{},null,L);let Y=i1.sanitizePayload(I.payload),P=Y;!(Y instanceof FormData)&&typeof Y=="object"&&Y!==null&&(P=JSON.stringify(Y)),B.send(P)})}catch(B){throw I.showLoading&&I.showLoading(!1),B}},U=async(K,B,R,M,L,G)=>{let T=I.endpoint.startsWith("http")?I.endpoint:`${v.get().apiUrl}/${I.endpoint.replace(/^\//,"")}`;if(B<I.maxRetries&&(K.status>=500||K.status===408||K.status===0)){let W=E(B,I.retryStrategy);setTimeout(()=>R(B+1).then(G),W)}else{let t={message:`Request failed with status ${K.status}`,status:K.status,data:L,headers:M};YA.error.forEach(Y=>Y(K));for(let Y of YA.response)Y.onFulfilled&&await Y.onFulfilled({...t,url:T});G(t)}},E=(K,B)=>{switch(B){case"linear":return(K+1)*1e3;case"fibonacci":return([1,1,2,3,5,8][K]||13)*1e3;case"exponential":return Math.pow(2,K)*1e3;default:return 1e3}};return I.useQueue?M2.add(()=>O(),I.priority):O()},G2=N=>v.init(N),T2={request:(N,A)=>YA.addRequest(N,A),response:(N,A)=>YA.addResponse(N,A),error:N=>YA.addError(N),clear:()=>YA.clear()},W2=()=>M2.getStatus();document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>v.init()):v.init();function sA(N,A={}){let{showAlert:I=!1}=A;if(typeof N!="string")return I&&console.error("Invalid input: Date must be a string."),!1;let O=N.trim().split("-");if(O.length!==3||O[0].length!==4||O[1].length!==2||O[2].length!==2)return I&&alert("Invalid date format. Use YYYY-MM-DD."),!1;let U=Number(O[0]),E=Number(O[1]),K=Number(O[2]);if(isNaN(U)||isNaN(E)||isNaN(K))return I&&alert("Date must contain only numbers."),!1;if(E<1||E>12||K<1||K>31)return I&&alert("Invalid month or day range."),!1;let B=new Date(U,E-1,K);return B.getFullYear()!==U||B.getMonth()+1!==E||B.getDate()!==K?(I&&alert("Invalid date. Please enter a real date."),!1):!0}function Y2(N,A={}){let{format:I="weekday",locale:O="en-US",includeYear:U=!0}=A;if(!sA(N,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let E=N.split("-"),K=new Date(E[0],E[1]-1,E[2]),B={short:{year:"numeric",month:"numeric",day:"numeric"},medium:{year:"numeric",month:"short",day:"numeric"},long:{year:"numeric",month:"long",day:"numeric"},full:{weekday:"long",year:"numeric",month:"long",day:"numeric"},weekday:{weekday:"short",year:"numeric",month:"short",day:"numeric"}},R=B[I]||B.weekday;return U||(R={...R},delete R.year),K.toLocaleString(O,R)}function S2(N,A={}){let{locale:I="en-US"}=A;if(!sA(N,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let O=N.split("-"),K=new Date(O[0],O[1]-1,O[2])-new Date,B=Math.round(K/(1e3*60*60*24)),R=new Intl.RelativeTimeFormat(I,{numeric:"auto"});if(Math.abs(B)<1){let M=Math.round(K/36e5);return R.format(M,"hour")}else{if(Math.abs(B)<7)return R.format(B,"day");if(Math.abs(B)<30){let M=Math.round(B/7);return R.format(M,"week")}else if(Math.abs(B)<365){let M=Math.round(B/30);return R.format(M,"month")}else{let M=Math.round(B/365);return R.format(M,"year")}}}function t2(){let N=new Date,A=N.getFullYear(),I=String(N.getMonth()+1).padStart(2,"0"),O=String(N.getDate()).padStart(2,"0");return`${A}-${I}-${O}`}function e2(){let N=new Date;N.setDate(N.getDate()-1);let A=N.getFullYear(),I=String(N.getMonth()+1).padStart(2,"0"),O=String(N.getDate()).padStart(2,"0");return`${A}-${I}-${O}`}function D2(N,A={}){let{showSeconds:I=!0}=A,O=new Date,U=new Date(N);if(isNaN(U.getTime()))return"Invalid timestamp";let E=O-U,K=Math.floor(E/1e3),B=Math.floor(K/60),R=Math.floor(B/60),M=Math.floor(R/24),L=Math.floor(M/7),G=Math.floor(M/30),T=Math.floor(M/365);return K<60?I?`${K} second${K!==1?"s":""} ago`:"now":B<60?`${B} minute${B!==1?"s":""} ago`:R<24?`${R} hour${R!==1?"s":""} ago`:M<7?`${M} day${M!==1?"s":""} ago`:L<4?`${L} week${L!==1?"s":""} ago`:G<12?`${G} month${G!==1?"s":""} ago`:`${T} year${T!==1?"s":""} ago`}function s2(N,A,I){if(!sA(N,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let O=new Date(N),E={days:()=>O.setDate(O.getDate()+A),weeks:()=>O.setDate(O.getDate()+A*7),months:()=>O.setMonth(O.getMonth()+A),years:()=>O.setFullYear(O.getFullYear()+A)}[I.toLowerCase()];if(!E)throw new Error(`Invalid unit: ${I}. Use: days, weeks, months, years`);return E(),O.toISOString().split("T")[0]}function r2(N){let A=new Date,I=R=>{let M=R.getFullYear(),L=String(R.getMonth()+1).padStart(2,"0"),G=String(R.getDate()).padStart(2,"0");return`${M}-${L}-${G}`},O=R=>{let M=R.getDay(),L=R.getDate()-M+(M===0?-6:1),G=new Date(R);return G.setDate(L),G},U=R=>new Date(R.getFullYear(),R.getMonth(),1),E=R=>new Date(R.getFullYear(),R.getMonth()+1,0),K,B;switch(N.toLowerCase()){case"today":{K=I(A),B=I(A);break}case"yesterday":{let R=new Date(A);R.setDate(A.getDate()-1),K=I(R),B=I(R);break}case"thisweek":{let R=O(A);K=I(R),B=I(A);break}case"lastweek":{let R=new Date(A);R.setDate(A.getDate()-7);let M=O(R),L=new Date(M);L.setDate(M.getDate()+6),K=I(M),B=I(L);break}case"thismonth":{let R=U(A);K=I(R),B=I(A);break}case"lastmonth":{let R=new Date(A.getFullYear(),A.getMonth()-1,1),M=U(R),L=E(R);K=I(M),B=I(L);break}default:throw new Error(`Unknown keyword: ${N}. Use: today, yesterday, thisWeek, lastWeek, thisMonth, lastMonth`)}return[K,B]}function i2(N,A){let I=new Date,U={days:()=>I.setDate(I.getDate()-N),weeks:()=>I.setDate(I.getDate()-N*7),months:()=>I.setMonth(I.getMonth()-N),years:()=>I.setFullYear(I.getFullYear()-N)}[A.toLowerCase()];if(!U)throw new Error(`Invalid unit: ${A}. Use: days, weeks, months, years`);U();let E=I.getFullYear(),K=String(I.getMonth()+1).padStart(2,"0"),B=String(I.getDate()).padStart(2,"0");return`${E}-${K}-${B}`}function n2(){let N=new Date;N.setDate(N.getDate()+1);let A=N.getFullYear(),I=String(N.getMonth()+1).padStart(2,"0"),O=String(N.getDate()).padStart(2,"0");return`${A}-${I}-${O}`}function H2(N){let A=new Date,I=M=>{let L=M.getFullYear(),G=String(M.getMonth()+1).padStart(2,"0"),T=String(M.getDate()).padStart(2,"0");return`${L}-${G}-${T}`},O=M=>{let L=M.getDay(),G=M.getDate()-L+(L===0?-6:1),T=new Date(M);return T.setDate(G),T},U=M=>{let L=O(M),G=new Date(L);return G.setDate(L.getDate()+6),G},E=M=>new Date(M.getFullYear(),M.getMonth(),1),K=M=>new Date(M.getFullYear(),M.getMonth()+1,0),B,R;switch(N.toLowerCase()){case"tomorrow":{let M=new Date(A);M.setDate(A.getDate()+1),B=I(M),R=I(M);break}case"nextweek":{let M=new Date(A);M.setDate(A.getDate()+7);let L=O(M),G=U(M);B=I(L),R=I(G);break}case"nextmonth":{let M=new Date(A.getFullYear(),A.getMonth()+1,1),L=E(M),G=K(M);B=I(L),R=I(G);break}case"nextyear":{let M=new Date(A.getFullYear()+1,0,1),L=new Date(A.getFullYear()+1,11,31);B=I(M),R=I(L);break}default:throw new Error(`Unknown keyword: ${N}. Use: tomorrow, nextWeek, nextMonth, nextYear`)}return[B,R]}function o2(N,A,I={}){let{inclusiveEndDate:O=!1}=I;if(!sA(N,{showAlert:!1})||!sA(A,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let U=new Date(N),E=new Date(A);if(U>E)throw new Error("Start date cannot be after end date.");let K=E-U,B=Math.floor(K/(1e3*60*60*24));return O&&(B+=1),B}function C2(N,A,I={}){let{startDate:O}=I,U;if(O){if(!sA(O,{showAlert:!1}))throw new Error("Invalid start date format. Use YYYY-MM-DD.");U=new Date(O)}else U=new Date;if(typeof N!="number"||N<0)throw new Error("Amount must be a positive number.");let K={days:()=>U.setDate(U.getDate()+N),weeks:()=>U.setDate(U.getDate()+N*7),months:()=>U.setMonth(U.getMonth()+N),years:()=>U.setFullYear(U.getFullYear()+N)}[A.toLowerCase()];if(!K)throw new Error(`Invalid unit: ${A}. Use: days, weeks, months, years`);K();let B=U.getFullYear(),R=String(U.getMonth()+1).padStart(2,"0"),M=String(U.getDate()).padStart(2,"0");return`${B}-${R}-${M}`}function a2(N){let A=new Date;return A.setHours(0,0,0,0),new Date(N)>A}function P2(N){let A=new Date;return A.setHours(0,0,0,0),new Date(N)<A}var n1=class{constructor(){this.dependencies={sheetjs:{name:"SheetJS",cdn:"https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js",check:()=>typeof XLSX<"u"&&!!XLSX.utils},jspdf:{name:"jsPDF",cdn:"https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js",check:()=>typeof(window.jsPDF||window.jspdf&&window.jspdf.jsPDF)<"u"},jspdfAutotable:{name:"jsPDF AutoTable",cdn:"https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.28/jspdf.plugin.autotable.min.js",check:()=>{let A=window.jsPDF||window.jspdf&&window.jspdf.jsPDF;return typeof A<"u"&&(typeof A.autoTable<"u"||A.API&&typeof A.API.autoTable<"u")},requires:["jspdf"]}},this.loadingPromises=new Map}register(A,I){this.dependencies[A]&&console.warn(`Dependency "${A}" is already registered. Overwriting.`),this.dependencies[A]=I}hasDependency(A){let I=this.dependencies[A];if(!I)return!1;if(I.requires){for(let O of I.requires)if(!this.hasDependency(O))return!1}return I.check()}async loadDependency(A,I=0){if(this.loadingPromises.has(A))return this.loadingPromises.get(A);let O=this.dependencies[A];if(!O)throw new Error(`Unknown dependency: ${A}`);if(this.hasDependency(A))return!0;if(O.requires)for(let B of O.requires)await this.loadDependency(B);let U=O.maxRetries||2,E=[O.cdn,...O.fallbacks||[]],K=(async()=>{let B;for(let R of E)try{return await this._injectScript(O,R),this.loadingPromises.delete(A),!0}catch(M){B=M,console.warn(`Failed to load ${O.name} from ${R}:`,M.message)}if(I<U)return this.loadingPromises.delete(A),this.loadDependency(A,I+1);throw this.loadingPromises.delete(A),B||new Error(`Failed to load ${O.name} after all attempts.`)})();return this.loadingPromises.set(A,K),K}_injectScript(A,I){return new Promise((O,U)=>{let E=document.createElement("script");E.src=I,E.async=!0,A.integrity&&(E.integrity=A.integrity,E.crossOrigin=A.crossorigin||"anonymous"),E.onload=()=>{let K=0,B=setInterval(()=>{A.check()?(clearInterval(B),O(!0)):K>20&&(clearInterval(B),U(new Error(`Library ${A.name} loaded but failed verification.`))),K++},50)},E.onerror=()=>U(new Error("Network error or CSP violation")),document.head.appendChild(E),setTimeout(()=>{E.parentNode&&(E.remove(),U(new Error(`Timeout (10s) reached for ${I}`)))},1e4)})}async ensureDependency(A,I=null){try{return this.hasDependency(A)||await this.loadDependency(A),!0}catch(O){if(console.error(`Dependency Manager error [${A}]:`,O.message),I)return I();throw O}}},JA=new n1;async function H1(N,A,I="download",O={}){let{maxSize:U=50*1024*1024,onProgress:E=null,fallbackFormats:K=!0,csvDelimiter:B=",",pdfOptions:R={}}=O;try{if(!N)throw new Error("No data provided for download");if(!I||typeof I!="string")throw new Error("Invalid file name");let M,L=I,G=A.toLowerCase();E==null||E(10);try{G==="excel"?await JA.ensureDependency("sheetjs"):G==="pdf"&&await Promise.all([JA.ensureDependency("jspdf"),JA.ensureDependency("jspdfAutotable")])}catch(W){if(K){if(console.warn(`Dependency missing for ${G}, falling back to print/csv...`),G==="excel")G="csv";else if(G==="pdf")return await dI(N,I,R)}else throw W}switch(E==null||E(30),G){case"csv":M=await PI(N,B,{onProgress:E}),L.toLowerCase().endsWith(".csv")||(L+=".csv");break;case"json":M=await cI(N,{onProgress:E}),L.toLowerCase().endsWith(".json")||(L+=".json");break;case"txt":M=await lI(N,{onProgress:E}),L.toLowerCase().endsWith(".txt")||(L+=".txt");break;case"excel":M=await hI(N,{onProgress:E}),L.toLowerCase().endsWith(".xlsx")||(L+=".xlsx");break;case"pdf":M=await JI(N,R,{onProgress:E}),L.toLowerCase().endsWith(".pdf")||(L+=".pdf");break;default:throw new Error(`Unsupported file type: ${A}`)}if(E==null||E(80),M.size>U)throw new Error(`File size ${(M.size/1024/1024).toFixed(2)}MB exceeds limit.`);if(G==="pdf"){uI(M,L),E==null||E(100);return}let T=URL.createObjectURL(M);try{let W=document.createElement("a");W.href=T,W.download=L,W.style.display="none",document.body.appendChild(W),W.click(),document.body.removeChild(W)}finally{setTimeout(()=>URL.revokeObjectURL(T),1e3)}E==null||E(100)}catch(M){throw console.error("Download failed:",M),M}}var U1=class{constructor(A="export"){this.defaultFilename=A}async exportToExcel(A,I={}){let O=this.extractTableData(A,I),U=[...O.headers,...O.rows,...O.footers];await H1(U,"excel",I.filename||this.defaultFilename,I)}async exportToCSV(A,I={}){let O=this.extractTableData(A,I),U=this.generateCsvContent(O,I.delimiter||",",`
|
|
99
|
+
`}static injectStyles(){if(document.querySelector("style[data-smart-input]"))return;let A=document.createElement("style");A.setAttribute("data-smart-input","");let I=document.head.firstChild;I?document.head.insertBefore(A,I):document.head.appendChild(A),A.textContent=N.defaultCSS}_createInputWrapper(A,I,O=[]){let U=document.createElement("div");U.className=["smart-input-wrapper",...O].join(" ");let E=document.createElement("label");return E.htmlFor=A,E.textContent=I,E.className="smart-input-label",U.appendChild(E),U}_mount(A,I){I.appendChild(A)}_makeHandle(A,I,O={}){return{element:A,getValue:O.getValue||(()=>A.value),setValue:O.setValue||(U=>{A.value=U}),clear:O.clear||(()=>{A.value=""}),destroy:O.destroy||(()=>{I.remove()})}}getInput(A){return this.inputs[A]||null}createNumberInput({id:A,labelText:I,container:O,placeholder:U="Enter numbers only",wrapperClasses:E=[],inputClasses:K=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let B=this._createInputWrapper(A,I,E),R=document.createElement("input");R.type="text",R.id=A,R.className=["smart-input","smart-input-number",...K].join(" "),R.placeholder=U,R.addEventListener("input",L=>{let G="";for(let T of L.target.value)"0123456789".includes(T)&&(G+=T);L.target.value=G}),B.appendChild(R),this._mount(B,O);let M=this._makeHandle(R,B);return this.inputs[A]=M,M}createFormattedNumberInput({id:A,labelText:I,container:O,placeholder:U="Enter amount (e.g., 1,234.56)",wrapperClasses:E=[],inputClasses:K=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let B=this._createInputWrapper(A,I,E),R=document.createElement("input");R.type="text",R.id=A,R.className=["smart-input","smart-input-formatted-number",...K].join(" "),R.placeholder=U;let M=G=>{let T="",W=!1;for(let r of G)"0123456789".includes(r)?T+=r:r==="."&&!W&&(T+=r,W=!0);let t=T.indexOf("."),Y=t>=0?T.substring(0,t):T,i=t>=0?T.substring(t):"",s="";if(Y.length>0){let r=Y.split("").reverse().join(""),u="";for(let c=0;c<r.length;c++)u+=r[c],(c+1)%3===0&&c+1!==r.length&&(u+=",");s=u.split("").reverse().join("")}return s+i};R.addEventListener("input",G=>{G.target.value=M(G.target.value)}),B.appendChild(R),this._mount(B,O);let L=this._makeHandle(R,B,{setValue:G=>{R.value=M(String(G))}});return this.inputs[A]=L,L}createSearchableInput({id:A,labelText:I,container:O,data:U=[],placeholder:E="Search...",wrapperClasses:K=[],inputClasses:B=[],dropdownClasses:R=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let M=this._createInputWrapper(A,I,["smart-input-searchable-wrapper",...K]),L=document.createElement("input");L.type="text",L.id=A,L.className=["smart-input","smart-input-searchable",...B].join(" "),L.placeholder=E;let G=document.createElement("ul");G.className=["smart-input-dropdown",...R].join(" ");let T=null,W=U,t=()=>G.classList.add("smart-input-dropdown-visible"),Y=()=>{G.classList.remove("smart-input-dropdown-visible"),L.setAttribute("data-value",T!=null?T:"")},i=u=>{let c=document.createDocumentFragment(),DA=u.toLowerCase(),PA=W.filter(OA=>OA.key.toLowerCase().includes(DA));if(PA.length>0){for(let OA of PA){let vA=document.createElement("li");vA.textContent=OA.key,vA.dataset.value=OA.value,vA.className="smart-input-dropdown-item",vA.addEventListener("mousedown",DI=>{DI.preventDefault(),L.value=OA.key,T=OA.value,Y(),L.focus()}),c.appendChild(vA)}G.replaceChildren(c),t()}else G.replaceChildren(),Y()};L.addEventListener("focus",()=>i(L.value)),L.addEventListener("input",()=>{T=null,i(L.value)}),L.addEventListener("blur",()=>{setTimeout(()=>{M.contains(document.activeElement)||Y()},150)});let s=new AbortController;document.addEventListener("click",u=>{M.contains(u.target)||Y()},{signal:s.signal}),M.appendChild(L),M.appendChild(G),this._mount(M,O);let r=this._makeHandle(L,M,{getValue:()=>T,setValue:({key:u,value:c})=>{L.value=u,T=c,L.setAttribute("data-value",c!=null?c:"")},clear:()=>{L.value="",T=null,L.removeAttribute("data-value"),Y()},destroy:()=>{s.abort(),M.remove()}});return r.setData=u=>{W=u,i(L.value)},this.inputs[A]=r,r}createLimitedTextInput({id:A,labelText:I,container:O,maxLength:U,allowedCharactersString:E="",placeholder:K="",wrapperClasses:B=[],inputClasses:R=[]}){if(!O)return console.error("SmartInput: container element is required"),null;if(!U)return console.error("SmartInput: maxLength is required for createLimitedTextInput"),null;let M=Math.max(1,Math.round(U*.1)),L=this._createInputWrapper(A,I,B),G=document.createElement("input");G.type="text",G.id=A,G.className=["smart-input","smart-input-limited",...R].join(" "),G.maxLength=U,G.placeholder=K||`Max ${U} characters`;let T=document.createElement("span");T.className="smart-input-char-count";let W=()=>{let Y=G.value.length,i=U-Y;T.textContent=`${Y} / ${U}`,T.classList.remove("smart-input-char-warn","smart-input-char-over"),i<0?T.classList.add("smart-input-char-over"):i<=M&&T.classList.add("smart-input-char-warn")};G.addEventListener("input",Y=>{if(E){let i="";for(let s of Y.target.value)E.includes(s)&&(i+=s);Y.target.value=i}W()}),W(),L.appendChild(G),L.appendChild(T),this._mount(L,O);let t=this._makeHandle(G,L,{setValue:Y=>{G.value=Y,W()},clear:()=>{G.value="",W()}});return this.inputs[A]=t,t}createAutoExpandingTextArea({id:A,labelText:I,container:O,placeholder:U="",minHeight:E=150,maxHeight:K=300,wrapperClasses:B=[],inputClasses:R=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let M=this._createInputWrapper(A,I,B),L=document.createElement("textarea");L.id=A,L.className=["smart-input","smart-input-textarea",...R].join(" "),L.placeholder=U,L.style.resize="none",L.style.overflowY="hidden",L.style.minHeight=`${E}px`;let G=()=>{L.style.height="auto";let W=L.scrollHeight,t=Math.min(Math.max(W,E),K);L.style.height=`${t}px`,W>K?L.style.overflowY="auto":L.style.overflowY="hidden"};L.addEventListener("input",G),M.appendChild(L),this._mount(M,O);let T=this._makeHandle(L,M,{setValue:W=>{L.value=W,G()},clear:()=>{L.value="",G()}});return setTimeout(G,0),this.inputs[A]=T,T}createSelectInput({id:A,labelText:I,container:O,optionsData:U=[],wrapperClasses:E=[],inputClasses:K=[]}){if(!O)return console.error("SmartInput: container element is required"),null;let B=this._createInputWrapper(A,I,E),R=document.createElement("select");R.id=A,R.className=["smart-input","smart-input-select",...K].join(" ");for(let L of U){let G=document.createElement("option");G.value=L.value,G.textContent=L.key,R.appendChild(G)}B.appendChild(R),this._mount(B,O);let M=this._makeHandle(R,B,{getValue:()=>R.value,setValue:L=>{R.value=L},clear:()=>{R.selectedIndex=0}});return this.inputs[A]=M,M}};var v=(function(){let N={apiUrl:null,timeout:6e5,maxRetries:3,retryStrategy:"exponential",csrfToken:null,authToken:null,environment:"development",keys:{globalConfig:"APP_CONFIG",authToken:"auth_token",csrfToken:"csrf-token",csrfCookie:"XSRF-TOKEN"}};return{init(A={}){A.keys&&(N.keys={...N.keys,...A.keys}),window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1"?N.environment="development":N.environment="production";let I=N.keys.globalConfig;window[I]&&window[I].apiUrl&&(N.apiUrl=window[I].apiUrl,window[I].environment&&(N.environment=window[I].environment));let O=document.querySelector('meta[name="api-url"]');O&&(N.apiUrl=O.getAttribute("content")),Object.assign(N,A),this.validate()},validate(){!N.apiUrl&&N.environment==="production"&&console.warn("RequestHandler: API URL is missing in production environment.")},get:()=>N}})(),i1={getCsrfToken(){let N=v.get().keys;if(v.get().csrfToken)return v.get().csrfToken;let A=document.querySelector(`meta[name="${N.csrfToken}"]`);if(A)return A.getAttribute("content");let I=N.csrfCookie+"=",U=decodeURIComponent(document.cookie).split(";");for(let E=0;E<U.length;E++){let K=U[E].trim();if(K.indexOf(I)===0)return K.substring(I.length,K.length)}return null},getAuthToken(){let N=v.get().keys;return v.get().authToken?v.get().authToken:sessionStorage.getItem(N.authToken)||localStorage.getItem(N.authToken)},sanitizePayload(N){if(!N||typeof N!="object"||N instanceof FormData)return N;let A=JSON.parse(JSON.stringify(N)),I=O=>{for(let U in O)typeof O[U]=="string"?O[U]=O[U].replace(/<script\b[^>]*>([\s\S]*?)<\/script>/gim,"").replace(/javascript:/gim,""):typeof O[U]=="object"&&O[U]!==null&&I(O[U])};return I(A),A}},YA={request:[],response:[],error:[],addRequest(N,A){let I=Date.now()+Math.random();return this.request.push({id:I,onFulfilled:N,onRejected:A}),I},addResponse(N,A){let I=Date.now()+Math.random();return this.response.push({id:I,onFulfilled:N,onRejected:A}),I},clear(){this.request=[],this.response=[],this.error=[]}},M2=(function(){let N=[],A=0,I=3,O=()=>{if(A>=I||N.length===0)return;N.sort((E,K)=>K.priority-E.priority);let U=N.shift();A++,U.execute().finally(()=>{A--,O()})};return{add(U,E=0){return new Promise((K,B)=>{N.push({priority:E,execute:()=>U().then(K).catch(B)}),O()})},getStatus:()=>({active:A,pending:N.length}),clear:()=>{N.length=0}}})(),L2=async function(N={}){let I={...{method:"POST",endpoint:"",payload:null,headers:{},timeout:v.get().timeout,maxRetries:v.get().maxRetries,retryStrategy:v.get().retryStrategy,useQueue:!1,priority:0,responseType:"json",showLoading:null},...N};for(let K of YA.request)try{K.onFulfilled&&(I=await K.onFulfilled(I))}catch(B){if(K.onRejected)return K.onRejected(B);throw B}let O=async(K=0)=>{I.showLoading&&I.showLoading(!0);try{let B=new XMLHttpRequest,R=I.endpoint.startsWith("http")?I.endpoint:`${v.get().apiUrl}/${I.endpoint.replace(/^\//,"")}`;return await new Promise((M,L)=>{B.open(I.method,R,!0),B.timeout=I.timeout;let G=i1.getCsrfToken();G&&B.setRequestHeader("X-CSRF-Token",G);let T=i1.getAuthToken();T&&B.setRequestHeader("Authorization",`Bearer ${T}`),B.setRequestHeader("X-Requested-With","XMLHttpRequest");let W=I.headers||{};!Object.keys(W).some(s=>s.toLowerCase()==="content-type")&&!(I.payload instanceof FormData)&&B.setRequestHeader("Content-Type","application/json"),Object.keys(W).forEach(s=>{B.setRequestHeader(s,W[s])}),B.onload=async()=>{I.showLoading&&I.showLoading(!1);let s;try{s=I.responseType==="json"?JSON.parse(B.responseText):B.response}catch{s=B.responseText}let r={},u=B.getAllResponseHeaders();if(u&&u.trim().split(/[\r\n]+/).forEach(c=>{let DA=c.split(": "),PA=DA.shift(),OA=DA.join(": ");r[PA.toLowerCase()]=OA}),B.status>=200&&B.status<300){if(s&&s.status===!1){let PA={message:s.log||"UNKNOWN ERROR",status:B.status,data:s,headers:r};for(let OA of YA.response)OA.onFulfilled&&await OA.onFulfilled({...PA,url:R});L(PA);return}let c={data:s.data||s,status:B.status,url:R,headers:r};for(let DA of YA.response)DA.onFulfilled&&(c=await DA.onFulfilled(c));M(c.data)}else U(B,K,O,r,s,M,L)},B.onerror=()=>U(B,K,O,{},null,M,L),B.ontimeout=()=>U({status:408},K,O,{},null,M,L);let Y=i1.sanitizePayload(I.payload),i=Y;!(Y instanceof FormData)&&typeof Y=="object"&&Y!==null&&(i=JSON.stringify(Y)),B.send(i)})}catch(B){throw I.showLoading&&I.showLoading(!1),B}},U=async(K,B,R,M,L,G,T)=>{let W=I.endpoint.startsWith("http")?I.endpoint:`${v.get().apiUrl}/${I.endpoint.replace(/^\//,"")}`;if(B<I.maxRetries&&(K.status>=500||K.status===408||K.status===0)){let t=E(B,I.retryStrategy);setTimeout(()=>R(B+1).then(G).catch(T),t)}else{let Y={message:`Request failed with status ${K.status}`,status:K.status,data:L,headers:M};YA.error.forEach(i=>i(K));for(let i of YA.response)i.onFulfilled&&await i.onFulfilled({...Y,url:W});T(Y)}},E=(K,B)=>{switch(B){case"linear":return(K+1)*1e3;case"fibonacci":return([1,1,2,3,5,8][K]||13)*1e3;case"exponential":return Math.pow(2,K)*1e3;default:return 1e3}};return I.useQueue?M2.add(()=>O(),I.priority):O()},G2=N=>v.init(N),T2={request:(N,A)=>YA.addRequest(N,A),response:(N,A)=>YA.addResponse(N,A),error:N=>YA.addError(N),clear:()=>YA.clear()},W2=()=>M2.getStatus();document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>v.init()):v.init();function sA(N,A={}){let{showAlert:I=!1}=A;if(typeof N!="string")return I&&console.error("Invalid input: Date must be a string."),!1;let O=N.trim().split("-");if(O.length!==3||O[0].length!==4||O[1].length!==2||O[2].length!==2)return I&&alert("Invalid date format. Use YYYY-MM-DD."),!1;let U=Number(O[0]),E=Number(O[1]),K=Number(O[2]);if(isNaN(U)||isNaN(E)||isNaN(K))return I&&alert("Date must contain only numbers."),!1;if(E<1||E>12||K<1||K>31)return I&&alert("Invalid month or day range."),!1;let B=new Date(U,E-1,K);return B.getFullYear()!==U||B.getMonth()+1!==E||B.getDate()!==K?(I&&alert("Invalid date. Please enter a real date."),!1):!0}function Y2(N,A={}){let{format:I="weekday",locale:O="en-US",includeYear:U=!0}=A;if(!sA(N,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let E=N.split("-"),K=new Date(E[0],E[1]-1,E[2]),B={short:{year:"numeric",month:"numeric",day:"numeric"},medium:{year:"numeric",month:"short",day:"numeric"},long:{year:"numeric",month:"long",day:"numeric"},full:{weekday:"long",year:"numeric",month:"long",day:"numeric"},weekday:{weekday:"short",year:"numeric",month:"short",day:"numeric"}},R=B[I]||B.weekday;return U||(R={...R},delete R.year),K.toLocaleString(O,R)}function S2(N,A={}){let{locale:I="en-US"}=A;if(!sA(N,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let O=N.split("-"),K=new Date(O[0],O[1]-1,O[2])-new Date,B=Math.round(K/(1e3*60*60*24)),R=new Intl.RelativeTimeFormat(I,{numeric:"auto"});if(Math.abs(B)<1){let M=Math.round(K/36e5);return R.format(M,"hour")}else{if(Math.abs(B)<7)return R.format(B,"day");if(Math.abs(B)<30){let M=Math.round(B/7);return R.format(M,"week")}else if(Math.abs(B)<365){let M=Math.round(B/30);return R.format(M,"month")}else{let M=Math.round(B/365);return R.format(M,"year")}}}function t2(){let N=new Date,A=N.getFullYear(),I=String(N.getMonth()+1).padStart(2,"0"),O=String(N.getDate()).padStart(2,"0");return`${A}-${I}-${O}`}function e2(){let N=new Date;N.setDate(N.getDate()-1);let A=N.getFullYear(),I=String(N.getMonth()+1).padStart(2,"0"),O=String(N.getDate()).padStart(2,"0");return`${A}-${I}-${O}`}function D2(N,A={}){let{showSeconds:I=!0}=A,O=new Date,U=new Date(N);if(isNaN(U.getTime()))return"Invalid timestamp";let E=O-U,K=Math.floor(E/1e3),B=Math.floor(K/60),R=Math.floor(B/60),M=Math.floor(R/24),L=Math.floor(M/7),G=Math.floor(M/30),T=Math.floor(M/365);return K<60?I?`${K} second${K!==1?"s":""} ago`:"now":B<60?`${B} minute${B!==1?"s":""} ago`:R<24?`${R} hour${R!==1?"s":""} ago`:M<7?`${M} day${M!==1?"s":""} ago`:L<4?`${L} week${L!==1?"s":""} ago`:G<12?`${G} month${G!==1?"s":""} ago`:`${T} year${T!==1?"s":""} ago`}function s2(N,A,I){if(!sA(N,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let O=new Date(N),E={days:()=>O.setDate(O.getDate()+A),weeks:()=>O.setDate(O.getDate()+A*7),months:()=>O.setMonth(O.getMonth()+A),years:()=>O.setFullYear(O.getFullYear()+A)}[I.toLowerCase()];if(!E)throw new Error(`Invalid unit: ${I}. Use: days, weeks, months, years`);return E(),O.toISOString().split("T")[0]}function r2(N){let A=new Date,I=R=>{let M=R.getFullYear(),L=String(R.getMonth()+1).padStart(2,"0"),G=String(R.getDate()).padStart(2,"0");return`${M}-${L}-${G}`},O=R=>{let M=R.getDay(),L=R.getDate()-M+(M===0?-6:1),G=new Date(R);return G.setDate(L),G},U=R=>new Date(R.getFullYear(),R.getMonth(),1),E=R=>new Date(R.getFullYear(),R.getMonth()+1,0),K,B;switch(N.toLowerCase()){case"today":{K=I(A),B=I(A);break}case"yesterday":{let R=new Date(A);R.setDate(A.getDate()-1),K=I(R),B=I(R);break}case"thisweek":{let R=O(A);K=I(R),B=I(A);break}case"lastweek":{let R=new Date(A);R.setDate(A.getDate()-7);let M=O(R),L=new Date(M);L.setDate(M.getDate()+6),K=I(M),B=I(L);break}case"thismonth":{let R=U(A);K=I(R),B=I(A);break}case"lastmonth":{let R=new Date(A.getFullYear(),A.getMonth()-1,1),M=U(R),L=E(R);K=I(M),B=I(L);break}default:throw new Error(`Unknown keyword: ${N}. Use: today, yesterday, thisWeek, lastWeek, thisMonth, lastMonth`)}return[K,B]}function i2(N,A){let I=new Date,U={days:()=>I.setDate(I.getDate()-N),weeks:()=>I.setDate(I.getDate()-N*7),months:()=>I.setMonth(I.getMonth()-N),years:()=>I.setFullYear(I.getFullYear()-N)}[A.toLowerCase()];if(!U)throw new Error(`Invalid unit: ${A}. Use: days, weeks, months, years`);U();let E=I.getFullYear(),K=String(I.getMonth()+1).padStart(2,"0"),B=String(I.getDate()).padStart(2,"0");return`${E}-${K}-${B}`}function n2(){let N=new Date;N.setDate(N.getDate()+1);let A=N.getFullYear(),I=String(N.getMonth()+1).padStart(2,"0"),O=String(N.getDate()).padStart(2,"0");return`${A}-${I}-${O}`}function H2(N){let A=new Date,I=M=>{let L=M.getFullYear(),G=String(M.getMonth()+1).padStart(2,"0"),T=String(M.getDate()).padStart(2,"0");return`${L}-${G}-${T}`},O=M=>{let L=M.getDay(),G=M.getDate()-L+(L===0?-6:1),T=new Date(M);return T.setDate(G),T},U=M=>{let L=O(M),G=new Date(L);return G.setDate(L.getDate()+6),G},E=M=>new Date(M.getFullYear(),M.getMonth(),1),K=M=>new Date(M.getFullYear(),M.getMonth()+1,0),B,R;switch(N.toLowerCase()){case"tomorrow":{let M=new Date(A);M.setDate(A.getDate()+1),B=I(M),R=I(M);break}case"nextweek":{let M=new Date(A);M.setDate(A.getDate()+7);let L=O(M),G=U(M);B=I(L),R=I(G);break}case"nextmonth":{let M=new Date(A.getFullYear(),A.getMonth()+1,1),L=E(M),G=K(M);B=I(L),R=I(G);break}case"nextyear":{let M=new Date(A.getFullYear()+1,0,1),L=new Date(A.getFullYear()+1,11,31);B=I(M),R=I(L);break}default:throw new Error(`Unknown keyword: ${N}. Use: tomorrow, nextWeek, nextMonth, nextYear`)}return[B,R]}function o2(N,A,I={}){let{inclusiveEndDate:O=!1}=I;if(!sA(N,{showAlert:!1})||!sA(A,{showAlert:!1}))throw new Error("Invalid date format. Use YYYY-MM-DD.");let U=new Date(N),E=new Date(A);if(U>E)throw new Error("Start date cannot be after end date.");let K=E-U,B=Math.floor(K/(1e3*60*60*24));return O&&(B+=1),B}function C2(N,A,I={}){let{startDate:O}=I,U;if(O){if(!sA(O,{showAlert:!1}))throw new Error("Invalid start date format. Use YYYY-MM-DD.");U=new Date(O)}else U=new Date;if(typeof N!="number"||N<0)throw new Error("Amount must be a positive number.");let K={days:()=>U.setDate(U.getDate()+N),weeks:()=>U.setDate(U.getDate()+N*7),months:()=>U.setMonth(U.getMonth()+N),years:()=>U.setFullYear(U.getFullYear()+N)}[A.toLowerCase()];if(!K)throw new Error(`Invalid unit: ${A}. Use: days, weeks, months, years`);K();let B=U.getFullYear(),R=String(U.getMonth()+1).padStart(2,"0"),M=String(U.getDate()).padStart(2,"0");return`${B}-${R}-${M}`}function a2(N){let A=new Date;return A.setHours(0,0,0,0),new Date(N)>A}function P2(N){let A=new Date;return A.setHours(0,0,0,0),new Date(N)<A}var n1=class{constructor(){this.dependencies={sheetjs:{name:"SheetJS",cdn:"https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js",check:()=>typeof XLSX<"u"&&!!XLSX.utils},jspdf:{name:"jsPDF",cdn:"https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js",check:()=>typeof(window.jsPDF||window.jspdf&&window.jspdf.jsPDF)<"u"},jspdfAutotable:{name:"jsPDF AutoTable",cdn:"https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.28/jspdf.plugin.autotable.min.js",check:()=>{let A=window.jsPDF||window.jspdf&&window.jspdf.jsPDF;return typeof A<"u"&&(typeof A.autoTable<"u"||A.API&&typeof A.API.autoTable<"u")},requires:["jspdf"]}},this.loadingPromises=new Map}register(A,I){this.dependencies[A]&&console.warn(`Dependency "${A}" is already registered. Overwriting.`),this.dependencies[A]=I}hasDependency(A){let I=this.dependencies[A];if(!I)return!1;if(I.requires){for(let O of I.requires)if(!this.hasDependency(O))return!1}return I.check()}async loadDependency(A,I=0){if(this.loadingPromises.has(A))return this.loadingPromises.get(A);let O=this.dependencies[A];if(!O)throw new Error(`Unknown dependency: ${A}`);if(this.hasDependency(A))return!0;if(O.requires)for(let B of O.requires)await this.loadDependency(B);let U=O.maxRetries||2,E=[O.cdn,...O.fallbacks||[]],K=(async()=>{let B;for(let R of E)try{return await this._injectScript(O,R),this.loadingPromises.delete(A),!0}catch(M){B=M,console.warn(`Failed to load ${O.name} from ${R}:`,M.message)}if(I<U)return this.loadingPromises.delete(A),this.loadDependency(A,I+1);throw this.loadingPromises.delete(A),B||new Error(`Failed to load ${O.name} after all attempts.`)})();return this.loadingPromises.set(A,K),K}_injectScript(A,I){return new Promise((O,U)=>{let E=document.createElement("script");E.src=I,E.async=!0,A.integrity&&(E.integrity=A.integrity,E.crossOrigin=A.crossorigin||"anonymous"),E.onload=()=>{let K=0,B=setInterval(()=>{A.check()?(clearInterval(B),O(!0)):K>20&&(clearInterval(B),U(new Error(`Library ${A.name} loaded but failed verification.`))),K++},50)},E.onerror=()=>U(new Error("Network error or CSP violation")),document.head.appendChild(E),setTimeout(()=>{E.parentNode&&(E.remove(),U(new Error(`Timeout (10s) reached for ${I}`)))},1e4)})}async ensureDependency(A,I=null){try{return this.hasDependency(A)||await this.loadDependency(A),!0}catch(O){if(console.error(`Dependency Manager error [${A}]:`,O.message),I)return I();throw O}}},JA=new n1;async function H1(N,A,I="download",O={}){let{maxSize:U=50*1024*1024,onProgress:E=null,fallbackFormats:K=!0,csvDelimiter:B=",",pdfOptions:R={}}=O;try{if(!N)throw new Error("No data provided for download");if(!I||typeof I!="string")throw new Error("Invalid file name");let M,L=I,G=A.toLowerCase();E==null||E(10);try{G==="excel"?await JA.ensureDependency("sheetjs"):G==="pdf"&&await Promise.all([JA.ensureDependency("jspdf"),JA.ensureDependency("jspdfAutotable")])}catch(W){if(K){if(console.warn(`Dependency missing for ${G}, falling back to print/csv...`),G==="excel")G="csv";else if(G==="pdf")return await dI(N,I,R)}else throw W}switch(E==null||E(30),G){case"csv":M=await PI(N,B,{onProgress:E}),L.toLowerCase().endsWith(".csv")||(L+=".csv");break;case"json":M=await cI(N,{onProgress:E}),L.toLowerCase().endsWith(".json")||(L+=".json");break;case"txt":M=await lI(N,{onProgress:E}),L.toLowerCase().endsWith(".txt")||(L+=".txt");break;case"excel":M=await hI(N,{onProgress:E}),L.toLowerCase().endsWith(".xlsx")||(L+=".xlsx");break;case"pdf":M=await JI(N,R,{onProgress:E}),L.toLowerCase().endsWith(".pdf")||(L+=".pdf");break;default:throw new Error(`Unsupported file type: ${A}`)}if(E==null||E(80),M.size>U)throw new Error(`File size ${(M.size/1024/1024).toFixed(2)}MB exceeds limit.`);if(G==="pdf"){uI(M,L),E==null||E(100);return}let T=URL.createObjectURL(M);try{let W=document.createElement("a");W.href=T,W.download=L,W.style.display="none",document.body.appendChild(W),W.click(),document.body.removeChild(W)}finally{setTimeout(()=>URL.revokeObjectURL(T),1e3)}E==null||E(100)}catch(M){throw console.error("Download failed:",M),M}}var U1=class{constructor(A="export"){this.defaultFilename=A}async exportToExcel(A,I={}){let O=this.extractTableData(A,I),U=[...O.headers,...O.rows,...O.footers];await H1(U,"excel",I.filename||this.defaultFilename,I)}async exportToCSV(A,I={}){let O=this.extractTableData(A,I),U=this.generateCsvContent(O,I.delimiter||",",`
|
|
100
100
|
`,!0);await H1(U,"csv",I.filename||this.defaultFilename,I)}async exportToPDF(A,I={}){let O=this.extractTableData(A,I);await H1(O,"pdf",I.filename||this.defaultFilename,I)}extractTableData(A,I={}){let{rowClass:O,cellClass:U,headerRowClass:E,footerRowClass:K,includeFooter:B=!0}=I,R={headers:[],rows:[],footers:[]},M=L=>Array.from(A.querySelectorAll(L)).map(T=>Array.from(T.querySelectorAll(U||"th, td")).map(W=>(W.textContent||"").trim().replace(/\s+/g," ")));if(E?R.headers=M(`.${E}`):(R.headers=M("thead tr"),R.headers.length===0&&(R.headers=M("tr:has(th)"))),O)R.rows=M(`.${O}`);else{let L=M("tbody tr");L.length>0?R.rows=L:R.rows=M("tr:not(thead tr):not(tfoot tr)")}return B&&(K?R.footers=M(`.${K}`):R.footers=M("tfoot tr")),R}generateCsvContent(A,I,O,U){let K=[...A.headers,...A.rows,...A.footers].map(B=>B.map(R=>this.escapeCsvValue(R,I)).join(I)).join(O);return U?"\uFEFF"+K:K}escapeCsvValue(A,I){let O=String(A||"");return O.includes('"')||O.includes(I)||O.includes(`
|
|
101
101
|
`)?`"${O.replace(/"/g,'""')}"`:O}};async function PI(N,A){let I;return Array.isArray(N)?I=N.map(O=>Array.isArray(O)?O.map(U=>String(U)).join(A):JSON.stringify(O)).join(`
|
|
102
102
|
`):I=String(N),new Blob(["\uFEFF"+I],{type:"text/csv;charset=utf-8"})}async function cI(N){return new Blob([JSON.stringify(N,null,2)],{type:"application/json"})}async function lI(N){return new Blob([String(N)],{type:"text/plain"})}async function hI(N){if(typeof XLSX>"u")throw new Error("SheetJS not loaded");let A=XLSX.utils.book_new(),I=XLSX.utils.aoa_to_sheet(N);XLSX.utils.book_append_sheet(A,I,"Sheet1");let O=XLSX.write(A,{bookType:"xlsx",type:"array"});return new Blob([O],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})}async function JI(N,A){let I=window.jspdf?window.jspdf.jsPDF:window.jsPDF;if(!I)throw new Error("jsPDF library not found");let O=new I({orientation:A.orientation||"portrait",unit:"mm",format:A.format||"a4"}),U=A.title||"";if(U&&(O.setFontSize(16),O.text(U,14,15)),typeof N=="string"||Array.isArray(N)&&typeof N[0]=="string"&&!Array.isArray(N[0])){O.setFontSize(11);let K=Array.isArray(N)?N.join(`
|
|
@@ -1487,5 +1487,5 @@ var e1=Object.defineProperty;var sI=Object.getOwnPropertyDescriptor;var rI=Objec
|
|
|
1487
1487
|
<button class="confirm-btn">Confirm Location</button>
|
|
1488
1488
|
</div>
|
|
1489
1489
|
</div>
|
|
1490
|
-
`,l4(),document.body.appendChild(N),H4(),N}function p2(N,A){if(!N){alert("please provide an `onConfirm` callback!");return}let I=u4();return I._callbacks={onConfirm:N,onCancel:A},d4(I),I}var B1=class{constructor(A){this.viewConfigs=A,this.loadedStyles=new Set,this.currentView=null,this.currentModule=null}async loadView(A){if(!A)return;let I=A.replace("-view",""),O=document.getElementById(A);if(!O)return;let U=this.viewConfigs[I];if(!U){console.error(`\u274C No config found for view: ${I}`);return}if(this.currentView!==I){this.currentView&&await this.unloadView(this.currentView);try{U.css&&(console.log(`Loading CSS: ${U.css}`),await this.loadCSS(I,U.css)),console.log(`Loading HTML: ${U.html}`);let E=await fetch(U.html);if(!E.ok)throw new Error(`HTTP ${E.status}`);let K=await E.text();O.innerHTML=K,U.js&&(console.log(`Loading JS: ${U.js}`),await this.loadJS(I,U.js)),this.currentView=I,console.log(`View loaded: ${I}`)}catch(E){console.error(`Failed to load view ${I}:`,E),O.innerHTML=`<p style="color: red; padding: 20px;">Error loading ${I}: ${E.message}</p>`}}}async loadCSS(A,I){let O=`style-${A}`,U=document.getElementById(O);U&&U.remove();let E=document.createElement("link");return E.id=O,E.rel="stylesheet",E.href=I,new Promise(K=>{E.onload=()=>{this.loadedStyles.add(A),console.log(`CSS loaded: ${I}`),K()},E.onerror=()=>{console.log(`CSS failed to load: ${I} (continuing anyway)`),K()},document.head.appendChild(E)})}async loadJS(A,I){try{let O=await import(I);this.currentModule=O,console.log("module====>",O),O.init&&typeof O.init=="function"&&(console.log(`Initializing ${A}...`),O.init()),console.log(`JS loaded: ${I}`)}catch(O){console.log(`No JS module for ${A} or error:`,O)}}async unloadView(A){console.log(`Unloading view: ${A}`);let I=document.getElementById(`style-${A}`);I&&(I.remove(),this.loadedStyles.delete(A)),this.currentModule&&this.currentModule.cleanup&&(console.log(`Cleaning up ${A}...`),this.currentModule.cleanup()),this.currentModule=null,this.currentView=null}};var uA={threshold:0,rootMargin:"0px",root:null,triggerOnce:!1},LA=new Map;function Z4(N,A){return`${N?N.id||N.tagName+N.className:"viewport"}::${A}`}var C1=class{constructor(A,I,O){this.onEnter=A,this.onExit=I,this.options=O,this.currentlyIntersecting=!1}};function m4(N,A){let I=Z4(N,A);return LA.has(I)||LA.set(I,{observer:null,callbacks:new Map,root:N,rootMargin:A,thresholds:new Set([0])}),LA.get(I)}function p4(N){let A=new Set([0]);return N.callbacks.forEach(I=>{I.forEach(O=>{let U=O.options.threshold;Array.isArray(U)?U.forEach(E=>A.add(E)):typeof U=="number"&&A.add(U)})}),Array.from(A).sort((I,O)=>I-O)}function g4(N){let A=p4(N);if(N.observer){let I=Array.from(N.observer.thresholds);if(I.length===A.length&&I.every((U,E)=>U===A[E]))return;N.observer.disconnect()}N.observer=new IntersectionObserver(I=>{f4(N,I)},{root:N.root,rootMargin:N.rootMargin,threshold:A}),N.callbacks.forEach((I,O)=>{N.observer.observe(O)}),N.thresholds=new Set(A)}function f4(N,A){A.forEach(I=>{let O=I.target,U=N.callbacks.get(O);if(!U)return;let E=I.isIntersecting,K=I.intersectionRatio;Array.from(U).forEach(R=>{var Y,P;let{onEnter:M,onExit:L,options:G}=R,T=(Y=G.threshold)!=null?Y:uA.threshold,W=(P=G.triggerOnce)!=null?P:uA.triggerOnce,t=Array.isArray(T)?T.some(s=>K>=s):K>=T;E&&t&&!R.currentlyIntersecting&&(R.currentlyIntersecting=!0,M&&typeof M=="function"&&M(O,I),W&&f2(N,O,R)),!E&&R.currentlyIntersecting&&(R.currentlyIntersecting=!1,L&&typeof L=="function"&&L(O,I))}),U.size===0&&(N.callbacks.delete(O),N.observer&&N.observer.unobserve(O))})}function a1(N,A={}){var R,M,L,G;let I=w4(N);if(!I)return()=>{};let{onEnter:O,onExit:U}=A;if(!O&&!U)return console.warn("[IntersectionWatcher] No callbacks provided. At least onEnter or onExit required."),()=>{};let E={threshold:(R=A.threshold)!=null?R:uA.threshold,rootMargin:(M=A.rootMargin)!=null?M:uA.rootMargin,root:(L=A.root)!=null?L:uA.root,triggerOnce:(G=A.triggerOnce)!=null?G:uA.triggerOnce},K=m4(E.root,E.rootMargin),B=new C1(O,U,E);return K.callbacks.has(I)||K.callbacks.set(I,new Set),K.callbacks.get(I).add(B),g4(K),K.observer.observe(I),()=>{f2(K,I,B)}}function g2(N,A={}){if(typeof N!="string")return console.warn("[IntersectionWatcher] watchAll requires a CSS selector string."),()=>{};let I=document.querySelectorAll(N);if(I.length===0)return console.warn(`[IntersectionWatcher] No elements found for selector: "${N}"`),()=>{};let O=Array.from(I).map(U=>a1(U,A));return()=>{O.forEach(U=>U())}}function f2(N,A,I){let O=N.callbacks.get(A);if(O&&(O.delete(I),O.size===0&&(N.callbacks.delete(A),N.observer&&N.observer.unobserve(A)),N.callbacks.size===0)){N.observer&&(N.observer.disconnect(),N.observer=null);for(let[U,E]of LA)if(E===N){LA.delete(U);break}}}function w4(N){if(typeof N=="string"){let A=document.querySelector(N);return A||(console.warn(`[IntersectionWatcher] Element not found: "${N}"`),null)}return N instanceof Element?N:(console.warn("[IntersectionWatcher] Invalid target. Must be Element or selector string."),null)}function P1(){LA.forEach(N=>{N.observer&&(N.observer.disconnect(),N.observer=null),N.callbacks.clear()}),LA.clear()}function w2(N){for(let A of LA.values())if(A.callbacks.has(N))return!0;return!1}function v2(){let N=0,A=0;return LA.forEach(I=>{N+=I.callbacks.size,I.callbacks.forEach(O=>{A+=O.size})}),{elements:N,callbacks:A,pools:LA.size}}typeof window<"u"&&window.addEventListener("beforeunload",()=>{P1()});var C={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4},V2={level:C.ERROR,timestamps:!0,colors:!0,output:null,namespaces:{}},FA={reset:"\x1B[0m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",namespace:"\x1B[35m"},c1=class N{constructor(A,I={}){if(typeof A!="string")throw new TypeError("Logger namespace must be a string");this.namespace=A,this.config={...V2,...I}}debug(...A){this._log(C.DEBUG,"DEBUG",...A)}info(...A){this._log(C.INFO,"INFO",...A)}warn(...A){this._log(C.WARN,"WARN",...A)}error(...A){this._log(C.ERROR,"ERROR",...A)}isDebugEnabled(){return this._shouldLog(C.DEBUG)}child(A){return new N(`${this.namespace}:${A}`,this.config)}_log(A,I,...O){if(!this._shouldLog(A))return;let U=this._formatMessage(I,...O);this._output(A,U)}_shouldLog(A){let I=this.config.namespaces[this.namespace];return I!==void 0?A>=I:A>=this.config.level}_formatMessage(A,...I){let O=[];if(this.config.timestamps&&O.push(`[${new Date().toISOString()}]`),this.config.colors){let U=FA[A.toLowerCase()]||FA.reset;O.push(`${U}[${A}]${FA.reset}`)}else O.push(`[${A}]`);return this.config.colors?O.push(`${FA.namespace}[${this.namespace}]${FA.reset}`):O.push(`[${this.namespace}]`),O.push(...I),O}_output(A,I){if(this.config.output){this.config.output(A,...I);return}A>=C.ERROR?console.error(...I):A>=C.WARN?console.warn(...I):console.log(...I)}},l1={...V2},R1=new Map;function S(N){if(R1.has(N))return R1.get(N);let A=new c1(N,l1);return R1.set(N,A),A}function y2(N){if(typeof N.level=="string"){let A={debug:C.DEBUG,info:C.INFO,warn:C.WARN,error:C.ERROR,silent:C.SILENT};N.level=A[N.level.toLowerCase()]||C.INFO}N.namespaces&&Object.keys(N.namespaces).forEach(A=>{let I=N.namespaces[A];if(typeof I=="string"){let O={debug:C.DEBUG,info:C.INFO,warn:C.WARN,error:C.ERROR,silent:C.SILENT};N.namespaces[A]=O[I.toLowerCase()]||C.INFO}}),l1={...l1,...N},R1.clear()}var v4=S("browser"),J1=class{constructor(){this._detectAll()}_detectAll(){if(this.isBrowser=typeof window<"u"&&typeof document<"u",this.isNode=!this.isBrowser&&typeof process<"u",!this.isBrowser){this._setNonBrowserDefaults();return}this.hasWebSocket=typeof window.WebSocket<"u",this.hasLocalStorage=this._checkStorage("localStorage"),this.hasSessionStorage=this._checkStorage("sessionStorage"),this.hasIndexedDB=this._checkIndexedDB(),this.hasBlob=typeof Blob<"u",this.hasArrayBuffer=typeof ArrayBuffer<"u",this.hasDataView=typeof DataView<"u",this.hasTypedArrays=typeof Uint8Array<"u",this.hasCrypto=typeof crypto<"u"&&typeof crypto.getRandomValues<"u",this.hasWorker=typeof Worker<"u",this.hasSharedWorker=typeof SharedWorker<"u",this.hasServiceWorker=typeof navigator<"u"&&"serviceWorker"in navigator,this.hasNetworkInfo=typeof navigator<"u"&&"connection"in navigator,this.hasBatteryInfo=typeof navigator<"u"&&"getBattery"in navigator,this.userAgent=navigator.userAgent,this.browserInfo=this._identifyBrowser(),this.osInfo=this._identifyOS(),this.isMobile=this._detectMobile(),this.isTablet=this._detectTablet(),this.screenSize={width:window.screen.width,height:window.screen.height},this.pixelRatio=window.devicePixelRatio||1,this.touchSupport="ontouchstart"in window||navigator.maxTouchPoints>0,this.hasPerformanceAPI=typeof performance<"u",this.deviceMemory=navigator.deviceMemory||4,this.hardwareConcurrency=navigator.hardwareConcurrency||2,v4.debug("Browser capabilities detected",{hasWebSocket:this.hasWebSocket,browser:this.browserInfo.name,mobile:this.isMobile,memory:this.deviceMemory})}_setNonBrowserDefaults(){this.hasWebSocket=!1,this.hasLocalStorage=!1,this.hasSessionStorage=!1,this.hasIndexedDB=!1,this.hasBlob=!1,this.hasArrayBuffer=!0,this.hasDataView=!0,this.hasTypedArrays=!0,this.hasCrypto=!1,this.hasWorker=!1,this.hasSharedWorker=!1,this.hasServiceWorker=!1,this.hasNetworkInfo=!1,this.hasBatteryInfo=!1,this.isMobile=!1,this.isTablet=!1,this.touchSupport=!1,this.hasPerformanceAPI=!0,this.deviceMemory=4,this.hardwareConcurrency=2,this.browserInfo={name:"node",version:process.version},this.osInfo={name:process.platform}}_checkStorage(A){try{let I=window[A],O="__websocket_test__";return I.setItem(O,"test"),I.removeItem(O),!0}catch{return!1}}_checkIndexedDB(){try{return typeof window.indexedDB<"u"}catch{return!1}}_identifyBrowser(){var U,E,K,B,R;let A=this.userAgent,I="unknown",O="unknown";return A.indexOf("Firefox")>-1?(I="firefox",O=((U=A.match(/Firefox\/(\d+\.\d+)/))==null?void 0:U[1])||"unknown"):A.indexOf("Chrome")>-1&&A.indexOf("Edg")===-1?(I="chrome",O=((E=A.match(/Chrome\/(\d+\.\d+)/))==null?void 0:E[1])||"unknown"):A.indexOf("Safari")>-1&&A.indexOf("Chrome")===-1?(I="safari",O=((K=A.match(/Version\/(\d+\.\d+)/))==null?void 0:K[1])||"unknown"):A.indexOf("Edg")>-1?(I="edge",O=((B=A.match(/Edg\/(\d+\.\d+)/))==null?void 0:B[1])||"unknown"):(A.indexOf("MSIE")>-1||A.indexOf("Trident")>-1)&&(I="ie",O=((R=A.match(/(?:MSIE |rv:)(\d+\.\d+)/))==null?void 0:R[1])||"unknown"),{name:I,version:O}}_identifyOS(){let A=this.userAgent,I="unknown",O="unknown";if(A.indexOf("Windows")>-1)I="windows",A.indexOf("Windows NT 10.0")>-1?O="10":A.indexOf("Windows NT 6.3")>-1?O="8.1":A.indexOf("Windows NT 6.2")>-1?O="8":A.indexOf("Windows NT 6.1")>-1&&(O="7");else if(A.indexOf("Mac OS X")>-1){I="macos";let U=A.match(/Mac OS X (\d+[._]\d+[._]\d+)/);U&&(O=U[1].replace(/_/g,"."))}else if(A.indexOf("Android")>-1){I="android";let U=A.match(/Android (\d+\.\d+)/);U&&(O=U[1])}else if(A.indexOf("iOS")>-1||A.indexOf("iPhone")>-1||A.indexOf("iPad")>-1){I="ios";let U=A.match(/OS (\d+[_\d]+) like Mac/);U&&(O=U[1].replace(/_/g,"."))}else A.indexOf("Linux")>-1&&(I="linux");return{name:I,version:O}}_detectMobile(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(this.userAgent)}_detectTablet(){return/iPad|Android(?!.*Mobile)|Tablet/i.test(this.userAgent)}getRecommendedTransports(){let A=[];return this.hasWebSocket&&A.push("websocket"),typeof EventSource<"u"&&A.push("eventsource"),A.push("polling"),A}hasMemoryConstraints(){return this.isMobile||this.deviceMemory<=2}getMaxQueueSize(){return this.hasMemoryConstraints()?100:1e3}isLegacyBrowser(){let{name:A,version:I}=this.browserInfo,O=parseFloat(I);return A==="ie"||A==="firefox"&&O<50||A==="chrome"&&O<50||A==="safari"&&O<10}},h1=null;function p(){return h1||(h1=new J1),h1}function F2(){return p().hasWebSocket}function x2(){return p().isMobile}function b2(){if(!p().hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:A.type||"unknown",effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData||!1}:null}var W6=p();function V(N=""){let A=Date.now().toString(36),I=Math.random().toString(36).substring(2,10),O=`${A}${I}`;return N?`${N}_${O}`:O}function _2(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,N=>{let A=Math.random()*16|0;return(N==="x"?A:A&3|8).toString(16)})}function ZA(N){if(typeof N!="string"||N.trim()===""||!N.startsWith("ws://")&&!N.startsWith("wss://"))return!1;try{let A=new URL(N);return A.hostname&&A.hostname.includes(".")}catch{return!1}}function d1(N,A=null){if(typeof N!="string")return A;try{return JSON.parse(N)}catch{return A}}function u1(N,A=0){try{let I=new WeakSet;return JSON.stringify(N,(O,U)=>{if(typeof U=="object"&&U!==null){if(I.has(U))return"[Circular]";I.add(U)}return U},A)}catch{return""}}function xA(N){if(N===null||typeof N!="object")return N;if(N instanceof Date)return new Date(N.getTime());if(N instanceof Array)return N.map(A=>xA(A));if(N instanceof Object){let A={};return Object.keys(N).forEach(I=>{A[I]=xA(N[I])}),A}return N}function Z1(N,A){let I=xA(N);return!A||typeof A!="object"||Object.keys(A).forEach(O=>{let U=A[O],E=I[O];U instanceof Array?I[O]=xA(U):U instanceof Object&&E instanceof Object?I[O]=Z1(E,U):I[O]=xA(U)}),I}function iA(N,A={}){let{baseDelay:I=1e3,maxDelay:O=3e4,jitter:U=!0}=A,E=I*Math.pow(2,N);if(E=Math.min(E,O),U){let K=.8+.4*Math.random();E=Math.floor(E*K)}return E}function mA(N){return new Promise(A=>setTimeout(A,N))}function nA(){let N,A;return{promise:new Promise((O,U)=>{N=O,A=U}),resolve:N,reject:A}}function M1(N){if(N==null)return 0;if(typeof N=="string")return new Blob([N]).size;if(N instanceof Blob)return N.size;if(N instanceof ArrayBuffer||N instanceof DataView||ArrayBuffer.isView(N))return N.byteLength;if(typeof N=="object"){let A=u1(N);return A?new Blob([A]).size:0}return new Blob([String(N)]).size}function L1(N,A){return Date.now()>N+A}function k2(N,A){let I=N+A-Date.now();return Math.max(0,I)}function bA(N,A){return Object.values(A).includes(N)}function _A(N){return typeof N!="string"?!1:N==="/"?!0:/^\/[a-zA-Z0-9_-]+(\/[a-zA-Z0-9_-]+)*$/.test(N)}var SA=S("network"),g={OFFLINE:"offline",ONLINE:"online",DEGRADED:"degraded",CHECKING:"checking"},$={UNKNOWN:"unknown",ETHERNET:"ethernet",WIFI:"wifi",CELLULAR:"cellular",NONE:"none"},p1=class{constructor(){this.browser=p(),this.listeners=new Map,this.status={state:g.CHECKING,type:$.UNKNOWN,effectiveType:null,downlink:null,rtt:null,lastChanged:Date.now(),since:Date.now()},this._checkInterval=null,this._checking=!1,this._initialized=!1,this.browser.isBrowser&&this._initBrowserListeners()}_initBrowserListeners(){if(window.addEventListener("online",()=>this._handleBrowserOnline()),window.addEventListener("offline",()=>this._handleBrowserOffline()),this.browser.hasNetworkInfo){let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;A&&A.addEventListener("change",()=>this._handleConnectionChange())}this._startPeriodicChecks(),this._checkStatus().then(()=>{this._initialized=!0,SA.info("Network monitor initialized",this.status)}),SA.debug("Network listeners initialized")}_startPeriodicChecks(){this._checkInterval=setInterval(()=>{this._checkStatus()},3e4)}_handleBrowserOnline(){SA.info("Browser reported online"),this._checkStatus(!0)}_handleBrowserOffline(){SA.warn("Browser reported offline"),this._updateStatus({state:g.OFFLINE,type:$.NONE,lastChanged:Date.now()})}_handleConnectionChange(){SA.debug("Network connection changed"),this._checkStatus(!0)}async _checkStatus(A=!1){if(this._checking)return this.status;this._checking=!0,this._updateStatus({state:g.CHECKING});try{if(!this._getBasicOnlineStatus()){this._updateStatus({state:g.OFFLINE,type:$.NONE},A);return}let O=this._getNetworkInfo();if(!await this._verifyConnectivity()){this._updateStatus({state:g.DEGRADED,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt},A);return}let E=this._determineNetworkQuality(O);this._updateStatus({state:E,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt,lastChanged:this.status.state!==E?Date.now():this.status.lastChanged},A)}catch(I){SA.error("Error checking network status:",I)}finally{this._checking=!1}}_getBasicOnlineStatus(){return typeof navigator>"u"||typeof navigator.onLine!="boolean"?!0:navigator.onLine}_getNetworkInfo(){if(!this.browser.hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:this._mapConnectionType(A.type),effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData}:null}_mapConnectionType(A){return A&&{wifi:$.WIFI,cellular:$.CELLULAR,ethernet:$.ETHERNET,none:$.NONE,unknown:$.UNKNOWN}[A]||$.UNKNOWN}async _verifyConnectivity(){if(!this._getBasicOnlineStatus())return!1;let A=["https://www.google.com/favicon.ico","https://www.cloudflare.com/favicon.ico","https://www.github.com/favicon.ico"];for(let I of A)try{let O=new AbortController,U=setTimeout(()=>O.abort(),3e3),E=await fetch(I,{method:"HEAD",mode:"no-cors",cache:"no-cache",signal:O.signal});return clearTimeout(U),!0}catch{continue}return!1}_determineNetworkQuality(A){return A&&(A.effectiveType&&(A.effectiveType==="slow-2g"||A.effectiveType==="2g")||A.rtt&&A.rtt>500||A.downlink&&A.downlink<.5)?g.DEGRADED:g.ONLINE}_updateStatus(A,I=!1){let O={...this.status};this.status={...this.status,...A},(I||O.state!==this.status.state||O.type!==this.status.type)&&(SA.info(`Network status changed: ${O.state} -> ${this.status.state}`,{type:this.status.type,effectiveType:this.status.effectiveType}),this._notifyListeners(O,this.status))}_notifyListeners(A,I){this.listeners.forEach((O,U)=>{try{O(I,A)}catch(E){SA.error(`Error in listener ${U}:`,E)}})}getStatus(){return{...this.status}}isOnline(){return this.status.state===g.ONLINE||this.status.state===g.DEGRADED}isFullyOnline(){return this.status.state===g.ONLINE}isOffline(){return this.status.state===g.OFFLINE}onChange(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}waitForOnline(A=3e4){let I=nA();if(this.isOnline())return I.resolve(),I.promise;let O=setTimeout(()=>{U(),I.reject(new Error(`Timeout waiting for network after ${A}ms`))},A),U=this.onChange(E=>{(E.state===g.ONLINE||E.state===g.DEGRADED)&&(clearTimeout(O),U(),I.resolve())});return I.promise}async checkNow(){return await this._checkStatus(!0),this.getStatus()}destroy(){this._checkInterval&&(clearInterval(this._checkInterval),this._checkInterval=null),this.listeners.clear(),SA.debug("Network monitor destroyed")}},m1=null;function UA(){return m1||(m1=new p1),m1}function G1(){return UA().isOnline()}function q2(N){return UA().onChange(N)}var r6=UA();var f=S("heartbeat"),EA={PING_SENT:"ping_sent",PONG_RECEIVED:"pong_received",MISSED:"missed",DEAD:"dead",LATENCY_UPDATED:"latency_updated"},w={STOPPED:"stopped",RUNNING:"running",WAITING:"waiting",FAILED:"failed"},g1=class{constructor(A={}){this.options={interval:3e4,timeout:1e4,maxMissed:2,adaptive:!0,...A},this.network=UA(),this.state=w.STOPPED,this.pingInterval=null,this.pingTimeout=null,this.missedCount=0,this.lastPingTime=0,this.lastPongTime=0,this.latency=null,this.latencyHistory=[],this.pingId=0,this.listeners=new Map,this.pendingPings=new Map,this._sendPing=this._sendPing.bind(this),this._handlePongTimeout=this._handlePongTimeout.bind(this),this._onNetworkChange=this._onNetworkChange.bind(this),f.debug("Heartbeat manager created",this.options)}start(){if(this.state!==w.STOPPED){f.warn("Heartbeat already running or failed");return}if(!this.network.isOnline()){f.info("Network offline, heartbeat will start when online"),this.network.onChange(this._onNetworkChange);return}this.state=w.RUNNING,this.missedCount=0,this._schedulePing(),f.info("Heartbeat started"),this._emit(EA.PING_SENT,{state:this.state})}stop(){this.state=w.STOPPED,this._clearTimers(),this.missedCount=0,this.pendingPings.clear(),f.info("Heartbeat stopped")}reset(){this.stop(),this.missedCount=0,this.latency=null,this.pendingPings.clear(),f.debug("Heartbeat reset")}pongReceived(A){let I=Date.now();this.lastPongTime=I;let O=null,U=null;if(A&&A.id)O=A.id,U=this.pendingPings.get(O)||null,this.pendingPings.delete(O);else{let E=Array.from(this.pendingPings.entries()).sort((K,B)=>B[1]-K[1])[0];E&&(O=E[0],U=E[1],this.pendingPings.delete(O))}if(U){let E=I-U;this._updateLatency(E)}this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null),this.missedCount=0,this.state=w.RUNNING,f.debug("Pong received",{pingId:O,latency:this.latency,missed:this.missedCount}),this._emit(EA.PONG_RECEIVED,{latency:this.latency,pingId:O}),this._schedulePing()}getStatus(){return{state:this.state,missed:this.missedCount,latency:this.latency,lastPing:this.lastPingTime,lastPong:this.lastPongTime,uptime:this.lastPingTime?Date.now()-this.lastPingTime:0}}getLatency(){return this.latency}isHealthy(){return this.state===w.RUNNING&&this.missedCount===0}isFailing(){return this.state===w.FAILED||this.missedCount>=this.options.maxMissed}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}_schedulePing(){this._clearTimers();let A=this.options.interval;this.options.adaptive&&this.network.getStatus().state==="degraded"&&(A=A*1.5),this.pingInterval=setTimeout(()=>{this._sendPing()},A)}_sendPing(){if(this.state===w.STOPPED)return;if(!this.network.isOnline()){f.debug("Network offline, skipping ping"),this._schedulePing();return}let A=Date.now();this.lastPingTime=A;let I=this.pingId++;this.pendingPings.set(I,A);try{let O={type:"ping",id:I,timestamp:A};this.options.sendPing(O),f.debug("Ping sent",{pingId:I}),this._emit(EA.PING_SENT,{pingId:I})}catch(O){f.error("Failed to send ping:",O),this._handlePongTimeout();return}this.state=w.WAITING,this.pingTimeout=setTimeout(()=>{this._handlePongTimeout(I)},this.options.timeout)}_handlePongTimeout(A){if(this.missedCount++,f.warn("Pong timeout",{pingId:A,missed:this.missedCount,max:this.options.maxMissed}),this._emit(EA.MISSED,{pingId:A,missed:this.missedCount,total:this.options.maxMissed}),this.pendingPings.delete(A),this.missedCount>=this.options.maxMissed){this._handleDeadConnection();return}this.state=w.RUNNING,this._schedulePing()}_handleDeadConnection(){this.state=w.FAILED,f.error("Heartbeat failed - connection appears dead",{missed:this.missedCount,lastPing:this.lastPingTime,lastPong:this.lastPongTime}),this._emit(EA.DEAD,{missed:this.missedCount,latency:this.latency}),this.stop()}_updateLatency(A){this.latencyHistory.push(A),this.latencyHistory.length>10&&this.latencyHistory.shift();let I=this.latencyHistory.reduce((O,U)=>O+U,0)/this.latencyHistory.length;this.latency=Math.round(I),this._emit(EA.LATENCY_UPDATED,{latency:this.latency,raw:A})}_onNetworkChange(A){A.state==="online"&&this.state===w.STOPPED&&(f.info("Network restored, starting heartbeat"),this.start()),A.state==="offline"&&this.state!==w.STOPPED&&(f.info("Network offline, stopping heartbeat"),this.stop())}_clearTimers(){this.pingInterval&&(clearTimeout(this.pingInterval),this.pingInterval=null),this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){f.error("Error in heartbeat listener:",U)}})}};function T1(N){return new g1(N)}var l=S("connection"),J={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTING:"disconnecting",RECONNECTING:"reconnecting",FAILED:"failed"},KA={INTENTIONAL:"intentional",NETWORK_LOST:"network_lost",SERVER_CLOSED:"server_closed",TIMEOUT:"timeout",HEARTBEAT_FAILED:"heartbeat_failed",ERROR:"error"},_={CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnect_failed",FAILED:"failed",STATE_CHANGED:"state_changed",STATS_UPDATED:"stats_updated"},f1=class{constructor(A,I={}){if(!ZA(A))throw new Error(`Invalid WebSocket URL: ${A}`);this.url=A,this.options={timeout:1e4,autoConnect:!1,reconnect:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},createWebSocket:O=>new WebSocket(O),...I},this.network=UA(),this.browser=p(),this.state=J.DISCONNECTED,this.ws=null,this.heartbeat=null,this.connectionAttempts=0,this.reconnectAttempts=0,this.lastConnectedAt=null,this.lastDisconnectedAt=null,this.disconnectReason=null,this.stats={connectedAt:null,disconnectedAt:null,connectionDuration:0,messagesSent:0,messagesReceived:0,bytesSent:0,bytesReceived:0,reconnectCount:0},this._connectionPromise=null,this._connectionResolve=null,this._connectionReject=null,this._disconnectPromise=null,this._disconnectResolve=null,this._reconnectTimer=null,this.listeners=new Map,this._networkUnsubscribe=this.network.onChange(O=>this._onNetworkChange(O)),this._handleOpen=this._handleOpen.bind(this),this._handleMessage=this._handleMessage.bind(this),this._handleClose=this._handleClose.bind(this),this._handleError=this._handleError.bind(this),this._handleHeartbeatEvent=this._handleHeartbeatEvent.bind(this),l.info("Connection manager created",{url:A}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}connect(){return this.state===J.CONNECTED?Promise.resolve():this.state===J.CONNECTING&&this._connectionPromise?this._connectionPromise:this.network.isOnline()?(this._setState(J.CONNECTING),this.reconnectAttempts=0,this.disconnectReason=null,this._connectionPromise=new Promise((A,I)=>{this._connectionResolve=A,this._connectionReject=I}),this._performConnection(),this._connectionPromise):(l.warn("Cannot connect: network offline"),Promise.reject(new Error("Network offline")))}disconnect(A=1e3,I=""){if(this.state===J.DISCONNECTED)return Promise.resolve();if(this._clearReconnectTimer(),this.disconnectReason=KA.INTENTIONAL,this._setState(J.DISCONNECTING),this._disconnectPromise=new Promise(O=>{this._disconnectResolve=O}),this.heartbeat&&this.heartbeat.stop(),this.ws){this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null;try{this.ws.close(A,I)}catch(O){l.error("Error closing WebSocket:",O)}}else this._cleanup(),this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null);return this._disconnectPromise}async reconnect(){return l.info("Forcing reconnection"),this.state!==J.DISCONNECTED&&await this.disconnect(1e3,"Forced reconnection"),await mA(100),this.connect()}getStatus(){let A=Date.now();return{state:this.state,url:this.url,connectedAt:this.stats.connectedAt,disconnectedAt:this.stats.disconnectedAt,uptime:this.stats.connectedAt?A-this.stats.connectedAt:0,reconnectAttempts:this.reconnectAttempts,reconnectCount:this.stats.reconnectCount,disconnectReason:this.disconnectReason,messages:{sent:this.stats.messagesSent,received:this.stats.messagesReceived},bytes:{sent:this.stats.bytesSent,received:this.stats.bytesReceived},heartbeat:this.heartbeat?this.heartbeat.getStatus():null,network:this.network.getStatus()}}isConnected(){return this.state===J.CONNECTED}isHealthy(){return this.isConnected()&&(!this.heartbeat||this.heartbeat.isHealthy())}send(A){if(!this.isConnected()||!this.ws)throw new Error("Not connected");try{typeof A=="string"?this.stats.bytesSent+=new Blob([A]).size:A instanceof Blob?this.stats.bytesSent+=A.size:A instanceof ArrayBuffer&&(this.stats.bytesSent+=A.byteLength),this.ws.send(A),this.stats.messagesSent++}catch(I){throw l.error("Send failed:",I),I}}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}destroy(){l.info("Destroying connection manager"),this.state!==J.DISCONNECTED&&this.disconnect(1e3,"Manager destroyed"),this._networkUnsubscribe&&this._networkUnsubscribe(),this._clearReconnectTimer(),this.listeners.clear()}_performConnection(){if(!this.network.isOnline()){this._handleConnectionFailure(new Error("Network offline"),!0);return}l.info("Connecting...",{attempt:this.reconnectAttempts+1,url:this.url});try{this.ws=this.options.createWebSocket(this.url),this.ws.onopen=this._handleOpen,this.ws.onmessage=this._handleMessage,this.ws.onclose=this._handleClose,this.ws.onerror=this._handleError,this._connectionTimeout=setTimeout(()=>{if(this.state===J.CONNECTING){let A=new Error(`Connection timeout after ${this.options.timeout}ms`);this._handleConnectionFailure(A)}},this.options.timeout)}catch(A){this._handleConnectionFailure(A)}}_handleOpen(){l.info("WebSocket opened"),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null);let A=Date.now();this.lastConnectedAt=A,this.stats.connectedAt=A,this.stats.disconnectedAt=null,this.reconnectAttempts>0&&this.stats.reconnectCount++,this.reconnectAttempts=0,this.options.heartbeat.enabled&&this._setupHeartbeat(),this._setState(J.CONNECTED),this._connectionResolve&&(this._connectionResolve(),this._connectionResolve=null,this._connectionReject=null),this._emit(_.CONNECTED,{timestamp:A})}_handleMessage(A){if(this.stats.messagesReceived++,typeof A.data=="string"?this.stats.bytesReceived+=new Blob([A.data]).size:A.data instanceof Blob?this.stats.bytesReceived+=A.data.size:A.data instanceof ArrayBuffer&&(this.stats.bytesReceived+=A.data.byteLength),this.heartbeat)try{let I=JSON.parse(A.data);if(I.type==="pong"){this.heartbeat.pongReceived(I);return}}catch{}this._emit("message",A.data)}_handleClose(A){l.info("WebSocket closed",{code:A.code,reason:A.reason,wasClean:A.wasClean});let I=this.disconnectReason===KA.INTENTIONAL;if(this.lastDisconnectedAt=Date.now(),this.stats.disconnectedAt=Date.now(),this.stats.connectedAt&&(this.stats.connectionDuration+=this.lastDisconnectedAt-this.stats.connectedAt),this.heartbeat&&(this.heartbeat.stop(),this.heartbeat=null),this._cleanup(),I){this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null),this._emit(_.DISCONNECTED,{reason:KA.INTENTIONAL,code:A.code});return}let O;this.network.isOnline()?A.code===1006?O=KA.TIMEOUT:O=KA.SERVER_CLOSED:O=KA.NETWORK_LOST,this.disconnectReason=O,this._handleReconnection(O,A)}_handleError(A){l.error("WebSocket error",A),this._emit("error",A)}_handleConnectionFailure(A,I=!1){l.error("Connection failed:",A.message),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),this._cleanup(),this._connectionReject&&(this._connectionReject(A),this._connectionResolve=null,this._connectionReject=null);let O=I?KA.NETWORK_LOST:KA.ERROR;this._handleReconnection(O,null,A)}_handleReconnection(A,I,O){if(this._setState(J.RECONNECTING),this.disconnectReason=A,this._emit(_.DISCONNECTED,{reason:A,code:I==null?void 0:I.code,error:O==null?void 0:O.message}),this.reconnectAttempts>=this.options.reconnect.maxAttempts){l.error("Max reconnection attempts reached",{attempts:this.reconnectAttempts}),this._setState(J.FAILED),this._emit(_.FAILED,{reason:"max_attempts",attempts:this.reconnectAttempts});return}let U=iA(this.reconnectAttempts,this.options.reconnect);l.info(`Reconnecting in ${U}ms`,{attempt:this.reconnectAttempts+1,max:this.options.reconnect.maxAttempts}),this._emit(_.RECONNECTING,{attempt:this.reconnectAttempts+1,maxAttempts:this.options.reconnect.maxAttempts,delay:U}),this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this.reconnectAttempts++,this._performConnection()},U)}_onNetworkChange(A){l.debug("Network changed:",A.state),A.state==="online"&&(this.state===J.RECONNECTING||this.state===J.DISCONNECTED)&&(l.info("Network restored, retrying connection"),this._clearReconnectTimer(),this._performConnection()),A.state==="offline"&&this.isConnected()&&l.warn("Network lost, connection will likely fail")}_handleHeartbeatEvent(A,I){A===EA.DEAD&&(l.error("Heartbeat dead, reconnecting"),this.disconnectReason=KA.HEARTBEAT_FAILED,this.ws&&this.ws.close()),A===EA.LATENCY_UPDATED&&this._emit("latency",{latency:I.latency})}_setupHeartbeat(){this.ws&&(this.heartbeat=T1({interval:this.options.heartbeat.interval,timeout:this.options.heartbeat.timeout,sendPing:A=>{try{this.ws.send(JSON.stringify(A)),this.stats.messagesSent++}catch(I){l.error("Failed to send ping:",I)}}}),this.heartbeat.onEvent(this._handleHeartbeatEvent),this.heartbeat.start())}_setState(A){let I=this.state;I!==A&&(this.state=A,l.debug(`State: ${I} -> ${A}`),this._emit(_.STATE_CHANGED,{from:I,to:A}))}_cleanup(){this.ws&&(this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null,this.ws=null),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null)}_clearReconnectTimer(){this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){l.error("Error in event listener:",U)}})}};function W1(N,A={}){return new f1(N,A)}var H=S("transport"),Z={WEBSOCKET:"websocket",EVENTSOURCE:"eventsource",POLLING:"polling",NONE:"none"},D={IDLE:"idle",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTED:"disconnected",FAILED:"failed"},e={CONNECT:"connect",MESSAGE:"message",DISCONNECT:"disconnect",ERROR:"error",TRANSPORT_CHANGED:"transport_changed"},kA=class{constructor(A,I={}){this.url=A,this.options=I,this.state=D.IDLE,this.listeners=new Map}connect(){throw new Error("Not implemented")}disconnect(){throw new Error("Not implemented")}send(A){throw new Error("Not implemented")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){H.error("Error in event listener:",E)}})}getState(){return this.state}getType(){return Z.NONE}},w1=class extends kA{constructor(A,I={}){super(A,I),this.ws=null,this.pendingMessages=[],this.type=Z.WEBSOCKET}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,H.info("WebSocket connecting to:",this.url);try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{for(H.info("WebSocket connected"),this.state=D.CONNECTED;this.pendingMessages.length>0;){let A=this.pendingMessages.shift();this.send(A)}this._emit(e.CONNECT,{transport:this.type})},this.ws.onmessage=A=>{this._emit(e.MESSAGE,A.data)},this.ws.onclose=A=>{H.info("WebSocket closed",{code:A.code,reason:A.reason}),this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{code:A.code,reason:A.reason,wasClean:A.wasClean})},this.ws.onerror=A=>{H.error("WebSocket error:",A),this._emit(e.ERROR,A)}}catch(A){H.error("WebSocket creation failed:",A),this.state=D.FAILED,this._emit(e.ERROR,A)}}}disconnect(){this.ws&&(this.ws.close(1e3,"Intentional disconnect"),this.ws=null),this.state=D.DISCONNECTED,this.pendingMessages=[]}send(A){if(this.state===D.CONNECTED&&this.ws)try{return this.ws.send(A),!0}catch(I){return H.error("WebSocket send failed:",I),!1}else return this.pendingMessages.push(A),!1}},v1=class extends kA{constructor(A,I={}){super(A,I),this.es=null,this.sendQueue=[],this.type=Z.EVENTSOURCE,this.connectUrl=A,this.sendUrl=A.replace(/^ws/,"http").replace(/^wss/,"https")}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,H.info("EventSource connecting to:",this.connectUrl);try{this.es=new EventSource(this.connectUrl),this.es.onopen=()=>{H.info("EventSource connected"),this.state=D.CONNECTED,this._emit(e.CONNECT,{transport:this.type})},this.es.onmessage=A=>{this._emit(e.MESSAGE,A.data)},this.es.onerror=A=>{H.error("EventSource error:",A),this.state===D.CONNECTED&&(this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"error"})),this._emit(e.ERROR,A)}}catch(A){H.error("EventSource creation failed:",A),this.state=D.FAILED,this._emit(e.ERROR,A)}}}disconnect(){this.es&&(this.es.close(),this.es=null),this.state=D.DISCONNECTED,this.sendQueue=[]}send(A){if(this.state!==D.CONNECTED)return this.sendQueue.push(A),!1;try{return fetch(this.sendUrl,{method:"POST",body:A,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(I=>{H.error("EventSource send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return H.error("EventSource send failed:",I),!1}}},V1=class extends kA{constructor(A,I={}){super(A,I),this.pollingInterval=I.pollingInterval||3e3,this.pollingActive=!1,this.sendQueue=[],this.messageQueue=[],this.pollTimeout=null,this.type=Z.POLLING,this.baseUrl=A.replace(/^ws/,"http").replace(/^wss/,"https"),this.pollUrl=`${this.baseUrl}/poll`,this.sendUrl=`${this.baseUrl}/send`}getType(){return this.type}connect(){this.state===D.IDLE&&(this.state=D.CONNECTING,H.info("Polling connecting to:",this.baseUrl),this.pollingActive=!0,this._poll(),this.state=D.CONNECTED,this._emit(e.CONNECT,{transport:this.type}))}disconnect(){this.pollingActive=!1,this.pollTimeout&&(clearTimeout(this.pollTimeout),this.pollTimeout=null),this.state=D.DISCONNECTED,this.sendQueue=[],this.messageQueue=[]}send(A){if(this.state!==D.CONNECTED)return this.sendQueue.push(A),!1;try{return fetch(this.sendUrl,{method:"POST",body:A,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(I=>{H.error("Polling send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return H.error("Polling send failed:",I),!1}}async _poll(){if(this.pollingActive){try{let A=new AbortController,I=setTimeout(()=>A.abort(),3e4),O=await fetch(this.pollUrl,{method:"GET",signal:A.signal,headers:{"Cache-Control":"no-cache"}});if(clearTimeout(I),O.ok){let U=await O.text();U&&this._emit(e.MESSAGE,U)}}catch(A){if(A.name==="AbortError")H.debug("Poll timeout, restarting");else if(H.error("Poll failed:",A),this._emit(e.ERROR,A),!navigator.onLine){this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"network_lost"});return}}this.pollingActive&&(this.pollTimeout=setTimeout(()=>this._poll(),this.pollingInterval))}}},y1=class{constructor(A,I={}){this.url=A,this.options={transports:[Z.WEBSOCKET,Z.EVENTSOURCE,Z.POLLING],timeout:1e4,pollingInterval:3e3,...I},this.browser=p(),this.network=UA(),this.currentTransport=null,this.transportType=Z.NONE,this.state=D.IDLE,this.listeners=new Map,this.availableTransports=this._getAvailableTransports(),H.info("Transport manager created",{available:this.availableTransports})}async connect(){if(this.state===D.CONNECTED)return;if(this.state=D.CONNECTING,!this.network.isOnline()){let I=new Error("Network offline");throw this._emit(e.ERROR,I),I}for(let I of this.availableTransports){H.info(`Trying transport: ${I}`);try{await this._tryTransport(I),H.info(`Connected using ${I}`),this.transportType=I,this.state=D.CONNECTED,this._emit(e.TRANSPORT_CHANGED,{transport:I}),this._emit(e.CONNECT,{transport:I});return}catch(O){H.warn(`Transport ${I} failed:`,O.message)}}this.state=D.FAILED;let A=new Error("No transport available");throw this._emit(e.ERROR,A),A}disconnect(){this.currentTransport&&(this.currentTransport.disconnect(),this.currentTransport=null),this.transportType=Z.NONE,this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"intentional"})}send(A){return!this.currentTransport||this.state!==D.CONNECTED?!1:this.currentTransport.send(A)}getTransportType(){return this.transportType}getState(){return this.state}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_tryTransport(A){return new Promise((I,O)=>{let U;switch(A){case Z.WEBSOCKET:U=new w1(this.url,this.options);break;case Z.EVENTSOURCE:U=new v1(this.url,this.options);break;case Z.POLLING:U=new V1(this.url,this.options);break;default:O(new Error(`Unknown transport: ${A}`));return}let E,K,B=()=>{E&&E(),K&&K(),clearTimeout(R)},R=setTimeout(()=>{U.disconnect(),B(),O(new Error(`Transport ${A} timeout`))},this.options.timeout);E=U.on(e.CONNECT,()=>{this.currentTransport=U,this._forwardTransportEvents(U),B(),I()}),K=U.on(e.ERROR,M=>{B(),O(M||new Error(`Transport ${A} failed`))}),U.connect()})}_forwardTransportEvents(A){[e.MESSAGE,e.DISCONNECT,e.ERROR].forEach(O=>{A.on(O,U=>{this._emit(O,U),O===e.DISCONNECT&&(this.state=D.DISCONNECTED)})})}_getAvailableTransports(){return this.options.transports.filter(A=>{switch(A){case Z.WEBSOCKET:return this.browser.hasWebSocket;case Z.EVENTSOURCE:return typeof EventSource<"u";case Z.POLLING:return!0;default:return!1}})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){H.error("Error in event listener:",E)}})}};function Y1(N,A={}){return new y1(N,A)}var qA=S("client"),V4={autoConnect:!1,timeout:1e4,reconnect:!0,reconnectOptions:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},transport:{transports:["websocket","eventsource","polling"],pollingInterval:3e3},debug:!1},F1=class{constructor(A,I={}){if(!ZA(A))throw new TypeError(`Invalid WebSocket URL: ${A}`);this.url=A,this.options=Z1(V4,I),this.options.debug&&qA.debug("Debug mode enabled"),this.browser=p(),this.transport=Y1(A,{transports:this.options.transport.transports,timeout:this.options.timeout,pollingInterval:this.options.transport.pollingInterval}),this.connection=W1(A,{timeout:this.options.timeout,reconnect:{maxAttempts:this.options.reconnectOptions.maxAttempts,baseDelay:this.options.reconnectOptions.baseDelay,maxDelay:this.options.reconnectOptions.maxDelay,jitter:this.options.reconnectOptions.jitter},heartbeat:this.options.heartbeat,createWebSocket:null,transport:this.transport}),this.messageHandlers=new Map,this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.messageCounter=0,this.pendingAcks=new Map,this._handleConnectionEvent=this._handleConnectionEvent.bind(this),this._handleTransportMessage=this._handleTransportMessage.bind(this),this._setupEventForwarding(),qA.info("WebSocket client created",{url:A,options:this.options,browser:this.browser.browserInfo.name}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}_setupEventForwarding(){this.connection.onEvent((A,I)=>{this._handleConnectionEvent(A,I)}),this.transport.on(e.MESSAGE,A=>{this._handleTransportMessage(A)}),this.transport.on(e.ERROR,A=>{this._triggerEvent("error",A)})}_handleConnectionEvent(A,I){switch(A){case _.CONNECTED:this._triggerEvent("open",I);break;case _.DISCONNECTED:this._triggerEvent("close",I);break;case _.RECONNECTING:this._triggerEvent("reconnectAttempt",{attempt:I.attempt,maxAttempts:I.maxAttempts,delay:I.delay});break;case _.FAILED:this._triggerEvent("error",new Error(`Connection failed: ${I.reason}`));break;case"latency":this._triggerEvent("latency",I);break}}_handleTransportMessage(A){let I=A;if(typeof A=="string")try{I=JSON.parse(A)}catch{}if(I&&I.type==="ack"&&I.id){this._handleAck(I.id,I);return}I&&I.type&&this.messageHandlers.has(I.type)&&this.messageHandlers.get(I.type).forEach(U=>{try{U(I.data||I)}catch(E){qA.error("Error in message handler:",E)}}),this._triggerEvent("message",I)}_handleAck(A,I){if(this.pendingAcks.has(A)){let{resolve:O,reject:U}=this.pendingAcks.get(A);I.success?O(I.result||I):U(new Error(I.error||"Unknown error")),this.pendingAcks.delete(A)}}connect(){return this.connection.connect()}disconnect(A=1e3,I=""){return this.connection.disconnect(A,I)}send(A){if(!this.isConnected())throw new Error("Not connected");let I=A;A&&typeof A=="object"&&!(A instanceof ArrayBuffer)&&!(A instanceof Blob)&&(I=JSON.stringify(A)),this.connection.send(I)}sendWithAck(A,I,O=1e4){if(!this.isConnected())return Promise.reject(new Error("Not connected"));let U=`${Date.now()}-${this.messageCounter++}`,E=nA(),K={type:A,data:I,id:U,ack:!0},B=setTimeout(()=>{this.pendingAcks.has(U)&&(this.pendingAcks.delete(U),E.reject(new Error("Acknowledgement timeout")))},O);return this.pendingAcks.set(U,{resolve:R=>{clearTimeout(B),E.resolve(R)},reject:R=>{clearTimeout(B),E.reject(R)}}),this.connection.send(JSON.stringify(K)),E.promise}onMessage(A,I){return this.messageHandlers.has(A)||this.messageHandlers.set(A,[]),this.messageHandlers.get(A).push(I),this}offMessage(A,I){if(!this.messageHandlers.has(A))return this;if(I){let O=this.messageHandlers.get(A),U=O.indexOf(I);U!==-1&&O.splice(U,1)}else this.messageHandlers.delete(A);return this}on(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(typeof I!="function")throw new TypeError("Handler must be a function");return this.eventHandlers[A]||(this.eventHandlers[A]=[]),this.eventHandlers[A].push(I),this}off(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(!this.eventHandlers[A])return this;if(I){let U=this.eventHandlers[A].indexOf(I);U!==-1&&this.eventHandlers[A].splice(U,1)}else this.eventHandlers[A]=[];return this}_triggerEvent(A,I){(this.eventHandlers[A]||[]).forEach(U=>{try{U(I)}catch(E){qA.error(`Error in ${A} handler:`,E)}})}isConnected(){return this.connection.isConnected()}isHealthy(){return this.connection.isHealthy()}getStatus(){var O,U,E;let A=this.connection.getStatus(),I=G1();return{connected:this.isConnected(),state:A.state,url:this.url,transport:this.transport.getTransportType(),latency:(O=A.heartbeat)==null?void 0:O.latency,uptime:A.uptime,messagesSent:(U=A.messages)==null?void 0:U.sent,messagesReceived:(E=A.messages)==null?void 0:E.received,reconnectAttempts:A.reconnectAttempts,networkOnline:I,browser:this.browser.browserInfo.name}}reconnect(){return this.connection.reconnect()}getTransportType(){return this.transport.getTransportType()}destroy(){qA.info("Destroying client"),this.disconnect(1e3,"Client destroyed"),this.messageHandlers.clear(),this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.pendingAcks.clear()}},z2=F1;var HA=S("packet"),j={MESSAGE:"message",EVENT:"event",COMMAND:"command",RESPONSE:"response",ERROR:"error",PING:"ping",PONG:"pong",JOIN:"join",LEAVE:"leave",PRESENCE:"presence",ACK:"ack",AUTH:"auth",SYSTEM:"system"},tA={CRITICAL:"critical",HIGH:"high",NORMAL:"normal",LOW:"low"},zA={AT_MOST_ONCE:"at_most_once",AT_LEAST_ONCE:"at_least_once",EXACTLY_ONCE:"exactly_once"},y4="1.0",$2=256*1024,F4=6e4;function j2(N){return N&&typeof N.id=="string"&&bA(N.type,j)&&N.timestamp&&typeof N.timestamp=="number"}var cA=class N{constructor(A,I,O={}){if(!bA(A,j)){if(typeof A!="string")throw new Error(`Invalid message type: ${A}. Must be a string.`);HA.warn(`Unknown message type: ${A}. Using custom type.`)}if(O.namespace&&!_A(O.namespace))throw new Error(`Invalid namespace: ${O.namespace}. Must start with / and contain only letters, numbers, underscores, and hyphens.`);if(O.priority&&!bA(O.priority,tA))throw new Error(`Invalid priority: ${O.priority}. Must be one of: ${Object.values(tA).join(", ")}`);if(O.deliveryGuarantee&&!bA(O.deliveryGuarantee,zA))throw new Error(`Invalid delivery guarantee: ${O.deliveryGuarantee}. Must be one of: ${Object.values(zA).join(", ")}`);this.id=O.id||V("pkt"),this.type=A,this.payload=I,this.timestamp=Date.now(),this.version=y4,this.priority=O.priority||tA.NORMAL,this.requiresAck=O.requiresAck||!1,this.ttl=O.ttl||F4,this.namespace=O.namespace||"/",this.deliveryGuarantee=O.deliveryGuarantee||zA.AT_MOST_ONCE,this.metadata=O.metadata||{},this.from=O.from||null,this.inResponseTo=O.inResponseTo||null,this._checkSize(),HA.debug("Packet created",{id:this.id,type:this.type,namespace:this.namespace,size:this.getSize()})}_checkSize(){let A=this.getSize();A>$2&&HA.warn("Packet exceeds recommended size",{size:A,max:$2,id:this.id,type:this.type})}getSize(){return M1(this)}isExpired(){return L1(this.timestamp,this.ttl)}getRemainingTTL(){return k2(this.timestamp,this.ttl)}createResponse(A,I={}){return new N(j.RESPONSE,A,{...I,inResponseTo:this.id,namespace:this.namespace,priority:I.priority||this.priority})}createError(A,I={},O=500){return new N(j.ERROR,{code:O,message:A,details:I,originalType:this.type,originalId:this.id},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}createAck(A=null){return new N(j.ACK,{originalId:this.id,result:A,timestamp:Date.now()},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}serialize(){let A={id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo},I=u1(A);return I||(HA.error("Failed to serialize packet",{id:this.id}),null)}toObject(){return{id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo,size:this.getSize(),expired:this.isExpired()}}static deserialize(A){let I=typeof A=="string"?d1(A):A;if(!I)return HA.error("Failed to parse packet data"),null;if(!j2(I))return HA.error("Invalid packet structure",I),null;try{return new N(I.type,I.payload,{id:I.id,priority:I.priority,requiresAck:I.requiresAck,ttl:I.ttl,namespace:I.namespace,deliveryGuarantee:I.deliveryGuarantee,metadata:I.metadata,from:I.from,inResponseTo:I.inResponseTo})}catch(O){return HA.error("Failed to create packet from data:",O),null}}static isValid(A){let I=typeof A=="string"?d1(A):A;return j2(I)}static fromRaw(A){return typeof A=="string"?N.deserialize(A):A instanceof Blob||A instanceof ArrayBuffer?new N(j.MESSAGE,A,{metadata:{binary:!0}}):(HA.warn("Unsupported raw data type:",typeof A),null)}};function Q2(N,A,I={}){return new cA(N,A,I)}function X2(N,A,I={}){return new cA(j.EVENT,{event:N,data:A},{priority:tA.LOW,...I})}function AI(N,A,I={}){return new cA(j.COMMAND,{command:N,params:A},{requiresAck:!0,priority:tA.HIGH,...I})}var k=S("router"),pA={EXACT:"exact",WILDCARD:"wildcard",REGEX:"regex",FUNCTION:"function"},II={CRITICAL:100,HIGH:200,NORMAL:300,LOW:400,FALLBACK:500},Q={PRE:"pre",POST:"post",AROUND:"around"},x1=class{constructor(A,I,O={}){this.pattern=A,this.handler=I,this.matchType=O.matchType||pA.EXACT,this.priority=O.priority||II.NORMAL,this.namespace=O.namespace||null,this.description=O.description||A.toString(),this.id=`${Date.now()}-${Math.random().toString(36).substring(2,8)}`,this.created=Date.now(),this.callCount=0,this.lastCalled=null}matches(A){if(this.namespace&&A.namespace!==this.namespace)return!1;let I=A.type;switch(this.matchType){case pA.EXACT:return I===this.pattern;case pA.WILDCARD:return this._matchWildcard(I,this.pattern);case pA.REGEX:return this.pattern.test(I);case pA.FUNCTION:return this.pattern(A);default:return!1}}execute(A,I){this.callCount++,this.lastCalled=Date.now();try{return this.handler(A,I)}catch(O){throw k.error(`Handler ${this.description} failed:`,O),O}}_matchWildcard(A,I){if(I==="*")return!0;let O=I.replace(/\./g,"\\.").replace(/\*/g,".*");return new RegExp(`^${O}$`).test(A)}getStats(){return{id:this.id,description:this.description,matchType:this.matchType,priority:this.priority,namespace:this.namespace,callCount:this.callCount,lastCalled:this.lastCalled,created:this.created}}},b1=class N{constructor(A={}){this.options={catchErrors:!0,asyncHandlers:!1,maxHandlersPerRoute:10,logHandling:!0,...A},this.routes=new Map,this.namespaces=new Map,this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this.stats={routesProcessed:0,handlersExecuted:0,errorsCaught:0,lastRoute:null},this._setupDefaultHandlers(),k.info("Router created")}_setupDefaultHandlers(){this.on("*",A=>{k.debug("Unhandled message type:",A.type)},{matchType:pA.WILDCARD,priority:II.FALLBACK,description:"Catch-all handler"}),this.on(j.ERROR,A=>{k.error("Received error packet:",A.payload)},{description:"Error handler"})}on(A,I,O={}){if(typeof I!="function")throw new TypeError("Handler must be a function");let U=new x1(A,I,O),E=this._getRouteKey(A,O.namespace);this.routes.has(E)||this.routes.set(E,[]);let K=this.routes.get(E);return K.length>=this.options.maxHandlersPerRoute&&k.warn(`Max handlers (${this.options.maxHandlersPerRoute}) reached for route:`,E),K.push(U),K.sort((B,R)=>B.priority-R.priority),k.debug("Handler registered",{pattern:A,namespace:O.namespace,priority:O.priority}),()=>{this.off(A,I,O.namespace)}}off(A,I,O){let U=this._getRouteKey(A,O),E=this.routes.get(U);if(!E)return;let K=E.findIndex(B=>B.handler===I);K!==-1&&(E.splice(K,1),k.debug("Handler removed",{pattern:A,namespace:O})),E.length===0&&this.routes.delete(U)}once(A,I,O={}){let U=(E,K)=>{I(E,K),this.off(A,U,O.namespace)};this.on(A,U,O)}route(A,I={}){this.stats.routesProcessed++,this.stats.lastRoute=Date.now(),this._runMiddleware(Q.PRE,A,I);let O=this._findHandlers(A);if(O.length===0){k.debug("No handlers for packet type:",A.type);return}k.debug("Routing packet",{type:A.type,namespace:A.namespace,handlers:O.length});let U=[];for(let E of O)try{let K=this._runAroundMiddleware(A,I,E);if(K!==void 0)U.push(K);else{let B=E.execute(A,I);U.push(B)}this.stats.handlersExecuted++}catch(K){if(this.stats.errorsCaught++,this.options.catchErrors)k.error("Handler error:",K);else throw K}return this._runMiddleware(Q.POST,A,I,U),this.options.asyncHandlers?Promise.all(U):U}namespace(A){if(!this.namespaces.has(A)){let I=new N(this.options);I.on=(O,U,E={})=>this.on(O,U,{...E,namespace:A}),I.off=(O,U,E={})=>this.off(O,U,A),this.namespaces.set(A,I)}return this.namespaces.get(A)}use(A,I){if(!this.middleware[A])throw new Error(`Invalid middleware type: ${A}`);this.middleware[A].push(I),k.debug("Middleware added",{type:A})}removeMiddleware(A,I){let O=this.middleware[A].indexOf(I);O!==-1&&this.middleware[A].splice(O,1)}_findHandlers(A){let I=[];for(let[O,U]of this.routes)if(this._routeCouldMatch(O,A)){let E=U.filter(K=>K.matches(A));I.push(...E)}return I.sort((O,U)=>O.priority-U.priority),I}_routeCouldMatch(A,I){let[O,U,E]=A.split("|");return!(U&&U!==I.namespace)}_getRouteKey(A,I){return`${A instanceof RegExp?"regex":typeof A}|${I||""}|${A}`}_runMiddleware(A,I,O,U=null){for(let E of this.middleware[A])try{E(I,O,U)}catch(K){k.error(`Middleware (${A}) error:`,K)}}_runAroundMiddleware(A,I,O){let U;for(let E of this.middleware[Q.AROUND])if(U=E(A,I,(B,R)=>O.execute(B,R)),U!==void 0)break;return U}getRoutes(){let A=[];for(let[I,O]of this.routes)A.push({key:I,handlers:O.map(U=>U.getStats())});return A}getStats(){return{...this.stats,totalRoutes:this.routes.size,totalHandlers:Array.from(this.routes.values()).reduce((A,I)=>A+I.length,0),middlewareCount:{pre:this.middleware[Q.PRE].length,post:this.middleware[Q.POST].length,around:this.middleware[Q.AROUND].length},namespaces:this.namespaces.size}}reset(){this.routes.clear(),this.namespaces.clear(),this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this._setupDefaultHandlers(),k.info("Router reset")}};function OI(N={}){return new b1(N)}var BA=S("namespace"),oA={CREATED:"created",DESTROYED:"destroyed",USER_JOINED:"user_joined",USER_LEFT:"user_left",ERROR:"error"},x4={autoCreateRooms:!0,maxRooms:100,broadcastPresence:!0,persistState:!1,authRequired:!1},gA=class N{constructor(A,I,O={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);this.path=A,this.socket=I,this.options={...x4,...O},this.id=V("ns"),this.router=OI({catchErrors:!0}),this.rooms=new Map,this.users=new Map,this.children=new Map,this.handlers={[oA.CREATED]:[],[oA.DESTROYED]:[],[oA.USER_JOINED]:[],[oA.USER_LEFT]:[],[oA.ERROR]:[]},this.state={created:Date.now(),messageCount:0,userCount:0,roomCount:0},this._handleMessage=this._handleMessage.bind(this),BA.info("Namespace created",{path:this.path,id:this.id})}on(A,I){if(typeof I!="function")throw new TypeError("Handler must be a function");return this.router.on(A,(O,U)=>{I(O.payload,U)}),this}onMessage(A,I){return this.on(A,I)}emit(A,I,O={}){let U={type:A,data:I,namespace:this.path,timestamp:Date.now()};if(this.state.messageCount++,O.ack)return this.socket.sendWithAck(A,U,O.timeout);this.socket.send(U)}broadcast(A,I,O=[]){this.emit("broadcast",{event:A,data:I,except:O,namespace:this.path})}async joinRoom(A,I){if(!this.rooms.has(A)){if(this.rooms.size>=this.options.maxRooms)return BA.warn("Max rooms reached",{namespace:this.path}),!1;this.rooms.set(A,new Set)}return this.rooms.get(A).add(I),this.state.roomCount=this.rooms.size,BA.debug("User joined room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_joined",{room:A,userId:I},[I]),!0}leaveRoom(A,I){let O=this.rooms.get(A);O&&(O.delete(I),O.size===0&&this.rooms.delete(A),BA.debug("User left room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_left",{room:A,userId:I},[I]))}getRoomUsers(A){let I=this.rooms.get(A);return I?Array.from(I):[]}getRooms(){return Array.from(this.rooms.keys())}addUser(A,I={}){this.users.set(A,{...I,joined:Date.now(),rooms:[]}),this.state.userCount=this.users.size,BA.debug("User added to namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"online",data:I})}removeUser(A){for(let[I,O]of this.rooms)O.has(A)&&this.leaveRoom(I,A);this.users.delete(A),this.state.userCount=this.users.size,BA.debug("User removed from namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"offline"})}namespace(A,I={}){let O=this.path==="/"?A:`${this.path}${A}`;if(!this.children.has(O)){let U=new N(O,this.socket,{...this.options,...I});this.children.set(O,U)}return this.children.get(O)}_handleMessage(A){return A.namespace!==this.path?!1:(this.router.route(A,{namespace:this,socket:this.socket}),!0)}hasUser(A){return this.users.has(A)}getStats(){return{...this.state,path:this.path,id:this.id,userCount:this.users.size,roomCount:this.rooms.size,childCount:this.children.size}}destroy(){this.rooms.clear(),this.users.clear();for(let A of this.children.values())A.destroy();this.children.clear(),BA.info("Namespace destroyed",{path:this.path}),this._emit(oA.DESTROYED,{path:this.path,id:this.id})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){BA.error(`Error in ${A} handler:`,E)}})}_on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),this}},$A=class{constructor(A,I={}){this.socket=A,this.options=I,this.root=new gA("/",A,I),this.namespaces=new Map,this.namespaces.set("/",this.root),this._setupMessageHandler(),BA.info("NamespaceManager created")}_setupMessageHandler(){this.socket.on("message",A=>{let I=this.namespaces.get(A.namespace||"/");I&&I._handleMessage(A)})}of(A,I={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);if(this.namespaces.has(A))return this.namespaces.get(A);let O=new gA(A,this.socket,{...this.options,...I});return this.namespaces.set(A,O),BA.info("Namespace created via manager",{path:A}),O}list(){return Array.from(this.namespaces.keys())}remove(A){if(A==="/")throw new Error("Cannot remove root namespace");let I=this.namespaces.get(A);I&&(I.destroy(),this.namespaces.delete(A))}broadcastAll(A,I){for(let O of this.namespaces.values())O.broadcast(A,I)}getStats(){let A={};for(let[I,O]of this.namespaces)A[I]=O.getStats();return A}destroy(){for(let A of this.namespaces.values())A.destroy();this.namespaces.clear(),BA.info("NamespaceManager destroyed")}};function NI(N,A={}){return new $A(N,A)}var y=S("rooms"),q={USER_JOINED:"user_joined",USER_LEFT:"user_left",ROOM_CREATED:"room_created",ROOM_DESTROYED:"room_destroyed",ROOM_MESSAGE:"room_message",ROOM_UPDATED:"room_updated",ERROR:"error"},k1={PUBLIC:"public",PRIVATE:"private",HIDDEN:"hidden"},jA={TEMPORARY:"temporary",PERSISTENT:"persistent",ANONYMOUS:"anonymous"},b4={maxUsers:100,visibility:k1.PUBLIC,type:jA.TEMPORARY,broadcastPresence:!0,persistMessages:!1,maxHistory:100,inviteOnly:!1},_1=class{constructor(A,I={}){this.userId=A,this.joinedAt=Date.now(),this.lastActivity=Date.now(),this.role=I.role||"member",this.metadata=I.metadata||{},this.presence="online"}updateActivity(){this.lastActivity=Date.now()}setPresence(A){this.presence=A,this.updateActivity()}toJSON(){return{userId:this.userId,joinedAt:this.joinedAt,lastActivity:this.lastActivity,role:this.role,metadata:this.metadata,presence:this.presence}}},fA=class{constructor(A,I={}){this.name=A,this.id=V("room"),this.options={...b4,...I},this.members=new Map,this.messageHistory=[],this.metadata={...this.options.metadata,createdAt:Date.now(),createdBy:null},this.state={active:!0,memberCount:0,messageCount:0,lastActivity:Date.now()},this.handlers={[q.USER_JOINED]:[],[q.USER_LEFT]:[],[q.ROOM_MESSAGE]:[],[q.ROOM_UPDATED]:[],[q.ERROR]:[]},y.info("Room created",{name:this.name,id:this.id,visibility:this.options.visibility})}addMember(A,I={}){if(this.members.has(A))return y.debug("User already in room",{userId:A,room:this.name}),!1;if(this.members.size>=this.options.maxUsers)return y.warn("Room full",{room:this.name,max:this.options.maxUsers}),this._emit(q.ERROR,{code:"room_full",message:"Room has reached maximum capacity"}),!1;if(this.options.inviteOnly&&!I.invited)return y.warn("Attempt to join invite-only room",{userId:A,room:this.name}),!1;let O=new _1(A,I);return this.members.set(A,O),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User joined room",{userId:A,room:this.name,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_JOINED,{userId:A,room:this.name,timestamp:Date.now(),memberData:O.toJSON()}),!0}removeMember(A,I="left"){if(!this.members.has(A))return!1;let O=this.members.get(A);return this.members.delete(A),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User left room",{userId:A,room:this.name,reason:I,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_LEFT,{userId:A,room:this.name,reason:I,timestamp:Date.now(),memberData:O.toJSON()}),this.options.type===jA.TEMPORARY&&this.members.size===0&&this.destroy("Room empty"),!0}hasMember(A){return this.members.has(A)}getMember(A){let I=this.members.get(A);return I?I.toJSON():null}getMembers(){return Array.from(this.members.values()).map(A=>A.toJSON())}getMemberCount(){return this.members.size}message(A,I,O={}){if(!this.members.has(A)&&this.options.type!==jA.ANONYMOUS)throw new Error(`User ${A} is not in room ${this.name}`);let U={id:V("msg"),room:this.name,userId:A,message:I,timestamp:Date.now(),type:O.type||"message",metadata:O.metadata||{}};return this.members.has(A)&&this.members.get(A).updateActivity(),this.state.messageCount++,this.state.lastActivity=Date.now(),this.options.persistMessages&&(this.messageHistory.push(U),this.messageHistory.length>this.options.maxHistory&&(this.messageHistory=this.messageHistory.slice(-this.options.maxHistory))),y.debug("Room message",{room:this.name,userId:A,msgId:U.id}),this._emit(q.ROOM_MESSAGE,U),U.id}broadcast(A,I,O=[]){let U={room:this.name,event:A,data:I,timestamp:Date.now()};this._emit(A,U,O)}update(A,I=null){this.metadata={...this.metadata,...A,updatedAt:Date.now(),updatedBy:I},this._emit(q.ROOM_UPDATED,{room:this.name,updates:A,userId:I,timestamp:Date.now()})}getInfo(){return{id:this.id,name:this.name,options:{...this.options},metadata:{...this.metadata},state:{...this.state},memberCount:this.members.size,messageCount:this.state.messageCount}}getHistory(A=this.options.maxHistory){return this.messageHistory.slice(-A)}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}destroy(A="Room destroyed"){this.state.active=!1,y.info("Room destroyed",{name:this.name,id:this.id,reason:A,memberCount:this.members.size}),this._emit(q.ROOM_DESTROYED,{room:this.name,reason:A,timestamp:Date.now()}),this.members.clear(),this.messageHistory=[],this.handlers={}}_emit(A,I,O=[]){(this.handlers[A]||[]).forEach(E=>{try{E(I,O)}catch(K){y.error(`Error in ${A} handler:`,K)}})}},QA=class{constructor(A={}){this.options=A,this.rooms=new Map,this.roomIds=new Map,this.userRooms=new Map,y.info("RoomManager created")}createRoom(A,I={}){if(this.rooms.has(A))throw new Error(`Room "${A}" already exists`);let O=new fA(A,{...this.options,...I});return this.rooms.set(A,O),this.roomIds.set(O.id,A),y.info("Room created via manager",{name:A,id:O.id}),O}getOrCreateRoom(A,I={}){return this.rooms.has(A)?this.rooms.get(A):this.createRoom(A,I)}getRoom(A){return this.rooms.get(A)}getRoomById(A){let I=this.roomIds.get(A);return I?this.rooms.get(I):void 0}removeRoom(A,I="Room removed"){let O=this.rooms.get(A);O&&(O.getMembers().forEach(U=>{let E=this.userRooms.get(U.userId);E&&(E.delete(A),E.size===0&&this.userRooms.delete(U.userId))}),O.destroy(I),this.rooms.delete(A),this.roomIds.delete(O.id),y.info("Room removed",{name:A}))}addUserToRoom(A,I,O={}){let U=this.rooms.get(I);if(!U)return y.warn("Room not found",{roomName:I}),!1;let E=U.addMember(A,O);return E&&(this.userRooms.has(A)||this.userRooms.set(A,new Set),this.userRooms.get(A).add(I)),E}removeUserFromRoom(A,I,O="left"){let U=this.rooms.get(I);if(U){U.removeMember(A,O);let E=this.userRooms.get(A);E&&(E.delete(I),E.size===0&&this.userRooms.delete(A))}}removeUserFromAllRooms(A,I="disconnected"){let O=this.userRooms.get(A);O&&O.forEach(U=>{this.removeUserFromRoom(A,U,I)})}getUserRooms(A){let I=this.userRooms.get(A);return I?Array.from(I):[]}listRooms(A={}){let I=Array.from(this.rooms.values());return A.visibility&&(I=I.filter(O=>O.options.visibility===A.visibility)),A.hasMember&&(I=I.filter(O=>O.hasMember(A.hasMember))),A.minMembers&&(I=I.filter(O=>O.getMemberCount()>=A.minMembers)),I.map(O=>O.getInfo())}broadcastToRooms(A,I,O){A.forEach(U=>{let E=this.rooms.get(U);E&&E.broadcast(I,O)})}getStats(){let A={};for(let[I,O]of this.rooms)A[I]={memberCount:O.getMemberCount(),messageCount:O.state.messageCount,type:O.options.type};return{totalRooms:this.rooms.size,totalUsersInRooms:this.userRooms.size,rooms:A}}destroy(){for(let A of this.rooms.values())A.destroy("Manager destroyed");this.rooms.clear(),this.roomIds.clear(),this.userRooms.clear(),y.info("RoomManager destroyed")}};function UI(N={}){return new QA(N)}function EI(N,A={}){return new fA(N,A)}var F=S("presence"),d={ONLINE:"online",AWAY:"away",BUSY:"busy",OFFLINE:"offline",CONNECTING:"connecting",RECONNECTING:"reconnecting"},KI={TYPING:"typing",TYPING_STOPPED:"typing_stopped",VIEWING:"viewing",EDITING:"editing",IDLE:"idle"},o={STATE_CHANGED:"state_changed",ACTIVITY_UPDATED:"activity_updated",USER_ONLINE:"user_online",USER_OFFLINE:"user_offline",TYPING_STARTED:"typing_started",TYPING_STOPPED:"typing_stopped",SUBSCRIBED:"subscribed",UNSUBSCRIBED:"unsubscribed",ERROR:"error"},q1={heartbeatInterval:3e4,offlineTimeout:7e4,idleTimeout:3e5,broadcastChanges:!0,trackTyping:!0,typingTimeout:3e3,maxSubscribers:1e3,persistHistory:!1,maxHistory:100},z1=class{constructor(A,I={}){this.userId=A,this.state=d.CONNECTING,this.previousState=null,this.metadata={name:I.name||A,avatar:I.avatar||null,email:I.email||null,...I.metadata},this.lastSeen=Date.now(),this.lastActivity=Date.now(),this.lastStateChange=Date.now(),this.currentActivity=null,this.typingIn=new Set,this.typingTimeout=null,this.lastHeartbeat=Date.now(),this.heartbeatTimer=null,this.subscribers=new Set,this.history=[],this.status=I.status||null,this.statusMessage=I.statusMessage||"",F.debug("UserPresence created",{userId:A})}updateState(A,I=null){if(this.state===A)return null;this.previousState=this.state,this.state=A,this.lastStateChange=Date.now(),A===d.ONLINE&&(this.lastHeartbeat=Date.now());let O={userId:this.userId,from:this.previousState,to:this.state,timestamp:this.lastStateChange,reason:I};return this._addToHistory("state_change",O),F.debug("Presence state changed",O),O}updateActivity(A,I={}){this.lastActivity=Date.now(),this.currentActivity={type:A,data:I,timestamp:this.lastActivity},this.state===d.AWAY&&this.updateState(d.ONLINE,"activity"),F.debug("Activity updated",{userId:this.userId,activity:A})}startTyping(A){return this.typingIn.has(A)?!1:(this.typingIn.add(A),this.typingTimeout&&(clearTimeout(this.typingTimeout),this.typingTimeout=null),F.debug("Started typing",{userId:this.userId,room:A}),!0)}stopTyping(A){return this.typingIn.has(A)?(this.typingIn.delete(A),F.debug("Stopped typing",{userId:this.userId,room:A}),!0):!1}isTyping(A){return this.typingIn.has(A)}getTypingRooms(){return Array.from(this.typingIn)}heartbeat(){this.lastHeartbeat=Date.now(),this.lastSeen=this.lastHeartbeat}isHeartbeatStale(A){return Date.now()-this.lastHeartbeat>A}addSubscriber(A){this.subscribers.add(A)}removeSubscriber(A){this.subscribers.delete(A)}getSubscribers(){return Array.from(this.subscribers)}getInfo(){return{userId:this.userId,state:this.state,previousState:this.previousState,metadata:this.metadata,lastSeen:this.lastSeen,lastActivity:this.lastActivity,lastStateChange:this.lastStateChange,currentActivity:this.currentActivity,typingIn:this.getTypingRooms(),status:this.status,statusMessage:this.statusMessage,subscribers:this.subscribers.size}}_addToHistory(A,I){let O={type:A,data:I,timestamp:Date.now()};this.history.push(O),this.history.length>q1.maxHistory&&(this.history=this.history.slice(-q1.maxHistory))}},XA=class{constructor(A={}){this.options={...q1,...A},this.users=new Map,this.roomPresence=new Map,this.userSubscriptions=new Map,this.heartbeatInterval=null,this._startHeartbeatCheck(),this.handlers={[o.STATE_CHANGED]:[],[o.ACTIVITY_UPDATED]:[],[o.USER_ONLINE]:[],[o.USER_OFFLINE]:[],[o.TYPING_STARTED]:[],[o.TYPING_STOPPED]:[],[o.SUBSCRIBED]:[],[o.UNSUBSCRIBED]:[],[o.ERROR]:[]},this.stats={totalUsers:0,onlineUsers:0,awayUsers:0,busyUsers:0,totalSubscriptions:0,typingEvents:0,stateChanges:0},F.info("PresenceManager created",this.options)}registerUser(A,I={}){if(this.users.has(A))return this.users.get(A);let O=new z1(A,I);return this.users.set(A,O),this.stats.totalUsers=this.users.size,F.debug("User registered",{userId:A}),O}unregisterUser(A,I="user_left"){if(this.users.get(A)){this.updateUserState(A,d.OFFLINE,I);for(let[U,E]of this.roomPresence)E.has(A)&&E.delete(A);this.userSubscriptions.delete(A),this.users.delete(A),this.stats.totalUsers=this.users.size,F.debug("User unregistered",{userId:A,reason:I})}}updateUserState(A,I,O=null){let U=this.users.get(A);if(!U)return F.warn("User not found",{userId:A}),!1;let E=U.updateState(I,O);return E&&(this.stats.stateChanges++,I===d.ONLINE?(this.stats.onlineUsers++,this._emit(o.USER_ONLINE,{userId:A,metadata:U.metadata,timestamp:E.timestamp})):I===d.OFFLINE&&(this.stats.onlineUsers=Math.max(0,this.stats.onlineUsers-1),this._emit(o.USER_OFFLINE,{userId:A,timestamp:E.timestamp})),this.options.broadcastChanges&&this._broadcastToSubscribers(A,o.STATE_CHANGED,E),this._emit(o.STATE_CHANGED,E)),!0}recordActivity(A,I,O={}){let U=this.users.get(A);U&&(U.updateActivity(I,O),this._emit(o.ACTIVITY_UPDATED,{userId:A,activity:I,data:O,timestamp:Date.now()}))}startTyping(A,I){let O=this.users.get(A);!O||!this.options.trackTyping||O.startTyping(I)&&(this.stats.typingEvents++,this._broadcastToRoom(I,o.TYPING_STARTED,{userId:A,room:I,timestamp:Date.now()}),this._emit(o.TYPING_STARTED,{userId:A,room:I,timestamp:Date.now()}),setTimeout(()=>{this.stopTyping(A,I,!0)},this.options.typingTimeout))}stopTyping(A,I,O=!1){let U=this.users.get(A);U&&U.stopTyping(I)&&(this._broadcastToRoom(I,o.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}),this._emit(o.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}))}userJoinedRoom(A,I){this.roomPresence.has(I)||this.roomPresence.set(I,new Set),this.roomPresence.get(I).add(A),F.debug("User joined room presence",{userId:A,room:I})}userLeftRoom(A,I){let O=this.roomPresence.get(I);O&&(O.delete(A),this.stopTyping(A,I),O.size===0&&this.roomPresence.delete(I))}subscribe(A,I){let O=this.users.get(I);return O?O.getSubscribers().length>=this.options.maxSubscribers?(this._emit(o.ERROR,{code:"max_subscribers",message:"User has reached maximum subscribers",userId:I}),!1):(O.addSubscriber(A),this.userSubscriptions.has(A)||this.userSubscriptions.set(A,new Set),this.userSubscriptions.get(A).add(I),this.stats.totalSubscriptions++,this._emit(o.SUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()}),!0):(F.warn("Cannot subscribe to non-existent user",{targetUserId:I}),!1)}unsubscribe(A,I){let O=this.users.get(I);O&&O.removeSubscriber(A);let U=this.userSubscriptions.get(A);U&&(U.delete(I),U.size===0&&this.userSubscriptions.delete(A)),this.stats.totalSubscriptions=Math.max(0,this.stats.totalSubscriptions-1),this._emit(o.UNSUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()})}getUserPresence(A){let I=this.users.get(A);return I?I.getInfo():null}getRoomUsers(A,I=!0){let O=this.roomPresence.get(A)||new Set;return I?Array.from(O).map(U=>this.getUserPresence(U)).filter(Boolean):Array.from(O)}getTypingUsers(A){var O;let I=[];for(let[U,E]of this.users)E.isTyping(A)&&I.push({userId:U,metadata:E.metadata,startedAt:(O=E.currentActivity)==null?void 0:O.timestamp});return I}heartbeat(A){let I=this.users.get(A);I&&(I.heartbeat(),I.state===d.OFFLINE&&this.updateUserState(A,d.ONLINE,"heartbeat"))}getStats(){let A=0,I=0,O=0,U=0;for(let E of this.users.values())switch(E.state){case d.ONLINE:A++;break;case d.AWAY:I++;break;case d.BUSY:O++;break;case d.OFFLINE:U++;break}return{...this.stats,online:A,away:I,busy:O,offline:U,totalRooms:this.roomPresence.size,activeSubscriptions:this.userSubscriptions.size}}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}_startHeartbeatCheck(){this.heartbeatInterval=setInterval(()=>{this._checkHeartbeats()},this.options.heartbeatInterval)}_checkHeartbeats(){let A=Date.now();for(let[I,O]of this.users)O.state!==d.OFFLINE&&O.isHeartbeatStale(this.options.offlineTimeout)?(F.debug("Heartbeat stale, marking offline",{userId:I}),this.updateUserState(I,d.OFFLINE,"heartbeat_timeout")):O.state===d.ONLINE&&A-O.lastActivity>this.options.idleTimeout&&this.updateUserState(I,d.AWAY,"idle")}_broadcastToSubscribers(A,I,O){let U=this.users.get(A);if(!U)return;U.getSubscribers().forEach(K=>{this._emit(I,{...O,for:K})})}_broadcastToRoom(A,I,O){(this.roomPresence.get(A)||new Set).forEach(E=>{this._emit(I,{...O,for:E})})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){F.error(`Error in ${A} handler:`,E)}})}destroy(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.users.clear(),this.roomPresence.clear(),this.userSubscriptions.clear(),this.handlers={},F.info("PresenceManager destroyed")}};function BI(N={}){return new XA(N)}function RI(N,A,I){let O=null,U=!1;return{start(){U||(N.startTyping(A,I),U=!0),O&&clearTimeout(O),O=setTimeout(()=>{this.stop()},3e3)},stop(){U&&(N.stopTyping(A,I),U=!1),O&&(clearTimeout(O),O=null)},isTyping(){return U}}}var z=S("ack"),m={PENDING:"pending",ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",FAILED:"failed",CANCELLED:"cancelled"},lA={ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",RETRY:"retry",FAILED:"failed",CANCELLED:"cancelled",LATENCY_UPDATED:"latency_updated"},_4={timeout:1e4,maxRetries:3,retryBaseDelay:1e3,retryMaxDelay:3e4,exponentialBackoff:!0,cleanupInterval:6e4,maxAckAge:3e5,trackLatency:!0},$1=class{constructor(A,I){this.messageId=A,this.state=m.PENDING,this.sentAt=Date.now(),this.lastAttempt=this.sentAt,this.attempts=0,this.timeout=I.timeout,this.maxRetries=I.maxRetries,this.sendCallback=I.sendCallback,this.metadata=I.metadata||{},this.ackReceivedAt=null,this.deferred=nA(),this._setTimeout(),z.debug("Ack entry created",{messageId:A,timeout:this.timeout,maxRetries:this.maxRetries})}_setTimeout(){this.timeoutId=setTimeout(()=>{this._handleTimeout()},this.timeout)}_handleTimeout(){this.attempts++,this.attempts>=this.maxRetries?(this.state=m.FAILED,this.deferred.reject(new Error(`Max retries (${this.maxRetries}) exceeded for message ${this.messageId}`)),z.warn("Message failed permanently",{messageId:this.messageId,attempts:this.attempts})):(this.state=m.TIMEOUT,this._scheduleRetry())}_scheduleRetry(){let A=iA(this.attempts-1,{baseDelay:this.metadata.retryBaseDelay||1e3,maxDelay:this.metadata.retryMaxDelay||3e4,jitter:!0});z.debug("Scheduling retry",{messageId:this.messageId,attempt:this.attempts,delay:A}),this.retryTimeout=setTimeout(()=>{this.lastAttempt=Date.now(),this.sendCallback(this.messageId),this._setTimeout()},A)}acknowledge(A){if(this.state===m.PENDING||this.state===m.TIMEOUT){this.state=m.ACKNOWLEDGED,this.ackReceivedAt=Date.now(),this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout);let I=this.ackReceivedAt-this.sentAt;this.deferred.resolve({messageId:this.messageId,data:A,latency:I,attempts:this.attempts+1}),z.debug("Message acknowledged",{messageId:this.messageId,latency:I,attempts:this.attempts+1})}}cancel(A="Cancelled"){this.state=m.CANCELLED,this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout),this.deferred.reject(new Error(A)),z.debug("Ack cancelled",{messageId:this.messageId,reason:A})}getStats(){return{messageId:this.messageId,state:this.state,sentAt:this.sentAt,lastAttempt:this.lastAttempt,attempts:this.attempts,ackReceivedAt:this.ackReceivedAt,latency:this.ackReceivedAt?this.ackReceivedAt-this.sentAt:null,metadata:this.metadata}}isExpired(A){return this.state===m.ACKNOWLEDGED?Date.now()-this.ackReceivedAt>A:this.state===m.FAILED||this.state===m.CANCELLED?Date.now()-this.lastAttempt>A:!1}},wA=class{constructor(A={}){this.options={..._4,...A},this.pending=new Map,this.completed=new Map,this.listeners=new Map,this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],this._startCleanup(),z.info("AckManager created",this.options)}track(A,I,O={}){if(this.pending.has(A))return z.warn("Message already being tracked",{messageId:A}),this.pending.get(A).deferred.promise;let U={timeout:O.timeout||this.options.timeout,maxRetries:O.maxRetries||this.options.maxRetries,retryBaseDelay:O.retryBaseDelay||this.options.retryBaseDelay,retryMaxDelay:O.retryMaxDelay||this.options.retryMaxDelay,sendCallback:I,metadata:O.metadata},E=new $1(A,U);this.pending.set(A,E),this.stats.totalTracked++;try{I(A)}catch(K){z.error("Initial send failed:",K),E.cancel(`Send failed: ${K.message}`)}return E.deferred.promise.then(K=>{this._handleAcknowledgement(A,K)}).catch(K=>{this._handleFailure(A,K)}),E.deferred.promise}acknowledge(A,I=null){let O=this.pending.get(A);if(!O){z.debug("Ack for untracked message (maybe already completed)",{messageId:A});return}O.acknowledge(I)}cancel(A,I="Cancelled"){let O=this.pending.get(A);O&&(O.cancel(I),this.pending.delete(A),this.stats.cancelled++)}isPending(A){return this.pending.has(A)}getStatus(A){let I=this.pending.get(A)||this.completed.get(A);return I?I.getStats():null}waitForAll(A,I=3e4){let O=A.map(U=>{let E=this.pending.get(U);return E?E.deferred.promise:Promise.reject(new Error(`Message ${U} not tracked`))});return Promise.all(O)}waitForAny(A){let I=A.map(O=>{let U=this.pending.get(O);return U?U.deferred.promise:Promise.reject(new Error(`Message ${O} not tracked`))});return Promise.race(I)}getPending(){return Array.from(this.pending.values()).map(A=>A.getStats())}getCompleted(){return Array.from(this.completed.values()).map(A=>A.getStats())}getStats(){let A=this.stats.acknowledged>0?this.stats.totalLatency/this.stats.acknowledged:0;return{...this.stats,avgLatency:A,pendingCount:this.pending.size,completedCount:this.completed.size,minLatency:this.stats.minLatency===1/0?0:this.stats.minLatency,maxLatency:this.stats.maxLatency,latencyHistory:this.latencyHistory.slice(-10)}}reset(){this.pending.forEach((A,I)=>{A.cancel("Manager reset")}),this.pending.clear(),this.completed.clear(),this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],z.info("AckManager reset")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_handleAcknowledgement(A,I){let O=this.pending.get(A);O&&(this.stats.acknowledged++,I.latency&&(this.stats.totalLatency+=I.latency,this.stats.minLatency=Math.min(this.stats.minLatency,I.latency),this.stats.maxLatency=Math.max(this.stats.maxLatency,I.latency),this.options.trackLatency&&(this.latencyHistory.push({messageId:A,latency:I.latency,timestamp:Date.now()}),this.latencyHistory.length>100&&this.latencyHistory.shift(),this._emit(lA.LATENCY_UPDATED,{latency:I.latency,avgLatency:this.stats.totalLatency/this.stats.acknowledged}))),this.pending.delete(A),this.completed.set(A,O),this._emit(lA.ACKNOWLEDGED,{messageId:A,attempts:I.attempts,latency:I.latency}))}_handleFailure(A,I){let O=this.pending.get(A);O&&(O.state===m.FAILED?(this.stats.failed++,this._emit(lA.FAILED,{messageId:A,error:I.message})):O.state===m.TIMEOUT?(this.stats.timedOut++,this.stats.retries+=O.attempts,this._emit(lA.TIMEOUT,{messageId:A,attempt:O.attempts})):O.state===m.CANCELLED&&(this.stats.cancelled++,this._emit(lA.CANCELLED,{messageId:A,reason:I.message})),(O.state===m.FAILED||O.state===m.CANCELLED)&&(this.pending.delete(A),this.completed.set(A,O)))}_startCleanup(){this.cleanupInterval=setInterval(()=>{this._cleanup()},this.options.cleanupInterval)}_cleanup(){let A=0;for(let[I,O]of this.completed)O.isExpired(this.options.maxAckAge)&&(this.completed.delete(I),A++);A>0&&z.debug("Cleaned up old ack entries",{cleaned:A})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){z.error(`Error in ${A} listener:`,E)}})}destroy(){this.cleanupInterval&&clearInterval(this.cleanupInterval),this.reset(),this.listeners.clear(),z.info("AckManager destroyed")}};function MI(N={}){return new wA(N)}function LI(N,A,I={}){return new wA(I).track(N,A,I)}var h=S("queue"),X={PENDING:"pending",PROCESSING:"processing",SENT:"sent",FAILED:"failed",DISCARDED:"discarded"},GA={ITEM_ADDED:"item_added",ITEM_REMOVED:"item_removed",ITEM_STATE_CHANGED:"item_state_changed",PROCESSING_STARTED:"processing_started",PROCESSING_STOPPED:"processing_stopped",QUEUE_FULL:"queue_full",QUEUE_EMPTIED:"queue_emptied"},RA={CRITICAL:0,HIGH:1,NORMAL:2,LOW:3},j1={maxSize:1e3,maxAge:10080*60*1e3,autoProcess:!0,batchSize:10,batchDelay:100,maxRetries:5,preserveOrder:!0,dropOldestWhenFull:!0},Q1=class N{constructor(A,I={}){this.id=I.id||V("q"),this.data=A,this.priority=I.priority||RA.NORMAL,this.state=X.PENDING,this.createdAt=Date.now(),this.updatedAt=this.createdAt,this.retries=I.retries||0,this.maxRetries=I.maxRetries||j1.maxRetries,this.ttl=I.ttl||j1.maxAge,this.metadata=I.metadata||{},this.error=null,this.size=M1(A),this.sequence=Date.now()+Math.random(),h.debug("Queue item created",{id:this.id,priority:this.priority,size:this.size})}setState(A,I=null){let O=this.state;return this.state=A,this.updatedAt=Date.now(),I&&(this.error=I),h.debug("Item state changed",{id:this.id,from:O,to:A,retries:this.retries}),{oldState:O,newState:A}}incrementRetry(){return this.retries++,this.updatedAt=Date.now(),this.retries}isExpired(){return L1(this.createdAt,this.ttl)}hasExceededRetries(){return this.retries>=this.maxRetries}getAge(){return Date.now()-this.createdAt}toJSON(){return{id:this.id,data:this.data,priority:this.priority,state:this.state,createdAt:this.createdAt,updatedAt:this.updatedAt,retries:this.retries,maxRetries:this.maxRetries,ttl:this.ttl,metadata:this.metadata,error:this.error,size:this.size,sequence:this.sequence}}static fromJSON(A){let I=new N(A.data,{id:A.id,priority:A.priority,retries:A.retries,maxRetries:A.maxRetries,ttl:A.ttl,metadata:A.metadata});return I.state=A.state,I.createdAt=A.createdAt,I.updatedAt=A.updatedAt,I.error=A.error,I.sequence=A.sequence,I}},A1=class{constructor(A={}){this.options={...j1,...A},this.items=new Map,this.pendingIds=[],this.priorityBuckets={[RA.CRITICAL]:new Set,[RA.HIGH]:new Set,[RA.NORMAL]:new Set,[RA.LOW]:new Set},this.isProcessing=!1,this.processingPromise=null,this.processor=null,this.stats={totalAdded:0,totalProcessed:0,totalFailed:0,totalDiscarded:0,totalExpired:0,currentSize:0,peakSize:0,averageProcessTime:0},this.listeners=new Map,this.processingTimes=[],h.info("QueueManager created",this.options)}add(A,I={}){if(this.items.size>=this.options.maxSize)if(this.options.dropOldestWhenFull)this._dropOldest();else throw h.warn("Queue full, rejecting new item"),this._emit(GA.QUEUE_FULL,{size:this.items.size}),new Error("Queue is full");let O=new Q1(A,{priority:I.priority,ttl:I.ttl,metadata:I.metadata,maxRetries:this.options.maxRetries});return this.items.set(O.id,O),this.pendingIds.push(O.id),this.priorityBuckets[O.priority].add(O.id),this.stats.totalAdded++,this.stats.currentSize=this.items.size,this.stats.peakSize=Math.max(this.stats.peakSize,this.items.size),h.debug("Item added to queue",{id:O.id,priority:O.priority,queueSize:this.items.size}),this._emit(GA.ITEM_ADDED,{id:O.id,priority:O.priority,queueSize:this.items.size}),this.options.autoProcess&&this.processor&&!this.isProcessing&&this.process(),O.id}addBatch(A){return A.map(I=>Array.isArray(I)?this.add(I[0],I[1]):this.add(I))}remove(A){let I=this.items.get(A);if(!I)return!1;this.items.delete(A);let O=this.pendingIds.indexOf(A);return O!==-1&&this.pendingIds.splice(O,1),this.priorityBuckets[I.priority].delete(A),this.stats.currentSize=this.items.size,h.debug("Item removed from queue",{id:A}),this._emit(GA.ITEM_REMOVED,{id:A,priority:I.priority,queueSize:this.items.size}),!0}get(A){let I=this.items.get(A);return I?this._toPublicItem(I):null}getAll(A={}){let I=Array.from(this.items.values());return A.state&&(I=I.filter(O=>O.state===A.state)),A.priority!==void 0&&(I=I.filter(O=>O.priority===A.priority)),I.sort((O,U)=>O.priority!==U.priority?O.priority-U.priority:O.sequence-U.sequence),I.map(O=>this._toPublicItem(O))}size(){return this.items.size}isEmpty(){return this.items.size===0}isFull(){return this.items.size>=this.options.maxSize}setProcessor(A){if(typeof A!="function")throw new TypeError("Processor must be a function");this.processor=A}async process(){if(!this.processor){h.warn("No processor set, cannot process queue");return}if(this.isProcessing)return this.processingPromise;if(this.isEmpty()){h.debug("Queue empty, nothing to process");return}this.isProcessing=!0,this._emit(GA.PROCESSING_STARTED,{size:this.items.size}),h.info("Started processing queue",{size:this.items.size}),this.processingPromise=this._processQueue();try{await this.processingPromise}finally{this.isProcessing=!1,this.processingPromise=null,this._emit(GA.PROCESSING_STOPPED,{remaining:this.items.size}),this.isEmpty()&&this._emit(GA.QUEUE_EMPTIED)}}stopProcessing(){this.isProcessing=!1,h.info("Processing stopped")}clear(){this.items.clear(),this.pendingIds=[],Object.keys(this.priorityBuckets).forEach(A=>{this.priorityBuckets[A].clear()}),this.stats.currentSize=0,h.info("Queue cleared"),this._emit(GA.QUEUE_EMPTIED)}retryFailed(A){let I=0;for(let O of this.items.values())O.state===X.FAILED&&(O.setState(X.PENDING),O.retries=0,I++);h.info(`Retrying ${I} failed items`)}getStats(){let A={},I={};for(let O of this.items.values())A[O.state]=(A[O.state]||0)+1,I[O.priority]=(I[O.priority]||0)+1;return{...this.stats,currentSize:this.items.size,stateCounts:A,priorityCounts:I,isProcessing:this.isProcessing,isEmpty:this.isEmpty(),isFull:this.isFull(),oldestItem:this._getOldestItemAge(),newestItem:this._getNewestItemAge()}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}async _processQueue(){let A=Date.now(),I=0,O=0;try{for(;this.isProcessing&&!this.isEmpty();){let U=this._getNextBatch();if(U.length===0)break;for(let E of U){if(!this.isProcessing)break;try{E.setState(X.PROCESSING),await this.processor(this._toPublicItem(E))?(this.remove(E.id),I++,this.stats.totalProcessed++,this._emit(GA.ITEM_STATE_CHANGED,{id:E.id,state:X.SENT})):(this._handleFailure(E),O++)}catch(K){h.error("Error processing item:",K),this._handleFailure(E,K.message),O++}}this.options.batchDelay>0&&!this.isEmpty()&&await new Promise(E=>setTimeout(E,this.options.batchDelay))}}finally{let U=Date.now()-A;this.processingTimes.push(U),this.processingTimes.length>10&&this.processingTimes.shift(),this.stats.averageProcessTime=this.processingTimes.reduce((E,K)=>E+K,0)/this.processingTimes.length,h.info("Queue processing complete",{processed:I,failed:O,remaining:this.items.size,time:U})}}_getNextBatch(){let A=[],I=this.options.batchSize,O=[RA.CRITICAL,RA.HIGH,RA.NORMAL,RA.LOW];for(let U of O){if(A.length>=I)break;let E=this.priorityBuckets[U],K=I-A.length,B=Array.from(E).map(R=>this.items.get(R)).filter(R=>R&&R.state===X.PENDING).sort((R,M)=>R.sequence-M.sequence).slice(0,K);A.push(...B)}return A}_handleFailure(A,I=null){A.incrementRetry(),A.hasExceededRetries()?(A.setState(X.DISCARDED,I),this.remove(A.id),this.stats.totalDiscarded++,h.warn("Item discarded (max retries)",{id:A.id,retries:A.retries})):(A.setState(X.FAILED,I),this.stats.totalFailed++,h.debug("Item failed, will retry",{id:A.id,retries:A.retries}))}_dropOldest(){if(this.pendingIds.length===0)return;let A=this.pendingIds[0],I=this.items.get(A);I&&(I.setState(X.DISCARDED,"Queue full - dropped"),this.remove(A),this.stats.totalDiscarded++,h.warn("Dropped oldest item (queue full)",{id:A,age:I.getAge()}))}_removeExpired(){let A=0;for(let[I,O]of this.items)O.isExpired()&&(O.setState(X.DISCARDED,"Expired"),this.remove(I),A++,this.stats.totalExpired++);A>0&&h.info(`Removed ${A} expired items`)}_getOldestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[0],I=this.items.get(A);return I?I.getAge():null}_getNewestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[this.pendingIds.length-1],I=this.items.get(A);return I?I.getAge():null}_toPublicItem(A){return{id:A.id,data:A.data,priority:A.priority,state:A.state,createdAt:A.createdAt,updatedAt:A.updatedAt,retries:A.retries,maxRetries:A.maxRetries,metadata:A.metadata,error:A.error,size:A.size}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){h.error(`Error in ${A} listener:`,E)}})}destroy(){this.stopProcessing(),this.clear(),this.listeners.clear(),this.processor=null,h.info("QueueManager destroyed")}};function S1(N={}){return new A1(N)}var i=S("storage"),AA={INITIALIZED:"initialized",ITEM_STORED:"item_stored",ITEM_RETRIEVED:"item_retrieved",ITEM_DELETED:"item_deleted",CLEARED:"cleared",ERROR:"error",STORAGE_FULL:"storage_full"},n={INDEXED_DB:"indexeddb",LOCAL_STORAGE:"localstorage",MEMORY:"memory"},k4={dbName:"websocket_queue",storeName:"messages",dbVersion:1,maxItems:1e4,maxSize:5*1024*1024,autoInit:!0,storageType:null},X1=class{constructor(A={}){this.options={...k4,...A},this.browser=p(),this.initialized=!1,this.initializing=!1,this.storageType=null,this.db=null,this.memoryStore=new Map,this.stats={itemsStored:0,itemsRetrieved:0,itemsDeleted:0,storageCleared:0,errors:0,estimatedSize:0},this.listeners=new Map,this._initPromise=null,this.options.autoInit&&this.init(),i.info("StorageManager created")}async init(){if(!this.initialized){if(this.initializing)return this._initPromise;this.initializing=!0,this._initPromise=this._initialize();try{await this._initPromise,this.initialized=!0,i.info("Storage initialized",{type:this.storageType}),this._emit(AA.INITIALIZED,{type:this.storageType})}catch(A){throw i.error("Storage initialization failed:",A),this._emit(AA.ERROR,{error:A.message}),A}finally{this.initializing=!1}}}async setItem(A,I){await this._ensureInitialized();try{let O=this._getItemSize(I);switch(this.stats.estimatedSize+O>this.options.maxSize&&(i.warn("Storage size limit approaching"),this._emit(AA.STORAGE_FULL,{size:this.stats.estimatedSize,max:this.options.maxSize})),this.storageType){case n.INDEXED_DB:await this._setItemIndexedDB(A,I);break;case n.LOCAL_STORAGE:this._setItemLocalStorage(A,I);break;case n.MEMORY:this._setItemMemory(A,I);break}this.stats.itemsStored++,this.stats.estimatedSize+=O,i.debug("Item stored",{key:A,size:O}),this._emit(AA.ITEM_STORED,{key:A,size:O})}catch(O){throw this.stats.errors++,i.error("Failed to store item:",O),this._emit(AA.ERROR,{key:A,error:O.message}),O}}async getItem(A){await this._ensureInitialized();try{let I=null;switch(this.storageType){case n.INDEXED_DB:I=await this._getItemIndexedDB(A);break;case n.LOCAL_STORAGE:I=this._getItemLocalStorage(A);break;case n.MEMORY:I=this._getItemMemory(A);break}return I!=null&&(this.stats.itemsRetrieved++,i.debug("Item retrieved",{key:A}),this._emit(AA.ITEM_RETRIEVED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to retrieve item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),null}}async removeItem(A){await this._ensureInitialized();try{let I=!1;switch(this.storageType){case n.INDEXED_DB:I=await this._removeItemIndexedDB(A);break;case n.LOCAL_STORAGE:I=this._removeItemLocalStorage(A);break;case n.MEMORY:I=this._removeItemMemory(A);break}return I&&(this.stats.itemsDeleted++,i.debug("Item removed",{key:A}),this._emit(AA.ITEM_DELETED,{key:A})),I}catch(I){return this.stats.errors++,i.error("Failed to remove item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),!1}}async getAll(){await this._ensureInitialized();try{let A=[];switch(this.storageType){case n.INDEXED_DB:A=await this._getAllIndexedDB();break;case n.LOCAL_STORAGE:A=this._getAllLocalStorage();break;case n.MEMORY:A=this._getAllMemory();break}return i.debug("Retrieved all items",{count:A.length}),A}catch(A){return this.stats.errors++,i.error("Failed to get all items:",A),this._emit(AA.ERROR,{error:A.message}),[]}}async clear(){await this._ensureInitialized();try{switch(this.storageType){case n.INDEXED_DB:await this._clearIndexedDB();break;case n.LOCAL_STORAGE:this._clearLocalStorage();break;case n.MEMORY:this._clearMemory();break}this.stats.storageCleared++,this.stats.estimatedSize=0,i.info("Storage cleared"),this._emit(AA.CLEARED)}catch(A){this.stats.errors++,i.error("Failed to clear storage:",A),this._emit(AA.ERROR,{error:A.message})}}async count(){await this._ensureInitialized();try{switch(this.storageType){case n.INDEXED_DB:return await this._countIndexedDB();case n.LOCAL_STORAGE:return this._countLocalStorage();case n.MEMORY:return this.memoryStore.size;default:return 0}}catch(A){return this.stats.errors++,i.error("Failed to count items:",A),0}}getStats(){return{...this.stats,storageType:this.storageType,initialized:this.initialized,maxItems:this.options.maxItems,maxSize:this.options.maxSize,usagePercent:this.stats.estimatedSize/this.options.maxSize*100}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}async _initialize(){switch(this.storageType=await this._detectStorageType(),i.info(`Using storage type: ${this.storageType}`),this.storageType){case n.INDEXED_DB:await this._initIndexedDB();break;case n.LOCAL_STORAGE:this._initLocalStorage();break;case n.MEMORY:this._initMemory();break}await this._updateStats()}async _detectStorageType(){if(this.options.storageType)return this.options.storageType;if(this.browser.hasIndexedDB)try{if(await this._testIndexedDB())return n.INDEXED_DB}catch(A){i.warn("IndexedDB test failed:",A)}if(this.browser.hasLocalStorage)try{return this._testLocalStorage(),n.LOCAL_STORAGE}catch(A){i.warn("localStorage test failed:",A)}return n.MEMORY}_testIndexedDB(){return new Promise(A=>{try{let I=indexedDB.open("__test__",1);I.onerror=()=>A(!1),I.onsuccess=()=>{I.result.close(),indexedDB.deleteDatabase("__test__"),A(!0)}}catch{A(!1)}})}_testLocalStorage(){let A="__test__";return localStorage.setItem(A,"test"),localStorage.removeItem(A),!0}_initIndexedDB(){return new Promise((A,I)=>{let O=indexedDB.open(this.options.dbName,this.options.dbVersion);O.onerror=U=>{I(new Error(`IndexedDB error: ${U.target.error}`))},O.onsuccess=U=>{this.db=U.target.result,this.db.onversionchange=()=>{this.db.close(),i.warn("Database upgraded elsewhere, reloading")},A()},O.onupgradeneeded=U=>{let E=U.target.result;if(!E.objectStoreNames.contains(this.options.storeName)){let K=E.createObjectStore(this.options.storeName,{keyPath:"id"});K.createIndex("timestamp","timestamp"),K.createIndex("priority","priority"),K.createIndex("state","state"),i.info("Created IndexedDB store")}}})}_initLocalStorage(){let A=localStorage.getItem(this._getStoreKey());if(A)try{let I=JSON.parse(A);Array.isArray(I)&&i.info(`Loaded ${I.length} items from localStorage`)}catch{i.warn("Corrupted localStorage data, clearing"),localStorage.removeItem(this._getStoreKey())}}_initMemory(){this.memoryStore.clear(),i.info("Using memory storage")}_getStoreKey(){return`${this.options.dbName}_${this.options.storeName}`}_getItemSize(A){try{let I=JSON.stringify(A);return new Blob([I]).size}catch{return 0}}async _ensureInitialized(){this.initialized||await this.init()}async _updateStats(){let A=await this.getAll();this.stats.estimatedSize=A.reduce((I,O)=>I+this._getItemSize(O),0)}async _setItemIndexedDB(A,I){return new Promise((O,U)=>{let K=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName),B={id:A,data:I,timestamp:Date.now()},R=K.put(B);R.onsuccess=()=>O(),R.onerror=()=>U(R.error)})}async _getItemIndexedDB(A){return new Promise((I,O)=>{let K=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).get(A);K.onsuccess=()=>{I(K.result?K.result.data:null)},K.onerror=()=>O(K.error)})}async _removeItemIndexedDB(A){return new Promise((I,O)=>{let K=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName).delete(A);K.onsuccess=()=>I(!0),K.onerror=()=>O(K.error)})}async _getAllIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).getAll();E.onsuccess=()=>{let K=E.result.map(B=>({key:B.id,...B.data}));A(K)},E.onerror=()=>I(E.error)})}async _clearIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readwrite").objectStore(this.options.storeName).clear();E.onsuccess=()=>A(),E.onerror=()=>I(E.error)})}async _countIndexedDB(){return new Promise((A,I)=>{let E=this.db.transaction([this.options.storeName],"readonly").objectStore(this.options.storeName).count();E.onsuccess=()=>A(E.result),E.onerror=()=>I(E.error)})}_setItemLocalStorage(A,I){let O=this._getAllLocalStorage(),U=O.find(E=>E.key===A);U?(U.data=I,U.timestamp=Date.now()):O.push({key:A,data:I,timestamp:Date.now()}),localStorage.setItem(this._getStoreKey(),JSON.stringify(O))}_getItemLocalStorage(A){let O=this._getAllLocalStorage().find(U=>U.key===A);return O?O.data:null}_removeItemLocalStorage(A){let I=this._getAllLocalStorage(),O=I.filter(U=>U.key!==A);return localStorage.setItem(this._getStoreKey(),JSON.stringify(O)),I.length!==O.length}_getAllLocalStorage(){let A=localStorage.getItem(this._getStoreKey());if(!A)return[];try{return JSON.parse(A)}catch{return[]}}_clearLocalStorage(){localStorage.removeItem(this._getStoreKey())}_countLocalStorage(){return this._getAllLocalStorage().length}_setItemMemory(A,I){this.memoryStore.set(A,{data:I,timestamp:Date.now()})}_getItemMemory(A){let I=this.memoryStore.get(A);return I?I.data:null}_removeItemMemory(A){return this.memoryStore.delete(A)}_getAllMemory(){return Array.from(this.memoryStore.entries()).map(([A,I])=>({key:A,...I.data}))}_clearMemory(){this.memoryStore.clear()}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){i.error(`Error in ${A} listener:`,E)}})}destroy(){this.db&&(this.db.close(),this.db=null),this.memoryStore.clear(),this.listeners.clear(),this.initialized=!1,i.info("StorageManager destroyed")}};function A2(N={}){return new X1(N)}var x=S("retry"),IA={EXPONENTIAL:"exponential",LINEAR:"linear",FIXED:"fixed",FIBONACCI:"fibonacci",IMMEDIATE:"immediate"},CA={ALL:"all",NETWORK:"network",SERVER:"server",TIMEOUT:"timeout",CUSTOM:"custom"},TA={BEFORE_RETRY:"before_retry",AFTER_RETRY:"after_retry",MAX_RETRIES_REACHED:"max_retries_reached",CANCELLED:"cancelled",CIRCUIT_OPENED:"circuit_opened",CIRCUIT_CLOSED:"circuit_closed"},MA={CLOSED:"closed",OPEN:"open",HALF_OPEN:"half_open"},GI={maxAttempts:5,initialDelay:1e3,maxDelay:3e4,strategy:IA.EXPONENTIAL,factor:2,jitter:!0,retryCondition:CA.ALL,customCondition:null,circuitBreaker:{enabled:!0,failureThreshold:5,openTimeout:3e4,successThreshold:2},resetOnSuccess:!0},I2=class{constructor(A,I,O={}){this.operation=A,this.options=I,this.metadata=O,this.attempt=0,this.startTime=Date.now(),this.lastError=null,this.cancelled=!1,this.deferred=nA(),this.results=[],this.errors=[],x.debug("Retry context created",{maxAttempts:I.maxAttempts,strategy:I.strategy})}getNextDelay(){if(this.attempt===0)return 0;switch(this.options.strategy){case IA.EXPONENTIAL:return this._exponentialDelay();case IA.LINEAR:return this._linearDelay();case IA.FIBONACCI:return this._fibonacciDelay();case IA.FIXED:return this.options.initialDelay;case IA.IMMEDIATE:return 0;default:return this._exponentialDelay()}}_exponentialDelay(){return iA(this.attempt-1,{baseDelay:this.options.initialDelay,maxDelay:this.options.maxDelay,jitter:this.options.jitter})}_linearDelay(){let A=this.options.initialDelay*this.attempt;return this.options.jitter&&(A=A*(.8+.4*Math.random())),Math.min(A,this.options.maxDelay)}_fibonacciDelay(){let A=O=>O<=1?1:A(O-1)+A(O-2),I=this.options.initialDelay*A(this.attempt);return this.options.jitter&&(I=I*(.8+.4*Math.random())),Math.min(I,this.options.maxDelay)}shouldRetry(A){return this.attempt>=this.options.maxAttempts||this.cancelled?!1:this._checkCondition(A)}_checkCondition(A){switch(this.options.retryCondition){case CA.ALL:return!0;case CA.NETWORK:return this._isNetworkError(A);case CA.SERVER:return this._isServerError(A);case CA.TIMEOUT:return this._isTimeoutError(A);case CA.CUSTOM:return this.options.customCondition?this.options.customCondition(A):!0;default:return!0}}_isNetworkError(A){return["ECONNREFUSED","ECONNRESET","ENOTFOUND","ETIMEDOUT","NetworkError","network offline"].some(O=>{var U,E;return((U=A.message)==null?void 0:U.includes(O))||((E=A.code)==null?void 0:E.includes(O))})}_isServerError(A){return A.status>=500||A.statusCode>=500}_isTimeoutError(A){var I;return((I=A.message)==null?void 0:I.includes("timeout"))||A.code==="ETIMEDOUT"}recordResult(A){this.results.push({attempt:this.attempt,result:A,timestamp:Date.now()})}recordError(A){this.lastError=A,this.errors.push({attempt:this.attempt,error:A.message,timestamp:Date.now()})}getStats(){var A;return{attempt:this.attempt,startTime:this.startTime,elapsed:Date.now()-this.startTime,lastError:(A=this.lastError)==null?void 0:A.message,results:this.results,errors:this.errors,cancelled:this.cancelled}}},O2=class{constructor(A){this.options=A,this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,this.lastFailure=null,x.debug("Circuit breaker created",A)}isClosed(){return this.state===MA.CLOSED}isOpen(){return this.state===MA.OPEN}isHalfOpen(){return this.state===MA.HALF_OPEN}recordSuccess(){this.successCount++,this.failureCount=0,this.state===MA.HALF_OPEN&&this.successCount>=this.options.successThreshold&&this._close()}recordFailure(A){this.lastFailure=A,this.failureCount++,this.successCount=0,this.state===MA.CLOSED?this.failureCount>=this.options.failureThreshold&&this._open():this.state===MA.HALF_OPEN&&this._open()}checkHalfOpen(){return this.state===MA.OPEN&&this.openTime&&Date.now()-this.openTime>=this.options.openTimeout?(this._halfOpen(),!0):!1}_open(){this.state=MA.OPEN,this.openTime=Date.now(),this.successCount=0,x.warn("Circuit opened",{failures:this.failureCount,timeout:this.options.openTimeout})}_close(){this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,x.info("Circuit closed")}_halfOpen(){this.state=MA.HALF_OPEN,this.successCount=0,x.info("Circuit half-open, testing recovery")}getStats(){var A;return{state:this.state,failureCount:this.failureCount,successCount:this.successCount,openTime:this.openTime,lastFailure:(A=this.lastFailure)==null?void 0:A.message}}},aA=class{constructor(A={}){this.options=this._mergeOptions(A),this.circuitBreaker=this.options.circuitBreaker.enabled?new O2(this.options.circuitBreaker):null,this.contexts=new Map,this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},this.listeners=new Map,x.info("RetryManager created",{strategy:this.options.strategy,maxAttempts:this.options.maxAttempts})}async execute(A,I={},O={}){var K;if((K=this.circuitBreaker)!=null&&K.isOpen())if(this.circuitBreaker.checkHalfOpen())this._emit(TA.CIRCUIT_HALF_OPEN);else{let B=new Error("Circuit breaker is open");throw this._emit(TA.CIRCUIT_OPENED,{error:B}),B}let U=new I2(A,{...this.options,...I},O),E=Date.now()+Math.random().toString(36);this.contexts.set(E,U),this.stats.totalExecutions++;try{let B=await this._executeWithRetry(U);return this.circuitBreaker&&this.circuitBreaker.recordSuccess(),this.stats.successfulExecutions++,B}catch(B){throw this.circuitBreaker&&(this.circuitBreaker.recordFailure(B),this.circuitBreaker.isOpen()&&(this.stats.circuitOpens++,this._emit(TA.CIRCUIT_OPENED,{error:B}))),this.stats.failedExecutions++,B}finally{this.contexts.delete(E)}}async _executeWithRetry(A){for(;;){A.attempt++;try{x.debug(`Attempt ${A.attempt}`,A.metadata);let I=await A.operation();return A.recordResult(I),A.attempt>1&&x.info(`Succeeded after ${A.attempt} attempts`),this.options.resetOnSuccess,I}catch(I){if(A.recordError(I),x.debug(`Attempt ${A.attempt} failed:`,I.message),!A.shouldRetry(I))throw this._emit(TA.MAX_RETRIES_REACHED,{attempts:A.attempt,error:I.message}),I;let O=A.getNextDelay();x.debug(`Retrying in ${O}ms (attempt ${A.attempt}/${A.options.maxAttempts})`),this.stats.totalRetries++,this._emit(TA.BEFORE_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts,delay:O,error:I.message}),O>0&&await mA(O),this._emit(TA.AFTER_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts})}}}cancelAll(A="Cancelled by user"){this.contexts.forEach((I,O)=>{I.cancelled=!0,this._emit(TA.CANCELLED,{id:O,reason:A})}),this.contexts.clear(),x.info("All retries cancelled",{reason:A})}getStats(){var I;let A=((I=this.circuitBreaker)==null?void 0:I.getStats())||null;return{...this.stats,circuitBreaker:A,activeRetries:this.contexts.size,currentOptions:{...this.options}}}resetStats(){this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},x.info("Retry stats reset")}resetCircuitBreaker(){this.circuitBreaker&&(this.circuitBreaker._close(),this._emit(TA.CIRCUIT_CLOSED))}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_mergeOptions(A){let I={...GI,...A};return A.circuitBreaker&&(I.circuitBreaker={...GI.circuitBreaker,...A.circuitBreaker}),I}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){x.error(`Error in ${A} listener:`,E)}})}destroy(){this.cancelAll("Manager destroyed"),this.listeners.clear(),x.info("RetryManager destroyed")}};function t1(N={}){return new aA(N)}async function TI(N,A={}){return new aA({maxAttempts:2,...A}).execute(N)}async function WI(N,A=5){return new aA({maxAttempts:A,strategy:IA.EXPONENTIAL}).execute(N)}async function YI(N,A=1e3,I=5){return new aA({maxAttempts:I,strategy:IA.FIXED,initialDelay:A}).execute(N)}var a=S("recovery"),eA={IDLE:"idle",SCANNING:"scanning",RESTORING:"restoring",COMPLETED:"completed",FAILED:"failed"},WA={RECOVERY_STARTED:"recovery_started",RECOVERY_PROGRESS:"recovery_progress",RECOVERY_COMPLETED:"recovery_completed",RECOVERY_FAILED:"recovery_failed",STATE_SAVED:"state_saved",STATE_RESTORED:"state_restored",CHECKPOINT_CREATED:"checkpoint_created"},hA={FULL:"full",MINIMAL:"minimal",VERIFIED:"verified",CONNECTION_ONLY:"connection_only"},q4={strategy:hA.FULL,maxStateAge:10080*60*1e3,autoRecover:!0,enableCheckpoints:!0,checkpointInterval:300*1e3,maxCheckpoints:5,verifyWithServer:!0,recoveryTimeout:3e4,replayQueue:!0,restoreSubscriptions:!0,restorePresence:!0},N2=class N{constructor(A,I={}){this.id=V("ckpt"),this.timestamp=Date.now(),this.state=A,this.metadata=I,this.size=this._calculateSize()}_calculateSize(){try{return new Blob([JSON.stringify(this.state)]).size}catch{return 0}}isExpired(A){return Date.now()-this.timestamp>A}toJSON(){return{id:this.id,timestamp:this.timestamp,state:this.state,metadata:this.metadata,size:this.size}}static fromJSON(A){let I=new N(A.state,A.metadata);return I.id=A.id,I.timestamp=A.timestamp,I}},I1=class{constructor(A={}){this.options={...q4,...A},this.state=eA.IDLE,this.sessionId=this._generateSessionId(),this.currentState=null,this.storage=A2({dbName:"websocket_recovery",storeName:"state",autoInit:!0}),this.queue=S1({maxSize:1e3,autoProcess:!1}),this.retry=t1({maxAttempts:3,strategy:IA.EXPONENTIAL}),this.checkpoints=[],this.checkpointTimer=null,this.stats={recoveriesAttempted:0,recoveriesSuccessful:0,recoveriesFailed:0,statesSaved:0,statesRestored:0,checkpointsCreated:0,lastRecoveryTime:null,lastRecoveryDuration:null},this.listeners=new Map,this.options.enableCheckpoints&&this._startCheckpointTimer(),this.options.autoRecover&&setTimeout(()=>this.recover(),0),a.info("RecoveryManager created",{sessionId:this.sessionId,strategy:this.options.strategy})}async saveState(A,I={}){let O={sessionId:this.sessionId,timestamp:Date.now(),state:{...A,_version:1},metadata:{...I,strategy:this.options.strategy}};try{await this.storage.setItem("current_state",O),this.currentState=O,this.stats.statesSaved++,a.debug("State saved",{timestamp:O.timestamp,metadata:I}),this._emit(WA.STATE_SAVED,{timestamp:O.timestamp,metadata:I}),this.options.enableCheckpoints&&await this._createCheckpoint(A,I)}catch(U){throw a.error("Failed to save state:",U),U}}async recover(){if(this.state===eA.RECOVERING)return a.warn("Recovery already in progress"),null;this.state=eA.SCANNING,this.stats.recoveriesAttempted++,this._emit(WA.RECOVERY_STARTED,{sessionId:this.sessionId,strategy:this.options.strategy});let A=Date.now();try{let I=await this._findRecoverableState();if(!I)return a.info("No recoverable state found"),this.state=eA.IDLE,null;this.state=eA.RESTORING;let O;switch(this.options.strategy){case hA.FULL:O=await this._fullRecovery(I);break;case hA.MINIMAL:O=await this._minimalRecovery(I);break;case hA.VERIFIED:O=await this._verifiedRecovery(I);break;case hA.CONNECTION_ONLY:O=await this._connectionOnlyRecovery(I);break;default:O=await this._fullRecovery(I)}return this.options.verifyWithServer&&O&&(O=await this._verifyWithServer(O)),this.options.replayQueue&&O&&await this._replayQueue(),this.stats.recoveriesSuccessful++,this.stats.statesRestored++,this.stats.lastRecoveryTime=Date.now(),this.stats.lastRecoveryDuration=Date.now()-A,this.state=eA.COMPLETED,a.info("Recovery completed",{duration:this.stats.lastRecoveryDuration,hasState:!!O}),this._emit(WA.RECOVERY_COMPLETED,{duration:this.stats.lastRecoveryDuration,state:O}),O}catch(I){return this.state=eA.FAILED,this.stats.recoveriesFailed++,a.error("Recovery failed:",I),this._emit(WA.RECOVERY_FAILED,{error:I.message}),null}}async createCheckpoint(A,I={}){return this._createCheckpoint(A,I)}async listCheckpoints(){try{return await this.storage.getItem("checkpoints")||[]}catch{return[]}}async restoreFromCheckpoint(A){let O=(await this.listCheckpoints()).find(U=>U.id===A);return O?(a.info("Restoring from checkpoint",{id:A,timestamp:O.timestamp}),O.state):(a.warn("Checkpoint not found",{checkpointId:A}),null)}async clear(){await this.storage.clear(),this.checkpoints=[],this.currentState=null,a.info("Recovery state cleared")}getStats(){return{...this.stats,state:this.state,sessionId:this.sessionId,hasSavedState:!!this.currentState,checkpointCount:this.checkpoints.length,options:{...this.options}}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_generateSessionId(){let A=localStorage.getItem("websocket_session_id");if(A)return A;let I=V("sess");return localStorage.setItem("websocket_session_id",I),I}async _findRecoverableState(){try{let A=await this.storage.getItem("current_state");if(A&&!this._isStateExpired(A))return a.debug("Found current state",{age:Date.now()-A.timestamp}),{type:"current",state:A};let O=(await this.listCheckpoints()).filter(U=>!U.isExpired(this.options.maxStateAge));if(O.length>0){let U=O.sort((E,K)=>K.timestamp-E.timestamp)[0];return a.debug("Found checkpoint",{timestamp:U.timestamp}),{type:"checkpoint",state:U.state}}return null}catch(A){return a.error("Error finding recoverable state:",A),null}}_isStateExpired(A){return Date.now()-A.timestamp>this.options.maxStateAge}async _fullRecovery(A){let I=A.state;return a.info("Performing full recovery",{type:A.type,timestamp:I.timestamp}),this._emit(WA.RECOVERY_PROGRESS,{phase:"full",percent:50}),I.state}async _minimalRecovery(A){let I=A.state;a.info("Performing minimal recovery",{type:A.type});let O={},U=["userId","sessionToken","connectionId"];for(let E of U)I.state[E]&&(O[E]=I.state[E]);return this._emit(WA.RECOVERY_PROGRESS,{phase:"minimal",percent:75}),O}async _verifiedRecovery(A){let I=A.state;return a.info("Performing verified recovery"),I.state}async _connectionOnlyRecovery(A){let I=A.state;return a.info("Performing connection-only recovery"),{connectionId:I.state.connectionId,lastMessageId:I.state.lastMessageId}}async _verifyWithServer(A){return A}async _replayQueue(){let A=await this.storage.getItem("queue")||[];if(A.length!==0){a.info(`Replaying ${A.length} queued messages`);for(let I of A)await this.queue.add(I.data,{priority:I.priority,metadata:{recovered:!0}});this._emit(WA.RECOVERY_PROGRESS,{phase:"replay",count:A.length})}}async _createCheckpoint(A,I){try{let O=new N2(A,I),U=await this.storage.getItem("checkpoints")||[];U.push(O.toJSON()),U.sort((E,K)=>K.timestamp-E.timestamp),U.length>this.options.maxCheckpoints&&(U=U.slice(0,this.options.maxCheckpoints)),await this.storage.setItem("checkpoints",U),this.stats.checkpointsCreated++,a.debug("Checkpoint created",{id:O.id,size:O.size}),this._emit(WA.CHECKPOINT_CREATED,{id:O.id,timestamp:O.timestamp,size:O.size})}catch(O){a.error("Failed to create checkpoint:",O)}}_startCheckpointTimer(){this.checkpointTimer=setInterval(async()=>{this.currentState&&await this._createCheckpoint(this.currentState.state,this.currentState.metadata)},this.options.checkpointInterval)}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){a.error(`Error in ${A} listener:`,E)}})}destroy(){this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.storage.destroy(),this.queue.destroy(),this.listeners.clear(),a.info("RecoveryManager destroyed")}};function SI(N={}){return new I1(N)}function tI(N,A={}){let I=A2({dbName:"persistent_state",storeName:N,...A});return{async save(O){await I.setItem(N,{data:O,timestamp:Date.now()})},async load(){let O=await I.getItem(N);return(O==null?void 0:O.data)||null},async clear(){await I.removeItem(N)}}}var eI=z2;
|
|
1490
|
+
`,l4(),document.body.appendChild(N),H4(),N}function p2(N,A){if(!N){alert("please provide an `onConfirm` callback!");return}let I=u4();return I._callbacks={onConfirm:N,onCancel:A},d4(I),I}var B1=class{constructor(A){this.viewConfigs=A,this.loadedStyles=new Set,this.currentView=null,this.currentModule=null}async loadView(A){if(!A)return;let I=A.replace("-view",""),O=document.getElementById(A);if(!O)return;let U=this.viewConfigs[I];if(!U){console.error(`\u274C No config found for view: ${I}`);return}if(this.currentView!==I){this.currentView&&await this.unloadView(this.currentView);try{U.css&&(console.log(`Loading CSS: ${U.css}`),await this.loadCSS(I,U.css)),console.log(`Loading HTML: ${U.html}`);let E=await fetch(U.html);if(!E.ok)throw new Error(`HTTP ${E.status}`);let K=await E.text();O.innerHTML=K,U.js&&(console.log(`Loading JS: ${U.js}`),await this.loadJS(I,U.js)),this.currentView=I,console.log(`View loaded: ${I}`)}catch(E){console.error(`Failed to load view ${I}:`,E),O.innerHTML=`<p style="color: red; padding: 20px;">Error loading ${I}: ${E.message}</p>`}}}async loadCSS(A,I){let O=`style-${A}`,U=document.getElementById(O);U&&U.remove();let E=document.createElement("link");return E.id=O,E.rel="stylesheet",E.href=I,new Promise(K=>{E.onload=()=>{this.loadedStyles.add(A),console.log(`CSS loaded: ${I}`),K()},E.onerror=()=>{console.log(`CSS failed to load: ${I} (continuing anyway)`),K()},document.head.appendChild(E)})}async loadJS(A,I){try{let O=await import(I);this.currentModule=O,console.log("module====>",O),O.init&&typeof O.init=="function"&&(console.log(`Initializing ${A}...`),O.init()),console.log(`JS loaded: ${I}`)}catch(O){console.log(`No JS module for ${A} or error:`,O)}}async unloadView(A){console.log(`Unloading view: ${A}`);let I=document.getElementById(`style-${A}`);I&&(I.remove(),this.loadedStyles.delete(A)),this.currentModule&&this.currentModule.cleanup&&(console.log(`Cleaning up ${A}...`),this.currentModule.cleanup()),this.currentModule=null,this.currentView=null}};var uA={threshold:0,rootMargin:"0px",root:null,triggerOnce:!1},LA=new Map;function Z4(N,A){return`${N?N.id||N.tagName+N.className:"viewport"}::${A}`}var C1=class{constructor(A,I,O){this.onEnter=A,this.onExit=I,this.options=O,this.currentlyIntersecting=!1}};function m4(N,A){let I=Z4(N,A);return LA.has(I)||LA.set(I,{observer:null,callbacks:new Map,root:N,rootMargin:A,thresholds:new Set([0])}),LA.get(I)}function p4(N){let A=new Set([0]);return N.callbacks.forEach(I=>{I.forEach(O=>{let U=O.options.threshold;Array.isArray(U)?U.forEach(E=>A.add(E)):typeof U=="number"&&A.add(U)})}),Array.from(A).sort((I,O)=>I-O)}function g4(N){let A=p4(N);if(N.observer){let I=Array.from(N.observer.thresholds);if(I.length===A.length&&I.every((U,E)=>U===A[E]))return;N.observer.disconnect()}N.observer=new IntersectionObserver(I=>{f4(N,I)},{root:N.root,rootMargin:N.rootMargin,threshold:A}),N.callbacks.forEach((I,O)=>{N.observer.observe(O)}),N.thresholds=new Set(A)}function f4(N,A){A.forEach(I=>{let O=I.target,U=N.callbacks.get(O);if(!U)return;let E=I.isIntersecting,K=I.intersectionRatio;Array.from(U).forEach(R=>{var Y,i;let{onEnter:M,onExit:L,options:G}=R,T=(Y=G.threshold)!=null?Y:uA.threshold,W=(i=G.triggerOnce)!=null?i:uA.triggerOnce,t=Array.isArray(T)?T.some(s=>K>=s):K>=T;E&&t&&!R.currentlyIntersecting&&(R.currentlyIntersecting=!0,M&&typeof M=="function"&&M(O,I),W&&f2(N,O,R)),!E&&R.currentlyIntersecting&&(R.currentlyIntersecting=!1,L&&typeof L=="function"&&L(O,I))}),U.size===0&&(N.callbacks.delete(O),N.observer&&N.observer.unobserve(O))})}function a1(N,A={}){var R,M,L,G;let I=w4(N);if(!I)return()=>{};let{onEnter:O,onExit:U}=A;if(!O&&!U)return console.warn("[IntersectionWatcher] No callbacks provided. At least onEnter or onExit required."),()=>{};let E={threshold:(R=A.threshold)!=null?R:uA.threshold,rootMargin:(M=A.rootMargin)!=null?M:uA.rootMargin,root:(L=A.root)!=null?L:uA.root,triggerOnce:(G=A.triggerOnce)!=null?G:uA.triggerOnce},K=m4(E.root,E.rootMargin),B=new C1(O,U,E);return K.callbacks.has(I)||K.callbacks.set(I,new Set),K.callbacks.get(I).add(B),g4(K),K.observer.observe(I),()=>{f2(K,I,B)}}function g2(N,A={}){if(typeof N!="string")return console.warn("[IntersectionWatcher] watchAll requires a CSS selector string."),()=>{};let I=document.querySelectorAll(N);if(I.length===0)return console.warn(`[IntersectionWatcher] No elements found for selector: "${N}"`),()=>{};let O=Array.from(I).map(U=>a1(U,A));return()=>{O.forEach(U=>U())}}function f2(N,A,I){let O=N.callbacks.get(A);if(O&&(O.delete(I),O.size===0&&(N.callbacks.delete(A),N.observer&&N.observer.unobserve(A)),N.callbacks.size===0)){N.observer&&(N.observer.disconnect(),N.observer=null);for(let[U,E]of LA)if(E===N){LA.delete(U);break}}}function w4(N){if(typeof N=="string"){let A=document.querySelector(N);return A||(console.warn(`[IntersectionWatcher] Element not found: "${N}"`),null)}return N instanceof Element?N:(console.warn("[IntersectionWatcher] Invalid target. Must be Element or selector string."),null)}function P1(){LA.forEach(N=>{N.observer&&(N.observer.disconnect(),N.observer=null),N.callbacks.clear()}),LA.clear()}function w2(N){for(let A of LA.values())if(A.callbacks.has(N))return!0;return!1}function v2(){let N=0,A=0;return LA.forEach(I=>{N+=I.callbacks.size,I.callbacks.forEach(O=>{A+=O.size})}),{elements:N,callbacks:A,pools:LA.size}}typeof window<"u"&&window.addEventListener("beforeunload",()=>{P1()});var a={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4},V2={level:a.ERROR,timestamps:!0,colors:!0,output:null,namespaces:{}},FA={reset:"\x1B[0m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",namespace:"\x1B[35m"},c1=class N{constructor(A,I={}){if(typeof A!="string")throw new TypeError("Logger namespace must be a string");this.namespace=A,this.config={...V2,...I}}debug(...A){this._log(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=FA[A.toLowerCase()]||FA.reset;O.push(`${U}[${A}]${FA.reset}`)}else O.push(`[${A}]`);return this.config.colors?O.push(`${FA.namespace}[${this.namespace}]${FA.reset}`):O.push(`[${this.namespace}]`),O.push(...I),O}_output(A,I){if(this.config.output){this.config.output(A,...I);return}A>=a.ERROR?console.error(...I):A>=a.WARN?console.warn(...I):console.log(...I)}},l1={...V2},R1=new Map;function S(N){if(R1.has(N))return R1.get(N);let A=new c1(N,l1);return R1.set(N,A),A}function y2(N){if(typeof N.level=="string"){let A={debug: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}}),l1={...l1,...N},R1.clear()}var v4=S("browser"),J1=class{constructor(){this._detectAll()}_detectAll(){if(this.isBrowser=typeof window<"u"&&typeof document<"u",this.isNode=!this.isBrowser&&typeof process<"u",!this.isBrowser){this._setNonBrowserDefaults();return}this.hasWebSocket=typeof window.WebSocket<"u",this.hasLocalStorage=this._checkStorage("localStorage"),this.hasSessionStorage=this._checkStorage("sessionStorage"),this.hasIndexedDB=this._checkIndexedDB(),this.hasBlob=typeof Blob<"u",this.hasArrayBuffer=typeof ArrayBuffer<"u",this.hasDataView=typeof DataView<"u",this.hasTypedArrays=typeof Uint8Array<"u",this.hasCrypto=typeof crypto<"u"&&typeof crypto.getRandomValues<"u",this.hasWorker=typeof Worker<"u",this.hasSharedWorker=typeof SharedWorker<"u",this.hasServiceWorker=typeof navigator<"u"&&"serviceWorker"in navigator,this.hasNetworkInfo=typeof navigator<"u"&&"connection"in navigator,this.hasBatteryInfo=typeof navigator<"u"&&"getBattery"in navigator,this.userAgent=navigator.userAgent,this.browserInfo=this._identifyBrowser(),this.osInfo=this._identifyOS(),this.isMobile=this._detectMobile(),this.isTablet=this._detectTablet(),this.screenSize={width:window.screen.width,height:window.screen.height},this.pixelRatio=window.devicePixelRatio||1,this.touchSupport="ontouchstart"in window||navigator.maxTouchPoints>0,this.hasPerformanceAPI=typeof performance<"u",this.deviceMemory=navigator.deviceMemory||4,this.hardwareConcurrency=navigator.hardwareConcurrency||2,v4.debug("Browser capabilities detected",{hasWebSocket:this.hasWebSocket,browser:this.browserInfo.name,mobile:this.isMobile,memory:this.deviceMemory})}_setNonBrowserDefaults(){this.hasWebSocket=!1,this.hasLocalStorage=!1,this.hasSessionStorage=!1,this.hasIndexedDB=!1,this.hasBlob=!1,this.hasArrayBuffer=!0,this.hasDataView=!0,this.hasTypedArrays=!0,this.hasCrypto=!1,this.hasWorker=!1,this.hasSharedWorker=!1,this.hasServiceWorker=!1,this.hasNetworkInfo=!1,this.hasBatteryInfo=!1,this.isMobile=!1,this.isTablet=!1,this.touchSupport=!1,this.hasPerformanceAPI=!0,this.deviceMemory=4,this.hardwareConcurrency=2,this.browserInfo={name:"node",version:process.version},this.osInfo={name:process.platform}}_checkStorage(A){try{let I=window[A],O="__websocket_test__";return I.setItem(O,"test"),I.removeItem(O),!0}catch{return!1}}_checkIndexedDB(){try{return typeof window.indexedDB<"u"}catch{return!1}}_identifyBrowser(){var U,E,K,B,R;let A=this.userAgent,I="unknown",O="unknown";return A.indexOf("Firefox")>-1?(I="firefox",O=((U=A.match(/Firefox\/(\d+\.\d+)/))==null?void 0:U[1])||"unknown"):A.indexOf("Chrome")>-1&&A.indexOf("Edg")===-1?(I="chrome",O=((E=A.match(/Chrome\/(\d+\.\d+)/))==null?void 0:E[1])||"unknown"):A.indexOf("Safari")>-1&&A.indexOf("Chrome")===-1?(I="safari",O=((K=A.match(/Version\/(\d+\.\d+)/))==null?void 0:K[1])||"unknown"):A.indexOf("Edg")>-1?(I="edge",O=((B=A.match(/Edg\/(\d+\.\d+)/))==null?void 0:B[1])||"unknown"):(A.indexOf("MSIE")>-1||A.indexOf("Trident")>-1)&&(I="ie",O=((R=A.match(/(?:MSIE |rv:)(\d+\.\d+)/))==null?void 0:R[1])||"unknown"),{name:I,version:O}}_identifyOS(){let A=this.userAgent,I="unknown",O="unknown";if(A.indexOf("Windows")>-1)I="windows",A.indexOf("Windows NT 10.0")>-1?O="10":A.indexOf("Windows NT 6.3")>-1?O="8.1":A.indexOf("Windows NT 6.2")>-1?O="8":A.indexOf("Windows NT 6.1")>-1&&(O="7");else if(A.indexOf("Mac OS X")>-1){I="macos";let U=A.match(/Mac OS X (\d+[._]\d+[._]\d+)/);U&&(O=U[1].replace(/_/g,"."))}else if(A.indexOf("Android")>-1){I="android";let U=A.match(/Android (\d+\.\d+)/);U&&(O=U[1])}else if(A.indexOf("iOS")>-1||A.indexOf("iPhone")>-1||A.indexOf("iPad")>-1){I="ios";let U=A.match(/OS (\d+[_\d]+) like Mac/);U&&(O=U[1].replace(/_/g,"."))}else A.indexOf("Linux")>-1&&(I="linux");return{name:I,version:O}}_detectMobile(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(this.userAgent)}_detectTablet(){return/iPad|Android(?!.*Mobile)|Tablet/i.test(this.userAgent)}getRecommendedTransports(){let A=[];return this.hasWebSocket&&A.push("websocket"),typeof EventSource<"u"&&A.push("eventsource"),A.push("polling"),A}hasMemoryConstraints(){return this.isMobile||this.deviceMemory<=2}getMaxQueueSize(){return this.hasMemoryConstraints()?100:1e3}isLegacyBrowser(){let{name:A,version:I}=this.browserInfo,O=parseFloat(I);return A==="ie"||A==="firefox"&&O<50||A==="chrome"&&O<50||A==="safari"&&O<10}},h1=null;function p(){return h1||(h1=new J1),h1}function F2(){return p().hasWebSocket}function x2(){return p().isMobile}function b2(){if(!p().hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:A.type||"unknown",effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData||!1}:null}var W6=p();function V(N=""){let A=Date.now().toString(36),I=Math.random().toString(36).substring(2,10),O=`${A}${I}`;return N?`${N}_${O}`:O}function _2(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,N=>{let A=Math.random()*16|0;return(N==="x"?A:A&3|8).toString(16)})}function ZA(N){if(typeof N!="string"||N.trim()===""||!N.startsWith("ws://")&&!N.startsWith("wss://"))return!1;try{let A=new URL(N);return A.hostname&&A.hostname.includes(".")}catch{return!1}}function d1(N,A=null){if(typeof N!="string")return A;try{return JSON.parse(N)}catch{return A}}function u1(N,A=0){try{let I=new WeakSet;return JSON.stringify(N,(O,U)=>{if(typeof U=="object"&&U!==null){if(I.has(U))return"[Circular]";I.add(U)}return U},A)}catch{return""}}function xA(N){if(N===null||typeof N!="object")return N;if(N instanceof Date)return new Date(N.getTime());if(N instanceof Array)return N.map(A=>xA(A));if(N instanceof Object){let A={};return Object.keys(N).forEach(I=>{A[I]=xA(N[I])}),A}return N}function Z1(N,A){let I=xA(N);return!A||typeof A!="object"||Object.keys(A).forEach(O=>{let U=A[O],E=I[O];U instanceof Array?I[O]=xA(U):U instanceof Object&&E instanceof Object?I[O]=Z1(E,U):I[O]=xA(U)}),I}function iA(N,A={}){let{baseDelay:I=1e3,maxDelay:O=3e4,jitter:U=!0}=A,E=I*Math.pow(2,N);if(E=Math.min(E,O),U){let K=.8+.4*Math.random();E=Math.floor(E*K)}return E}function mA(N){return new Promise(A=>setTimeout(A,N))}function nA(){let N,A;return{promise:new Promise((O,U)=>{N=O,A=U}),resolve:N,reject:A}}function M1(N){if(N==null)return 0;if(typeof N=="string")return new Blob([N]).size;if(N instanceof Blob)return N.size;if(N instanceof ArrayBuffer||N instanceof DataView||ArrayBuffer.isView(N))return N.byteLength;if(typeof N=="object"){let A=u1(N);return A?new Blob([A]).size:0}return new Blob([String(N)]).size}function L1(N,A){return Date.now()>N+A}function k2(N,A){let I=N+A-Date.now();return Math.max(0,I)}function bA(N,A){return Object.values(A).includes(N)}function _A(N){return typeof N!="string"?!1:N==="/"?!0:/^\/[a-zA-Z0-9_-]+(\/[a-zA-Z0-9_-]+)*$/.test(N)}var SA=S("network"),g={OFFLINE:"offline",ONLINE:"online",DEGRADED:"degraded",CHECKING:"checking"},$={UNKNOWN:"unknown",ETHERNET:"ethernet",WIFI:"wifi",CELLULAR:"cellular",NONE:"none"},p1=class{constructor(){this.browser=p(),this.listeners=new Map,this.status={state:g.CHECKING,type:$.UNKNOWN,effectiveType:null,downlink:null,rtt:null,lastChanged:Date.now(),since:Date.now()},this._checkInterval=null,this._checking=!1,this._initialized=!1,this.browser.isBrowser&&this._initBrowserListeners()}_initBrowserListeners(){if(window.addEventListener("online",()=>this._handleBrowserOnline()),window.addEventListener("offline",()=>this._handleBrowserOffline()),this.browser.hasNetworkInfo){let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;A&&A.addEventListener("change",()=>this._handleConnectionChange())}this._startPeriodicChecks(),this._checkStatus().then(()=>{this._initialized=!0,SA.info("Network monitor initialized",this.status)}),SA.debug("Network listeners initialized")}_startPeriodicChecks(){this._checkInterval=setInterval(()=>{this._checkStatus()},3e4)}_handleBrowserOnline(){SA.info("Browser reported online"),this._checkStatus(!0)}_handleBrowserOffline(){SA.warn("Browser reported offline"),this._updateStatus({state:g.OFFLINE,type:$.NONE,lastChanged:Date.now()})}_handleConnectionChange(){SA.debug("Network connection changed"),this._checkStatus(!0)}async _checkStatus(A=!1){if(this._checking)return this.status;this._checking=!0,this._updateStatus({state:g.CHECKING});try{if(!this._getBasicOnlineStatus()){this._updateStatus({state:g.OFFLINE,type:$.NONE},A);return}let O=this._getNetworkInfo();if(!await this._verifyConnectivity()){this._updateStatus({state:g.DEGRADED,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt},A);return}let E=this._determineNetworkQuality(O);this._updateStatus({state:E,type:(O==null?void 0:O.type)||$.UNKNOWN,effectiveType:O==null?void 0:O.effectiveType,downlink:O==null?void 0:O.downlink,rtt:O==null?void 0:O.rtt,lastChanged:this.status.state!==E?Date.now():this.status.lastChanged},A)}catch(I){SA.error("Error checking network status:",I)}finally{this._checking=!1}}_getBasicOnlineStatus(){return typeof navigator>"u"||typeof navigator.onLine!="boolean"?!0:navigator.onLine}_getNetworkInfo(){if(!this.browser.hasNetworkInfo)return null;let A=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return A?{type:this._mapConnectionType(A.type),effectiveType:A.effectiveType,downlink:A.downlink,rtt:A.rtt,saveData:A.saveData}:null}_mapConnectionType(A){return A&&{wifi:$.WIFI,cellular:$.CELLULAR,ethernet:$.ETHERNET,none:$.NONE,unknown:$.UNKNOWN}[A]||$.UNKNOWN}async _verifyConnectivity(){if(!this._getBasicOnlineStatus())return!1;let A=["https://www.google.com/favicon.ico","https://www.cloudflare.com/favicon.ico","https://www.github.com/favicon.ico"];for(let I of A)try{let O=new AbortController,U=setTimeout(()=>O.abort(),3e3),E=await fetch(I,{method:"HEAD",mode:"no-cors",cache:"no-cache",signal:O.signal});return clearTimeout(U),!0}catch{continue}return!1}_determineNetworkQuality(A){return A&&(A.effectiveType&&(A.effectiveType==="slow-2g"||A.effectiveType==="2g")||A.rtt&&A.rtt>500||A.downlink&&A.downlink<.5)?g.DEGRADED:g.ONLINE}_updateStatus(A,I=!1){let O={...this.status};this.status={...this.status,...A},(I||O.state!==this.status.state||O.type!==this.status.type)&&(SA.info(`Network status changed: ${O.state} -> ${this.status.state}`,{type:this.status.type,effectiveType:this.status.effectiveType}),this._notifyListeners(O,this.status))}_notifyListeners(A,I){this.listeners.forEach((O,U)=>{try{O(I,A)}catch(E){SA.error(`Error in listener ${U}:`,E)}})}getStatus(){return{...this.status}}isOnline(){return this.status.state===g.ONLINE||this.status.state===g.DEGRADED}isFullyOnline(){return this.status.state===g.ONLINE}isOffline(){return this.status.state===g.OFFLINE}onChange(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}waitForOnline(A=3e4){let I=nA();if(this.isOnline())return I.resolve(),I.promise;let O=setTimeout(()=>{U(),I.reject(new Error(`Timeout waiting for network after ${A}ms`))},A),U=this.onChange(E=>{(E.state===g.ONLINE||E.state===g.DEGRADED)&&(clearTimeout(O),U(),I.resolve())});return I.promise}async checkNow(){return await this._checkStatus(!0),this.getStatus()}destroy(){this._checkInterval&&(clearInterval(this._checkInterval),this._checkInterval=null),this.listeners.clear(),SA.debug("Network monitor destroyed")}},m1=null;function UA(){return m1||(m1=new p1),m1}function G1(){return UA().isOnline()}function q2(N){return UA().onChange(N)}var r6=UA();var f=S("heartbeat"),EA={PING_SENT:"ping_sent",PONG_RECEIVED:"pong_received",MISSED:"missed",DEAD:"dead",LATENCY_UPDATED:"latency_updated"},w={STOPPED:"stopped",RUNNING:"running",WAITING:"waiting",FAILED:"failed"},g1=class{constructor(A={}){this.options={interval:3e4,timeout:1e4,maxMissed:2,adaptive:!0,...A},this.network=UA(),this.state=w.STOPPED,this.pingInterval=null,this.pingTimeout=null,this.missedCount=0,this.lastPingTime=0,this.lastPongTime=0,this.latency=null,this.latencyHistory=[],this.pingId=0,this.listeners=new Map,this.pendingPings=new Map,this._sendPing=this._sendPing.bind(this),this._handlePongTimeout=this._handlePongTimeout.bind(this),this._onNetworkChange=this._onNetworkChange.bind(this),f.debug("Heartbeat manager created",this.options)}start(){if(this.state!==w.STOPPED){f.warn("Heartbeat already running or failed");return}if(!this.network.isOnline()){f.info("Network offline, heartbeat will start when online"),this.network.onChange(this._onNetworkChange);return}this.state=w.RUNNING,this.missedCount=0,this._schedulePing(),f.info("Heartbeat started"),this._emit(EA.PING_SENT,{state:this.state})}stop(){this.state=w.STOPPED,this._clearTimers(),this.missedCount=0,this.pendingPings.clear(),f.info("Heartbeat stopped")}reset(){this.stop(),this.missedCount=0,this.latency=null,this.pendingPings.clear(),f.debug("Heartbeat reset")}pongReceived(A){let I=Date.now();this.lastPongTime=I;let O=null,U=null;if(A&&A.id)O=A.id,U=this.pendingPings.get(O)||null,this.pendingPings.delete(O);else{let E=Array.from(this.pendingPings.entries()).sort((K,B)=>B[1]-K[1])[0];E&&(O=E[0],U=E[1],this.pendingPings.delete(O))}if(U){let E=I-U;this._updateLatency(E)}this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null),this.missedCount=0,this.state=w.RUNNING,f.debug("Pong received",{pingId:O,latency:this.latency,missed:this.missedCount}),this._emit(EA.PONG_RECEIVED,{latency:this.latency,pingId:O}),this._schedulePing()}getStatus(){return{state:this.state,missed:this.missedCount,latency:this.latency,lastPing:this.lastPingTime,lastPong:this.lastPongTime,uptime:this.lastPingTime?Date.now()-this.lastPingTime:0}}getLatency(){return this.latency}isHealthy(){return this.state===w.RUNNING&&this.missedCount===0}isFailing(){return this.state===w.FAILED||this.missedCount>=this.options.maxMissed}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}_schedulePing(){this._clearTimers();let A=this.options.interval;this.options.adaptive&&this.network.getStatus().state==="degraded"&&(A=A*1.5),this.pingInterval=setTimeout(()=>{this._sendPing()},A)}_sendPing(){if(this.state===w.STOPPED)return;if(!this.network.isOnline()){f.debug("Network offline, skipping ping"),this._schedulePing();return}let A=Date.now();this.lastPingTime=A;let I=this.pingId++;this.pendingPings.set(I,A);try{let O={type:"ping",id:I,timestamp:A};this.options.sendPing(O),f.debug("Ping sent",{pingId:I}),this._emit(EA.PING_SENT,{pingId:I})}catch(O){f.error("Failed to send ping:",O),this._handlePongTimeout();return}this.state=w.WAITING,this.pingTimeout=setTimeout(()=>{this._handlePongTimeout(I)},this.options.timeout)}_handlePongTimeout(A){if(this.missedCount++,f.warn("Pong timeout",{pingId:A,missed:this.missedCount,max:this.options.maxMissed}),this._emit(EA.MISSED,{pingId:A,missed:this.missedCount,total:this.options.maxMissed}),this.pendingPings.delete(A),this.missedCount>=this.options.maxMissed){this._handleDeadConnection();return}this.state=w.RUNNING,this._schedulePing()}_handleDeadConnection(){this.state=w.FAILED,f.error("Heartbeat failed - connection appears dead",{missed:this.missedCount,lastPing:this.lastPingTime,lastPong:this.lastPongTime}),this._emit(EA.DEAD,{missed:this.missedCount,latency:this.latency}),this.stop()}_updateLatency(A){this.latencyHistory.push(A),this.latencyHistory.length>10&&this.latencyHistory.shift();let I=this.latencyHistory.reduce((O,U)=>O+U,0)/this.latencyHistory.length;this.latency=Math.round(I),this._emit(EA.LATENCY_UPDATED,{latency:this.latency,raw:A})}_onNetworkChange(A){A.state==="online"&&this.state===w.STOPPED&&(f.info("Network restored, starting heartbeat"),this.start()),A.state==="offline"&&this.state!==w.STOPPED&&(f.info("Network offline, stopping heartbeat"),this.stop())}_clearTimers(){this.pingInterval&&(clearTimeout(this.pingInterval),this.pingInterval=null),this.pingTimeout&&(clearTimeout(this.pingTimeout),this.pingTimeout=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){f.error("Error in heartbeat listener:",U)}})}};function T1(N){return new g1(N)}var l=S("connection"),J={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTING:"disconnecting",RECONNECTING:"reconnecting",FAILED:"failed"},KA={INTENTIONAL:"intentional",NETWORK_LOST:"network_lost",SERVER_CLOSED:"server_closed",TIMEOUT:"timeout",HEARTBEAT_FAILED:"heartbeat_failed",ERROR:"error"},_={CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnect_failed",FAILED:"failed",STATE_CHANGED:"state_changed",STATS_UPDATED:"stats_updated"},f1=class{constructor(A,I={}){if(!ZA(A))throw new Error(`Invalid WebSocket URL: ${A}`);this.url=A,this.options={timeout:1e4,autoConnect:!1,reconnect:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},createWebSocket:O=>new WebSocket(O),...I},this.network=UA(),this.browser=p(),this.state=J.DISCONNECTED,this.ws=null,this.heartbeat=null,this.connectionAttempts=0,this.reconnectAttempts=0,this.lastConnectedAt=null,this.lastDisconnectedAt=null,this.disconnectReason=null,this.stats={connectedAt:null,disconnectedAt:null,connectionDuration:0,messagesSent:0,messagesReceived:0,bytesSent:0,bytesReceived:0,reconnectCount:0},this._connectionPromise=null,this._connectionResolve=null,this._connectionReject=null,this._disconnectPromise=null,this._disconnectResolve=null,this._reconnectTimer=null,this.listeners=new Map,this._networkUnsubscribe=this.network.onChange(O=>this._onNetworkChange(O)),this._handleOpen=this._handleOpen.bind(this),this._handleMessage=this._handleMessage.bind(this),this._handleClose=this._handleClose.bind(this),this._handleError=this._handleError.bind(this),this._handleHeartbeatEvent=this._handleHeartbeatEvent.bind(this),l.info("Connection manager created",{url:A}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}connect(){return this.state===J.CONNECTED?Promise.resolve():this.state===J.CONNECTING&&this._connectionPromise?this._connectionPromise:this.network.isOnline()?(this._setState(J.CONNECTING),this.reconnectAttempts=0,this.disconnectReason=null,this._connectionPromise=new Promise((A,I)=>{this._connectionResolve=A,this._connectionReject=I}),this._performConnection(),this._connectionPromise):(l.warn("Cannot connect: network offline"),Promise.reject(new Error("Network offline")))}disconnect(A=1e3,I=""){if(this.state===J.DISCONNECTED)return Promise.resolve();if(this._clearReconnectTimer(),this.disconnectReason=KA.INTENTIONAL,this._setState(J.DISCONNECTING),this._disconnectPromise=new Promise(O=>{this._disconnectResolve=O}),this.heartbeat&&this.heartbeat.stop(),this.ws){this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null;try{this.ws.close(A,I)}catch(O){l.error("Error closing WebSocket:",O)}}else this._cleanup(),this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null);return this._disconnectPromise}async reconnect(){return l.info("Forcing reconnection"),this.state!==J.DISCONNECTED&&await this.disconnect(1e3,"Forced reconnection"),await mA(100),this.connect()}getStatus(){let A=Date.now();return{state:this.state,url:this.url,connectedAt:this.stats.connectedAt,disconnectedAt:this.stats.disconnectedAt,uptime:this.stats.connectedAt?A-this.stats.connectedAt:0,reconnectAttempts:this.reconnectAttempts,reconnectCount:this.stats.reconnectCount,disconnectReason:this.disconnectReason,messages:{sent:this.stats.messagesSent,received:this.stats.messagesReceived},bytes:{sent:this.stats.bytesSent,received:this.stats.bytesReceived},heartbeat:this.heartbeat?this.heartbeat.getStatus():null,network:this.network.getStatus()}}isConnected(){return this.state===J.CONNECTED}isHealthy(){return this.isConnected()&&(!this.heartbeat||this.heartbeat.isHealthy())}send(A){if(!this.isConnected()||!this.ws)throw new Error("Not connected");try{typeof A=="string"?this.stats.bytesSent+=new Blob([A]).size:A instanceof Blob?this.stats.bytesSent+=A.size:A instanceof ArrayBuffer&&(this.stats.bytesSent+=A.byteLength),this.ws.send(A),this.stats.messagesSent++}catch(I){throw l.error("Send failed:",I),I}}onEvent(A){let I=Date.now()+Math.random().toString(36);return this.listeners.set(I,A),()=>{this.listeners.delete(I)}}destroy(){l.info("Destroying connection manager"),this.state!==J.DISCONNECTED&&this.disconnect(1e3,"Manager destroyed"),this._networkUnsubscribe&&this._networkUnsubscribe(),this._clearReconnectTimer(),this.listeners.clear()}_performConnection(){if(!this.network.isOnline()){this._handleConnectionFailure(new Error("Network offline"),!0);return}l.info("Connecting...",{attempt:this.reconnectAttempts+1,url:this.url});try{this.ws=this.options.createWebSocket(this.url),this.ws.onopen=this._handleOpen,this.ws.onmessage=this._handleMessage,this.ws.onclose=this._handleClose,this.ws.onerror=this._handleError,this._connectionTimeout=setTimeout(()=>{if(this.state===J.CONNECTING){let A=new Error(`Connection timeout after ${this.options.timeout}ms`);this._handleConnectionFailure(A)}},this.options.timeout)}catch(A){this._handleConnectionFailure(A)}}_handleOpen(){l.info("WebSocket opened"),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null);let A=Date.now();this.lastConnectedAt=A,this.stats.connectedAt=A,this.stats.disconnectedAt=null,this.reconnectAttempts>0&&this.stats.reconnectCount++,this.reconnectAttempts=0,this.options.heartbeat.enabled&&this._setupHeartbeat(),this._setState(J.CONNECTED),this._connectionResolve&&(this._connectionResolve(),this._connectionResolve=null,this._connectionReject=null),this._emit(_.CONNECTED,{timestamp:A})}_handleMessage(A){if(this.stats.messagesReceived++,typeof A.data=="string"?this.stats.bytesReceived+=new Blob([A.data]).size:A.data instanceof Blob?this.stats.bytesReceived+=A.data.size:A.data instanceof ArrayBuffer&&(this.stats.bytesReceived+=A.data.byteLength),this.heartbeat)try{let I=JSON.parse(A.data);if(I.type==="pong"){this.heartbeat.pongReceived(I);return}}catch{}this._emit("message",A.data)}_handleClose(A){l.info("WebSocket closed",{code:A.code,reason:A.reason,wasClean:A.wasClean});let I=this.disconnectReason===KA.INTENTIONAL;if(this.lastDisconnectedAt=Date.now(),this.stats.disconnectedAt=Date.now(),this.stats.connectedAt&&(this.stats.connectionDuration+=this.lastDisconnectedAt-this.stats.connectedAt),this.heartbeat&&(this.heartbeat.stop(),this.heartbeat=null),this._cleanup(),I){this._setState(J.DISCONNECTED),this._disconnectResolve&&(this._disconnectResolve(),this._disconnectResolve=null),this._emit(_.DISCONNECTED,{reason:KA.INTENTIONAL,code:A.code});return}let O;this.network.isOnline()?A.code===1006?O=KA.TIMEOUT:O=KA.SERVER_CLOSED:O=KA.NETWORK_LOST,this.disconnectReason=O,this._handleReconnection(O,A)}_handleError(A){l.error("WebSocket error",A),this._emit("error",A)}_handleConnectionFailure(A,I=!1){l.error("Connection failed:",A.message),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),this._cleanup(),this._connectionReject&&(this._connectionReject(A),this._connectionResolve=null,this._connectionReject=null);let O=I?KA.NETWORK_LOST:KA.ERROR;this._handleReconnection(O,null,A)}_handleReconnection(A,I,O){if(this._setState(J.RECONNECTING),this.disconnectReason=A,this._emit(_.DISCONNECTED,{reason:A,code:I==null?void 0:I.code,error:O==null?void 0:O.message}),this.reconnectAttempts>=this.options.reconnect.maxAttempts){l.error("Max reconnection attempts reached",{attempts:this.reconnectAttempts}),this._setState(J.FAILED),this._emit(_.FAILED,{reason:"max_attempts",attempts:this.reconnectAttempts});return}let U=iA(this.reconnectAttempts,this.options.reconnect);l.info(`Reconnecting in ${U}ms`,{attempt:this.reconnectAttempts+1,max:this.options.reconnect.maxAttempts}),this._emit(_.RECONNECTING,{attempt:this.reconnectAttempts+1,maxAttempts:this.options.reconnect.maxAttempts,delay:U}),this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this.reconnectAttempts++,this._performConnection()},U)}_onNetworkChange(A){l.debug("Network changed:",A.state),A.state==="online"&&(this.state===J.RECONNECTING||this.state===J.DISCONNECTED)&&(l.info("Network restored, retrying connection"),this._clearReconnectTimer(),this._performConnection()),A.state==="offline"&&this.isConnected()&&l.warn("Network lost, connection will likely fail")}_handleHeartbeatEvent(A,I){A===EA.DEAD&&(l.error("Heartbeat dead, reconnecting"),this.disconnectReason=KA.HEARTBEAT_FAILED,this.ws&&this.ws.close()),A===EA.LATENCY_UPDATED&&this._emit("latency",{latency:I.latency})}_setupHeartbeat(){this.ws&&(this.heartbeat=T1({interval:this.options.heartbeat.interval,timeout:this.options.heartbeat.timeout,sendPing:A=>{try{this.ws.send(JSON.stringify(A)),this.stats.messagesSent++}catch(I){l.error("Failed to send ping:",I)}}}),this.heartbeat.onEvent(this._handleHeartbeatEvent),this.heartbeat.start())}_setState(A){let I=this.state;I!==A&&(this.state=A,l.debug(`State: ${I} -> ${A}`),this._emit(_.STATE_CHANGED,{from:I,to:A}))}_cleanup(){this.ws&&(this.ws.onopen=null,this.ws.onmessage=null,this.ws.onclose=null,this.ws.onerror=null,this.ws=null),this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null)}_clearReconnectTimer(){this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null)}_emit(A,I){this.listeners.forEach(O=>{try{O(A,I)}catch(U){l.error("Error in event listener:",U)}})}};function W1(N,A={}){return new f1(N,A)}var o=S("transport"),Z={WEBSOCKET:"websocket",EVENTSOURCE:"eventsource",POLLING:"polling",NONE:"none"},D={IDLE:"idle",CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTED:"disconnected",FAILED:"failed"},e={CONNECT:"connect",MESSAGE:"message",DISCONNECT:"disconnect",ERROR:"error",TRANSPORT_CHANGED:"transport_changed"},kA=class{constructor(A,I={}){this.url=A,this.options=I,this.state=D.IDLE,this.listeners=new Map}connect(){throw new Error("Not implemented")}disconnect(){throw new Error("Not implemented")}send(A){throw new Error("Not implemented")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){o.error("Error in event listener:",E)}})}getState(){return this.state}getType(){return Z.NONE}},w1=class extends kA{constructor(A,I={}){super(A,I),this.ws=null,this.pendingMessages=[],this.type=Z.WEBSOCKET}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,o.info("WebSocket connecting to:",this.url);try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{for(o.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=>{o.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=>{o.error("WebSocket error:",A),this._emit(e.ERROR,A)}}catch(A){o.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 o.error("WebSocket send failed:",I),!1}else return this.pendingMessages.push(A),!1}},v1=class extends kA{constructor(A,I={}){super(A,I),this.es=null,this.sendQueue=[],this.type=Z.EVENTSOURCE,this.connectUrl=A,this.sendUrl=A.replace(/^ws/,"http").replace(/^wss/,"https")}getType(){return this.type}connect(){if(this.state===D.IDLE){this.state=D.CONNECTING,o.info("EventSource connecting to:",this.connectUrl);try{this.es=new EventSource(this.connectUrl),this.es.onopen=()=>{o.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=>{o.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){o.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=>{o.error("EventSource send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return o.error("EventSource send failed:",I),!1}}},V1=class extends kA{constructor(A,I={}){super(A,I),this.pollingInterval=I.pollingInterval||3e3,this.pollingActive=!1,this.sendQueue=[],this.messageQueue=[],this.pollTimeout=null,this.type=Z.POLLING,this.baseUrl=A.replace(/^ws/,"http").replace(/^wss/,"https"),this.pollUrl=`${this.baseUrl}/poll`,this.sendUrl=`${this.baseUrl}/send`}getType(){return this.type}connect(){this.state===D.IDLE&&(this.state=D.CONNECTING,o.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=>{o.error("Polling send failed:",I),this._emit(e.ERROR,I)}),!0}catch(I){return o.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")o.debug("Poll timeout, restarting");else if(o.error("Poll failed:",A),this._emit(e.ERROR,A),!navigator.onLine){this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"network_lost"});return}}this.pollingActive&&(this.pollTimeout=setTimeout(()=>this._poll(),this.pollingInterval))}}},y1=class{constructor(A,I={}){this.url=A,this.options={transports:[Z.WEBSOCKET,Z.EVENTSOURCE,Z.POLLING],timeout:1e4,pollingInterval:3e3,...I},this.browser=p(),this.network=UA(),this.currentTransport=null,this.transportType=Z.NONE,this.state=D.IDLE,this.listeners=new Map,this.availableTransports=this._getAvailableTransports(),o.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){o.info(`Trying transport: ${I}`);try{await this._tryTransport(I),o.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){o.warn(`Transport ${I} failed:`,O.message)}}this.state=D.FAILED;let A=new Error("No transport available");throw this._emit(e.ERROR,A),A}disconnect(){this.currentTransport&&(this.currentTransport.disconnect(),this.currentTransport=null),this.transportType=Z.NONE,this.state=D.DISCONNECTED,this._emit(e.DISCONNECT,{reason:"intentional"})}send(A){return!this.currentTransport||this.state!==D.CONNECTED?!1:this.currentTransport.send(A)}getTransportType(){return this.transportType}getState(){return this.state}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_tryTransport(A){return new Promise((I,O)=>{let U;switch(A){case Z.WEBSOCKET:U=new w1(this.url,this.options);break;case Z.EVENTSOURCE:U=new v1(this.url,this.options);break;case Z.POLLING:U=new V1(this.url,this.options);break;default:O(new Error(`Unknown transport: ${A}`));return}let E,K,B=()=>{E&&E(),K&&K(),clearTimeout(R)},R=setTimeout(()=>{U.disconnect(),B(),O(new Error(`Transport ${A} timeout`))},this.options.timeout);E=U.on(e.CONNECT,()=>{this.currentTransport=U,this._forwardTransportEvents(U),B(),I()}),K=U.on(e.ERROR,M=>{B(),O(M||new Error(`Transport ${A} failed`))}),U.connect()})}_forwardTransportEvents(A){[e.MESSAGE,e.DISCONNECT,e.ERROR].forEach(O=>{A.on(O,U=>{this._emit(O,U),O===e.DISCONNECT&&(this.state=D.DISCONNECTED)})})}_getAvailableTransports(){return this.options.transports.filter(A=>{switch(A){case Z.WEBSOCKET:return this.browser.hasWebSocket;case Z.EVENTSOURCE:return typeof EventSource<"u";case Z.POLLING:return!0;default:return!1}})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){o.error("Error in event listener:",E)}})}};function Y1(N,A={}){return new y1(N,A)}var qA=S("client"),V4={autoConnect:!1,timeout:1e4,reconnect:!0,reconnectOptions:{maxAttempts:10,baseDelay:1e3,maxDelay:3e4,jitter:!0},heartbeat:{enabled:!0,interval:3e4,timeout:1e4},transport:{transports:["websocket","eventsource","polling"],pollingInterval:3e3},debug:!1},F1=class{constructor(A,I={}){if(!ZA(A))throw new TypeError(`Invalid WebSocket URL: ${A}`);this.url=A,this.options=Z1(V4,I),this.options.debug&&qA.debug("Debug mode enabled"),this.browser=p(),this.transport=Y1(A,{transports:this.options.transport.transports,timeout:this.options.timeout,pollingInterval:this.options.transport.pollingInterval}),this.connection=W1(A,{timeout:this.options.timeout,reconnect:{maxAttempts:this.options.reconnectOptions.maxAttempts,baseDelay:this.options.reconnectOptions.baseDelay,maxDelay:this.options.reconnectOptions.maxDelay,jitter:this.options.reconnectOptions.jitter},heartbeat:this.options.heartbeat,createWebSocket:null,transport:this.transport}),this.messageHandlers=new Map,this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.messageCounter=0,this.pendingAcks=new Map,this._handleConnectionEvent=this._handleConnectionEvent.bind(this),this._handleTransportMessage=this._handleTransportMessage.bind(this),this._setupEventForwarding(),qA.info("WebSocket client created",{url:A,options:this.options,browser:this.browser.browserInfo.name}),this.options.autoConnect&&setTimeout(()=>this.connect(),0)}_setupEventForwarding(){this.connection.onEvent((A,I)=>{this._handleConnectionEvent(A,I)}),this.transport.on(e.MESSAGE,A=>{this._handleTransportMessage(A)}),this.transport.on(e.ERROR,A=>{this._triggerEvent("error",A)})}_handleConnectionEvent(A,I){switch(A){case _.CONNECTED:this._triggerEvent("open",I);break;case _.DISCONNECTED:this._triggerEvent("close",I);break;case _.RECONNECTING:this._triggerEvent("reconnectAttempt",{attempt:I.attempt,maxAttempts:I.maxAttempts,delay:I.delay});break;case _.FAILED:this._triggerEvent("error",new Error(`Connection failed: ${I.reason}`));break;case"latency":this._triggerEvent("latency",I);break}}_handleTransportMessage(A){let I=A;if(typeof A=="string")try{I=JSON.parse(A)}catch{}if(I&&I.type==="ack"&&I.id){this._handleAck(I.id,I);return}I&&I.type&&this.messageHandlers.has(I.type)&&this.messageHandlers.get(I.type).forEach(U=>{try{U(I.data||I)}catch(E){qA.error("Error in message handler:",E)}}),this._triggerEvent("message",I)}_handleAck(A,I){if(this.pendingAcks.has(A)){let{resolve:O,reject:U}=this.pendingAcks.get(A);I.success?O(I.result||I):U(new Error(I.error||"Unknown error")),this.pendingAcks.delete(A)}}connect(){return this.connection.connect()}disconnect(A=1e3,I=""){return this.connection.disconnect(A,I)}send(A){if(!this.isConnected())throw new Error("Not connected");let I=A;A&&typeof A=="object"&&!(A instanceof ArrayBuffer)&&!(A instanceof Blob)&&(I=JSON.stringify(A)),this.connection.send(I)}sendWithAck(A,I,O=1e4){if(!this.isConnected())return Promise.reject(new Error("Not connected"));let U=`${Date.now()}-${this.messageCounter++}`,E=nA(),K={type:A,data:I,id:U,ack:!0},B=setTimeout(()=>{this.pendingAcks.has(U)&&(this.pendingAcks.delete(U),E.reject(new Error("Acknowledgement timeout")))},O);return this.pendingAcks.set(U,{resolve:R=>{clearTimeout(B),E.resolve(R)},reject:R=>{clearTimeout(B),E.reject(R)}}),this.connection.send(JSON.stringify(K)),E.promise}onMessage(A,I){return this.messageHandlers.has(A)||this.messageHandlers.set(A,[]),this.messageHandlers.get(A).push(I),this}offMessage(A,I){if(!this.messageHandlers.has(A))return this;if(I){let O=this.messageHandlers.get(A),U=O.indexOf(I);U!==-1&&O.splice(U,1)}else this.messageHandlers.delete(A);return this}on(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(typeof I!="function")throw new TypeError("Handler must be a function");return this.eventHandlers[A]||(this.eventHandlers[A]=[]),this.eventHandlers[A].push(I),this}off(A,I){if(!["open","message","close","error","reconnect","reconnectAttempt","latency"].includes(A))throw new TypeError(`Unknown event: ${A}`);if(!this.eventHandlers[A])return this;if(I){let U=this.eventHandlers[A].indexOf(I);U!==-1&&this.eventHandlers[A].splice(U,1)}else this.eventHandlers[A]=[];return this}_triggerEvent(A,I){(this.eventHandlers[A]||[]).forEach(U=>{try{U(I)}catch(E){qA.error(`Error in ${A} handler:`,E)}})}isConnected(){return this.connection.isConnected()}isHealthy(){return this.connection.isHealthy()}getStatus(){var O,U,E;let A=this.connection.getStatus(),I=G1();return{connected:this.isConnected(),state:A.state,url:this.url,transport:this.transport.getTransportType(),latency:(O=A.heartbeat)==null?void 0:O.latency,uptime:A.uptime,messagesSent:(U=A.messages)==null?void 0:U.sent,messagesReceived:(E=A.messages)==null?void 0:E.received,reconnectAttempts:A.reconnectAttempts,networkOnline:I,browser:this.browser.browserInfo.name}}reconnect(){return this.connection.reconnect()}getTransportType(){return this.transport.getTransportType()}destroy(){qA.info("Destroying client"),this.disconnect(1e3,"Client destroyed"),this.messageHandlers.clear(),this.eventHandlers={open:[],message:[],close:[],error:[],reconnect:[],reconnectAttempt:[]},this.pendingAcks.clear()}},z2=F1;var HA=S("packet"),j={MESSAGE:"message",EVENT:"event",COMMAND:"command",RESPONSE:"response",ERROR:"error",PING:"ping",PONG:"pong",JOIN:"join",LEAVE:"leave",PRESENCE:"presence",ACK:"ack",AUTH:"auth",SYSTEM:"system"},tA={CRITICAL:"critical",HIGH:"high",NORMAL:"normal",LOW:"low"},zA={AT_MOST_ONCE:"at_most_once",AT_LEAST_ONCE:"at_least_once",EXACTLY_ONCE:"exactly_once"},y4="1.0",$2=256*1024,F4=6e4;function j2(N){return N&&typeof N.id=="string"&&bA(N.type,j)&&N.timestamp&&typeof N.timestamp=="number"}var cA=class N{constructor(A,I,O={}){if(!bA(A,j)){if(typeof A!="string")throw new Error(`Invalid message type: ${A}. Must be a string.`);HA.warn(`Unknown message type: ${A}. Using custom type.`)}if(O.namespace&&!_A(O.namespace))throw new Error(`Invalid namespace: ${O.namespace}. Must start with / and contain only letters, numbers, underscores, and hyphens.`);if(O.priority&&!bA(O.priority,tA))throw new Error(`Invalid priority: ${O.priority}. Must be one of: ${Object.values(tA).join(", ")}`);if(O.deliveryGuarantee&&!bA(O.deliveryGuarantee,zA))throw new Error(`Invalid delivery guarantee: ${O.deliveryGuarantee}. Must be one of: ${Object.values(zA).join(", ")}`);this.id=O.id||V("pkt"),this.type=A,this.payload=I,this.timestamp=Date.now(),this.version=y4,this.priority=O.priority||tA.NORMAL,this.requiresAck=O.requiresAck||!1,this.ttl=O.ttl||F4,this.namespace=O.namespace||"/",this.deliveryGuarantee=O.deliveryGuarantee||zA.AT_MOST_ONCE,this.metadata=O.metadata||{},this.from=O.from||null,this.inResponseTo=O.inResponseTo||null,this._checkSize(),HA.debug("Packet created",{id:this.id,type:this.type,namespace:this.namespace,size:this.getSize()})}_checkSize(){let A=this.getSize();A>$2&&HA.warn("Packet exceeds recommended size",{size:A,max:$2,id:this.id,type:this.type})}getSize(){return M1(this)}isExpired(){return L1(this.timestamp,this.ttl)}getRemainingTTL(){return k2(this.timestamp,this.ttl)}createResponse(A,I={}){return new N(j.RESPONSE,A,{...I,inResponseTo:this.id,namespace:this.namespace,priority:I.priority||this.priority})}createError(A,I={},O=500){return new N(j.ERROR,{code:O,message:A,details:I,originalType:this.type,originalId:this.id},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}createAck(A=null){return new N(j.ACK,{originalId:this.id,result:A,timestamp:Date.now()},{inResponseTo:this.id,namespace:this.namespace,priority:tA.HIGH})}serialize(){let A={id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo},I=u1(A);return I||(HA.error("Failed to serialize packet",{id:this.id}),null)}toObject(){return{id:this.id,type:this.type,payload:this.payload,timestamp:this.timestamp,version:this.version,priority:this.priority,requiresAck:this.requiresAck,ttl:this.ttl,namespace:this.namespace,deliveryGuarantee:this.deliveryGuarantee,metadata:this.metadata,from:this.from,inResponseTo:this.inResponseTo,size:this.getSize(),expired:this.isExpired()}}static deserialize(A){let I=typeof A=="string"?d1(A):A;if(!I)return HA.error("Failed to parse packet data"),null;if(!j2(I))return HA.error("Invalid packet structure",I),null;try{return new N(I.type,I.payload,{id:I.id,priority:I.priority,requiresAck:I.requiresAck,ttl:I.ttl,namespace:I.namespace,deliveryGuarantee:I.deliveryGuarantee,metadata:I.metadata,from:I.from,inResponseTo:I.inResponseTo})}catch(O){return HA.error("Failed to create packet from data:",O),null}}static isValid(A){let I=typeof A=="string"?d1(A):A;return j2(I)}static fromRaw(A){return typeof A=="string"?N.deserialize(A):A instanceof Blob||A instanceof ArrayBuffer?new N(j.MESSAGE,A,{metadata:{binary:!0}}):(HA.warn("Unsupported raw data type:",typeof A),null)}};function Q2(N,A,I={}){return new cA(N,A,I)}function X2(N,A,I={}){return new cA(j.EVENT,{event:N,data:A},{priority:tA.LOW,...I})}function AI(N,A,I={}){return new cA(j.COMMAND,{command:N,params:A},{requiresAck:!0,priority:tA.HIGH,...I})}var k=S("router"),pA={EXACT:"exact",WILDCARD:"wildcard",REGEX:"regex",FUNCTION:"function"},II={CRITICAL:100,HIGH:200,NORMAL:300,LOW:400,FALLBACK:500},Q={PRE:"pre",POST:"post",AROUND:"around"},x1=class{constructor(A,I,O={}){this.pattern=A,this.handler=I,this.matchType=O.matchType||pA.EXACT,this.priority=O.priority||II.NORMAL,this.namespace=O.namespace||null,this.description=O.description||A.toString(),this.id=`${Date.now()}-${Math.random().toString(36).substring(2,8)}`,this.created=Date.now(),this.callCount=0,this.lastCalled=null}matches(A){if(this.namespace&&A.namespace!==this.namespace)return!1;let I=A.type;switch(this.matchType){case pA.EXACT:return I===this.pattern;case pA.WILDCARD:return this._matchWildcard(I,this.pattern);case pA.REGEX:return this.pattern.test(I);case pA.FUNCTION:return this.pattern(A);default:return!1}}execute(A,I){this.callCount++,this.lastCalled=Date.now();try{return this.handler(A,I)}catch(O){throw k.error(`Handler ${this.description} failed:`,O),O}}_matchWildcard(A,I){if(I==="*")return!0;let O=I.replace(/\./g,"\\.").replace(/\*/g,".*");return new RegExp(`^${O}$`).test(A)}getStats(){return{id:this.id,description:this.description,matchType:this.matchType,priority:this.priority,namespace:this.namespace,callCount:this.callCount,lastCalled:this.lastCalled,created:this.created}}},b1=class N{constructor(A={}){this.options={catchErrors:!0,asyncHandlers:!1,maxHandlersPerRoute:10,logHandling:!0,...A},this.routes=new Map,this.namespaces=new Map,this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this.stats={routesProcessed:0,handlersExecuted:0,errorsCaught:0,lastRoute:null},this._setupDefaultHandlers(),k.info("Router created")}_setupDefaultHandlers(){this.on("*",A=>{k.debug("Unhandled message type:",A.type)},{matchType:pA.WILDCARD,priority:II.FALLBACK,description:"Catch-all handler"}),this.on(j.ERROR,A=>{k.error("Received error packet:",A.payload)},{description:"Error handler"})}on(A,I,O={}){if(typeof I!="function")throw new TypeError("Handler must be a function");let U=new x1(A,I,O),E=this._getRouteKey(A,O.namespace);this.routes.has(E)||this.routes.set(E,[]);let K=this.routes.get(E);return K.length>=this.options.maxHandlersPerRoute&&k.warn(`Max handlers (${this.options.maxHandlersPerRoute}) reached for route:`,E),K.push(U),K.sort((B,R)=>B.priority-R.priority),k.debug("Handler registered",{pattern:A,namespace:O.namespace,priority:O.priority}),()=>{this.off(A,I,O.namespace)}}off(A,I,O){let U=this._getRouteKey(A,O),E=this.routes.get(U);if(!E)return;let K=E.findIndex(B=>B.handler===I);K!==-1&&(E.splice(K,1),k.debug("Handler removed",{pattern:A,namespace:O})),E.length===0&&this.routes.delete(U)}once(A,I,O={}){let U=(E,K)=>{I(E,K),this.off(A,U,O.namespace)};this.on(A,U,O)}route(A,I={}){this.stats.routesProcessed++,this.stats.lastRoute=Date.now(),this._runMiddleware(Q.PRE,A,I);let O=this._findHandlers(A);if(O.length===0){k.debug("No handlers for packet type:",A.type);return}k.debug("Routing packet",{type:A.type,namespace:A.namespace,handlers:O.length});let U=[];for(let E of O)try{let K=this._runAroundMiddleware(A,I,E);if(K!==void 0)U.push(K);else{let B=E.execute(A,I);U.push(B)}this.stats.handlersExecuted++}catch(K){if(this.stats.errorsCaught++,this.options.catchErrors)k.error("Handler error:",K);else throw K}return this._runMiddleware(Q.POST,A,I,U),this.options.asyncHandlers?Promise.all(U):U}namespace(A){if(!this.namespaces.has(A)){let I=new N(this.options);I.on=(O,U,E={})=>this.on(O,U,{...E,namespace:A}),I.off=(O,U,E={})=>this.off(O,U,A),this.namespaces.set(A,I)}return this.namespaces.get(A)}use(A,I){if(!this.middleware[A])throw new Error(`Invalid middleware type: ${A}`);this.middleware[A].push(I),k.debug("Middleware added",{type:A})}removeMiddleware(A,I){let O=this.middleware[A].indexOf(I);O!==-1&&this.middleware[A].splice(O,1)}_findHandlers(A){let I=[];for(let[O,U]of this.routes)if(this._routeCouldMatch(O,A)){let E=U.filter(K=>K.matches(A));I.push(...E)}return I.sort((O,U)=>O.priority-U.priority),I}_routeCouldMatch(A,I){let[O,U,E]=A.split("|");return!(U&&U!==I.namespace)}_getRouteKey(A,I){return`${A instanceof RegExp?"regex":typeof A}|${I||""}|${A}`}_runMiddleware(A,I,O,U=null){for(let E of this.middleware[A])try{E(I,O,U)}catch(K){k.error(`Middleware (${A}) error:`,K)}}_runAroundMiddleware(A,I,O){let U;for(let E of this.middleware[Q.AROUND])if(U=E(A,I,(B,R)=>O.execute(B,R)),U!==void 0)break;return U}getRoutes(){let A=[];for(let[I,O]of this.routes)A.push({key:I,handlers:O.map(U=>U.getStats())});return A}getStats(){return{...this.stats,totalRoutes:this.routes.size,totalHandlers:Array.from(this.routes.values()).reduce((A,I)=>A+I.length,0),middlewareCount:{pre:this.middleware[Q.PRE].length,post:this.middleware[Q.POST].length,around:this.middleware[Q.AROUND].length},namespaces:this.namespaces.size}}reset(){this.routes.clear(),this.namespaces.clear(),this.middleware={[Q.PRE]:[],[Q.POST]:[],[Q.AROUND]:[]},this._setupDefaultHandlers(),k.info("Router reset")}};function OI(N={}){return new b1(N)}var BA=S("namespace"),oA={CREATED:"created",DESTROYED:"destroyed",USER_JOINED:"user_joined",USER_LEFT:"user_left",ERROR:"error"},x4={autoCreateRooms:!0,maxRooms:100,broadcastPresence:!0,persistState:!1,authRequired:!1},gA=class N{constructor(A,I,O={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);this.path=A,this.socket=I,this.options={...x4,...O},this.id=V("ns"),this.router=OI({catchErrors:!0}),this.rooms=new Map,this.users=new Map,this.children=new Map,this.handlers={[oA.CREATED]:[],[oA.DESTROYED]:[],[oA.USER_JOINED]:[],[oA.USER_LEFT]:[],[oA.ERROR]:[]},this.state={created:Date.now(),messageCount:0,userCount:0,roomCount:0},this._handleMessage=this._handleMessage.bind(this),BA.info("Namespace created",{path:this.path,id:this.id})}on(A,I){if(typeof I!="function")throw new TypeError("Handler must be a function");return this.router.on(A,(O,U)=>{I(O.payload,U)}),this}onMessage(A,I){return this.on(A,I)}emit(A,I,O={}){let U={type:A,data:I,namespace:this.path,timestamp:Date.now()};if(this.state.messageCount++,O.ack)return this.socket.sendWithAck(A,U,O.timeout);this.socket.send(U)}broadcast(A,I,O=[]){this.emit("broadcast",{event:A,data:I,except:O,namespace:this.path})}async joinRoom(A,I){if(!this.rooms.has(A)){if(this.rooms.size>=this.options.maxRooms)return BA.warn("Max rooms reached",{namespace:this.path}),!1;this.rooms.set(A,new Set)}return this.rooms.get(A).add(I),this.state.roomCount=this.rooms.size,BA.debug("User joined room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_joined",{room:A,userId:I},[I]),!0}leaveRoom(A,I){let O=this.rooms.get(A);O&&(O.delete(I),O.size===0&&this.rooms.delete(A),BA.debug("User left room",{namespace:this.path,room:A,userId:I}),this.broadcast("user_left",{room:A,userId:I},[I]))}getRoomUsers(A){let I=this.rooms.get(A);return I?Array.from(I):[]}getRooms(){return Array.from(this.rooms.keys())}addUser(A,I={}){this.users.set(A,{...I,joined:Date.now(),rooms:[]}),this.state.userCount=this.users.size,BA.debug("User added to namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"online",data:I})}removeUser(A){for(let[I,O]of this.rooms)O.has(A)&&this.leaveRoom(I,A);this.users.delete(A),this.state.userCount=this.users.size,BA.debug("User removed from namespace",{namespace:this.path,userId:A}),this.options.broadcastPresence&&this.broadcast("presence",{userId:A,status:"offline"})}namespace(A,I={}){let O=this.path==="/"?A:`${this.path}${A}`;if(!this.children.has(O)){let U=new N(O,this.socket,{...this.options,...I});this.children.set(O,U)}return this.children.get(O)}_handleMessage(A){return A.namespace!==this.path?!1:(this.router.route(A,{namespace:this,socket:this.socket}),!0)}hasUser(A){return this.users.has(A)}getStats(){return{...this.state,path:this.path,id:this.id,userCount:this.users.size,roomCount:this.rooms.size,childCount:this.children.size}}destroy(){this.rooms.clear(),this.users.clear();for(let A of this.children.values())A.destroy();this.children.clear(),BA.info("Namespace destroyed",{path:this.path}),this._emit(oA.DESTROYED,{path:this.path,id:this.id})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){BA.error(`Error in ${A} handler:`,E)}})}_on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),this}},$A=class{constructor(A,I={}){this.socket=A,this.options=I,this.root=new gA("/",A,I),this.namespaces=new Map,this.namespaces.set("/",this.root),this._setupMessageHandler(),BA.info("NamespaceManager created")}_setupMessageHandler(){this.socket.on("message",A=>{let I=this.namespaces.get(A.namespace||"/");I&&I._handleMessage(A)})}of(A,I={}){if(!_A(A))throw new Error(`Invalid namespace path: ${A}`);if(this.namespaces.has(A))return this.namespaces.get(A);let O=new gA(A,this.socket,{...this.options,...I});return this.namespaces.set(A,O),BA.info("Namespace created via manager",{path:A}),O}list(){return Array.from(this.namespaces.keys())}remove(A){if(A==="/")throw new Error("Cannot remove root namespace");let I=this.namespaces.get(A);I&&(I.destroy(),this.namespaces.delete(A))}broadcastAll(A,I){for(let O of this.namespaces.values())O.broadcast(A,I)}getStats(){let A={};for(let[I,O]of this.namespaces)A[I]=O.getStats();return A}destroy(){for(let A of this.namespaces.values())A.destroy();this.namespaces.clear(),BA.info("NamespaceManager destroyed")}};function NI(N,A={}){return new $A(N,A)}var y=S("rooms"),q={USER_JOINED:"user_joined",USER_LEFT:"user_left",ROOM_CREATED:"room_created",ROOM_DESTROYED:"room_destroyed",ROOM_MESSAGE:"room_message",ROOM_UPDATED:"room_updated",ERROR:"error"},k1={PUBLIC:"public",PRIVATE:"private",HIDDEN:"hidden"},jA={TEMPORARY:"temporary",PERSISTENT:"persistent",ANONYMOUS:"anonymous"},b4={maxUsers:100,visibility:k1.PUBLIC,type:jA.TEMPORARY,broadcastPresence:!0,persistMessages:!1,maxHistory:100,inviteOnly:!1},_1=class{constructor(A,I={}){this.userId=A,this.joinedAt=Date.now(),this.lastActivity=Date.now(),this.role=I.role||"member",this.metadata=I.metadata||{},this.presence="online"}updateActivity(){this.lastActivity=Date.now()}setPresence(A){this.presence=A,this.updateActivity()}toJSON(){return{userId:this.userId,joinedAt:this.joinedAt,lastActivity:this.lastActivity,role:this.role,metadata:this.metadata,presence:this.presence}}},fA=class{constructor(A,I={}){this.name=A,this.id=V("room"),this.options={...b4,...I},this.members=new Map,this.messageHistory=[],this.metadata={...this.options.metadata,createdAt:Date.now(),createdBy:null},this.state={active:!0,memberCount:0,messageCount:0,lastActivity:Date.now()},this.handlers={[q.USER_JOINED]:[],[q.USER_LEFT]:[],[q.ROOM_MESSAGE]:[],[q.ROOM_UPDATED]:[],[q.ERROR]:[]},y.info("Room created",{name:this.name,id:this.id,visibility:this.options.visibility})}addMember(A,I={}){if(this.members.has(A))return y.debug("User already in room",{userId:A,room:this.name}),!1;if(this.members.size>=this.options.maxUsers)return y.warn("Room full",{room:this.name,max:this.options.maxUsers}),this._emit(q.ERROR,{code:"room_full",message:"Room has reached maximum capacity"}),!1;if(this.options.inviteOnly&&!I.invited)return y.warn("Attempt to join invite-only room",{userId:A,room:this.name}),!1;let O=new _1(A,I);return this.members.set(A,O),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User joined room",{userId:A,room:this.name,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_JOINED,{userId:A,room:this.name,timestamp:Date.now(),memberData:O.toJSON()}),!0}removeMember(A,I="left"){if(!this.members.has(A))return!1;let O=this.members.get(A);return this.members.delete(A),this.state.memberCount=this.members.size,this.state.lastActivity=Date.now(),y.debug("User left room",{userId:A,room:this.name,reason:I,memberCount:this.members.size}),this.options.broadcastPresence&&this._emit(q.USER_LEFT,{userId:A,room:this.name,reason:I,timestamp:Date.now(),memberData:O.toJSON()}),this.options.type===jA.TEMPORARY&&this.members.size===0&&this.destroy("Room empty"),!0}hasMember(A){return this.members.has(A)}getMember(A){let I=this.members.get(A);return I?I.toJSON():null}getMembers(){return Array.from(this.members.values()).map(A=>A.toJSON())}getMemberCount(){return this.members.size}message(A,I,O={}){if(!this.members.has(A)&&this.options.type!==jA.ANONYMOUS)throw new Error(`User ${A} is not in room ${this.name}`);let U={id:V("msg"),room:this.name,userId:A,message:I,timestamp:Date.now(),type:O.type||"message",metadata:O.metadata||{}};return this.members.has(A)&&this.members.get(A).updateActivity(),this.state.messageCount++,this.state.lastActivity=Date.now(),this.options.persistMessages&&(this.messageHistory.push(U),this.messageHistory.length>this.options.maxHistory&&(this.messageHistory=this.messageHistory.slice(-this.options.maxHistory))),y.debug("Room message",{room:this.name,userId:A,msgId:U.id}),this._emit(q.ROOM_MESSAGE,U),U.id}broadcast(A,I,O=[]){let U={room:this.name,event:A,data:I,timestamp:Date.now()};this._emit(A,U,O)}update(A,I=null){this.metadata={...this.metadata,...A,updatedAt:Date.now(),updatedBy:I},this._emit(q.ROOM_UPDATED,{room:this.name,updates:A,userId:I,timestamp:Date.now()})}getInfo(){return{id:this.id,name:this.name,options:{...this.options},metadata:{...this.metadata},state:{...this.state},memberCount:this.members.size,messageCount:this.state.messageCount}}getHistory(A=this.options.maxHistory){return this.messageHistory.slice(-A)}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}destroy(A="Room destroyed"){this.state.active=!1,y.info("Room destroyed",{name:this.name,id:this.id,reason:A,memberCount:this.members.size}),this._emit(q.ROOM_DESTROYED,{room:this.name,reason:A,timestamp:Date.now()}),this.members.clear(),this.messageHistory=[],this.handlers={}}_emit(A,I,O=[]){(this.handlers[A]||[]).forEach(E=>{try{E(I,O)}catch(K){y.error(`Error in ${A} handler:`,K)}})}},QA=class{constructor(A={}){this.options=A,this.rooms=new Map,this.roomIds=new Map,this.userRooms=new Map,y.info("RoomManager created")}createRoom(A,I={}){if(this.rooms.has(A))throw new Error(`Room "${A}" already exists`);let O=new fA(A,{...this.options,...I});return this.rooms.set(A,O),this.roomIds.set(O.id,A),y.info("Room created via manager",{name:A,id:O.id}),O}getOrCreateRoom(A,I={}){return this.rooms.has(A)?this.rooms.get(A):this.createRoom(A,I)}getRoom(A){return this.rooms.get(A)}getRoomById(A){let I=this.roomIds.get(A);return I?this.rooms.get(I):void 0}removeRoom(A,I="Room removed"){let O=this.rooms.get(A);O&&(O.getMembers().forEach(U=>{let E=this.userRooms.get(U.userId);E&&(E.delete(A),E.size===0&&this.userRooms.delete(U.userId))}),O.destroy(I),this.rooms.delete(A),this.roomIds.delete(O.id),y.info("Room removed",{name:A}))}addUserToRoom(A,I,O={}){let U=this.rooms.get(I);if(!U)return y.warn("Room not found",{roomName:I}),!1;let E=U.addMember(A,O);return E&&(this.userRooms.has(A)||this.userRooms.set(A,new Set),this.userRooms.get(A).add(I)),E}removeUserFromRoom(A,I,O="left"){let U=this.rooms.get(I);if(U){U.removeMember(A,O);let E=this.userRooms.get(A);E&&(E.delete(I),E.size===0&&this.userRooms.delete(A))}}removeUserFromAllRooms(A,I="disconnected"){let O=this.userRooms.get(A);O&&O.forEach(U=>{this.removeUserFromRoom(A,U,I)})}getUserRooms(A){let I=this.userRooms.get(A);return I?Array.from(I):[]}listRooms(A={}){let I=Array.from(this.rooms.values());return A.visibility&&(I=I.filter(O=>O.options.visibility===A.visibility)),A.hasMember&&(I=I.filter(O=>O.hasMember(A.hasMember))),A.minMembers&&(I=I.filter(O=>O.getMemberCount()>=A.minMembers)),I.map(O=>O.getInfo())}broadcastToRooms(A,I,O){A.forEach(U=>{let E=this.rooms.get(U);E&&E.broadcast(I,O)})}getStats(){let A={};for(let[I,O]of this.rooms)A[I]={memberCount:O.getMemberCount(),messageCount:O.state.messageCount,type:O.options.type};return{totalRooms:this.rooms.size,totalUsersInRooms:this.userRooms.size,rooms:A}}destroy(){for(let A of this.rooms.values())A.destroy("Manager destroyed");this.rooms.clear(),this.roomIds.clear(),this.userRooms.clear(),y.info("RoomManager destroyed")}};function UI(N={}){return new QA(N)}function EI(N,A={}){return new fA(N,A)}var F=S("presence"),d={ONLINE:"online",AWAY:"away",BUSY:"busy",OFFLINE:"offline",CONNECTING:"connecting",RECONNECTING:"reconnecting"},KI={TYPING:"typing",TYPING_STOPPED:"typing_stopped",VIEWING:"viewing",EDITING:"editing",IDLE:"idle"},C={STATE_CHANGED:"state_changed",ACTIVITY_UPDATED:"activity_updated",USER_ONLINE:"user_online",USER_OFFLINE:"user_offline",TYPING_STARTED:"typing_started",TYPING_STOPPED:"typing_stopped",SUBSCRIBED:"subscribed",UNSUBSCRIBED:"unsubscribed",ERROR:"error"},q1={heartbeatInterval:3e4,offlineTimeout:7e4,idleTimeout:3e5,broadcastChanges:!0,trackTyping:!0,typingTimeout:3e3,maxSubscribers:1e3,persistHistory:!1,maxHistory:100},z1=class{constructor(A,I={}){this.userId=A,this.state=d.CONNECTING,this.previousState=null,this.metadata={name:I.name||A,avatar:I.avatar||null,email:I.email||null,...I.metadata},this.lastSeen=Date.now(),this.lastActivity=Date.now(),this.lastStateChange=Date.now(),this.currentActivity=null,this.typingIn=new Set,this.typingTimeout=null,this.lastHeartbeat=Date.now(),this.heartbeatTimer=null,this.subscribers=new Set,this.history=[],this.status=I.status||null,this.statusMessage=I.statusMessage||"",F.debug("UserPresence created",{userId:A})}updateState(A,I=null){if(this.state===A)return null;this.previousState=this.state,this.state=A,this.lastStateChange=Date.now(),A===d.ONLINE&&(this.lastHeartbeat=Date.now());let O={userId:this.userId,from:this.previousState,to:this.state,timestamp:this.lastStateChange,reason:I};return this._addToHistory("state_change",O),F.debug("Presence state changed",O),O}updateActivity(A,I={}){this.lastActivity=Date.now(),this.currentActivity={type:A,data:I,timestamp:this.lastActivity},this.state===d.AWAY&&this.updateState(d.ONLINE,"activity"),F.debug("Activity updated",{userId:this.userId,activity:A})}startTyping(A){return this.typingIn.has(A)?!1:(this.typingIn.add(A),this.typingTimeout&&(clearTimeout(this.typingTimeout),this.typingTimeout=null),F.debug("Started typing",{userId:this.userId,room:A}),!0)}stopTyping(A){return this.typingIn.has(A)?(this.typingIn.delete(A),F.debug("Stopped typing",{userId:this.userId,room:A}),!0):!1}isTyping(A){return this.typingIn.has(A)}getTypingRooms(){return Array.from(this.typingIn)}heartbeat(){this.lastHeartbeat=Date.now(),this.lastSeen=this.lastHeartbeat}isHeartbeatStale(A){return Date.now()-this.lastHeartbeat>A}addSubscriber(A){this.subscribers.add(A)}removeSubscriber(A){this.subscribers.delete(A)}getSubscribers(){return Array.from(this.subscribers)}getInfo(){return{userId:this.userId,state:this.state,previousState:this.previousState,metadata:this.metadata,lastSeen:this.lastSeen,lastActivity:this.lastActivity,lastStateChange:this.lastStateChange,currentActivity:this.currentActivity,typingIn:this.getTypingRooms(),status:this.status,statusMessage:this.statusMessage,subscribers:this.subscribers.size}}_addToHistory(A,I){let O={type:A,data:I,timestamp:Date.now()};this.history.push(O),this.history.length>q1.maxHistory&&(this.history=this.history.slice(-q1.maxHistory))}},XA=class{constructor(A={}){this.options={...q1,...A},this.users=new Map,this.roomPresence=new Map,this.userSubscriptions=new Map,this.heartbeatInterval=null,this._startHeartbeatCheck(),this.handlers={[C.STATE_CHANGED]:[],[C.ACTIVITY_UPDATED]:[],[C.USER_ONLINE]:[],[C.USER_OFFLINE]:[],[C.TYPING_STARTED]:[],[C.TYPING_STOPPED]:[],[C.SUBSCRIBED]:[],[C.UNSUBSCRIBED]:[],[C.ERROR]:[]},this.stats={totalUsers:0,onlineUsers:0,awayUsers:0,busyUsers:0,totalSubscriptions:0,typingEvents:0,stateChanges:0},F.info("PresenceManager created",this.options)}registerUser(A,I={}){if(this.users.has(A))return this.users.get(A);let O=new z1(A,I);return this.users.set(A,O),this.stats.totalUsers=this.users.size,F.debug("User registered",{userId:A}),O}unregisterUser(A,I="user_left"){if(this.users.get(A)){this.updateUserState(A,d.OFFLINE,I);for(let[U,E]of this.roomPresence)E.has(A)&&E.delete(A);this.userSubscriptions.delete(A),this.users.delete(A),this.stats.totalUsers=this.users.size,F.debug("User unregistered",{userId:A,reason:I})}}updateUserState(A,I,O=null){let U=this.users.get(A);if(!U)return F.warn("User not found",{userId:A}),!1;let E=U.updateState(I,O);return E&&(this.stats.stateChanges++,I===d.ONLINE?(this.stats.onlineUsers++,this._emit(C.USER_ONLINE,{userId:A,metadata:U.metadata,timestamp:E.timestamp})):I===d.OFFLINE&&(this.stats.onlineUsers=Math.max(0,this.stats.onlineUsers-1),this._emit(C.USER_OFFLINE,{userId:A,timestamp:E.timestamp})),this.options.broadcastChanges&&this._broadcastToSubscribers(A,C.STATE_CHANGED,E),this._emit(C.STATE_CHANGED,E)),!0}recordActivity(A,I,O={}){let U=this.users.get(A);U&&(U.updateActivity(I,O),this._emit(C.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,C.TYPING_STARTED,{userId:A,room:I,timestamp:Date.now()}),this._emit(C.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,C.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}),this._emit(C.TYPING_STOPPED,{userId:A,room:I,timeout:O,timestamp:Date.now()}))}userJoinedRoom(A,I){this.roomPresence.has(I)||this.roomPresence.set(I,new Set),this.roomPresence.get(I).add(A),F.debug("User joined room presence",{userId:A,room:I})}userLeftRoom(A,I){let O=this.roomPresence.get(I);O&&(O.delete(A),this.stopTyping(A,I),O.size===0&&this.roomPresence.delete(I))}subscribe(A,I){let O=this.users.get(I);return O?O.getSubscribers().length>=this.options.maxSubscribers?(this._emit(C.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(C.SUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()}),!0):(F.warn("Cannot subscribe to non-existent user",{targetUserId:I}),!1)}unsubscribe(A,I){let O=this.users.get(I);O&&O.removeSubscriber(A);let U=this.userSubscriptions.get(A);U&&(U.delete(I),U.size===0&&this.userSubscriptions.delete(A)),this.stats.totalSubscriptions=Math.max(0,this.stats.totalSubscriptions-1),this._emit(C.UNSUBSCRIBED,{subscriber:A,target:I,timestamp:Date.now()})}getUserPresence(A){let I=this.users.get(A);return I?I.getInfo():null}getRoomUsers(A,I=!0){let O=this.roomPresence.get(A)||new Set;return I?Array.from(O).map(U=>this.getUserPresence(U)).filter(Boolean):Array.from(O)}getTypingUsers(A){var O;let I=[];for(let[U,E]of this.users)E.isTyping(A)&&I.push({userId:U,metadata:E.metadata,startedAt:(O=E.currentActivity)==null?void 0:O.timestamp});return I}heartbeat(A){let I=this.users.get(A);I&&(I.heartbeat(),I.state===d.OFFLINE&&this.updateUserState(A,d.ONLINE,"heartbeat"))}getStats(){let A=0,I=0,O=0,U=0;for(let E of this.users.values())switch(E.state){case d.ONLINE:A++;break;case d.AWAY:I++;break;case d.BUSY:O++;break;case d.OFFLINE:U++;break}return{...this.stats,online:A,away:I,busy:O,offline:U,totalRooms:this.roomPresence.size,activeSubscriptions:this.userSubscriptions.size}}on(A,I){return this.handlers[A]||(this.handlers[A]=[]),this.handlers[A].push(I),()=>{let O=this.handlers[A].indexOf(I);O!==-1&&this.handlers[A].splice(O,1)}}_startHeartbeatCheck(){this.heartbeatInterval=setInterval(()=>{this._checkHeartbeats()},this.options.heartbeatInterval)}_checkHeartbeats(){let A=Date.now();for(let[I,O]of this.users)O.state!==d.OFFLINE&&O.isHeartbeatStale(this.options.offlineTimeout)?(F.debug("Heartbeat stale, marking offline",{userId:I}),this.updateUserState(I,d.OFFLINE,"heartbeat_timeout")):O.state===d.ONLINE&&A-O.lastActivity>this.options.idleTimeout&&this.updateUserState(I,d.AWAY,"idle")}_broadcastToSubscribers(A,I,O){let U=this.users.get(A);if(!U)return;U.getSubscribers().forEach(K=>{this._emit(I,{...O,for:K})})}_broadcastToRoom(A,I,O){(this.roomPresence.get(A)||new Set).forEach(E=>{this._emit(I,{...O,for:E})})}_emit(A,I){(this.handlers[A]||[]).forEach(U=>{try{U(I)}catch(E){F.error(`Error in ${A} handler:`,E)}})}destroy(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.users.clear(),this.roomPresence.clear(),this.userSubscriptions.clear(),this.handlers={},F.info("PresenceManager destroyed")}};function BI(N={}){return new XA(N)}function RI(N,A,I){let O=null,U=!1;return{start(){U||(N.startTyping(A,I),U=!0),O&&clearTimeout(O),O=setTimeout(()=>{this.stop()},3e3)},stop(){U&&(N.stopTyping(A,I),U=!1),O&&(clearTimeout(O),O=null)},isTyping(){return U}}}var z=S("ack"),m={PENDING:"pending",ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",FAILED:"failed",CANCELLED:"cancelled"},lA={ACKNOWLEDGED:"acknowledged",TIMEOUT:"timeout",RETRY:"retry",FAILED:"failed",CANCELLED:"cancelled",LATENCY_UPDATED:"latency_updated"},_4={timeout:1e4,maxRetries:3,retryBaseDelay:1e3,retryMaxDelay:3e4,exponentialBackoff:!0,cleanupInterval:6e4,maxAckAge:3e5,trackLatency:!0},$1=class{constructor(A,I){this.messageId=A,this.state=m.PENDING,this.sentAt=Date.now(),this.lastAttempt=this.sentAt,this.attempts=0,this.timeout=I.timeout,this.maxRetries=I.maxRetries,this.sendCallback=I.sendCallback,this.metadata=I.metadata||{},this.ackReceivedAt=null,this.deferred=nA(),this._setTimeout(),z.debug("Ack entry created",{messageId:A,timeout:this.timeout,maxRetries:this.maxRetries})}_setTimeout(){this.timeoutId=setTimeout(()=>{this._handleTimeout()},this.timeout)}_handleTimeout(){this.attempts++,this.attempts>=this.maxRetries?(this.state=m.FAILED,this.deferred.reject(new Error(`Max retries (${this.maxRetries}) exceeded for message ${this.messageId}`)),z.warn("Message failed permanently",{messageId:this.messageId,attempts:this.attempts})):(this.state=m.TIMEOUT,this._scheduleRetry())}_scheduleRetry(){let A=iA(this.attempts-1,{baseDelay:this.metadata.retryBaseDelay||1e3,maxDelay:this.metadata.retryMaxDelay||3e4,jitter:!0});z.debug("Scheduling retry",{messageId:this.messageId,attempt:this.attempts,delay:A}),this.retryTimeout=setTimeout(()=>{this.lastAttempt=Date.now(),this.sendCallback(this.messageId),this._setTimeout()},A)}acknowledge(A){if(this.state===m.PENDING||this.state===m.TIMEOUT){this.state=m.ACKNOWLEDGED,this.ackReceivedAt=Date.now(),this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout);let I=this.ackReceivedAt-this.sentAt;this.deferred.resolve({messageId:this.messageId,data:A,latency:I,attempts:this.attempts+1}),z.debug("Message acknowledged",{messageId:this.messageId,latency:I,attempts:this.attempts+1})}}cancel(A="Cancelled"){this.state=m.CANCELLED,this.timeoutId&&clearTimeout(this.timeoutId),this.retryTimeout&&clearTimeout(this.retryTimeout),this.deferred.reject(new Error(A)),z.debug("Ack cancelled",{messageId:this.messageId,reason:A})}getStats(){return{messageId:this.messageId,state:this.state,sentAt:this.sentAt,lastAttempt:this.lastAttempt,attempts:this.attempts,ackReceivedAt:this.ackReceivedAt,latency:this.ackReceivedAt?this.ackReceivedAt-this.sentAt:null,metadata:this.metadata}}isExpired(A){return this.state===m.ACKNOWLEDGED?Date.now()-this.ackReceivedAt>A:this.state===m.FAILED||this.state===m.CANCELLED?Date.now()-this.lastAttempt>A:!1}},wA=class{constructor(A={}){this.options={..._4,...A},this.pending=new Map,this.completed=new Map,this.listeners=new Map,this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],this._startCleanup(),z.info("AckManager created",this.options)}track(A,I,O={}){if(this.pending.has(A))return z.warn("Message already being tracked",{messageId:A}),this.pending.get(A).deferred.promise;let U={timeout:O.timeout||this.options.timeout,maxRetries:O.maxRetries||this.options.maxRetries,retryBaseDelay:O.retryBaseDelay||this.options.retryBaseDelay,retryMaxDelay:O.retryMaxDelay||this.options.retryMaxDelay,sendCallback:I,metadata:O.metadata},E=new $1(A,U);this.pending.set(A,E),this.stats.totalTracked++;try{I(A)}catch(K){z.error("Initial send failed:",K),E.cancel(`Send failed: ${K.message}`)}return E.deferred.promise.then(K=>{this._handleAcknowledgement(A,K)}).catch(K=>{this._handleFailure(A,K)}),E.deferred.promise}acknowledge(A,I=null){let O=this.pending.get(A);if(!O){z.debug("Ack for untracked message (maybe already completed)",{messageId:A});return}O.acknowledge(I)}cancel(A,I="Cancelled"){let O=this.pending.get(A);O&&(O.cancel(I),this.pending.delete(A),this.stats.cancelled++)}isPending(A){return this.pending.has(A)}getStatus(A){let I=this.pending.get(A)||this.completed.get(A);return I?I.getStats():null}waitForAll(A,I=3e4){let O=A.map(U=>{let E=this.pending.get(U);return E?E.deferred.promise:Promise.reject(new Error(`Message ${U} not tracked`))});return Promise.all(O)}waitForAny(A){let I=A.map(O=>{let U=this.pending.get(O);return U?U.deferred.promise:Promise.reject(new Error(`Message ${O} not tracked`))});return Promise.race(I)}getPending(){return Array.from(this.pending.values()).map(A=>A.getStats())}getCompleted(){return Array.from(this.completed.values()).map(A=>A.getStats())}getStats(){let A=this.stats.acknowledged>0?this.stats.totalLatency/this.stats.acknowledged:0;return{...this.stats,avgLatency:A,pendingCount:this.pending.size,completedCount:this.completed.size,minLatency:this.stats.minLatency===1/0?0:this.stats.minLatency,maxLatency:this.stats.maxLatency,latencyHistory:this.latencyHistory.slice(-10)}}reset(){this.pending.forEach((A,I)=>{A.cancel("Manager reset")}),this.pending.clear(),this.completed.clear(),this.stats={totalTracked:0,acknowledged:0,timedOut:0,failed:0,cancelled:0,retries:0,totalLatency:0,minLatency:1/0,maxLatency:0},this.latencyHistory=[],z.info("AckManager reset")}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_handleAcknowledgement(A,I){let O=this.pending.get(A);O&&(this.stats.acknowledged++,I.latency&&(this.stats.totalLatency+=I.latency,this.stats.minLatency=Math.min(this.stats.minLatency,I.latency),this.stats.maxLatency=Math.max(this.stats.maxLatency,I.latency),this.options.trackLatency&&(this.latencyHistory.push({messageId:A,latency:I.latency,timestamp:Date.now()}),this.latencyHistory.length>100&&this.latencyHistory.shift(),this._emit(lA.LATENCY_UPDATED,{latency:I.latency,avgLatency:this.stats.totalLatency/this.stats.acknowledged}))),this.pending.delete(A),this.completed.set(A,O),this._emit(lA.ACKNOWLEDGED,{messageId:A,attempts:I.attempts,latency:I.latency}))}_handleFailure(A,I){let O=this.pending.get(A);O&&(O.state===m.FAILED?(this.stats.failed++,this._emit(lA.FAILED,{messageId:A,error:I.message})):O.state===m.TIMEOUT?(this.stats.timedOut++,this.stats.retries+=O.attempts,this._emit(lA.TIMEOUT,{messageId:A,attempt:O.attempts})):O.state===m.CANCELLED&&(this.stats.cancelled++,this._emit(lA.CANCELLED,{messageId:A,reason:I.message})),(O.state===m.FAILED||O.state===m.CANCELLED)&&(this.pending.delete(A),this.completed.set(A,O)))}_startCleanup(){this.cleanupInterval=setInterval(()=>{this._cleanup()},this.options.cleanupInterval)}_cleanup(){let A=0;for(let[I,O]of this.completed)O.isExpired(this.options.maxAckAge)&&(this.completed.delete(I),A++);A>0&&z.debug("Cleaned up old ack entries",{cleaned:A})}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){z.error(`Error in ${A} listener:`,E)}})}destroy(){this.cleanupInterval&&clearInterval(this.cleanupInterval),this.reset(),this.listeners.clear(),z.info("AckManager destroyed")}};function MI(N={}){return new wA(N)}function LI(N,A,I={}){return new wA(I).track(N,A,I)}var h=S("queue"),X={PENDING:"pending",PROCESSING:"processing",SENT:"sent",FAILED:"failed",DISCARDED:"discarded"},GA={ITEM_ADDED:"item_added",ITEM_REMOVED:"item_removed",ITEM_STATE_CHANGED:"item_state_changed",PROCESSING_STARTED:"processing_started",PROCESSING_STOPPED:"processing_stopped",QUEUE_FULL:"queue_full",QUEUE_EMPTIED:"queue_emptied"},RA={CRITICAL:0,HIGH:1,NORMAL:2,LOW:3},j1={maxSize:1e3,maxAge:10080*60*1e3,autoProcess:!0,batchSize:10,batchDelay:100,maxRetries:5,preserveOrder:!0,dropOldestWhenFull:!0},Q1=class N{constructor(A,I={}){this.id=I.id||V("q"),this.data=A,this.priority=I.priority||RA.NORMAL,this.state=X.PENDING,this.createdAt=Date.now(),this.updatedAt=this.createdAt,this.retries=I.retries||0,this.maxRetries=I.maxRetries||j1.maxRetries,this.ttl=I.ttl||j1.maxAge,this.metadata=I.metadata||{},this.error=null,this.size=M1(A),this.sequence=Date.now()+Math.random(),h.debug("Queue item created",{id:this.id,priority:this.priority,size:this.size})}setState(A,I=null){let O=this.state;return this.state=A,this.updatedAt=Date.now(),I&&(this.error=I),h.debug("Item state changed",{id:this.id,from:O,to:A,retries:this.retries}),{oldState:O,newState:A}}incrementRetry(){return this.retries++,this.updatedAt=Date.now(),this.retries}isExpired(){return L1(this.createdAt,this.ttl)}hasExceededRetries(){return this.retries>=this.maxRetries}getAge(){return Date.now()-this.createdAt}toJSON(){return{id:this.id,data:this.data,priority:this.priority,state:this.state,createdAt:this.createdAt,updatedAt:this.updatedAt,retries:this.retries,maxRetries:this.maxRetries,ttl:this.ttl,metadata:this.metadata,error:this.error,size:this.size,sequence:this.sequence}}static fromJSON(A){let I=new N(A.data,{id:A.id,priority:A.priority,retries:A.retries,maxRetries:A.maxRetries,ttl:A.ttl,metadata:A.metadata});return I.state=A.state,I.createdAt=A.createdAt,I.updatedAt=A.updatedAt,I.error=A.error,I.sequence=A.sequence,I}},A1=class{constructor(A={}){this.options={...j1,...A},this.items=new Map,this.pendingIds=[],this.priorityBuckets={[RA.CRITICAL]:new Set,[RA.HIGH]:new Set,[RA.NORMAL]:new Set,[RA.LOW]:new Set},this.isProcessing=!1,this.processingPromise=null,this.processor=null,this.stats={totalAdded:0,totalProcessed:0,totalFailed:0,totalDiscarded:0,totalExpired:0,currentSize:0,peakSize:0,averageProcessTime:0},this.listeners=new Map,this.processingTimes=[],h.info("QueueManager created",this.options)}add(A,I={}){if(this.items.size>=this.options.maxSize)if(this.options.dropOldestWhenFull)this._dropOldest();else throw h.warn("Queue full, rejecting new item"),this._emit(GA.QUEUE_FULL,{size:this.items.size}),new Error("Queue is full");let O=new Q1(A,{priority:I.priority,ttl:I.ttl,metadata:I.metadata,maxRetries:this.options.maxRetries});return this.items.set(O.id,O),this.pendingIds.push(O.id),this.priorityBuckets[O.priority].add(O.id),this.stats.totalAdded++,this.stats.currentSize=this.items.size,this.stats.peakSize=Math.max(this.stats.peakSize,this.items.size),h.debug("Item added to queue",{id:O.id,priority:O.priority,queueSize:this.items.size}),this._emit(GA.ITEM_ADDED,{id:O.id,priority:O.priority,queueSize:this.items.size}),this.options.autoProcess&&this.processor&&!this.isProcessing&&this.process(),O.id}addBatch(A){return A.map(I=>Array.isArray(I)?this.add(I[0],I[1]):this.add(I))}remove(A){let I=this.items.get(A);if(!I)return!1;this.items.delete(A);let O=this.pendingIds.indexOf(A);return O!==-1&&this.pendingIds.splice(O,1),this.priorityBuckets[I.priority].delete(A),this.stats.currentSize=this.items.size,h.debug("Item removed from queue",{id:A}),this._emit(GA.ITEM_REMOVED,{id:A,priority:I.priority,queueSize:this.items.size}),!0}get(A){let I=this.items.get(A);return I?this._toPublicItem(I):null}getAll(A={}){let I=Array.from(this.items.values());return A.state&&(I=I.filter(O=>O.state===A.state)),A.priority!==void 0&&(I=I.filter(O=>O.priority===A.priority)),I.sort((O,U)=>O.priority!==U.priority?O.priority-U.priority:O.sequence-U.sequence),I.map(O=>this._toPublicItem(O))}size(){return this.items.size}isEmpty(){return this.items.size===0}isFull(){return this.items.size>=this.options.maxSize}setProcessor(A){if(typeof A!="function")throw new TypeError("Processor must be a function");this.processor=A}async process(){if(!this.processor){h.warn("No processor set, cannot process queue");return}if(this.isProcessing)return this.processingPromise;if(this.isEmpty()){h.debug("Queue empty, nothing to process");return}this.isProcessing=!0,this._emit(GA.PROCESSING_STARTED,{size:this.items.size}),h.info("Started processing queue",{size:this.items.size}),this.processingPromise=this._processQueue();try{await this.processingPromise}finally{this.isProcessing=!1,this.processingPromise=null,this._emit(GA.PROCESSING_STOPPED,{remaining:this.items.size}),this.isEmpty()&&this._emit(GA.QUEUE_EMPTIED)}}stopProcessing(){this.isProcessing=!1,h.info("Processing stopped")}clear(){this.items.clear(),this.pendingIds=[],Object.keys(this.priorityBuckets).forEach(A=>{this.priorityBuckets[A].clear()}),this.stats.currentSize=0,h.info("Queue cleared"),this._emit(GA.QUEUE_EMPTIED)}retryFailed(A){let I=0;for(let O of this.items.values())O.state===X.FAILED&&(O.setState(X.PENDING),O.retries=0,I++);h.info(`Retrying ${I} failed items`)}getStats(){let A={},I={};for(let O of this.items.values())A[O.state]=(A[O.state]||0)+1,I[O.priority]=(I[O.priority]||0)+1;return{...this.stats,currentSize:this.items.size,stateCounts:A,priorityCounts:I,isProcessing:this.isProcessing,isEmpty:this.isEmpty(),isFull:this.isFull(),oldestItem:this._getOldestItemAge(),newestItem:this._getNewestItemAge()}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}async _processQueue(){let A=Date.now(),I=0,O=0;try{for(;this.isProcessing&&!this.isEmpty();){let U=this._getNextBatch();if(U.length===0)break;for(let E of U){if(!this.isProcessing)break;try{E.setState(X.PROCESSING),await this.processor(this._toPublicItem(E))?(this.remove(E.id),I++,this.stats.totalProcessed++,this._emit(GA.ITEM_STATE_CHANGED,{id:E.id,state:X.SENT})):(this._handleFailure(E),O++)}catch(K){h.error("Error processing item:",K),this._handleFailure(E,K.message),O++}}this.options.batchDelay>0&&!this.isEmpty()&&await new Promise(E=>setTimeout(E,this.options.batchDelay))}}finally{let U=Date.now()-A;this.processingTimes.push(U),this.processingTimes.length>10&&this.processingTimes.shift(),this.stats.averageProcessTime=this.processingTimes.reduce((E,K)=>E+K,0)/this.processingTimes.length,h.info("Queue processing complete",{processed:I,failed:O,remaining:this.items.size,time:U})}}_getNextBatch(){let A=[],I=this.options.batchSize,O=[RA.CRITICAL,RA.HIGH,RA.NORMAL,RA.LOW];for(let U of O){if(A.length>=I)break;let E=this.priorityBuckets[U],K=I-A.length,B=Array.from(E).map(R=>this.items.get(R)).filter(R=>R&&R.state===X.PENDING).sort((R,M)=>R.sequence-M.sequence).slice(0,K);A.push(...B)}return A}_handleFailure(A,I=null){A.incrementRetry(),A.hasExceededRetries()?(A.setState(X.DISCARDED,I),this.remove(A.id),this.stats.totalDiscarded++,h.warn("Item discarded (max retries)",{id:A.id,retries:A.retries})):(A.setState(X.FAILED,I),this.stats.totalFailed++,h.debug("Item failed, will retry",{id:A.id,retries:A.retries}))}_dropOldest(){if(this.pendingIds.length===0)return;let A=this.pendingIds[0],I=this.items.get(A);I&&(I.setState(X.DISCARDED,"Queue full - dropped"),this.remove(A),this.stats.totalDiscarded++,h.warn("Dropped oldest item (queue full)",{id:A,age:I.getAge()}))}_removeExpired(){let A=0;for(let[I,O]of this.items)O.isExpired()&&(O.setState(X.DISCARDED,"Expired"),this.remove(I),A++,this.stats.totalExpired++);A>0&&h.info(`Removed ${A} expired items`)}_getOldestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[0],I=this.items.get(A);return I?I.getAge():null}_getNewestItemAge(){if(this.pendingIds.length===0)return null;let A=this.pendingIds[this.pendingIds.length-1],I=this.items.get(A);return I?I.getAge():null}_toPublicItem(A){return{id:A.id,data:A.data,priority:A.priority,state:A.state,createdAt:A.createdAt,updatedAt:A.updatedAt,retries:A.retries,maxRetries:A.maxRetries,metadata:A.metadata,error:A.error,size:A.size}}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){h.error(`Error in ${A} listener:`,E)}})}destroy(){this.stopProcessing(),this.clear(),this.listeners.clear(),this.processor=null,h.info("QueueManager destroyed")}};function S1(N={}){return new A1(N)}var n=S("storage"),AA={INITIALIZED:"initialized",ITEM_STORED:"item_stored",ITEM_RETRIEVED:"item_retrieved",ITEM_DELETED:"item_deleted",CLEARED:"cleared",ERROR:"error",STORAGE_FULL:"storage_full"},H={INDEXED_DB:"indexeddb",LOCAL_STORAGE:"localstorage",MEMORY:"memory"},k4={dbName:"websocket_queue",storeName:"messages",dbVersion:1,maxItems:1e4,maxSize:5*1024*1024,autoInit:!0,storageType:null},X1=class{constructor(A={}){this.options={...k4,...A},this.browser=p(),this.initialized=!1,this.initializing=!1,this.storageType=null,this.db=null,this.memoryStore=new Map,this.stats={itemsStored:0,itemsRetrieved:0,itemsDeleted:0,storageCleared:0,errors:0,estimatedSize:0},this.listeners=new Map,this._initPromise=null,this.options.autoInit&&this.init(),n.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,n.info("Storage initialized",{type:this.storageType}),this._emit(AA.INITIALIZED,{type:this.storageType})}catch(A){throw n.error("Storage initialization failed:",A),this._emit(AA.ERROR,{error:A.message}),A}finally{this.initializing=!1}}}async setItem(A,I){await this._ensureInitialized();try{let O=this._getItemSize(I);switch(this.stats.estimatedSize+O>this.options.maxSize&&(n.warn("Storage size limit approaching"),this._emit(AA.STORAGE_FULL,{size:this.stats.estimatedSize,max:this.options.maxSize})),this.storageType){case H.INDEXED_DB:await this._setItemIndexedDB(A,I);break;case H.LOCAL_STORAGE:this._setItemLocalStorage(A,I);break;case H.MEMORY:this._setItemMemory(A,I);break}this.stats.itemsStored++,this.stats.estimatedSize+=O,n.debug("Item stored",{key:A,size:O}),this._emit(AA.ITEM_STORED,{key:A,size:O})}catch(O){throw this.stats.errors++,n.error("Failed to store item:",O),this._emit(AA.ERROR,{key:A,error:O.message}),O}}async getItem(A){await this._ensureInitialized();try{let I=null;switch(this.storageType){case H.INDEXED_DB:I=await this._getItemIndexedDB(A);break;case H.LOCAL_STORAGE:I=this._getItemLocalStorage(A);break;case H.MEMORY:I=this._getItemMemory(A);break}return I!=null&&(this.stats.itemsRetrieved++,n.debug("Item retrieved",{key:A}),this._emit(AA.ITEM_RETRIEVED,{key:A})),I}catch(I){return this.stats.errors++,n.error("Failed to retrieve item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),null}}async removeItem(A){await this._ensureInitialized();try{let I=!1;switch(this.storageType){case H.INDEXED_DB:I=await this._removeItemIndexedDB(A);break;case H.LOCAL_STORAGE:I=this._removeItemLocalStorage(A);break;case H.MEMORY:I=this._removeItemMemory(A);break}return I&&(this.stats.itemsDeleted++,n.debug("Item removed",{key:A}),this._emit(AA.ITEM_DELETED,{key:A})),I}catch(I){return this.stats.errors++,n.error("Failed to remove item:",I),this._emit(AA.ERROR,{key:A,error:I.message}),!1}}async getAll(){await this._ensureInitialized();try{let A=[];switch(this.storageType){case H.INDEXED_DB:A=await this._getAllIndexedDB();break;case H.LOCAL_STORAGE:A=this._getAllLocalStorage();break;case H.MEMORY:A=this._getAllMemory();break}return n.debug("Retrieved all items",{count:A.length}),A}catch(A){return this.stats.errors++,n.error("Failed to get all items:",A),this._emit(AA.ERROR,{error:A.message}),[]}}async clear(){await this._ensureInitialized();try{switch(this.storageType){case H.INDEXED_DB:await this._clearIndexedDB();break;case H.LOCAL_STORAGE:this._clearLocalStorage();break;case H.MEMORY:this._clearMemory();break}this.stats.storageCleared++,this.stats.estimatedSize=0,n.info("Storage cleared"),this._emit(AA.CLEARED)}catch(A){this.stats.errors++,n.error("Failed to clear storage:",A),this._emit(AA.ERROR,{error:A.message})}}async count(){await this._ensureInitialized();try{switch(this.storageType){case H.INDEXED_DB:return await this._countIndexedDB();case H.LOCAL_STORAGE:return this._countLocalStorage();case H.MEMORY:return this.memoryStore.size;default:return 0}}catch(A){return this.stats.errors++,n.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(),n.info(`Using storage type: ${this.storageType}`),this.storageType){case H.INDEXED_DB:await this._initIndexedDB();break;case H.LOCAL_STORAGE:this._initLocalStorage();break;case H.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 H.INDEXED_DB}catch(A){n.warn("IndexedDB test failed:",A)}if(this.browser.hasLocalStorage)try{return this._testLocalStorage(),H.LOCAL_STORAGE}catch(A){n.warn("localStorage test failed:",A)}return H.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(),n.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"),n.info("Created IndexedDB store")}}})}_initLocalStorage(){let A=localStorage.getItem(this._getStoreKey());if(A)try{let I=JSON.parse(A);Array.isArray(I)&&n.info(`Loaded ${I.length} items from localStorage`)}catch{n.warn("Corrupted localStorage data, clearing"),localStorage.removeItem(this._getStoreKey())}}_initMemory(){this.memoryStore.clear(),n.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){n.error(`Error in ${A} listener:`,E)}})}destroy(){this.db&&(this.db.close(),this.db=null),this.memoryStore.clear(),this.listeners.clear(),this.initialized=!1,n.info("StorageManager destroyed")}};function A2(N={}){return new X1(N)}var x=S("retry"),IA={EXPONENTIAL:"exponential",LINEAR:"linear",FIXED:"fixed",FIBONACCI:"fibonacci",IMMEDIATE:"immediate"},CA={ALL:"all",NETWORK:"network",SERVER:"server",TIMEOUT:"timeout",CUSTOM:"custom"},TA={BEFORE_RETRY:"before_retry",AFTER_RETRY:"after_retry",MAX_RETRIES_REACHED:"max_retries_reached",CANCELLED:"cancelled",CIRCUIT_OPENED:"circuit_opened",CIRCUIT_CLOSED:"circuit_closed"},MA={CLOSED:"closed",OPEN:"open",HALF_OPEN:"half_open"},GI={maxAttempts:5,initialDelay:1e3,maxDelay:3e4,strategy:IA.EXPONENTIAL,factor:2,jitter:!0,retryCondition:CA.ALL,customCondition:null,circuitBreaker:{enabled:!0,failureThreshold:5,openTimeout:3e4,successThreshold:2},resetOnSuccess:!0},I2=class{constructor(A,I,O={}){this.operation=A,this.options=I,this.metadata=O,this.attempt=0,this.startTime=Date.now(),this.lastError=null,this.cancelled=!1,this.deferred=nA(),this.results=[],this.errors=[],x.debug("Retry context created",{maxAttempts:I.maxAttempts,strategy:I.strategy})}getNextDelay(){if(this.attempt===0)return 0;switch(this.options.strategy){case IA.EXPONENTIAL:return this._exponentialDelay();case IA.LINEAR:return this._linearDelay();case IA.FIBONACCI:return this._fibonacciDelay();case IA.FIXED:return this.options.initialDelay;case IA.IMMEDIATE:return 0;default:return this._exponentialDelay()}}_exponentialDelay(){return iA(this.attempt-1,{baseDelay:this.options.initialDelay,maxDelay:this.options.maxDelay,jitter:this.options.jitter})}_linearDelay(){let A=this.options.initialDelay*this.attempt;return this.options.jitter&&(A=A*(.8+.4*Math.random())),Math.min(A,this.options.maxDelay)}_fibonacciDelay(){let A=O=>O<=1?1:A(O-1)+A(O-2),I=this.options.initialDelay*A(this.attempt);return this.options.jitter&&(I=I*(.8+.4*Math.random())),Math.min(I,this.options.maxDelay)}shouldRetry(A){return this.attempt>=this.options.maxAttempts||this.cancelled?!1:this._checkCondition(A)}_checkCondition(A){switch(this.options.retryCondition){case CA.ALL:return!0;case CA.NETWORK:return this._isNetworkError(A);case CA.SERVER:return this._isServerError(A);case CA.TIMEOUT:return this._isTimeoutError(A);case CA.CUSTOM:return this.options.customCondition?this.options.customCondition(A):!0;default:return!0}}_isNetworkError(A){return["ECONNREFUSED","ECONNRESET","ENOTFOUND","ETIMEDOUT","NetworkError","network offline"].some(O=>{var U,E;return((U=A.message)==null?void 0:U.includes(O))||((E=A.code)==null?void 0:E.includes(O))})}_isServerError(A){return A.status>=500||A.statusCode>=500}_isTimeoutError(A){var I;return((I=A.message)==null?void 0:I.includes("timeout"))||A.code==="ETIMEDOUT"}recordResult(A){this.results.push({attempt:this.attempt,result:A,timestamp:Date.now()})}recordError(A){this.lastError=A,this.errors.push({attempt:this.attempt,error:A.message,timestamp:Date.now()})}getStats(){var A;return{attempt:this.attempt,startTime:this.startTime,elapsed:Date.now()-this.startTime,lastError:(A=this.lastError)==null?void 0:A.message,results:this.results,errors:this.errors,cancelled:this.cancelled}}},O2=class{constructor(A){this.options=A,this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,this.lastFailure=null,x.debug("Circuit breaker created",A)}isClosed(){return this.state===MA.CLOSED}isOpen(){return this.state===MA.OPEN}isHalfOpen(){return this.state===MA.HALF_OPEN}recordSuccess(){this.successCount++,this.failureCount=0,this.state===MA.HALF_OPEN&&this.successCount>=this.options.successThreshold&&this._close()}recordFailure(A){this.lastFailure=A,this.failureCount++,this.successCount=0,this.state===MA.CLOSED?this.failureCount>=this.options.failureThreshold&&this._open():this.state===MA.HALF_OPEN&&this._open()}checkHalfOpen(){return this.state===MA.OPEN&&this.openTime&&Date.now()-this.openTime>=this.options.openTimeout?(this._halfOpen(),!0):!1}_open(){this.state=MA.OPEN,this.openTime=Date.now(),this.successCount=0,x.warn("Circuit opened",{failures:this.failureCount,timeout:this.options.openTimeout})}_close(){this.state=MA.CLOSED,this.failureCount=0,this.successCount=0,this.openTime=null,x.info("Circuit closed")}_halfOpen(){this.state=MA.HALF_OPEN,this.successCount=0,x.info("Circuit half-open, testing recovery")}getStats(){var A;return{state:this.state,failureCount:this.failureCount,successCount:this.successCount,openTime:this.openTime,lastFailure:(A=this.lastFailure)==null?void 0:A.message}}},aA=class{constructor(A={}){this.options=this._mergeOptions(A),this.circuitBreaker=this.options.circuitBreaker.enabled?new O2(this.options.circuitBreaker):null,this.contexts=new Map,this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},this.listeners=new Map,x.info("RetryManager created",{strategy:this.options.strategy,maxAttempts:this.options.maxAttempts})}async execute(A,I={},O={}){var K;if((K=this.circuitBreaker)!=null&&K.isOpen())if(this.circuitBreaker.checkHalfOpen())this._emit(TA.CIRCUIT_HALF_OPEN);else{let B=new Error("Circuit breaker is open");throw this._emit(TA.CIRCUIT_OPENED,{error:B}),B}let U=new I2(A,{...this.options,...I},O),E=Date.now()+Math.random().toString(36);this.contexts.set(E,U),this.stats.totalExecutions++;try{let B=await this._executeWithRetry(U);return this.circuitBreaker&&this.circuitBreaker.recordSuccess(),this.stats.successfulExecutions++,B}catch(B){throw this.circuitBreaker&&(this.circuitBreaker.recordFailure(B),this.circuitBreaker.isOpen()&&(this.stats.circuitOpens++,this._emit(TA.CIRCUIT_OPENED,{error:B}))),this.stats.failedExecutions++,B}finally{this.contexts.delete(E)}}async _executeWithRetry(A){for(;;){A.attempt++;try{x.debug(`Attempt ${A.attempt}`,A.metadata);let I=await A.operation();return A.recordResult(I),A.attempt>1&&x.info(`Succeeded after ${A.attempt} attempts`),this.options.resetOnSuccess,I}catch(I){if(A.recordError(I),x.debug(`Attempt ${A.attempt} failed:`,I.message),!A.shouldRetry(I))throw this._emit(TA.MAX_RETRIES_REACHED,{attempts:A.attempt,error:I.message}),I;let O=A.getNextDelay();x.debug(`Retrying in ${O}ms (attempt ${A.attempt}/${A.options.maxAttempts})`),this.stats.totalRetries++,this._emit(TA.BEFORE_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts,delay:O,error:I.message}),O>0&&await mA(O),this._emit(TA.AFTER_RETRY,{attempt:A.attempt,maxAttempts:A.options.maxAttempts})}}}cancelAll(A="Cancelled by user"){this.contexts.forEach((I,O)=>{I.cancelled=!0,this._emit(TA.CANCELLED,{id:O,reason:A})}),this.contexts.clear(),x.info("All retries cancelled",{reason:A})}getStats(){var I;let A=((I=this.circuitBreaker)==null?void 0:I.getStats())||null;return{...this.stats,circuitBreaker:A,activeRetries:this.contexts.size,currentOptions:{...this.options}}}resetStats(){this.stats={totalExecutions:0,successfulExecutions:0,failedExecutions:0,totalRetries:0,circuitOpens:0,circuitCloses:0},x.info("Retry stats reset")}resetCircuitBreaker(){this.circuitBreaker&&(this.circuitBreaker._close(),this._emit(TA.CIRCUIT_CLOSED))}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_mergeOptions(A){let I={...GI,...A};return A.circuitBreaker&&(I.circuitBreaker={...GI.circuitBreaker,...A.circuitBreaker}),I}_emit(A,I){(this.listeners.get(A)||[]).forEach(U=>{try{U(I)}catch(E){x.error(`Error in ${A} listener:`,E)}})}destroy(){this.cancelAll("Manager destroyed"),this.listeners.clear(),x.info("RetryManager destroyed")}};function t1(N={}){return new aA(N)}async function TI(N,A={}){return new aA({maxAttempts:2,...A}).execute(N)}async function WI(N,A=5){return new aA({maxAttempts:A,strategy:IA.EXPONENTIAL}).execute(N)}async function YI(N,A=1e3,I=5){return new aA({maxAttempts:I,strategy:IA.FIXED,initialDelay:A}).execute(N)}var P=S("recovery"),eA={IDLE:"idle",SCANNING:"scanning",RESTORING:"restoring",COMPLETED:"completed",FAILED:"failed"},WA={RECOVERY_STARTED:"recovery_started",RECOVERY_PROGRESS:"recovery_progress",RECOVERY_COMPLETED:"recovery_completed",RECOVERY_FAILED:"recovery_failed",STATE_SAVED:"state_saved",STATE_RESTORED:"state_restored",CHECKPOINT_CREATED:"checkpoint_created"},hA={FULL:"full",MINIMAL:"minimal",VERIFIED:"verified",CONNECTION_ONLY:"connection_only"},q4={strategy:hA.FULL,maxStateAge:10080*60*1e3,autoRecover:!0,enableCheckpoints:!0,checkpointInterval:300*1e3,maxCheckpoints:5,verifyWithServer:!0,recoveryTimeout:3e4,replayQueue:!0,restoreSubscriptions:!0,restorePresence:!0},N2=class N{constructor(A,I={}){this.id=V("ckpt"),this.timestamp=Date.now(),this.state=A,this.metadata=I,this.size=this._calculateSize()}_calculateSize(){try{return new Blob([JSON.stringify(this.state)]).size}catch{return 0}}isExpired(A){return Date.now()-this.timestamp>A}toJSON(){return{id:this.id,timestamp:this.timestamp,state:this.state,metadata:this.metadata,size:this.size}}static fromJSON(A){let I=new N(A.state,A.metadata);return I.id=A.id,I.timestamp=A.timestamp,I}},I1=class{constructor(A={}){this.options={...q4,...A},this.state=eA.IDLE,this.sessionId=this._generateSessionId(),this.currentState=null,this.storage=A2({dbName:"websocket_recovery",storeName:"state",autoInit:!0}),this.queue=S1({maxSize:1e3,autoProcess:!1}),this.retry=t1({maxAttempts:3,strategy:IA.EXPONENTIAL}),this.checkpoints=[],this.checkpointTimer=null,this.stats={recoveriesAttempted:0,recoveriesSuccessful:0,recoveriesFailed:0,statesSaved:0,statesRestored:0,checkpointsCreated:0,lastRecoveryTime:null,lastRecoveryDuration:null},this.listeners=new Map,this.options.enableCheckpoints&&this._startCheckpointTimer(),this.options.autoRecover&&setTimeout(()=>this.recover(),0),P.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++,P.debug("State saved",{timestamp:O.timestamp,metadata:I}),this._emit(WA.STATE_SAVED,{timestamp:O.timestamp,metadata:I}),this.options.enableCheckpoints&&await this._createCheckpoint(A,I)}catch(U){throw P.error("Failed to save state:",U),U}}async recover(){if(this.state===eA.RECOVERING)return P.warn("Recovery already in progress"),null;this.state=eA.SCANNING,this.stats.recoveriesAttempted++,this._emit(WA.RECOVERY_STARTED,{sessionId:this.sessionId,strategy:this.options.strategy});let A=Date.now();try{let I=await this._findRecoverableState();if(!I)return P.info("No recoverable state found"),this.state=eA.IDLE,null;this.state=eA.RESTORING;let O;switch(this.options.strategy){case hA.FULL:O=await this._fullRecovery(I);break;case hA.MINIMAL:O=await this._minimalRecovery(I);break;case hA.VERIFIED:O=await this._verifiedRecovery(I);break;case hA.CONNECTION_ONLY:O=await this._connectionOnlyRecovery(I);break;default:O=await this._fullRecovery(I)}return this.options.verifyWithServer&&O&&(O=await this._verifyWithServer(O)),this.options.replayQueue&&O&&await this._replayQueue(),this.stats.recoveriesSuccessful++,this.stats.statesRestored++,this.stats.lastRecoveryTime=Date.now(),this.stats.lastRecoveryDuration=Date.now()-A,this.state=eA.COMPLETED,P.info("Recovery completed",{duration:this.stats.lastRecoveryDuration,hasState:!!O}),this._emit(WA.RECOVERY_COMPLETED,{duration:this.stats.lastRecoveryDuration,state:O}),O}catch(I){return this.state=eA.FAILED,this.stats.recoveriesFailed++,P.error("Recovery failed:",I),this._emit(WA.RECOVERY_FAILED,{error:I.message}),null}}async createCheckpoint(A,I={}){return this._createCheckpoint(A,I)}async listCheckpoints(){try{return await this.storage.getItem("checkpoints")||[]}catch{return[]}}async restoreFromCheckpoint(A){let O=(await this.listCheckpoints()).find(U=>U.id===A);return O?(P.info("Restoring from checkpoint",{id:A,timestamp:O.timestamp}),O.state):(P.warn("Checkpoint not found",{checkpointId:A}),null)}async clear(){await this.storage.clear(),this.checkpoints=[],this.currentState=null,P.info("Recovery state cleared")}getStats(){return{...this.stats,state:this.state,sessionId:this.sessionId,hasSavedState:!!this.currentState,checkpointCount:this.checkpoints.length,options:{...this.options}}}on(A,I){return this.listeners.has(A)||this.listeners.set(A,[]),this.listeners.get(A).push(I),()=>{let O=this.listeners.get(A)||[],U=O.indexOf(I);U!==-1&&O.splice(U,1)}}_generateSessionId(){let A=localStorage.getItem("websocket_session_id");if(A)return A;let I=V("sess");return localStorage.setItem("websocket_session_id",I),I}async _findRecoverableState(){try{let A=await this.storage.getItem("current_state");if(A&&!this._isStateExpired(A))return P.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 P.debug("Found checkpoint",{timestamp:U.timestamp}),{type:"checkpoint",state:U.state}}return null}catch(A){return P.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 P.info("Performing full recovery",{type:A.type,timestamp:I.timestamp}),this._emit(WA.RECOVERY_PROGRESS,{phase:"full",percent:50}),I.state}async _minimalRecovery(A){let I=A.state;P.info("Performing minimal recovery",{type:A.type});let O={},U=["userId","sessionToken","connectionId"];for(let E of U)I.state[E]&&(O[E]=I.state[E]);return this._emit(WA.RECOVERY_PROGRESS,{phase:"minimal",percent:75}),O}async _verifiedRecovery(A){let I=A.state;return P.info("Performing verified recovery"),I.state}async _connectionOnlyRecovery(A){let I=A.state;return P.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){P.info(`Replaying ${A.length} queued messages`);for(let I of A)await this.queue.add(I.data,{priority:I.priority,metadata:{recovered:!0}});this._emit(WA.RECOVERY_PROGRESS,{phase:"replay",count:A.length})}}async _createCheckpoint(A,I){try{let O=new N2(A,I),U=await this.storage.getItem("checkpoints")||[];U.push(O.toJSON()),U.sort((E,K)=>K.timestamp-E.timestamp),U.length>this.options.maxCheckpoints&&(U=U.slice(0,this.options.maxCheckpoints)),await this.storage.setItem("checkpoints",U),this.stats.checkpointsCreated++,P.debug("Checkpoint created",{id:O.id,size:O.size}),this._emit(WA.CHECKPOINT_CREATED,{id:O.id,timestamp:O.timestamp,size:O.size})}catch(O){P.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){P.error(`Error in ${A} listener:`,E)}})}destroy(){this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.storage.destroy(),this.queue.destroy(),this.listeners.clear(),P.info("RecoveryManager destroyed")}};function SI(N={}){return new I1(N)}function tI(N,A={}){let I=A2({dbName:"persistent_state",storeName:N,...A});return{async save(O){await I.setItem(N,{data:O,timestamp:Date.now()})},async load(){let O=await I.getItem(N);return(O==null?void 0:O.data)||null},async clear(){await I.removeItem(N)}}}var eI=z2;
|
|
1491
1491
|
//# sourceMappingURL=js_aide.cjs.js.map
|