@groundcover/browser 0.0.10 → 0.0.12

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/index.d.mts CHANGED
@@ -6,10 +6,6 @@ type UserIdentifiers = {
6
6
  organization: string;
7
7
  properties: Record<string, unknown>;
8
8
  };
9
- type UserDefinedEventAttributes = {
10
- event: string;
11
- attributes?: Record<string, unknown>;
12
- };
13
9
 
14
10
  interface SDKOptions {
15
11
  batchSize: number;
@@ -32,7 +28,10 @@ declare function init(params: {
32
28
  apiKey: string;
33
29
  }): void;
34
30
  declare function identifyUser(userIdentifier: Partial<UserIdentifiers>): void;
35
- declare function sendCustomEvent(params: UserDefinedEventAttributes): void;
31
+ declare function sendCustomEvent(params: {
32
+ event: string;
33
+ attributes: Record<string, unknown>;
34
+ }): void;
36
35
  declare function captureException(error: Error): void;
37
36
  declare const _default: {
38
37
  init: typeof init;
package/dist/index.d.ts CHANGED
@@ -6,10 +6,6 @@ type UserIdentifiers = {
6
6
  organization: string;
7
7
  properties: Record<string, unknown>;
8
8
  };
9
- type UserDefinedEventAttributes = {
10
- event: string;
11
- attributes?: Record<string, unknown>;
12
- };
13
9
 
14
10
  interface SDKOptions {
15
11
  batchSize: number;
@@ -32,7 +28,10 @@ declare function init(params: {
32
28
  apiKey: string;
33
29
  }): void;
34
30
  declare function identifyUser(userIdentifier: Partial<UserIdentifiers>): void;
35
- declare function sendCustomEvent(params: UserDefinedEventAttributes): void;
31
+ declare function sendCustomEvent(params: {
32
+ event: string;
33
+ attributes: Record<string, unknown>;
34
+ }): void;
36
35
  declare function captureException(error: Error): void;
37
36
  declare const _default: {
38
37
  init: typeof init;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';var Z=require('error-stack-parser'),webVitals=require('web-vitals');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Z__default=/*#__PURE__*/_interopDefault(Z);var Y=console.log.bind(console),v=class i{constructor(){this.isDebugEnabled=false,this.prefix="";}static initialize(n){return i.instance||(i.instance=new i),n&&(i.instance.isDebugEnabled=n.debug??false,i.instance.prefix=n.prefix??""),i.instance}static getInstance(n){return i?.instance||i.initialize(n)}formatMessage(n){return `[${new Date().toISOString()}] ${this.prefix} ${n}`}log(n,...e){this.isDebugEnabled&&Y(this.formatMessage(n),...e);}updateConfig(n){this.isDebugEnabled=n.debug??this.isDebugEnabled,this.prefix=n.prefix??this.prefix;}};var W=v.getInstance();function s(i){W.log("[error-handler.handleError] called",i,{groundcoverIgnore:true});}var F={batchSize:10,batchTimeout:1e4,eventSampleRate:1,sessionSampleRate:1,environment:"development",debug:false,maskFields:[],enabledEvents:["dom","network","error","log"]};var x=class{constructor(n){this.dsn=n.dsn,this.appId=n.appId,this.cluster=n.cluster,this.apiKey=n.apiKey,this.environment=n.environment,this.userIdentifier=n.userIdentifier||null,this.options={...F,...n.options};}getEndpoint(){return this.dsn}};var b=class i{constructor(){this.config=null;this.logger=v.getInstance();}static getInstance(){return i.instance||(i.instance=new i),i.instance}initialize(n){this.config||(this.config=new x(n));}getConfig(){return this.config?this.config:(this.logger.log("[config-manager] configuration not initialized"),null)}updateConfig(n){if(this.logger.log("[config-manager] updateConfig called"),!this.config){this.logger.log("[config-manager] configuration not initialized");return}n?.options&&(this.logger.log("[config-manager] updating options"),this.config.options={...this.config.options,...n.options}),n?.userIdentifier&&(this.logger.log("[config-manager] updating user identifier"),this.config.userIdentifier={...this.config.userIdentifier,...n.userIdentifier});}};var u=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof global=="object"?global:{};var C=class{constructor(){this.generateTraceId=H(16);this.generateSpanId=H(8);this.generateId=H(16);}},M=Array(32);function H(i){return function(){for(let e=0;e<i*2;e++)M[e]=Math.floor(Math.random()*16)+48,M[e]>=58&&(M[e]+=39);return String.fromCharCode.apply(null,M.slice(0,i*2))}}var J=b.getInstance(),K=new C;function V(){return {path:u?.location?.pathname,url:u?.location?.href,title:u?.document?.title}}function S(){let i=J?.getConfig()?.options?.eventSampleRate;return typeof i>"u"||Number.isNaN(i)?true:Math.random()<=i}function X(i,n=""){return Object.entries(i).reduce((e,[t,r])=>{let o=n?`${n}.${t}`:t;return typeof r=="object"&&r!==null?Object.assign(e,X(r,o)):e[o]=r,e},{})}function f(i){let n=Date.now()*1e6,e=i.timestamp||n,t=K.generateId(),r=K.generateSpanId(),o=K.generateTraceId(),a=["exception","dom.event","performance","navigation","pageload","custom"],l=X(i.attributes||{},a.includes(i.type)?"rum":""),g=V();return {type:i.type,span_name:i.span_name||void 0,timestamp:i.type==="network"?void 0:e,start_timestamp:i.type==="network"?e:void 0,end_timestamp:i.type==="network"?i?.end_time:void 0,id:t,spanId:r,parentSpanId:"",traceId:o,attributes:{...l,location:g}}}var z=class{constructor(){this.logger=v.getInstance();this.config=b.getInstance();}async send(n){let e=this.config.getConfig();if(e)try{if(e.options.debug){this.logger.log("Sending batch:",n,{groundcoverIgnore:!0});return}let t=e.apiKey,r=this.buildEndpoint();if(!t){this.logger.log("No API key found");return}fetch(r,{method:"POST",headers:{"Content-Type":"application/json",apikey:t},body:JSON.stringify(n)});}catch(t){e.options.debug&&this.logger.log("Failed to send batch:",t,{groundcoverIgnore:true});}}buildEndpoint(){let n=this.config.getConfig();if(!n)return "";let{dsn:e}=n;return `${e}/json/rum`}};var T=class T{constructor(){this.events=[];this.timeoutId=null;this.config=b.getInstance();this.initialized=false;this.transporter=new z;}static getInstance(){return T.instance||(T.instance=new T),T.instance}initialize(){try{if(this.initialized)return;this.scheduleFlush(),globalThis.addEventListener("unload",()=>{this.flush();}),this.initialized=!0;}catch(n){s(n);}}addEvent(n){if(!n||!this.initialized)return;this.events.push(n);let e=this.config.getConfig()?.options?.batchSize||100;this.events.length>=e&&this.flush();}flush(){try{if(this.events.length===0||!this.initialized)return;this.transporter.send({sessionAttributes:this.getSessionAttributes(),events:this.events}),this.events=[],this.scheduleFlush();}catch(n){s(n);}}scheduleFlush(){try{this.timeoutId!==null&&(u.clearTimeout(this.timeoutId),this.timeoutId=null);let n=this.config.getConfig()?.options?.batchTimeout;if(!n)return;this.timeoutId=u.setTimeout(()=>{this.timeoutId=null,this.flush();},n);}catch(n){s(n);}}generateSessionId(){return Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}detectBrowser(){let n=navigator.userAgent,e="unknown",t="unknown",r=navigator.platform||"unknown",o=/Mobile|Android|iPhone|iPad|iPod/i.test(n);return /Edg/.test(n)?(e="Edge",t=n.match(/Edg\/([\d.]+)/)?.[1]||t):/Chrome/.test(n)&&!/Chromium/.test(n)?(e="Chrome",t=n.match(/Chrome\/([\d.]+)/)?.[1]||t):/Firefox/.test(n)?(e="Firefox",t=n.match(/Firefox\/([\d.]+)/)?.[1]||t):/Safari/.test(n)&&!/Chrome/.test(n)?(e="Safari",t=n.match(/Version\/([\d.]+)/)?.[1]||t):/Trident/.test(n)?(e="Internet Explorer",/rv:([^)]+)\)/i.test(n)?t=n.match(/rv:([^)]+)\)/i)?.[1]||t:t=n.match(/MSIE ([^;]+)/)?.[1]||t):/OPR/.test(n)&&(e="Opera",t=n.match(/OPR\/([\d.]+)/)?.[1]||t),{name:e,version:t,platform:r,language:navigator.language,mobile:o}}getSessionAttributes(){let n=this.detectBrowser();return {cluster:this.config.getConfig()?.cluster||"",env:this.config.getConfig()?.environment||"",session_id:sessionStorage?.getItem("gcId")||this.generateSessionId(),user:this.config.getConfig()?.userIdentifier||{},"service.name":this.config.getConfig()?.appId,userAgent:navigator.userAgent,browser:n}}};T.instance=null;var L=T;var E=class{constructor(){this.logger=v.getInstance();this.eventsPool=L.getInstance();}};function I({text:i,maxLength:n=1e4}){return i.length<=n?i:i.substring(0,n)}var A=class extends E{constructor(){super(...arguments);this.eventHandlers=[];this.capturedEvents=["click","change","keydown","select","submit"];this.getShouldMaskText=e=>[e.target?.type==="password",e.target?.id?.toLowerCase().includes("password"),e.target?.id?.toLowerCase().includes("credit-card"),e.target?.id?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.getAttribute("data-private")].some(r=>r);this.getKeyCode=e=>{if(e instanceof KeyboardEvent&&e.code&&e.key!=="Dead"){let t=this.getShouldMaskText({target:e.target});return t||t?"*":e.key}return ""};this.getText=e=>{let t=e.target;return I({text:t.innerText||""})};this.getSelector=e=>e.target instanceof Element&&this.generateSelector(e.target)||"";this.getCoordinates=e=>{if({mouseup:true,mousedown:true,mousemove:true,mouseover:true}[e.type]){let{clientX:r,clientY:o}=e||{};return {clientX:r,clientY:o}}return null};}initialize(){try{this.logger.log("[dom-events-listener.initialize] called"),this.capturedEvents?.forEach(e=>{let t=r=>{try{this.handleEvent(r);}catch(o){s(o);}};this.eventHandlers.push({type:e,handler:t}),u?.addEventListener(e,t);});}catch(e){s(e);}}destroy(){this.eventHandlers.forEach(({type:e,handler:t})=>{global?.removeEventListener?.(e,t);}),this.eventHandlers=[];}handleEvent(e){try{if(!S())return;let r=this.buildEvent(e);this.queueEvent(r);}catch(t){s(t);}}buildEvent(e){let t=this.getSelector(e),r=this.getCoordinates(e),o=e.target,a=this.getKeyCode(e),l=this.getText(e);this.logger.log("[dom-events-listener.buildEvent] called");let g={selector:t,keyCode:a,type:e.type,coordinates:r||{clientX:0,clientY:0},target:{id:o.id,tagName:o.tagName,className:o.className,text:l}};return f({type:"dom.event",attributes:g})}queueEvent(e){try{this.logger.log("[dom-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}generateSelector(e,t={}){if(!e||!e.nodeType||e.nodeType!==Node.ELEMENT_NODE)return "";let r=t.root||document.body||document.documentElement,o=t.maxAttempts||10,a=t.priorityAttributes||["id","class","name","aria-label","type","title","alt"];if(e.tagName?.toLowerCase()==="html")return "html";let l="",g=0,c=e,y=[];for(;c&&c!==r&&c!==document.documentElement&&g<o;){let h=c.tagName?.toLowerCase()||"";try{let p=c.getAttribute("id");if(p&&/^[a-zA-Z][\w-]*$/.test(p))return `#${p}`;if(c.classList?.length){let d=Array.from(c.classList).filter(m=>m&&typeof m=="string").map(m=>`.${m}`);d.length&&(h+=d.join(""));}for(let d of a)if(!(d==="id"||d==="class"))try{let m=c.getAttribute(d);m&&(h+=`[${d}="${m.replace(/"/g,'\\"')}"]`);}catch{}}catch{h=c.tagName?.toLowerCase()||"*";}y.unshift(h||"*"),l=y.join(" > ");try{if(r.querySelectorAll(l).length===1)return l}catch{y.shift(),l=y.join(" > ");}try{c=c.parentElement;}catch{break}g++;}return l||"*"}};var B=["log","info","warn","error","assert","trace"],k=class extends E{constructor(){super(...arguments);this.originalConsole=null;this.isInitialized=false;}initialize(){if(!this.isInitialized)try{this.originalConsole=this.captureConsoleMethods(),B.forEach(e=>{e in console&&(console[e]=(...t)=>{try{this.handleEvent(t,e);}catch(r){s(r);}finally{this.originalConsole?.[e]&&this.originalConsole[e](...t);}});}),this.isInitialized=!0;}catch(e){s(e);}}destroy(){try{if(!this.isInitialized)return;B.forEach(e=>{this.originalConsole&&this.originalConsole[e]&&(console[e]=this.originalConsole[e]);}),this.isInitialized=!1;}catch(e){s(e);}}handleEvent(e,t){try{if(!S())return;let o=this.formatMessage(Array.isArray(e)?e:[e]);if(!o||o?.includes("groundcoverIgnore"))return;let a=this.buildEvent({message:o,level:t});this.queueEvent(a);}catch(r){s(r);}}buildEvent({message:e,level:t}){return f({type:"log",attributes:{message:I({text:e}),level:t}})}queueEvent(e){try{this.logger.log("[logs-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}formatMessage(e){if(!Array.isArray(e))return String(e);try{return e.map(t=>{if(t===void 0)return "undefined";if(t===null)return "null";if(typeof t=="object")try{return JSON.stringify(t)}catch{return Object.prototype.toString.call(t)}return String(t)}).join(" ")}catch(t){return s(t),"[Error formatting console message]"}}captureConsoleMethods(){let e={};try{B.forEach(t=>{console&&typeof console[t]=="function"&&(e[t]=console[t].bind(console));});}catch(t){s(t);}return e}};var q=class extends E{constructor(){super(...arguments);this.config=b.getInstance();this.handleEvent=e=>{try{let t=this.config.getConfig()?.dsn;if(t&&e.url?.includes(t)||!S())return;let o=this.buildEvent(e);this.queueEvent(o);}catch(t){s(t);}};this.buildEvent=e=>{let t="";try{t=new URL(e.url).pathname;}catch{}let r=this.formatHeaders(e.request.headers),o={type:"HTTP",operation:{name:e.method},resource_name:t,status:e.status?.toString(),subType:e.method,http:{route:t,path:t,method:e.method,status:e.status?.toString(),request:{headers:r,method:e.method},response:{headers:r,status_code:e.status?.toString()}},error:e?.error?.type?{type:e.error?.type||"Unknown error"}:void 0,gc:{request:{body:e.request.body},response:{body:e.response.body}}};return f({type:"network",timestamp:e?.timestamp?new Date(e?.timestamp||"").getTime()*1e6:void 0,end_time:e?.end_time?new Date(e?.end_time||"").getTime()*1e6:void 0,span_name:`${e.method} ${t}`,attributes:o})};}initialize(){this.logger.log("[network-events-listener.initialize] called"),this.patchXHR(),this.patchFetch();}destroy(){globalThis.XMLHttpRequest.prototype.open=globalThis.XMLHttpRequest.prototype.open,globalThis.XMLHttpRequest.prototype.send=globalThis.XMLHttpRequest.prototype.send,globalThis.fetch=globalThis.fetch;}queueEvent(e){try{this.logger.log("[network-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}patchXHR(){let e=this,t=globalThis.XMLHttpRequest.prototype.open,r=globalThis.XMLHttpRequest.prototype.send,o=globalThis.XMLHttpRequest.prototype.setRequestHeader;globalThis.XMLHttpRequest.prototype.open=function(a,l,g=true,c,y){if(e.shouldIgnoreRequest(l.toString()))return t.apply(this,[a,l,g,c,y]);let h=new URL(l.toString(),globalThis.location.href).href;return this._requestMethod=a,this._requestUrl=h,this._requestHeaders={},t.apply(this,[a,l,g,c,y])},globalThis.XMLHttpRequest.prototype.setRequestHeader=function(a,l){return this._requestHeaders&&(this._requestHeaders[a]=l),o.apply(this,[a,l])},globalThis.XMLHttpRequest.prototype.send=function(...a){if(!this._requestUrl||e.shouldIgnoreRequest(this._requestUrl.toString()))return r.apply(this,a);this._requestBody=a[0]||"";let l=Date.now();return this.addEventListener("load",()=>{let g=Date.now(),c={};this.getAllResponseHeaders().split(/\r?\n/).forEach(h=>{let[p,d]=h.split(": ");p&&d&&(c[p.trim()]=d.trim());});let y={timestamp:l,end_time:g,method:this._requestMethod,url:this._requestUrl,body:this._requestBody,status:this.status,request:{headers:this._requestHeaders||{},body:this._requestBody},response:{headers:c,body:this.responseText||this.response||""}};e.handleEvent(y);}),r.apply(this,a)};}patchFetch(){let e=globalThis.fetch;globalThis.fetch=(...t)=>{let[r,o]=t,a=o?.method||"GET",l=o?.body||"",g=r instanceof Request?r.url:r.toString();if(this.shouldIgnoreRequest(g))return e.apply(globalThis,t);let c={};o?.headers&&(o.headers instanceof Headers?o.headers.forEach((h,p)=>{c[p]=h;}):typeof o.headers=="object"&&Object.assign(c,o.headers));let y=Date.now();return e.apply(globalThis,t).then(async h=>{let p=Date.now(),d=h.clone(),m="";try{m=await d.text();}catch{m="[unreadable response body]";}let R={};d.headers.forEach((j,G)=>{R[G]=j;});let $={method:a,url:g,timestamp:y,body:l.toString(),status:d.status,end_time:p,request:{headers:c,body:l.toString()},response:{headers:R,body:m}};return this.handleEvent($),h}).catch(h=>{let p=Date.now(),d="NetworkError",m=h.message||"Unknown network error";h instanceof TypeError&&m.includes("Failed to fetch")?d="ERR_NETWORK_FAILURE":m.includes("Name not resolved")?d="ERR_NAME_NOT_RESOLVED":m.includes("Connection refused")&&(d="ERR_CONNECTION_REFUSED");let R={method:a,url:g,body:l.toString(),status:0,end_time:p,request:{headers:c,body:l.toString()},response:{headers:{},body:""},error:{type:d}};throw this.handleEvent(R),h})};}formatHeaders(e){let t=["authorization","cookie","set-cookie"];return Object.entries(e)?.reduce((r,[o,a])=>{let l=o.toLowerCase();return t.includes(l)||/(token|key|secret|password)/i.test(l)?r[o]="[REDACTED]":r[o]=I({text:a}),r},{})}shouldIgnoreRequest(e){return [".tsx",".jsx",".css"].some(r=>e.toLowerCase().endsWith(r))}};var N=class extends E{constructor(){super(...arguments);this.handleEvent=(e,t)=>{this.logger.log("[errors-events-listener.handleEvent] called");try{let r;if(e instanceof Error)r=e,this.enhanceError(r);else if(e instanceof ErrorEvent){if(r=e.error||new Error(e.message||"Unknown error"),/Script error\.?/.test(r.message))return;this.enhanceError(r,e);}else if(e instanceof PromiseRejectionEvent)r=this.createUnhandledRejectionError(e);else return;let o=this.buildEvent(r,t);this.queueEvent(o);}catch(r){s(r);}};}initialize(){u?.addEventListener("error",this.handleEvent),u?.addEventListener("unhandledrejection",this.handleEvent);}destroy(){u?.removeEventListener("error",this.handleEvent),u?.removeEventListener("unhandledrejection",this.handleEvent);}buildEvent(e,t){let r={type:e.name||"Error",message:e.message||"Unknown error",stacktrace:this.buildStackTrace(e),fingerprint:`${e.name}:${I({text:e.message,maxLength:400})}`,handled:t?.handled||false};return f({type:"exception",attributes:r})}queueEvent(e){try{this.logger.log("[errors-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}enhanceError(e,t){let{filename:r,lineno:o,colno:a}=t||{};r&&!e.fileName&&Object.defineProperty(e,"fileName",{value:r}),o&&!e.lineNumber&&Object.defineProperty(e,"lineNumber",{value:o}),a&&!e.columnNumber&&Object.defineProperty(e,"columnNumber",{value:a});}createUnhandledRejectionError(e){let t;if(e.reason instanceof Error)t=e.reason;else {let r=typeof e.reason=="object"?JSON.stringify(e.reason,null,2):String(e.reason);t=new Error(r),t.name="UnhandledRejection",Object.defineProperty(t,"originalReason",{value:e.reason,enumerable:false});}return t}buildStackTrace(e){if(!e)return [];try{return Z__default.default.parse(e).map(r=>({filename:r.fileName||"unknown",function:r.functionName||"anonymous",lineno:r.lineNumber||0,colno:r.columnNumber||0}))}catch{return []}}};var D=class extends E{constructor(){super(...arguments);this.currentUrl=globalThis.location.href;this.mutationObserver=null;}initialize(){if(u.MutationObserver){let e=u.document.querySelector("body");e&&(this.mutationObserver=new MutationObserver(()=>{this.handleUrlChange();}),this.mutationObserver.observe(e,{childList:true,subtree:true}));}u?.addEventListener("popstate",()=>{this.handleUrlChange();});}destroy(){this.mutationObserver?.disconnect(),this.mutationObserver=null;}handleEvent(){try{this.logger.log("[navigation-listener.handleEvent] called");let e=this.buildEvent();this.queueEvent(e);}catch(e){s(e);}}buildEvent(){let e={url:globalThis.location.href};return f({type:"navigation",attributes:e})}queueEvent(e){try{this.logger.log("[navigation-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}handleUrlChange(){let e=globalThis.location.href;e!==this.currentUrl&&(this.currentUrl=e,this.handleEvent());}};var P=class extends E{constructor(){super(),this.startTime=performance.now();}initialize(){try{this.logger.log("[page-load-listener.initialize] called"),u?.addEventListener("load",()=>{this.handleEvent();});}catch(n){s(n);}}destroy(){u?.removeEventListener("load",this.handleEvent);}handleEvent(){try{this.logger.log("[page-load-listener.handleEvent] called");let n=this.buildEvent();this.queueEvent(n);}catch(n){s(n);}}buildEvent(){let n=performance.now()-this.startTime,e=performance.getEntriesByType("resource"),t={count:e.length,totalSize:0,totalDuration:0,byType:{}};e.forEach(o=>{let a=o,l=a.transferSize||0,g=a.duration,c=a.initiatorType;t.totalSize+=l,t.totalDuration+=g,t.byType[c]||(t.byType[c]={count:0,size:0,duration:0}),t.byType[c].count++,t.byType[c].size+=l,t.byType[c].duration+=g;});let r={url:u?.location?.href||"",loadTime:n,referrer:u?.document?.referrer||"",resources:t};return f({type:"pageload",attributes:r})}queueEvent(n){try{this.logger.log("[page-load-listener.queueEvent] called"),n&&this.eventsPool.addEvent(n);}catch(e){s(e);}}};var _=class extends E{constructor(){super(...arguments);this.handleEvent=e=>{try{if(!S())return;let r=this.buildEvent(e);this.queueEvent(r);}catch(t){s(t);}};}initialize(){webVitals.onCLS(this.handleEvent),webVitals.onLCP(this.handleEvent),webVitals.onFCP(this.handleEvent),webVitals.onTTFB(this.handleEvent),webVitals.onINP(this.handleEvent);}destroy(){}buildEvent(e){let t={name:e.name,value:e.value,id:e.id,navigationType:e.navigationType||""};return f({type:"performance",attributes:t})}queueEvent(e){try{this.logger.log("[performance-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}};var O=class{constructor(){this.logger=v.getInstance();this.eventsPool=L.getInstance();this.logEventsListener=null;this.domEventsListener=null;this.errorsEventsListener=null;this.networkEventsListener=null;this.navigationListener=null;this.performanceListener=null;this.pageLoadListener=null;}instrument(){this.logger.log("[instrumentation-manager.instrument] called"),this.domEventsListener=new A,this.logEventsListener=new k,this.errorsEventsListener=new N,this.networkEventsListener=new q,this.navigationListener=new D,this.performanceListener=new _,this.pageLoadListener=new P,this.domEventsListener.initialize(),this.logEventsListener.initialize(),this.errorsEventsListener.initialize(),this.networkEventsListener.initialize(),this.navigationListener.initialize(),this.performanceListener.initialize(),this.pageLoadListener.initialize(),this.logger.log("[instrumentation-manager.instrument] initialized listeners");}sendCustomEvent(n){this.logger.log("[instrumentation-manager.sendCustomEvent] called",n);try{let e=f({type:"custom",attributes:{event:n?.event,attributes:n?.attributes}});this.eventsPool.addEvent(e);}catch(e){s(e);}}captureException(n){try{this.logger.log("[instrumentation-manager.captureException] called",n),this.errorsEventsListener?.handleEvent(n,{handled:!0});}catch(e){s(e);}}uninstrument(){this.domEventsListener?.destroy(),this.logEventsListener?.destroy(),this.errorsEventsListener?.destroy(),this.networkEventsListener?.destroy(),this.navigationListener?.destroy(),this.performanceListener?.destroy();}};var U=class{constructor(n){this.initialized=false;if(this.logger=v.initialize({debug:n.options?.debug||false,prefix:"[groundcover]"}),this.logger.log("[session-manager] initialize called"),this.instrumentationManager=new O,this.idGenerator=new C,!(n.options?.sessionSampleRate?Math.random()<n.options?.sessionSampleRate:true)){this.logger.log("[session-manager] session is not sampled");return}if(this.initialized){this.logger.log("[session-manager] SDK already initialized");return}b.getInstance().initialize(n),L.getInstance().initialize();let o=this.idGenerator.generateId();globalThis?.sessionStorage?.setItem("gcId",o),this.instrumentationManager.instrument(),this.initialized=true;}identifyUser(n){if(this.logger.log("[session-manager] identifyUser called"),!this.initialized){this.logger.log("[session-manager] cannot identify user: SDK not initialized");return}b.getInstance().updateConfig({userIdentifier:n});}sendCustomEvent(n){if(!this.initialized){this.logger.log("[session-manager] cannot send custom event: SDK not initialized");return}this.instrumentationManager.sendCustomEvent(n);}captureException(n){if(!this.initialized){this.logger.log("[session-manager] Cannot capture exception: SDK not initialized");return}this.instrumentationManager.captureException(n);}destroy(){this.initialized&&(this.instrumentationManager.uninstrument(),globalThis.sessionStorage?.removeItem("gcId"),this.initialized=false);}};var w;function ie(i){try{w=new U({cluster:i?.cluster,environment:i?.environment,dsn:i?.dsn,appId:i?.appId,userIdentifier:i?.userIdentifier,apiKey:i?.apiKey,options:i?.options});}catch(n){s(n);}}function oe(i){if(!w){console.warn("[groundcover] identifyUser: groundcover is not initialized. please call init() first");return}w.identifyUser(i);}function se(i){w&&w.sendCustomEvent(i);}function ae(i){w&&w.captureException(i);}var Kt={init:ie,identifyUser:oe,sendCustomEvent:se,captureException:ae};module.exports=Kt;
1
+ 'use strict';var Z=require('error-stack-parser'),webVitals=require('web-vitals');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Z__default=/*#__PURE__*/_interopDefault(Z);var Y=console.log.bind(console),b=class i{constructor(){this.isDebugEnabled=false,this.prefix="";}static initialize(r){return i.instance||(i.instance=new i),r&&(i.instance.isDebugEnabled=r.debug??false,i.instance.prefix=r.prefix??""),i.instance}static getInstance(r){return i?.instance||i.initialize(r)}formatMessage(r){return `[${new Date().toISOString()}] ${this.prefix} ${r}`}log(r,...e){this.isDebugEnabled&&Y(this.formatMessage(r),...e);}updateConfig(r){this.isDebugEnabled=r.debug??this.isDebugEnabled,this.prefix=r.prefix??this.prefix;}};var W=b.getInstance();function s(i){W.log("[error-handler.handleError] called",i,{groundcoverIgnore:true});}var F={batchSize:10,batchTimeout:1e4,eventSampleRate:1,sessionSampleRate:1,environment:"development",debug:false,maskFields:[],enabledEvents:["dom","network","error","log"]};var R=class{constructor(r){this.dsn=r.dsn,this.appId=r.appId,this.cluster=r.cluster,this.apiKey=r.apiKey,this.environment=r.environment,this.userIdentifier=r.userIdentifier||null,this.options={...F,...r.options};}getEndpoint(){return this.dsn}};var y=class i{constructor(){this.config=null;this.logger=b.getInstance();}static getInstance(){return i.instance||(i.instance=new i),i.instance}initialize(r){this.config||(this.config=new R(r));}getConfig(){return this.config?this.config:(this.logger.log("[config-manager] configuration not initialized"),null)}updateConfig(r){if(this.logger.log("[config-manager] updateConfig called"),!this.config){this.logger.log("[config-manager] configuration not initialized");return}r?.options&&(this.logger.log("[config-manager] updating options"),this.config.options={...this.config.options,...r.options}),r?.userIdentifier&&(this.logger.log("[config-manager] updating user identifier"),this.config.userIdentifier={...this.config.userIdentifier,...r.userIdentifier});}};var u=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof global=="object"?global:{};var C=class{constructor(){this.generateTraceId=U(16);this.generateSpanId=U(8);this.generateId=U(16);}},x=Array(32);function U(i){return function(){for(let e=0;e<i*2;e++)x[e]=Math.floor(Math.random()*16)+48,x[e]>=58&&(x[e]+=39);return String.fromCharCode.apply(null,x.slice(0,i*2))}}var J=y.getInstance(),K=new C;function V(){return {path:u?.location?.pathname,url:u?.location?.href,title:u?.document?.title}}function S(){let i=J?.getConfig()?.options?.eventSampleRate;return typeof i>"u"||Number.isNaN(i)?true:Math.random()<=i}function X(i,r=""){return Object.entries(i).reduce((e,[t,n])=>{let o=r?`${r}.${t}`:t;return typeof n=="object"&&n!==null?Object.assign(e,X(n,o)):e[o]=n,e},{})}function f(i){let r=Date.now()*1e6,e=K.generateId(),t=K.generateSpanId(),n=K.generateTraceId(),o=X(i.attributes||{}),l=V(),a={type:i.type,id:e,spanId:t,parentSpanId:"",traceId:n,attributes:{...o,location:l}};return i.span_name&&(a.span_name=i.span_name),i.type==="network"?(a.start_timestamp=i.timestamp||r,a.end_timestamp=i?.end_timestamp):a.timestamp=r,a}var N=class{constructor(){this.logger=b.getInstance();this.config=y.getInstance();}async send(r){let e=this.config.getConfig();if(e)try{if(e.options.debug){this.logger.log("Sending batch:",r,{groundcoverIgnore:!0});return}let t=e.apiKey,n=this.buildEndpoint();if(!t){this.logger.log("No API key found");return}fetch(n,{method:"POST",headers:{"Content-Type":"application/json",apikey:t},body:JSON.stringify(r)});}catch(t){e.options.debug&&this.logger.log("Failed to send batch:",t,{groundcoverIgnore:true});}}buildEndpoint(){let r=this.config.getConfig();if(!r)return "";let{dsn:e}=r;return `${e}/json/rum`}};var w=class w{constructor(){this.events=[];this.timeoutId=null;this.config=y.getInstance();this.initialized=false;this.transporter=new N;}static getInstance(){return w.instance||(w.instance=new w),w.instance}initialize(){try{if(this.initialized)return;this.scheduleFlush(),globalThis.addEventListener("unload",()=>{this.flush();}),this.initialized=!0;}catch(r){s(r);}}addEvent(r){if(!r||!this.initialized)return;this.events.push(r);let e=this.config.getConfig()?.options?.batchSize||100;this.events.length>=e&&this.flush();}flush(){try{if(this.events.length===0||!this.initialized)return;this.transporter.send({sessionAttributes:this.getSessionAttributes(),events:this.events}),this.events=[],this.scheduleFlush();}catch(r){s(r);}}scheduleFlush(){try{this.timeoutId!==null&&(u.clearTimeout(this.timeoutId),this.timeoutId=null);let r=this.config.getConfig()?.options?.batchTimeout;if(!r)return;this.timeoutId=u.setTimeout(()=>{this.timeoutId=null,this.flush();},r);}catch(r){s(r);}}generateSessionId(){return Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}detectBrowser(){let r=navigator.userAgent,e="unknown",t="unknown",n=navigator.platform||"unknown",o=/Mobile|Android|iPhone|iPad|iPod/i.test(r);return /Edg/.test(r)?(e="Edge",t=r.match(/Edg\/([\d.]+)/)?.[1]||t):/Chrome/.test(r)&&!/Chromium/.test(r)?(e="Chrome",t=r.match(/Chrome\/([\d.]+)/)?.[1]||t):/Firefox/.test(r)?(e="Firefox",t=r.match(/Firefox\/([\d.]+)/)?.[1]||t):/Safari/.test(r)&&!/Chrome/.test(r)?(e="Safari",t=r.match(/Version\/([\d.]+)/)?.[1]||t):/Trident/.test(r)?(e="Internet Explorer",/rv:([^)]+)\)/i.test(r)?t=r.match(/rv:([^)]+)\)/i)?.[1]||t:t=r.match(/MSIE ([^;]+)/)?.[1]||t):/OPR/.test(r)&&(e="Opera",t=r.match(/OPR\/([\d.]+)/)?.[1]||t),{name:e,version:t,platform:n,language:navigator.language,mobile:o}}getSessionAttributes(){let r=this.detectBrowser();return {cluster:this.config.getConfig()?.cluster||"",env:this.config.getConfig()?.environment||"",session_id:sessionStorage?.getItem("gcId")||this.generateSessionId(),user:this.config.getConfig()?.userIdentifier||{},"service.name":this.config.getConfig()?.appId,userAgent:navigator.userAgent,browser:r}}};w.instance=null;var L=w;var E=class{constructor(){this.logger=b.getInstance();this.eventsPool=L.getInstance();}};function I({text:i,maxLength:r=1e4}){return i.length<=r?i:i.substring(0,r)}var k=class extends E{constructor(){super(...arguments);this.eventHandlers=[];this.capturedEvents=["click","change","keydown","select","submit"];this.getShouldMaskText=e=>[e.target?.type==="password",e.target?.id?.toLowerCase().includes("password"),e.target?.id?.toLowerCase().includes("credit-card"),e.target?.id?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.getAttribute("data-private")].some(n=>n);this.getKeyCode=e=>{if(e instanceof KeyboardEvent&&e.code&&e.key!=="Dead"){let t=this.getShouldMaskText({target:e.target});return t||t?"*":e.key}return ""};this.getText=e=>{let t=e.target;return I({text:t.innerText||""})};this.getSelector=e=>e.target instanceof Element&&this.generateSelector(e.target)||"";this.getCoordinates=e=>{if({mouseup:true,mousedown:true,mousemove:true,mouseover:true}[e.type]){let{clientX:n,clientY:o}=e||{};return {clientX:n,clientY:o}}return null};}initialize(){try{this.logger.log("[dom-events-listener.initialize] called"),this.capturedEvents?.forEach(e=>{let t=n=>{try{this.handleEvent(n);}catch(o){s(o);}};this.eventHandlers.push({type:e,handler:t}),u?.addEventListener(e,t);});}catch(e){s(e);}}destroy(){this.eventHandlers.forEach(({type:e,handler:t})=>{global?.removeEventListener?.(e,t);}),this.eventHandlers=[];}handleEvent(e){try{if(!S())return;let n=this.buildEvent(e);this.queueEvent(n);}catch(t){s(t);}}buildEvent(e){let t=this.getSelector(e),n=this.getCoordinates(e),o=e.target,l=this.getKeyCode(e),a=this.getText(e);this.logger.log("[dom-events-listener.buildEvent] called");let d={dom_event_selector:t,dom_event_key_code:l,dom_event_type:e.type,dom_event_coordinates:n||{clientX:0,clientY:0},dom_event_target:{id:o.id,tagName:o.tagName,className:o.className,text:a}};return f({type:"dom.event",attributes:d})}queueEvent(e){try{this.logger.log("[dom-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}generateSelector(e,t={}){if(!e||!e.nodeType||e.nodeType!==Node.ELEMENT_NODE)return "";let n=t.root||document.body||document.documentElement,o=t.maxAttempts||10,l=t.priorityAttributes||["id","class","name","aria-label","type","title","alt"];if(e.tagName?.toLowerCase()==="html")return "html";let a="",d=0,c=e,v=[];for(;c&&c!==n&&c!==document.documentElement&&d<o;){let h=c.tagName?.toLowerCase()||"";try{let m=c.getAttribute("id");if(m&&/^[a-zA-Z][\w-]*$/.test(m))return `#${m}`;if(c.classList?.length){let g=Array.from(c.classList).filter(p=>p&&typeof p=="string").map(p=>`.${p}`);g.length&&(h+=g.join(""));}for(let g of l)if(!(g==="id"||g==="class"))try{let p=c.getAttribute(g);p&&(h+=`[${g}="${p.replace(/"/g,'\\"')}"]`);}catch{}}catch{h=c.tagName?.toLowerCase()||"*";}v.unshift(h||"*"),a=v.join(" > ");try{if(n.querySelectorAll(a).length===1)return a}catch{v.shift(),a=v.join(" > ");}try{c=c.parentElement;}catch{break}d++;}return a||"*"}};var B=["log","info","warn","error","assert","trace"],M=class extends E{constructor(){super(...arguments);this.originalConsole=null;this.isInitialized=false;}initialize(){if(!this.isInitialized)try{this.originalConsole=this.captureConsoleMethods(),B.forEach(e=>{e in console&&(console[e]=(...t)=>{try{this.handleEvent(t,e);}catch(n){s(n);}finally{this.originalConsole?.[e]&&this.originalConsole[e](...t);}});}),this.isInitialized=!0;}catch(e){s(e);}}destroy(){try{if(!this.isInitialized)return;B.forEach(e=>{this.originalConsole&&this.originalConsole[e]&&(console[e]=this.originalConsole[e]);}),this.isInitialized=!1;}catch(e){s(e);}}handleEvent(e,t){try{if(!S())return;let o=this.formatMessage(Array.isArray(e)?e:[e]);if(!o||o?.includes("groundcoverIgnore"))return;let l=this.buildEvent({message:o,level:t});this.queueEvent(l);}catch(n){s(n);}}buildEvent({message:e,level:t}){return f({type:"log",attributes:{message:I({text:e}),level:t}})}queueEvent(e){try{this.logger.log("[logs-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}formatMessage(e){if(!Array.isArray(e))return String(e);try{return e.map(t=>{if(t===void 0)return "undefined";if(t===null)return "null";if(typeof t=="object")try{return JSON.stringify(t)}catch{return Object.prototype.toString.call(t)}return String(t)}).join(" ")}catch(t){return s(t),"[Error formatting console message]"}}captureConsoleMethods(){let e={};try{B.forEach(t=>{console&&typeof console[t]=="function"&&(e[t]=console[t].bind(console));});}catch(t){s(t);}return e}};var z=class extends E{constructor(){super(...arguments);this.config=y.getInstance();this.handleEvent=e=>{try{let t=this.config.getConfig()?.dsn;if(t&&e.url?.includes(t)||!S())return;let o=this.buildEvent(e);this.queueEvent(o);}catch(t){s(t);}};this.buildEvent=e=>{let t="";try{t=new URL(e.url).pathname;}catch{}let n=this.formatHeaders(e.request.headers),o={type:"HTTP",operation:{name:e.method},resource_name:t,status:e.status?.toString(),subType:e.method,http:{route:t,path:t,method:e.method,status:e.status?.toString(),request:{headers:n,method:e.method},response:{headers:n,status_code:e.status?.toString()}},error:e?.error?.type?{type:e.error?.type||"Unknown error"}:void 0,gc:{request:{body:e.request.body},response:{body:e.response.body}}};return f({type:"network",timestamp:e?.timestamp&&!Number.isNaN(e.timestamp)?e.timestamp*1e6:void 0,end_timestamp:e?.end_time&&!Number.isNaN(e.end_time)?e.end_time*1e6:void 0,span_name:`${e.method} ${t}`,attributes:o})};}initialize(){this.logger.log("[network-events-listener.initialize] called"),this.patchXHR(),this.patchFetch();}destroy(){globalThis.XMLHttpRequest.prototype.open=globalThis.XMLHttpRequest.prototype.open,globalThis.XMLHttpRequest.prototype.send=globalThis.XMLHttpRequest.prototype.send,globalThis.fetch=globalThis.fetch;}queueEvent(e){try{this.logger.log("[network-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}patchXHR(){let e=this,t=globalThis.XMLHttpRequest.prototype.open,n=globalThis.XMLHttpRequest.prototype.send,o=globalThis.XMLHttpRequest.prototype.setRequestHeader,l;globalThis.XMLHttpRequest.prototype.open=function(a,d,c=true,v,h){if(l=Date.now(),e.shouldIgnoreRequest(d.toString()))return t.apply(this,[a,d,c,v,h]);let m=new URL(d.toString(),globalThis.location.href).href;return this._requestMethod=a,this._requestUrl=m,this._requestHeaders={},t.apply(this,[a,d,c,v,h])},globalThis.XMLHttpRequest.prototype.setRequestHeader=function(a,d){return this._requestHeaders&&(this._requestHeaders[a]=d),o.apply(this,[a,d])},globalThis.XMLHttpRequest.prototype.send=function(...a){return !this._requestUrl||e.shouldIgnoreRequest(this._requestUrl.toString())?n.apply(this,a):(this._requestBody=a[0]||"",this.addEventListener("load",()=>{let d=Date.now(),c={};this.getAllResponseHeaders().split(/\r?\n/).forEach(h=>{let[m,g]=h.split(": ");m&&g&&(c[m.trim()]=g.trim());});let v={timestamp:l,end_time:d,method:this._requestMethod,url:this._requestUrl,body:this._requestBody,status:this.status,request:{headers:this._requestHeaders||{},body:this._requestBody},response:{headers:c,body:this.responseText||this.response||""}};e.handleEvent(v);}),n.apply(this,a))};}patchFetch(){let e=globalThis.fetch;globalThis.fetch=(...t)=>{let n=Date.now(),[o,l]=t,a=l?.method||"GET",d=l?.body||"",c=o instanceof Request?o.url:o.toString();if(this.shouldIgnoreRequest(c))return e.apply(globalThis,t);let v={};return l?.headers&&(l.headers instanceof Headers?l.headers.forEach((h,m)=>{v[m]=h;}):typeof l.headers=="object"&&Object.assign(v,l.headers)),e.apply(globalThis,t).then(async h=>{let m=Date.now(),g=h.clone(),p="";try{p=await g.text();}catch{p="[unreadable response body]";}let _={};g.headers.forEach((j,G)=>{_[G]=j;});let $={method:a,url:c,timestamp:n,body:d.toString(),status:g.status,end_time:m,request:{headers:v,body:d.toString()},response:{headers:_,body:p}};return this.handleEvent($),h}).catch(h=>{let m=Date.now(),g="NetworkError",p=h.message||"Unknown network error";h instanceof TypeError&&p.includes("Failed to fetch")?g="ERR_NETWORK_FAILURE":p.includes("Name not resolved")?g="ERR_NAME_NOT_RESOLVED":p.includes("Connection refused")&&(g="ERR_CONNECTION_REFUSED");let _={method:a,url:c,body:d.toString(),status:0,end_time:m,request:{headers:v,body:d.toString()},response:{headers:{},body:""},error:{type:g}};throw this.handleEvent(_),h})};}formatHeaders(e){let t=["authorization","cookie","set-cookie"];return Object.entries(e)?.reduce((n,[o,l])=>{let a=o.toLowerCase();return t.includes(a)||/(token|key|secret|password)/i.test(a)?n[o]="[REDACTED]":n[o]=I({text:l}),n},{})}shouldIgnoreRequest(e){return [".tsx",".jsx",".css"].some(n=>e.toLowerCase().endsWith(n))}};var q=class extends E{constructor(){super(...arguments);this.handleEvent=(e,t)=>{this.logger.log("[errors-events-listener.handleEvent] called");try{let n;if(e instanceof Error)n=e,this.enhanceError(n);else if(e instanceof ErrorEvent){if(n=e.error||new Error(e.message||"Unknown error"),/Script error\.?/.test(n.message))return;this.enhanceError(n,e);}else if(e instanceof PromiseRejectionEvent)n=this.createUnhandledRejectionError(e);else return;let o=this.buildEvent(n,t);this.queueEvent(o);}catch(n){s(n);}};}initialize(){u?.addEventListener("error",this.handleEvent),u?.addEventListener("unhandledrejection",this.handleEvent);}destroy(){u?.removeEventListener("error",this.handleEvent),u?.removeEventListener("unhandledrejection",this.handleEvent);}buildEvent(e,t){let n={error_type:e.name||"Error",error_message:e.message||"Unknown error",error_stacktrace:this.buildStackTrace(e),error_fingerprint:`${e.name}:${I({text:e.message,maxLength:400})}`,error_handled:t?.handled||false};return f({type:"exception",attributes:n})}queueEvent(e){try{this.logger.log("[errors-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}enhanceError(e,t){let{filename:n,lineno:o,colno:l}=t||{};n&&!e.fileName&&Object.defineProperty(e,"fileName",{value:n}),o&&!e.lineNumber&&Object.defineProperty(e,"lineNumber",{value:o}),l&&!e.columnNumber&&Object.defineProperty(e,"columnNumber",{value:l});}createUnhandledRejectionError(e){let t;if(e.reason instanceof Error)t=e.reason;else {let n=typeof e.reason=="object"?JSON.stringify(e.reason,null,2):String(e.reason);t=new Error(n),t.name="UnhandledRejection",Object.defineProperty(t,"originalReason",{value:e.reason,enumerable:false});}return t}buildStackTrace(e){if(!e)return [];try{return Z__default.default.parse(e).map(n=>({filename:n.fileName||"unknown",function:n.functionName||"anonymous",lineno:n.lineNumber||0,colno:n.columnNumber||0}))}catch{return []}}};var A=class extends E{constructor(){super(...arguments);this.currentUrl=globalThis.location.href;this.mutationObserver=null;}initialize(){if(u.MutationObserver){let e=u.document.querySelector("body");e&&(this.mutationObserver=new MutationObserver(()=>{this.handleUrlChange();}),this.mutationObserver.observe(e,{childList:true,subtree:true}));}u?.addEventListener("popstate",()=>{this.handleUrlChange();});}destroy(){this.mutationObserver?.disconnect(),this.mutationObserver=null;}handleEvent(){try{this.logger.log("[navigation-listener.handleEvent] called");let e=this.buildEvent();this.queueEvent(e);}catch(e){s(e);}}buildEvent(){let e={page_url:globalThis.location.href};return f({type:"navigation",attributes:e})}queueEvent(e){try{this.logger.log("[navigation-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}handleUrlChange(){let e=globalThis.location.href;e!==this.currentUrl&&(this.currentUrl=e,this.handleEvent());}};var P=class extends E{constructor(){super(),this.startTime=performance.now();}initialize(){try{this.logger.log("[page-load-listener.initialize] called"),u?.addEventListener("load",()=>{this.handleEvent();});}catch(r){s(r);}}destroy(){u?.removeEventListener("load",this.handleEvent);}handleEvent(){try{this.logger.log("[page-load-listener.handleEvent] called");let r=this.buildEvent();this.queueEvent(r);}catch(r){s(r);}}buildEvent(){let r=performance.now()-this.startTime,e=performance.getEntriesByType("resource"),t={count:e.length,totalSize:0,totalDuration:0,byType:{}};e.forEach(o=>{let l=o,a=l.transferSize||0,d=l.duration,c=l.initiatorType;t.totalSize+=a,t.totalDuration+=d,t.byType[c]||(t.byType[c]={count:0,size:0,duration:0}),t.byType[c].count++,t.byType[c].size+=a,t.byType[c].duration+=d;});let n={page_url:u?.location?.href||"",page_load_time:r,page_referrer:u?.document?.referrer||"",page_resources:t};return f({type:"pageload",attributes:n})}queueEvent(r){try{this.logger.log("[page-load-listener.queueEvent] called"),r&&this.eventsPool.addEvent(r);}catch(e){s(e);}}};var D=class extends E{constructor(){super(...arguments);this.handleEvent=e=>{try{if(!S())return;let n=this.buildEvent(e);this.queueEvent(n);}catch(t){s(t);}};}initialize(){webVitals.onCLS(this.handleEvent),webVitals.onLCP(this.handleEvent),webVitals.onFCP(this.handleEvent),webVitals.onTTFB(this.handleEvent),webVitals.onINP(this.handleEvent);}destroy(){}buildEvent(e){let t={performance_metric_name:e.name,performance_metric_value:e.value,performance_metric_id:e.id,performance_metric_navigation_type:e.navigationType||""};return f({type:"performance",attributes:t})}queueEvent(e){try{this.logger.log("[performance-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}};var O=class{constructor(){this.logger=b.getInstance();this.eventsPool=L.getInstance();this.logEventsListener=null;this.domEventsListener=null;this.errorsEventsListener=null;this.networkEventsListener=null;this.navigationListener=null;this.performanceListener=null;this.pageLoadListener=null;}instrument(){this.logger.log("[instrumentation-manager.instrument] called"),this.domEventsListener=new k,this.logEventsListener=new M,this.errorsEventsListener=new q,this.networkEventsListener=new z,this.navigationListener=new A,this.performanceListener=new D,this.pageLoadListener=new P,this.domEventsListener.initialize(),this.logEventsListener.initialize(),this.errorsEventsListener.initialize(),this.networkEventsListener.initialize(),this.navigationListener.initialize(),this.performanceListener.initialize(),this.pageLoadListener.initialize(),this.logger.log("[instrumentation-manager.instrument] initialized listeners");}sendCustomEvent(r){this.logger.log("[instrumentation-manager.sendCustomEvent] called",r);try{let e=f({type:"custom",attributes:{custom_event_name:r?.event,custom_user:r?.attributes}});this.eventsPool.addEvent(e);}catch(e){s(e);}}captureException(r){try{this.logger.log("[instrumentation-manager.captureException] called",r),this.errorsEventsListener?.handleEvent(r,{handled:!0});}catch(e){s(e);}}uninstrument(){this.domEventsListener?.destroy(),this.logEventsListener?.destroy(),this.errorsEventsListener?.destroy(),this.networkEventsListener?.destroy(),this.navigationListener?.destroy(),this.performanceListener?.destroy();}};var H=class{constructor(r){this.initialized=false;if(this.logger=b.initialize({debug:r.options?.debug||false,prefix:"[groundcover]"}),this.logger.log("[session-manager] initialize called"),this.instrumentationManager=new O,this.idGenerator=new C,!(r.options?.sessionSampleRate?Math.random()<r.options?.sessionSampleRate:true)){this.logger.log("[session-manager] session is not sampled");return}if(this.initialized){this.logger.log("[session-manager] SDK already initialized");return}y.getInstance().initialize(r),L.getInstance().initialize();let o=this.idGenerator.generateId();globalThis?.sessionStorage?.setItem("gcId",o),this.instrumentationManager.instrument(),this.initialized=true;}identifyUser(r){if(this.logger.log("[session-manager] identifyUser called"),!this.initialized){this.logger.log("[session-manager] cannot identify user: SDK not initialized");return}y.getInstance().updateConfig({userIdentifier:r});}sendCustomEvent(r){if(!this.initialized){this.logger.log("[session-manager] cannot send custom event: SDK not initialized");return}this.instrumentationManager.sendCustomEvent(r);}captureException(r){if(!this.initialized){this.logger.log("[session-manager] Cannot capture exception: SDK not initialized");return}this.instrumentationManager.captureException(r);}destroy(){this.initialized&&(this.instrumentationManager.uninstrument(),globalThis.sessionStorage?.removeItem("gcId"),this.initialized=false);}};var T;function ie(i){try{T=new H({cluster:i?.cluster,environment:i?.environment,dsn:i?.dsn,appId:i?.appId,userIdentifier:i?.userIdentifier,apiKey:i?.apiKey,options:i?.options});}catch(r){s(r);}}function oe(i){if(!T){console.warn("[groundcover] identifyUser: groundcover is not initialized. please call init() first");return}T.identifyUser(i);}function se(i){T&&T.sendCustomEvent(i);}function ae(i){T&&T.captureException(i);}var Kt={init:ie,identifyUser:oe,sendCustomEvent:se,captureException:ae};module.exports=Kt;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import Z from'error-stack-parser';import {onCLS,onLCP,onFCP,onTTFB,onINP}from'web-vitals';var Y=console.log.bind(console),v=class i{constructor(){this.isDebugEnabled=false,this.prefix="";}static initialize(n){return i.instance||(i.instance=new i),n&&(i.instance.isDebugEnabled=n.debug??false,i.instance.prefix=n.prefix??""),i.instance}static getInstance(n){return i?.instance||i.initialize(n)}formatMessage(n){return `[${new Date().toISOString()}] ${this.prefix} ${n}`}log(n,...e){this.isDebugEnabled&&Y(this.formatMessage(n),...e);}updateConfig(n){this.isDebugEnabled=n.debug??this.isDebugEnabled,this.prefix=n.prefix??this.prefix;}};var W=v.getInstance();function s(i){W.log("[error-handler.handleError] called",i,{groundcoverIgnore:true});}var F={batchSize:10,batchTimeout:1e4,eventSampleRate:1,sessionSampleRate:1,environment:"development",debug:false,maskFields:[],enabledEvents:["dom","network","error","log"]};var x=class{constructor(n){this.dsn=n.dsn,this.appId=n.appId,this.cluster=n.cluster,this.apiKey=n.apiKey,this.environment=n.environment,this.userIdentifier=n.userIdentifier||null,this.options={...F,...n.options};}getEndpoint(){return this.dsn}};var b=class i{constructor(){this.config=null;this.logger=v.getInstance();}static getInstance(){return i.instance||(i.instance=new i),i.instance}initialize(n){this.config||(this.config=new x(n));}getConfig(){return this.config?this.config:(this.logger.log("[config-manager] configuration not initialized"),null)}updateConfig(n){if(this.logger.log("[config-manager] updateConfig called"),!this.config){this.logger.log("[config-manager] configuration not initialized");return}n?.options&&(this.logger.log("[config-manager] updating options"),this.config.options={...this.config.options,...n.options}),n?.userIdentifier&&(this.logger.log("[config-manager] updating user identifier"),this.config.userIdentifier={...this.config.userIdentifier,...n.userIdentifier});}};var u=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof global=="object"?global:{};var C=class{constructor(){this.generateTraceId=H(16);this.generateSpanId=H(8);this.generateId=H(16);}},M=Array(32);function H(i){return function(){for(let e=0;e<i*2;e++)M[e]=Math.floor(Math.random()*16)+48,M[e]>=58&&(M[e]+=39);return String.fromCharCode.apply(null,M.slice(0,i*2))}}var J=b.getInstance(),K=new C;function V(){return {path:u?.location?.pathname,url:u?.location?.href,title:u?.document?.title}}function S(){let i=J?.getConfig()?.options?.eventSampleRate;return typeof i>"u"||Number.isNaN(i)?true:Math.random()<=i}function X(i,n=""){return Object.entries(i).reduce((e,[t,r])=>{let o=n?`${n}.${t}`:t;return typeof r=="object"&&r!==null?Object.assign(e,X(r,o)):e[o]=r,e},{})}function f(i){let n=Date.now()*1e6,e=i.timestamp||n,t=K.generateId(),r=K.generateSpanId(),o=K.generateTraceId(),a=["exception","dom.event","performance","navigation","pageload","custom"],l=X(i.attributes||{},a.includes(i.type)?"rum":""),g=V();return {type:i.type,span_name:i.span_name||void 0,timestamp:i.type==="network"?void 0:e,start_timestamp:i.type==="network"?e:void 0,end_timestamp:i.type==="network"?i?.end_time:void 0,id:t,spanId:r,parentSpanId:"",traceId:o,attributes:{...l,location:g}}}var z=class{constructor(){this.logger=v.getInstance();this.config=b.getInstance();}async send(n){let e=this.config.getConfig();if(e)try{if(e.options.debug){this.logger.log("Sending batch:",n,{groundcoverIgnore:!0});return}let t=e.apiKey,r=this.buildEndpoint();if(!t){this.logger.log("No API key found");return}fetch(r,{method:"POST",headers:{"Content-Type":"application/json",apikey:t},body:JSON.stringify(n)});}catch(t){e.options.debug&&this.logger.log("Failed to send batch:",t,{groundcoverIgnore:true});}}buildEndpoint(){let n=this.config.getConfig();if(!n)return "";let{dsn:e}=n;return `${e}/json/rum`}};var T=class T{constructor(){this.events=[];this.timeoutId=null;this.config=b.getInstance();this.initialized=false;this.transporter=new z;}static getInstance(){return T.instance||(T.instance=new T),T.instance}initialize(){try{if(this.initialized)return;this.scheduleFlush(),globalThis.addEventListener("unload",()=>{this.flush();}),this.initialized=!0;}catch(n){s(n);}}addEvent(n){if(!n||!this.initialized)return;this.events.push(n);let e=this.config.getConfig()?.options?.batchSize||100;this.events.length>=e&&this.flush();}flush(){try{if(this.events.length===0||!this.initialized)return;this.transporter.send({sessionAttributes:this.getSessionAttributes(),events:this.events}),this.events=[],this.scheduleFlush();}catch(n){s(n);}}scheduleFlush(){try{this.timeoutId!==null&&(u.clearTimeout(this.timeoutId),this.timeoutId=null);let n=this.config.getConfig()?.options?.batchTimeout;if(!n)return;this.timeoutId=u.setTimeout(()=>{this.timeoutId=null,this.flush();},n);}catch(n){s(n);}}generateSessionId(){return Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}detectBrowser(){let n=navigator.userAgent,e="unknown",t="unknown",r=navigator.platform||"unknown",o=/Mobile|Android|iPhone|iPad|iPod/i.test(n);return /Edg/.test(n)?(e="Edge",t=n.match(/Edg\/([\d.]+)/)?.[1]||t):/Chrome/.test(n)&&!/Chromium/.test(n)?(e="Chrome",t=n.match(/Chrome\/([\d.]+)/)?.[1]||t):/Firefox/.test(n)?(e="Firefox",t=n.match(/Firefox\/([\d.]+)/)?.[1]||t):/Safari/.test(n)&&!/Chrome/.test(n)?(e="Safari",t=n.match(/Version\/([\d.]+)/)?.[1]||t):/Trident/.test(n)?(e="Internet Explorer",/rv:([^)]+)\)/i.test(n)?t=n.match(/rv:([^)]+)\)/i)?.[1]||t:t=n.match(/MSIE ([^;]+)/)?.[1]||t):/OPR/.test(n)&&(e="Opera",t=n.match(/OPR\/([\d.]+)/)?.[1]||t),{name:e,version:t,platform:r,language:navigator.language,mobile:o}}getSessionAttributes(){let n=this.detectBrowser();return {cluster:this.config.getConfig()?.cluster||"",env:this.config.getConfig()?.environment||"",session_id:sessionStorage?.getItem("gcId")||this.generateSessionId(),user:this.config.getConfig()?.userIdentifier||{},"service.name":this.config.getConfig()?.appId,userAgent:navigator.userAgent,browser:n}}};T.instance=null;var L=T;var E=class{constructor(){this.logger=v.getInstance();this.eventsPool=L.getInstance();}};function I({text:i,maxLength:n=1e4}){return i.length<=n?i:i.substring(0,n)}var A=class extends E{constructor(){super(...arguments);this.eventHandlers=[];this.capturedEvents=["click","change","keydown","select","submit"];this.getShouldMaskText=e=>[e.target?.type==="password",e.target?.id?.toLowerCase().includes("password"),e.target?.id?.toLowerCase().includes("credit-card"),e.target?.id?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.getAttribute("data-private")].some(r=>r);this.getKeyCode=e=>{if(e instanceof KeyboardEvent&&e.code&&e.key!=="Dead"){let t=this.getShouldMaskText({target:e.target});return t||t?"*":e.key}return ""};this.getText=e=>{let t=e.target;return I({text:t.innerText||""})};this.getSelector=e=>e.target instanceof Element&&this.generateSelector(e.target)||"";this.getCoordinates=e=>{if({mouseup:true,mousedown:true,mousemove:true,mouseover:true}[e.type]){let{clientX:r,clientY:o}=e||{};return {clientX:r,clientY:o}}return null};}initialize(){try{this.logger.log("[dom-events-listener.initialize] called"),this.capturedEvents?.forEach(e=>{let t=r=>{try{this.handleEvent(r);}catch(o){s(o);}};this.eventHandlers.push({type:e,handler:t}),u?.addEventListener(e,t);});}catch(e){s(e);}}destroy(){this.eventHandlers.forEach(({type:e,handler:t})=>{global?.removeEventListener?.(e,t);}),this.eventHandlers=[];}handleEvent(e){try{if(!S())return;let r=this.buildEvent(e);this.queueEvent(r);}catch(t){s(t);}}buildEvent(e){let t=this.getSelector(e),r=this.getCoordinates(e),o=e.target,a=this.getKeyCode(e),l=this.getText(e);this.logger.log("[dom-events-listener.buildEvent] called");let g={selector:t,keyCode:a,type:e.type,coordinates:r||{clientX:0,clientY:0},target:{id:o.id,tagName:o.tagName,className:o.className,text:l}};return f({type:"dom.event",attributes:g})}queueEvent(e){try{this.logger.log("[dom-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}generateSelector(e,t={}){if(!e||!e.nodeType||e.nodeType!==Node.ELEMENT_NODE)return "";let r=t.root||document.body||document.documentElement,o=t.maxAttempts||10,a=t.priorityAttributes||["id","class","name","aria-label","type","title","alt"];if(e.tagName?.toLowerCase()==="html")return "html";let l="",g=0,c=e,y=[];for(;c&&c!==r&&c!==document.documentElement&&g<o;){let h=c.tagName?.toLowerCase()||"";try{let p=c.getAttribute("id");if(p&&/^[a-zA-Z][\w-]*$/.test(p))return `#${p}`;if(c.classList?.length){let d=Array.from(c.classList).filter(m=>m&&typeof m=="string").map(m=>`.${m}`);d.length&&(h+=d.join(""));}for(let d of a)if(!(d==="id"||d==="class"))try{let m=c.getAttribute(d);m&&(h+=`[${d}="${m.replace(/"/g,'\\"')}"]`);}catch{}}catch{h=c.tagName?.toLowerCase()||"*";}y.unshift(h||"*"),l=y.join(" > ");try{if(r.querySelectorAll(l).length===1)return l}catch{y.shift(),l=y.join(" > ");}try{c=c.parentElement;}catch{break}g++;}return l||"*"}};var B=["log","info","warn","error","assert","trace"],k=class extends E{constructor(){super(...arguments);this.originalConsole=null;this.isInitialized=false;}initialize(){if(!this.isInitialized)try{this.originalConsole=this.captureConsoleMethods(),B.forEach(e=>{e in console&&(console[e]=(...t)=>{try{this.handleEvent(t,e);}catch(r){s(r);}finally{this.originalConsole?.[e]&&this.originalConsole[e](...t);}});}),this.isInitialized=!0;}catch(e){s(e);}}destroy(){try{if(!this.isInitialized)return;B.forEach(e=>{this.originalConsole&&this.originalConsole[e]&&(console[e]=this.originalConsole[e]);}),this.isInitialized=!1;}catch(e){s(e);}}handleEvent(e,t){try{if(!S())return;let o=this.formatMessage(Array.isArray(e)?e:[e]);if(!o||o?.includes("groundcoverIgnore"))return;let a=this.buildEvent({message:o,level:t});this.queueEvent(a);}catch(r){s(r);}}buildEvent({message:e,level:t}){return f({type:"log",attributes:{message:I({text:e}),level:t}})}queueEvent(e){try{this.logger.log("[logs-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}formatMessage(e){if(!Array.isArray(e))return String(e);try{return e.map(t=>{if(t===void 0)return "undefined";if(t===null)return "null";if(typeof t=="object")try{return JSON.stringify(t)}catch{return Object.prototype.toString.call(t)}return String(t)}).join(" ")}catch(t){return s(t),"[Error formatting console message]"}}captureConsoleMethods(){let e={};try{B.forEach(t=>{console&&typeof console[t]=="function"&&(e[t]=console[t].bind(console));});}catch(t){s(t);}return e}};var q=class extends E{constructor(){super(...arguments);this.config=b.getInstance();this.handleEvent=e=>{try{let t=this.config.getConfig()?.dsn;if(t&&e.url?.includes(t)||!S())return;let o=this.buildEvent(e);this.queueEvent(o);}catch(t){s(t);}};this.buildEvent=e=>{let t="";try{t=new URL(e.url).pathname;}catch{}let r=this.formatHeaders(e.request.headers),o={type:"HTTP",operation:{name:e.method},resource_name:t,status:e.status?.toString(),subType:e.method,http:{route:t,path:t,method:e.method,status:e.status?.toString(),request:{headers:r,method:e.method},response:{headers:r,status_code:e.status?.toString()}},error:e?.error?.type?{type:e.error?.type||"Unknown error"}:void 0,gc:{request:{body:e.request.body},response:{body:e.response.body}}};return f({type:"network",timestamp:e?.timestamp?new Date(e?.timestamp||"").getTime()*1e6:void 0,end_time:e?.end_time?new Date(e?.end_time||"").getTime()*1e6:void 0,span_name:`${e.method} ${t}`,attributes:o})};}initialize(){this.logger.log("[network-events-listener.initialize] called"),this.patchXHR(),this.patchFetch();}destroy(){globalThis.XMLHttpRequest.prototype.open=globalThis.XMLHttpRequest.prototype.open,globalThis.XMLHttpRequest.prototype.send=globalThis.XMLHttpRequest.prototype.send,globalThis.fetch=globalThis.fetch;}queueEvent(e){try{this.logger.log("[network-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}patchXHR(){let e=this,t=globalThis.XMLHttpRequest.prototype.open,r=globalThis.XMLHttpRequest.prototype.send,o=globalThis.XMLHttpRequest.prototype.setRequestHeader;globalThis.XMLHttpRequest.prototype.open=function(a,l,g=true,c,y){if(e.shouldIgnoreRequest(l.toString()))return t.apply(this,[a,l,g,c,y]);let h=new URL(l.toString(),globalThis.location.href).href;return this._requestMethod=a,this._requestUrl=h,this._requestHeaders={},t.apply(this,[a,l,g,c,y])},globalThis.XMLHttpRequest.prototype.setRequestHeader=function(a,l){return this._requestHeaders&&(this._requestHeaders[a]=l),o.apply(this,[a,l])},globalThis.XMLHttpRequest.prototype.send=function(...a){if(!this._requestUrl||e.shouldIgnoreRequest(this._requestUrl.toString()))return r.apply(this,a);this._requestBody=a[0]||"";let l=Date.now();return this.addEventListener("load",()=>{let g=Date.now(),c={};this.getAllResponseHeaders().split(/\r?\n/).forEach(h=>{let[p,d]=h.split(": ");p&&d&&(c[p.trim()]=d.trim());});let y={timestamp:l,end_time:g,method:this._requestMethod,url:this._requestUrl,body:this._requestBody,status:this.status,request:{headers:this._requestHeaders||{},body:this._requestBody},response:{headers:c,body:this.responseText||this.response||""}};e.handleEvent(y);}),r.apply(this,a)};}patchFetch(){let e=globalThis.fetch;globalThis.fetch=(...t)=>{let[r,o]=t,a=o?.method||"GET",l=o?.body||"",g=r instanceof Request?r.url:r.toString();if(this.shouldIgnoreRequest(g))return e.apply(globalThis,t);let c={};o?.headers&&(o.headers instanceof Headers?o.headers.forEach((h,p)=>{c[p]=h;}):typeof o.headers=="object"&&Object.assign(c,o.headers));let y=Date.now();return e.apply(globalThis,t).then(async h=>{let p=Date.now(),d=h.clone(),m="";try{m=await d.text();}catch{m="[unreadable response body]";}let R={};d.headers.forEach((j,G)=>{R[G]=j;});let $={method:a,url:g,timestamp:y,body:l.toString(),status:d.status,end_time:p,request:{headers:c,body:l.toString()},response:{headers:R,body:m}};return this.handleEvent($),h}).catch(h=>{let p=Date.now(),d="NetworkError",m=h.message||"Unknown network error";h instanceof TypeError&&m.includes("Failed to fetch")?d="ERR_NETWORK_FAILURE":m.includes("Name not resolved")?d="ERR_NAME_NOT_RESOLVED":m.includes("Connection refused")&&(d="ERR_CONNECTION_REFUSED");let R={method:a,url:g,body:l.toString(),status:0,end_time:p,request:{headers:c,body:l.toString()},response:{headers:{},body:""},error:{type:d}};throw this.handleEvent(R),h})};}formatHeaders(e){let t=["authorization","cookie","set-cookie"];return Object.entries(e)?.reduce((r,[o,a])=>{let l=o.toLowerCase();return t.includes(l)||/(token|key|secret|password)/i.test(l)?r[o]="[REDACTED]":r[o]=I({text:a}),r},{})}shouldIgnoreRequest(e){return [".tsx",".jsx",".css"].some(r=>e.toLowerCase().endsWith(r))}};var N=class extends E{constructor(){super(...arguments);this.handleEvent=(e,t)=>{this.logger.log("[errors-events-listener.handleEvent] called");try{let r;if(e instanceof Error)r=e,this.enhanceError(r);else if(e instanceof ErrorEvent){if(r=e.error||new Error(e.message||"Unknown error"),/Script error\.?/.test(r.message))return;this.enhanceError(r,e);}else if(e instanceof PromiseRejectionEvent)r=this.createUnhandledRejectionError(e);else return;let o=this.buildEvent(r,t);this.queueEvent(o);}catch(r){s(r);}};}initialize(){u?.addEventListener("error",this.handleEvent),u?.addEventListener("unhandledrejection",this.handleEvent);}destroy(){u?.removeEventListener("error",this.handleEvent),u?.removeEventListener("unhandledrejection",this.handleEvent);}buildEvent(e,t){let r={type:e.name||"Error",message:e.message||"Unknown error",stacktrace:this.buildStackTrace(e),fingerprint:`${e.name}:${I({text:e.message,maxLength:400})}`,handled:t?.handled||false};return f({type:"exception",attributes:r})}queueEvent(e){try{this.logger.log("[errors-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}enhanceError(e,t){let{filename:r,lineno:o,colno:a}=t||{};r&&!e.fileName&&Object.defineProperty(e,"fileName",{value:r}),o&&!e.lineNumber&&Object.defineProperty(e,"lineNumber",{value:o}),a&&!e.columnNumber&&Object.defineProperty(e,"columnNumber",{value:a});}createUnhandledRejectionError(e){let t;if(e.reason instanceof Error)t=e.reason;else {let r=typeof e.reason=="object"?JSON.stringify(e.reason,null,2):String(e.reason);t=new Error(r),t.name="UnhandledRejection",Object.defineProperty(t,"originalReason",{value:e.reason,enumerable:false});}return t}buildStackTrace(e){if(!e)return [];try{return Z.parse(e).map(r=>({filename:r.fileName||"unknown",function:r.functionName||"anonymous",lineno:r.lineNumber||0,colno:r.columnNumber||0}))}catch{return []}}};var D=class extends E{constructor(){super(...arguments);this.currentUrl=globalThis.location.href;this.mutationObserver=null;}initialize(){if(u.MutationObserver){let e=u.document.querySelector("body");e&&(this.mutationObserver=new MutationObserver(()=>{this.handleUrlChange();}),this.mutationObserver.observe(e,{childList:true,subtree:true}));}u?.addEventListener("popstate",()=>{this.handleUrlChange();});}destroy(){this.mutationObserver?.disconnect(),this.mutationObserver=null;}handleEvent(){try{this.logger.log("[navigation-listener.handleEvent] called");let e=this.buildEvent();this.queueEvent(e);}catch(e){s(e);}}buildEvent(){let e={url:globalThis.location.href};return f({type:"navigation",attributes:e})}queueEvent(e){try{this.logger.log("[navigation-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}handleUrlChange(){let e=globalThis.location.href;e!==this.currentUrl&&(this.currentUrl=e,this.handleEvent());}};var P=class extends E{constructor(){super(),this.startTime=performance.now();}initialize(){try{this.logger.log("[page-load-listener.initialize] called"),u?.addEventListener("load",()=>{this.handleEvent();});}catch(n){s(n);}}destroy(){u?.removeEventListener("load",this.handleEvent);}handleEvent(){try{this.logger.log("[page-load-listener.handleEvent] called");let n=this.buildEvent();this.queueEvent(n);}catch(n){s(n);}}buildEvent(){let n=performance.now()-this.startTime,e=performance.getEntriesByType("resource"),t={count:e.length,totalSize:0,totalDuration:0,byType:{}};e.forEach(o=>{let a=o,l=a.transferSize||0,g=a.duration,c=a.initiatorType;t.totalSize+=l,t.totalDuration+=g,t.byType[c]||(t.byType[c]={count:0,size:0,duration:0}),t.byType[c].count++,t.byType[c].size+=l,t.byType[c].duration+=g;});let r={url:u?.location?.href||"",loadTime:n,referrer:u?.document?.referrer||"",resources:t};return f({type:"pageload",attributes:r})}queueEvent(n){try{this.logger.log("[page-load-listener.queueEvent] called"),n&&this.eventsPool.addEvent(n);}catch(e){s(e);}}};var _=class extends E{constructor(){super(...arguments);this.handleEvent=e=>{try{if(!S())return;let r=this.buildEvent(e);this.queueEvent(r);}catch(t){s(t);}};}initialize(){onCLS(this.handleEvent),onLCP(this.handleEvent),onFCP(this.handleEvent),onTTFB(this.handleEvent),onINP(this.handleEvent);}destroy(){}buildEvent(e){let t={name:e.name,value:e.value,id:e.id,navigationType:e.navigationType||""};return f({type:"performance",attributes:t})}queueEvent(e){try{this.logger.log("[performance-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}};var O=class{constructor(){this.logger=v.getInstance();this.eventsPool=L.getInstance();this.logEventsListener=null;this.domEventsListener=null;this.errorsEventsListener=null;this.networkEventsListener=null;this.navigationListener=null;this.performanceListener=null;this.pageLoadListener=null;}instrument(){this.logger.log("[instrumentation-manager.instrument] called"),this.domEventsListener=new A,this.logEventsListener=new k,this.errorsEventsListener=new N,this.networkEventsListener=new q,this.navigationListener=new D,this.performanceListener=new _,this.pageLoadListener=new P,this.domEventsListener.initialize(),this.logEventsListener.initialize(),this.errorsEventsListener.initialize(),this.networkEventsListener.initialize(),this.navigationListener.initialize(),this.performanceListener.initialize(),this.pageLoadListener.initialize(),this.logger.log("[instrumentation-manager.instrument] initialized listeners");}sendCustomEvent(n){this.logger.log("[instrumentation-manager.sendCustomEvent] called",n);try{let e=f({type:"custom",attributes:{event:n?.event,attributes:n?.attributes}});this.eventsPool.addEvent(e);}catch(e){s(e);}}captureException(n){try{this.logger.log("[instrumentation-manager.captureException] called",n),this.errorsEventsListener?.handleEvent(n,{handled:!0});}catch(e){s(e);}}uninstrument(){this.domEventsListener?.destroy(),this.logEventsListener?.destroy(),this.errorsEventsListener?.destroy(),this.networkEventsListener?.destroy(),this.navigationListener?.destroy(),this.performanceListener?.destroy();}};var U=class{constructor(n){this.initialized=false;if(this.logger=v.initialize({debug:n.options?.debug||false,prefix:"[groundcover]"}),this.logger.log("[session-manager] initialize called"),this.instrumentationManager=new O,this.idGenerator=new C,!(n.options?.sessionSampleRate?Math.random()<n.options?.sessionSampleRate:true)){this.logger.log("[session-manager] session is not sampled");return}if(this.initialized){this.logger.log("[session-manager] SDK already initialized");return}b.getInstance().initialize(n),L.getInstance().initialize();let o=this.idGenerator.generateId();globalThis?.sessionStorage?.setItem("gcId",o),this.instrumentationManager.instrument(),this.initialized=true;}identifyUser(n){if(this.logger.log("[session-manager] identifyUser called"),!this.initialized){this.logger.log("[session-manager] cannot identify user: SDK not initialized");return}b.getInstance().updateConfig({userIdentifier:n});}sendCustomEvent(n){if(!this.initialized){this.logger.log("[session-manager] cannot send custom event: SDK not initialized");return}this.instrumentationManager.sendCustomEvent(n);}captureException(n){if(!this.initialized){this.logger.log("[session-manager] Cannot capture exception: SDK not initialized");return}this.instrumentationManager.captureException(n);}destroy(){this.initialized&&(this.instrumentationManager.uninstrument(),globalThis.sessionStorage?.removeItem("gcId"),this.initialized=false);}};var w;function ie(i){try{w=new U({cluster:i?.cluster,environment:i?.environment,dsn:i?.dsn,appId:i?.appId,userIdentifier:i?.userIdentifier,apiKey:i?.apiKey,options:i?.options});}catch(n){s(n);}}function oe(i){if(!w){console.warn("[groundcover] identifyUser: groundcover is not initialized. please call init() first");return}w.identifyUser(i);}function se(i){w&&w.sendCustomEvent(i);}function ae(i){w&&w.captureException(i);}var Kt={init:ie,identifyUser:oe,sendCustomEvent:se,captureException:ae};export{Kt as default};
1
+ import Z from'error-stack-parser';import {onCLS,onLCP,onFCP,onTTFB,onINP}from'web-vitals';var Y=console.log.bind(console),b=class i{constructor(){this.isDebugEnabled=false,this.prefix="";}static initialize(r){return i.instance||(i.instance=new i),r&&(i.instance.isDebugEnabled=r.debug??false,i.instance.prefix=r.prefix??""),i.instance}static getInstance(r){return i?.instance||i.initialize(r)}formatMessage(r){return `[${new Date().toISOString()}] ${this.prefix} ${r}`}log(r,...e){this.isDebugEnabled&&Y(this.formatMessage(r),...e);}updateConfig(r){this.isDebugEnabled=r.debug??this.isDebugEnabled,this.prefix=r.prefix??this.prefix;}};var W=b.getInstance();function s(i){W.log("[error-handler.handleError] called",i,{groundcoverIgnore:true});}var F={batchSize:10,batchTimeout:1e4,eventSampleRate:1,sessionSampleRate:1,environment:"development",debug:false,maskFields:[],enabledEvents:["dom","network","error","log"]};var R=class{constructor(r){this.dsn=r.dsn,this.appId=r.appId,this.cluster=r.cluster,this.apiKey=r.apiKey,this.environment=r.environment,this.userIdentifier=r.userIdentifier||null,this.options={...F,...r.options};}getEndpoint(){return this.dsn}};var y=class i{constructor(){this.config=null;this.logger=b.getInstance();}static getInstance(){return i.instance||(i.instance=new i),i.instance}initialize(r){this.config||(this.config=new R(r));}getConfig(){return this.config?this.config:(this.logger.log("[config-manager] configuration not initialized"),null)}updateConfig(r){if(this.logger.log("[config-manager] updateConfig called"),!this.config){this.logger.log("[config-manager] configuration not initialized");return}r?.options&&(this.logger.log("[config-manager] updating options"),this.config.options={...this.config.options,...r.options}),r?.userIdentifier&&(this.logger.log("[config-manager] updating user identifier"),this.config.userIdentifier={...this.config.userIdentifier,...r.userIdentifier});}};var u=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof global=="object"?global:{};var C=class{constructor(){this.generateTraceId=U(16);this.generateSpanId=U(8);this.generateId=U(16);}},x=Array(32);function U(i){return function(){for(let e=0;e<i*2;e++)x[e]=Math.floor(Math.random()*16)+48,x[e]>=58&&(x[e]+=39);return String.fromCharCode.apply(null,x.slice(0,i*2))}}var J=y.getInstance(),K=new C;function V(){return {path:u?.location?.pathname,url:u?.location?.href,title:u?.document?.title}}function S(){let i=J?.getConfig()?.options?.eventSampleRate;return typeof i>"u"||Number.isNaN(i)?true:Math.random()<=i}function X(i,r=""){return Object.entries(i).reduce((e,[t,n])=>{let o=r?`${r}.${t}`:t;return typeof n=="object"&&n!==null?Object.assign(e,X(n,o)):e[o]=n,e},{})}function f(i){let r=Date.now()*1e6,e=K.generateId(),t=K.generateSpanId(),n=K.generateTraceId(),o=X(i.attributes||{}),l=V(),a={type:i.type,id:e,spanId:t,parentSpanId:"",traceId:n,attributes:{...o,location:l}};return i.span_name&&(a.span_name=i.span_name),i.type==="network"?(a.start_timestamp=i.timestamp||r,a.end_timestamp=i?.end_timestamp):a.timestamp=r,a}var N=class{constructor(){this.logger=b.getInstance();this.config=y.getInstance();}async send(r){let e=this.config.getConfig();if(e)try{if(e.options.debug){this.logger.log("Sending batch:",r,{groundcoverIgnore:!0});return}let t=e.apiKey,n=this.buildEndpoint();if(!t){this.logger.log("No API key found");return}fetch(n,{method:"POST",headers:{"Content-Type":"application/json",apikey:t},body:JSON.stringify(r)});}catch(t){e.options.debug&&this.logger.log("Failed to send batch:",t,{groundcoverIgnore:true});}}buildEndpoint(){let r=this.config.getConfig();if(!r)return "";let{dsn:e}=r;return `${e}/json/rum`}};var w=class w{constructor(){this.events=[];this.timeoutId=null;this.config=y.getInstance();this.initialized=false;this.transporter=new N;}static getInstance(){return w.instance||(w.instance=new w),w.instance}initialize(){try{if(this.initialized)return;this.scheduleFlush(),globalThis.addEventListener("unload",()=>{this.flush();}),this.initialized=!0;}catch(r){s(r);}}addEvent(r){if(!r||!this.initialized)return;this.events.push(r);let e=this.config.getConfig()?.options?.batchSize||100;this.events.length>=e&&this.flush();}flush(){try{if(this.events.length===0||!this.initialized)return;this.transporter.send({sessionAttributes:this.getSessionAttributes(),events:this.events}),this.events=[],this.scheduleFlush();}catch(r){s(r);}}scheduleFlush(){try{this.timeoutId!==null&&(u.clearTimeout(this.timeoutId),this.timeoutId=null);let r=this.config.getConfig()?.options?.batchTimeout;if(!r)return;this.timeoutId=u.setTimeout(()=>{this.timeoutId=null,this.flush();},r);}catch(r){s(r);}}generateSessionId(){return Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}detectBrowser(){let r=navigator.userAgent,e="unknown",t="unknown",n=navigator.platform||"unknown",o=/Mobile|Android|iPhone|iPad|iPod/i.test(r);return /Edg/.test(r)?(e="Edge",t=r.match(/Edg\/([\d.]+)/)?.[1]||t):/Chrome/.test(r)&&!/Chromium/.test(r)?(e="Chrome",t=r.match(/Chrome\/([\d.]+)/)?.[1]||t):/Firefox/.test(r)?(e="Firefox",t=r.match(/Firefox\/([\d.]+)/)?.[1]||t):/Safari/.test(r)&&!/Chrome/.test(r)?(e="Safari",t=r.match(/Version\/([\d.]+)/)?.[1]||t):/Trident/.test(r)?(e="Internet Explorer",/rv:([^)]+)\)/i.test(r)?t=r.match(/rv:([^)]+)\)/i)?.[1]||t:t=r.match(/MSIE ([^;]+)/)?.[1]||t):/OPR/.test(r)&&(e="Opera",t=r.match(/OPR\/([\d.]+)/)?.[1]||t),{name:e,version:t,platform:n,language:navigator.language,mobile:o}}getSessionAttributes(){let r=this.detectBrowser();return {cluster:this.config.getConfig()?.cluster||"",env:this.config.getConfig()?.environment||"",session_id:sessionStorage?.getItem("gcId")||this.generateSessionId(),user:this.config.getConfig()?.userIdentifier||{},"service.name":this.config.getConfig()?.appId,userAgent:navigator.userAgent,browser:r}}};w.instance=null;var L=w;var E=class{constructor(){this.logger=b.getInstance();this.eventsPool=L.getInstance();}};function I({text:i,maxLength:r=1e4}){return i.length<=r?i:i.substring(0,r)}var k=class extends E{constructor(){super(...arguments);this.eventHandlers=[];this.capturedEvents=["click","change","keydown","select","submit"];this.getShouldMaskText=e=>[e.target?.type==="password",e.target?.id?.toLowerCase().includes("password"),e.target?.id?.toLowerCase().includes("credit-card"),e.target?.id?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("cc"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.className?.toLowerCase().includes("credit-card"),e.target?.getAttribute("data-private")].some(n=>n);this.getKeyCode=e=>{if(e instanceof KeyboardEvent&&e.code&&e.key!=="Dead"){let t=this.getShouldMaskText({target:e.target});return t||t?"*":e.key}return ""};this.getText=e=>{let t=e.target;return I({text:t.innerText||""})};this.getSelector=e=>e.target instanceof Element&&this.generateSelector(e.target)||"";this.getCoordinates=e=>{if({mouseup:true,mousedown:true,mousemove:true,mouseover:true}[e.type]){let{clientX:n,clientY:o}=e||{};return {clientX:n,clientY:o}}return null};}initialize(){try{this.logger.log("[dom-events-listener.initialize] called"),this.capturedEvents?.forEach(e=>{let t=n=>{try{this.handleEvent(n);}catch(o){s(o);}};this.eventHandlers.push({type:e,handler:t}),u?.addEventListener(e,t);});}catch(e){s(e);}}destroy(){this.eventHandlers.forEach(({type:e,handler:t})=>{global?.removeEventListener?.(e,t);}),this.eventHandlers=[];}handleEvent(e){try{if(!S())return;let n=this.buildEvent(e);this.queueEvent(n);}catch(t){s(t);}}buildEvent(e){let t=this.getSelector(e),n=this.getCoordinates(e),o=e.target,l=this.getKeyCode(e),a=this.getText(e);this.logger.log("[dom-events-listener.buildEvent] called");let d={dom_event_selector:t,dom_event_key_code:l,dom_event_type:e.type,dom_event_coordinates:n||{clientX:0,clientY:0},dom_event_target:{id:o.id,tagName:o.tagName,className:o.className,text:a}};return f({type:"dom.event",attributes:d})}queueEvent(e){try{this.logger.log("[dom-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}generateSelector(e,t={}){if(!e||!e.nodeType||e.nodeType!==Node.ELEMENT_NODE)return "";let n=t.root||document.body||document.documentElement,o=t.maxAttempts||10,l=t.priorityAttributes||["id","class","name","aria-label","type","title","alt"];if(e.tagName?.toLowerCase()==="html")return "html";let a="",d=0,c=e,v=[];for(;c&&c!==n&&c!==document.documentElement&&d<o;){let h=c.tagName?.toLowerCase()||"";try{let m=c.getAttribute("id");if(m&&/^[a-zA-Z][\w-]*$/.test(m))return `#${m}`;if(c.classList?.length){let g=Array.from(c.classList).filter(p=>p&&typeof p=="string").map(p=>`.${p}`);g.length&&(h+=g.join(""));}for(let g of l)if(!(g==="id"||g==="class"))try{let p=c.getAttribute(g);p&&(h+=`[${g}="${p.replace(/"/g,'\\"')}"]`);}catch{}}catch{h=c.tagName?.toLowerCase()||"*";}v.unshift(h||"*"),a=v.join(" > ");try{if(n.querySelectorAll(a).length===1)return a}catch{v.shift(),a=v.join(" > ");}try{c=c.parentElement;}catch{break}d++;}return a||"*"}};var B=["log","info","warn","error","assert","trace"],M=class extends E{constructor(){super(...arguments);this.originalConsole=null;this.isInitialized=false;}initialize(){if(!this.isInitialized)try{this.originalConsole=this.captureConsoleMethods(),B.forEach(e=>{e in console&&(console[e]=(...t)=>{try{this.handleEvent(t,e);}catch(n){s(n);}finally{this.originalConsole?.[e]&&this.originalConsole[e](...t);}});}),this.isInitialized=!0;}catch(e){s(e);}}destroy(){try{if(!this.isInitialized)return;B.forEach(e=>{this.originalConsole&&this.originalConsole[e]&&(console[e]=this.originalConsole[e]);}),this.isInitialized=!1;}catch(e){s(e);}}handleEvent(e,t){try{if(!S())return;let o=this.formatMessage(Array.isArray(e)?e:[e]);if(!o||o?.includes("groundcoverIgnore"))return;let l=this.buildEvent({message:o,level:t});this.queueEvent(l);}catch(n){s(n);}}buildEvent({message:e,level:t}){return f({type:"log",attributes:{message:I({text:e}),level:t}})}queueEvent(e){try{this.logger.log("[logs-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}formatMessage(e){if(!Array.isArray(e))return String(e);try{return e.map(t=>{if(t===void 0)return "undefined";if(t===null)return "null";if(typeof t=="object")try{return JSON.stringify(t)}catch{return Object.prototype.toString.call(t)}return String(t)}).join(" ")}catch(t){return s(t),"[Error formatting console message]"}}captureConsoleMethods(){let e={};try{B.forEach(t=>{console&&typeof console[t]=="function"&&(e[t]=console[t].bind(console));});}catch(t){s(t);}return e}};var z=class extends E{constructor(){super(...arguments);this.config=y.getInstance();this.handleEvent=e=>{try{let t=this.config.getConfig()?.dsn;if(t&&e.url?.includes(t)||!S())return;let o=this.buildEvent(e);this.queueEvent(o);}catch(t){s(t);}};this.buildEvent=e=>{let t="";try{t=new URL(e.url).pathname;}catch{}let n=this.formatHeaders(e.request.headers),o={type:"HTTP",operation:{name:e.method},resource_name:t,status:e.status?.toString(),subType:e.method,http:{route:t,path:t,method:e.method,status:e.status?.toString(),request:{headers:n,method:e.method},response:{headers:n,status_code:e.status?.toString()}},error:e?.error?.type?{type:e.error?.type||"Unknown error"}:void 0,gc:{request:{body:e.request.body},response:{body:e.response.body}}};return f({type:"network",timestamp:e?.timestamp&&!Number.isNaN(e.timestamp)?e.timestamp*1e6:void 0,end_timestamp:e?.end_time&&!Number.isNaN(e.end_time)?e.end_time*1e6:void 0,span_name:`${e.method} ${t}`,attributes:o})};}initialize(){this.logger.log("[network-events-listener.initialize] called"),this.patchXHR(),this.patchFetch();}destroy(){globalThis.XMLHttpRequest.prototype.open=globalThis.XMLHttpRequest.prototype.open,globalThis.XMLHttpRequest.prototype.send=globalThis.XMLHttpRequest.prototype.send,globalThis.fetch=globalThis.fetch;}queueEvent(e){try{this.logger.log("[network-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}patchXHR(){let e=this,t=globalThis.XMLHttpRequest.prototype.open,n=globalThis.XMLHttpRequest.prototype.send,o=globalThis.XMLHttpRequest.prototype.setRequestHeader,l;globalThis.XMLHttpRequest.prototype.open=function(a,d,c=true,v,h){if(l=Date.now(),e.shouldIgnoreRequest(d.toString()))return t.apply(this,[a,d,c,v,h]);let m=new URL(d.toString(),globalThis.location.href).href;return this._requestMethod=a,this._requestUrl=m,this._requestHeaders={},t.apply(this,[a,d,c,v,h])},globalThis.XMLHttpRequest.prototype.setRequestHeader=function(a,d){return this._requestHeaders&&(this._requestHeaders[a]=d),o.apply(this,[a,d])},globalThis.XMLHttpRequest.prototype.send=function(...a){return !this._requestUrl||e.shouldIgnoreRequest(this._requestUrl.toString())?n.apply(this,a):(this._requestBody=a[0]||"",this.addEventListener("load",()=>{let d=Date.now(),c={};this.getAllResponseHeaders().split(/\r?\n/).forEach(h=>{let[m,g]=h.split(": ");m&&g&&(c[m.trim()]=g.trim());});let v={timestamp:l,end_time:d,method:this._requestMethod,url:this._requestUrl,body:this._requestBody,status:this.status,request:{headers:this._requestHeaders||{},body:this._requestBody},response:{headers:c,body:this.responseText||this.response||""}};e.handleEvent(v);}),n.apply(this,a))};}patchFetch(){let e=globalThis.fetch;globalThis.fetch=(...t)=>{let n=Date.now(),[o,l]=t,a=l?.method||"GET",d=l?.body||"",c=o instanceof Request?o.url:o.toString();if(this.shouldIgnoreRequest(c))return e.apply(globalThis,t);let v={};return l?.headers&&(l.headers instanceof Headers?l.headers.forEach((h,m)=>{v[m]=h;}):typeof l.headers=="object"&&Object.assign(v,l.headers)),e.apply(globalThis,t).then(async h=>{let m=Date.now(),g=h.clone(),p="";try{p=await g.text();}catch{p="[unreadable response body]";}let _={};g.headers.forEach((j,G)=>{_[G]=j;});let $={method:a,url:c,timestamp:n,body:d.toString(),status:g.status,end_time:m,request:{headers:v,body:d.toString()},response:{headers:_,body:p}};return this.handleEvent($),h}).catch(h=>{let m=Date.now(),g="NetworkError",p=h.message||"Unknown network error";h instanceof TypeError&&p.includes("Failed to fetch")?g="ERR_NETWORK_FAILURE":p.includes("Name not resolved")?g="ERR_NAME_NOT_RESOLVED":p.includes("Connection refused")&&(g="ERR_CONNECTION_REFUSED");let _={method:a,url:c,body:d.toString(),status:0,end_time:m,request:{headers:v,body:d.toString()},response:{headers:{},body:""},error:{type:g}};throw this.handleEvent(_),h})};}formatHeaders(e){let t=["authorization","cookie","set-cookie"];return Object.entries(e)?.reduce((n,[o,l])=>{let a=o.toLowerCase();return t.includes(a)||/(token|key|secret|password)/i.test(a)?n[o]="[REDACTED]":n[o]=I({text:l}),n},{})}shouldIgnoreRequest(e){return [".tsx",".jsx",".css"].some(n=>e.toLowerCase().endsWith(n))}};var q=class extends E{constructor(){super(...arguments);this.handleEvent=(e,t)=>{this.logger.log("[errors-events-listener.handleEvent] called");try{let n;if(e instanceof Error)n=e,this.enhanceError(n);else if(e instanceof ErrorEvent){if(n=e.error||new Error(e.message||"Unknown error"),/Script error\.?/.test(n.message))return;this.enhanceError(n,e);}else if(e instanceof PromiseRejectionEvent)n=this.createUnhandledRejectionError(e);else return;let o=this.buildEvent(n,t);this.queueEvent(o);}catch(n){s(n);}};}initialize(){u?.addEventListener("error",this.handleEvent),u?.addEventListener("unhandledrejection",this.handleEvent);}destroy(){u?.removeEventListener("error",this.handleEvent),u?.removeEventListener("unhandledrejection",this.handleEvent);}buildEvent(e,t){let n={error_type:e.name||"Error",error_message:e.message||"Unknown error",error_stacktrace:this.buildStackTrace(e),error_fingerprint:`${e.name}:${I({text:e.message,maxLength:400})}`,error_handled:t?.handled||false};return f({type:"exception",attributes:n})}queueEvent(e){try{this.logger.log("[errors-events-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}enhanceError(e,t){let{filename:n,lineno:o,colno:l}=t||{};n&&!e.fileName&&Object.defineProperty(e,"fileName",{value:n}),o&&!e.lineNumber&&Object.defineProperty(e,"lineNumber",{value:o}),l&&!e.columnNumber&&Object.defineProperty(e,"columnNumber",{value:l});}createUnhandledRejectionError(e){let t;if(e.reason instanceof Error)t=e.reason;else {let n=typeof e.reason=="object"?JSON.stringify(e.reason,null,2):String(e.reason);t=new Error(n),t.name="UnhandledRejection",Object.defineProperty(t,"originalReason",{value:e.reason,enumerable:false});}return t}buildStackTrace(e){if(!e)return [];try{return Z.parse(e).map(n=>({filename:n.fileName||"unknown",function:n.functionName||"anonymous",lineno:n.lineNumber||0,colno:n.columnNumber||0}))}catch{return []}}};var A=class extends E{constructor(){super(...arguments);this.currentUrl=globalThis.location.href;this.mutationObserver=null;}initialize(){if(u.MutationObserver){let e=u.document.querySelector("body");e&&(this.mutationObserver=new MutationObserver(()=>{this.handleUrlChange();}),this.mutationObserver.observe(e,{childList:true,subtree:true}));}u?.addEventListener("popstate",()=>{this.handleUrlChange();});}destroy(){this.mutationObserver?.disconnect(),this.mutationObserver=null;}handleEvent(){try{this.logger.log("[navigation-listener.handleEvent] called");let e=this.buildEvent();this.queueEvent(e);}catch(e){s(e);}}buildEvent(){let e={page_url:globalThis.location.href};return f({type:"navigation",attributes:e})}queueEvent(e){try{this.logger.log("[navigation-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}handleUrlChange(){let e=globalThis.location.href;e!==this.currentUrl&&(this.currentUrl=e,this.handleEvent());}};var P=class extends E{constructor(){super(),this.startTime=performance.now();}initialize(){try{this.logger.log("[page-load-listener.initialize] called"),u?.addEventListener("load",()=>{this.handleEvent();});}catch(r){s(r);}}destroy(){u?.removeEventListener("load",this.handleEvent);}handleEvent(){try{this.logger.log("[page-load-listener.handleEvent] called");let r=this.buildEvent();this.queueEvent(r);}catch(r){s(r);}}buildEvent(){let r=performance.now()-this.startTime,e=performance.getEntriesByType("resource"),t={count:e.length,totalSize:0,totalDuration:0,byType:{}};e.forEach(o=>{let l=o,a=l.transferSize||0,d=l.duration,c=l.initiatorType;t.totalSize+=a,t.totalDuration+=d,t.byType[c]||(t.byType[c]={count:0,size:0,duration:0}),t.byType[c].count++,t.byType[c].size+=a,t.byType[c].duration+=d;});let n={page_url:u?.location?.href||"",page_load_time:r,page_referrer:u?.document?.referrer||"",page_resources:t};return f({type:"pageload",attributes:n})}queueEvent(r){try{this.logger.log("[page-load-listener.queueEvent] called"),r&&this.eventsPool.addEvent(r);}catch(e){s(e);}}};var D=class extends E{constructor(){super(...arguments);this.handleEvent=e=>{try{if(!S())return;let n=this.buildEvent(e);this.queueEvent(n);}catch(t){s(t);}};}initialize(){onCLS(this.handleEvent),onLCP(this.handleEvent),onFCP(this.handleEvent),onTTFB(this.handleEvent),onINP(this.handleEvent);}destroy(){}buildEvent(e){let t={performance_metric_name:e.name,performance_metric_value:e.value,performance_metric_id:e.id,performance_metric_navigation_type:e.navigationType||""};return f({type:"performance",attributes:t})}queueEvent(e){try{this.logger.log("[performance-listener.queueEvent] called"),e&&this.eventsPool.addEvent(e);}catch(t){s(t);}}};var O=class{constructor(){this.logger=b.getInstance();this.eventsPool=L.getInstance();this.logEventsListener=null;this.domEventsListener=null;this.errorsEventsListener=null;this.networkEventsListener=null;this.navigationListener=null;this.performanceListener=null;this.pageLoadListener=null;}instrument(){this.logger.log("[instrumentation-manager.instrument] called"),this.domEventsListener=new k,this.logEventsListener=new M,this.errorsEventsListener=new q,this.networkEventsListener=new z,this.navigationListener=new A,this.performanceListener=new D,this.pageLoadListener=new P,this.domEventsListener.initialize(),this.logEventsListener.initialize(),this.errorsEventsListener.initialize(),this.networkEventsListener.initialize(),this.navigationListener.initialize(),this.performanceListener.initialize(),this.pageLoadListener.initialize(),this.logger.log("[instrumentation-manager.instrument] initialized listeners");}sendCustomEvent(r){this.logger.log("[instrumentation-manager.sendCustomEvent] called",r);try{let e=f({type:"custom",attributes:{custom_event_name:r?.event,custom_user:r?.attributes}});this.eventsPool.addEvent(e);}catch(e){s(e);}}captureException(r){try{this.logger.log("[instrumentation-manager.captureException] called",r),this.errorsEventsListener?.handleEvent(r,{handled:!0});}catch(e){s(e);}}uninstrument(){this.domEventsListener?.destroy(),this.logEventsListener?.destroy(),this.errorsEventsListener?.destroy(),this.networkEventsListener?.destroy(),this.navigationListener?.destroy(),this.performanceListener?.destroy();}};var H=class{constructor(r){this.initialized=false;if(this.logger=b.initialize({debug:r.options?.debug||false,prefix:"[groundcover]"}),this.logger.log("[session-manager] initialize called"),this.instrumentationManager=new O,this.idGenerator=new C,!(r.options?.sessionSampleRate?Math.random()<r.options?.sessionSampleRate:true)){this.logger.log("[session-manager] session is not sampled");return}if(this.initialized){this.logger.log("[session-manager] SDK already initialized");return}y.getInstance().initialize(r),L.getInstance().initialize();let o=this.idGenerator.generateId();globalThis?.sessionStorage?.setItem("gcId",o),this.instrumentationManager.instrument(),this.initialized=true;}identifyUser(r){if(this.logger.log("[session-manager] identifyUser called"),!this.initialized){this.logger.log("[session-manager] cannot identify user: SDK not initialized");return}y.getInstance().updateConfig({userIdentifier:r});}sendCustomEvent(r){if(!this.initialized){this.logger.log("[session-manager] cannot send custom event: SDK not initialized");return}this.instrumentationManager.sendCustomEvent(r);}captureException(r){if(!this.initialized){this.logger.log("[session-manager] Cannot capture exception: SDK not initialized");return}this.instrumentationManager.captureException(r);}destroy(){this.initialized&&(this.instrumentationManager.uninstrument(),globalThis.sessionStorage?.removeItem("gcId"),this.initialized=false);}};var T;function ie(i){try{T=new H({cluster:i?.cluster,environment:i?.environment,dsn:i?.dsn,appId:i?.appId,userIdentifier:i?.userIdentifier,apiKey:i?.apiKey,options:i?.options});}catch(r){s(r);}}function oe(i){if(!T){console.warn("[groundcover] identifyUser: groundcover is not initialized. please call init() first");return}T.identifyUser(i);}function se(i){T&&T.sendCustomEvent(i);}function ae(i){T&&T.captureException(i);}var Kt={init:ie,identifyUser:oe,sendCustomEvent:se,captureException:ae};export{Kt as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groundcover/browser",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "description": "groundcover browser experiments SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",