vident-rum 0.14.0 → 0.14.1
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.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function g(e,t,r){return{type:e,sessionId:t,userId:r,timestamp:Date.now(),url:window.location.href,userAgent:navigator.userAgent}}function Z(e){if(e.stack)return e.stack.slice(0,2e3)}function me(e,t,r){window.addEventListener("error",o=>{let n={...g("error",e,t),type:"error",data:{message:o.message||"Unknown error",stack:o.error?Z(o.error):void 0,filename:o.filename,lineno:o.lineno,colno:o.colno}};r(n)}),window.addEventListener("unhandledrejection",o=>{let n="Unhandled Promise Rejection",s;o.reason instanceof Error?(n=o.reason.message,s=Z(o.reason)):typeof o.reason=="string"&&(n=o.reason);let a={...g("error",e,t),type:"error",data:{message:n,stack:s}};r(a)})}function ve(e,t,r,o){return{...g("error",t,r),type:"error",data:{message:e.message,stack:Z(e),requestId:o?.requestId,traceId:o?.traceId}}}function V(){let e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}function B(){let e=new Uint8Array(8);return crypto.getRandomValues(e),Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}function F(e,t,r){return`00-${e}-${t}-${r?"01":"00"}`}function he(e){let t=e.split(".");return t.length<=2||e==="localhost"?e:t.slice(-2).join(".")}function X(e,t){let r;try{r=new URL(e,window.location.origin)}catch{return!1}if(r.origin===window.location.origin)return!0;let o=he(window.location.hostname),n=he(r.hostname);if(o===n)return!0;if(t&&t.length>0){for(let s of t)if(typeof s=="string"){if(r.origin===s||r.href.startsWith(s))return!0}else if(s instanceof RegExp&&s.test(r.href))return!0}return!1}var q=null,C=null,Q=null;function Ee(e,t,r,o,n,s,a){return{type:"resource",sessionId:e.sessionId,userId:e.userId,timestamp:n,url:window.location.href,userAgent:navigator.userAgent,data:{resourceUrl:t,method:r,status:a,duration:s,initiatorType:"fetch",traceId:o}}}function ye(e,t,r){q||(q=window.fetch,C=e,Q=r??null,window.fetch=async function(n,s){let a=typeof n=="string"?n:n instanceof URL?n.toString():n.url;if(a.includes("_rsc=")||C?.ingestUrl&&a.startsWith(C.ingestUrl))return q(n,s);let i=s?.method??(typeof n!="string"&&!(n instanceof URL)?n.method??"GET":"GET"),c=X(a,C?.propagateToOrigins),l,f=s;if(c){l=V();let d=B(),v=F(l,d,!0),T=new Headers(s?.headers);T.set("traceparent",v),f={...s,headers:T}}let m=Date.now();try{let d=await q(n,f),v=Date.now()-m;return t(Ee(C,a,i,l,m,v,d.status)),d}catch(d){let v=Date.now()-m,T=C;if(t(Ee(T,a,i,l,m,v)),Q&&d instanceof Error){let J={...g("error",T.sessionId,T.userId),type:"error",data:{message:d.message,stack:d.stack?.slice(0,2e3),failedUrl:a,traceId:l}};Q(J)}throw d}})}function Se(e){C&&(C.userId=e)}var ee=null,te=null,w=null,H=null;function rt(e,t,r,o){return{type:"resource",sessionId:e.sessionId,userId:e.userId,timestamp:t.startTime,url:window.location.href,userAgent:navigator.userAgent,data:{resourceUrl:t.url,method:t.method,status:o,duration:r,initiatorType:"xhr",traceId:t.traceId}}}function Te(e,t,r){ee||(ee=XMLHttpRequest.prototype.open,te=XMLHttpRequest.prototype.send,w=e,H=r??null,XMLHttpRequest.prototype.open=function(o,n,s,a,i){let c=n.toString(),l=X(c,w?.propagateToOrigins);this._vident={method:o,url:c,traceId:l?V():void 0,startTime:0},ee.call(this,o,n,s??!0,a??null,i??null)},XMLHttpRequest.prototype.send=function(o){let n=this._vident;if(!n||n.url.includes("_rsc=")||w?.ingestUrl&&n.url.startsWith(w.ingestUrl)){te.call(this,o);return}if(n.traceId){let a=B(),i=F(n.traceId,a,!0);this.setRequestHeader("traceparent",i)}n.startTime=Date.now();let s=a=>{let i=Date.now()-n.startTime;t(rt(w,n,i,a))};this.addEventListener("load",()=>s(this.status)),this.addEventListener("error",()=>{if(s(),H){let a=w,i={...g("error",a.sessionId,a.userId),type:"error",data:{message:`XHR request failed: ${n.method} ${n.url}`,failedUrl:n.url,traceId:n.traceId}};H(i)}}),this.addEventListener("timeout",()=>{if(s(),H){let a=w,i={...g("error",a.sessionId,a.userId),type:"error",data:{message:`XHR request timed out: ${n.method} ${n.url}`,failedUrl:n.url,traceId:n.traceId}};H(i)}}),this.addEventListener("abort",()=>s()),te.call(this,o)})}function Ie(e){w&&(w.userId=e)}var b="vident_session";var O="cookie";function Re(e){O=e}function ot(){let e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}function it(e){let t=document.cookie.split("; ");for(let r of t){let[o,...n]=r.split("=");if(o===e){let s=n.join("=");return s?decodeURIComponent(s):null}}return null}function st(e){try{return it(e)}catch{return null}}function at(e,t){try{document.cookie=`${e}=${encodeURIComponent(t)}; path=/; SameSite=Lax`}catch{}}function ct(e){try{document.cookie=`${e}=; path=/; max-age=0`}catch{}}function ut(e){try{return localStorage.getItem(e)}catch{return null}}function lt(e,t){try{localStorage.setItem(e,t)}catch{}}function dt(e){try{localStorage.removeItem(e)}catch{}}function pt(e){try{return sessionStorage.getItem(e)}catch{return null}}function ft(e,t){try{sessionStorage.setItem(e,t)}catch{}}function gt(e){try{sessionStorage.removeItem(e)}catch{}}function ne(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function re(){if(O==="sessionStorage")return ne(pt(b));let e=ne(st(b));return e||ne(ut(b))}function we(e){let t=JSON.stringify(e);if(O==="sessionStorage"){ft(b,t);return}at(b,t),lt(b,t)}function mt(){if(O==="sessionStorage"){gt(b);return}ct(b),dt(b)}function oe(e){let t=Date.now(),r=t-e.lastActivity<18e5,o=t-e.startTime<144e5;return r&&o}function be(){let e=re();if(e&&oe(e))return{sessionId:e.id,isNew:!1};let t=Date.now(),r={id:ot(),startTime:t,lastActivity:t};return we(r),{sessionId:r.id,isNew:!0}}function ke(){let e=re();e&&oe(e)&&(e.lastActivity=Date.now(),we(e))}function vt(){mt()}function ht(){let e=re();return e&&oe(e)?e.id:null}function Ce(e){let t=[],r=null,o=e.flushInterval??5e3,n=e.maxBatchSize??10;function s(){r||(r=setTimeout(()=>{r=null,a()},o))}async function a(){if(t.length===0)return;let f=t.splice(0,n),m=new AbortController,d=setTimeout(()=>m.abort(),1e4);try{let v=await fetch(`${e.baseUrl}/v1/ingest/rum`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e.apiKey},body:JSON.stringify({appName:e.appName,release:e.release,events:f}),signal:m.signal});v.ok||console.warn("[Vident RUM] Failed to send events:",v.status)}catch(v){console.warn("[Vident RUM] Failed to send events:",v)}finally{clearTimeout(d)}t.length>0&&s()}function i(){if(t.length===0)return;let f=t.splice(0),m=JSON.stringify({appName:e.appName,release:e.release,events:f});try{fetch(`${e.baseUrl}/v1/ingest/rum`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e.apiKey},body:m,keepalive:!0}).catch(()=>{})}catch{let d=new Blob([m],{type:"application/json"});navigator.sendBeacon(`${e.baseUrl}/v1/ingest/rum?key=${e.apiKey}`,d)}}function c(f){t.push(f),t.length>=n?a():s()}function l(){window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&i()}),window.addEventListener("pagehide",()=>{i()})}return l(),{enqueue:c,flush:a,flushBeacon:i}}var ae,x,P,Ne,K,Ve=-1,L=function(e){addEventListener("pageshow",(function(t){t.persisted&&(Ve=t.timeStamp,e(t))}),!0)},ce=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},Y=function(){var e=ce();return e&&e.activationStart||0},E=function(e,t){var r=ce(),o="navigate";return Ve>=0?o="back-forward-cache":r&&(document.prerendering||Y()>0?o="prerender":document.wasDiscarded?o="restore":r.type&&(o=r.type.replace(/_/g,"-"))),{name:e,value:t===void 0?-1:t,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:o}},U=function(e,t,r){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var o=new PerformanceObserver((function(n){Promise.resolve().then((function(){t(n.getEntries())}))}));return o.observe(Object.assign({type:e,buffered:!0},r||{})),o}}catch{}},y=function(e,t,r,o){var n,s;return function(a){t.value>=0&&(a||o)&&((s=t.value-(n||0))||n===void 0)&&(n=t.value,t.delta=s,t.rating=(function(i,c){return i>c[1]?"poor":i>c[0]?"needs-improvement":"good"})(t.value,r),e(t))}},ue=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},_=function(e){document.addEventListener("visibilitychange",(function(){document.visibilityState==="hidden"&&e()}))},G=function(e){var t=!1;return function(){t||(e(),t=!0)}},A=-1,xe=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},W=function(e){document.visibilityState==="hidden"&&A>-1&&(A=e.type==="visibilitychange"?e.timeStamp:0,Et())},Le=function(){addEventListener("visibilitychange",W,!0),addEventListener("prerenderingchange",W,!0)},Et=function(){removeEventListener("visibilitychange",W,!0),removeEventListener("prerenderingchange",W,!0)},le=function(){return A<0&&(A=xe(),Le(),L((function(){setTimeout((function(){A=xe(),Le()}),0)}))),{get firstHiddenTime(){return A}}},M=function(e){document.prerendering?addEventListener("prerenderingchange",(function(){return e()}),!0):e()},Ae=[1800,3e3],de=function(e,t){t=t||{},M((function(){var r,o=le(),n=E("FCP"),s=U("paint",(function(a){a.forEach((function(i){i.name==="first-contentful-paint"&&(s.disconnect(),i.startTime<o.firstHiddenTime&&(n.value=Math.max(i.startTime-Y(),0),n.entries.push(i),r(!0)))}))}));s&&(r=y(e,n,Ae,t.reportAllChanges),L((function(a){n=E("FCP"),r=y(e,n,Ae,t.reportAllChanges),ue((function(){n.value=performance.now()-a.timeStamp,r(!0)}))})))}))},Ue=[.1,.25],Be=function(e,t){t=t||{},de(G((function(){var r,o=E("CLS",0),n=0,s=[],a=function(c){c.forEach((function(l){if(!l.hadRecentInput){var f=s[0],m=s[s.length-1];n&&l.startTime-m.startTime<1e3&&l.startTime-f.startTime<5e3?(n+=l.value,s.push(l)):(n=l.value,s=[l])}})),n>o.value&&(o.value=n,o.entries=s,r())},i=U("layout-shift",a);i&&(r=y(e,o,Ue,t.reportAllChanges),_((function(){a(i.takeRecords()),r(!0)})),L((function(){n=0,o=E("CLS",0),r=y(e,o,Ue,t.reportAllChanges),ue((function(){return r()}))})),setTimeout(r,0))})))},Fe=0,ie=1/0,j=0,yt=function(e){e.forEach((function(t){t.interactionId&&(ie=Math.min(ie,t.interactionId),j=Math.max(j,t.interactionId),Fe=j?(j-ie)/7+1:0)}))},Xe=function(){return ae?Fe:performance.interactionCount||0},St=function(){"interactionCount"in performance||ae||(ae=U("event",yt,{type:"event",buffered:!0,durationThreshold:0}))},I=[],$=new Map,qe=0,Tt=function(){var e=Math.min(I.length-1,Math.floor((Xe()-qe)/50));return I[e]},It=[],Rt=function(e){if(It.forEach((function(n){return n(e)})),e.interactionId||e.entryType==="first-input"){var t=I[I.length-1],r=$.get(e.interactionId);if(r||I.length<10||e.duration>t.latency){if(r)e.duration>r.latency?(r.entries=[e],r.latency=e.duration):e.duration===r.latency&&e.startTime===r.entries[0].startTime&&r.entries.push(e);else{var o={id:e.interactionId,latency:e.duration,entries:[e]};$.set(o.id,o),I.push(o)}I.sort((function(n,s){return s.latency-n.latency})),I.length>10&&I.splice(10).forEach((function(n){return $.delete(n.id)}))}}},Oe=function(e){var t=self.requestIdleCallback||self.setTimeout,r=-1;return e=G(e),document.visibilityState==="hidden"?e():(r=t(e),_(e)),r},He=[200,500],je=function(e,t){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(t=t||{},M((function(){var r;St();var o,n=E("INP"),s=function(i){Oe((function(){i.forEach(Rt);var c=Tt();c&&c.latency!==n.value&&(n.value=c.latency,n.entries=c.entries,o())}))},a=U("event",s,{durationThreshold:(r=t.durationThreshold)!==null&&r!==void 0?r:40});o=y(e,n,He,t.reportAllChanges),a&&(a.observe({type:"first-input",buffered:!0}),_((function(){s(a.takeRecords()),o(!0)})),L((function(){qe=Xe(),I.length=0,$.clear(),n=E("INP"),o=y(e,n,He,t.reportAllChanges)})))})))},De=[2500,4e3],se={},$e=function(e,t){t=t||{},M((function(){var r,o=le(),n=E("LCP"),s=function(c){t.reportAllChanges||(c=c.slice(-1)),c.forEach((function(l){l.startTime<o.firstHiddenTime&&(n.value=Math.max(l.startTime-Y(),0),n.entries=[l],r())}))},a=U("largest-contentful-paint",s);if(a){r=y(e,n,De,t.reportAllChanges);var i=G((function(){se[n.id]||(s(a.takeRecords()),a.disconnect(),se[n.id]=!0,r(!0))}));["keydown","click"].forEach((function(c){addEventListener(c,(function(){return Oe(i)}),{once:!0,capture:!0})})),_(i),L((function(c){n=E("LCP"),r=y(e,n,De,t.reportAllChanges),ue((function(){n.value=performance.now()-c.timeStamp,se[n.id]=!0,r(!0)}))}))}}))},Pe=[800,1800],wt=function e(t){document.prerendering?M((function(){return e(t)})):document.readyState!=="complete"?addEventListener("load",(function(){return e(t)}),!0):setTimeout(t,0)},Ke=function(e,t){t=t||{};var r=E("TTFB"),o=y(e,r,Pe,t.reportAllChanges);wt((function(){var n=ce();n&&(r.value=Math.max(n.responseStart-Y(),0),r.entries=[n],o(!0),L((function(){r=E("TTFB",0),(o=y(e,r,Pe,t.reportAllChanges))(!0)})))}))},D={passive:!0,capture:!0},bt=new Date,_e=function(e,t){x||(x=t,P=e,Ne=new Date,Ye(removeEventListener),We())},We=function(){if(P>=0&&P<Ne-bt){var e={entryType:"first-input",name:x.type,target:x.target,cancelable:x.cancelable,startTime:x.timeStamp,processingStart:x.timeStamp+P};K.forEach((function(t){t(e)})),K=[]}},kt=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;e.type=="pointerdown"?(function(r,o){var n=function(){_e(r,o),a()},s=function(){a()},a=function(){removeEventListener("pointerup",n,D),removeEventListener("pointercancel",s,D)};addEventListener("pointerup",n,D),addEventListener("pointercancel",s,D)})(t,e):_e(t,e)}},Ye=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,kt,D)}))},Me=[100,300],Ge=function(e,t){t=t||{},M((function(){var r,o=le(),n=E("FID"),s=function(c){c.startTime<o.firstHiddenTime&&(n.value=c.processingStart-c.startTime,n.entries.push(c),r(!0))},a=function(c){c.forEach(s)},i=U("first-input",a);r=y(e,n,Me,t.reportAllChanges),i&&(_(G((function(){a(i.takeRecords()),i.disconnect()}))),L((function(){var c;n=E("FID"),r=y(e,n,Me,t.reportAllChanges),K=[],P=-1,x=null,Ye(addEventListener),c=s,K.push(c),We()})))}))};function Je(e,t,r,o){let n={},s=!1;function a(){if(s||Object.keys(n).length===0)return;s=!0;let i={...g("vitals",e,t),type:"vitals",data:{...n}};r(i),o?.()}$e(i=>{n.lcp=i.value}),Ge(i=>{n.fid=i.value}),Be(i=>{n.cls=i.value}),je(i=>{n.inp=i.value}),Ke(i=>{n.ttfb=i.value}),de(i=>{n.fcp=i.value}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&a()})}var Ct="https://api.vident.dev";function xt(e){if(e.id)return`#${e.id}`;let t=e.tagName.toLowerCase(),r=Array.from(e.classList).slice(0,3).join(".");return r?`${t}.${r}`:t}function Lt(e){let t=[],r=e,o=10;for(let n=0;r&&r!==document.documentElement&&n<o;n++){if(r.id){t.unshift(`#${r.id}`);break}let s=r.tagName.toLowerCase(),a=r.parentElement;if(!a){t.unshift(s);break}let i=Array.from(a.children),c=r.tagName;if(i.filter(f=>f.tagName===c).length>1){let f=i.indexOf(r)+1;t.unshift(`${s}:nth-child(${f})`)}else t.unshift(s);r=a}return t.join(" > ")}function ze(e,t){return t==="strict"||e.closest("[data-sw-block], .rr-block, [data-sw-mask], .rr-mask")?void 0:e.textContent?.trim().slice(0,50)||void 0}function At(){try{if(typeof process<"u"&&process.env?.NEXT_PUBLIC_VIDENT_RELEASE)return process.env.NEXT_PUBLIC_VIDENT_RELEASE}catch{}try{if(typeof import.meta<"u"&&import.meta.env?.VIDENT_RELEASE)return import.meta.env.VIDENT_RELEASE}catch{}}function Ut(e){let t=e.sampleRate??1;if(Math.random()>t)return{trackEvent:()=>{},trackPageView:()=>{},trackError:()=>{},setUser:()=>{},getSessionId:()=>null,forceReplayUpload:()=>{},stopReplay:()=>{},isReplayUploading:()=>!1};let r=e.baseUrl??Ct;Re(e.sessionStorage??"cookie");let{sessionId:o}=be(),n,s=e.release??At(),a=Ce({apiKey:e.apiKey,baseUrl:r,appName:e.appName,release:s}),i=null,c=!1,l=e.replay,f=e.privacyMode??"strict";l?.enabled&&import("./chunks/replay-SUSGC5DP.js").then(({createReplayRecorder:u})=>{i=u(l,f,{apiKey:e.apiKey,baseUrl:r,sessionId:o}),m()});function m(){function u(){setTimeout(()=>{i?.captureHeatmapSnapshot(window.location.href)},1e3)}document.readyState==="complete"?typeof requestIdleCallback=="function"?requestIdleCallback(u,{timeout:2e3}):setTimeout(u,2e3):window.addEventListener("load",()=>{typeof requestIdleCallback=="function"?requestIdleCallback(u,{timeout:2e3}):setTimeout(u,2e3)},{once:!0})}function d(u){ke(),a.enqueue(u)}function v(u){let p={...g("page_view",o,n),type:"page_view",url:u??window.location.href,data:{referrer:document.referrer||void 0,title:document.title}};d(p)}function T(u,p){let S={...g("custom",o,n),type:"custom",data:{name:u,properties:p}};d(S)}function J(u,p){let S=ve(u,o,n,p);d(S),i?.markError()}function Ze(u,p){n=u,Se(n),Ie(n),p&&T("user_identified",{userId:u,...p})}function Qe(){return o}if(e.trackPageViews!==!1){let S=function(){setTimeout(()=>{i?.snapshot()},2e3)},R=function(){v(),S(),c=!1,i?.resetHeatmapSnapshot(),i&&m()};var Ht=S,Dt=R;v();let u=history.pushState.bind(history),p=history.replaceState.bind(history);history.pushState=(...h)=>{u(...h),R()},history.replaceState=(...h)=>{p(...h),R()},window.addEventListener("popstate",()=>{R()})}if(e.trackClicks!==!1){let u=e.privacyMode??"strict",p=[],S=3,R=1e3;document.addEventListener("click",h=>{let k=h.target;if(!k||!(["A","BUTTON","INPUT","SELECT","TEXTAREA"].includes(k.tagName)||k.closest("a, button")!==null||k.getAttribute("role")==="button"))return;let N=xt(k),pe=Lt(k),nt={...g("click",o,n),type:"click",data:{target:N,text:ze(k,u),x:h.pageX,y:h.pageY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,scrollY:window.scrollY,targetPath:pe}};d(nt),!c&&i&&(c=!0,i.captureHeatmapSnapshot(window.location.href));let fe=Date.now();for(p.push({target:N,timestamp:fe});p.length>0&&(p[0]?.timestamp??0)<fe-R;)p.shift();let ge=p.filter(z=>z.target===N);if(ge.length>=S){let z={...g("rage_click",o,n),type:"rage_click",data:{target:N,text:ze(k,u),x:h.pageX,y:h.pageY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,clickCount:ge.length,scrollY:window.scrollY,targetPath:pe}};d(z),p.length=0}},{capture:!0})}e.trackVitals!==!1&&Je(o,n,u=>{d(u)},()=>{a.flushBeacon()}),e.trackErrors!==!1&&me(o,n,u=>{d(u),i?.markError()});let et=e.trackResources!==!1||e.tracing?.enabled!==!1,tt=e.trackResources!==!1;if(et){let u=`${r}/v1/ingest`,p={propagateToOrigins:e.tracing?.propagateToOrigins,sessionId:o,userId:n,ingestUrl:u},S=tt?h=>d(h):()=>{},R=e.trackErrors!==!1?h=>d(h):void 0;e.tracing?.traceFetch!==!1&&ye(p,S,R),e.tracing?.traceXHR!==!1&&Te(p,S,R)}return{trackEvent:T,trackPageView:v,trackError:J,setUser:Ze,getSessionId:Qe,forceReplayUpload:()=>{i?.startUploading()},stopReplay:()=>{i?.stop()},isReplayUploading:()=>i?.isUploading()??!1}}export{Ut as createVidentBrowser,vt as endSession,ht as getSessionId};
|
|
1
|
+
function g(e,t,r){return{type:e,sessionId:t,userId:r,timestamp:Date.now(),url:window.location.href,userAgent:navigator.userAgent}}function Q(e){if(e.stack)return e.stack.slice(0,2e3)}function ye(e,t,r){window.addEventListener("error",o=>{let n={...g("error",e,t),type:"error",data:{message:o.message||"Unknown error",stack:o.error?Q(o.error):void 0,filename:o.filename,lineno:o.lineno,colno:o.colno}};r(n)}),window.addEventListener("unhandledrejection",o=>{let n="Unhandled Promise Rejection",s;o.reason instanceof Error?(n=o.reason.message,s=Q(o.reason)):typeof o.reason=="string"&&(n=o.reason);let a={...g("error",e,t),type:"error",data:{message:n,stack:s}};r(a)})}function Se(e,t,r,o){return{...g("error",t,r),type:"error",data:{message:e.message,stack:Q(e),requestId:o?.requestId,traceId:o?.traceId}}}function X(){let e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}function B(){let e=new Uint8Array(8);return crypto.getRandomValues(e),Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}function q(e,t,r){return`00-${e}-${t}-${r?"01":"00"}`}function Ie(e){let t=e.split(".");return t.length<=2||e==="localhost"?e:t.slice(-2).join(".")}function O(e,t){let r;try{r=new URL(e,window.location.origin)}catch{return!1}if(r.origin===window.location.origin)return!0;let o=Ie(window.location.hostname),n=Ie(r.hostname);if(o===n)return!0;if(t&&t.length>0){for(let s of t)if(typeof s=="string"){if(r.origin===s||r.href.startsWith(s))return!0}else if(s instanceof RegExp&&s.test(r.href))return!0}return!1}var j=null,R=null,ee=null;function Te(e,t,r,o,n,s,a){return{type:"resource",sessionId:e.sessionId,userId:e.userId,timestamp:n,url:window.location.href,userAgent:navigator.userAgent,data:{resourceUrl:t,method:r,status:a,duration:s,initiatorType:"fetch",traceId:o}}}function Re(e,t,r){j||(j=window.fetch,R=e,ee=r??null,window.fetch=async function(n,s){let a=typeof n=="string"?n:n instanceof URL?n.toString():n.url;if(a.includes("_rsc=")||R?.ingestUrl&&a.startsWith(R.ingestUrl))return j(n,s);let i=s?.method??(typeof n!="string"&&!(n instanceof URL)?n.method??"GET":"GET"),c=O(a,R?.propagateToOrigins),l,p=s;if(c){l=X();let f=B(),v=q(l,f,!0),b=new Headers(s?.headers);b.set("traceparent",v),p={...s,headers:b}}let m=Date.now();try{let f=await j(n,p),v=Date.now()-m;return t(Te(R,a,i,l,m,v,f.status)),f}catch(f){let v=Date.now()-m,b=R;if(t(Te(b,a,i,l,m,v)),ee&&f instanceof Error){let S={...g("error",b.sessionId,b.userId),type:"error",data:{message:f.message,stack:f.stack?.slice(0,2e3),failedUrl:a,traceId:l}};ee(S)}throw f}})}function we(e){R&&(R.userId=e)}function be(e){R&&(R.sessionId=e)}var te=null,ne=null,T=null,_=null;function ut(e,t,r,o){return{type:"resource",sessionId:e.sessionId,userId:e.userId,timestamp:t.startTime,url:window.location.href,userAgent:navigator.userAgent,data:{resourceUrl:t.url,method:t.method,status:o,duration:r,initiatorType:"xhr",traceId:t.traceId}}}function ke(e,t,r){te||(te=XMLHttpRequest.prototype.open,ne=XMLHttpRequest.prototype.send,T=e,_=r??null,XMLHttpRequest.prototype.open=function(o,n,s,a,i){let c=n.toString(),l=O(c,T?.propagateToOrigins);this._vident={method:o,url:c,traceId:l?X():void 0,startTime:0},te.call(this,o,n,s??!0,a??null,i??null)},XMLHttpRequest.prototype.send=function(o){let n=this._vident;if(!n||n.url.includes("_rsc=")||T?.ingestUrl&&n.url.startsWith(T.ingestUrl)){ne.call(this,o);return}if(n.traceId){let a=B(),i=q(n.traceId,a,!0);this.setRequestHeader("traceparent",i)}n.startTime=Date.now();let s=a=>{let i=Date.now()-n.startTime;t(ut(T,n,i,a))};this.addEventListener("load",()=>s(this.status)),this.addEventListener("error",()=>{if(s(),_){let a=T,i={...g("error",a.sessionId,a.userId),type:"error",data:{message:`XHR request failed: ${n.method} ${n.url}`,failedUrl:n.url,traceId:n.traceId}};_(i)}}),this.addEventListener("timeout",()=>{if(s(),_){let a=T,i={...g("error",a.sessionId,a.userId),type:"error",data:{message:`XHR request timed out: ${n.method} ${n.url}`,failedUrl:n.url,traceId:n.traceId}};_(i)}}),this.addEventListener("abort",()=>s()),ne.call(this,o)})}function Ce(e){T&&(T.userId=e)}function xe(e){T&&(T.sessionId=e)}var C="vident_session";var $="cookie";function Le(e){$=e}function lt(){let e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}function dt(e){let t=document.cookie.split("; ");for(let r of t){let[o,...n]=r.split("=");if(o===e){let s=n.join("=");return s?decodeURIComponent(s):null}}return null}function pt(e){try{return dt(e)}catch{return null}}function ft(e,t){try{document.cookie=`${e}=${encodeURIComponent(t)}; path=/; SameSite=Lax`}catch{}}function gt(e){try{document.cookie=`${e}=; path=/; max-age=0`}catch{}}function mt(e){try{return localStorage.getItem(e)}catch{return null}}function vt(e,t){try{localStorage.setItem(e,t)}catch{}}function ht(e){try{localStorage.removeItem(e)}catch{}}function Et(e){try{return sessionStorage.getItem(e)}catch{return null}}function yt(e,t){try{sessionStorage.setItem(e,t)}catch{}}function St(e){try{sessionStorage.removeItem(e)}catch{}}function re(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function oe(){if($==="sessionStorage")return re(Et(C));let e=re(pt(C));return e||re(mt(C))}function Ae(e){let t=JSON.stringify(e);if($==="sessionStorage"){yt(C,t);return}ft(C,t),vt(C,t)}function It(){if($==="sessionStorage"){St(C);return}gt(C),ht(C)}function ie(e){let t=Date.now(),r=t-e.lastActivity<18e5,o=t-e.startTime<144e5;return r&&o}function se(){let e=oe();if(e&&ie(e))return{sessionId:e.id,isNew:!1};let t=Date.now(),r={id:lt(),startTime:t,lastActivity:t};return Ae(r),{sessionId:r.id,isNew:!0}}function Ue(){let e=oe();e&&ie(e)&&(e.lastActivity=Date.now(),Ae(e))}function Tt(){It()}function ae(){let e=oe();return e&&ie(e)?e.id:null}function He(e){let t=[],r=null,o=e.flushInterval??5e3,n=e.maxBatchSize??10;function s(){r||(r=setTimeout(()=>{r=null,a()},o))}async function a(){if(t.length===0)return;let p=t.splice(0,n),m=new AbortController,f=setTimeout(()=>m.abort(),1e4);try{let v=await fetch(`${e.baseUrl}/v1/ingest/rum`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e.apiKey},body:JSON.stringify({appName:e.appName,release:e.release,events:p}),signal:m.signal});v.ok||console.warn("[Vident RUM] Failed to send events:",v.status)}catch(v){console.warn("[Vident RUM] Failed to send events:",v)}finally{clearTimeout(f)}t.length>0&&s()}function i(){if(t.length===0)return;let p=t.splice(0),m=JSON.stringify({appName:e.appName,release:e.release,events:p});try{fetch(`${e.baseUrl}/v1/ingest/rum`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e.apiKey},body:m,keepalive:!0}).catch(()=>{})}catch{let f=new Blob([m],{type:"application/json"});navigator.sendBeacon(`${e.baseUrl}/v1/ingest/rum?key=${e.apiKey}`,f)}}function c(p){t.push(p),t.length>=n?a():s()}function l(){window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&i()}),window.addEventListener("pagehide",()=>{i()})}return l(),{enqueue:c,flush:a,flushBeacon:i}}var le,L,P,qe,Y,Oe=-1,A=function(e){addEventListener("pageshow",(function(t){t.persisted&&(Oe=t.timeStamp,e(t))}),!0)},de=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},J=function(){var e=de();return e&&e.activationStart||0},E=function(e,t){var r=de(),o="navigate";return Oe>=0?o="back-forward-cache":r&&(document.prerendering||J()>0?o="prerender":document.wasDiscarded?o="restore":r.type&&(o=r.type.replace(/_/g,"-"))),{name:e,value:t===void 0?-1:t,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:o}},H=function(e,t,r){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var o=new PerformanceObserver((function(n){Promise.resolve().then((function(){t(n.getEntries())}))}));return o.observe(Object.assign({type:e,buffered:!0},r||{})),o}}catch{}},y=function(e,t,r,o){var n,s;return function(a){t.value>=0&&(a||o)&&((s=t.value-(n||0))||n===void 0)&&(n=t.value,t.delta=s,t.rating=(function(i,c){return i>c[1]?"poor":i>c[0]?"needs-improvement":"good"})(t.value,r),e(t))}},pe=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},M=function(e){document.addEventListener("visibilitychange",(function(){document.visibilityState==="hidden"&&e()}))},z=function(e){var t=!1;return function(){t||(e(),t=!0)}},U=-1,_e=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},G=function(e){document.visibilityState==="hidden"&&U>-1&&(U=e.type==="visibilitychange"?e.timeStamp:0,Rt())},De=function(){addEventListener("visibilitychange",G,!0),addEventListener("prerenderingchange",G,!0)},Rt=function(){removeEventListener("visibilitychange",G,!0),removeEventListener("prerenderingchange",G,!0)},fe=function(){return U<0&&(U=_e(),De(),A((function(){setTimeout((function(){U=_e(),De()}),0)}))),{get firstHiddenTime(){return U}}},N=function(e){document.prerendering?addEventListener("prerenderingchange",(function(){return e()}),!0):e()},Pe=[1800,3e3],ge=function(e,t){t=t||{},N((function(){var r,o=fe(),n=E("FCP"),s=H("paint",(function(a){a.forEach((function(i){i.name==="first-contentful-paint"&&(s.disconnect(),i.startTime<o.firstHiddenTime&&(n.value=Math.max(i.startTime-J(),0),n.entries.push(i),r(!0)))}))}));s&&(r=y(e,n,Pe,t.reportAllChanges),A((function(a){n=E("FCP"),r=y(e,n,Pe,t.reportAllChanges),pe((function(){n.value=performance.now()-a.timeStamp,r(!0)}))})))}))},Me=[.1,.25],je=function(e,t){t=t||{},ge(z((function(){var r,o=E("CLS",0),n=0,s=[],a=function(c){c.forEach((function(l){if(!l.hadRecentInput){var p=s[0],m=s[s.length-1];n&&l.startTime-m.startTime<1e3&&l.startTime-p.startTime<5e3?(n+=l.value,s.push(l)):(n=l.value,s=[l])}})),n>o.value&&(o.value=n,o.entries=s,r())},i=H("layout-shift",a);i&&(r=y(e,o,Me,t.reportAllChanges),M((function(){a(i.takeRecords()),r(!0)})),A((function(){n=0,o=E("CLS",0),r=y(e,o,Me,t.reportAllChanges),pe((function(){return r()}))})),setTimeout(r,0))})))},$e=0,ce=1/0,K=0,wt=function(e){e.forEach((function(t){t.interactionId&&(ce=Math.min(ce,t.interactionId),K=Math.max(K,t.interactionId),$e=K?(K-ce)/7+1:0)}))},Ke=function(){return le?$e:performance.interactionCount||0},bt=function(){"interactionCount"in performance||le||(le=H("event",wt,{type:"event",buffered:!0,durationThreshold:0}))},w=[],W=new Map,We=0,kt=function(){var e=Math.min(w.length-1,Math.floor((Ke()-We)/50));return w[e]},Ct=[],xt=function(e){if(Ct.forEach((function(n){return n(e)})),e.interactionId||e.entryType==="first-input"){var t=w[w.length-1],r=W.get(e.interactionId);if(r||w.length<10||e.duration>t.latency){if(r)e.duration>r.latency?(r.entries=[e],r.latency=e.duration):e.duration===r.latency&&e.startTime===r.entries[0].startTime&&r.entries.push(e);else{var o={id:e.interactionId,latency:e.duration,entries:[e]};W.set(o.id,o),w.push(o)}w.sort((function(n,s){return s.latency-n.latency})),w.length>10&&w.splice(10).forEach((function(n){return W.delete(n.id)}))}}},Ye=function(e){var t=self.requestIdleCallback||self.setTimeout,r=-1;return e=z(e),document.visibilityState==="hidden"?e():(r=t(e),M(e)),r},Ne=[200,500],Ge=function(e,t){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(t=t||{},N((function(){var r;bt();var o,n=E("INP"),s=function(i){Ye((function(){i.forEach(xt);var c=kt();c&&c.latency!==n.value&&(n.value=c.latency,n.entries=c.entries,o())}))},a=H("event",s,{durationThreshold:(r=t.durationThreshold)!==null&&r!==void 0?r:40});o=y(e,n,Ne,t.reportAllChanges),a&&(a.observe({type:"first-input",buffered:!0}),M((function(){s(a.takeRecords()),o(!0)})),A((function(){We=Ke(),w.length=0,W.clear(),n=E("INP"),o=y(e,n,Ne,t.reportAllChanges)})))})))},Fe=[2500,4e3],ue={},Je=function(e,t){t=t||{},N((function(){var r,o=fe(),n=E("LCP"),s=function(c){t.reportAllChanges||(c=c.slice(-1)),c.forEach((function(l){l.startTime<o.firstHiddenTime&&(n.value=Math.max(l.startTime-J(),0),n.entries=[l],r())}))},a=H("largest-contentful-paint",s);if(a){r=y(e,n,Fe,t.reportAllChanges);var i=z((function(){ue[n.id]||(s(a.takeRecords()),a.disconnect(),ue[n.id]=!0,r(!0))}));["keydown","click"].forEach((function(c){addEventListener(c,(function(){return Ye(i)}),{once:!0,capture:!0})})),M(i),A((function(c){n=E("LCP"),r=y(e,n,Fe,t.reportAllChanges),pe((function(){n.value=performance.now()-c.timeStamp,ue[n.id]=!0,r(!0)}))}))}}))},Ve=[800,1800],Lt=function e(t){document.prerendering?N((function(){return e(t)})):document.readyState!=="complete"?addEventListener("load",(function(){return e(t)}),!0):setTimeout(t,0)},ze=function(e,t){t=t||{};var r=E("TTFB"),o=y(e,r,Ve,t.reportAllChanges);Lt((function(){var n=de();n&&(r.value=Math.max(n.responseStart-J(),0),r.entries=[n],o(!0),A((function(){r=E("TTFB",0),(o=y(e,r,Ve,t.reportAllChanges))(!0)})))}))},D={passive:!0,capture:!0},At=new Date,Xe=function(e,t){L||(L=t,P=e,qe=new Date,Qe(removeEventListener),Ze())},Ze=function(){if(P>=0&&P<qe-At){var e={entryType:"first-input",name:L.type,target:L.target,cancelable:L.cancelable,startTime:L.timeStamp,processingStart:L.timeStamp+P};Y.forEach((function(t){t(e)})),Y=[]}},Ut=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;e.type=="pointerdown"?(function(r,o){var n=function(){Xe(r,o),a()},s=function(){a()},a=function(){removeEventListener("pointerup",n,D),removeEventListener("pointercancel",s,D)};addEventListener("pointerup",n,D),addEventListener("pointercancel",s,D)})(t,e):Xe(t,e)}},Qe=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,Ut,D)}))},Be=[100,300],et=function(e,t){t=t||{},N((function(){var r,o=fe(),n=E("FID"),s=function(c){c.startTime<o.firstHiddenTime&&(n.value=c.processingStart-c.startTime,n.entries.push(c),r(!0))},a=function(c){c.forEach(s)},i=H("first-input",a);r=y(e,n,Be,t.reportAllChanges),i&&(M(z((function(){a(i.takeRecords()),i.disconnect()}))),A((function(){var c;n=E("FID"),r=y(e,n,Be,t.reportAllChanges),Y=[],P=-1,L=null,Qe(addEventListener),c=s,Y.push(c),Ze()})))}))};function tt(e,t,r,o){let n={},s=!1;function a(){if(s||Object.keys(n).length===0)return;s=!0;let i={...g("vitals",e,t),type:"vitals",data:{...n}};r(i),o?.()}Je(i=>{n.lcp=i.value}),et(i=>{n.fid=i.value}),je(i=>{n.cls=i.value}),Ge(i=>{n.inp=i.value}),ze(i=>{n.ttfb=i.value}),ge(i=>{n.fcp=i.value}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&a()})}var Ht="https://api.vident.dev";function _t(e){if(e.id)return`#${e.id}`;let t=e.tagName.toLowerCase(),r=Array.from(e.classList).slice(0,3).join(".");return r?`${t}.${r}`:t}function Dt(e){let t=[],r=e,o=10;for(let n=0;r&&r!==document.documentElement&&n<o;n++){if(r.id){t.unshift(`#${r.id}`);break}let s=r.tagName.toLowerCase(),a=r.parentElement;if(!a){t.unshift(s);break}let i=Array.from(a.children),c=r.tagName;if(i.filter(p=>p.tagName===c).length>1){let p=i.indexOf(r)+1;t.unshift(`${s}:nth-child(${p})`)}else t.unshift(s);r=a}return t.join(" > ")}function nt(e,t){return t==="strict"||e.closest("[data-sw-block], .rr-block, [data-sw-mask], .rr-mask")?void 0:e.textContent?.trim().slice(0,50)||void 0}function Pt(){try{if(typeof process<"u"&&process.env?.NEXT_PUBLIC_VIDENT_RELEASE)return process.env.NEXT_PUBLIC_VIDENT_RELEASE}catch{}try{if(typeof import.meta<"u"&&import.meta.env?.VIDENT_RELEASE)return import.meta.env.VIDENT_RELEASE}catch{}}function Mt(e){let t=e.sampleRate??1;if(Math.random()>t)return{trackEvent:()=>{},trackPageView:()=>{},trackError:()=>{},setUser:()=>{},getSessionId:()=>null,forceReplayUpload:()=>{},stopReplay:()=>{},isReplayUploading:()=>!1};let r=e.baseUrl??Ht;Le(e.sessionStorage??"cookie");let{sessionId:o}=se(),n,s=e.release??Pt(),a=He({apiKey:e.apiKey,baseUrl:r,appName:e.appName,release:s}),i=null,c=!1,l=e.replay,p=e.privacyMode??"strict",m=null;function f(){m||(m=setInterval(()=>{i?.isRecording()&&ae()===null&&(i.stop(),i=null)},6e4))}l?.enabled&&import("./chunks/replay-SUSGC5DP.js").then(({createReplayRecorder:u})=>{i=u(l,p,{apiKey:e.apiKey,baseUrl:r,sessionId:o}),v(),f()});function v(){function u(){setTimeout(()=>{i?.captureHeatmapSnapshot(window.location.href)},1e3)}document.readyState==="complete"?typeof requestIdleCallback=="function"?requestIdleCallback(u,{timeout:2e3}):setTimeout(u,2e3):window.addEventListener("load",()=>{typeof requestIdleCallback=="function"?requestIdleCallback(u,{timeout:2e3}):setTimeout(u,2e3)},{once:!0})}function b(u){o=u,be(u),xe(u),c=!1,i?.stop(),i=null,l?.enabled&&import("./chunks/replay-SUSGC5DP.js").then(({createReplayRecorder:d})=>{i=d(l,p,{apiKey:e.apiKey,baseUrl:r,sessionId:u}),v(),f()}),F()}function S(u){let d=se();d.sessionId!==o&&b(d.sessionId),Ue(),u.sessionId=o,a.enqueue(u)}function F(u){let d={...g("page_view",o,n),type:"page_view",url:u??window.location.href,data:{referrer:document.referrer||void 0,title:document.title}};S(d)}function me(u,d){let I={...g("custom",o,n),type:"custom",data:{name:u,properties:d}};S(I)}function rt(u,d){let I=Se(u,o,n,d);S(I),i?.markError()}function ot(u,d){n=u,we(n),Ce(n),d&&me("user_identified",{userId:u,...d})}function it(){return o}if(e.trackPageViews!==!1){let I=function(){setTimeout(()=>{i?.snapshot()},2e3)},k=function(){F(),I(),c=!1,i?.resetHeatmapSnapshot(),i&&v()};var Nt=I,Ft=k;F();let u=history.pushState.bind(history),d=history.replaceState.bind(history);history.pushState=(...h)=>{u(...h),k()},history.replaceState=(...h)=>{d(...h),k()},window.addEventListener("popstate",()=>{k()})}if(e.trackClicks!==!1){let u=e.privacyMode??"strict",d=[],I=3,k=1e3;document.addEventListener("click",h=>{let x=h.target;if(!x||!(["A","BUTTON","INPUT","SELECT","TEXTAREA"].includes(x.tagName)||x.closest("a, button")!==null||x.getAttribute("role")==="button"))return;let V=_t(x),ve=Dt(x),ct={...g("click",o,n),type:"click",data:{target:V,text:nt(x,u),x:h.pageX,y:h.pageY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,scrollY:window.scrollY,targetPath:ve}};S(ct),!c&&i&&(c=!0,i.captureHeatmapSnapshot(window.location.href));let he=Date.now();for(d.push({target:V,timestamp:he});d.length>0&&(d[0]?.timestamp??0)<he-k;)d.shift();let Ee=d.filter(Z=>Z.target===V);if(Ee.length>=I){let Z={...g("rage_click",o,n),type:"rage_click",data:{target:V,text:nt(x,u),x:h.pageX,y:h.pageY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,clickCount:Ee.length,scrollY:window.scrollY,targetPath:ve}};S(Z),d.length=0}},{capture:!0})}e.trackVitals!==!1&&tt(o,n,u=>{S(u)},()=>{a.flushBeacon()}),e.trackErrors!==!1&&ye(o,n,u=>{S(u),i?.markError()});let st=e.trackResources!==!1||e.tracing?.enabled!==!1,at=e.trackResources!==!1;if(st){let u=`${r}/v1/ingest`,d={propagateToOrigins:e.tracing?.propagateToOrigins,sessionId:o,userId:n,ingestUrl:u},I=at?h=>S(h):()=>{},k=e.trackErrors!==!1?h=>S(h):void 0;e.tracing?.traceFetch!==!1&&Re(d,I,k),e.tracing?.traceXHR!==!1&&ke(d,I,k)}return{trackEvent:me,trackPageView:F,trackError:rt,setUser:ot,getSessionId:it,forceReplayUpload:()=>{i?.startUploading()},stopReplay:()=>{i?.stop()},isReplayUploading:()=>i?.isUploading()??!1}}export{Mt as createVidentBrowser,Tt as endSession,ae as getSessionId};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/events.ts","../src/errors.ts","../src/trace-context.ts","../src/instrumentation/fetch.ts","../src/instrumentation/xhr.ts","../src/session.ts","../src/transport.ts","../../../node_modules/.pnpm/web-vitals@4.2.4/node_modules/web-vitals/dist/web-vitals.js","../src/vitals.ts","../src/client.ts"],"sourcesContent":["export type RumEventType =\n\t| \"page_view\"\n\t| \"click\"\n\t| \"rage_click\"\n\t| \"vitals\"\n\t| \"error\"\n\t| \"custom\"\n\t| \"resource\"\n\nexport type BaseEvent = {\n\ttype: RumEventType\n\tsessionId: string\n\tuserId?: string\n\ttimestamp: number\n\turl: string\n\tuserAgent: string\n}\n\nexport type PageViewEvent = BaseEvent & {\n\ttype: \"page_view\"\n\tdata: {\n\t\treferrer?: string\n\t\ttitle: string\n\t}\n}\n\nexport type ClickEvent = BaseEvent & {\n\ttype: \"click\"\n\tdata: {\n\t\ttarget: string\n\t\ttext?: string\n\t\tx: number\n\t\ty: number\n\t\tviewportWidth: number\n\t\tviewportHeight: number\n\t\tscrollY?: number\n\t\ttargetPath?: string\n\t}\n}\n\nexport type VitalsEvent = BaseEvent & {\n\ttype: \"vitals\"\n\tdata: {\n\t\tlcp?: number\n\t\tfid?: number\n\t\tcls?: number\n\t\tinp?: number\n\t\tttfb?: number\n\t\tfcp?: number\n\t}\n}\n\nexport type ErrorEvent = BaseEvent & {\n\ttype: \"error\"\n\tdata: {\n\t\tmessage: string\n\t\tstack?: string\n\t\tfilename?: string\n\t\tlineno?: number\n\t\tcolno?: number\n\t\trequestId?: string\n\t\t/** Trace ID for correlation with backend traces */\n\t\ttraceId?: string\n\t\t/** URL that failed (for fetch/network errors) */\n\t\tfailedUrl?: string\n\t}\n}\n\nexport type CustomEvent = BaseEvent & {\n\ttype: \"custom\"\n\tdata: {\n\t\tname: string\n\t\tproperties?: Record<string, unknown>\n\t}\n}\n\nexport type ResourceEvent = BaseEvent & {\n\ttype: \"resource\"\n\tdata: {\n\t\t/** Request URL */\n\t\tresourceUrl: string\n\t\t/** HTTP method */\n\t\tmethod: string\n\t\t/** HTTP status code */\n\t\tstatus?: number\n\t\t/** Duration in milliseconds */\n\t\tduration: number\n\t\t/** Initiator type */\n\t\tinitiatorType: \"fetch\" | \"xhr\"\n\t\t/** Trace ID for correlation with backend traces */\n\t\ttraceId?: string\n\t}\n}\n\nexport type RageClickEvent = BaseEvent & {\n\ttype: \"rage_click\"\n\tdata: {\n\t\ttarget: string\n\t\ttext?: string\n\t\tx: number\n\t\ty: number\n\t\tviewportWidth: number\n\t\tviewportHeight: number\n\t\tclickCount: number\n\t\tscrollY?: number\n\t\ttargetPath?: string\n\t}\n}\n\nexport type RumEvent =\n\t| PageViewEvent\n\t| ClickEvent\n\t| RageClickEvent\n\t| VitalsEvent\n\t| ErrorEvent\n\t| CustomEvent\n\t| ResourceEvent\n\nexport function createBaseEvent(\n\ttype: RumEventType,\n\tsessionId: string,\n\tuserId?: string,\n): BaseEvent {\n\treturn {\n\t\ttype,\n\t\tsessionId,\n\t\tuserId,\n\t\ttimestamp: Date.now(),\n\t\turl: window.location.href,\n\t\tuserAgent: navigator.userAgent,\n\t}\n}\n","import type { ErrorEvent } from \"./events.js\"\nimport { createBaseEvent } from \"./events.js\"\n\nexport type ErrorCallback = (event: ErrorEvent) => void\n\nfunction getSelector(element: Element): string {\n\tif (element.id) return `#${element.id}`\n\n\tconst tag = element.tagName.toLowerCase()\n\tconst classes = Array.from(element.classList).join(\".\")\n\tif (classes) return `${tag}.${classes}`\n\n\treturn tag\n}\n\nfunction getStackTrace(error: Error): string | undefined {\n\tif (!error.stack) return undefined\n\t// Limit stack trace length\n\treturn error.stack.slice(0, 2000)\n}\n\nexport function setupErrorTracking(\n\tsessionId: string,\n\tuserId: string | undefined,\n\tonError: ErrorCallback,\n): void {\n\t// Capture unhandled errors\n\twindow.addEventListener(\"error\", (event) => {\n\t\tconst errorEvent: ErrorEvent = {\n\t\t\t...createBaseEvent(\"error\", sessionId, userId),\n\t\t\ttype: \"error\",\n\t\t\tdata: {\n\t\t\t\tmessage: event.message || \"Unknown error\",\n\t\t\t\tstack: event.error ? getStackTrace(event.error) : undefined,\n\t\t\t\tfilename: event.filename,\n\t\t\t\tlineno: event.lineno,\n\t\t\t\tcolno: event.colno,\n\t\t\t},\n\t\t}\n\t\tonError(errorEvent)\n\t})\n\n\t// Capture unhandled promise rejections\n\twindow.addEventListener(\"unhandledrejection\", (event) => {\n\t\tlet message = \"Unhandled Promise Rejection\"\n\t\tlet stack: string | undefined\n\n\t\tif (event.reason instanceof Error) {\n\t\t\tmessage = event.reason.message\n\t\t\tstack = getStackTrace(event.reason)\n\t\t} else if (typeof event.reason === \"string\") {\n\t\t\tmessage = event.reason\n\t\t}\n\n\t\tconst errorEvent: ErrorEvent = {\n\t\t\t...createBaseEvent(\"error\", sessionId, userId),\n\t\t\ttype: \"error\",\n\t\t\tdata: {\n\t\t\t\tmessage,\n\t\t\t\tstack,\n\t\t\t},\n\t\t}\n\t\tonError(errorEvent)\n\t})\n}\n\nexport function captureError(\n\terror: Error,\n\tsessionId: string,\n\tuserId: string | undefined,\n\toptions?: {\n\t\trequestId?: string\n\t\ttraceId?: string\n\t},\n): ErrorEvent {\n\treturn {\n\t\t...createBaseEvent(\"error\", sessionId, userId),\n\t\ttype: \"error\",\n\t\tdata: {\n\t\t\tmessage: error.message,\n\t\t\tstack: getStackTrace(error),\n\t\t\trequestId: options?.requestId,\n\t\t\ttraceId: options?.traceId,\n\t\t},\n\t}\n}\n","/**\n * W3C Trace Context utilities for browser-side distributed tracing.\n * Implements the W3C Trace Context specification:\n * https://www.w3.org/TR/trace-context/\n *\n * traceparent format: version-traceId-spanId-flags\n * Example: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01\n */\n\nconst TRACEPARENT_REGEX = /^00-([a-f0-9]{32})-([a-f0-9]{16})-([a-f0-9]{2})$/\n\nexport type TraceparentData = {\n\ttraceId: string\n\tspanId: string\n\tsampled: boolean\n}\n\n/**\n * Generate a random 32-character hex trace ID (16 bytes).\n * Uses crypto.getRandomValues for cryptographically secure randomness.\n */\nexport function generateTraceId(): string {\n\tconst bytes = new Uint8Array(16)\n\tcrypto.getRandomValues(bytes)\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\")\n}\n\n/**\n * Generate a random 16-character hex span ID (8 bytes).\n */\nexport function generateSpanId(): string {\n\tconst bytes = new Uint8Array(8)\n\tcrypto.getRandomValues(bytes)\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\")\n}\n\n/**\n * Parse a W3C traceparent header into its components.\n * Returns null if the header is invalid.\n */\nexport function parseTraceparent(header: string): TraceparentData | null {\n\tconst match = header.match(TRACEPARENT_REGEX)\n\tif (!match) return null\n\n\tconst [, traceId, spanId, flags] = match\n\tif (!traceId || !spanId || !flags) return null\n\n\t// Validate trace ID is not all zeros\n\tif (traceId === \"00000000000000000000000000000000\") return null\n\n\t// Validate span ID is not all zeros\n\tif (spanId === \"0000000000000000\") return null\n\n\treturn {\n\t\ttraceId,\n\t\tspanId,\n\t\tsampled: (Number.parseInt(flags, 16) & 0x01) === 1,\n\t}\n}\n\n/**\n * Create a W3C traceparent header value.\n */\nexport function createTraceparent(\n\ttraceId: string,\n\tspanId: string,\n\tsampled: boolean,\n): string {\n\tconst flags = sampled ? \"01\" : \"00\"\n\treturn `00-${traceId}-${spanId}-${flags}`\n}\n\n/**\n * Extract the root domain from a hostname (e.g., \"app.example.com\" -> \"example.com\")\n */\nfunction getRootDomain(hostname: string): string {\n\tconst parts = hostname.split(\".\")\n\t// Handle localhost and IP addresses\n\tif (parts.length <= 2 || hostname === \"localhost\") {\n\t\treturn hostname\n\t}\n\t// Return last two parts (e.g., \"example.com\")\n\treturn parts.slice(-2).join(\".\")\n}\n\n/**\n * Check if a URL should have trace context propagated.\n * Propagates to same-origin, same root domain, or explicitly allowed origins.\n */\nexport function shouldPropagate(\n\turl: string,\n\tpropagateToOrigins?: (string | RegExp)[],\n): boolean {\n\tlet parsedUrl: URL\n\ttry {\n\t\tparsedUrl = new URL(url, window.location.origin)\n\t} catch {\n\t\treturn false\n\t}\n\n\t// Always propagate to same origin\n\tif (parsedUrl.origin === window.location.origin) {\n\t\treturn true\n\t}\n\n\t// Auto-propagate to same root domain (e.g., app.example.com -> api.example.com)\n\tconst currentRootDomain = getRootDomain(window.location.hostname)\n\tconst targetRootDomain = getRootDomain(parsedUrl.hostname)\n\tif (currentRootDomain === targetRootDomain) {\n\t\treturn true\n\t}\n\n\t// Check against allowlist\n\tif (propagateToOrigins && propagateToOrigins.length > 0) {\n\t\tfor (const pattern of propagateToOrigins) {\n\t\t\tif (typeof pattern === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tparsedUrl.origin === pattern ||\n\t\t\t\t\tparsedUrl.href.startsWith(pattern)\n\t\t\t\t) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (pattern instanceof RegExp) {\n\t\t\t\tif (pattern.test(parsedUrl.href)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n","/**\n * Fetch instrumentation for browser-side resource tracking.\n * Intercepts fetch calls to inject traceparent headers and capture timing.\n */\n\nimport type { ErrorEvent, ResourceEvent } from \"../events.js\"\nimport { createBaseEvent } from \"../events.js\"\nimport {\n\tcreateTraceparent,\n\tgenerateSpanId,\n\tgenerateTraceId,\n\tshouldPropagate,\n} from \"../trace-context.js\"\n\nexport type FetchInstrumentationConfig = {\n\tpropagateToOrigins?: (string | RegExp)[]\n\tsessionId: string\n\tuserId?: string\n\tingestUrl?: string\n}\n\nexport type FetchErrorCallback = (event: ErrorEvent) => void\n\n// Module state for monkey-patching. Only one instrumentation instance supported.\nlet originalFetch: typeof window.fetch | null = null\nlet currentConfig: FetchInstrumentationConfig | null = null\nlet onFetchError: FetchErrorCallback | null = null\n\nfunction createResourceEvent(\n\tconfig: FetchInstrumentationConfig,\n\turl: string,\n\tmethod: string,\n\ttraceId: string | undefined,\n\tstartTime: number,\n\tduration: number,\n\tstatus?: number,\n): ResourceEvent {\n\treturn {\n\t\ttype: \"resource\",\n\t\tsessionId: config.sessionId,\n\t\tuserId: config.userId,\n\t\ttimestamp: startTime,\n\t\turl: window.location.href,\n\t\tuserAgent: navigator.userAgent,\n\t\tdata: {\n\t\t\tresourceUrl: url,\n\t\t\tmethod,\n\t\t\tstatus,\n\t\t\tduration,\n\t\t\tinitiatorType: \"fetch\",\n\t\t\ttraceId,\n\t\t},\n\t}\n}\n\nexport function instrumentFetch(\n\tconfig: FetchInstrumentationConfig,\n\tonResource: (event: ResourceEvent) => void,\n\tonError?: FetchErrorCallback,\n): void {\n\tif (originalFetch) return\n\n\toriginalFetch = window.fetch\n\tcurrentConfig = config\n\tonFetchError = onError ?? null\n\n\twindow.fetch = async function instrumentedFetch(\n\t\tinput: RequestInfo | URL,\n\t\tinit?: RequestInit,\n\t): Promise<Response> {\n\t\tconst url =\n\t\t\ttypeof input === \"string\"\n\t\t\t\t? input\n\t\t\t\t: input instanceof URL\n\t\t\t\t\t? input.toString()\n\t\t\t\t\t: input.url\n\n\t\t// Skip internal requests (Next.js RSC, SDK telemetry)\n\t\tif (\n\t\t\turl.includes(\"_rsc=\") ||\n\t\t\t(currentConfig?.ingestUrl && url.startsWith(currentConfig.ingestUrl))\n\t\t) {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\t\treturn originalFetch!(input, init)\n\t\t}\n\n\t\tconst method =\n\t\t\tinit?.method ??\n\t\t\t(typeof input !== \"string\" && !(input instanceof URL)\n\t\t\t\t? (input.method ?? \"GET\")\n\t\t\t\t: \"GET\")\n\n\t\t// Only inject traceparent for allowed origins\n\t\tconst shouldInjectTrace = shouldPropagate(\n\t\t\turl,\n\t\t\tcurrentConfig?.propagateToOrigins,\n\t\t)\n\n\t\tlet traceId: string | undefined\n\t\tlet modifiedInit = init\n\n\t\tif (shouldInjectTrace) {\n\t\t\ttraceId = generateTraceId()\n\t\t\tconst spanId = generateSpanId()\n\t\t\tconst traceparent = createTraceparent(traceId, spanId, true)\n\t\t\tconst headers = new Headers(init?.headers)\n\t\t\theaders.set(\"traceparent\", traceparent)\n\t\t\tmodifiedInit = { ...init, headers }\n\t\t}\n\n\t\tconst startTime = Date.now()\n\n\t\ttry {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\t\tconst response = await originalFetch!(input, modifiedInit)\n\t\t\tconst duration = Date.now() - startTime\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\tconst config = currentConfig!\n\n\t\t\tonResource(\n\t\t\t\tcreateResourceEvent(\n\t\t\t\t\tconfig,\n\t\t\t\t\turl,\n\t\t\t\t\tmethod,\n\t\t\t\t\ttraceId,\n\t\t\t\t\tstartTime,\n\t\t\t\t\tduration,\n\t\t\t\t\tresponse.status,\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn response\n\t\t} catch (error) {\n\t\t\tconst duration = Date.now() - startTime\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\tconst config = currentConfig!\n\n\t\t\tonResource(\n\t\t\t\tcreateResourceEvent(config, url, method, traceId, startTime, duration),\n\t\t\t)\n\n\t\t\t// Emit error event with the failed URL for better debugging\n\t\t\tif (onFetchError && error instanceof Error) {\n\t\t\t\tconst errorEvent: ErrorEvent = {\n\t\t\t\t\t...createBaseEvent(\"error\", config.sessionId, config.userId),\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tstack: error.stack?.slice(0, 2000),\n\t\t\t\t\t\tfailedUrl: url,\n\t\t\t\t\t\ttraceId,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tonFetchError(errorEvent)\n\t\t\t}\n\n\t\t\tthrow error\n\t\t}\n\t}\n}\n\nexport function updateFetchConfig(userId?: string): void {\n\tif (currentConfig) {\n\t\tcurrentConfig.userId = userId\n\t}\n}\n\nexport function restoreFetch(): void {\n\tif (originalFetch) {\n\t\twindow.fetch = originalFetch\n\t\toriginalFetch = null\n\t\tcurrentConfig = null\n\t\tonFetchError = null\n\t}\n}\n","/**\n * XMLHttpRequest instrumentation for browser-side resource tracking.\n * Intercepts XHR calls to inject traceparent headers and capture timing.\n */\n\nimport type { ErrorEvent, ResourceEvent } from \"../events.js\"\nimport { createBaseEvent } from \"../events.js\"\nimport {\n\tcreateTraceparent,\n\tgenerateSpanId,\n\tgenerateTraceId,\n\tshouldPropagate,\n} from \"../trace-context.js\"\n\nexport type XHRInstrumentationConfig = {\n\tpropagateToOrigins?: (string | RegExp)[]\n\tsessionId: string\n\tuserId?: string\n\tingestUrl?: string\n}\n\nexport type XHRErrorCallback = (event: ErrorEvent) => void\n\ntype XHRTrackingData = {\n\tmethod: string\n\turl: string\n\ttraceId: string | undefined\n\tstartTime: number\n}\n\ntype InstrumentedXHR = XMLHttpRequest & {\n\t_vident?: XHRTrackingData\n}\n\n// Module state for monkey-patching. Only one instrumentation instance supported.\nlet originalOpen: typeof XMLHttpRequest.prototype.open | null = null\nlet originalSend: typeof XMLHttpRequest.prototype.send | null = null\nlet currentConfig: XHRInstrumentationConfig | null = null\nlet onXHRError: XHRErrorCallback | null = null\n\nfunction createResourceEvent(\n\tconfig: XHRInstrumentationConfig,\n\tdata: XHRTrackingData,\n\tduration: number,\n\tstatus?: number,\n): ResourceEvent {\n\treturn {\n\t\ttype: \"resource\",\n\t\tsessionId: config.sessionId,\n\t\tuserId: config.userId,\n\t\ttimestamp: data.startTime,\n\t\turl: window.location.href,\n\t\tuserAgent: navigator.userAgent,\n\t\tdata: {\n\t\t\tresourceUrl: data.url,\n\t\t\tmethod: data.method,\n\t\t\tstatus,\n\t\t\tduration,\n\t\t\tinitiatorType: \"xhr\",\n\t\t\ttraceId: data.traceId,\n\t\t},\n\t}\n}\n\nexport function instrumentXHR(\n\tconfig: XHRInstrumentationConfig,\n\tonResource: (event: ResourceEvent) => void,\n\tonError?: XHRErrorCallback,\n): void {\n\tif (originalOpen) return\n\n\toriginalOpen = XMLHttpRequest.prototype.open\n\toriginalSend = XMLHttpRequest.prototype.send\n\tcurrentConfig = config\n\tonXHRError = onError ?? null\n\n\tXMLHttpRequest.prototype.open = function (\n\t\tthis: InstrumentedXHR,\n\t\tmethod: string,\n\t\turl: string | URL,\n\t\tasync?: boolean,\n\t\tusername?: string | null,\n\t\tpassword?: string | null,\n\t): void {\n\t\tconst urlString = url.toString()\n\t\tconst shouldInjectTrace = shouldPropagate(\n\t\t\turlString,\n\t\t\tcurrentConfig?.propagateToOrigins,\n\t\t)\n\t\tthis._vident = {\n\t\t\tmethod,\n\t\t\turl: urlString,\n\t\t\ttraceId: shouldInjectTrace ? generateTraceId() : undefined,\n\t\t\tstartTime: 0,\n\t\t}\n\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\toriginalOpen!.call(\n\t\t\tthis,\n\t\t\tmethod,\n\t\t\turl,\n\t\t\tasync ?? true,\n\t\t\tusername ?? null,\n\t\t\tpassword ?? null,\n\t\t)\n\t}\n\n\tXMLHttpRequest.prototype.send = function (\n\t\tthis: InstrumentedXHR,\n\t\tbody?: Document | XMLHttpRequestBodyInit | null,\n\t): void {\n\t\tconst data = this._vident\n\t\t// Skip internal requests (Next.js RSC, SDK telemetry) or if no tracking data\n\t\tif (\n\t\t\t!data ||\n\t\t\tdata.url.includes(\"_rsc=\") ||\n\t\t\t(currentConfig?.ingestUrl && data.url.startsWith(currentConfig.ingestUrl))\n\t\t) {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\t\toriginalSend!.call(this, body)\n\t\t\treturn\n\t\t}\n\n\t\t// Only inject traceparent for allowed origins\n\t\tif (data.traceId) {\n\t\t\tconst spanId = generateSpanId()\n\t\t\tconst traceparent = createTraceparent(data.traceId, spanId, true)\n\t\t\tthis.setRequestHeader(\"traceparent\", traceparent)\n\t\t}\n\n\t\tdata.startTime = Date.now()\n\n\t\tconst emitResource = (status?: number) => {\n\t\t\tconst duration = Date.now() - data.startTime\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\tonResource(createResourceEvent(currentConfig!, data, duration, status))\n\t\t}\n\n\t\tthis.addEventListener(\"load\", () => emitResource(this.status))\n\t\tthis.addEventListener(\"error\", () => {\n\t\t\temitResource()\n\t\t\t// Emit error event with the failed URL for better debugging\n\t\t\tif (onXHRError) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\t\tconst config = currentConfig!\n\t\t\t\tconst errorEvent: ErrorEvent = {\n\t\t\t\t\t...createBaseEvent(\"error\", config.sessionId, config.userId),\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmessage: `XHR request failed: ${data.method} ${data.url}`,\n\t\t\t\t\t\tfailedUrl: data.url,\n\t\t\t\t\t\ttraceId: data.traceId,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tonXHRError(errorEvent)\n\t\t\t}\n\t\t})\n\t\tthis.addEventListener(\"timeout\", () => {\n\t\t\temitResource()\n\t\t\tif (onXHRError) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\t\tconst config = currentConfig!\n\t\t\t\tconst errorEvent: ErrorEvent = {\n\t\t\t\t\t...createBaseEvent(\"error\", config.sessionId, config.userId),\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmessage: `XHR request timed out: ${data.method} ${data.url}`,\n\t\t\t\t\t\tfailedUrl: data.url,\n\t\t\t\t\t\ttraceId: data.traceId,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tonXHRError(errorEvent)\n\t\t\t}\n\t\t})\n\t\tthis.addEventListener(\"abort\", () => emitResource())\n\n\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\toriginalSend!.call(this, body)\n\t}\n}\n\nexport function updateXHRConfig(userId?: string): void {\n\tif (currentConfig) {\n\t\tcurrentConfig.userId = userId\n\t}\n}\n\nexport function restoreXHR(): void {\n\tif (originalOpen) {\n\t\tXMLHttpRequest.prototype.open = originalOpen\n\t\toriginalOpen = null\n\t}\n\tif (originalSend) {\n\t\tXMLHttpRequest.prototype.send = originalSend\n\t\toriginalSend = null\n\t}\n\tcurrentConfig = null\n\tonXHRError = null\n}\n","const SESSION_KEY = \"vident_session\"\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000 // 30 min inactivity timeout\nconst SESSION_MAX_DURATION_MS = 4 * 60 * 60 * 1000 // 4 hour max duration\n\ntype SessionData = {\n\tid: string\n\tstartTime: number\n\tlastActivity: number\n}\n\nexport type StorageMode = \"cookie\" | \"sessionStorage\"\n\nlet storageMode: StorageMode = \"cookie\"\n\nexport function setStorageMode(mode: StorageMode): void {\n\tstorageMode = mode\n}\n\nfunction generateSessionId(): string {\n\tconst bytes = new Uint8Array(16)\n\tcrypto.getRandomValues(bytes)\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\")\n}\n\n// Cookie operations\nfunction parseCookieValue(name: string): string | null {\n\tconst cookies = document.cookie.split(\"; \")\n\tfor (const cookie of cookies) {\n\t\tconst [key, ...rest] = cookie.split(\"=\")\n\t\tif (key === name) {\n\t\t\tconst value = rest.join(\"=\")\n\t\t\treturn value ? decodeURIComponent(value) : null\n\t\t}\n\t}\n\treturn null\n}\n\nfunction getCookie(name: string): string | null {\n\ttry {\n\t\treturn parseCookieValue(name)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction setCookie(name: string, value: string): void {\n\ttry {\n\t\t// Session cookie (no max-age) - cleared when browser closes\n\t\t// SameSite=Lax allows cookie to be sent on OAuth redirects back to our site\n\t\tdocument.cookie = `${name}=${encodeURIComponent(value)}; path=/; SameSite=Lax`\n\t} catch {\n\t\t// Cookies may be unavailable\n\t}\n}\n\nfunction deleteCookie(name: string): void {\n\ttry {\n\t\tdocument.cookie = `${name}=; path=/; max-age=0`\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\n// localStorage fallback for environments where cookies are restricted\nfunction getLocalStorage(key: string): string | null {\n\ttry {\n\t\treturn localStorage.getItem(key)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction setLocalStorage(key: string, value: string): void {\n\ttry {\n\t\tlocalStorage.setItem(key, value)\n\t} catch {\n\t\t// localStorage may be unavailable\n\t}\n}\n\nfunction deleteLocalStorage(key: string): void {\n\ttry {\n\t\tlocalStorage.removeItem(key)\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\n// sessionStorage operations\nfunction getSessionStorage(key: string): string | null {\n\ttry {\n\t\treturn sessionStorage.getItem(key)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction setSessionStorage(key: string, value: string): void {\n\ttry {\n\t\tsessionStorage.setItem(key, value)\n\t} catch {\n\t\t// sessionStorage may be unavailable\n\t}\n}\n\nfunction deleteSessionStorage(key: string): void {\n\ttry {\n\t\tsessionStorage.removeItem(key)\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\nfunction parseSessionData(value: string | null): SessionData | null {\n\tif (!value) return null\n\ttry {\n\t\treturn JSON.parse(value) as SessionData\n\t} catch {\n\t\treturn null\n\t}\n}\n\n// Storage abstraction based on mode\nfunction getStoredSession(): SessionData | null {\n\tif (storageMode === \"sessionStorage\") {\n\t\treturn parseSessionData(getSessionStorage(SESSION_KEY))\n\t}\n\n\t// Cookie mode: try cookie first, fallback to localStorage\n\tconst cookieData = parseSessionData(getCookie(SESSION_KEY))\n\tif (cookieData) return cookieData\n\n\treturn parseSessionData(getLocalStorage(SESSION_KEY))\n}\n\nfunction storeSession(data: SessionData): void {\n\tconst value = JSON.stringify(data)\n\n\tif (storageMode === \"sessionStorage\") {\n\t\tsetSessionStorage(SESSION_KEY, value)\n\t\treturn\n\t}\n\n\t// Cookie mode: store in both cookie and localStorage (fallback)\n\tsetCookie(SESSION_KEY, value)\n\tsetLocalStorage(SESSION_KEY, value)\n}\n\nfunction clearSession(): void {\n\tif (storageMode === \"sessionStorage\") {\n\t\tdeleteSessionStorage(SESSION_KEY)\n\t\treturn\n\t}\n\n\tdeleteCookie(SESSION_KEY)\n\tdeleteLocalStorage(SESSION_KEY)\n}\n\nfunction isSessionValid(session: SessionData): boolean {\n\tconst now = Date.now()\n\tconst inactivityValid = now - session.lastActivity < SESSION_TIMEOUT_MS\n\tconst durationValid = now - session.startTime < SESSION_MAX_DURATION_MS\n\treturn inactivityValid && durationValid\n}\n\nexport type SessionInfo = {\n\tsessionId: string\n\tisNew: boolean\n}\n\nexport function getOrCreateSession(): SessionInfo {\n\tconst existing = getStoredSession()\n\n\tif (existing && isSessionValid(existing)) {\n\t\treturn { sessionId: existing.id, isNew: false }\n\t}\n\n\tconst now = Date.now()\n\tconst newSession: SessionData = {\n\t\tid: generateSessionId(),\n\t\tstartTime: now,\n\t\tlastActivity: now,\n\t}\n\tstoreSession(newSession)\n\treturn { sessionId: newSession.id, isNew: true }\n}\n\nexport function refreshSession(): void {\n\tconst existing = getStoredSession()\n\tif (existing && isSessionValid(existing)) {\n\t\texisting.lastActivity = Date.now()\n\t\tstoreSession(existing)\n\t}\n}\n\nexport function endSession(): void {\n\tclearSession()\n}\n\nexport function getSessionId(): string | null {\n\tconst existing = getStoredSession()\n\treturn existing && isSessionValid(existing) ? existing.id : null\n}\n","import type { RumEvent } from \"./events.js\"\n\nexport type TransportConfig = {\n\tapiKey: string\n\tbaseUrl: string\n\tappName?: string\n\trelease?: string\n\tflushInterval?: number\n\tmaxBatchSize?: number\n}\n\nconst DEFAULT_FLUSH_INTERVAL = 5000\nconst DEFAULT_MAX_BATCH_SIZE = 10\n\nexport function createTransport(config: TransportConfig) {\n\tconst queue: RumEvent[] = []\n\tlet flushTimer: ReturnType<typeof setTimeout> | null = null\n\tconst flushInterval = config.flushInterval ?? DEFAULT_FLUSH_INTERVAL\n\tconst maxBatchSize = config.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE\n\n\tfunction scheduleFlush(): void {\n\t\tif (flushTimer) return\n\t\tflushTimer = setTimeout(() => {\n\t\t\tflushTimer = null\n\t\t\tflush()\n\t\t}, flushInterval)\n\t}\n\n\tasync function flush(): Promise<void> {\n\t\tif (queue.length === 0) return\n\n\t\tconst batch = queue.splice(0, maxBatchSize)\n\t\tconst controller = new AbortController()\n\t\tconst timeout = setTimeout(() => controller.abort(), 10_000)\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${config.baseUrl}/v1/ingest/rum`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"x-api-key\": config.apiKey,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tappName: config.appName,\n\t\t\t\t\trelease: config.release,\n\t\t\t\t\tevents: batch,\n\t\t\t\t}),\n\t\t\t\tsignal: controller.signal,\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.warn(\"[Vident RUM] Failed to send events:\", response.status)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[Vident RUM] Failed to send events:\", error)\n\t\t} finally {\n\t\t\tclearTimeout(timeout)\n\t\t}\n\n\t\tif (queue.length > 0) {\n\t\t\tscheduleFlush()\n\t\t}\n\t}\n\n\tfunction flushBeacon(): void {\n\t\tif (queue.length === 0) return\n\n\t\tconst batch = queue.splice(0)\n\t\tconst body = JSON.stringify({\n\t\t\tappName: config.appName,\n\t\t\trelease: config.release,\n\t\t\tevents: batch,\n\t\t})\n\n\t\t// Use fetch with keepalive for better reliability during page unload\n\t\t// Falls back to sendBeacon if fetch fails\n\t\ttry {\n\t\t\tfetch(`${config.baseUrl}/v1/ingest/rum`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"x-api-key\": config.apiKey,\n\t\t\t\t},\n\t\t\t\tbody,\n\t\t\t\tkeepalive: true,\n\t\t\t}).catch(() => {\n\t\t\t\t// Silently ignore - page is likely unloading\n\t\t\t})\n\t\t} catch {\n\t\t\t// Fallback to sendBeacon\n\t\t\tconst blob = new Blob([body], { type: \"application/json\" })\n\t\t\tnavigator.sendBeacon(\n\t\t\t\t`${config.baseUrl}/v1/ingest/rum?key=${config.apiKey}`,\n\t\t\t\tblob,\n\t\t\t)\n\t\t}\n\t}\n\n\tfunction enqueue(event: RumEvent): void {\n\t\tqueue.push(event)\n\n\t\tif (queue.length >= maxBatchSize) {\n\t\t\tflush()\n\t\t} else {\n\t\t\tscheduleFlush()\n\t\t}\n\t}\n\n\tfunction setupUnloadHandler(): void {\n\t\twindow.addEventListener(\"visibilitychange\", () => {\n\t\t\tif (document.visibilityState === \"hidden\") {\n\t\t\t\tflushBeacon()\n\t\t\t}\n\t\t})\n\n\t\twindow.addEventListener(\"pagehide\", () => {\n\t\t\tflushBeacon()\n\t\t})\n\t}\n\n\tsetupUnloadHandler()\n\n\treturn {\n\t\tenqueue,\n\t\tflush,\n\t\tflushBeacon,\n\t}\n}\n\nexport type Transport = ReturnType<typeof createTransport>\n","var e,n,t,r,i,o=-1,a=function(e){addEventListener(\"pageshow\",(function(n){n.persisted&&(o=n.timeStamp,e(n))}),!0)},c=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),r=\"navigate\";o>=0?r=\"back-forward-cache\":t&&(document.prerendering||u()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":t.type&&(r=t.type.replace(/_/g,\"-\")));return{name:e,value:void 0===n?-1:n,rating:\"good\",delta:0,entries:[],id:\"v4-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:r}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var r=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries())}))}));return r.observe(Object.assign({type:e,buffered:!0},t||{})),r}}catch(e){}},d=function(e,n,t,r){var i,o;return function(a){n.value>=0&&(a||r)&&((o=n.value-(i||0))||void 0===i)&&(i=n.value,n.delta=o,n.rating=function(e,n){return e>n[1]?\"poor\":e>n[0]?\"needs-improvement\":\"good\"}(n.value,t),e(n))}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},p=function(e){document.addEventListener(\"visibilitychange\",(function(){\"hidden\"===document.visibilityState&&e()}))},v=function(e){var n=!1;return function(){n||(e(),n=!0)}},m=-1,h=function(){return\"hidden\"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){\"hidden\"===document.visibilityState&&m>-1&&(m=\"visibilitychange\"===e.type?e.timeStamp:0,T())},y=function(){addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0)},T=function(){removeEventListener(\"visibilitychange\",g,!0),removeEventListener(\"prerenderingchange\",g,!0)},E=function(){return m<0&&(m=h(),y(),a((function(){setTimeout((function(){m=h(),y()}),0)}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener(\"prerenderingchange\",(function(){return e()}),!0):e()},b=[1800,3e3],S=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"FCP\"),o=s(\"paint\",(function(e){e.forEach((function(e){\"first-contentful-paint\"===e.name&&(o.disconnect(),e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries.push(e),t(!0)))}))}));o&&(t=d(e,i,b,n.reportAllChanges),a((function(r){i=f(\"FCP\"),t=d(e,i,b,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,t(!0)}))})))}))},L=[.1,.25],w=function(e,n){n=n||{},S(v((function(){var t,r=f(\"CLS\",0),i=0,o=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=o[0],t=o[o.length-1];i&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(i+=e.value,o.push(e)):(i=e.value,o=[e])}})),i>r.value&&(r.value=i,r.entries=o,t())},u=s(\"layout-shift\",c);u&&(t=d(e,r,L,n.reportAllChanges),p((function(){c(u.takeRecords()),t(!0)})),a((function(){i=0,r=f(\"CLS\",0),t=d(e,r,L,n.reportAllChanges),l((function(){return t()}))})),setTimeout(t,0))})))},A=0,I=1/0,P=0,M=function(e){e.forEach((function(e){e.interactionId&&(I=Math.min(I,e.interactionId),P=Math.max(P,e.interactionId),A=P?(P-I)/7+1:0)}))},k=function(){return e?A:performance.interactionCount||0},F=function(){\"interactionCount\"in performance||e||(e=s(\"event\",M,{type:\"event\",buffered:!0,durationThreshold:0}))},D=[],x=new Map,R=0,B=function(){var e=Math.min(D.length-1,Math.floor((k()-R)/50));return D[e]},H=[],q=function(e){if(H.forEach((function(n){return n(e)})),e.interactionId||\"first-input\"===e.entryType){var n=D[D.length-1],t=x.get(e.interactionId);if(t||D.length<10||e.duration>n.latency){if(t)e.duration>t.latency?(t.entries=[e],t.latency=e.duration):e.duration===t.latency&&e.startTime===t.entries[0].startTime&&t.entries.push(e);else{var r={id:e.interactionId,latency:e.duration,entries:[e]};x.set(r.id,r),D.push(r)}D.sort((function(e,n){return n.latency-e.latency})),D.length>10&&D.splice(10).forEach((function(e){return x.delete(e.id)}))}}},O=function(e){var n=self.requestIdleCallback||self.setTimeout,t=-1;return e=v(e),\"hidden\"===document.visibilityState?e():(t=n(e),p(e)),t},N=[200,500],j=function(e,n){\"PerformanceEventTiming\"in self&&\"interactionId\"in PerformanceEventTiming.prototype&&(n=n||{},C((function(){var t;F();var r,i=f(\"INP\"),o=function(e){O((function(){e.forEach(q);var n=B();n&&n.latency!==i.value&&(i.value=n.latency,i.entries=n.entries,r())}))},c=s(\"event\",o,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});r=d(e,i,N,n.reportAllChanges),c&&(c.observe({type:\"first-input\",buffered:!0}),p((function(){o(c.takeRecords()),r(!0)})),a((function(){R=k(),D.length=0,x.clear(),i=f(\"INP\"),r=d(e,i,N,n.reportAllChanges)})))})))},_=[2500,4e3],z={},G=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"LCP\"),o=function(e){n.reportAllChanges||(e=e.slice(-1)),e.forEach((function(e){e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries=[e],t())}))},c=s(\"largest-contentful-paint\",o);if(c){t=d(e,i,_,n.reportAllChanges);var m=v((function(){z[i.id]||(o(c.takeRecords()),c.disconnect(),z[i.id]=!0,t(!0))}));[\"keydown\",\"click\"].forEach((function(e){addEventListener(e,(function(){return O(m)}),{once:!0,capture:!0})})),p(m),a((function(r){i=f(\"LCP\"),t=d(e,i,_,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,z[i.id]=!0,t(!0)}))}))}}))},J=[800,1800],K=function e(n){document.prerendering?C((function(){return e(n)})):\"complete\"!==document.readyState?addEventListener(\"load\",(function(){return e(n)}),!0):setTimeout(n,0)},Q=function(e,n){n=n||{};var t=f(\"TTFB\"),r=d(e,t,J,n.reportAllChanges);K((function(){var i=c();i&&(t.value=Math.max(i.responseStart-u(),0),t.entries=[i],r(!0),a((function(){t=f(\"TTFB\",0),(r=d(e,t,J,n.reportAllChanges))(!0)})))}))},U={passive:!0,capture:!0},V=new Date,W=function(e,i){n||(n=i,t=e,r=new Date,Z(removeEventListener),X())},X=function(){if(t>=0&&t<r-V){var e={entryType:\"first-input\",name:n.type,target:n.target,cancelable:n.cancelable,startTime:n.timeStamp,processingStart:n.timeStamp+t};i.forEach((function(n){n(e)})),i=[]}},Y=function(e){if(e.cancelable){var n=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,n){var t=function(){W(e,n),i()},r=function(){i()},i=function(){removeEventListener(\"pointerup\",t,U),removeEventListener(\"pointercancel\",r,U)};addEventListener(\"pointerup\",t,U),addEventListener(\"pointercancel\",r,U)}(n,e):W(n,e)}},Z=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(n){return e(n,Y,U)}))},$=[100,300],ee=function(e,r){r=r||{},C((function(){var o,c=E(),u=f(\"FID\"),l=function(e){e.startTime<c.firstHiddenTime&&(u.value=e.processingStart-e.startTime,u.entries.push(e),o(!0))},m=function(e){e.forEach(l)},h=s(\"first-input\",m);o=d(e,u,$,r.reportAllChanges),h&&(p(v((function(){m(h.takeRecords()),h.disconnect()}))),a((function(){var a;u=f(\"FID\"),o=d(e,u,$,r.reportAllChanges),i=[],t=-1,n=null,Z(addEventListener),a=l,i.push(a),X()})))}))};export{L as CLSThresholds,b as FCPThresholds,$ as FIDThresholds,N as INPThresholds,_ as LCPThresholds,J as TTFBThresholds,w as onCLS,S as onFCP,ee as onFID,j as onINP,G as onLCP,Q as onTTFB};\n","import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from \"web-vitals\"\nimport type { VitalsEvent } from \"./events.js\"\nimport { createBaseEvent } from \"./events.js\"\n\nexport type VitalsData = {\n\tlcp?: number\n\tfid?: number\n\tcls?: number\n\tinp?: number\n\tttfb?: number\n\tfcp?: number\n}\n\nexport type VitalsCallback = (event: VitalsEvent) => void\n\nexport function setupVitalsTracking(\n\tsessionId: string,\n\tuserId: string | undefined,\n\tonVitals: VitalsCallback,\n\tonFlush?: () => void,\n): void {\n\tconst vitalsData: VitalsData = {}\n\tlet sent = false\n\n\t// Send all accumulated vitals once\n\tfunction sendVitals(): void {\n\t\tif (sent) return\n\t\tif (Object.keys(vitalsData).length === 0) return\n\n\t\tsent = true\n\t\tconst event: VitalsEvent = {\n\t\t\t...createBaseEvent(\"vitals\", sessionId, userId),\n\t\t\ttype: \"vitals\",\n\t\t\tdata: { ...vitalsData },\n\t\t}\n\t\tonVitals(event)\n\t\tonFlush?.()\n\t}\n\n\t// Register web-vitals callbacks FIRST - they add internal visibilitychange\n\t// listeners that will fire before ours and populate vitalsData\n\tonLCP((metric) => {\n\t\tvitalsData.lcp = metric.value\n\t})\n\tonFID((metric) => {\n\t\tvitalsData.fid = metric.value\n\t})\n\tonCLS((metric) => {\n\t\tvitalsData.cls = metric.value\n\t})\n\tonINP((metric) => {\n\t\tvitalsData.inp = metric.value\n\t})\n\tonTTFB((metric) => {\n\t\tvitalsData.ttfb = metric.value\n\t})\n\tonFCP((metric) => {\n\t\tvitalsData.fcp = metric.value\n\t})\n\n\t// Register our listener AFTER web-vitals - fires after their callbacks populate data\n\tdocument.addEventListener(\"visibilitychange\", () => {\n\t\tif (document.visibilityState === \"hidden\") {\n\t\t\tsendVitals()\n\t\t}\n\t})\n}\n","import { captureError, setupErrorTracking } from \"./errors.js\"\nimport type {\n\tClickEvent,\n\tCustomEvent,\n\tErrorEvent,\n\tPageViewEvent,\n\tRageClickEvent,\n\tResourceEvent,\n\tRumEvent,\n} from \"./events.js\"\nimport { createBaseEvent } from \"./events.js\"\nimport { instrumentFetch, updateFetchConfig } from \"./instrumentation/fetch.js\"\nimport { instrumentXHR, updateXHRConfig } from \"./instrumentation/xhr.js\"\nimport type { PrivacyMode, ReplayConfig, ReplayRecorder } from \"./replay.js\"\nimport {\n\ttype StorageMode,\n\tgetOrCreateSession,\n\trefreshSession,\n\tsetStorageMode,\n} from \"./session.js\"\nimport { createTransport } from \"./transport.js\"\nimport { setupVitalsTracking } from \"./vitals.js\"\n\nexport type TracingConfig = {\n\t/** Enable distributed tracing (default: true) */\n\tenabled?: boolean\n\t/** Origins to propagate trace context to (default: same-origin only) */\n\tpropagateToOrigins?: (string | RegExp)[]\n\t/** Trace fetch requests (default: true) */\n\ttraceFetch?: boolean\n\t/** Trace XMLHttpRequest (default: true) */\n\ttraceXHR?: boolean\n}\n\nexport type BrowserConfig = {\n\tapiKey: string\n\tappName?: string\n\tbaseUrl?: string\n\tsampleRate?: number\n\ttrackClicks?: boolean\n\ttrackPageViews?: boolean\n\ttrackVitals?: boolean\n\ttrackErrors?: boolean\n\t/** Track HTTP resources (fetch/XHR) with timing (default: true) */\n\ttrackResources?: boolean\n\t/** Distributed tracing configuration */\n\ttracing?: TracingConfig\n\t/**\n\t * Session storage mode (default: \"cookie\")\n\t * - \"cookie\": Uses cookies with localStorage fallback. Survives OAuth redirects.\n\t * Requires cookie consent in GDPR regions.\n\t * - \"sessionStorage\": Original behavior. Tab-isolated, cleared on tab close.\n\t * No cookie consent required.\n\t */\n\tsessionStorage?: StorageMode\n\t/** Release version tag for source map resolution (e.g., git SHA) */\n\trelease?: string\n\t/**\n\t * Privacy mode controls what user data is captured (default: \"strict\")\n\t *\n\t * Applies to session replay, click text capture, and heatmaps.\n\t *\n\t * - \"strict\": Masks all text and inputs. Click element text not captured. Recommended.\n\t * - \"balanced\": Masks inputs only. Text visible in replay and heatmap sidebar.\n\t * - \"permissive\": Records everything. Only use for internal tools with explicit consent.\n\t *\n\t * Fine-grained control via HTML attributes (all modes):\n\t * - `data-sw-block`: Completely hides element\n\t * - `data-sw-mask`: Masks text content with asterisks\n\t * - `data-sw-unmask`: Shows content even in strict mode\n\t */\n\tprivacyMode?: PrivacyMode\n\t/** Session replay configuration */\n\treplay?: ReplayConfig\n}\n\nconst DEFAULT_BASE_URL = \"https://api.vident.dev\"\n\nfunction getClickTarget(element: Element): string {\n\tif (element.id) return `#${element.id}`\n\n\tconst tag = element.tagName.toLowerCase()\n\tconst classes = Array.from(element.classList).slice(0, 3).join(\".\")\n\tif (classes) return `${tag}.${classes}`\n\n\treturn tag\n}\n\nfunction getCssPath(element: Element): string {\n\tconst parts: string[] = []\n\tlet current: Element | null = element\n\tconst MAX_DEPTH = 10\n\n\tfor (\n\t\tlet depth = 0;\n\t\tcurrent && current !== document.documentElement && depth < MAX_DEPTH;\n\t\tdepth++\n\t) {\n\t\tif (current.id) {\n\t\t\tparts.unshift(`#${current.id}`)\n\t\t\tbreak\n\t\t}\n\n\t\tconst tag = current.tagName.toLowerCase()\n\t\tconst parentEl: Element | null = current.parentElement\n\t\tif (!parentEl) {\n\t\t\tparts.unshift(tag)\n\t\t\tbreak\n\t\t}\n\n\t\tconst siblings = Array.from(parentEl.children)\n\t\tconst currentTag = current.tagName\n\t\tconst sameTags = siblings.filter((s: Element) => s.tagName === currentTag)\n\t\tif (sameTags.length > 1) {\n\t\t\tconst index = siblings.indexOf(current) + 1\n\t\t\tparts.unshift(`${tag}:nth-child(${index})`)\n\t\t} else {\n\t\t\tparts.unshift(tag)\n\t\t}\n\n\t\tcurrent = parentEl\n\t}\n\n\treturn parts.join(\" > \")\n}\n\nfunction getClickText(\n\telement: Element,\n\tprivacyMode: PrivacyMode,\n): string | undefined {\n\t// Strict: never capture text (consistent with replay masking all text)\n\tif (privacyMode === \"strict\") return undefined\n\n\t// Respect data-sw-block / data-sw-mask attributes\n\tif (element.closest(\"[data-sw-block], .rr-block, [data-sw-mask], .rr-mask\")) {\n\t\treturn undefined\n\t}\n\n\tconst text = element.textContent?.trim().slice(0, 50)\n\treturn text || undefined\n}\n\nfunction detectRelease(): string | undefined {\n\ttry {\n\t\t// Next.js (injected by withVident)\n\t\tif (\n\t\t\ttypeof process !== \"undefined\" &&\n\t\t\tprocess.env?.NEXT_PUBLIC_VIDENT_RELEASE\n\t\t) {\n\t\t\treturn process.env.NEXT_PUBLIC_VIDENT_RELEASE\n\t\t}\n\t} catch {\n\t\t// process not available in browser\n\t}\n\ttry {\n\t\t// Vite / TanStack / Remix / SvelteKit (injected by videntPlugin)\n\t\t// @ts-expect-error import.meta.env may not exist\n\t\tif (typeof import.meta !== \"undefined\" && import.meta.env?.VIDENT_RELEASE) {\n\t\t\t// @ts-expect-error import.meta.env may not exist\n\t\t\treturn import.meta.env.VIDENT_RELEASE as string\n\t\t}\n\t} catch {\n\t\t// import.meta not available\n\t}\n\treturn undefined\n}\n\nexport type VidentBrowser = {\n\ttrackEvent: (name: string, properties?: Record<string, unknown>) => void\n\ttrackPageView: (url?: string) => void\n\ttrackError: (\n\t\terror: Error,\n\t\toptions?: { requestId?: string; traceId?: string },\n\t) => void\n\tsetUser: (id: string, traits?: Record<string, unknown>) => void\n\tgetSessionId: () => string | null\n\tforceReplayUpload: () => void\n\tstopReplay: () => void\n\tisReplayUploading: () => boolean\n}\n\nexport function createVidentBrowser(config: BrowserConfig): VidentBrowser {\n\t// Apply sampling\n\tconst sampleRate = config.sampleRate ?? 1\n\tif (Math.random() > sampleRate) {\n\t\treturn {\n\t\t\ttrackEvent: () => {},\n\t\t\ttrackPageView: () => {},\n\t\t\ttrackError: () => {},\n\t\t\tsetUser: () => {},\n\t\t\tgetSessionId: () => null,\n\t\t\tforceReplayUpload: () => {},\n\t\t\tstopReplay: () => {},\n\t\t\tisReplayUploading: () => false,\n\t\t}\n\t}\n\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n\tsetStorageMode(config.sessionStorage ?? \"cookie\")\n\tconst { sessionId } = getOrCreateSession()\n\tlet userId: string | undefined\n\n\tconst release = config.release ?? detectRelease()\n\n\tconst transport = createTransport({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl,\n\t\tappName: config.appName,\n\t\trelease,\n\t})\n\n\t// Initialize replay recorder lazily — dynamic import keeps rrweb/fflate out of core bundle\n\tlet replayRecorder: ReplayRecorder | null = null\n\tlet hasTriggeredClickSnapshot = false\n\n\tconst replayConfig = config.replay\n\tconst privacyMode: PrivacyMode = config.privacyMode ?? \"strict\"\n\tif (replayConfig?.enabled) {\n\t\timport(\"./replay.js\").then(({ createReplayRecorder }) => {\n\t\t\treplayRecorder = createReplayRecorder(replayConfig, privacyMode, {\n\t\t\t\tapiKey: config.apiKey,\n\t\t\t\tbaseUrl,\n\t\t\t\tsessionId,\n\t\t\t})\n\t\t\t// Schedule settled snapshot: wait for page to fully render\n\t\t\tscheduleHeatmapSnapshot()\n\t\t})\n\t}\n\n\tfunction scheduleHeatmapSnapshot(): void {\n\t\tfunction capture(): void {\n\t\t\tsetTimeout(() => {\n\t\t\t\treplayRecorder?.captureHeatmapSnapshot(window.location.href)\n\t\t\t}, 1000)\n\t\t}\n\n\t\tif (document.readyState === \"complete\") {\n\t\t\tif (typeof requestIdleCallback === \"function\") {\n\t\t\t\trequestIdleCallback(capture, { timeout: 2000 })\n\t\t\t} else {\n\t\t\t\tsetTimeout(capture, 2000)\n\t\t\t}\n\t\t} else {\n\t\t\twindow.addEventListener(\n\t\t\t\t\"load\",\n\t\t\t\t() => {\n\t\t\t\t\tif (typeof requestIdleCallback === \"function\") {\n\t\t\t\t\t\trequestIdleCallback(capture, { timeout: 2000 })\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetTimeout(capture, 2000)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t)\n\t\t}\n\t}\n\n\tfunction enqueueEvent(event: RumEvent): void {\n\t\trefreshSession()\n\t\ttransport.enqueue(event)\n\t}\n\n\tfunction trackPageView(url?: string): void {\n\t\tconst event: PageViewEvent = {\n\t\t\t...createBaseEvent(\"page_view\", sessionId, userId),\n\t\t\ttype: \"page_view\",\n\t\t\turl: url ?? window.location.href,\n\t\t\tdata: {\n\t\t\t\treferrer: document.referrer || undefined,\n\t\t\t\ttitle: document.title,\n\t\t\t},\n\t\t}\n\t\tenqueueEvent(event)\n\t}\n\n\tfunction trackEvent(\n\t\tname: string,\n\t\tproperties?: Record<string, unknown>,\n\t): void {\n\t\tconst event: CustomEvent = {\n\t\t\t...createBaseEvent(\"custom\", sessionId, userId),\n\t\t\ttype: \"custom\",\n\t\t\tdata: {\n\t\t\t\tname,\n\t\t\t\tproperties,\n\t\t\t},\n\t\t}\n\t\tenqueueEvent(event)\n\t}\n\n\tfunction trackError(\n\t\terror: Error,\n\t\toptions?: { requestId?: string; traceId?: string },\n\t): void {\n\t\tconst event = captureError(error, sessionId, userId, options)\n\t\tenqueueEvent(event)\n\t\t// Mark replay for error correlation\n\t\treplayRecorder?.markError()\n\t}\n\n\tfunction setUser(id: string, traits?: Record<string, unknown>): void {\n\t\tuserId = id\n\t\t// Update instrumentation configs with new userId\n\t\tupdateFetchConfig(userId)\n\t\tupdateXHRConfig(userId)\n\t\t// Optionally track user identification as custom event\n\t\tif (traits) {\n\t\t\ttrackEvent(\"user_identified\", { userId: id, ...traits })\n\t\t}\n\t}\n\n\tfunction getSessionIdValue(): string {\n\t\treturn sessionId\n\t}\n\n\t// Auto-tracking setup\n\tif (config.trackPageViews !== false) {\n\t\t// Track initial page view\n\t\ttrackPageView()\n\n\t\t// Track SPA navigation\n\t\tconst originalPushState = history.pushState.bind(history)\n\t\tconst originalReplaceState = history.replaceState.bind(history)\n\n\t\t// Delay snapshot after SPA nav so framework has time to render\n\t\tfunction scheduleSpaSnapshot(): void {\n\t\t\tsetTimeout(() => {\n\t\t\t\treplayRecorder?.snapshot()\n\t\t\t}, 2000)\n\t\t}\n\n\t\tfunction onSpaNav(): void {\n\t\t\ttrackPageView()\n\t\t\tscheduleSpaSnapshot()\n\t\t\t// Reset click snapshot guard for new URL\n\t\t\thasTriggeredClickSnapshot = false\n\t\t\treplayRecorder?.resetHeatmapSnapshot()\n\t\t\t// Schedule heatmap snapshot for new page\n\t\t\tif (replayRecorder) scheduleHeatmapSnapshot()\n\t\t}\n\n\t\thistory.pushState = (...args) => {\n\t\t\toriginalPushState(...args)\n\t\t\tonSpaNav()\n\t\t}\n\n\t\thistory.replaceState = (...args) => {\n\t\t\toriginalReplaceState(...args)\n\t\t\tonSpaNav()\n\t\t}\n\n\t\twindow.addEventListener(\"popstate\", () => {\n\t\t\tonSpaNav()\n\t\t})\n\t}\n\n\tif (config.trackClicks !== false) {\n\t\tconst clickPrivacy: PrivacyMode = config.privacyMode ?? \"strict\"\n\t\tconst recentClicks: Array<{ target: string; timestamp: number }> = []\n\t\tconst RAGE_CLICK_THRESHOLD = 3\n\t\tconst RAGE_CLICK_WINDOW_MS = 1000\n\n\t\tdocument.addEventListener(\n\t\t\t\"click\",\n\t\t\t(event) => {\n\t\t\t\tconst target = event.target as Element\n\t\t\t\tif (!target) return\n\n\t\t\t\t// Only track interactive elements\n\t\t\t\tconst interactiveElements = [\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"BUTTON\",\n\t\t\t\t\t\"INPUT\",\n\t\t\t\t\t\"SELECT\",\n\t\t\t\t\t\"TEXTAREA\",\n\t\t\t\t]\n\t\t\t\tconst isInteractive =\n\t\t\t\t\tinteractiveElements.includes(target.tagName) ||\n\t\t\t\t\ttarget.closest(\"a, button\") !== null ||\n\t\t\t\t\ttarget.getAttribute(\"role\") === \"button\"\n\n\t\t\t\tif (!isInteractive) return\n\n\t\t\t\tconst targetSelector = getClickTarget(target)\n\t\t\t\tconst targetPath = getCssPath(target)\n\n\t\t\t\tconst clickEvent: ClickEvent = {\n\t\t\t\t\t...createBaseEvent(\"click\", sessionId, userId),\n\t\t\t\t\ttype: \"click\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\ttext: getClickText(target, clickPrivacy),\n\t\t\t\t\t\tx: event.pageX,\n\t\t\t\t\t\ty: event.pageY,\n\t\t\t\t\t\tviewportWidth: window.innerWidth,\n\t\t\t\t\t\tviewportHeight: window.innerHeight,\n\t\t\t\t\t\tscrollY: window.scrollY,\n\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tenqueueEvent(clickEvent)\n\n\t\t\t\t// Capture heatmap snapshot on first click (page guaranteed rendered)\n\t\t\t\tif (!hasTriggeredClickSnapshot && replayRecorder) {\n\t\t\t\t\thasTriggeredClickSnapshot = true\n\t\t\t\t\treplayRecorder.captureHeatmapSnapshot(window.location.href)\n\t\t\t\t}\n\n\t\t\t\t// Rage click detection: 3+ clicks on same target within 1s\n\t\t\t\tconst now = Date.now()\n\t\t\t\trecentClicks.push({ target: targetSelector, timestamp: now })\n\n\t\t\t\t// Prune old clicks outside the window\n\t\t\t\twhile (\n\t\t\t\t\trecentClicks.length > 0 &&\n\t\t\t\t\t(recentClicks[0]?.timestamp ?? 0) < now - RAGE_CLICK_WINDOW_MS\n\t\t\t\t) {\n\t\t\t\t\trecentClicks.shift()\n\t\t\t\t}\n\n\t\t\t\tconst matchingClicks = recentClicks.filter(\n\t\t\t\t\t(c) => c.target === targetSelector,\n\t\t\t\t)\n\t\t\t\tif (matchingClicks.length >= RAGE_CLICK_THRESHOLD) {\n\t\t\t\t\tconst rageEvent: RageClickEvent = {\n\t\t\t\t\t\t...createBaseEvent(\"rage_click\", sessionId, userId),\n\t\t\t\t\t\ttype: \"rage_click\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\t\ttext: getClickText(target, clickPrivacy),\n\t\t\t\t\t\t\tx: event.pageX,\n\t\t\t\t\t\t\ty: event.pageY,\n\t\t\t\t\t\t\tviewportWidth: window.innerWidth,\n\t\t\t\t\t\t\tviewportHeight: window.innerHeight,\n\t\t\t\t\t\t\tclickCount: matchingClicks.length,\n\t\t\t\t\t\t\tscrollY: window.scrollY,\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t\tenqueueEvent(rageEvent)\n\t\t\t\t\t// Reset tracker to avoid repeat detections for the same burst\n\t\t\t\t\trecentClicks.length = 0\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ capture: true },\n\t\t)\n\t}\n\n\tif (config.trackVitals !== false) {\n\t\tsetupVitalsTracking(\n\t\t\tsessionId,\n\t\t\tuserId,\n\t\t\t(event) => {\n\t\t\t\tenqueueEvent(event)\n\t\t\t},\n\t\t\t() => {\n\t\t\t\ttransport.flushBeacon()\n\t\t\t},\n\t\t)\n\t}\n\n\tif (config.trackErrors !== false) {\n\t\tsetupErrorTracking(sessionId, userId, (event) => {\n\t\t\tenqueueEvent(event)\n\t\t\t// Mark replay for error correlation (auto-captured errors)\n\t\t\treplayRecorder?.markError()\n\t\t})\n\t}\n\n\t// Resource tracking: capture HTTP requests with timing and trace correlation\n\t// - trackResources: store resource events in RUM (default: true)\n\t// - tracing.enabled: inject traceparent headers for backend correlation (default: true)\n\t// If either is enabled, we instrument fetch/XHR\n\tconst shouldInstrument =\n\t\tconfig.trackResources !== false || config.tracing?.enabled !== false\n\tconst shouldStoreResources = config.trackResources !== false\n\n\tif (shouldInstrument) {\n\t\tconst ingestUrl = `${baseUrl}/v1/ingest`\n\t\tconst instrumentationConfig = {\n\t\t\tpropagateToOrigins: config.tracing?.propagateToOrigins,\n\t\t\tsessionId,\n\t\t\tuserId,\n\t\t\tingestUrl,\n\t\t}\n\n\t\tconst onResource = shouldStoreResources\n\t\t\t? (event: ResourceEvent) => enqueueEvent(event)\n\t\t\t: () => {} // traceparent injected but events not stored\n\n\t\t// Capture network errors with URL context (only if error tracking enabled)\n\t\tconst onNetworkError =\n\t\t\tconfig.trackErrors !== false\n\t\t\t\t? (event: ErrorEvent) => enqueueEvent(event)\n\t\t\t\t: undefined\n\n\t\tif (config.tracing?.traceFetch !== false) {\n\t\t\tinstrumentFetch(instrumentationConfig, onResource, onNetworkError)\n\t\t}\n\n\t\tif (config.tracing?.traceXHR !== false) {\n\t\t\tinstrumentXHR(instrumentationConfig, onResource, onNetworkError)\n\t\t}\n\t}\n\n\treturn {\n\t\ttrackEvent,\n\t\ttrackPageView,\n\t\ttrackError,\n\t\tsetUser,\n\t\tgetSessionId: getSessionIdValue,\n\t\tforceReplayUpload: () => {\n\t\t\treplayRecorder?.startUploading()\n\t\t},\n\t\tstopReplay: () => {\n\t\t\treplayRecorder?.stop()\n\t\t},\n\t\tisReplayUploading: () => replayRecorder?.isUploading() ?? false,\n\t}\n}\n"],"mappings":"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","names":["createBaseEvent","type","sessionId","userId","getStackTrace","error","setupErrorTracking","sessionId","userId","onError","event","errorEvent","createBaseEvent","message","stack","captureError","options","generateTraceId","bytes","b","generateSpanId","createTraceparent","traceId","spanId","sampled","getRootDomain","hostname","parts","shouldPropagate","url","propagateToOrigins","parsedUrl","currentRootDomain","targetRootDomain","pattern","originalFetch","currentConfig","onFetchError","createResourceEvent","config","url","method","traceId","startTime","duration","status","instrumentFetch","onResource","onError","input","init","shouldInjectTrace","shouldPropagate","modifiedInit","generateTraceId","spanId","generateSpanId","traceparent","createTraceparent","headers","response","error","errorEvent","createBaseEvent","updateFetchConfig","userId","originalOpen","originalSend","currentConfig","onXHRError","createResourceEvent","config","data","duration","status","instrumentXHR","onResource","onError","method","url","async","username","password","urlString","shouldInjectTrace","shouldPropagate","generateTraceId","body","spanId","generateSpanId","traceparent","createTraceparent","emitResource","errorEvent","createBaseEvent","updateXHRConfig","userId","SESSION_KEY","storageMode","setStorageMode","mode","generateSessionId","bytes","b","parseCookieValue","name","cookies","cookie","key","rest","value","getCookie","setCookie","deleteCookie","getLocalStorage","setLocalStorage","deleteLocalStorage","getSessionStorage","setSessionStorage","deleteSessionStorage","parseSessionData","getStoredSession","SESSION_KEY","cookieData","storeSession","data","clearSession","isSessionValid","session","now","inactivityValid","durationValid","getOrCreateSession","existing","newSession","refreshSession","endSession","getSessionId","createTransport","config","queue","flushTimer","flushInterval","maxBatchSize","scheduleFlush","flush","batch","controller","timeout","response","error","flushBeacon","body","blob","enqueue","event","setupUnloadHandler","e","n","t","r","i","o","a","c","u","f","s","d","l","p","v","m","h","g","T","y","E","C","b","S","L","w","A","I","P","M","k","F","D","x","R","B","H","q","O","N","j","_","z","G","J","K","Q","U","V","W","Z","X","Y","$","ee","setupVitalsTracking","sessionId","userId","onVitals","onFlush","vitalsData","sent","sendVitals","event","createBaseEvent","G","metric","ee","w","j","Q","S","DEFAULT_BASE_URL","getClickTarget","element","tag","classes","getCssPath","parts","current","MAX_DEPTH","depth","parentEl","siblings","currentTag","s","index","getClickText","privacyMode","detectRelease","createVidentBrowser","config","sampleRate","baseUrl","setStorageMode","sessionId","getOrCreateSession","userId","release","transport","createTransport","replayRecorder","hasTriggeredClickSnapshot","replayConfig","createReplayRecorder","scheduleHeatmapSnapshot","capture","enqueueEvent","event","refreshSession","trackPageView","url","createBaseEvent","trackEvent","name","properties","trackError","error","options","captureError","setUser","id","traits","updateFetchConfig","updateXHRConfig","getSessionIdValue","scheduleSpaSnapshot","onSpaNav","originalPushState","originalReplaceState","args","clickPrivacy","recentClicks","RAGE_CLICK_THRESHOLD","RAGE_CLICK_WINDOW_MS","target","targetSelector","targetPath","clickEvent","now","matchingClicks","c","rageEvent","setupVitalsTracking","setupErrorTracking","shouldInstrument","shouldStoreResources","ingestUrl","instrumentationConfig","onResource","onNetworkError","instrumentFetch","instrumentXHR"]}
|
|
1
|
+
{"version":3,"sources":["../src/events.ts","../src/errors.ts","../src/trace-context.ts","../src/instrumentation/fetch.ts","../src/instrumentation/xhr.ts","../src/session.ts","../src/transport.ts","../../../node_modules/.pnpm/web-vitals@4.2.4/node_modules/web-vitals/dist/web-vitals.js","../src/vitals.ts","../src/client.ts"],"sourcesContent":["export type RumEventType =\n\t| \"page_view\"\n\t| \"click\"\n\t| \"rage_click\"\n\t| \"vitals\"\n\t| \"error\"\n\t| \"custom\"\n\t| \"resource\"\n\nexport type BaseEvent = {\n\ttype: RumEventType\n\tsessionId: string\n\tuserId?: string\n\ttimestamp: number\n\turl: string\n\tuserAgent: string\n}\n\nexport type PageViewEvent = BaseEvent & {\n\ttype: \"page_view\"\n\tdata: {\n\t\treferrer?: string\n\t\ttitle: string\n\t}\n}\n\nexport type ClickEvent = BaseEvent & {\n\ttype: \"click\"\n\tdata: {\n\t\ttarget: string\n\t\ttext?: string\n\t\tx: number\n\t\ty: number\n\t\tviewportWidth: number\n\t\tviewportHeight: number\n\t\tscrollY?: number\n\t\ttargetPath?: string\n\t}\n}\n\nexport type VitalsEvent = BaseEvent & {\n\ttype: \"vitals\"\n\tdata: {\n\t\tlcp?: number\n\t\tfid?: number\n\t\tcls?: number\n\t\tinp?: number\n\t\tttfb?: number\n\t\tfcp?: number\n\t}\n}\n\nexport type ErrorEvent = BaseEvent & {\n\ttype: \"error\"\n\tdata: {\n\t\tmessage: string\n\t\tstack?: string\n\t\tfilename?: string\n\t\tlineno?: number\n\t\tcolno?: number\n\t\trequestId?: string\n\t\t/** Trace ID for correlation with backend traces */\n\t\ttraceId?: string\n\t\t/** URL that failed (for fetch/network errors) */\n\t\tfailedUrl?: string\n\t}\n}\n\nexport type CustomEvent = BaseEvent & {\n\ttype: \"custom\"\n\tdata: {\n\t\tname: string\n\t\tproperties?: Record<string, unknown>\n\t}\n}\n\nexport type ResourceEvent = BaseEvent & {\n\ttype: \"resource\"\n\tdata: {\n\t\t/** Request URL */\n\t\tresourceUrl: string\n\t\t/** HTTP method */\n\t\tmethod: string\n\t\t/** HTTP status code */\n\t\tstatus?: number\n\t\t/** Duration in milliseconds */\n\t\tduration: number\n\t\t/** Initiator type */\n\t\tinitiatorType: \"fetch\" | \"xhr\"\n\t\t/** Trace ID for correlation with backend traces */\n\t\ttraceId?: string\n\t}\n}\n\nexport type RageClickEvent = BaseEvent & {\n\ttype: \"rage_click\"\n\tdata: {\n\t\ttarget: string\n\t\ttext?: string\n\t\tx: number\n\t\ty: number\n\t\tviewportWidth: number\n\t\tviewportHeight: number\n\t\tclickCount: number\n\t\tscrollY?: number\n\t\ttargetPath?: string\n\t}\n}\n\nexport type RumEvent =\n\t| PageViewEvent\n\t| ClickEvent\n\t| RageClickEvent\n\t| VitalsEvent\n\t| ErrorEvent\n\t| CustomEvent\n\t| ResourceEvent\n\nexport function createBaseEvent(\n\ttype: RumEventType,\n\tsessionId: string,\n\tuserId?: string,\n): BaseEvent {\n\treturn {\n\t\ttype,\n\t\tsessionId,\n\t\tuserId,\n\t\ttimestamp: Date.now(),\n\t\turl: window.location.href,\n\t\tuserAgent: navigator.userAgent,\n\t}\n}\n","import type { ErrorEvent } from \"./events.js\"\nimport { createBaseEvent } from \"./events.js\"\n\nexport type ErrorCallback = (event: ErrorEvent) => void\n\nfunction getSelector(element: Element): string {\n\tif (element.id) return `#${element.id}`\n\n\tconst tag = element.tagName.toLowerCase()\n\tconst classes = Array.from(element.classList).join(\".\")\n\tif (classes) return `${tag}.${classes}`\n\n\treturn tag\n}\n\nfunction getStackTrace(error: Error): string | undefined {\n\tif (!error.stack) return undefined\n\t// Limit stack trace length\n\treturn error.stack.slice(0, 2000)\n}\n\nexport function setupErrorTracking(\n\tsessionId: string,\n\tuserId: string | undefined,\n\tonError: ErrorCallback,\n): void {\n\t// Capture unhandled errors\n\twindow.addEventListener(\"error\", (event) => {\n\t\tconst errorEvent: ErrorEvent = {\n\t\t\t...createBaseEvent(\"error\", sessionId, userId),\n\t\t\ttype: \"error\",\n\t\t\tdata: {\n\t\t\t\tmessage: event.message || \"Unknown error\",\n\t\t\t\tstack: event.error ? getStackTrace(event.error) : undefined,\n\t\t\t\tfilename: event.filename,\n\t\t\t\tlineno: event.lineno,\n\t\t\t\tcolno: event.colno,\n\t\t\t},\n\t\t}\n\t\tonError(errorEvent)\n\t})\n\n\t// Capture unhandled promise rejections\n\twindow.addEventListener(\"unhandledrejection\", (event) => {\n\t\tlet message = \"Unhandled Promise Rejection\"\n\t\tlet stack: string | undefined\n\n\t\tif (event.reason instanceof Error) {\n\t\t\tmessage = event.reason.message\n\t\t\tstack = getStackTrace(event.reason)\n\t\t} else if (typeof event.reason === \"string\") {\n\t\t\tmessage = event.reason\n\t\t}\n\n\t\tconst errorEvent: ErrorEvent = {\n\t\t\t...createBaseEvent(\"error\", sessionId, userId),\n\t\t\ttype: \"error\",\n\t\t\tdata: {\n\t\t\t\tmessage,\n\t\t\t\tstack,\n\t\t\t},\n\t\t}\n\t\tonError(errorEvent)\n\t})\n}\n\nexport function captureError(\n\terror: Error,\n\tsessionId: string,\n\tuserId: string | undefined,\n\toptions?: {\n\t\trequestId?: string\n\t\ttraceId?: string\n\t},\n): ErrorEvent {\n\treturn {\n\t\t...createBaseEvent(\"error\", sessionId, userId),\n\t\ttype: \"error\",\n\t\tdata: {\n\t\t\tmessage: error.message,\n\t\t\tstack: getStackTrace(error),\n\t\t\trequestId: options?.requestId,\n\t\t\ttraceId: options?.traceId,\n\t\t},\n\t}\n}\n","/**\n * W3C Trace Context utilities for browser-side distributed tracing.\n * Implements the W3C Trace Context specification:\n * https://www.w3.org/TR/trace-context/\n *\n * traceparent format: version-traceId-spanId-flags\n * Example: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01\n */\n\nconst TRACEPARENT_REGEX = /^00-([a-f0-9]{32})-([a-f0-9]{16})-([a-f0-9]{2})$/\n\nexport type TraceparentData = {\n\ttraceId: string\n\tspanId: string\n\tsampled: boolean\n}\n\n/**\n * Generate a random 32-character hex trace ID (16 bytes).\n * Uses crypto.getRandomValues for cryptographically secure randomness.\n */\nexport function generateTraceId(): string {\n\tconst bytes = new Uint8Array(16)\n\tcrypto.getRandomValues(bytes)\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\")\n}\n\n/**\n * Generate a random 16-character hex span ID (8 bytes).\n */\nexport function generateSpanId(): string {\n\tconst bytes = new Uint8Array(8)\n\tcrypto.getRandomValues(bytes)\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\")\n}\n\n/**\n * Parse a W3C traceparent header into its components.\n * Returns null if the header is invalid.\n */\nexport function parseTraceparent(header: string): TraceparentData | null {\n\tconst match = header.match(TRACEPARENT_REGEX)\n\tif (!match) return null\n\n\tconst [, traceId, spanId, flags] = match\n\tif (!traceId || !spanId || !flags) return null\n\n\t// Validate trace ID is not all zeros\n\tif (traceId === \"00000000000000000000000000000000\") return null\n\n\t// Validate span ID is not all zeros\n\tif (spanId === \"0000000000000000\") return null\n\n\treturn {\n\t\ttraceId,\n\t\tspanId,\n\t\tsampled: (Number.parseInt(flags, 16) & 0x01) === 1,\n\t}\n}\n\n/**\n * Create a W3C traceparent header value.\n */\nexport function createTraceparent(\n\ttraceId: string,\n\tspanId: string,\n\tsampled: boolean,\n): string {\n\tconst flags = sampled ? \"01\" : \"00\"\n\treturn `00-${traceId}-${spanId}-${flags}`\n}\n\n/**\n * Extract the root domain from a hostname (e.g., \"app.example.com\" -> \"example.com\")\n */\nfunction getRootDomain(hostname: string): string {\n\tconst parts = hostname.split(\".\")\n\t// Handle localhost and IP addresses\n\tif (parts.length <= 2 || hostname === \"localhost\") {\n\t\treturn hostname\n\t}\n\t// Return last two parts (e.g., \"example.com\")\n\treturn parts.slice(-2).join(\".\")\n}\n\n/**\n * Check if a URL should have trace context propagated.\n * Propagates to same-origin, same root domain, or explicitly allowed origins.\n */\nexport function shouldPropagate(\n\turl: string,\n\tpropagateToOrigins?: (string | RegExp)[],\n): boolean {\n\tlet parsedUrl: URL\n\ttry {\n\t\tparsedUrl = new URL(url, window.location.origin)\n\t} catch {\n\t\treturn false\n\t}\n\n\t// Always propagate to same origin\n\tif (parsedUrl.origin === window.location.origin) {\n\t\treturn true\n\t}\n\n\t// Auto-propagate to same root domain (e.g., app.example.com -> api.example.com)\n\tconst currentRootDomain = getRootDomain(window.location.hostname)\n\tconst targetRootDomain = getRootDomain(parsedUrl.hostname)\n\tif (currentRootDomain === targetRootDomain) {\n\t\treturn true\n\t}\n\n\t// Check against allowlist\n\tif (propagateToOrigins && propagateToOrigins.length > 0) {\n\t\tfor (const pattern of propagateToOrigins) {\n\t\t\tif (typeof pattern === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tparsedUrl.origin === pattern ||\n\t\t\t\t\tparsedUrl.href.startsWith(pattern)\n\t\t\t\t) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (pattern instanceof RegExp) {\n\t\t\t\tif (pattern.test(parsedUrl.href)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n","/**\n * Fetch instrumentation for browser-side resource tracking.\n * Intercepts fetch calls to inject traceparent headers and capture timing.\n */\n\nimport type { ErrorEvent, ResourceEvent } from \"../events.js\"\nimport { createBaseEvent } from \"../events.js\"\nimport {\n\tcreateTraceparent,\n\tgenerateSpanId,\n\tgenerateTraceId,\n\tshouldPropagate,\n} from \"../trace-context.js\"\n\nexport type FetchInstrumentationConfig = {\n\tpropagateToOrigins?: (string | RegExp)[]\n\tsessionId: string\n\tuserId?: string\n\tingestUrl?: string\n}\n\nexport type FetchErrorCallback = (event: ErrorEvent) => void\n\n// Module state for monkey-patching. Only one instrumentation instance supported.\nlet originalFetch: typeof window.fetch | null = null\nlet currentConfig: FetchInstrumentationConfig | null = null\nlet onFetchError: FetchErrorCallback | null = null\n\nfunction createResourceEvent(\n\tconfig: FetchInstrumentationConfig,\n\turl: string,\n\tmethod: string,\n\ttraceId: string | undefined,\n\tstartTime: number,\n\tduration: number,\n\tstatus?: number,\n): ResourceEvent {\n\treturn {\n\t\ttype: \"resource\",\n\t\tsessionId: config.sessionId,\n\t\tuserId: config.userId,\n\t\ttimestamp: startTime,\n\t\turl: window.location.href,\n\t\tuserAgent: navigator.userAgent,\n\t\tdata: {\n\t\t\tresourceUrl: url,\n\t\t\tmethod,\n\t\t\tstatus,\n\t\t\tduration,\n\t\t\tinitiatorType: \"fetch\",\n\t\t\ttraceId,\n\t\t},\n\t}\n}\n\nexport function instrumentFetch(\n\tconfig: FetchInstrumentationConfig,\n\tonResource: (event: ResourceEvent) => void,\n\tonError?: FetchErrorCallback,\n): void {\n\tif (originalFetch) return\n\n\toriginalFetch = window.fetch\n\tcurrentConfig = config\n\tonFetchError = onError ?? null\n\n\twindow.fetch = async function instrumentedFetch(\n\t\tinput: RequestInfo | URL,\n\t\tinit?: RequestInit,\n\t): Promise<Response> {\n\t\tconst url =\n\t\t\ttypeof input === \"string\"\n\t\t\t\t? input\n\t\t\t\t: input instanceof URL\n\t\t\t\t\t? input.toString()\n\t\t\t\t\t: input.url\n\n\t\t// Skip internal requests (Next.js RSC, SDK telemetry)\n\t\tif (\n\t\t\turl.includes(\"_rsc=\") ||\n\t\t\t(currentConfig?.ingestUrl && url.startsWith(currentConfig.ingestUrl))\n\t\t) {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\t\treturn originalFetch!(input, init)\n\t\t}\n\n\t\tconst method =\n\t\t\tinit?.method ??\n\t\t\t(typeof input !== \"string\" && !(input instanceof URL)\n\t\t\t\t? (input.method ?? \"GET\")\n\t\t\t\t: \"GET\")\n\n\t\t// Only inject traceparent for allowed origins\n\t\tconst shouldInjectTrace = shouldPropagate(\n\t\t\turl,\n\t\t\tcurrentConfig?.propagateToOrigins,\n\t\t)\n\n\t\tlet traceId: string | undefined\n\t\tlet modifiedInit = init\n\n\t\tif (shouldInjectTrace) {\n\t\t\ttraceId = generateTraceId()\n\t\t\tconst spanId = generateSpanId()\n\t\t\tconst traceparent = createTraceparent(traceId, spanId, true)\n\t\t\tconst headers = new Headers(init?.headers)\n\t\t\theaders.set(\"traceparent\", traceparent)\n\t\t\tmodifiedInit = { ...init, headers }\n\t\t}\n\n\t\tconst startTime = Date.now()\n\n\t\ttry {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\t\tconst response = await originalFetch!(input, modifiedInit)\n\t\t\tconst duration = Date.now() - startTime\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\tconst config = currentConfig!\n\n\t\t\tonResource(\n\t\t\t\tcreateResourceEvent(\n\t\t\t\t\tconfig,\n\t\t\t\t\turl,\n\t\t\t\t\tmethod,\n\t\t\t\t\ttraceId,\n\t\t\t\t\tstartTime,\n\t\t\t\t\tduration,\n\t\t\t\t\tresponse.status,\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn response\n\t\t} catch (error) {\n\t\t\tconst duration = Date.now() - startTime\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\tconst config = currentConfig!\n\n\t\t\tonResource(\n\t\t\t\tcreateResourceEvent(config, url, method, traceId, startTime, duration),\n\t\t\t)\n\n\t\t\t// Emit error event with the failed URL for better debugging\n\t\t\tif (onFetchError && error instanceof Error) {\n\t\t\t\tconst errorEvent: ErrorEvent = {\n\t\t\t\t\t...createBaseEvent(\"error\", config.sessionId, config.userId),\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tstack: error.stack?.slice(0, 2000),\n\t\t\t\t\t\tfailedUrl: url,\n\t\t\t\t\t\ttraceId,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tonFetchError(errorEvent)\n\t\t\t}\n\n\t\t\tthrow error\n\t\t}\n\t}\n}\n\nexport function updateFetchConfig(userId?: string): void {\n\tif (currentConfig) {\n\t\tcurrentConfig.userId = userId\n\t}\n}\n\nexport function updateFetchSessionId(sessionId: string): void {\n\tif (currentConfig) {\n\t\tcurrentConfig.sessionId = sessionId\n\t}\n}\n\nexport function restoreFetch(): void {\n\tif (originalFetch) {\n\t\twindow.fetch = originalFetch\n\t\toriginalFetch = null\n\t\tcurrentConfig = null\n\t\tonFetchError = null\n\t}\n}\n","/**\n * XMLHttpRequest instrumentation for browser-side resource tracking.\n * Intercepts XHR calls to inject traceparent headers and capture timing.\n */\n\nimport type { ErrorEvent, ResourceEvent } from \"../events.js\"\nimport { createBaseEvent } from \"../events.js\"\nimport {\n\tcreateTraceparent,\n\tgenerateSpanId,\n\tgenerateTraceId,\n\tshouldPropagate,\n} from \"../trace-context.js\"\n\nexport type XHRInstrumentationConfig = {\n\tpropagateToOrigins?: (string | RegExp)[]\n\tsessionId: string\n\tuserId?: string\n\tingestUrl?: string\n}\n\nexport type XHRErrorCallback = (event: ErrorEvent) => void\n\ntype XHRTrackingData = {\n\tmethod: string\n\turl: string\n\ttraceId: string | undefined\n\tstartTime: number\n}\n\ntype InstrumentedXHR = XMLHttpRequest & {\n\t_vident?: XHRTrackingData\n}\n\n// Module state for monkey-patching. Only one instrumentation instance supported.\nlet originalOpen: typeof XMLHttpRequest.prototype.open | null = null\nlet originalSend: typeof XMLHttpRequest.prototype.send | null = null\nlet currentConfig: XHRInstrumentationConfig | null = null\nlet onXHRError: XHRErrorCallback | null = null\n\nfunction createResourceEvent(\n\tconfig: XHRInstrumentationConfig,\n\tdata: XHRTrackingData,\n\tduration: number,\n\tstatus?: number,\n): ResourceEvent {\n\treturn {\n\t\ttype: \"resource\",\n\t\tsessionId: config.sessionId,\n\t\tuserId: config.userId,\n\t\ttimestamp: data.startTime,\n\t\turl: window.location.href,\n\t\tuserAgent: navigator.userAgent,\n\t\tdata: {\n\t\t\tresourceUrl: data.url,\n\t\t\tmethod: data.method,\n\t\t\tstatus,\n\t\t\tduration,\n\t\t\tinitiatorType: \"xhr\",\n\t\t\ttraceId: data.traceId,\n\t\t},\n\t}\n}\n\nexport function instrumentXHR(\n\tconfig: XHRInstrumentationConfig,\n\tonResource: (event: ResourceEvent) => void,\n\tonError?: XHRErrorCallback,\n): void {\n\tif (originalOpen) return\n\n\toriginalOpen = XMLHttpRequest.prototype.open\n\toriginalSend = XMLHttpRequest.prototype.send\n\tcurrentConfig = config\n\tonXHRError = onError ?? null\n\n\tXMLHttpRequest.prototype.open = function (\n\t\tthis: InstrumentedXHR,\n\t\tmethod: string,\n\t\turl: string | URL,\n\t\tasync?: boolean,\n\t\tusername?: string | null,\n\t\tpassword?: string | null,\n\t): void {\n\t\tconst urlString = url.toString()\n\t\tconst shouldInjectTrace = shouldPropagate(\n\t\t\turlString,\n\t\t\tcurrentConfig?.propagateToOrigins,\n\t\t)\n\t\tthis._vident = {\n\t\t\tmethod,\n\t\t\turl: urlString,\n\t\t\ttraceId: shouldInjectTrace ? generateTraceId() : undefined,\n\t\t\tstartTime: 0,\n\t\t}\n\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\toriginalOpen!.call(\n\t\t\tthis,\n\t\t\tmethod,\n\t\t\turl,\n\t\t\tasync ?? true,\n\t\t\tusername ?? null,\n\t\t\tpassword ?? null,\n\t\t)\n\t}\n\n\tXMLHttpRequest.prototype.send = function (\n\t\tthis: InstrumentedXHR,\n\t\tbody?: Document | XMLHttpRequestBodyInit | null,\n\t): void {\n\t\tconst data = this._vident\n\t\t// Skip internal requests (Next.js RSC, SDK telemetry) or if no tracking data\n\t\tif (\n\t\t\t!data ||\n\t\t\tdata.url.includes(\"_rsc=\") ||\n\t\t\t(currentConfig?.ingestUrl && data.url.startsWith(currentConfig.ingestUrl))\n\t\t) {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\t\toriginalSend!.call(this, body)\n\t\t\treturn\n\t\t}\n\n\t\t// Only inject traceparent for allowed origins\n\t\tif (data.traceId) {\n\t\t\tconst spanId = generateSpanId()\n\t\t\tconst traceparent = createTraceparent(data.traceId, spanId, true)\n\t\t\tthis.setRequestHeader(\"traceparent\", traceparent)\n\t\t}\n\n\t\tdata.startTime = Date.now()\n\n\t\tconst emitResource = (status?: number) => {\n\t\t\tconst duration = Date.now() - data.startTime\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\tonResource(createResourceEvent(currentConfig!, data, duration, status))\n\t\t}\n\n\t\tthis.addEventListener(\"load\", () => emitResource(this.status))\n\t\tthis.addEventListener(\"error\", () => {\n\t\t\temitResource()\n\t\t\t// Emit error event with the failed URL for better debugging\n\t\t\tif (onXHRError) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\t\tconst config = currentConfig!\n\t\t\t\tconst errorEvent: ErrorEvent = {\n\t\t\t\t\t...createBaseEvent(\"error\", config.sessionId, config.userId),\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmessage: `XHR request failed: ${data.method} ${data.url}`,\n\t\t\t\t\t\tfailedUrl: data.url,\n\t\t\t\t\t\ttraceId: data.traceId,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tonXHRError(errorEvent)\n\t\t\t}\n\t\t})\n\t\tthis.addEventListener(\"timeout\", () => {\n\t\t\temitResource()\n\t\t\tif (onXHRError) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: config set at function entry\n\t\t\t\tconst config = currentConfig!\n\t\t\t\tconst errorEvent: ErrorEvent = {\n\t\t\t\t\t...createBaseEvent(\"error\", config.sessionId, config.userId),\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmessage: `XHR request timed out: ${data.method} ${data.url}`,\n\t\t\t\t\t\tfailedUrl: data.url,\n\t\t\t\t\t\ttraceId: data.traceId,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tonXHRError(errorEvent)\n\t\t\t}\n\t\t})\n\t\tthis.addEventListener(\"abort\", () => emitResource())\n\n\t\t// biome-ignore lint/style/noNonNullAssertion: checked at function entry\n\t\toriginalSend!.call(this, body)\n\t}\n}\n\nexport function updateXHRConfig(userId?: string): void {\n\tif (currentConfig) {\n\t\tcurrentConfig.userId = userId\n\t}\n}\n\nexport function updateXHRSessionId(sessionId: string): void {\n\tif (currentConfig) {\n\t\tcurrentConfig.sessionId = sessionId\n\t}\n}\n\nexport function restoreXHR(): void {\n\tif (originalOpen) {\n\t\tXMLHttpRequest.prototype.open = originalOpen\n\t\toriginalOpen = null\n\t}\n\tif (originalSend) {\n\t\tXMLHttpRequest.prototype.send = originalSend\n\t\toriginalSend = null\n\t}\n\tcurrentConfig = null\n\tonXHRError = null\n}\n","const SESSION_KEY = \"vident_session\"\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000 // 30 min inactivity timeout\nconst SESSION_MAX_DURATION_MS = 4 * 60 * 60 * 1000 // 4 hour max duration\n\ntype SessionData = {\n\tid: string\n\tstartTime: number\n\tlastActivity: number\n}\n\nexport type StorageMode = \"cookie\" | \"sessionStorage\"\n\nlet storageMode: StorageMode = \"cookie\"\n\nexport function setStorageMode(mode: StorageMode): void {\n\tstorageMode = mode\n}\n\nfunction generateSessionId(): string {\n\tconst bytes = new Uint8Array(16)\n\tcrypto.getRandomValues(bytes)\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\")\n}\n\n// Cookie operations\nfunction parseCookieValue(name: string): string | null {\n\tconst cookies = document.cookie.split(\"; \")\n\tfor (const cookie of cookies) {\n\t\tconst [key, ...rest] = cookie.split(\"=\")\n\t\tif (key === name) {\n\t\t\tconst value = rest.join(\"=\")\n\t\t\treturn value ? decodeURIComponent(value) : null\n\t\t}\n\t}\n\treturn null\n}\n\nfunction getCookie(name: string): string | null {\n\ttry {\n\t\treturn parseCookieValue(name)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction setCookie(name: string, value: string): void {\n\ttry {\n\t\t// Session cookie (no max-age) - cleared when browser closes\n\t\t// SameSite=Lax allows cookie to be sent on OAuth redirects back to our site\n\t\tdocument.cookie = `${name}=${encodeURIComponent(value)}; path=/; SameSite=Lax`\n\t} catch {\n\t\t// Cookies may be unavailable\n\t}\n}\n\nfunction deleteCookie(name: string): void {\n\ttry {\n\t\tdocument.cookie = `${name}=; path=/; max-age=0`\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\n// localStorage fallback for environments where cookies are restricted\nfunction getLocalStorage(key: string): string | null {\n\ttry {\n\t\treturn localStorage.getItem(key)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction setLocalStorage(key: string, value: string): void {\n\ttry {\n\t\tlocalStorage.setItem(key, value)\n\t} catch {\n\t\t// localStorage may be unavailable\n\t}\n}\n\nfunction deleteLocalStorage(key: string): void {\n\ttry {\n\t\tlocalStorage.removeItem(key)\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\n// sessionStorage operations\nfunction getSessionStorage(key: string): string | null {\n\ttry {\n\t\treturn sessionStorage.getItem(key)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction setSessionStorage(key: string, value: string): void {\n\ttry {\n\t\tsessionStorage.setItem(key, value)\n\t} catch {\n\t\t// sessionStorage may be unavailable\n\t}\n}\n\nfunction deleteSessionStorage(key: string): void {\n\ttry {\n\t\tsessionStorage.removeItem(key)\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\nfunction parseSessionData(value: string | null): SessionData | null {\n\tif (!value) return null\n\ttry {\n\t\treturn JSON.parse(value) as SessionData\n\t} catch {\n\t\treturn null\n\t}\n}\n\n// Storage abstraction based on mode\nfunction getStoredSession(): SessionData | null {\n\tif (storageMode === \"sessionStorage\") {\n\t\treturn parseSessionData(getSessionStorage(SESSION_KEY))\n\t}\n\n\t// Cookie mode: try cookie first, fallback to localStorage\n\tconst cookieData = parseSessionData(getCookie(SESSION_KEY))\n\tif (cookieData) return cookieData\n\n\treturn parseSessionData(getLocalStorage(SESSION_KEY))\n}\n\nfunction storeSession(data: SessionData): void {\n\tconst value = JSON.stringify(data)\n\n\tif (storageMode === \"sessionStorage\") {\n\t\tsetSessionStorage(SESSION_KEY, value)\n\t\treturn\n\t}\n\n\t// Cookie mode: store in both cookie and localStorage (fallback)\n\tsetCookie(SESSION_KEY, value)\n\tsetLocalStorage(SESSION_KEY, value)\n}\n\nfunction clearSession(): void {\n\tif (storageMode === \"sessionStorage\") {\n\t\tdeleteSessionStorage(SESSION_KEY)\n\t\treturn\n\t}\n\n\tdeleteCookie(SESSION_KEY)\n\tdeleteLocalStorage(SESSION_KEY)\n}\n\nfunction isSessionValid(session: SessionData): boolean {\n\tconst now = Date.now()\n\tconst inactivityValid = now - session.lastActivity < SESSION_TIMEOUT_MS\n\tconst durationValid = now - session.startTime < SESSION_MAX_DURATION_MS\n\treturn inactivityValid && durationValid\n}\n\nexport type SessionInfo = {\n\tsessionId: string\n\tisNew: boolean\n}\n\nexport function getOrCreateSession(): SessionInfo {\n\tconst existing = getStoredSession()\n\n\tif (existing && isSessionValid(existing)) {\n\t\treturn { sessionId: existing.id, isNew: false }\n\t}\n\n\tconst now = Date.now()\n\tconst newSession: SessionData = {\n\t\tid: generateSessionId(),\n\t\tstartTime: now,\n\t\tlastActivity: now,\n\t}\n\tstoreSession(newSession)\n\treturn { sessionId: newSession.id, isNew: true }\n}\n\nexport function refreshSession(): void {\n\tconst existing = getStoredSession()\n\tif (existing && isSessionValid(existing)) {\n\t\texisting.lastActivity = Date.now()\n\t\tstoreSession(existing)\n\t}\n}\n\nexport function endSession(): void {\n\tclearSession()\n}\n\nexport function getSessionId(): string | null {\n\tconst existing = getStoredSession()\n\treturn existing && isSessionValid(existing) ? existing.id : null\n}\n","import type { RumEvent } from \"./events.js\"\n\nexport type TransportConfig = {\n\tapiKey: string\n\tbaseUrl: string\n\tappName?: string\n\trelease?: string\n\tflushInterval?: number\n\tmaxBatchSize?: number\n}\n\nconst DEFAULT_FLUSH_INTERVAL = 5000\nconst DEFAULT_MAX_BATCH_SIZE = 10\n\nexport function createTransport(config: TransportConfig) {\n\tconst queue: RumEvent[] = []\n\tlet flushTimer: ReturnType<typeof setTimeout> | null = null\n\tconst flushInterval = config.flushInterval ?? DEFAULT_FLUSH_INTERVAL\n\tconst maxBatchSize = config.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE\n\n\tfunction scheduleFlush(): void {\n\t\tif (flushTimer) return\n\t\tflushTimer = setTimeout(() => {\n\t\t\tflushTimer = null\n\t\t\tflush()\n\t\t}, flushInterval)\n\t}\n\n\tasync function flush(): Promise<void> {\n\t\tif (queue.length === 0) return\n\n\t\tconst batch = queue.splice(0, maxBatchSize)\n\t\tconst controller = new AbortController()\n\t\tconst timeout = setTimeout(() => controller.abort(), 10_000)\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${config.baseUrl}/v1/ingest/rum`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"x-api-key\": config.apiKey,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tappName: config.appName,\n\t\t\t\t\trelease: config.release,\n\t\t\t\t\tevents: batch,\n\t\t\t\t}),\n\t\t\t\tsignal: controller.signal,\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.warn(\"[Vident RUM] Failed to send events:\", response.status)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[Vident RUM] Failed to send events:\", error)\n\t\t} finally {\n\t\t\tclearTimeout(timeout)\n\t\t}\n\n\t\tif (queue.length > 0) {\n\t\t\tscheduleFlush()\n\t\t}\n\t}\n\n\tfunction flushBeacon(): void {\n\t\tif (queue.length === 0) return\n\n\t\tconst batch = queue.splice(0)\n\t\tconst body = JSON.stringify({\n\t\t\tappName: config.appName,\n\t\t\trelease: config.release,\n\t\t\tevents: batch,\n\t\t})\n\n\t\t// Use fetch with keepalive for better reliability during page unload\n\t\t// Falls back to sendBeacon if fetch fails\n\t\ttry {\n\t\t\tfetch(`${config.baseUrl}/v1/ingest/rum`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"x-api-key\": config.apiKey,\n\t\t\t\t},\n\t\t\t\tbody,\n\t\t\t\tkeepalive: true,\n\t\t\t}).catch(() => {\n\t\t\t\t// Silently ignore - page is likely unloading\n\t\t\t})\n\t\t} catch {\n\t\t\t// Fallback to sendBeacon\n\t\t\tconst blob = new Blob([body], { type: \"application/json\" })\n\t\t\tnavigator.sendBeacon(\n\t\t\t\t`${config.baseUrl}/v1/ingest/rum?key=${config.apiKey}`,\n\t\t\t\tblob,\n\t\t\t)\n\t\t}\n\t}\n\n\tfunction enqueue(event: RumEvent): void {\n\t\tqueue.push(event)\n\n\t\tif (queue.length >= maxBatchSize) {\n\t\t\tflush()\n\t\t} else {\n\t\t\tscheduleFlush()\n\t\t}\n\t}\n\n\tfunction setupUnloadHandler(): void {\n\t\twindow.addEventListener(\"visibilitychange\", () => {\n\t\t\tif (document.visibilityState === \"hidden\") {\n\t\t\t\tflushBeacon()\n\t\t\t}\n\t\t})\n\n\t\twindow.addEventListener(\"pagehide\", () => {\n\t\t\tflushBeacon()\n\t\t})\n\t}\n\n\tsetupUnloadHandler()\n\n\treturn {\n\t\tenqueue,\n\t\tflush,\n\t\tflushBeacon,\n\t}\n}\n\nexport type Transport = ReturnType<typeof createTransport>\n","var e,n,t,r,i,o=-1,a=function(e){addEventListener(\"pageshow\",(function(n){n.persisted&&(o=n.timeStamp,e(n))}),!0)},c=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),r=\"navigate\";o>=0?r=\"back-forward-cache\":t&&(document.prerendering||u()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":t.type&&(r=t.type.replace(/_/g,\"-\")));return{name:e,value:void 0===n?-1:n,rating:\"good\",delta:0,entries:[],id:\"v4-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:r}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var r=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries())}))}));return r.observe(Object.assign({type:e,buffered:!0},t||{})),r}}catch(e){}},d=function(e,n,t,r){var i,o;return function(a){n.value>=0&&(a||r)&&((o=n.value-(i||0))||void 0===i)&&(i=n.value,n.delta=o,n.rating=function(e,n){return e>n[1]?\"poor\":e>n[0]?\"needs-improvement\":\"good\"}(n.value,t),e(n))}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},p=function(e){document.addEventListener(\"visibilitychange\",(function(){\"hidden\"===document.visibilityState&&e()}))},v=function(e){var n=!1;return function(){n||(e(),n=!0)}},m=-1,h=function(){return\"hidden\"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){\"hidden\"===document.visibilityState&&m>-1&&(m=\"visibilitychange\"===e.type?e.timeStamp:0,T())},y=function(){addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0)},T=function(){removeEventListener(\"visibilitychange\",g,!0),removeEventListener(\"prerenderingchange\",g,!0)},E=function(){return m<0&&(m=h(),y(),a((function(){setTimeout((function(){m=h(),y()}),0)}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener(\"prerenderingchange\",(function(){return e()}),!0):e()},b=[1800,3e3],S=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"FCP\"),o=s(\"paint\",(function(e){e.forEach((function(e){\"first-contentful-paint\"===e.name&&(o.disconnect(),e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries.push(e),t(!0)))}))}));o&&(t=d(e,i,b,n.reportAllChanges),a((function(r){i=f(\"FCP\"),t=d(e,i,b,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,t(!0)}))})))}))},L=[.1,.25],w=function(e,n){n=n||{},S(v((function(){var t,r=f(\"CLS\",0),i=0,o=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=o[0],t=o[o.length-1];i&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(i+=e.value,o.push(e)):(i=e.value,o=[e])}})),i>r.value&&(r.value=i,r.entries=o,t())},u=s(\"layout-shift\",c);u&&(t=d(e,r,L,n.reportAllChanges),p((function(){c(u.takeRecords()),t(!0)})),a((function(){i=0,r=f(\"CLS\",0),t=d(e,r,L,n.reportAllChanges),l((function(){return t()}))})),setTimeout(t,0))})))},A=0,I=1/0,P=0,M=function(e){e.forEach((function(e){e.interactionId&&(I=Math.min(I,e.interactionId),P=Math.max(P,e.interactionId),A=P?(P-I)/7+1:0)}))},k=function(){return e?A:performance.interactionCount||0},F=function(){\"interactionCount\"in performance||e||(e=s(\"event\",M,{type:\"event\",buffered:!0,durationThreshold:0}))},D=[],x=new Map,R=0,B=function(){var e=Math.min(D.length-1,Math.floor((k()-R)/50));return D[e]},H=[],q=function(e){if(H.forEach((function(n){return n(e)})),e.interactionId||\"first-input\"===e.entryType){var n=D[D.length-1],t=x.get(e.interactionId);if(t||D.length<10||e.duration>n.latency){if(t)e.duration>t.latency?(t.entries=[e],t.latency=e.duration):e.duration===t.latency&&e.startTime===t.entries[0].startTime&&t.entries.push(e);else{var r={id:e.interactionId,latency:e.duration,entries:[e]};x.set(r.id,r),D.push(r)}D.sort((function(e,n){return n.latency-e.latency})),D.length>10&&D.splice(10).forEach((function(e){return x.delete(e.id)}))}}},O=function(e){var n=self.requestIdleCallback||self.setTimeout,t=-1;return e=v(e),\"hidden\"===document.visibilityState?e():(t=n(e),p(e)),t},N=[200,500],j=function(e,n){\"PerformanceEventTiming\"in self&&\"interactionId\"in PerformanceEventTiming.prototype&&(n=n||{},C((function(){var t;F();var r,i=f(\"INP\"),o=function(e){O((function(){e.forEach(q);var n=B();n&&n.latency!==i.value&&(i.value=n.latency,i.entries=n.entries,r())}))},c=s(\"event\",o,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});r=d(e,i,N,n.reportAllChanges),c&&(c.observe({type:\"first-input\",buffered:!0}),p((function(){o(c.takeRecords()),r(!0)})),a((function(){R=k(),D.length=0,x.clear(),i=f(\"INP\"),r=d(e,i,N,n.reportAllChanges)})))})))},_=[2500,4e3],z={},G=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"LCP\"),o=function(e){n.reportAllChanges||(e=e.slice(-1)),e.forEach((function(e){e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries=[e],t())}))},c=s(\"largest-contentful-paint\",o);if(c){t=d(e,i,_,n.reportAllChanges);var m=v((function(){z[i.id]||(o(c.takeRecords()),c.disconnect(),z[i.id]=!0,t(!0))}));[\"keydown\",\"click\"].forEach((function(e){addEventListener(e,(function(){return O(m)}),{once:!0,capture:!0})})),p(m),a((function(r){i=f(\"LCP\"),t=d(e,i,_,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,z[i.id]=!0,t(!0)}))}))}}))},J=[800,1800],K=function e(n){document.prerendering?C((function(){return e(n)})):\"complete\"!==document.readyState?addEventListener(\"load\",(function(){return e(n)}),!0):setTimeout(n,0)},Q=function(e,n){n=n||{};var t=f(\"TTFB\"),r=d(e,t,J,n.reportAllChanges);K((function(){var i=c();i&&(t.value=Math.max(i.responseStart-u(),0),t.entries=[i],r(!0),a((function(){t=f(\"TTFB\",0),(r=d(e,t,J,n.reportAllChanges))(!0)})))}))},U={passive:!0,capture:!0},V=new Date,W=function(e,i){n||(n=i,t=e,r=new Date,Z(removeEventListener),X())},X=function(){if(t>=0&&t<r-V){var e={entryType:\"first-input\",name:n.type,target:n.target,cancelable:n.cancelable,startTime:n.timeStamp,processingStart:n.timeStamp+t};i.forEach((function(n){n(e)})),i=[]}},Y=function(e){if(e.cancelable){var n=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,n){var t=function(){W(e,n),i()},r=function(){i()},i=function(){removeEventListener(\"pointerup\",t,U),removeEventListener(\"pointercancel\",r,U)};addEventListener(\"pointerup\",t,U),addEventListener(\"pointercancel\",r,U)}(n,e):W(n,e)}},Z=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(n){return e(n,Y,U)}))},$=[100,300],ee=function(e,r){r=r||{},C((function(){var o,c=E(),u=f(\"FID\"),l=function(e){e.startTime<c.firstHiddenTime&&(u.value=e.processingStart-e.startTime,u.entries.push(e),o(!0))},m=function(e){e.forEach(l)},h=s(\"first-input\",m);o=d(e,u,$,r.reportAllChanges),h&&(p(v((function(){m(h.takeRecords()),h.disconnect()}))),a((function(){var a;u=f(\"FID\"),o=d(e,u,$,r.reportAllChanges),i=[],t=-1,n=null,Z(addEventListener),a=l,i.push(a),X()})))}))};export{L as CLSThresholds,b as FCPThresholds,$ as FIDThresholds,N as INPThresholds,_ as LCPThresholds,J as TTFBThresholds,w as onCLS,S as onFCP,ee as onFID,j as onINP,G as onLCP,Q as onTTFB};\n","import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from \"web-vitals\"\nimport type { VitalsEvent } from \"./events.js\"\nimport { createBaseEvent } from \"./events.js\"\n\nexport type VitalsData = {\n\tlcp?: number\n\tfid?: number\n\tcls?: number\n\tinp?: number\n\tttfb?: number\n\tfcp?: number\n}\n\nexport type VitalsCallback = (event: VitalsEvent) => void\n\nexport function setupVitalsTracking(\n\tsessionId: string,\n\tuserId: string | undefined,\n\tonVitals: VitalsCallback,\n\tonFlush?: () => void,\n): void {\n\tconst vitalsData: VitalsData = {}\n\tlet sent = false\n\n\t// Send all accumulated vitals once\n\tfunction sendVitals(): void {\n\t\tif (sent) return\n\t\tif (Object.keys(vitalsData).length === 0) return\n\n\t\tsent = true\n\t\tconst event: VitalsEvent = {\n\t\t\t...createBaseEvent(\"vitals\", sessionId, userId),\n\t\t\ttype: \"vitals\",\n\t\t\tdata: { ...vitalsData },\n\t\t}\n\t\tonVitals(event)\n\t\tonFlush?.()\n\t}\n\n\t// Register web-vitals callbacks FIRST - they add internal visibilitychange\n\t// listeners that will fire before ours and populate vitalsData\n\tonLCP((metric) => {\n\t\tvitalsData.lcp = metric.value\n\t})\n\tonFID((metric) => {\n\t\tvitalsData.fid = metric.value\n\t})\n\tonCLS((metric) => {\n\t\tvitalsData.cls = metric.value\n\t})\n\tonINP((metric) => {\n\t\tvitalsData.inp = metric.value\n\t})\n\tonTTFB((metric) => {\n\t\tvitalsData.ttfb = metric.value\n\t})\n\tonFCP((metric) => {\n\t\tvitalsData.fcp = metric.value\n\t})\n\n\t// Register our listener AFTER web-vitals - fires after their callbacks populate data\n\tdocument.addEventListener(\"visibilitychange\", () => {\n\t\tif (document.visibilityState === \"hidden\") {\n\t\t\tsendVitals()\n\t\t}\n\t})\n}\n","import { captureError, setupErrorTracking } from \"./errors.js\"\nimport type {\n\tClickEvent,\n\tCustomEvent,\n\tErrorEvent,\n\tPageViewEvent,\n\tRageClickEvent,\n\tResourceEvent,\n\tRumEvent,\n} from \"./events.js\"\nimport { createBaseEvent } from \"./events.js\"\nimport {\n\tinstrumentFetch,\n\tupdateFetchConfig,\n\tupdateFetchSessionId,\n} from \"./instrumentation/fetch.js\"\nimport {\n\tinstrumentXHR,\n\tupdateXHRConfig,\n\tupdateXHRSessionId,\n} from \"./instrumentation/xhr.js\"\nimport type { PrivacyMode, ReplayConfig, ReplayRecorder } from \"./replay.js\"\nimport {\n\ttype StorageMode,\n\tgetOrCreateSession,\n\tgetSessionId,\n\trefreshSession,\n\tsetStorageMode,\n} from \"./session.js\"\nimport { createTransport } from \"./transport.js\"\nimport { setupVitalsTracking } from \"./vitals.js\"\n\nexport type TracingConfig = {\n\t/** Enable distributed tracing (default: true) */\n\tenabled?: boolean\n\t/** Origins to propagate trace context to (default: same-origin only) */\n\tpropagateToOrigins?: (string | RegExp)[]\n\t/** Trace fetch requests (default: true) */\n\ttraceFetch?: boolean\n\t/** Trace XMLHttpRequest (default: true) */\n\ttraceXHR?: boolean\n}\n\nexport type BrowserConfig = {\n\tapiKey: string\n\tappName?: string\n\tbaseUrl?: string\n\tsampleRate?: number\n\ttrackClicks?: boolean\n\ttrackPageViews?: boolean\n\ttrackVitals?: boolean\n\ttrackErrors?: boolean\n\t/** Track HTTP resources (fetch/XHR) with timing (default: true) */\n\ttrackResources?: boolean\n\t/** Distributed tracing configuration */\n\ttracing?: TracingConfig\n\t/**\n\t * Session storage mode (default: \"cookie\")\n\t * - \"cookie\": Uses cookies with localStorage fallback. Survives OAuth redirects.\n\t * Requires cookie consent in GDPR regions.\n\t * - \"sessionStorage\": Original behavior. Tab-isolated, cleared on tab close.\n\t * No cookie consent required.\n\t */\n\tsessionStorage?: StorageMode\n\t/** Release version tag for source map resolution (e.g., git SHA) */\n\trelease?: string\n\t/**\n\t * Privacy mode controls what user data is captured (default: \"strict\")\n\t *\n\t * Applies to session replay, click text capture, and heatmaps.\n\t *\n\t * - \"strict\": Masks all text and inputs. Click element text not captured. Recommended.\n\t * - \"balanced\": Masks inputs only. Text visible in replay and heatmap sidebar.\n\t * - \"permissive\": Records everything. Only use for internal tools with explicit consent.\n\t *\n\t * Fine-grained control via HTML attributes (all modes):\n\t * - `data-sw-block`: Completely hides element\n\t * - `data-sw-mask`: Masks text content with asterisks\n\t * - `data-sw-unmask`: Shows content even in strict mode\n\t */\n\tprivacyMode?: PrivacyMode\n\t/** Session replay configuration */\n\treplay?: ReplayConfig\n}\n\nconst DEFAULT_BASE_URL = \"https://api.vident.dev\"\n\nfunction getClickTarget(element: Element): string {\n\tif (element.id) return `#${element.id}`\n\n\tconst tag = element.tagName.toLowerCase()\n\tconst classes = Array.from(element.classList).slice(0, 3).join(\".\")\n\tif (classes) return `${tag}.${classes}`\n\n\treturn tag\n}\n\nfunction getCssPath(element: Element): string {\n\tconst parts: string[] = []\n\tlet current: Element | null = element\n\tconst MAX_DEPTH = 10\n\n\tfor (\n\t\tlet depth = 0;\n\t\tcurrent && current !== document.documentElement && depth < MAX_DEPTH;\n\t\tdepth++\n\t) {\n\t\tif (current.id) {\n\t\t\tparts.unshift(`#${current.id}`)\n\t\t\tbreak\n\t\t}\n\n\t\tconst tag = current.tagName.toLowerCase()\n\t\tconst parentEl: Element | null = current.parentElement\n\t\tif (!parentEl) {\n\t\t\tparts.unshift(tag)\n\t\t\tbreak\n\t\t}\n\n\t\tconst siblings = Array.from(parentEl.children)\n\t\tconst currentTag = current.tagName\n\t\tconst sameTags = siblings.filter((s: Element) => s.tagName === currentTag)\n\t\tif (sameTags.length > 1) {\n\t\t\tconst index = siblings.indexOf(current) + 1\n\t\t\tparts.unshift(`${tag}:nth-child(${index})`)\n\t\t} else {\n\t\t\tparts.unshift(tag)\n\t\t}\n\n\t\tcurrent = parentEl\n\t}\n\n\treturn parts.join(\" > \")\n}\n\nfunction getClickText(\n\telement: Element,\n\tprivacyMode: PrivacyMode,\n): string | undefined {\n\t// Strict: never capture text (consistent with replay masking all text)\n\tif (privacyMode === \"strict\") return undefined\n\n\t// Respect data-sw-block / data-sw-mask attributes\n\tif (element.closest(\"[data-sw-block], .rr-block, [data-sw-mask], .rr-mask\")) {\n\t\treturn undefined\n\t}\n\n\tconst text = element.textContent?.trim().slice(0, 50)\n\treturn text || undefined\n}\n\nfunction detectRelease(): string | undefined {\n\ttry {\n\t\t// Next.js (injected by withVident)\n\t\tif (\n\t\t\ttypeof process !== \"undefined\" &&\n\t\t\tprocess.env?.NEXT_PUBLIC_VIDENT_RELEASE\n\t\t) {\n\t\t\treturn process.env.NEXT_PUBLIC_VIDENT_RELEASE\n\t\t}\n\t} catch {\n\t\t// process not available in browser\n\t}\n\ttry {\n\t\t// Vite / TanStack / Remix / SvelteKit (injected by videntPlugin)\n\t\t// @ts-expect-error import.meta.env may not exist\n\t\tif (typeof import.meta !== \"undefined\" && import.meta.env?.VIDENT_RELEASE) {\n\t\t\t// @ts-expect-error import.meta.env may not exist\n\t\t\treturn import.meta.env.VIDENT_RELEASE as string\n\t\t}\n\t} catch {\n\t\t// import.meta not available\n\t}\n\treturn undefined\n}\n\nexport type VidentBrowser = {\n\ttrackEvent: (name: string, properties?: Record<string, unknown>) => void\n\ttrackPageView: (url?: string) => void\n\ttrackError: (\n\t\terror: Error,\n\t\toptions?: { requestId?: string; traceId?: string },\n\t) => void\n\tsetUser: (id: string, traits?: Record<string, unknown>) => void\n\tgetSessionId: () => string | null\n\tforceReplayUpload: () => void\n\tstopReplay: () => void\n\tisReplayUploading: () => boolean\n}\n\nexport function createVidentBrowser(config: BrowserConfig): VidentBrowser {\n\t// Apply sampling\n\tconst sampleRate = config.sampleRate ?? 1\n\tif (Math.random() > sampleRate) {\n\t\treturn {\n\t\t\ttrackEvent: () => {},\n\t\t\ttrackPageView: () => {},\n\t\t\ttrackError: () => {},\n\t\t\tsetUser: () => {},\n\t\t\tgetSessionId: () => null,\n\t\t\tforceReplayUpload: () => {},\n\t\t\tstopReplay: () => {},\n\t\t\tisReplayUploading: () => false,\n\t\t}\n\t}\n\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n\tsetStorageMode(config.sessionStorage ?? \"cookie\")\n\tlet { sessionId } = getOrCreateSession()\n\tlet userId: string | undefined\n\n\tconst release = config.release ?? detectRelease()\n\n\tconst transport = createTransport({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl,\n\t\tappName: config.appName,\n\t\trelease,\n\t})\n\n\t// Initialize replay recorder lazily — dynamic import keeps rrweb/fflate out of core bundle\n\tlet replayRecorder: ReplayRecorder | null = null\n\tlet hasTriggeredClickSnapshot = false\n\n\tconst replayConfig = config.replay\n\tconst privacyMode: PrivacyMode = config.privacyMode ?? \"strict\"\n\n\t// Stop replay if session expired (max duration) but no user interaction to trigger rotation\n\tlet idleCheckTimer: ReturnType<typeof setInterval> | null = null\n\tfunction startIdleCheck(): void {\n\t\tif (idleCheckTimer) return\n\t\tidleCheckTimer = setInterval(() => {\n\t\t\tif (replayRecorder?.isRecording() && getSessionId() === null) {\n\t\t\t\treplayRecorder.stop()\n\t\t\t\treplayRecorder = null\n\t\t\t}\n\t\t}, 60_000)\n\t}\n\n\tif (replayConfig?.enabled) {\n\t\timport(\"./replay.js\").then(({ createReplayRecorder }) => {\n\t\t\treplayRecorder = createReplayRecorder(replayConfig, privacyMode, {\n\t\t\t\tapiKey: config.apiKey,\n\t\t\t\tbaseUrl,\n\t\t\t\tsessionId,\n\t\t\t})\n\t\t\tscheduleHeatmapSnapshot()\n\t\t\tstartIdleCheck()\n\t\t})\n\t}\n\n\tfunction scheduleHeatmapSnapshot(): void {\n\t\tfunction capture(): void {\n\t\t\tsetTimeout(() => {\n\t\t\t\treplayRecorder?.captureHeatmapSnapshot(window.location.href)\n\t\t\t}, 1000)\n\t\t}\n\n\t\tif (document.readyState === \"complete\") {\n\t\t\tif (typeof requestIdleCallback === \"function\") {\n\t\t\t\trequestIdleCallback(capture, { timeout: 2000 })\n\t\t\t} else {\n\t\t\t\tsetTimeout(capture, 2000)\n\t\t\t}\n\t\t} else {\n\t\t\twindow.addEventListener(\n\t\t\t\t\"load\",\n\t\t\t\t() => {\n\t\t\t\t\tif (typeof requestIdleCallback === \"function\") {\n\t\t\t\t\t\trequestIdleCallback(capture, { timeout: 2000 })\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetTimeout(capture, 2000)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t)\n\t\t}\n\t}\n\n\tfunction rotateSession(newId: string): void {\n\t\tsessionId = newId\n\t\tupdateFetchSessionId(newId)\n\t\tupdateXHRSessionId(newId)\n\t\thasTriggeredClickSnapshot = false\n\n\t\treplayRecorder?.stop()\n\t\treplayRecorder = null\n\n\t\tif (replayConfig?.enabled) {\n\t\t\timport(\"./replay.js\").then(({ createReplayRecorder }) => {\n\t\t\t\treplayRecorder = createReplayRecorder(replayConfig, privacyMode, {\n\t\t\t\t\tapiKey: config.apiKey,\n\t\t\t\t\tbaseUrl,\n\t\t\t\t\tsessionId: newId,\n\t\t\t\t})\n\t\t\t\tscheduleHeatmapSnapshot()\n\t\t\t\tstartIdleCheck()\n\t\t\t})\n\t\t}\n\n\t\ttrackPageView()\n\t}\n\n\tfunction enqueueEvent(event: RumEvent): void {\n\t\tconst session = getOrCreateSession()\n\t\tif (session.sessionId !== sessionId) {\n\t\t\trotateSession(session.sessionId)\n\t\t}\n\t\trefreshSession()\n\t\tevent.sessionId = sessionId\n\t\ttransport.enqueue(event)\n\t}\n\n\tfunction trackPageView(url?: string): void {\n\t\tconst event: PageViewEvent = {\n\t\t\t...createBaseEvent(\"page_view\", sessionId, userId),\n\t\t\ttype: \"page_view\",\n\t\t\turl: url ?? window.location.href,\n\t\t\tdata: {\n\t\t\t\treferrer: document.referrer || undefined,\n\t\t\t\ttitle: document.title,\n\t\t\t},\n\t\t}\n\t\tenqueueEvent(event)\n\t}\n\n\tfunction trackEvent(\n\t\tname: string,\n\t\tproperties?: Record<string, unknown>,\n\t): void {\n\t\tconst event: CustomEvent = {\n\t\t\t...createBaseEvent(\"custom\", sessionId, userId),\n\t\t\ttype: \"custom\",\n\t\t\tdata: {\n\t\t\t\tname,\n\t\t\t\tproperties,\n\t\t\t},\n\t\t}\n\t\tenqueueEvent(event)\n\t}\n\n\tfunction trackError(\n\t\terror: Error,\n\t\toptions?: { requestId?: string; traceId?: string },\n\t): void {\n\t\tconst event = captureError(error, sessionId, userId, options)\n\t\tenqueueEvent(event)\n\t\t// Mark replay for error correlation\n\t\treplayRecorder?.markError()\n\t}\n\n\tfunction setUser(id: string, traits?: Record<string, unknown>): void {\n\t\tuserId = id\n\t\t// Update instrumentation configs with new userId\n\t\tupdateFetchConfig(userId)\n\t\tupdateXHRConfig(userId)\n\t\t// Optionally track user identification as custom event\n\t\tif (traits) {\n\t\t\ttrackEvent(\"user_identified\", { userId: id, ...traits })\n\t\t}\n\t}\n\n\tfunction getSessionIdValue(): string {\n\t\treturn sessionId\n\t}\n\n\t// Auto-tracking setup\n\tif (config.trackPageViews !== false) {\n\t\t// Track initial page view\n\t\ttrackPageView()\n\n\t\t// Track SPA navigation\n\t\tconst originalPushState = history.pushState.bind(history)\n\t\tconst originalReplaceState = history.replaceState.bind(history)\n\n\t\t// Delay snapshot after SPA nav so framework has time to render\n\t\tfunction scheduleSpaSnapshot(): void {\n\t\t\tsetTimeout(() => {\n\t\t\t\treplayRecorder?.snapshot()\n\t\t\t}, 2000)\n\t\t}\n\n\t\tfunction onSpaNav(): void {\n\t\t\ttrackPageView()\n\t\t\tscheduleSpaSnapshot()\n\t\t\t// Reset click snapshot guard for new URL\n\t\t\thasTriggeredClickSnapshot = false\n\t\t\treplayRecorder?.resetHeatmapSnapshot()\n\t\t\t// Schedule heatmap snapshot for new page\n\t\t\tif (replayRecorder) scheduleHeatmapSnapshot()\n\t\t}\n\n\t\thistory.pushState = (...args) => {\n\t\t\toriginalPushState(...args)\n\t\t\tonSpaNav()\n\t\t}\n\n\t\thistory.replaceState = (...args) => {\n\t\t\toriginalReplaceState(...args)\n\t\t\tonSpaNav()\n\t\t}\n\n\t\twindow.addEventListener(\"popstate\", () => {\n\t\t\tonSpaNav()\n\t\t})\n\t}\n\n\tif (config.trackClicks !== false) {\n\t\tconst clickPrivacy: PrivacyMode = config.privacyMode ?? \"strict\"\n\t\tconst recentClicks: Array<{ target: string; timestamp: number }> = []\n\t\tconst RAGE_CLICK_THRESHOLD = 3\n\t\tconst RAGE_CLICK_WINDOW_MS = 1000\n\n\t\tdocument.addEventListener(\n\t\t\t\"click\",\n\t\t\t(event) => {\n\t\t\t\tconst target = event.target as Element\n\t\t\t\tif (!target) return\n\n\t\t\t\t// Only track interactive elements\n\t\t\t\tconst interactiveElements = [\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"BUTTON\",\n\t\t\t\t\t\"INPUT\",\n\t\t\t\t\t\"SELECT\",\n\t\t\t\t\t\"TEXTAREA\",\n\t\t\t\t]\n\t\t\t\tconst isInteractive =\n\t\t\t\t\tinteractiveElements.includes(target.tagName) ||\n\t\t\t\t\ttarget.closest(\"a, button\") !== null ||\n\t\t\t\t\ttarget.getAttribute(\"role\") === \"button\"\n\n\t\t\t\tif (!isInteractive) return\n\n\t\t\t\tconst targetSelector = getClickTarget(target)\n\t\t\t\tconst targetPath = getCssPath(target)\n\n\t\t\t\tconst clickEvent: ClickEvent = {\n\t\t\t\t\t...createBaseEvent(\"click\", sessionId, userId),\n\t\t\t\t\ttype: \"click\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\ttext: getClickText(target, clickPrivacy),\n\t\t\t\t\t\tx: event.pageX,\n\t\t\t\t\t\ty: event.pageY,\n\t\t\t\t\t\tviewportWidth: window.innerWidth,\n\t\t\t\t\t\tviewportHeight: window.innerHeight,\n\t\t\t\t\t\tscrollY: window.scrollY,\n\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tenqueueEvent(clickEvent)\n\n\t\t\t\t// Capture heatmap snapshot on first click (page guaranteed rendered)\n\t\t\t\tif (!hasTriggeredClickSnapshot && replayRecorder) {\n\t\t\t\t\thasTriggeredClickSnapshot = true\n\t\t\t\t\treplayRecorder.captureHeatmapSnapshot(window.location.href)\n\t\t\t\t}\n\n\t\t\t\t// Rage click detection: 3+ clicks on same target within 1s\n\t\t\t\tconst now = Date.now()\n\t\t\t\trecentClicks.push({ target: targetSelector, timestamp: now })\n\n\t\t\t\t// Prune old clicks outside the window\n\t\t\t\twhile (\n\t\t\t\t\trecentClicks.length > 0 &&\n\t\t\t\t\t(recentClicks[0]?.timestamp ?? 0) < now - RAGE_CLICK_WINDOW_MS\n\t\t\t\t) {\n\t\t\t\t\trecentClicks.shift()\n\t\t\t\t}\n\n\t\t\t\tconst matchingClicks = recentClicks.filter(\n\t\t\t\t\t(c) => c.target === targetSelector,\n\t\t\t\t)\n\t\t\t\tif (matchingClicks.length >= RAGE_CLICK_THRESHOLD) {\n\t\t\t\t\tconst rageEvent: RageClickEvent = {\n\t\t\t\t\t\t...createBaseEvent(\"rage_click\", sessionId, userId),\n\t\t\t\t\t\ttype: \"rage_click\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\t\ttext: getClickText(target, clickPrivacy),\n\t\t\t\t\t\t\tx: event.pageX,\n\t\t\t\t\t\t\ty: event.pageY,\n\t\t\t\t\t\t\tviewportWidth: window.innerWidth,\n\t\t\t\t\t\t\tviewportHeight: window.innerHeight,\n\t\t\t\t\t\t\tclickCount: matchingClicks.length,\n\t\t\t\t\t\t\tscrollY: window.scrollY,\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t\tenqueueEvent(rageEvent)\n\t\t\t\t\t// Reset tracker to avoid repeat detections for the same burst\n\t\t\t\t\trecentClicks.length = 0\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ capture: true },\n\t\t)\n\t}\n\n\tif (config.trackVitals !== false) {\n\t\tsetupVitalsTracking(\n\t\t\tsessionId,\n\t\t\tuserId,\n\t\t\t(event) => {\n\t\t\t\tenqueueEvent(event)\n\t\t\t},\n\t\t\t() => {\n\t\t\t\ttransport.flushBeacon()\n\t\t\t},\n\t\t)\n\t}\n\n\tif (config.trackErrors !== false) {\n\t\tsetupErrorTracking(sessionId, userId, (event) => {\n\t\t\tenqueueEvent(event)\n\t\t\t// Mark replay for error correlation (auto-captured errors)\n\t\t\treplayRecorder?.markError()\n\t\t})\n\t}\n\n\t// Resource tracking: capture HTTP requests with timing and trace correlation\n\t// - trackResources: store resource events in RUM (default: true)\n\t// - tracing.enabled: inject traceparent headers for backend correlation (default: true)\n\t// If either is enabled, we instrument fetch/XHR\n\tconst shouldInstrument =\n\t\tconfig.trackResources !== false || config.tracing?.enabled !== false\n\tconst shouldStoreResources = config.trackResources !== false\n\n\tif (shouldInstrument) {\n\t\tconst ingestUrl = `${baseUrl}/v1/ingest`\n\t\tconst instrumentationConfig = {\n\t\t\tpropagateToOrigins: config.tracing?.propagateToOrigins,\n\t\t\tsessionId,\n\t\t\tuserId,\n\t\t\tingestUrl,\n\t\t}\n\n\t\tconst onResource = shouldStoreResources\n\t\t\t? (event: ResourceEvent) => enqueueEvent(event)\n\t\t\t: () => {} // traceparent injected but events not stored\n\n\t\t// Capture network errors with URL context (only if error tracking enabled)\n\t\tconst onNetworkError =\n\t\t\tconfig.trackErrors !== false\n\t\t\t\t? (event: ErrorEvent) => enqueueEvent(event)\n\t\t\t\t: undefined\n\n\t\tif (config.tracing?.traceFetch !== false) {\n\t\t\tinstrumentFetch(instrumentationConfig, onResource, onNetworkError)\n\t\t}\n\n\t\tif (config.tracing?.traceXHR !== false) {\n\t\t\tinstrumentXHR(instrumentationConfig, onResource, onNetworkError)\n\t\t}\n\t}\n\n\treturn {\n\t\ttrackEvent,\n\t\ttrackPageView,\n\t\ttrackError,\n\t\tsetUser,\n\t\tgetSessionId: getSessionIdValue,\n\t\tforceReplayUpload: () => {\n\t\t\treplayRecorder?.startUploading()\n\t\t},\n\t\tstopReplay: () => {\n\t\t\treplayRecorder?.stop()\n\t\t},\n\t\tisReplayUploading: () => replayRecorder?.isUploading() ?? false,\n\t}\n}\n"],"mappings":"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","names":["createBaseEvent","type","sessionId","userId","getStackTrace","error","setupErrorTracking","sessionId","userId","onError","event","errorEvent","createBaseEvent","message","stack","captureError","options","generateTraceId","bytes","b","generateSpanId","createTraceparent","traceId","spanId","sampled","getRootDomain","hostname","parts","shouldPropagate","url","propagateToOrigins","parsedUrl","currentRootDomain","targetRootDomain","pattern","originalFetch","currentConfig","onFetchError","createResourceEvent","config","url","method","traceId","startTime","duration","status","instrumentFetch","onResource","onError","input","init","shouldInjectTrace","shouldPropagate","modifiedInit","generateTraceId","spanId","generateSpanId","traceparent","createTraceparent","headers","response","error","errorEvent","createBaseEvent","updateFetchConfig","userId","updateFetchSessionId","sessionId","originalOpen","originalSend","currentConfig","onXHRError","createResourceEvent","config","data","duration","status","instrumentXHR","onResource","onError","method","url","async","username","password","urlString","shouldInjectTrace","shouldPropagate","generateTraceId","body","spanId","generateSpanId","traceparent","createTraceparent","emitResource","errorEvent","createBaseEvent","updateXHRConfig","userId","updateXHRSessionId","sessionId","SESSION_KEY","storageMode","setStorageMode","mode","generateSessionId","bytes","b","parseCookieValue","name","cookies","cookie","key","rest","value","getCookie","setCookie","deleteCookie","getLocalStorage","setLocalStorage","deleteLocalStorage","getSessionStorage","setSessionStorage","deleteSessionStorage","parseSessionData","getStoredSession","SESSION_KEY","cookieData","storeSession","data","clearSession","isSessionValid","session","now","inactivityValid","durationValid","getOrCreateSession","existing","newSession","refreshSession","endSession","getSessionId","createTransport","config","queue","flushTimer","flushInterval","maxBatchSize","scheduleFlush","flush","batch","controller","timeout","response","error","flushBeacon","body","blob","enqueue","event","setupUnloadHandler","e","n","t","r","i","o","a","c","u","f","s","d","l","p","v","m","h","g","T","y","E","C","b","S","L","w","A","I","P","M","k","F","D","x","R","B","H","q","O","N","j","_","z","G","J","K","Q","U","V","W","Z","X","Y","$","ee","setupVitalsTracking","sessionId","userId","onVitals","onFlush","vitalsData","sent","sendVitals","event","createBaseEvent","G","metric","ee","w","j","Q","S","DEFAULT_BASE_URL","getClickTarget","element","tag","classes","getCssPath","parts","current","MAX_DEPTH","depth","parentEl","siblings","currentTag","s","index","getClickText","privacyMode","detectRelease","createVidentBrowser","config","sampleRate","baseUrl","setStorageMode","sessionId","getOrCreateSession","userId","release","transport","createTransport","replayRecorder","hasTriggeredClickSnapshot","replayConfig","idleCheckTimer","startIdleCheck","getSessionId","createReplayRecorder","scheduleHeatmapSnapshot","capture","rotateSession","newId","updateFetchSessionId","updateXHRSessionId","trackPageView","enqueueEvent","event","session","refreshSession","url","createBaseEvent","trackEvent","name","properties","trackError","error","options","captureError","setUser","id","traits","updateFetchConfig","updateXHRConfig","getSessionIdValue","scheduleSpaSnapshot","onSpaNav","originalPushState","originalReplaceState","args","clickPrivacy","recentClicks","RAGE_CLICK_THRESHOLD","RAGE_CLICK_WINDOW_MS","target","targetSelector","targetPath","clickEvent","now","matchingClicks","c","rageEvent","setupVitalsTracking","setupErrorTracking","shouldInstrument","shouldStoreResources","ingestUrl","instrumentationConfig","onResource","onNetworkError","instrumentFetch","instrumentXHR"]}
|