diff --git a/src/tracker.js b/src/tracker.js index 7dc847e..23255b4 100644 --- a/src/tracker.js +++ b/src/tracker.js @@ -1,2 +1,2 @@ // AUTO-GENERATED — edit tracker.src.js instead -export const TRACKER_JS = `(function(){"use strict";if(/^localhost$|^127(\\.\\d+){3}$/.test(location.hostname)){window.aa={track:function(e,t){console.log("[aa-dev] track",e,t||{})},identify:function(e){console.log("[aa-dev] identify",e)},page:function(e){console.log("[aa-dev] page",e||document.title)},experiment:function(){return null},set:function(e){console.log("[aa-dev] set",e||{})},requireConsent:function(){console.log("[aa-dev] requireConsent")},grantConsent:function(){console.log("[aa-dev] grantConsent")},revokeConsent:function(){console.log("[aa-dev] revokeConsent")}};return}var o=document.currentScript,$=o&&o.src?new URL(o.src).origin+"/track":"/track",de=o&&o.dataset.project||"default",b=o&&o.dataset.token||null,ve=o&&o.getAttribute("data-do-not-track")==="true";if(ve&&navigator.doNotTrack==="1"||localStorage.getItem("aa_disabled")==="true"||document.visibilityState==="prerender")return;var oe=o&&o.getAttribute("data-link-domains")||null,me=o&&o.getAttribute("data-track-outgoing")==="true",se=o&&o.getAttribute("data-heartbeat"),ge=o&&o.getAttribute("data-track-errors")==="true",he=o&&o.getAttribute("data-track-performance")==="true",ce=o&&o.getAttribute("data-require-consent")==="true",pe=o&&o.getAttribute("data-track-clicks")==="true",_e=o&&o.getAttribute("data-track-vitals")==="true",be=o&&o.getAttribute("data-track-downloads")==="true",Se=o&&o.getAttribute("data-track-forms")==="true",ye=o&&o.getAttribute("data-track-404")==="true",we=o&&o.getAttribute("data-track-scroll-depth")==="true",h=null;oe&&(h=oe.split(",").map(function(e){return e.trim().toLowerCase()}));function ke(e){if(!h||e===location.hostname)return!1;for(var t=0;tAe)&&(r="sess_"+Math.random().toString(36).slice(2,11)+e.toString(36),sessionStorage.setItem("aa_sid",r),X++,localStorage.setItem("aa_sc",String(X))),sessionStorage.setItem("aa_last_activity",String(e)),r}function Q(){for(var e=new URLSearchParams(location.search),t={},r=["utm_source","utm_medium","utm_campaign","utm_content","utm_term"],n=!1,a=0;a=768&&e<1024&&!/Mobi/i.test(W)?"tablet":/Mobi/i.test(W)||e<768?"mobile":"desktop"}l.device=Ce();var le="";try{le=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(e){}if(navigator.userAgentData){var f=navigator.userAgentData;if(typeof f.mobile=="boolean"&&f.mobile&&(l.device="mobile"),f.platform){var g=f.platform;g==="macOS"?l.os="macOS":g==="Windows"?l.os="Windows":g==="Android"?l.os="Android":g==="Chrome OS"||g==="ChromeOS"?l.os="ChromeOS":g==="Linux"?l.os="Linux":g==="iOS"&&(l.os="iOS")}if(f.brands&&f.brands.length)for(var p=0;p=fe)){var t=(e.message||"")+"|"+(e.filename||"")+"|"+(e.lineno||0);T[t]||(T[t]=1,x++,c.track("$error",{message:(e.message||"").slice(0,500),source:e.filename||"",line:e.lineno||0,col:e.colno||0}))}}),window.addEventListener("unhandledrejection",function(e){if(!(x>=fe)){var t=e.reason instanceof Error?e.reason.message:String(e.reason||""),r=t+"||0";T[r]||(T[r]=1,x++,c.track("$error",{message:t.slice(0,500),source:"",line:0,col:0}))}})}if(he){let e=function(){var t=performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];t&&c.track("$performance",{path:location.pathname,perf_dns:Math.round(t.domainLookupEnd-t.domainLookupStart),perf_tcp:Math.round(t.connectEnd-t.connectStart),perf_ttfb:Math.round(t.responseStart-t.requestStart),perf_dom_interactive:Math.round(t.domInteractive),perf_dom_complete:Math.round(t.domComplete),perf_load:Math.round(t.loadEventEnd)})};document.readyState==="complete"?setTimeout(e,0):window.addEventListener("load",function(){setTimeout(e,0)})}if(_e){let e=function(){if(!ne&&!(R<0&&F===0&&d.length===0)){ne=!0;var r={path:location.pathname};if(R>=0&&(r.cwv_lcp=Math.round(R)),r.cwv_cls=Math.round(F*1e3)/1e3,d.length>0){d.sort(function(a,i){return a-i});var n=Math.min(Math.ceil(d.length*.98)-1,d.length-1);r.cwv_inp=d[Math.max(n,0)]}c.track("$web_vitals",r)}},t=function(){e(),R=-1,F=0,d=[],ne=!1};var R=-1,F=0,d=[],ne=!1;try{new PerformanceObserver(function(r){var n=r.getEntries();n.length&&(R=n[n.length-1].startTime)}).observe({type:"largest-contentful-paint",buffered:!0})}catch(r){}try{new PerformanceObserver(function(r){for(var n=r.getEntries(),a=0;aM&&(M=s)},r=function(){if(!ie&&(t(),M>0&&N>0)){ie=!0;var i=Math.min(Math.round(M/N*100),100);c.track("$scroll_depth",{scroll_depth:i,path:location.pathname})}},n=function(){r(),M=0,ie=!1,t()},a=function(){var i=0,s=setInterval(function(){t(),++i>=15&&clearInterval(s)},200)};var N=e(),M=0,ie=!1;t(),document.addEventListener("scroll",t,{passive:!0}),document.readyState==="complete"?a():window.addEventListener("load",a),document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&r()}),window.addEventListener("beforeunload",r),I=n}if(se){var P=parseInt(se,10);if(P>0){let e=function(){D||(D=setInterval(function(){J+=P},P*1e3))},t=function(){D&&(clearInterval(D),D=null)},r=function(){J>0&&(c.track("$time_on_page",{time_on_page:J,path:location.pathname}),J=0)};P=Math.max(P,15);var J=0,D=null;document.addEventListener("visibilitychange",function(){document.visibilityState==="visible"?e():(t(),r())}),document.visibilityState!=="hidden"&&e(),window.addEventListener("beforeunload",function(){t(),r()}),O=function(){t(),r(),e()}}}c.page(),window.aa=c})();`; +export const TRACKER_JS = `(function(){"use strict";if(/^localhost$|^127(\\.\\d+){3}$/.test(location.hostname)){window.aa={track:function(e,t){console.log("[aa-dev] track",e,t||{})},identify:function(e){console.log("[aa-dev] identify",e)},page:function(e){console.log("[aa-dev] page",e||document.title)},experiment:function(){return null},set:function(e){console.log("[aa-dev] set",e||{})},requireConsent:function(){console.log("[aa-dev] requireConsent")},grantConsent:function(){console.log("[aa-dev] grantConsent")},revokeConsent:function(){console.log("[aa-dev] revokeConsent")}};return}var o=document.currentScript,$=o&&o.src?new URL(o.src).origin+"/track":"/track",he=o&&o.dataset.project||"default",b=o&&o.dataset.token||null,pe=o&&o.getAttribute("data-do-not-track")==="true";if(pe&&navigator.doNotTrack==="1"||localStorage.getItem("aa_disabled")==="true"||document.visibilityState==="prerender")return;var se=o&&o.getAttribute("data-link-domains")||null,_e=o&&o.getAttribute("data-track-outgoing")==="true",ce=o&&o.getAttribute("data-heartbeat"),be=o&&o.getAttribute("data-track-errors")==="true",Se=o&&o.getAttribute("data-track-performance")==="true",le=o&&o.getAttribute("data-require-consent")==="true",ye=o&&o.getAttribute("data-track-clicks")==="true",we=o&&o.getAttribute("data-track-vitals")==="true",ke=o&&o.getAttribute("data-track-downloads")==="true",Ee=o&&o.getAttribute("data-track-forms")==="true",Oe=o&&o.getAttribute("data-track-404")==="true",Ae=o&&o.getAttribute("data-track-scroll-depth")==="true",h=null;se&&(h=se.split(",").map(function(e){return e.trim().toLowerCase()}));function Le(e){if(!h||e===location.hostname)return!1;for(var t=0;tTe)&&(r="sess_"+Math.random().toString(36).slice(2,11)+e.toString(36),sessionStorage.setItem("aa_sid",r),Q++,localStorage.setItem("aa_sc",String(Q))),sessionStorage.setItem("aa_last_activity",String(e)),r}function Y(){for(var e=new URLSearchParams(location.search),t={},r=["utm_source","utm_medium","utm_campaign","utm_content","utm_term"],n=!1,a=0;a=768&&e<1024&&!/Mobi/i.test(W)?"tablet":/Mobi/i.test(W)||e<768?"mobile":"desktop"}l.device=Ne();var de="";try{de=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(e){}if(navigator.userAgentData){var f=navigator.userAgentData;if(typeof f.mobile=="boolean"&&f.mobile&&(l.device="mobile"),f.platform){var g=f.platform;g==="macOS"?l.os="macOS":g==="Windows"?l.os="Windows":g==="Android"?l.os="Android":g==="Chrome OS"||g==="ChromeOS"?l.os="ChromeOS":g==="Linux"?l.os="Linux":g==="iOS"&&(l.os="iOS")}if(f.brands&&f.brands.length)for(var p=0;p=me)){var t=(e.message||"")+"|"+(e.filename||"")+"|"+(e.lineno||0);T[t]||(T[t]=1,R++,c.track("$error",{message:(e.message||"").slice(0,500),source:e.filename||"",line:e.lineno||0,col:e.colno||0}))}}),window.addEventListener("unhandledrejection",function(e){if(!(R>=me)){var t=e.reason instanceof Error?e.reason.message:String(e.reason||""),r=t+"||0";T[r]||(T[r]=1,R++,c.track("$error",{message:t.slice(0,500),source:"",line:0,col:0}))}})}if(Se){let e=function(){var t=performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];t&&c.track("$performance",{path:location.pathname,perf_dns:Math.round(t.domainLookupEnd-t.domainLookupStart),perf_tcp:Math.round(t.connectEnd-t.connectStart),perf_ttfb:Math.round(t.responseStart-t.requestStart),perf_dom_interactive:Math.round(t.domInteractive),perf_dom_complete:Math.round(t.domComplete),perf_load:Math.round(t.loadEventEnd)})};document.readyState==="complete"?setTimeout(e,0):window.addEventListener("load",function(){setTimeout(e,0)})}if(we){let e=function(){if(!ie&&!(x<0&&F===0&&d.length===0)){ie=!0;var r={path:location.pathname};if(x>=0&&(r.cwv_lcp=Math.round(x)),r.cwv_cls=Math.round(F*1e3)/1e3,d.length>0){d.sort(function(a,i){return a-i});var n=Math.min(Math.ceil(d.length*.98)-1,d.length-1);r.cwv_inp=d[Math.max(n,0)]}c.track("$web_vitals",r)}},t=function(){e(),x=-1,F=0,d=[],ie=!1};var x=-1,F=0,d=[],ie=!1;try{new PerformanceObserver(function(r){var n=r.getEntries();n.length&&(x=n[n.length-1].startTime)}).observe({type:"largest-contentful-paint",buffered:!0})}catch(r){}try{new PerformanceObserver(function(r){for(var n=r.getEntries(),a=0;aM&&(M=s)},r=function(){if(!oe&&(t(),M>0&&N>0)){oe=!0;var i=Math.min(Math.round(M/N*100),100);c.track("$scroll_depth",{scroll_depth:i,path:location.pathname})}},n=function(){r(),M=0,oe=!1,t()},a=function(){var i=0,s=setInterval(function(){t(),++i>=15&&clearInterval(s)},200)};var N=e(),M=0,oe=!1;t(),document.addEventListener("scroll",t,{passive:!0}),document.readyState==="complete"?a():window.addEventListener("load",a),document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&r()}),window.addEventListener("beforeunload",r),I=n}if(ce){var P=parseInt(ce,10);if(P>0){let e=function(){U||(U=setInterval(function(){J+=P},P*1e3))},t=function(){U&&(clearInterval(U),U=null)},r=function(){J>0&&(c.track("$time_on_page",{time_on_page:J,path:location.pathname}),J=0)};P=Math.max(P,15);var J=0,U=null;document.addEventListener("visibilitychange",function(){document.visibilityState==="visible"?e():(t(),r())}),document.visibilityState!=="hidden"&&e(),window.addEventListener("beforeunload",function(){t(),r()}),O=function(){t(),r(),e()}}}c.page(),window.aa=c})();`; diff --git a/src/tracker.src.js b/src/tracker.src.js index 3b81b58..2b4224f 100644 --- a/src/tracker.src.js +++ b/src/tracker.src.js @@ -66,7 +66,6 @@ var p = new URLSearchParams(location.search); var id = p.get('_aa'); if (id) { - localStorage.setItem('aa_uid', id); // Strip _aa from URL p.delete('_aa'); var clean = location.pathname + (p.toString() ? '?' + p.toString() : '') + location.hash; @@ -77,15 +76,21 @@ } // --- Anon ID --- + var linkedAnonId = adoptCrossSubdomainId(); function getAnonId() { - var id = adoptCrossSubdomainId() || localStorage.getItem('aa_uid'); + var id = localStorage.getItem('aa_uid'); if (!id) { id = 'anon_' + Math.random().toString(36).slice(2, 11) + Date.now().toString(36); localStorage.setItem('aa_uid', id); } return id; } - var userId = getAnonId(); + var anonId = getAnonId(); + var identifiedUserId = localStorage.getItem('aa_identified_uid') || null; + + function currentUserId() { + return identifiedUserId || anonId; + } // --- Cross-subdomain link decoration --- if (linkedDomains) { @@ -95,7 +100,7 @@ try { var url = new URL(a.href); if (isSiblingDomain(url.hostname)) { - url.searchParams.set('_aa', userId); + url.searchParams.set('_aa', anonId); a.href = url.toString(); } } catch(_) {} @@ -230,6 +235,20 @@ }).catch(function() {}); } + function sendIdentify(previousId, nextId) { + if (!previousId || !nextId || previousId === nextId || !TOKEN || (consentRequired && !consentGranted)) return; + var identifyUrl = ENDPOINT.replace('/track', '/identify'); + send(identifyUrl, JSON.stringify({ + token: TOKEN, + previous_id: previousId, + user_id: nextId + })); + } + + if (linkedAnonId && linkedAnonId !== anonId) { + sendIdentify(linkedAnonId, anonId); + } + function flush() { if (!queue.length || (consentRequired && !consentGranted)) return; var batch = queue.splice(0); @@ -301,7 +320,7 @@ token: TOKEN, event: event, properties: baseProps(properties), - user_id: userId, + user_id: currentUserId(), session_id: getSessionId(), timestamp: Date.now() }); @@ -309,18 +328,11 @@ }, identify: function(id) { - var previousId = userId; - userId = id; - localStorage.setItem('aa_uid', id); + var previousId = anonId; + identifiedUserId = id; + localStorage.setItem('aa_identified_uid', id); flush(); - if (previousId && previousId !== id && TOKEN && (!consentRequired || consentGranted)) { - var identifyUrl = ENDPOINT.replace('/track', '/identify'); - send(identifyUrl, JSON.stringify({ - token: TOKEN, - previous_id: previousId, - user_id: id - })); - } + sendIdentify(previousId, id); }, page: function(name) { @@ -358,7 +370,7 @@ // Invalid variant — fall through to normal hash } - var str = name + '.' + userId; + var str = name + '.' + currentUserId(); var hash = 0; for (var j = 0; j < str.length; j++) { hash = ((hash << 5) - hash) + str.charCodeAt(j);