@marlinjai/analytics-tracker 0.5.0 → 1.0.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
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a}from'./chunk-5XGN7UAV.js';var y="ap_session_id",f="ap_last_activity";function b(){let n=Date.now(),e=sessionStorage.getItem(y),t=Number(sessionStorage.getItem(f)||"0");if(e&&n-t<18e5)return sessionStorage.setItem(f,String(n)),{sessionId:e,isNew:false};let r=crypto.randomUUID();return sessionStorage.setItem(y,r),sessionStorage.setItem(f,String(n)),{sessionId:r,isNew:true}}function w(){sessionStorage.setItem(f,String(Date.now()));}var x=3,C=1e3,d=class{constructor(e,t,r,i=false){a(this,"queue",[]);a(this,"timer",null);a(this,"endpoint");a(this,"apiKey");a(this,"debug");this.endpoint=e,this.apiKey=t,this.debug=i,this.timer=setInterval(()=>this.flush(),r??5e3),typeof window<"u"&&(window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush(true);}),window.addEventListener("pagehide",()=>this.flush(true)));}add(e){this.queue.push(e),this.debug&&console.log("[analytics] queued:",e.type,e),this.queue.length>=50&&this.flush();}async flush(e=false){if(this.queue.length===0)return;let t=this.queue.splice(0,50),r=JSON.stringify(t);if(e&&typeof navigator<"u"&&navigator.sendBeacon){let i=new Blob([r],{type:"application/json"});if(navigator.sendBeacon(this.endpoint,i)){this.debug&&console.log("[analytics] beacon sent:",t.length,"events");return}}await this.fetchWithRetry(r,t);}async fetchWithRetry(e,t){for(let r=0;r<=x;r++){try{let i=await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:e,keepalive:!0,credentials:"omit"});if(i.ok){this.debug&&console.log("[analytics] flushed:",t.length,"events");return}if(i.status>=400&&i.status<500){this.debug&&console.warn("[analytics] flush rejected:",i.status);return}}catch{}if(r<x){let i=C*Math.pow(2,r);await new Promise(s=>setTimeout(s,i));}}this.debug&&console.warn("[analytics] flush failed after retries, dropping",t.length,"events");}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null),this.flush(true);}get pending(){return this.queue.length}};function E(){let n=navigator.userAgent;return "userAgentData"in navigator&&navigator.userAgentData?.mobile===true?/Mobile/.test(n)?"mobile":"tablet":/Macintosh/.test(n)&&navigator.maxTouchPoints>1?"tablet":/iPhone|iPod/.test(n)?"mobile":/Android/.test(n)?/Mobile/.test(n)?"mobile":"tablet":"desktop"}function k(){return {screenWidth:window.screen.width,screenHeight:window.screen.height}}var P=[/^[\w-]+_[\w-]+__[a-zA-Z0-9]{5,}$/,/^sc-[a-zA-Z]{5,}$/,/^css-[a-zA-Z0-9]+$/,/^e[a-z0-9]{6,}$/],_=/[-_][0-9a-f]{4,}$|^:r\d|^react-|^ember|^__next|^radix-/i,M=["data-testid","data-analytics","data-id"];function D(n){return P.some(e=>e.test(n))}function $(n){let e=[],t=n;for(;t&&t!==document.body&&e.length<4;){let r=L(t);if(e.unshift(r.selector),r.unique)break;t=t.parentElement;}return e.join(" > ").slice(0,256)}function L(n){let e=n.tagName.toLowerCase();for(let o of M){let a=n.getAttribute(o);if(a)return {selector:`${e}[${o}="${a}"]`,unique:true}}if(n.id&&!_.test(n.id))return {selector:`${e}#${n.id}`,unique:true};let t=n.getAttribute("role");if(t)return {selector:`${e}[role="${t}"]`,unique:false};let r=n.getAttribute("aria-label");if(r){let o=r.slice(0,50).replace(/"/g,'\\"');return {selector:`${e}[aria-label="${o}"]`,unique:false}}if(e==="input"||e==="select"||e==="textarea"){let o=n.getAttribute("name");if(o)return {selector:`${e}[name="${o}"]`,unique:false};let a=n.getAttribute("type");if(a)return {selector:`${e}[type="${a}"]`,unique:false}}if(e==="a"){let o=n.getAttribute("href");if(o&&!o.startsWith("javascript:"))try{return {selector:`a[href="${new URL(o,location.origin).pathname.slice(0,80)}"]`,unique:!1}}catch{}}let i=e;if(n.className&&typeof n.className=="string"){let o=n.className.trim().split(/\s+/).filter(a=>a&&!D(a)).slice(0,2);o.length>0&&(i+="."+o.join("."));}let s=n.parentElement;if(s){let o=Array.from(s.children).filter(a=>a.tagName===n.tagName);if(o.length>1){let a=o.indexOf(n)+1;i+=`:nth-of-type(${a})`;}}return {selector:i,unique:false}}function q(){let n=document.body;return !n||n.children.length>3?false:n.querySelectorAll(":scope > :not(canvas):not(script):not(style):not(link)").length===0&&n.querySelectorAll("canvas").length>=1}function j(n){let e=["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],t=new URL(n).searchParams,r={};for(let i of e){let s=t.get(i);s&&(r[i]=s);}return r}function A(n){let e=()=>{let i=j(location.href);n({type:"pageview",url:location.href,referrer:document.referrer,title:document.title,...Object.keys(i).length>0&&{properties:i}});},t=history.pushState.bind(history),r=history.replaceState.bind(history);return history.pushState=function(...i){t(...i),e();},history.replaceState=function(...i){r(...i),e();},window.addEventListener("popstate",e),e(),()=>{history.pushState=t,history.replaceState=r,window.removeEventListener("popstate",e);}}function T(n){let e=typeof PointerEvent<"u",t=i=>{if(i.button!==0)return;let s=i.target;if(!s)return;let o=s.tagName.toLowerCase();if(o==="html"||o==="body"||s.closest?.("#lumitra-widget-host, #lumitra-overlay-host, #lumitra-heatmap-container, #lumitra-heatmap-fixed"))return;let a=q();if(!a){let g=document.elementFromPoint(i.clientX,i.clientY);g&&g!==s&&(s=g);}let l=s.getBoundingClientRect(),p="pointerType"in i?i.pointerType:void 0;n({type:"click",url:location.href,x:i.pageX,y:i.pageY,selector:a?"":$(s),...p&&{inputType:p},...l.width>0&&!a&&{properties:{ox:Math.round(i.clientX-l.left),oy:Math.round(i.clientY-l.top),ew:Math.round(l.width),eh:Math.round(l.height),...p&&{pt:p}}}});},r=e?"pointerup":"click";return document.addEventListener(r,t,{capture:true}),()=>document.removeEventListener(r,t,{capture:true})}function S(n){let e=0,t=false,r=()=>{t||(t=true,requestAnimationFrame(()=>{let i=window.scrollY,s=document.documentElement.scrollHeight-window.innerHeight,o=s>0?Math.round(i/s*100):0;o>e&&(e=o,n({type:"scroll",url:location.href,scrollDepth:e})),t=false;}));};return window.addEventListener("scroll",r,{passive:true}),()=>{window.removeEventListener("scroll",r);}}function v(n,e=0){let t=e;for(let r=0;r<n.length;r++){let i=Math.imul(n.charCodeAt(r),3432918353);t^=Math.imul(i<<15|i>>>17,461845907),t=Math.imul(t<<13|t>>>19,5)+3864292196;}return t^=n.length,t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}var I="ap_exp_";function N(n,e,t){let i=v(`${n}:${e}`)%1e4,s=0;for(let o of t)if(s+=o.weight*100,i<s)return o.key;return t[0]?.key??"control"}function O(n){try{return sessionStorage.getItem(`${I}${n}`)}catch{return null}}function F(n,e){try{sessionStorage.setItem(`${I}${n}`,e);}catch{}}var h=class{constructor(e){a(this,"experiments",[]);a(this,"flags",[]);a(this,"identityId");a(this,"assignments",new Map);this.identityId=e;}setDefinitions(e,t){this.experiments=e,this.flags=t,this.resolveAllAssignments();}identify(e){e!==this.identityId&&(this.identityId=e,this.assignments.clear(),this.resolveAllAssignments());}getVariant(e){return this.assignments.get(e)??null}getFlag(e){let t=this.flags.find(r=>r.key===e);return !(!t||!t.enabled||t.rolloutPercentage<100&&v(`${e}:${this.identityId}`)%1e4>=t.rolloutPercentage*100)}getActiveExperiments(){let e={};for(let t of this.experiments){let r=this.assignments.get(t.key);r&&(e[t.id]=r);}return e}resolveAllAssignments(){for(let e of this.experiments)this.resolveAssignment(e);}resolveAssignment(e){let t=O(e.key);if(t&&e.variants.some(i=>i.key===t)){this.assignments.set(e.key,t);return}let r=N(e.key,this.identityId,e.variants);this.assignments.set(e.key,r),F(e.key,r);}};var U=3e3,m=class{constructor(e){a(this,"config");a(this,"sessionId");a(this,"batcher");a(this,"cleanups",[]);a(this,"experimentManager");a(this,"remoteConfig",null);a(this,"readyPromise");a(this,"resolveReady");a(this,"replayActive",false);this.config=e;let{sessionId:t,isNew:r}=b();this.sessionId=t,this.experimentManager=new h(t),this.readyPromise=new Promise(i=>{this.resolveReady=i;}),this.batcher=new d(e.endpoint,e.apiKey,e.flushInterval,e.debug),r&&this.track({type:"session_start",url:location.href,properties:{maxTouchPoints:navigator.maxTouchPoints??0,pointerType:window.matchMedia("(pointer: coarse)").matches?"coarse":"fine",dpr:window.devicePixelRatio??1,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}}),this.cleanups.push(A(i=>this.track(i))),e.heatmap!==false&&this.cleanups.push(T(i=>this.track(i))),e.scrollDepth!==false&&this.cleanups.push(S(i=>this.track(i))),this.fetchRemoteConfig();}ready(){return this.readyPromise}getVariant(e){return this.experimentManager.getVariant(e)}getFlag(e){return this.experimentManager.getFlag(e)}identify(e){this.experimentManager.identify(e);}enableReplay(){this.replayActive||(this.replayActive=true,import('./replay-CBKHD6XI.js').then(e=>e.initReplay(this,this.config.replayPrivacy)).catch(()=>{this.replayActive=false,this.config.debug&&console.warn("[analytics] rrweb not available, replay disabled");}));}disableReplay(){this.replayActive&&(this.replayActive=false,import('./replay-CBKHD6XI.js').then(e=>e.stopReplay()).catch(()=>{}));}get isReplayActive(){return this.replayActive}track(e){w();let{screenWidth:t,screenHeight:r}=k(),i=this.experimentManager.getActiveExperiments(),s=Object.keys(i),o,a,l=e.properties;if(s.length>0){let g=s[0];o=g,a=i[g],s.length>1&&(l={...l,_experiments:i});}let p={...e,projectId:this.config.projectId,sessionId:this.sessionId,timestamp:Date.now(),screenWidth:t,screenHeight:r,deviceType:E(),userAgent:navigator.userAgent,...o&&{experimentId:o},...a&&{variant:a},...l&&{properties:l}};this.batcher.add(p);}destroy(){for(let e of this.cleanups)e();this.cleanups=[],this.batcher.destroy();}fetchRemoteConfig(){let t=`${this.config.endpoint.replace(/\/api\/collect\/?$/,"")}/api/projects/${this.config.projectId}/config`,r=new AbortController,i=setTimeout(()=>r.abort(),U);fetch(t,{method:"GET",signal:r.signal,credentials:"omit"}).then(s=>{if(!s.ok)throw new Error(`Config fetch failed: ${s.status}`);return s.json()}).then(s=>{this.remoteConfig=s,this.experimentManager.setDefinitions(s.experiments??[],s.flags??[]),this.config.debug&&console.log("[analytics] remote config loaded:",s);}).catch(s=>{this.config.debug&&console.warn("[analytics] remote config fetch failed, using defaults:",s);}).finally(()=>{clearTimeout(i),this.resolveReady();});}};var u=null;function ae(n){return u?(n.debug&&console.warn("[analytics] already initialized, returning existing instance"),u):(u=new m(n),n.replay&&u.enableReplay(),u)}function ce(){return u}function le(){u?.destroy(),u=null;}function ue(){u?.enableReplay();}function pe(){u?.disableReplay();}export{m as AnalyticsTracker,h as ExperimentManager,le as destroy,pe as disableReplay,ue as enableReplay,ce as getTracker,ae as init};//# sourceMappingURL=index.js.map
|
|
1
|
+
import {a}from'./chunk-5XGN7UAV.js';var y="ap_session_id",f="ap_last_activity";function b(){let n=Date.now(),e=sessionStorage.getItem(y),t=Number(sessionStorage.getItem(f)||"0");if(e&&n-t<18e5)return sessionStorage.setItem(f,String(n)),{sessionId:e,isNew:false};let r=crypto.randomUUID();return sessionStorage.setItem(y,r),sessionStorage.setItem(f,String(n)),{sessionId:r,isNew:true}}function w(){sessionStorage.setItem(f,String(Date.now()));}var x=3,C=1e3,d=class{constructor(e,t,r,i=false){a(this,"queue",[]);a(this,"timer",null);a(this,"endpoint");a(this,"apiKey");a(this,"debug");this.endpoint=e,this.apiKey=t,this.debug=i,this.timer=setInterval(()=>this.flush(),r??5e3),typeof window<"u"&&(window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush(true);}),window.addEventListener("pagehide",()=>this.flush(true)));}add(e){this.queue.push(e),this.debug&&console.log("[analytics] queued:",e.type,e),this.queue.length>=50&&this.flush();}async flush(e=false){if(this.queue.length===0)return;let t=this.queue.splice(0,50),r=JSON.stringify(t);if(e&&typeof navigator<"u"&&navigator.sendBeacon){let i=new Blob([r],{type:"application/json"});if(navigator.sendBeacon(this.endpoint,i)){this.debug&&console.log("[analytics] beacon sent:",t.length,"events");return}}await this.fetchWithRetry(r,t);}async fetchWithRetry(e,t){for(let r=0;r<=x;r++){try{let i=await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:e,keepalive:!0,credentials:"omit"});if(i.ok){this.debug&&console.log("[analytics] flushed:",t.length,"events");return}if(i.status>=400&&i.status<500){this.debug&&console.warn("[analytics] flush rejected:",i.status);return}}catch{}if(r<x){let i=C*Math.pow(2,r);await new Promise(s=>setTimeout(s,i));}}this.debug&&console.warn("[analytics] flush failed after retries, dropping",t.length,"events");}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null),this.flush(true);}get pending(){return this.queue.length}};function E(){let n=navigator.userAgent;return "userAgentData"in navigator&&navigator.userAgentData?.mobile===true?/Mobile/.test(n)?"mobile":"tablet":/Macintosh/.test(n)&&navigator.maxTouchPoints>1?"tablet":/iPhone|iPod/.test(n)?"mobile":/Android/.test(n)?/Mobile/.test(n)?"mobile":"tablet":"desktop"}function k(){return {screenWidth:window.screen.width,screenHeight:window.screen.height}}var P=[/^[\w-]+_[\w-]+__[a-zA-Z0-9]{5,}$/,/^sc-[a-zA-Z]{5,}$/,/^css-[a-zA-Z0-9]+$/,/^e[a-z0-9]{6,}$/],_=/[-_][0-9a-f]{4,}$|^:r\d|^react-|^ember|^__next|^radix-/i,M=["data-testid","data-analytics","data-id"];function D(n){return P.some(e=>e.test(n))}function $(n){let e=[],t=n;for(;t&&t!==document.body&&e.length<4;){let r=L(t);if(e.unshift(r.selector),r.unique)break;t=t.parentElement;}return e.join(" > ").slice(0,256)}function L(n){let e=n.tagName.toLowerCase();for(let o of M){let a=n.getAttribute(o);if(a)return {selector:`${e}[${o}="${a}"]`,unique:true}}if(n.id&&!_.test(n.id))return {selector:`${e}#${n.id}`,unique:true};let t=n.getAttribute("role");if(t)return {selector:`${e}[role="${t}"]`,unique:false};let r=n.getAttribute("aria-label");if(r){let o=r.slice(0,50).replace(/"/g,'\\"');return {selector:`${e}[aria-label="${o}"]`,unique:false}}if(e==="input"||e==="select"||e==="textarea"){let o=n.getAttribute("name");if(o)return {selector:`${e}[name="${o}"]`,unique:false};let a=n.getAttribute("type");if(a)return {selector:`${e}[type="${a}"]`,unique:false}}if(e==="a"){let o=n.getAttribute("href");if(o&&!o.startsWith("javascript:"))try{return {selector:`a[href="${new URL(o,location.origin).pathname.slice(0,80)}"]`,unique:!1}}catch{}}let i=e;if(n.className&&typeof n.className=="string"){let o=n.className.trim().split(/\s+/).filter(a=>a&&!D(a)).slice(0,2);o.length>0&&(i+="."+o.join("."));}let s=n.parentElement;if(s){let o=Array.from(s.children).filter(a=>a.tagName===n.tagName);if(o.length>1){let a=o.indexOf(n)+1;i+=`:nth-of-type(${a})`;}}return {selector:i,unique:false}}function q(){let n=document.body;return !n||n.children.length>3?false:n.querySelectorAll(":scope > :not(canvas):not(script):not(style):not(link)").length===0&&n.querySelectorAll("canvas").length>=1}function j(n){let e=["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],t=new URL(n).searchParams,r={};for(let i of e){let s=t.get(i);s&&(r[i]=s);}return r}function A(n){let e=()=>{let i=j(location.href);n({type:"pageview",url:location.href,referrer:document.referrer,title:document.title,...Object.keys(i).length>0&&{properties:i}});},t=history.pushState.bind(history),r=history.replaceState.bind(history);return history.pushState=function(...i){t(...i),e();},history.replaceState=function(...i){r(...i),e();},window.addEventListener("popstate",e),e(),()=>{history.pushState=t,history.replaceState=r,window.removeEventListener("popstate",e);}}function T(n){let e=typeof PointerEvent<"u",t=i=>{if(i.button!==0)return;let s=i.target;if(!s)return;let o=s.tagName.toLowerCase();if(o==="html"||o==="body"||s.closest?.("#lumitra-widget-host, #lumitra-overlay-host, #lumitra-heatmap-container, #lumitra-heatmap-fixed"))return;let a=q();if(!a){let g=document.elementFromPoint(i.clientX,i.clientY);g&&g!==s&&(s=g);}let l=s.getBoundingClientRect(),p="pointerType"in i?i.pointerType:void 0;n({type:"click",url:location.href,x:i.pageX,y:i.pageY,selector:a?"":$(s),...p&&{inputType:p},...l.width>0&&!a&&{properties:{ox:Math.round(i.clientX-l.left),oy:Math.round(i.clientY-l.top),ew:Math.round(l.width),eh:Math.round(l.height),...p&&{pt:p}}}});},r=e?"pointerup":"click";return document.addEventListener(r,t,{capture:true}),()=>document.removeEventListener(r,t,{capture:true})}function S(n){let e=0,t=false,r=()=>{t||(t=true,requestAnimationFrame(()=>{let i=window.scrollY,s=document.documentElement.scrollHeight-window.innerHeight,o=s>0?Math.round(i/s*100):0;o>e&&(e=o,n({type:"scroll",url:location.href,scrollDepth:e})),t=false;}));};return window.addEventListener("scroll",r,{passive:true}),()=>{window.removeEventListener("scroll",r);}}function v(n,e=0){let t=e;for(let r=0;r<n.length;r++){let i=Math.imul(n.charCodeAt(r),3432918353);t^=Math.imul(i<<15|i>>>17,461845907),t=Math.imul(t<<13|t>>>19,5)+3864292196;}return t^=n.length,t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}var I="ap_exp_";function N(n,e,t){let i=v(`${n}:${e}`)%1e4,s=0;for(let o of t)if(s+=o.weight*100,i<s)return o.key;return t[0]?.key??"control"}function O(n){try{return sessionStorage.getItem(`${I}${n}`)}catch{return null}}function F(n,e){try{sessionStorage.setItem(`${I}${n}`,e);}catch{}}var h=class{constructor(e){a(this,"experiments",[]);a(this,"flags",[]);a(this,"identityId");a(this,"assignments",new Map);this.identityId=e;}setDefinitions(e,t){this.experiments=e,this.flags=t,this.resolveAllAssignments();}identify(e){e!==this.identityId&&(this.identityId=e,this.assignments.clear(),this.resolveAllAssignments());}getVariant(e){return this.assignments.get(e)??null}getFlag(e){let t=this.flags.find(r=>r.key===e);return !(!t||!t.enabled||t.rolloutPercentage<100&&v(`${e}:${this.identityId}`)%1e4>=t.rolloutPercentage*100)}getActiveExperiments(){let e={};for(let t of this.experiments){let r=this.assignments.get(t.key);r&&(e[t.id]=r);}return e}resolveAllAssignments(){for(let e of this.experiments)this.resolveAssignment(e);}resolveAssignment(e){let t=O(e.key);if(t&&e.variants.some(i=>i.key===t)){this.assignments.set(e.key,t);return}let r=N(e.key,this.identityId,e.variants);this.assignments.set(e.key,r),F(e.key,r);}};var U=3e3,m=class{constructor(e){a(this,"config");a(this,"sessionId");a(this,"batcher");a(this,"cleanups",[]);a(this,"experimentManager");a(this,"remoteConfig",null);a(this,"readyPromise");a(this,"resolveReady");a(this,"replayActive",false);this.config=e;let{sessionId:t,isNew:r}=b();this.sessionId=t,this.experimentManager=new h(t),this.readyPromise=new Promise(i=>{this.resolveReady=i;}),this.batcher=new d(e.endpoint,e.apiKey,e.flushInterval,e.debug),r&&this.track({type:"session_start",url:location.href,properties:{maxTouchPoints:navigator.maxTouchPoints??0,pointerType:window.matchMedia("(pointer: coarse)").matches?"coarse":"fine",dpr:window.devicePixelRatio??1,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}}),this.cleanups.push(A(i=>this.track(i))),e.heatmap!==false&&this.cleanups.push(T(i=>this.track(i))),e.scrollDepth!==false&&this.cleanups.push(S(i=>this.track(i))),this.fetchRemoteConfig();}ready(){return this.readyPromise}getVariant(e){return this.experimentManager.getVariant(e)}getFlag(e){return this.experimentManager.getFlag(e)}identify(e){this.experimentManager.identify(e);}enableReplay(){this.replayActive||(this.replayActive=true,import('./replay-S33L5QID.js').then(e=>e.initReplay(this,this.config.replayPrivacy)).catch(()=>{this.replayActive=false,this.config.debug&&console.warn("[analytics] rrweb not available, replay disabled");}));}disableReplay(){this.replayActive&&(this.replayActive=false,import('./replay-S33L5QID.js').then(e=>e.stopReplay()).catch(()=>{}));}get isReplayActive(){return this.replayActive}track(e){w();let{screenWidth:t,screenHeight:r}=k(),i=this.experimentManager.getActiveExperiments(),s=Object.keys(i),o,a,l=e.properties;if(s.length>0){let g=s[0];o=g,a=i[g],s.length>1&&(l={...l,_experiments:i});}let p={...e,projectId:this.config.projectId,sessionId:this.sessionId,timestamp:Date.now(),screenWidth:t,screenHeight:r,deviceType:E(),userAgent:navigator.userAgent,...o&&{experimentId:o},...a&&{variant:a},...l&&{properties:l}};this.batcher.add(p);}destroy(){for(let e of this.cleanups)e();this.cleanups=[],this.batcher.destroy();}fetchRemoteConfig(){let t=`${this.config.endpoint.replace(/\/api\/collect\/?$/,"")}/api/projects/${this.config.projectId}/config`,r=new AbortController,i=setTimeout(()=>r.abort(),U);fetch(t,{method:"GET",signal:r.signal,credentials:"omit"}).then(s=>{if(!s.ok)throw new Error(`Config fetch failed: ${s.status}`);return s.json()}).then(s=>{this.remoteConfig=s,this.experimentManager.setDefinitions(s.experiments??[],s.flags??[]),this.config.debug&&console.log("[analytics] remote config loaded:",s);}).catch(s=>{this.config.debug&&console.warn("[analytics] remote config fetch failed, using defaults:",s);}).finally(()=>{clearTimeout(i),this.resolveReady();});}};var u=null;function ae(n){return u?(n.debug&&console.warn("[analytics] already initialized, returning existing instance"),u):(u=new m(n),n.replay&&u.enableReplay(),u)}function ce(){return u}function le(){u?.destroy(),u=null;}function ue(){u?.enableReplay();}function pe(){u?.disableReplay();}export{m as AnalyticsTracker,h as ExperimentManager,le as destroy,pe as disableReplay,ue as enableReplay,ce as getTracker,ae as init};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import'./chunk-5XGN7UAV.js';var a=1e4,r=null,t=[],n=null;async function p(l,e){let o;try{o=await import('rrweb');}catch{return}n=o.record({maskAllInputs:e?.maskAllInputs!==false,maskAllText:e?.maskAllText??false,...e?.blockSelector&&{blockSelector:e.blockSelector},...e?.maskTextSelector&&{maskTextSelector:e.maskTextSelector},blockClass:"ap-block",maskInputOptions:{password:true,email:true,tel:true},inlineStylesheet:true,collectFonts:true,inlineImages:true,emit(i){t.push(i),new Blob([JSON.stringify(t)]).size>=524288&&s(l);}})??null,r=setInterval(()=>s(l),a);}function s(l){if(t.length===0)return;let e=t.splice(0);l.track({type:"replay_chunk",url:location.href,replayChunk:e});}function k(){n&&(n(),n=null),r&&(clearInterval(r),r=null),t=[];}export{p as initReplay,k as stopReplay};//# sourceMappingURL=replay-S33L5QID.js.map
|
|
2
|
+
//# sourceMappingURL=replay-S33L5QID.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/replay.ts"],"names":["CHUNK_FLUSH_INTERVAL","replayTimer","chunkBuffer","stopRecording","initReplay","tracker","privacy","rrweb","event","flushChunk","chunk","stopReplay"],"mappings":"4BAIA,IAAMA,CAAAA,CAAuB,GAAA,CAEzBC,CAAAA,CAAqD,IAAA,CACrDC,EAAyB,EAAC,CAC1BC,CAAAA,CAAqC,IAAA,CAEzC,eAAsBC,CAAAA,CACpBC,CAAAA,CACAC,CAAAA,CACe,CACf,IAAIC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAQ,MAAM,OAAO,OAAO,EAC9B,MAAQ,CACN,MACF,CAEAJ,CAAAA,CAAgBI,EAAM,MAAA,CAAO,CAE3B,aAAA,CAAeD,CAAAA,EAAS,gBAAkB,KAAA,CAC1C,WAAA,CAAaA,CAAAA,EAAS,WAAA,EAAe,KAAA,CACrC,GAAIA,CAAAA,EAAS,aAAA,EAAiB,CAAE,aAAA,CAAeA,CAAAA,CAAQ,aAAc,CAAA,CACrE,GAAIA,CAAAA,EAAS,gBAAA,EAAoB,CAAE,gBAAA,CAAkBA,EAAQ,gBAAiB,CAAA,CAE9E,UAAA,CAAY,UAAA,CACZ,iBAAkB,CAChB,QAAA,CAAU,IAAA,CACV,KAAA,CAAO,KACP,GAAA,CAAK,IACP,CAAA,CACA,gBAAA,CAAkB,KAClB,YAAA,CAAc,IAAA,CACd,YAAA,CAAc,IAAA,CACd,KAAKE,CAAAA,CAAO,CACVN,CAAAA,CAAY,IAAA,CAAKM,CAAK,CAAA,CAGT,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,SAAA,CAAUN,CAAW,CAAC,CAAC,CAAA,CAAE,IAAA,EACzC,MAAA,EACVO,CAAAA,CAAWJ,CAAO,EAEtB,CACF,CAAC,CAAA,EAAK,IAAA,CAENJ,CAAAA,CAAc,WAAA,CAAY,IAAMQ,EAAWJ,CAAO,CAAA,CAAGL,CAAoB,EAC3E,CAEA,SAASS,CAAAA,CAAWJ,CAAAA,CAAiC,CACnD,GAAIH,CAAAA,CAAY,MAAA,GAAW,CAAA,CAAG,OAE9B,IAAMQ,CAAAA,CAAQR,CAAAA,CAAY,MAAA,CAAO,CAAC,CAAA,CAClCG,CAAAA,CAAQ,KAAA,CAAM,CACZ,KAAM,cAAA,CACN,GAAA,CAAK,QAAA,CAAS,IAAA,CACd,YAAaK,CACf,CAAC,EACH,CAEO,SAASC,CAAAA,EAAmB,CAC7BR,CAAAA,GACFA,CAAAA,GACAA,CAAAA,CAAgB,IAAA,CAAA,CAEdF,CAAAA,GACF,aAAA,CAAcA,CAAW,CAAA,CACzBA,CAAAA,CAAc,IAAA,CAAA,CAEhBC,CAAAA,CAAc,GAChB","file":"replay-S33L5QID.js","sourcesContent":["import type { AnalyticsTracker } from './tracker.js';\nimport type { ReplayPrivacy } from './index.js';\nimport { MAX_REPLAY_CHUNK_BYTES } from './constants';\n\nconst CHUNK_FLUSH_INTERVAL = 10_000; // 10 seconds\n\nlet replayTimer: ReturnType<typeof setInterval> | null = null;\nlet chunkBuffer: unknown[] = [];\nlet stopRecording: (() => void) | null = null;\n\nexport async function initReplay(\n tracker: AnalyticsTracker,\n privacy?: ReplayPrivacy,\n): Promise<void> {\n let rrweb: typeof import('rrweb');\n try {\n rrweb = await import('rrweb');\n } catch {\n return; // rrweb not installed, graceful no-op\n }\n\n stopRecording = rrweb.record({\n // Privacy defaults: always mask inputs unless explicitly disabled\n maskAllInputs: privacy?.maskAllInputs !== false,\n maskAllText: privacy?.maskAllText ?? false,\n ...(privacy?.blockSelector && { blockSelector: privacy.blockSelector }),\n ...(privacy?.maskTextSelector && { maskTextSelector: privacy.maskTextSelector }),\n // Block password fields and sensitive attributes by default\n blockClass: 'ap-block',\n maskInputOptions: {\n password: true,\n email: true,\n tel: true,\n },\n inlineStylesheet: true, // Inline all CSS into snapshot (fixes cross-origin stylesheet issue)\n collectFonts: true, // Capture web fonts\n inlineImages: true, // Inline images as data URIs\n emit(event) {\n chunkBuffer.push(event);\n\n // Flush if chunk is too large\n const size = new Blob([JSON.stringify(chunkBuffer)]).size;\n if (size >= MAX_REPLAY_CHUNK_BYTES) {\n flushChunk(tracker);\n }\n },\n }) ?? null;\n\n replayTimer = setInterval(() => flushChunk(tracker), CHUNK_FLUSH_INTERVAL);\n}\n\nfunction flushChunk(tracker: AnalyticsTracker): void {\n if (chunkBuffer.length === 0) return;\n\n const chunk = chunkBuffer.splice(0);\n tracker.track({\n type: 'replay_chunk',\n url: location.href,\n replayChunk: chunk,\n });\n}\n\nexport function stopReplay(): void {\n if (stopRecording) {\n stopRecording();\n stopRecording = null;\n }\n if (replayTimer) {\n clearInterval(replayTimer);\n replayTimer = null;\n }\n chunkBuffer = [];\n}\n"]}
|
package/package.json
CHANGED
package/dist/replay-CBKHD6XI.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import'./chunk-5XGN7UAV.js';var i=1e4,r=null,t=[],n=null;async function p(l,e){let o;try{o=await import('rrweb');}catch{return}n=o.record({maskAllInputs:e?.maskAllInputs!==false,maskAllText:e?.maskAllText??false,...e?.blockSelector&&{blockSelector:e.blockSelector},...e?.maskTextSelector&&{maskTextSelector:e.maskTextSelector},blockClass:"ap-block",maskInputOptions:{password:true,email:true,tel:true},emit(a){t.push(a),new Blob([JSON.stringify(t)]).size>=524288&&s(l);}})??null,r=setInterval(()=>s(l),i);}function s(l){if(t.length===0)return;let e=t.splice(0);l.track({type:"replay_chunk",url:location.href,replayChunk:e});}function k(){n&&(n(),n=null),r&&(clearInterval(r),r=null),t=[];}export{p as initReplay,k as stopReplay};//# sourceMappingURL=replay-CBKHD6XI.js.map
|
|
2
|
-
//# sourceMappingURL=replay-CBKHD6XI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/replay.ts"],"names":["CHUNK_FLUSH_INTERVAL","replayTimer","chunkBuffer","stopRecording","initReplay","tracker","privacy","rrweb","event","flushChunk","chunk","stopReplay"],"mappings":"4BAIA,IAAMA,CAAAA,CAAuB,GAAA,CAEzBC,CAAAA,CAAqD,IAAA,CACrDC,EAAyB,EAAC,CAC1BC,CAAAA,CAAqC,IAAA,CAEzC,eAAsBC,CAAAA,CACpBC,CAAAA,CACAC,CAAAA,CACe,CACf,IAAIC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAQ,MAAM,OAAO,OAAO,EAC9B,CAAA,KAAQ,CACN,MACF,CAEAJ,EAAgBI,CAAAA,CAAM,MAAA,CAAO,CAE3B,aAAA,CAAeD,GAAS,aAAA,GAAkB,KAAA,CAC1C,WAAA,CAAaA,CAAAA,EAAS,WAAA,EAAe,KAAA,CACrC,GAAIA,CAAAA,EAAS,eAAiB,CAAE,aAAA,CAAeA,CAAAA,CAAQ,aAAc,CAAA,CACrE,GAAIA,CAAAA,EAAS,gBAAA,EAAoB,CAAE,gBAAA,CAAkBA,CAAAA,CAAQ,gBAAiB,CAAA,CAE9E,UAAA,CAAY,UAAA,CACZ,gBAAA,CAAkB,CAChB,SAAU,IAAA,CACV,KAAA,CAAO,IAAA,CACP,GAAA,CAAK,IACP,CAAA,CACA,IAAA,CAAKE,CAAAA,CAAO,CACVN,EAAY,IAAA,CAAKM,CAAK,CAAA,CAGT,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,SAAA,CAAUN,CAAW,CAAC,CAAC,CAAA,CAAE,IAAA,EACzC,MAAA,EACVO,CAAAA,CAAWJ,CAAO,EAEtB,CACF,CAAC,CAAA,EAAK,IAAA,CAENJ,CAAAA,CAAc,WAAA,CAAY,IAAMQ,CAAAA,CAAWJ,CAAO,EAAGL,CAAoB,EAC3E,CAEA,SAASS,EAAWJ,CAAAA,CAAiC,CACnD,GAAIH,CAAAA,CAAY,SAAW,CAAA,CAAG,OAE9B,IAAMQ,CAAAA,CAAQR,CAAAA,CAAY,MAAA,CAAO,CAAC,CAAA,CAClCG,EAAQ,KAAA,CAAM,CACZ,IAAA,CAAM,cAAA,CACN,GAAA,CAAK,QAAA,CAAS,IAAA,CACd,WAAA,CAAaK,CACf,CAAC,EACH,CAEO,SAASC,CAAAA,EAAmB,CAC7BR,CAAAA,GACFA,CAAAA,GACAA,CAAAA,CAAgB,IAAA,CAAA,CAEdF,CAAAA,GACF,aAAA,CAAcA,CAAW,CAAA,CACzBA,CAAAA,CAAc,IAAA,CAAA,CAEhBC,CAAAA,CAAc,GAChB","file":"replay-CBKHD6XI.js","sourcesContent":["import type { AnalyticsTracker } from './tracker.js';\nimport type { ReplayPrivacy } from './index.js';\nimport { MAX_REPLAY_CHUNK_BYTES } from './constants';\n\nconst CHUNK_FLUSH_INTERVAL = 10_000; // 10 seconds\n\nlet replayTimer: ReturnType<typeof setInterval> | null = null;\nlet chunkBuffer: unknown[] = [];\nlet stopRecording: (() => void) | null = null;\n\nexport async function initReplay(\n tracker: AnalyticsTracker,\n privacy?: ReplayPrivacy,\n): Promise<void> {\n let rrweb: typeof import('rrweb');\n try {\n rrweb = await import('rrweb');\n } catch {\n return; // rrweb not installed, graceful no-op\n }\n\n stopRecording = rrweb.record({\n // Privacy defaults: always mask inputs unless explicitly disabled\n maskAllInputs: privacy?.maskAllInputs !== false,\n maskAllText: privacy?.maskAllText ?? false,\n ...(privacy?.blockSelector && { blockSelector: privacy.blockSelector }),\n ...(privacy?.maskTextSelector && { maskTextSelector: privacy.maskTextSelector }),\n // Block password fields and sensitive attributes by default\n blockClass: 'ap-block',\n maskInputOptions: {\n password: true,\n email: true,\n tel: true,\n },\n emit(event) {\n chunkBuffer.push(event);\n\n // Flush if chunk is too large\n const size = new Blob([JSON.stringify(chunkBuffer)]).size;\n if (size >= MAX_REPLAY_CHUNK_BYTES) {\n flushChunk(tracker);\n }\n },\n }) ?? null;\n\n replayTimer = setInterval(() => flushChunk(tracker), CHUNK_FLUSH_INTERVAL);\n}\n\nfunction flushChunk(tracker: AnalyticsTracker): void {\n if (chunkBuffer.length === 0) return;\n\n const chunk = chunkBuffer.splice(0);\n tracker.track({\n type: 'replay_chunk',\n url: location.href,\n replayChunk: chunk,\n });\n}\n\nexport function stopReplay(): void {\n if (stopRecording) {\n stopRecording();\n stopRecording = null;\n }\n if (replayTimer) {\n clearInterval(replayTimer);\n replayTimer = null;\n }\n chunkBuffer = [];\n}\n"]}
|