@jayeshsadhwani/telemetry-sdk
Version:
A lightweight, configurable telemetry tracking library for JavaScript/TypeScript applications with comprehensive error handling, event batching, and graceful degradation
3 lines • 54.9 kB
JavaScript
'use strict';var _="[TelemetrySDK]",d="https://ingest.hyperlook.io/events/batch";var X=(i=>(i[i.ERROR=0]="ERROR",i[i.WARN=1]="WARN",i[i.INFO=2]="INFO",i[i.DEBUG=3]="DEBUG",i[i.SILENT=4]="SILENT",i))(X||{});var H=class{constructor(t={}){this.config={level:2,enableConsole:true,enableTimestamp:true,prefix:_,...t};}error(t,e){this.log(0,t,e);}warn(t,e){this.log(1,t,e);}info(t,e){this.log(2,t,e);}debug(t,e){this.log(3,t,e);}setLevel(t){this.config.level=t;}setConfig(t){this.config={...this.config,...t};}log(t,e,r){if(!this.config.enableConsole||t<(this.config.level??2))return;let o=this.formatMessage(t,e,r);switch(t){case 3:console.debug(o);break;case 2:console.info(o);break;case 1:console.warn(o);break;case 0:console.error(o);break}}formatMessage(t,e,r){if(this.config.formatter)return this.config.formatter(t,e,r);let o=this.config.enableTimestamp?`[${new Date().toISOString()}]`:"",i=`[${X[t]}]`,s=this.config.prefix||"",a=`${o}${s}${i} ${e}`;return r!==void 0&&(a+=` ${JSON.stringify(r)}`),a}};var A=null;function f(){return A||(A=new H),A}function V(n){A=n;}function K(n){return new H(n)}function Z(){return "event_"+Date.now()+"_"+Math.random().toString(36).substr(2,9)}function ee(n,t=8192){let e=f();if(!n||Object.keys(n).length===0)return n;let r={};for(let[p,g]of Object.entries(n))g!=null&&(typeof g=="string"&&g.trim()===""||Array.isArray(g)&&g.length,r[p]=g);if(Object.keys(r).length===0)return n;(r.message===void 0||r.message===null)&&(r.message="[No message]");let i=JSON.stringify(r).length;if(i<=t)return r;e.debug("Properties size limit exceeded, truncating",{originalSize:i,maxSizeBytes:t,propertyCount:Object.keys(r).length});let s={},a=Object.entries(r);a.sort(([p],[g])=>p==="message"?-1:g==="message"?1:p.localeCompare(g));for(let[p,g]of a)if(s[p]=g,JSON.stringify(s).length>t&&!Re(s,t)){Le(s,p);break}let u=JSON.stringify(s).length,l=Object.keys(r).length-Object.keys(s).length;return e.debug("Properties truncated successfully",{originalSize:i,finalSize:u,removedCount:l,remainingCount:Object.keys(s).length}),s}function Re(n,t){let e=JSON.stringify(n).length;if(e<=t)return true;let r=Object.entries(n).filter(([,o])=>typeof o=="string").sort(([,o],[,i])=>i.length-o.length);for(let[o,i]of r){if(typeof i!="string")continue;let s=i,a=Math.max(1,Math.floor(i.length*.1));for(;s.length>10&&e>t;)s=s.slice(0,-a),n[o]=s+"...",e=JSON.stringify(n).length;e>t&&(n[o]=s.slice(0,50)+"...",e=JSON.stringify(n).length),e>t&&o!=="message"&&(delete n[o],e=JSON.stringify(n).length);}return (!n.message||typeof n.message!="string")&&(n.message="[Message truncated]"),e<=t}function Le(n,t){let e=["message"];e.includes(t)||delete n[t];let r=Object.keys(n).filter(o=>!e.includes(o));for(let o of r)if(delete n[o],JSON.stringify(n).length<=8192)break;n.message||(n.message="[Properties truncated]");}function te(n){let t=n.payload||{},r=ee(t),o={event_id:Z(),event_type:n.eventType,event_name:n.eventName,properties:r,user_properties:null,timestamp:n.timestamp};return n.userId&&(o.user_id=n.userId),n.sessionId&&(o.session_id=n.sessionId),typeof window<"u"&&(o.page_url=window.location.href),typeof document<"u"&&(o.page_title=document.title,o.referrer=document.referrer),typeof window<"u"&&window.navigator&&(o.user_agent=window.navigator.userAgent),o}var z=class{constructor(t){this.logger=f();this.apiKey=t,this.logger.debug("HyperlookExporter initialized",{endpoint:d});}async export(t,e){if(!t.length){this.logger.debug("No events to export to Hyperlook");return}this.logger.debug("Exporting events to Hyperlook",{endpoint:d,eventCount:t.length});try{let o={events:t.map(a=>te(a))};this.logger.debug("Sending payload to Hyperlook",{payload:JSON.stringify(o,null,2)});let i=new AbortController,s=setTimeout(()=>i.abort(),3e4);try{let a=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","X-API-Key":this.apiKey},body:JSON.stringify(o),signal:i.signal});if(clearTimeout(s),!a.ok){let u=await a.text();throw new Error(`HTTP ${a.status}: ${u}`)}this.logger.debug("Hyperlook export successful",{status:a.status,eventCount:t.length});}catch(a){throw clearTimeout(s),this.logger.error("Hyperlook export failed",{endpoint:d,error:a instanceof Error?a.message:String(a),errorStack:a instanceof Error?a.stack:void 0,eventCount:t.length}),a}}catch(r){throw this.logger.error("Hyperlook export failed",{endpoint:d,error:r instanceof Error?r.message:String(r),errorStack:r instanceof Error?r.stack:void 0,eventCount:t.length}),r}}};var M=class{constructor(){this.logger=f();this.logger.debug("HttpExporter initialized");}async export(t,e){if(!e||e.trim()===""){this.logger.warn("HTTP export skipped - no endpoint configured",{eventCount:t.length});return}this.logger.debug("Exporting events via HTTP",{endpoint:e,eventCount:t.length});try{let r=new AbortController,o=setTimeout(()=>r.abort(),3e4);try{let i=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:t}),signal:r.signal});if(clearTimeout(o),!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);this.logger.debug("HTTP export successful",{status:i.status,eventCount:t.length});}catch(i){throw clearTimeout(o),this.logger.error("HTTP export failed",{endpoint:e,error:i instanceof Error?i.message:String(i),errorStack:i instanceof Error?i.stack:void 0,eventCount:t.length}),i}}catch(r){throw this.logger.error("HTTP export failed",{endpoint:e,error:r instanceof Error?r.message:String(r),errorStack:r instanceof Error?r.stack:void 0,eventCount:t.length}),r}}};function w(n,t){if(typeof n!="string")throw new Error(`${t} must be a string`);let e="";for(let r=0;r<n.length;r++){let o=n.charCodeAt(r);(o>31&&o!==127||o===10||o===13)&&(e+=n[r]);}if(e=e.trim(),e.length===0)throw new Error(`${t} cannot be empty`);if(e.length>1e3)throw new Error(`${t} is too long (max 1000 characters)`);return e}function F(n,t=new WeakSet){if(!n||typeof n!="object")throw new Error("Payload must be an object");if(t.has(n))throw new Error("Circular reference detected in payload");let e={},r=Object.keys(n);if(r.length>100)throw new Error("Payload has too many keys (max 100)");t.add(n);try{for(let o of r){let i=w(o,"payload key"),s=n[o];if(s!==null&&typeof s!="string"&&typeof s!="number"&&typeof s!="boolean"&&!Array.isArray(s)&&typeof s!="object")throw new Error(`Invalid payload value type for key '${i}'`);typeof s=="object"&&s!==null&&!Array.isArray(s)?e[i]=F(s,t):e[i]=s;}}finally{t.delete(n);}return e}function ne(n){if((n.exporters??["hyperlook"]).includes("hyperlook")&&!n.hyperlookApiKey)throw new Error("Hyperlook API key is required when Hyperlook exporter is enabled");if(n.samplingRate!==void 0&&(n.samplingRate<0||n.samplingRate>1))throw new Error("Sampling rate must be between 0 and 1");if(n.batchSize!==void 0&&n.batchSize<=0)throw new Error("Batch size must be greater than 0");if(n.flushInterval!==void 0&&n.flushInterval<0)throw new Error("Flush interval must be non-negative");if(n.maxRetries!==void 0&&n.maxRetries<0)throw new Error("Max retries must be non-negative");if(n.retryDelay!==void 0&&n.retryDelay<0)throw new Error("Retry delay must be non-negative")}function oe(){return `session_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}var c=class{constructor(){this.isEnabled=true;this.isInitialized=false;this.isDestroyed=false;this.logger=f();}initialize(t){try{if(this.isInitialized){this.logger.warn("Plugin already initialized",{pluginName:this.constructor.name});return}if(this.isDestroyed){this.logger.error("Cannot initialize destroyed plugin",{pluginName:this.constructor.name});return}if(!t)throw new Error("TelemetryManager is required for plugin initialization");this.manager=t,this.isSupported()?(this.setup(),this.isInitialized=!0,this.logger.debug("Plugin initialized",{pluginName:this.constructor.name})):(this.logger.warn("Plugin not supported in this environment",{pluginName:this.constructor.name}),this.isEnabled=!1);}catch(e){throw this.logger.error("Failed to initialize plugin",{pluginName:this.constructor.name,error:e instanceof Error?e.message:String(e)}),this.isEnabled=false,e}}safeCapture(t){try{if(!this.isEnabled){this.logger.debug("Plugin is disabled, skipping event capture",{pluginName:this.constructor.name,eventType:t.eventType,eventName:t.eventName});return}if(!this.isInitialized){this.logger.warn("Plugin not initialized, skipping event capture",{pluginName:this.constructor.name,eventType:t.eventType,eventName:t.eventName});return}if(this.isDestroyed){this.logger.warn("Plugin is destroyed, skipping event capture",{pluginName:this.constructor.name,eventType:t.eventType,eventName:t.eventName});return}if(!this.manager){this.logger.error("TelemetryManager not available",{pluginName:this.constructor.name,eventType:t.eventType,eventName:t.eventName});return}this.manager.capture(t);}catch(e){this.logger.error("Failed to capture event in plugin",{pluginName:this.constructor.name,eventType:t.eventType,eventName:t.eventName,error:e instanceof Error?e.message:String(e)});}}destroy(){try{if(this.isDestroyed)return;this.isDestroyed=!0,this.isEnabled=!1,this.isInitialized=!1,this.teardown&&this.teardown(),this.logger.debug("Plugin destroyed",{pluginName:this.constructor.name});}catch(t){this.logger.error("Failed to destroy plugin",{pluginName:this.constructor.name,error:t instanceof Error?t.message:String(t)});}}isPluginEnabled(){return this.isEnabled&&this.isInitialized&&!this.isDestroyed}};var x=class extends c{constructor(){super(...arguments);this.handler=e=>{try{let r=e.target;if(!r||!(r instanceof HTMLElement)){this.logger.debug("Click event target is not an HTMLElement, skipping",{targetType:r?typeof r:"null"});return}let o=r,i=o.getBoundingClientRect(),s={eventType:"interaction",eventName:"click",payload:{element:{tagName:o.tagName,id:o.id||null,className:o.className||null,textContent:o.textContent?.slice(0,100)||null,href:o.href||null,type:o.type||null,value:o.value||null,placeholder:o.placeholder||null,role:o.getAttribute("role")||null,ariaLabel:o.getAttribute("aria-label")||null,dataAttributes:Object.fromEntries(Array.from(o.attributes).filter(a=>a.name.startsWith("data-")).map(a=>[a.name,a.value]))},position:{x:e.clientX,y:e.clientY,pageX:e.pageX,pageY:e.pageY,screenX:e.screenX,screenY:e.screenY},boundingRect:{top:i.top,left:i.left,width:i.width,height:i.height},event:{button:e.button,buttons:e.buttons,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,type:e.type,timestamp:e.timeStamp},scrollX:window.scrollX,scrollY:window.scrollY},timestamp:new Date().toISOString()};this.logger.debug("Click event captured",{tag:o.tagName,id:o.id,coordinates:{x:e.clientX,y:e.clientY}}),this.safeCapture(s);}catch(r){this.logger.error("Failed to process click event",{error:r instanceof Error?r.message:String(r)});}};}isSupported(){return typeof window<"u"&&typeof document<"u"}setup(){if(!this.isSupported()){this.logger.warn("ClickPlugin not supported in this environment"),this.isEnabled=false;return}try{document.addEventListener("click",this.handler,!0),this.logger.info("ClickPlugin setup complete");}catch(e){this.logger.error("Failed to setup ClickPlugin",{error:e instanceof Error?e.message:String(e)}),this.isEnabled=false;}}teardown(){try{typeof document<"u"&&document.removeEventListener("click",this.handler,!0),this.logger.info("ClickPlugin teardown complete");}catch(e){this.logger.error("Failed to teardown ClickPlugin",{error:e instanceof Error?e.message:String(e)});}}};var R=class extends c{constructor(){super(...arguments);this.MAX_EVENT_TYPE_LENGTH=50;this.MAX_EVENT_NAME_LENGTH=100;this.MAX_PAYLOAD_SIZE=1e4;this.RESERVED_EVENT_TYPES=new Set(["system","internal","debug","telemetry","sdk"]);}isSupported(){return true}validateEventType(e){if(!e||typeof e!="string")throw new Error("Event type is required and must be a string");if(e.length>this.MAX_EVENT_TYPE_LENGTH)throw new Error(`Event type too long (max ${this.MAX_EVENT_TYPE_LENGTH} characters)`);if(!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(e))throw new Error("Event type must start with a letter and contain only letters, numbers, and underscores");if(this.RESERVED_EVENT_TYPES.has(e.toLowerCase()))throw new Error(`Event type '${e}' is reserved and cannot be used`)}validateEventName(e){if(!e||typeof e!="string")throw new Error("Event name is required and must be a string");if(e.length>this.MAX_EVENT_NAME_LENGTH)throw new Error(`Event name too long (max ${this.MAX_EVENT_NAME_LENGTH} characters)`);if(!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(e))throw new Error("Event name must start with a letter and contain only letters, numbers, and underscores")}validatePayload(e){if(e==null)throw new Error("Payload cannot be null or undefined");if(typeof e!="object")throw new Error("Payload must be an object");if(Array.isArray(e))throw new Error("Payload cannot be an array");if(JSON.stringify(e).length>this.MAX_PAYLOAD_SIZE)throw new Error(`Payload too large (max ${this.MAX_PAYLOAD_SIZE} bytes)`)}captureCustomEvent(e,r,o){try{this.validateEventType(e),this.validateEventName(r),this.validatePayload(o);let i=this.manager.getUserId(),s=this.manager.getSessionId(),a=w(e,"eventType"),u=w(r,"eventName"),l=F(o),p={eventType:a,eventName:u,payload:l,timestamp:new Date().toISOString(),...s&&{sessionId:s},...i&&{userId:i}};this.logger.debug("Custom event captured",{eventType:a,eventName:u,payloadKeys:Object.keys(l)}),this.safeCapture(p);}catch(i){this.logger.error("Failed to capture custom event",{eventType:e,eventName:r,error:i instanceof Error?i.message:String(i)});}}captureEvent(e){try{if(!e||typeof e!="object")throw new Error("Event must be a valid TelemetryEvent object");if(this.validateEventType(e.eventType),this.validateEventName(e.eventName),this.validatePayload(e.payload),!e.timestamp||typeof e.timestamp!="string")throw new Error("Event timestamp is required and must be a string");if(!/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$/.test(e.timestamp))throw new Error("Invalid timestamp format. Expected ISO 8601 format");this.logger.debug("Custom event captured",{eventType:e.eventType,eventName:e.eventName,payloadKeys:Object.keys(e.payload)}),this.safeCapture(e);}catch(r){this.logger.error("Failed to capture custom event",{eventType:e?.eventType,eventName:e?.eventName,error:r instanceof Error?r.message:String(r)});}}setup(){this.logger.info("CustomEventsPlugin setup complete");}};var L=class extends c{constructor(){super(...arguments);this.errorHandler=e=>{try{let r=e.error,o;r&&typeof r=="object"&&"stack"in r&&typeof r.stack=="string"&&(o=r.stack);let i={eventType:"error",eventName:"javascript_error",payload:{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error?JSON.stringify(e.error):void 0,stack:o},timestamp:new Date().toISOString()};this.logger.debug("JavaScript error captured",{message:e.message,filename:e.filename,lineno:e.lineno}),this.safeCapture(i);}catch(r){this.logger.error("Failed to process JavaScript error",{error:r instanceof Error?r.message:String(r)});}};this.unhandledRejectionHandler=e=>{try{let o={eventType:"error",eventName:"unhandled_promise_rejection",payload:{reason:JSON.stringify(e.reason),promise:e.promise},timestamp:new Date().toISOString()};this.logger.debug("Unhandled promise rejection captured",{reason:JSON.stringify(e.reason)}),this.safeCapture(o);}catch(r){this.logger.error("Failed to process unhandled promise rejection",{error:r instanceof Error?r.message:String(r)});}};}isSupported(){return typeof window<"u"}setup(){if(!this.isSupported()){this.logger.warn("ErrorPlugin not supported in this environment"),this.isEnabled=false;return}try{window.addEventListener("error",this.errorHandler),window.addEventListener("unhandledrejection",this.unhandledRejectionHandler),this.logger.info("ErrorPlugin setup complete");}catch(e){this.logger.error("Failed to setup ErrorPlugin",{error:e instanceof Error?e.message:String(e)}),this.isEnabled=false;}}teardown(){try{typeof window<"u"&&(window.removeEventListener("error",this.errorHandler),window.removeEventListener("unhandledrejection",this.unhandledRejectionHandler)),this.logger.info("ErrorPlugin teardown complete");}catch(e){this.logger.error("Failed to teardown ErrorPlugin",{error:e instanceof Error?e.message:String(e)});}}};var ie=n=>n.map(t=>{try{if(typeof t=="string")return t.replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/");if(typeof t=="object"&&t!==null){let e=JSON.stringify(t,(r,o)=>typeof o=="string"?o.replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/"):o);return typeof e=="string"?e:"[Object]"}return String(t)}catch{return "[Object]"}});var Ce=(n,t)=>{let{originals:e,safeCapture:r}=t;return (...o)=>{let i=e[n];i&&i.apply(console,o);let s=ie(o),a=s.join(" ");if(!a.includes(_)){let u;switch(n){case "log":u="console_log";break;case "warn":u="console_warn";break;case "error":u="console_error";break;case "info":u="console_info";break;case "debug":u="console_debug";break;default:u="console_log";}let l=a.trim()||`[${n.toUpperCase()}] No message provided`,p=s.length>0?s.map(h=>{if(typeof h=="object")try{return JSON.stringify(h)}catch{return String(h)}return String(h)}):[`[${n.toUpperCase()}] No arguments provided`];(!l||l.trim()==="")&&(l=`[${n.toUpperCase()}] Empty message`);let g={eventType:"console",eventName:u,payload:{message:l,args:p,stack:new Error().stack?.split(`
`).slice(2,7)||[]},timestamp:new Date().toISOString()};r(g);}}},se=n=>{["log","info","warn","error","debug"].forEach(e=>{n.originals[e]=console[e].bind(console),console[e]=Ce(e,n);});};var k=class extends c{constructor(){super(...arguments);this.originals={};}isSupported(){return typeof console<"u"}setup(){if(!this.isSupported()){this.logger.warn("LogPlugin not supported in this environment"),this.isEnabled=false;return}try{se({originals:this.originals,safeCapture:this.safeCapture.bind(this)}),this.logger.info("LogPlugin setup complete");}catch(e){this.logger.error("Failed to setup LogPlugin",{error:e instanceof Error?e.message:String(e)}),this.isEnabled=false;}}teardown(){try{Object.keys(this.originals).forEach(e=>{let r=this.originals[e];r&&(console[e]=r);}),this.logger.info("LogPlugin teardown complete");}catch(e){this.logger.error("Failed to teardown LogPlugin",{error:e instanceof Error?e.message:String(e)});}}};var S=n=>{try{let t=new URL(n,typeof window<"u"?window.location.origin:""),e={};return t.searchParams.forEach((r,o)=>{e[o]=r;}),e}catch{return {}}};var ae=n=>{let t={};try{n.headers.forEach((e,r)=>{t[r.toLowerCase()]=e;});}catch{}return t},le=n=>{let t={};try{let e=n.getAllResponseHeaders();e&&e.split(`\r
`).forEach(r=>{let[o,i]=r.split(": ");o&&i&&(t[o.toLowerCase()]=i);});}catch{}return t};var ue=async n=>{try{if(n.bodyUsed)return null;let e=await n.clone().text();if(e)try{return JSON.parse(e)}catch{return e}}catch{return null}return null},ge=n=>{try{let t=n.responseText;if(t)try{return JSON.parse(t)}catch{return t}}catch{return null}return null};var v=n=>{try{let e=new URL(n,typeof window<"u"?window.location.origin:"").hostname.toLowerCase();return e.includes("supabase.co")||e.includes("supabase.com")}catch{return false}};var Y={endpoint:"https://api.your-domain.com/telemetry",hyperlookApiKey:"your-hyperlook-api-key-here",exporters:["hyperlook"],enablePageViews:true,batchSize:5,enableClicks:true,enableLogs:true,enableNetwork:true,enablePerformance:true,enableErrors:true,enableCustomEvents:false,flushInterval:1e4,maxRetries:3,retryDelay:1e3,samplingRate:1};var $=n=>{let t={};return n.headers.forEach((e,r)=>{t[r]=e;}),t};var G=async n=>{try{let e=await n.clone().text();return e.length>1e3?e.substring(0,1e3)+"...":e}catch{return ""}};var q=n=>{try{let t=new URL(n,typeof window<"u"?window.location.origin:"http://localhost"),e={};return t.searchParams.forEach((r,o)=>{e[o]=r;}),e}catch{return {}}};var E=[],pe=false,W=()=>{if(pe)return;let n=typeof window<"u"?window.fetch:globalThis.fetch,t=async(e,r)=>{let o=performance.now(),i;typeof e=="string"?i=e:e instanceof URL?i=e.toString():typeof e.url=="string"?i=e.url:i=JSON.stringify(e);let s=r?.method||"GET";if(i.includes(d))return n.call(typeof window<"u"?window:globalThis,e,r);try{let a=await n.call(typeof window<"u"?window:globalThis,e,r),u=performance.now(),l=v(i),p=l?"supabase":"network",g=l?"supabase_fetch_complete":"fetch_complete";return E.push({eventType:p,eventName:g,payload:{url:i,method:s,responseStatus:a.status,responseStatusText:a.statusText,responseHeaders:$(a),responseBody:await G(a),duration:u-o,startTime:o,endTime:u,isSupabaseQuery:l,queryParams:q(i)},timestamp:new Date().toISOString()}),a}catch(a){let u=performance.now(),l=v(i),p=l?"supabase":"network",g=l?"supabase_fetch_error":"fetch_error";throw E.push({eventType:p,eventName:g,payload:{url:i,method:s,error:a instanceof Error?a.message:String(a),duration:u-o,startTime:o,endTime:u,isSupabaseQuery:l,queryParams:q(i)},timestamp:new Date().toISOString()}),a}};typeof window<"u"?window.fetch=t:globalThis.fetch=t,pe=true;};var Ne=n=>{let{originalFetch:t,telemetryEndpoint:e,safeCapture:r}=n,o=async(s,a)=>{let u=performance.now(),l;typeof s=="string"?l=s:s instanceof URL?l=s.toString():typeof s.url=="string"?l=s.url:l=JSON.stringify(s);let p=a?.method||"GET";if(l.includes(d))return t.call(typeof window<"u"?window:globalThis,s,a);try{let g=await t.call(typeof window<"u"?window:globalThis,s,a),h=performance.now(),T=h-u;if(!e||!l.includes(e)){let m=v(l),P={eventType:m?"supabase":"network",eventName:m?"supabase_fetch_complete":"fetch_complete",payload:{url:l,method:p,queryParams:S(l),responseStatus:g.status,responseStatusText:g.statusText,responseHeaders:ae(g),responseBody:await ue(g),duration:T,startTime:u,endTime:h,isSupabaseQuery:m},timestamp:new Date().toISOString()};r(P);}return g}catch(g){let h=performance.now(),T=h-u;if(!e||!l.includes(e)){let m=v(l),P={eventType:m?"supabase":"network",eventName:m?"supabase_fetch_error":"fetch_error",payload:{url:l,method:p,queryParams:S(l),error:g instanceof Error?g.message:String(g),duration:T,startTime:u,endTime:h,isSupabaseQuery:m},timestamp:new Date().toISOString()};r(P);}throw g}};Object.setPrototypeOf(o,Object.getPrototypeOf(t));let i=Object.getOwnPropertyDescriptors(t);return Object.defineProperties(o,i),o},ce=n=>{let t=Ne(n),e=typeof window<"u"?window.fetch:globalThis.fetch;return typeof window<"u"?window.fetch=t:globalThis.fetch=t,()=>{typeof window<"u"?window.fetch=e:globalThis.fetch=e;}};var Ie=n=>{let{patchedXHRs:t}=n,e=(...r)=>XMLHttpRequest.prototype.open.apply(void 0,r);return function(r,o,i,s,a){return typeof o=="string"&&o.includes(d)?e.call(this,r,o,i??true,s,a):(this._telemetryMethod=r,this._telemetryUrl=typeof o=="string"?o:String(o),this._telemetryStartTime=performance.now(),t.add(this),e.call(this,r,o,i??true,s,a))}},Oe=n=>{let{telemetryEndpoint:t,safeCapture:e,xhrHandlers:r}=n,o=(...i)=>XMLHttpRequest.prototype.send.apply(void 0,i);return function(i){let s=this._telemetryStartTime,a=this._telemetryMethod,u=this._telemetryUrl;if(!t||!u.includes(t)){let l=v(u),p=false,g=function(){if(p)return;p=true;let y=performance.now(),b=y-s,O={eventType:l?"supabase":"network",eventName:l?"supabase_xhr_complete":"xhr_complete",payload:{url:u,method:a,queryParams:S(u),responseStatus:this.status,responseStatusText:this.statusText,responseHeaders:le(this),responseBody:ge(this),duration:b,startTime:s,endTime:y,isSupabaseQuery:l},timestamp:new Date().toISOString()};e(O),m();},h=function(){if(p)return;p=true;let y=performance.now(),b=y-s,O={eventType:l?"supabase":"network",eventName:l?"supabase_xhr_error":"xhr_error",payload:{url:u,method:a,queryParams:S(u),responseStatus:this.status,responseStatusText:this.statusText,error:"XHR request failed",duration:b,startTime:s,endTime:y,isSupabaseQuery:l},timestamp:new Date().toISOString()};e(O),m();},T=function(){if(p)return;p=true;let y=performance.now(),b=y-s,O={eventType:l?"supabase":"network",eventName:l?"supabase_xhr_error":"xhr_error",payload:{url:u,method:a,queryParams:S(u),responseStatus:this.status,responseStatusText:this.statusText,error:"XHR request aborted",duration:b,startTime:s,endTime:y,isSupabaseQuery:l},timestamp:new Date().toISOString()};e(O),m();},m=()=>{this.removeEventListener("load",g),this.removeEventListener("error",h),this.removeEventListener("abort",T),r.delete(this);};r.set(this,m),this.addEventListener("load",g),this.addEventListener("error",h),this.addEventListener("abort",T);}return o.call(this,i)}},de=n=>{let t=Ie(n),e=Oe(n);return XMLHttpRequest.prototype.open=t,XMLHttpRequest.prototype.send=e,{originalOpen:t,originalSend:e}};var he=()=>typeof window<"u"?typeof fetch<"u"&&typeof XMLHttpRequest<"u":typeof fetch<"u",me=()=>typeof window<"u"?(window._originalFetch||(window._originalFetch=window.fetch),window._originalFetch||window.fetch):globalThis.fetch,fe=()=>function(n,t,e,r,o){return XMLHttpRequest.prototype.open.call(this,n,t,e===void 0?true:e,r,o)},ye=()=>function(n){return XMLHttpRequest.prototype.send.call(this,n)};var C=class extends c{constructor(){super();this.unregister=null;this.telemetryEndpoint="";this.xhrHandlers=new WeakMap;this.patchedXHRs=new Set;this.cleanupInterval=null;this.isSupported()&&(this.originalFetch=me(),typeof XMLHttpRequest<"u"&&(this.originalXHROpen=fe(),this.originalXHRSend=ye()));}isSupported(){return he()}initialize(e){super.initialize(e),this.telemetryEndpoint=e.getEndpoint();}setup(){if(!this.isSupported()){this.logger.warn("NetworkPlugin not supported in this environment"),this.isEnabled=false;return}try{if(this.unregister=ce({originalFetch:this.originalFetch,telemetryEndpoint:this.telemetryEndpoint,safeCapture:this.safeCapture.bind(this),logger:this.logger}),typeof XMLHttpRequest<"u"){let e=de({telemetryEndpoint:this.telemetryEndpoint,safeCapture:this.safeCapture.bind(this),xhrHandlers:this.xhrHandlers,patchedXHRs:this.patchedXHRs});this.originalXHROpen=e.originalOpen,this.originalXHRSend=e.originalSend,this.setupCleanupInterval();}this.logger.info("NetworkPlugin setup complete - early events handled by TelemetryManager"),this.logger.info("NetworkPlugin setup complete");}catch(e){this.logger.error("Failed to setup NetworkPlugin",{error:e instanceof Error?e.message:String(e)}),this.isEnabled=false;}}setupCleanupInterval(){this.cleanupInterval=setInterval(()=>{this.cleanupDeadXHRs();},3e4);}cleanupDeadXHRs(){try{let e=[];this.patchedXHRs.forEach(r=>{try{r.readyState===void 0&&e.push(r);}catch{e.push(r);}}),e.forEach(r=>{this.patchedXHRs.delete(r),this.xhrHandlers.delete(r);}),e.length>0&&this.logger.debug("Cleaned up dead XHR references",{cleanedCount:e.length,remainingCount:this.patchedXHRs.size});}catch(e){this.logger.error("Failed to cleanup dead XHRs",{error:e instanceof Error?e.message:String(e)});}}teardown(){try{if(this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null),this.unregister&&(this.unregister(),this.unregister=null),typeof XMLHttpRequest<"u"&&this.originalXHROpen&&this.originalXHRSend)try{XMLHttpRequest.prototype.open=this.originalXHROpen,XMLHttpRequest.prototype.send=this.originalXHRSend;}catch(e){this.logger.error("Failed to restore XMLHttpRequest prototypes",{error:e instanceof Error?e.message:String(e)});}this.cleanupAllXHRHandlers(),this.logger.info("NetworkPlugin teardown complete");}catch(e){this.logger.error("Failed to teardown NetworkPlugin",{error:e instanceof Error?e.message:String(e)});}}cleanupAllXHRHandlers(){try{let e=0;this.patchedXHRs.forEach(r=>{try{let o=this.xhrHandlers.get(r);o&&(o(),e++);}catch(o){this.logger.debug("Failed to cleanup XHR handler",{error:o instanceof Error?o.message:String(o)});}}),this.patchedXHRs.clear(),this.xhrHandlers=new WeakMap,this.logger.debug("Cleaned up XHR handlers",{cleanedCount:e});}catch(e){this.logger.error("Failed to cleanup XHR handlers",{error:e instanceof Error?e.message:String(e)});}}};var ve=()=>{let n=performance.getEntriesByType("navigation")[0];if(!n)throw new Error("Navigation Timing API not supported");return {navigationStart:n.startTime,unloadEventStart:n.unloadEventStart,unloadEventEnd:n.unloadEventEnd,redirectStart:n.redirectStart,redirectEnd:n.redirectEnd,fetchStart:n.fetchStart,domainLookupStart:n.domainLookupStart,domainLookupEnd:n.domainLookupEnd,connectStart:n.connectStart,connectEnd:n.connectEnd,secureConnectionStart:n.secureConnectionStart,requestStart:n.requestStart,responseStart:n.responseStart,responseEnd:n.responseEnd,domLoading:n.domContentLoadedEventStart,domInteractive:n.domInteractive,domContentLoadedEventStart:n.domContentLoadedEventStart,domContentLoadedEventEnd:n.domContentLoadedEventEnd,domComplete:n.domComplete,loadEventStart:n.loadEventStart,loadEventEnd:n.loadEventEnd,dnsTime:n.domainLookupEnd-n.domainLookupStart,tcpTime:n.connectEnd-n.connectStart,requestTime:n.responseStart-n.requestStart,responseTime:n.responseEnd-n.responseStart,domParsingTime:n.domComplete-n.domInteractive,domContentLoadedTime:n.domContentLoadedEventEnd-n.startTime,loadCompleteTime:n.loadEventEnd-n.startTime,totalPageLoadTime:n.loadEventEnd-n.startTime,resourceCount:0,resourceLoadTimes:[]}};var we=()=>performance.getEntriesByType("resource").map(t=>({name:t.name,duration:t.duration,size:t.transferSize||0,type:t.initiatorType}));var Ee=()=>{let n={},t=performance.getEntriesByType("navigation")[0];t&&(n.ttfb=t.responseStart-t.requestStart);let e=performance.getEntriesByName("first-contentful-paint")[0];e&&(n.fcp=e.startTime);let r=performance.getEntriesByType("largest-contentful-paint");r.length>0&&(n.lcp=r[r.length-1].startTime);let o=performance.getEntriesByType("first-input");if(o.length>0){let i=o[0];n.fid=i.processingStart-i.startTime;}return n};var Te=n=>{let{safeCapture:t,logger:e}=n;if(!("PerformanceObserver"in window))return null;try{let r=new PerformanceObserver(o=>{o.getEntries().forEach(i=>{try{let s={eventType:"performance",eventName:"long_task",payload:{duration:i.duration,startTime:i.startTime,name:i.name},timestamp:new Date().toISOString()};t(s);}catch(s){e.warn("Failed to capture long task",{error:s instanceof Error?s.message:String(s)});}});});return r.observe({entryTypes:["longtask"]}),r}catch(r){return e.warn("Long task monitoring not supported",{error:r instanceof Error?r.message:String(r)}),null}},be=n=>{let{safeCapture:t,logger:e}=n;if(!("PerformanceObserver"in window))return null;try{let r=new PerformanceObserver(o=>{o.getEntries().forEach(i=>{try{let s=i,a={eventType:"performance",eventName:"layout_shift",payload:{value:s.value,sources:s.sources,startTime:s.startTime},timestamp:new Date().toISOString()};t(a);}catch(s){e.warn("Failed to capture layout shift",{error:s instanceof Error?s.message:String(s)});}});});return r.observe({entryTypes:["layout-shift"]}),r}catch(r){return e.warn("Layout shift monitoring not supported",{error:r instanceof Error?r.message:String(r)}),null}};var Se=()=>typeof window<"u"&&typeof performance<"u"&&typeof document<"u",He=()=>document.readyState==="complete",Pe=n=>{He()?n():window.addEventListener("load",n);};var N=class extends c{constructor(){super(...arguments);this.hasCapturedInitialMetrics=false;this.longTaskObserver=null;this.layoutShiftObserver=null;this.pageLoadTimeout=null;this.capturePerformanceMetrics=()=>{try{if(this.hasCapturedInitialMetrics)return;this.hasCapturedInitialMetrics=!0,this.pageLoadTimeout&&(clearTimeout(this.pageLoadTimeout),this.pageLoadTimeout=null);let e=ve(),r=we();e.resourceCount=r.length,e.resourceLoadTimes=r;let o=Ee(),i={...e,...o},s={eventType:"page",eventName:"page_load",payload:i,timestamp:new Date().toISOString()};this.logger.debug("Performance metrics captured",{totalPageLoadTime:i.totalPageLoadTime,resourceCount:i.resourceCount,ttfb:i.ttfb}),this.safeCapture(s);}catch(e){this.logger.error("Failed to capture performance metrics",{error:e instanceof Error?e.message:String(e)});}};}isSupported(){return Se()}setup(){if(!this.isSupported()){this.logger.warn("PerformancePlugin not supported in this environment"),this.isEnabled=false;return}try{Pe(()=>{this.capturePerformanceMetrics();}),this.pageLoadTimeout=setTimeout(()=>{this.hasCapturedInitialMetrics||(this.logger.warn("Page load timeout reached, capturing metrics anyway"),this.capturePerformanceMetrics());},1e4);try{this.longTaskObserver=Te({safeCapture:this.safeCapture.bind(this),logger:this.logger}),this.longTaskObserver?this.logger.debug("Long task observer setup successful"):this.logger.warn("Long task observer not supported");}catch(e){this.logger.error("Failed to setup long task observer",{error:e instanceof Error?e.message:String(e)});}try{this.layoutShiftObserver=be({safeCapture:this.safeCapture.bind(this),logger:this.logger}),this.layoutShiftObserver?this.logger.debug("Layout shift observer setup successful"):this.logger.warn("Layout shift observer not supported");}catch(e){this.logger.error("Failed to setup layout shift observer",{error:e instanceof Error?e.message:String(e)});}this.logger.info("PerformancePlugin setup complete");}catch(e){this.logger.error("Failed to setup PerformancePlugin",{error:e instanceof Error?e.message:String(e)}),this.isEnabled=false;}}teardown(){try{this.pageLoadTimeout&&(clearTimeout(this.pageLoadTimeout),this.pageLoadTimeout=null);try{window.removeEventListener("load",this.capturePerformanceMetrics);}catch(e){this.logger.debug("Failed to remove load event listener",{error:e instanceof Error?e.message:String(e)});}if(this.longTaskObserver){try{this.longTaskObserver.disconnect(),this.logger.debug("Long task observer disconnected");}catch(e){this.logger.error("Failed to disconnect long task observer",{error:e instanceof Error?e.message:String(e)});}this.longTaskObserver=null;}if(this.layoutShiftObserver){try{this.layoutShiftObserver.disconnect(),this.logger.debug("Layout shift observer disconnected");}catch(e){this.logger.error("Failed to disconnect layout shift observer",{error:e instanceof Error?e.message:String(e)});}this.layoutShiftObserver=null;}this.logger.info("PerformancePlugin teardown complete");}catch(e){this.logger.error("Failed to teardown PerformancePlugin",{error:e instanceof Error?e.message:String(e)});}}};var I=class extends c{constructor(){super();this.hasCapturedInitialPageView=false;this.lastUrl=null;this.lastTitle=null;this.popstateListener=null;this.navigationTimeout=null;this.originalPushState=null;this.originalReplaceState=null;this.navigationListener=null;this.capturePageView=(e=false)=>{try{if(typeof window>"u"||typeof document>"u")return;let r=window.location.href,o=document.title;if(!e&&this.hasCapturedInitialPageView||e&&this.lastUrl===r&&this.lastTitle===o)return;e||(this.hasCapturedInitialPageView=!0),this.lastUrl=r,this.lastTitle=o;let i=typeof window<"u"&&window.navigator?window.navigator:void 0,s={eventType:"page",eventName:"page_hit",payload:{viewport:{width:window.innerWidth,height:window.innerHeight,devicePixelRatio:window.devicePixelRatio},characterSet:document.characterSet,language:i?i.language:"",cookieEnabled:i?i.cookieEnabled:!1,onLine:i?i.onLine:!1,platform:i?i.platform:"",userAgent:i?i.userAgent:"",referrer:document.referrer,url:r,title:o,isNavigation:e},timestamp:new Date().toISOString()};this.logger.debug("Page view event captured",{url:r,title:o,viewport:{width:window.innerWidth,height:window.innerHeight},isNavigation:e}),this.safeCapture(s);}catch(r){this.logger.error("Failed to capture page view event",{error:r instanceof Error?r.message:String(r)});}};this.captureInitialPageView=()=>{this.capturePageView(false);};this.handleNavigation=()=>{this.navigationTimeout&&clearTimeout(this.navigationTimeout),this.navigationTimeout=setTimeout(()=>{this.capturePageView(true),this.navigationTimeout=null;},100);};this.domContentLoadedListener=()=>{try{if(typeof window>"u"||typeof document>"u")return;let e=window.location.href,r=document.title;if(this.hasCapturedInitialPageView)return;this.hasCapturedInitialPageView=!0,this.lastUrl=e,this.lastTitle=r;let o=typeof window<"u"&&window.navigator?window.navigator:void 0,i={eventType:"page",eventName:"page_hit",payload:{viewport:{width:window.innerWidth,height:window.innerHeight,devicePixelRatio:window.devicePixelRatio},characterSet:document.characterSet,language:o?o.language:"",cookieEnabled:o?o.cookieEnabled:!1,onLine:o?o.onLine:!1,platform:o?o.platform:"",userAgent:o?o.userAgent:"",referrer:document.referrer,url:e,title:r,isNavigation:!1},timestamp:new Date().toISOString()};this.logger.debug("Page view event captured",{url:e,title:r,viewport:{width:window.innerWidth,height:window.innerHeight},isNavigation:!1}),this.safeCapture(i);}catch(e){this.logger.error("Failed to capture page view event",{error:e instanceof Error?e.message:String(e)});}},this.loadListener=()=>{if(!this.hasCapturedInitialPageView)try{if(typeof window>"u"||typeof document>"u")return;let e=window.location.href,r=document.title;this.hasCapturedInitialPageView=!0,this.lastUrl=e,this.lastTitle=r;let o=typeof window<"u"&&window.navigator?window.navigator:void 0,i={eventType:"page",eventName:"page_hit",payload:{viewport:{width:window.innerWidth,height:window.innerHeight,devicePixelRatio:window.devicePixelRatio},characterSet:document.characterSet,language:o?o.language:"",cookieEnabled:o?o.cookieEnabled:!1,onLine:o?o.onLine:!1,platform:o?o.platform:"",userAgent:o?o.userAgent:"",referrer:document.referrer,url:e,title:r,isNavigation:!1},timestamp:new Date().toISOString()};this.logger.debug("Page view event captured",{url:e,title:r,viewport:{width:window.innerWidth,height:window.innerHeight},isNavigation:!1}),this.safeCapture(i);}catch(e){this.logger.error("Failed to capture page view event",{error:e instanceof Error?e.message:String(e)});}};}isSupported(){return typeof window<"u"&&typeof document<"u"}setup(){if(!this.isSupported()){this.logger.warn("PageViewPlugin not supported in this environment"),this.isEnabled=false;return}try{this.lastUrl=window.location.href,this.lastTitle=document.title,document.readyState==="complete"?this.captureInitialPageView():(document.addEventListener("DOMContentLoaded",this.domContentLoadedListener),window.addEventListener("load",this.loadListener)),this.setupNavigationTracking(),this.logger.info("PageViewPlugin setup complete");}catch(e){this.logger.error("Failed to setup PageViewPlugin",{error:e instanceof Error?e.message:String(e)}),this.isEnabled=false;}}setupNavigationTracking(){try{this.popstateListener=()=>{this.handleNavigation();},window.addEventListener("popstate",this.popstateListener),this.setupHistoryTracking(),this.logger.debug("Navigation tracking setup complete");}catch(e){this.logger.error("Failed to setup navigation tracking",{error:e instanceof Error?e.message:String(e)});}}setupHistoryTracking(){try{this.originalPushState=window.history.pushState,this.originalReplaceState=window.history.replaceState,window.history.pushState=(...r)=>{if(!this.originalPushState)return;let o=this.originalPushState.apply(window.history,r);return window.dispatchEvent(new CustomEvent("telemetry-navigation",{detail:{type:"pushstate",args:r}})),o},window.history.replaceState=(...r)=>{if(!this.originalReplaceState)return;let o=this.originalReplaceState.apply(window.history,r);return window.dispatchEvent(new CustomEvent("telemetry-navigation",{detail:{type:"replacestate",args:r}})),o};let e=()=>{this.handleNavigation();};window.addEventListener("telemetry-navigation",e),this.navigationListener=e,this.logger.debug("History tracking setup complete");}catch(e){this.logger.error("Failed to setup history tracking",{error:e instanceof Error?e.message:String(e)});}}teardown(){try{this.navigationTimeout&&(clearTimeout(this.navigationTimeout),this.navigationTimeout=null),document.removeEventListener("DOMContentLoaded",this.domContentLoadedListener),window.removeEventListener("load",this.loadListener),this.popstateListener&&(window.removeEventListener("popstate",this.popstateListener),this.popstateListener=null),this.navigationListener&&(window.removeEventListener("telemetry-navigation",this.navigationListener),this.navigationListener=null),this.originalPushState&&(window.history.pushState=this.originalPushState,this.originalPushState=null),this.originalReplaceState&&(window.history.replaceState=this.originalReplaceState,this.originalReplaceState=null),this.logger.info("PageViewPlugin teardown complete");}catch(e){this.logger.error("Failed to teardown PageViewPlugin",{error:e instanceof Error?e.message:String(e)});}}};var B=class{constructor(t,e){this.plugins=[];this.logger=t,this.state=e;}initializePlugins(t){let e=[];try{[{enabled:t.enablePageViews??!0,plugin:I,name:"PageViewPlugin"},{enabled:t.enableClicks,plugin:x,name:"ClickPlugin"},{enabled:t.enableLogs,plugin:k,name:"LogPlugin"},{enabled:t.enableNetwork,plugin:C,name:"NetworkPlugin"},{enabled:t.enablePerformance,plugin:N,name:"PerformancePlugin"},{enabled:t.enableErrors??!0,plugin:L,name:"ErrorPlugin"},{enabled:t.enableCustomEvents,plugin:R,name:"CustomEventsPlugin",isCustomEvents:!0}].forEach(({enabled:o,plugin:i,isCustomEvents:s})=>{if(o){let a=new i;s&&(this.customEventsPlugin=a),e.push(a);}}),this.logger.info("Plugin initialization completed",{totalPlugins:e.length,enabledPlugins:e.map(o=>o.constructor.name)});}catch(r){throw this.logger.error("Failed to initialize plugins",{error:r instanceof Error?r.message:String(r)}),r}return e}register(t,e){try{this.validateState(),this.plugins.push(t),t.initialize(e),this.logger.debug("Plugin registered",{pluginName:t.constructor.name,totalPlugins:this.plugins.length});}catch(r){this.logger.error("Failed to register plugin",{pluginName:t.constructor.name,error:r instanceof Error?r.message:String(r)}),this.plugins.pop();}}validateState(){if(this.state==="shutdown"||this.state==="shutting_down")throw new Error(`TelemetryManager is in ${this.state} state and cannot register plugins`)}destroyAll(){for(let t of this.plugins)try{t.destroy?t.destroy():t.teardown&&t.teardown(),this.logger.debug("Plugin destroyed",{pluginName:t.constructor.name});}catch(e){this.logger.error("Plugin destruction failed",{pluginName:t.constructor.name,error:e instanceof Error?e.message:String(e)});}this.plugins=[];}getCustomEventsPlugin(){return this.customEventsPlugin}getPlugins(){return [...this.plugins]}setState(t){this.state=t;}};var D=class{constructor(t,e,r,o,i,s){this.eventQueue=[];this.buffer=[];this.isProcessingQueue=false;this.MAX_QUEUE_SIZE=1e4;this.MAX_BUFFER_SIZE=5e3;this.logger=t,this.state=e,this.samplingRate=r,this.batchSize=o,this.sessionId=i,s!==void 0&&(this.userId=s);}validateEvent(t){if(!t.eventType||typeof t.eventType!="string")throw new Error("Event type is required and must be a string");if(!t.eventName||typeof t.eventName!="string")throw new Error("Event name is required and must be a string");if(!t.payload||typeof t.payload!="object")throw new Error("Event payload is required and must be an object");if(!t.timestamp||typeof t.timestamp!="string")throw new Error("Event timestamp is required and must be a string");if(!/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$/.test(t.timestamp))throw new Error("Invalid timestamp format. Expected ISO 8601 format");return {...t,eventType:w(t.eventType,"eventType"),eventName:w(t.eventName,"eventName"),payload:F(t.payload)}}capture(t){try{this.validateState();let e=this.validateEvent(t);if(Math.random()>this.samplingRate)return this.logger.debug("Event dropped due to sampling",{eventType:e.eventType,eventName:e.eventName,samplingRate:this.samplingRate}),!1;let r={...e,sessionId:this.sessionId,...this.userId&&{userId:this.userId}};return this.eventQueue.length>=this.MAX_QUEUE_SIZE&&(this.logger.warn("Event queue full, dropping oldest event",{eventType:e.eventType,eventName:e.eventName,queueSize:this.eventQueue.length,maxQueueSize:this.MAX_QUEUE_SIZE}),this.eventQueue.shift()),this.eventQueue.push(r),this.logger.debug("Event queued",{eventType:e.eventType,eventName:e.eventName,queueSize:this.eventQueue.length,sessionId:this.sessionId,userId:this.userId}),!0}catch(e){return this.logger.error("Failed to capture event",{eventType:t.eventType,eventName:t.eventName,error:e instanceof Error?e.message:String(e)}),false}}processEventQueue(){if(!(this.isProcessingQueue||this.eventQueue.length===0)){this.isProcessingQueue=true;try{for(;this.eventQueue.length>0;){let t=this.eventQueue.shift();t&&(this.buffer.length>=this.MAX_BUFFER_SIZE&&(this.logger.warn("Buffer full, dropping oldest event",{eventType:t.eventType,eventName:t.eventName,bufferSize:this.buffer.length,maxBufferSize:this.MAX_BUFFER_SIZE}),this.buffer.shift()),this.buffer.push(t),this.logger.debug("Event processed and added to buffer",{eventType:t.eventType,eventName:t.eventName,bufferSize:this.buffer.length}));}}catch(t){this.logger.error("Error processing event queue",{error:t instanceof Error?t.message:String(t)});}finally{this.isProcessingQueue=false;}}}getBatchForExport(){return this.buffer.splice(0)}returnBatchToBuffer(t){this.buffer.unshift(...t);}isBufferFull(){return this.buffer.length>=this.batchSize}getBufferSize(){return this.buffer.length}getQueueSize(){return this.eventQueue.length}validateState(){if(this.state==="shutdown"||this.state==="shutting_down")throw new Error(`TelemetryManager is in ${this.state} state and cannot process events`)}setState(t){this.state=t;}clear(){this.buffer=[],this.eventQueue=[];}};var U=class{constructor(t,e=5,r=3e4){this.logger=t,this.state={consecutiveFailures:0,maxConsecutiveFailures:e,circuitBreakerTimeout:r,lastFailureTime:0,isCircuitOpen:false};}isOpen(){return this.state.isCircuitOpen?Date.now()-this.state.lastFailureTime>this.state.circuitBreakerTimeout?(this.reset(),this.logger.info("Circuit breaker reset - attempting to export events again"),false):true:false}recordSuccess(){this.state.consecutiveFailures=0,this.state.isCircuitOpen=false;}recordFailure(){this.state.consecutiveFailures++,this.state.lastFailureTime=Date.now(),this.state.consecutiveFailures>=this.state.maxConsecutiveFailures&&(this.state.isCircuitOpen=true,this.logger.error("Circuit breaker opened due to consecutive failures",{consecutiveFailures:this.state.consecutiveFailures,maxConsecutiveFailures:this.state.maxConsecutiveFailures}));}reset(){this.state.isCircuitOpen=false,this.state.consecutiveFailures=0;}getState(){return {...this.state}}};var j=class{constructor(t,e,r=3,o=1e3,i){this.exporters=[];this.isFlushing=false;this.logger=t,this.exporters=e,i&&(this.endpoint=i),this.maxRetries=r,this.retryDelay=o,this.circuitBreaker=new U(t);}async flush(t){if(!t.length)return this.logger.debug("No events to flush"),{success:true,shouldReturnToBuffer:false};if(this.isFlushing)return this.logger.debug("Flush already in progress, skipping"),{success:false,shouldReturnToBuffer:false};if(this.circuitBreaker.isOpen())return this.logger.warn("Circuit breaker is open, skipping flush",{consecutiveFailures:this.circuitBreaker.getState().consecutiveFailures,lastFailureTime:this.circuitBreaker.getState().lastFailureTime}),{success:false,shouldReturnToBuffer:false};this.isFlushing=true;try{this.logger.info("Flushing events",{eventCount:t.length,events:t.map(o=>({type:o.eventType,name:o.eventName})),exporters:this.exporters.length});let e=0,r=[];for(;e<=this.maxRetries;){let o=await Promise.all(this.exporters.map(async s=>{try{return await s.export(t,this.endpoint),{success:!0}}catch(a){return {success:!1,error:a}}})),i=o.some(s=>s.success);if(r=o.filter(s=>!s.success).map(s=>s.error),i)return this.circuitBreaker.recordSuccess(),this.logger.info("Events exported successfully to at least one exporter",{eventCount:t.length,retries:e}),{success:!0,shouldReturnToBuffer:!1};if(e++,this.circuitBreaker.recordFailure(),this.logger.error("Failed to export events to all exporters",{eventCount:t.length,retry:e,maxRetries:this.maxRetries,consecutiveFailures:this.circuitBreaker.getState().consecutiveFailures,errors:r.map(s=>s instanceof Error?s.message:String(s))}),e<=this.maxRetries)await new Promise(s=>setTimeout(s,this.retryDelay*e));else return this.circuitBreaker.isOpen()?(this.logger.error("Max retries exceeded, circuit breaker open, events dropped",{eventCount:t.length}),{success:!1,shouldReturnToBuffer:!1}):(this.logger.error("Max retries exceeded, events returned to buffer",{eventCount:t.length}),{success:!1,shouldReturnToBuffer:!0})}return {success:!1,shouldReturnToBuffer:!1}}finally{this.isFlushing=false;}}setExporters(t){this.exporters=t;}getCircuitBreakerState(){return this.circuitBreaker.getState()}};W();var Q=class{constructor(t){this.state="initializing";this.failedEvents=[];this.maxFailedEvents=1e3;if(ne(t),t.logging){let i=K(t.logging);V(i);}this.logger=f(),this.sessionId=t.sessionId??oe(),t.userId!==void 0&&(this.userId=t.userId),this.flushInterval=t.flushInterval??3e4,this.pluginManager=new B(this.logger,this.state),this.eventProcessor=new D(this.logger,this.state,t.samplingRate??1,t.batchSize??50,this.sessionId,this.userId);let e=[],r=t.exporters??["hyperlook"];for(let i of r)if(i==="hyperlook"){if(!t.hyperlookApiKey)throw new Error("Hyperlook API key is required when Hyperlook exporter is enabled");e.push(new z(t.hyperlookApiKey));}else i==="http"&&e.push(new M);this.exportManager=new j(this.logger,e,t.maxRetries??3,t.retryDelay??1e3,t.endpoint),this.pluginManager.initializePlugins(t).forEach(i=>{this.pluginManager.register(i,this);}),this.processEarlyEventQueue(),this.state="running",this.pluginManager.setState(this.state),this.eventProcessor.setState(this.state),this.startFlushTimer(),this.logger.info("TelemetryManager initialized",{endpoint:d,batchSize:t.batchSize??50,flushInterval:this.flushInterval,maxRetries:t.maxRetries??3,samplingRate:t.samplingRate??1,enablePageViews:t.enablePageViews,enableClicks:t.enableClicks,enableLogs:t.enableLogs,enableNetwork:t.enableNetwork,enablePerformance:t.enablePerformance,enableCustomEvents:t.enableCustomEvents,exporters:r});}register(t){this.pluginManager.register(t,this);}capture(t){this.eventProcessor.capture(t)&&(this.processEventQueueAsync(),this.eventProcessor.isBufferFull()&&(this.l