posthog-js
Advanced tools
@@ -1,2 +0,2 @@ | ||
| !function(){"use strict";var e="undefined"!=typeof window?window:void 0,r="undefined"!=typeof globalThis?globalThis:e;"undefined"==typeof self&&(r.self=r),"undefined"==typeof File&&(r.File=function(){});var n=Array.prototype.forEach,t=null==r?void 0:r.navigator,i=null==r?void 0:r.document,o=null==r?void 0:r.location;null==r||r.fetch,null!=r&&r.XMLHttpRequest&&"withCredentials"in new r.XMLHttpRequest&&r.XMLHttpRequest,null==r||r.AbortController;var a=null==t?void 0:t.userAgent,u=null!=e?e:{},l={LIB_VERSION:"1.356.0"};function s(){return s=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},s.apply(null,arguments)}function c(e,r){return-1!==e.indexOf(r)}var f=Array.isArray,v=Object.prototype,d=v.hasOwnProperty,h=v.toString,p=f||function(e){return"[object Array]"===h.call(e)},g=e=>e===Object(e)&&!p(e),w=e=>{if(g(e)){for(var r in e)if(d.call(e,r))return!1;return!0}return!1},m=e=>void 0===e,_=e=>m(e)||(e=>null===e)(e),b=e=>"[object Number]"==h.call(e)&&e==e,x=e=>e instanceof FormData;function y(e,r,n,t,i){return r>n&&(t.warn("min cannot be greater than max."),r=n),b(e)?e>n?(t.warn(" cannot be greater than max: "+n+". Using max value instead."),n):e<r?(t.warn(" cannot be less than min: "+r+". Using min value instead."),r):e:(t.warn(" must be a number. using max or fallback. max: "+n+", fallback: "+i),y(n,r,n,t))}class E{constructor(e){this.t={},this.i=e.i,this.o=y(e.bucketSize,0,100,e.u),this.l=y(e.refillRate,0,this.o,e.u),this.v=y(e.refillInterval,0,864e5,e.u)}h(e,r){var n=r-e.lastAccess,t=Math.floor(n/this.v);if(t>0){var i=t*this.l;e.tokens=Math.min(e.tokens+i,this.o),e.lastAccess=e.lastAccess+t*this.v}}consumeRateLimit(e){var r,n=Date.now(),t=String(e),i=this.t[t];return i?this.h(i,n):(i={tokens:this.o,lastAccess:n},this.t[t]=i),0===i.tokens||(i.tokens--,0===i.tokens&&(null==(r=this.i)||r.call(this,e)),0===i.tokens)}stop(){this.t={}}}var R="Mobile",M="iOS",S="Android",k="Tablet",P=S+" "+k,A="iPad",O="Apple",B=O+" Watch",I="Safari",U="BlackBerry",N="Samsung",T=N+"Browser",D=N+" Internet",C="Chrome",F=C+" OS",W=C+" "+M,j="Internet Explorer",z=j+" "+R,L="Opera",K=L+" Mini",V="Edge",G="Microsoft "+V,H="Firefox",X=H+" "+M,q="Nintendo",Y="PlayStation",J="Xbox",Q=S+" "+R,Z=R+" "+I,ee="Windows",re=ee+" Phone",ne="Nokia",te="Ouya",ie="Generic",oe=ie+" "+R.toLowerCase(),ae=ie+" "+k.toLowerCase(),ue="Konqueror",le="(\\d+(\\.\\d+)?)",se=new RegExp("Version/"+le),ce=new RegExp(J,"i"),fe=new RegExp(Y+" \\w+","i"),ve=new RegExp(q+" \\w+","i"),de=new RegExp(U+"|PlayBook|BB10","i"),he={"NT3.51":"NT 3.11","NT4.0":"NT 4.0","5.0":"2000",5.1:"XP",5.2:"XP","6.0":"Vista",6.1:"7",6.2:"8",6.3:"8.1",6.4:"10","10.0":"10"};var pe=(e,r)=>r&&c(r,O)||function(e){return c(e,I)&&!c(e,C)&&!c(e,S)}(e),ge=function(e,r){return r=r||"",c(e," OPR/")&&c(e,"Mini")?K:c(e," OPR/")?L:de.test(e)?U:c(e,"IE"+R)||c(e,"WPDesktop")?z:c(e,T)?D:c(e,V)||c(e,"Edg/")?G:c(e,"FBIOS")?"Facebook "+R:c(e,"UCWEB")||c(e,"UCBrowser")?"UC Browser":c(e,"CriOS")?W:c(e,"CrMo")||c(e,C)?C:c(e,S)&&c(e,I)?Q:c(e,"FxiOS")?X:c(e.toLowerCase(),ue.toLowerCase())?ue:pe(e,r)?c(e,R)?Z:I:c(e,H)?H:c(e,"MSIE")||c(e,"Trident/")?j:c(e,"Gecko")?H:""},we={[z]:[new RegExp("rv:"+le)],[G]:[new RegExp(V+"?\\/"+le)],[C]:[new RegExp("("+C+"|CrMo)\\/"+le)],[W]:[new RegExp("CriOS\\/"+le)],"UC Browser":[new RegExp("(UCBrowser|UCWEB)\\/"+le)],[I]:[se],[Z]:[se],[L]:[new RegExp("(Opera|OPR)\\/"+le)],[H]:[new RegExp(H+"\\/"+le)],[X]:[new RegExp("FxiOS\\/"+le)],[ue]:[new RegExp("Konqueror[:/]?"+le,"i")],[U]:[new RegExp(U+" "+le),se],[Q]:[new RegExp("android\\s"+le,"i")],[D]:[new RegExp(T+"\\/"+le)],[j]:[new RegExp("(rv:|MSIE )"+le)],Mozilla:[new RegExp("rv:"+le)]},me=function(e,r){var n=ge(e,r),t=we[n];if(m(t))return null;for(var i=0;i<t.length;i++){var o=t[i],a=e.match(o);if(a)return parseFloat(a[a.length-2])}return null},_e=[[new RegExp(J+"; "+J+" (.*?)[);]","i"),e=>[J,e&&e[1]||""]],[new RegExp(q,"i"),[q,""]],[new RegExp(Y,"i"),[Y,""]],[de,[U,""]],[new RegExp(ee,"i"),(e,r)=>{if(/Phone/.test(r)||/WPDesktop/.test(r))return[re,""];if(new RegExp(R).test(r)&&!/IEMobile\b/.test(r))return[ee+" "+R,""];var n=/Windows NT ([0-9.]+)/i.exec(r);if(n&&n[1]){var t=n[1],i=he[t]||"";return/arm/i.test(r)&&(i="RT"),[ee,i]}return[ee,""]}],[/((iPhone|iPad|iPod).*?OS (\d+)_(\d+)_?(\d+)?|iPhone)/,e=>{if(e&&e[3]){var r=[e[3],e[4],e[5]||"0"];return[M,r.join(".")]}return[M,""]}],[/(watch.*\/(\d+\.\d+\.\d+)|watch os,(\d+\.\d+),)/i,e=>{var r="";return e&&e.length>=3&&(r=m(e[2])?e[3]:e[2]),["watchOS",r]}],[new RegExp("("+S+" (\\d+)\\.(\\d+)\\.?(\\d+)?|"+S+")","i"),e=>{if(e&&e[2]){var r=[e[2],e[3],e[4]||"0"];return[S,r.join(".")]}return[S,""]}],[/Mac OS X (\d+)[_.](\d+)[_.]?(\d+)?/i,e=>{var r=["Mac OS X",""];if(e&&e[1]){var n=[e[1],e[2],e[3]||"0"];r[1]=n.join(".")}return r}],[/Mac/i,["Mac OS X",""]],[/CrOS/,[F,""]],[/Linux|debian/i,["Linux",""]]],be=function(e){return ve.test(e)?q:fe.test(e)?Y:ce.test(e)?J:new RegExp(te,"i").test(e)?te:new RegExp("("+re+"|WPDesktop)","i").test(e)?re:/iPad/.test(e)?A:/iPod/.test(e)?"iPod Touch":/iPhone/.test(e)?"iPhone":/(watch)(?: ?os[,/]|\d,\d\/)[\d.]+/i.test(e)?B:de.test(e)?U:/(kobo)\s(ereader|touch)/i.test(e)?"Kobo":new RegExp(ne,"i").test(e)?ne:/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i.test(e)||/(kf[a-z]+)( bui|\)).+silk\//i.test(e)?"Kindle Fire":/(Android|ZTE)/i.test(e)?new RegExp(R).test(e)&&!/(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(e)||/pixel[\daxl ]{1,6}/i.test(e)&&!/pixel c/i.test(e)||/(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(e)||/lmy47v/i.test(e)&&!/QTAQZ3/i.test(e)?S:P:new RegExp("(pda|"+R+")","i").test(e)?oe:new RegExp(k,"i").test(e)&&!new RegExp(k+" pc","i").test(e)?ae:""},xe=function(r,n){var{debugEnabled:t}=void 0===n?{}:n,i={p:function(n){if(e&&(u.POSTHOG_DEBUG||t)&&!m(e.console)&&e.console){for(var i=("__rrweb_original__"in e.console[n]?e.console[n].__rrweb_original__:e.console[n]),o=arguments.length,a=new Array(o>1?o-1:0),l=1;l<o;l++)a[l-1]=arguments[l];i(r,...a)}},info:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("log",...r)},warn:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("warn",...r)},error:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("error",...r)},critical:function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];console.error(r,...n)},uninitializedWarning:e=>{i.error("You must initialize PostHog before calling "+e)},createLogger:(e,n)=>xe(r+" "+e,n)};return i},ye=xe("[PostHog.js]"),Ee=ye.createLogger,Re={};function $e(e,r,t){if(p(e))if(n&&e.forEach===n)e.forEach(r,t);else if("length"in e&&e.length===+e.length)for(var i=0,o=e.length;i<o;i++)if(i in e&&r.call(t,e[i],i)===Re)return}function Me(e,r,n){if(!_(e)){if(p(e))return $e(e,r,n);if(x(e)){for(var t of e.entries())if(r.call(n,t[1],t[0])===Re)return}else for(var i in e)if(d.call(e,i)&&r.call(n,e[i],i)===Re)return}}var Se=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){for(var n in r)void 0!==r[n]&&(e[n]=r[n])})),e},ke=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){$e(r,(function(r){e.push(r)}))})),e},Pe=function(e){var r={};return Me(e,(function(e,n){var t;t=e,("[object String]"==h.call(t)&&e.length>0||b(e))&&(r[n]=e)})),r},Ae=e=>{var r=null==i?void 0:i.createElement("a");return m(r)?null:(r.href=e,r)},Oe=function(e,r){for(var n,t=((e.split("#")[0]||"").split(/\?(.*)/)[1]||"").replace(/^\?+/g,"").split("&"),i=0;i<t.length;i++){var o=t[i].split("=");if(o[0]===r){n=o;break}}if(!p(n)||n.length<2)return"";var a=n[1];try{a=decodeURIComponent(a)}catch(e){ye.error("Skipping decoding for malformed query param: "+a)}return a.replace(/\+/g," ")},Be=function(e,r,n){if(!e||!r||!r.length)return e;for(var t=e.split("#"),i=t[0]||"",o=t[1],a=i.split("?"),u=a[1],l=a[0],s=(u||"").split("&"),c=[],f=0;f<s.length;f++){var v=s[f].split("=");p(v)&&(r.includes(v[0])?c.push(v[0]+"="+n):c.push(s[f]))}var d=l;return null!=u&&(d+="?"+c.join("&")),null!=o&&(d+="#"+o),d};Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Number.isInteger||(Number.isInteger=function(e){return b(e)&&isFinite(e)&&Math.floor(e)===e});var Ie="0123456789abcdef";class Ue{constructor(e){if(this.bytes=e,16!==e.length)throw new TypeError("not 128-bit length")}static fromFieldsV7(e,r,n,t){if(!Number.isInteger(e)||!Number.isInteger(r)||!Number.isInteger(n)||!Number.isInteger(t)||e<0||r<0||n<0||t<0||e>0xffffffffffff||r>4095||n>1073741823||t>4294967295)throw new RangeError("invalid field value");var i=new Uint8Array(16);return i[0]=e/Math.pow(2,40),i[1]=e/Math.pow(2,32),i[2]=e/Math.pow(2,24),i[3]=e/Math.pow(2,16),i[4]=e/Math.pow(2,8),i[5]=e,i[6]=112|r>>>8,i[7]=r,i[8]=128|n>>>24,i[9]=n>>>16,i[10]=n>>>8,i[11]=n,i[12]=t>>>24,i[13]=t>>>16,i[14]=t>>>8,i[15]=t,new Ue(i)}toString(){for(var e="",r=0;r<this.bytes.length;r++)e=e+Ie.charAt(this.bytes[r]>>>4)+Ie.charAt(15&this.bytes[r]),3!==r&&5!==r&&7!==r&&9!==r||(e+="-");if(36!==e.length)throw new Error("Invalid UUIDv7 was generated");return e}clone(){return new Ue(this.bytes.slice(0))}equals(e){return 0===this.compareTo(e)}compareTo(e){for(var r=0;r<16;r++){var n=this.bytes[r]-e.bytes[r];if(0!==n)return Math.sign(n)}return 0}}class Ne{constructor(){this.m=0,this.R=0,this.$=new Ce}generate(){var e=this.generateOrAbort();if(m(e)){this.m=0;var r=this.generateOrAbort();if(m(r))throw new Error("Could not generate UUID after timestamp reset");return r}return e}generateOrAbort(){var e=Date.now();if(e>this.m)this.m=e,this.M();else{if(!(e+1e4>this.m))return;this.R++,this.R>4398046511103&&(this.m++,this.M())}return Ue.fromFieldsV7(this.m,Math.trunc(this.R/Math.pow(2,30)),this.R&Math.pow(2,30)-1,this.$.nextUint32())}M(){this.R=1024*this.$.nextUint32()+(1023&this.$.nextUint32())}}var Te,De=e=>{if("undefined"!=typeof UUIDV7_DENY_WEAK_RNG&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");for(var r=0;r<e.length;r++)e[r]=65536*Math.trunc(65536*Math.random())+Math.trunc(65536*Math.random());return e};e&&!m(e.crypto)&&crypto.getRandomValues&&(De=e=>crypto.getRandomValues(e));class Ce{constructor(){this.S=new Uint32Array(8),this.k=1/0}nextUint32(){return this.k>=this.S.length&&(De(this.S),this.k=0),this.S[this.k++]}}var Fe=()=>We().toString(),We=()=>(Te||(Te=new Ne)).generate(),je="";var ze=/[a-z0-9][a-z0-9-]+\.[a-z]{2,}$/i;function Le(e,r){if(r){var n=function(e,r){if(void 0===r&&(r=i),je)return je;if(!r)return"";if(["localhost","127.0.0.1"].includes(e))return"";for(var n=e.split("."),t=Math.min(n.length,8),o="dmn_chk_"+Fe();!je&&t--;){var a=n.slice(t).join("."),u=o+"=1;domain=."+a+";path=/";r.cookie=u+";max-age=3",r.cookie.includes(o)&&(r.cookie=u+";max-age=0",je=a)}return je}(e);if(!n){var t=(e=>{var r=e.match(ze);return r?r[0]:""})(e);t!==n&&ye.info("Warning: cookie subdomain discovery mismatch",t,n),n=t}return n?"; domain=."+n:""}return""}var Ke={P:()=>!!i,A:function(e){ye.error("cookieStore error: "+e)},O:function(e){if(i){try{for(var r=e+"=",n=i.cookie.split(";").filter((e=>e.length)),t=0;t<n.length;t++){for(var o=n[t];" "==o.charAt(0);)o=o.substring(1,o.length);if(0===o.indexOf(r))return decodeURIComponent(o.substring(r.length,o.length))}}catch(e){}return null}},B:function(e){var r;try{r=JSON.parse(Ke.O(e))||{}}catch(e){}return r},I:function(e,r,n,t,o){if(i)try{var a="",u="",l=Le(i.location.hostname,t);if(n){var s=new Date;s.setTime(s.getTime()+24*n*60*60*1e3),a="; expires="+s.toUTCString()}o&&(u="; secure");var c=e+"="+encodeURIComponent(JSON.stringify(r))+a+"; SameSite=Lax; path=/"+l+u;return c.length>3686.4&&ye.warn("cookieStore warning: large cookie, len="+c.length),i.cookie=c,c}catch(e){return}},U:function(e,r){if(null!=i&&i.cookie)try{Ke.I(e,"",-1,r)}catch(e){return}}},Ve=["gclid","gclsrc","dclid","gbraid","wbraid","fbclid","msclkid","twclid","li_fat_id","igshid","ttclid","rdt_cid","epik","qclid","sccid","irclid","_kx"],Ge=ke(["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gad_source","mc_cid"],Ve),He=["$app_build","$app_name","$app_namespace","$app_version","$browser","$browser_version","$device_type","$current_url","$pathname","$os","$os_name","$os_version","$referring_domain","$referrer","$screen_height","$screen_width","$viewport_height","$viewport_width","$raw_user_agent"],Xe="<masked>",qe=["li_fat_id"];function Ye(e,r,n){if(!i)return{};var t,o,a,u,l=r?ke([],Ve,n||[]):[],s=(t=Be(i.URL,l,Xe),o=e,a=Ge.concat(o||[]),u={},Me(a,(function(e){var r=Oe(t,e);u[e]=r||null})),u),c=function(){var e={};return Me(qe,(function(r){var n=Ke.O(r);e[r]=n||null})),e}();return Se(c,s)}function Je(){return navigator.language||navigator.userLanguage}function Qe(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch(e){return}}function Ze(){try{return(new Date).getTimezoneOffset()}catch(e){return}}function er(r,n){var t,i;if(!a)return{};var u,s,c=r?ke([],Ve,n||[]):[],[f,v]=function(e){for(var r=0;r<_e.length;r++){var[n,t]=_e[r],i=n.exec(e),o=i&&("function"==typeof t?t(i,e):t);if(o)return o}return["",""]}(a),d=(u=be(a))===A||u===P||"Kobo"===u||"Kindle Fire"===u||u===ae?k:u===q||u===J||u===Y||u===te?"Console":u===B?"Wearable":u?R:"Desktop";if("Desktop"===d&&"Android"===(null==(t=navigator)||null==(t=t.userAgentData)?void 0:t.platform)&&(null==(i=navigator)?void 0:i.maxTouchPoints)>0){var h,p,g,w,m,_=null!==(h=null==e||null==(p=e.screen)?void 0:p.width)&&void 0!==h?h:0,b=null!==(g=null==e||null==(w=e.screen)?void 0:w.height)&&void 0!==g?g:0;d=Math.min(_,b)/(null!==(m=null==e?void 0:e.devicePixelRatio)&&void 0!==m?m:1)>=600?"Tablet":"Mobile"}return Se(Pe({$os:f,$os_version:v,$browser:ge(a,navigator.vendor),$device:be(a),$device_type:d,$timezone:Qe(),$timezone_offset:Ze()}),{$current_url:Be(null==o?void 0:o.href,c,Xe),$host:null==o?void 0:o.host,$pathname:null==o?void 0:o.pathname,$raw_user_agent:a.length>1e3?a.substring(0,997)+"...":a,$browser_version:me(a,navigator.vendor),$browser_language:Je(),$browser_language_prefix:(s=Je(),"string"==typeof s?s.split("-")[0]:void 0),$screen_height:null==e?void 0:e.screen.height,$screen_width:null==e?void 0:e.screen.width,$viewport_height:null==e?void 0:e.innerHeight,$viewport_width:null==e?void 0:e.innerWidth,$lib:"web",$lib_version:l.LIB_VERSION,$insert_id:Math.random().toString(36).substring(2,10)+Math.random().toString(36).substring(2,10),$time:Date.now()/1e3})}function rr(e,r){return[...e||[],...p(r)?r:[r]]}function nr(e,r){return(m(e)?1:e)*r}function tr(e,r){return function(e){for(var r=0,n=0;n<e.length;n++)r=(r<<5)-r+e.charCodeAt(n),r|=0;return Math.abs(r)}(e)%100<y(100*r,0,100,ye)}var ir=["type"];function or(e){var{type:r,executionTimeMs:n}=e;return""+r+(_(n)?"":" ("+n.toFixed(2)+"ms)")}var ar=Ee("[PostHog Action RateLimiting]");function ur(e,r){console.log(e,r)}function lr(e,r,n){if(void 0===n&&(n=5),"object"!=typeof e||"object"!=typeof r)return{};if(e===r)return{};if(!e&&r)return r;if(!r||!e)return{};var t={},i=new Set([...Object.keys(e),...Object.keys(r)]);for(var o of i){var a=e[o],u=r[o];if(m(a))t[o]=u;else if(m(u))t[o]=a;else if(!(a===u||_(a)&&_(u)))if(g(a)&&g(u))if(n>1){var l=lr(a,u,n-1);w(l)||(t[o]=l)}else t[o]="max depth reached, checking for changed value";else t[o]=u}return t}var sr,cr,fr,vr=(sr=null,cr=0,fr=null,{info:e=>{fr!==e&&(cr=0,fr=e),cr++,sr&&clearTimeout(sr),sr=setTimeout((()=>{var r=cr;1===r?ar.info('action "'+e+'" has been rate limited'):ar.info('action "'+e+'" has been rate limited ('+r+" times)"),cr=0,sr=null}),1e3)}});function dr(e){void 0===e&&(e={});var{maskAction:r,maskState:n,titleFunction:t=or,logger:i=ur,include:o={prevState:!0,nextState:!1,changedState:!0},rateLimiterRefillRate:a=1,rateLimiterBucketSize:u=10,__stateComparisonDepth:l}=e,s=new E({refillRate:a,bucketSize:u,refillInterval:1e3,u:ar});return e=>a=>u=>{var c=u,f=e.getState(),v=performance.now(),d=a(c),h=performance.now()-v,p=e.getState(),g=r?r(c):c;if(!g)return d;if(s.consumeRateLimit(c.type))vr.info(c.type);else try{var w=n?n(f,g):f,m=n?n(p,g):p,_=o.changedState?lr(w,m,null!=l?l:5):void 0,{type:b}=g,x={type:b,payload:function(e,r){if(null==e)return{};var n={};for(var t in e)if({}.hasOwnProperty.call(e,t)){if(-1!==r.indexOf(t))continue;n[t]=e[t]}return n}(g,ir),timestamp:Date.now(),executionTimeMs:h,prevState:o.prevState?w:void 0,nextState:o.nextState?m:void 0,changedState:o.changedState?_:void 0},y=t(x);i(y,x)}catch(e){ar.error("Error logging state:",e)}return d}}var hr=Object.freeze({__proto__:null,browserConsoleLogger:ur,posthogKeaLogger:function(e){void 0===e&&(e={});var r=dr(e);return{name:"posthog-kea-logger",events:{beforeReduxStore(e){e.middleware.push(r)}}}},posthogReduxLogger:dr,printAndDropEverything:e=>(console.log("Would have sent event:",e),null),sampleByDistinctId:function(e){return r=>r&&tr(r.properties.distinct_id,e)?s({},r,{properties:s({},r.properties,{$sample_type:["sampleByDistinctId"],$sample_threshold:e})}):null},sampleByEvent:function(e,r){return n=>{var t,i,o;return n?c(e,n.event)?100*Math.random()<y(100*r,0,100,ye)?s({},n,{properties:s({},n.properties,{$sample_type:rr(null==(t=n.properties)?void 0:t.$sample_type,"sampleByEvent"),$sample_threshold:nr(null==(i=n.properties)?void 0:i.$sample_threshold,r),$sampled_events:rr(null==(o=n.properties)?void 0:o.$sampled_events,e)})}):null:n:null}},sampleBySessionId:function(e){return r=>r&&tr(r.properties.$session_id,e)?s({},r,{properties:s({},r.properties,{$sample_type:rr(r.properties.$sample_type,"sampleBySessionId"),$sample_threshold:nr(r.properties.$sample_threshold,e)})}):null},sessionRecordingLoggerForPostHogInstance:e=>(r,n)=>{var t;null==e||null==(t=e.sessionRecording)||t.tryAddCustomEvent("app-state",{title:r,stateEvent:n})},setAllPersonProfilePropertiesAsPersonPropertiesForFlags:e=>{var r,n=Se({},er(e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),Ye(e.config.custom_campaign_params,e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),{$referrer:(null==i?void 0:i.referrer)||"$direct",$referring_domain:null!=i&&i.referrer&&(null==(r=Ae(i.referrer))?void 0:r.host)||"$direct"}),t={};Me(n,(function(e,r){(c(Ge,r)||c(He,r))&&(t[r]=e)})),e.setPersonPropertiesForFlags(t)}});u.posthogCustomizations=hr}(); | ||
| !function(){"use strict";var e="undefined"!=typeof window?window:void 0,r="undefined"!=typeof globalThis?globalThis:e;"undefined"==typeof self&&(r.self=r),"undefined"==typeof File&&(r.File=function(){});var n=Array.prototype.forEach,t=null==r?void 0:r.navigator,i=null==r?void 0:r.document,o=null==r?void 0:r.location;null==r||r.fetch,null!=r&&r.XMLHttpRequest&&"withCredentials"in new r.XMLHttpRequest&&r.XMLHttpRequest,null==r||r.AbortController;var a=null==t?void 0:t.userAgent,u=null!=e?e:{},l={LIB_VERSION:"1.356.1"};function s(){return s=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},s.apply(null,arguments)}function c(e,r){return-1!==e.indexOf(r)}var f=Array.isArray,v=Object.prototype,d=v.hasOwnProperty,h=v.toString,p=f||function(e){return"[object Array]"===h.call(e)},g=e=>e===Object(e)&&!p(e),w=e=>{if(g(e)){for(var r in e)if(d.call(e,r))return!1;return!0}return!1},m=e=>void 0===e,_=e=>m(e)||(e=>null===e)(e),b=e=>"[object Number]"==h.call(e)&&e==e,x=e=>e instanceof FormData;function y(e,r,n,t,i){return r>n&&(t.warn("min cannot be greater than max."),r=n),b(e)?e>n?(t.warn(" cannot be greater than max: "+n+". Using max value instead."),n):e<r?(t.warn(" cannot be less than min: "+r+". Using min value instead."),r):e:(t.warn(" must be a number. using max or fallback. max: "+n+", fallback: "+i),y(n,r,n,t))}class E{constructor(e){this.t={},this.i=e.i,this.o=y(e.bucketSize,0,100,e.u),this.l=y(e.refillRate,0,this.o,e.u),this.v=y(e.refillInterval,0,864e5,e.u)}h(e,r){var n=r-e.lastAccess,t=Math.floor(n/this.v);if(t>0){var i=t*this.l;e.tokens=Math.min(e.tokens+i,this.o),e.lastAccess=e.lastAccess+t*this.v}}consumeRateLimit(e){var r,n=Date.now(),t=String(e),i=this.t[t];return i?this.h(i,n):(i={tokens:this.o,lastAccess:n},this.t[t]=i),0===i.tokens||(i.tokens--,0===i.tokens&&(null==(r=this.i)||r.call(this,e)),0===i.tokens)}stop(){this.t={}}}var R="Mobile",M="iOS",S="Android",k="Tablet",P=S+" "+k,A="iPad",O="Apple",B=O+" Watch",I="Safari",U="BlackBerry",N="Samsung",T=N+"Browser",D=N+" Internet",C="Chrome",F=C+" OS",W=C+" "+M,j="Internet Explorer",z=j+" "+R,L="Opera",K=L+" Mini",V="Edge",G="Microsoft "+V,H="Firefox",X=H+" "+M,q="Nintendo",Y="PlayStation",J="Xbox",Q=S+" "+R,Z=R+" "+I,ee="Windows",re=ee+" Phone",ne="Nokia",te="Ouya",ie="Generic",oe=ie+" "+R.toLowerCase(),ae=ie+" "+k.toLowerCase(),ue="Konqueror",le="(\\d+(\\.\\d+)?)",se=new RegExp("Version/"+le),ce=new RegExp(J,"i"),fe=new RegExp(Y+" \\w+","i"),ve=new RegExp(q+" \\w+","i"),de=new RegExp(U+"|PlayBook|BB10","i"),he={"NT3.51":"NT 3.11","NT4.0":"NT 4.0","5.0":"2000",5.1:"XP",5.2:"XP","6.0":"Vista",6.1:"7",6.2:"8",6.3:"8.1",6.4:"10","10.0":"10"};var pe=(e,r)=>r&&c(r,O)||function(e){return c(e,I)&&!c(e,C)&&!c(e,S)}(e),ge=function(e,r){return r=r||"",c(e," OPR/")&&c(e,"Mini")?K:c(e," OPR/")?L:de.test(e)?U:c(e,"IE"+R)||c(e,"WPDesktop")?z:c(e,T)?D:c(e,V)||c(e,"Edg/")?G:c(e,"FBIOS")?"Facebook "+R:c(e,"UCWEB")||c(e,"UCBrowser")?"UC Browser":c(e,"CriOS")?W:c(e,"CrMo")||c(e,C)?C:c(e,S)&&c(e,I)?Q:c(e,"FxiOS")?X:c(e.toLowerCase(),ue.toLowerCase())?ue:pe(e,r)?c(e,R)?Z:I:c(e,H)?H:c(e,"MSIE")||c(e,"Trident/")?j:c(e,"Gecko")?H:""},we={[z]:[new RegExp("rv:"+le)],[G]:[new RegExp(V+"?\\/"+le)],[C]:[new RegExp("("+C+"|CrMo)\\/"+le)],[W]:[new RegExp("CriOS\\/"+le)],"UC Browser":[new RegExp("(UCBrowser|UCWEB)\\/"+le)],[I]:[se],[Z]:[se],[L]:[new RegExp("(Opera|OPR)\\/"+le)],[H]:[new RegExp(H+"\\/"+le)],[X]:[new RegExp("FxiOS\\/"+le)],[ue]:[new RegExp("Konqueror[:/]?"+le,"i")],[U]:[new RegExp(U+" "+le),se],[Q]:[new RegExp("android\\s"+le,"i")],[D]:[new RegExp(T+"\\/"+le)],[j]:[new RegExp("(rv:|MSIE )"+le)],Mozilla:[new RegExp("rv:"+le)]},me=function(e,r){var n=ge(e,r),t=we[n];if(m(t))return null;for(var i=0;i<t.length;i++){var o=t[i],a=e.match(o);if(a)return parseFloat(a[a.length-2])}return null},_e=[[new RegExp(J+"; "+J+" (.*?)[);]","i"),e=>[J,e&&e[1]||""]],[new RegExp(q,"i"),[q,""]],[new RegExp(Y,"i"),[Y,""]],[de,[U,""]],[new RegExp(ee,"i"),(e,r)=>{if(/Phone/.test(r)||/WPDesktop/.test(r))return[re,""];if(new RegExp(R).test(r)&&!/IEMobile\b/.test(r))return[ee+" "+R,""];var n=/Windows NT ([0-9.]+)/i.exec(r);if(n&&n[1]){var t=n[1],i=he[t]||"";return/arm/i.test(r)&&(i="RT"),[ee,i]}return[ee,""]}],[/((iPhone|iPad|iPod).*?OS (\d+)_(\d+)_?(\d+)?|iPhone)/,e=>{if(e&&e[3]){var r=[e[3],e[4],e[5]||"0"];return[M,r.join(".")]}return[M,""]}],[/(watch.*\/(\d+\.\d+\.\d+)|watch os,(\d+\.\d+),)/i,e=>{var r="";return e&&e.length>=3&&(r=m(e[2])?e[3]:e[2]),["watchOS",r]}],[new RegExp("("+S+" (\\d+)\\.(\\d+)\\.?(\\d+)?|"+S+")","i"),e=>{if(e&&e[2]){var r=[e[2],e[3],e[4]||"0"];return[S,r.join(".")]}return[S,""]}],[/Mac OS X (\d+)[_.](\d+)[_.]?(\d+)?/i,e=>{var r=["Mac OS X",""];if(e&&e[1]){var n=[e[1],e[2],e[3]||"0"];r[1]=n.join(".")}return r}],[/Mac/i,["Mac OS X",""]],[/CrOS/,[F,""]],[/Linux|debian/i,["Linux",""]]],be=function(e){return ve.test(e)?q:fe.test(e)?Y:ce.test(e)?J:new RegExp(te,"i").test(e)?te:new RegExp("("+re+"|WPDesktop)","i").test(e)?re:/iPad/.test(e)?A:/iPod/.test(e)?"iPod Touch":/iPhone/.test(e)?"iPhone":/(watch)(?: ?os[,/]|\d,\d\/)[\d.]+/i.test(e)?B:de.test(e)?U:/(kobo)\s(ereader|touch)/i.test(e)?"Kobo":new RegExp(ne,"i").test(e)?ne:/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i.test(e)||/(kf[a-z]+)( bui|\)).+silk\//i.test(e)?"Kindle Fire":/(Android|ZTE)/i.test(e)?new RegExp(R).test(e)&&!/(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(e)||/pixel[\daxl ]{1,6}/i.test(e)&&!/pixel c/i.test(e)||/(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(e)||/lmy47v/i.test(e)&&!/QTAQZ3/i.test(e)?S:P:new RegExp("(pda|"+R+")","i").test(e)?oe:new RegExp(k,"i").test(e)&&!new RegExp(k+" pc","i").test(e)?ae:""},xe=function(r,n){var{debugEnabled:t}=void 0===n?{}:n,i={p:function(n){if(e&&(u.POSTHOG_DEBUG||t)&&!m(e.console)&&e.console){for(var i=("__rrweb_original__"in e.console[n]?e.console[n].__rrweb_original__:e.console[n]),o=arguments.length,a=new Array(o>1?o-1:0),l=1;l<o;l++)a[l-1]=arguments[l];i(r,...a)}},info:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("log",...r)},warn:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("warn",...r)},error:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("error",...r)},critical:function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];console.error(r,...n)},uninitializedWarning:e=>{i.error("You must initialize PostHog before calling "+e)},createLogger:(e,n)=>xe(r+" "+e,n)};return i},ye=xe("[PostHog.js]"),Ee=ye.createLogger,Re={};function $e(e,r,t){if(p(e))if(n&&e.forEach===n)e.forEach(r,t);else if("length"in e&&e.length===+e.length)for(var i=0,o=e.length;i<o;i++)if(i in e&&r.call(t,e[i],i)===Re)return}function Me(e,r,n){if(!_(e)){if(p(e))return $e(e,r,n);if(x(e)){for(var t of e.entries())if(r.call(n,t[1],t[0])===Re)return}else for(var i in e)if(d.call(e,i)&&r.call(n,e[i],i)===Re)return}}var Se=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){for(var n in r)void 0!==r[n]&&(e[n]=r[n])})),e},ke=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){$e(r,(function(r){e.push(r)}))})),e},Pe=function(e){var r={};return Me(e,(function(e,n){var t;t=e,("[object String]"==h.call(t)&&e.length>0||b(e))&&(r[n]=e)})),r},Ae=e=>{var r=null==i?void 0:i.createElement("a");return m(r)?null:(r.href=e,r)},Oe=function(e,r){for(var n,t=((e.split("#")[0]||"").split(/\?(.*)/)[1]||"").replace(/^\?+/g,"").split("&"),i=0;i<t.length;i++){var o=t[i].split("=");if(o[0]===r){n=o;break}}if(!p(n)||n.length<2)return"";var a=n[1];try{a=decodeURIComponent(a)}catch(e){ye.error("Skipping decoding for malformed query param: "+a)}return a.replace(/\+/g," ")},Be=function(e,r,n){if(!e||!r||!r.length)return e;for(var t=e.split("#"),i=t[0]||"",o=t[1],a=i.split("?"),u=a[1],l=a[0],s=(u||"").split("&"),c=[],f=0;f<s.length;f++){var v=s[f].split("=");p(v)&&(r.includes(v[0])?c.push(v[0]+"="+n):c.push(s[f]))}var d=l;return null!=u&&(d+="?"+c.join("&")),null!=o&&(d+="#"+o),d};Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Number.isInteger||(Number.isInteger=function(e){return b(e)&&isFinite(e)&&Math.floor(e)===e});var Ie="0123456789abcdef";class Ue{constructor(e){if(this.bytes=e,16!==e.length)throw new TypeError("not 128-bit length")}static fromFieldsV7(e,r,n,t){if(!Number.isInteger(e)||!Number.isInteger(r)||!Number.isInteger(n)||!Number.isInteger(t)||e<0||r<0||n<0||t<0||e>0xffffffffffff||r>4095||n>1073741823||t>4294967295)throw new RangeError("invalid field value");var i=new Uint8Array(16);return i[0]=e/Math.pow(2,40),i[1]=e/Math.pow(2,32),i[2]=e/Math.pow(2,24),i[3]=e/Math.pow(2,16),i[4]=e/Math.pow(2,8),i[5]=e,i[6]=112|r>>>8,i[7]=r,i[8]=128|n>>>24,i[9]=n>>>16,i[10]=n>>>8,i[11]=n,i[12]=t>>>24,i[13]=t>>>16,i[14]=t>>>8,i[15]=t,new Ue(i)}toString(){for(var e="",r=0;r<this.bytes.length;r++)e=e+Ie.charAt(this.bytes[r]>>>4)+Ie.charAt(15&this.bytes[r]),3!==r&&5!==r&&7!==r&&9!==r||(e+="-");if(36!==e.length)throw new Error("Invalid UUIDv7 was generated");return e}clone(){return new Ue(this.bytes.slice(0))}equals(e){return 0===this.compareTo(e)}compareTo(e){for(var r=0;r<16;r++){var n=this.bytes[r]-e.bytes[r];if(0!==n)return Math.sign(n)}return 0}}class Ne{constructor(){this.m=0,this.R=0,this.$=new Ce}generate(){var e=this.generateOrAbort();if(m(e)){this.m=0;var r=this.generateOrAbort();if(m(r))throw new Error("Could not generate UUID after timestamp reset");return r}return e}generateOrAbort(){var e=Date.now();if(e>this.m)this.m=e,this.M();else{if(!(e+1e4>this.m))return;this.R++,this.R>4398046511103&&(this.m++,this.M())}return Ue.fromFieldsV7(this.m,Math.trunc(this.R/Math.pow(2,30)),this.R&Math.pow(2,30)-1,this.$.nextUint32())}M(){this.R=1024*this.$.nextUint32()+(1023&this.$.nextUint32())}}var Te,De=e=>{if("undefined"!=typeof UUIDV7_DENY_WEAK_RNG&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");for(var r=0;r<e.length;r++)e[r]=65536*Math.trunc(65536*Math.random())+Math.trunc(65536*Math.random());return e};e&&!m(e.crypto)&&crypto.getRandomValues&&(De=e=>crypto.getRandomValues(e));class Ce{constructor(){this.S=new Uint32Array(8),this.k=1/0}nextUint32(){return this.k>=this.S.length&&(De(this.S),this.k=0),this.S[this.k++]}}var Fe=()=>We().toString(),We=()=>(Te||(Te=new Ne)).generate(),je="";var ze=/[a-z0-9][a-z0-9-]+\.[a-z]{2,}$/i;function Le(e,r){if(r){var n=function(e,r){if(void 0===r&&(r=i),je)return je;if(!r)return"";if(["localhost","127.0.0.1"].includes(e))return"";for(var n=e.split("."),t=Math.min(n.length,8),o="dmn_chk_"+Fe();!je&&t--;){var a=n.slice(t).join("."),u=o+"=1;domain=."+a+";path=/";r.cookie=u+";max-age=3",r.cookie.includes(o)&&(r.cookie=u+";max-age=0",je=a)}return je}(e);if(!n){var t=(e=>{var r=e.match(ze);return r?r[0]:""})(e);t!==n&&ye.info("Warning: cookie subdomain discovery mismatch",t,n),n=t}return n?"; domain=."+n:""}return""}var Ke={P:()=>!!i,A:function(e){ye.error("cookieStore error: "+e)},O:function(e){if(i){try{for(var r=e+"=",n=i.cookie.split(";").filter((e=>e.length)),t=0;t<n.length;t++){for(var o=n[t];" "==o.charAt(0);)o=o.substring(1,o.length);if(0===o.indexOf(r))return decodeURIComponent(o.substring(r.length,o.length))}}catch(e){}return null}},B:function(e){var r;try{r=JSON.parse(Ke.O(e))||{}}catch(e){}return r},I:function(e,r,n,t,o){if(i)try{var a="",u="",l=Le(i.location.hostname,t);if(n){var s=new Date;s.setTime(s.getTime()+24*n*60*60*1e3),a="; expires="+s.toUTCString()}o&&(u="; secure");var c=e+"="+encodeURIComponent(JSON.stringify(r))+a+"; SameSite=Lax; path=/"+l+u;return c.length>3686.4&&ye.warn("cookieStore warning: large cookie, len="+c.length),i.cookie=c,c}catch(e){return}},U:function(e,r){if(null!=i&&i.cookie)try{Ke.I(e,"",-1,r)}catch(e){return}}},Ve=["gclid","gclsrc","dclid","gbraid","wbraid","fbclid","msclkid","twclid","li_fat_id","igshid","ttclid","rdt_cid","epik","qclid","sccid","irclid","_kx"],Ge=ke(["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gad_source","mc_cid"],Ve),He=["$app_build","$app_name","$app_namespace","$app_version","$browser","$browser_version","$device_type","$current_url","$pathname","$os","$os_name","$os_version","$referring_domain","$referrer","$screen_height","$screen_width","$viewport_height","$viewport_width","$raw_user_agent"],Xe="<masked>",qe=["li_fat_id"];function Ye(e,r,n){if(!i)return{};var t,o,a,u,l=r?ke([],Ve,n||[]):[],s=(t=Be(i.URL,l,Xe),o=e,a=Ge.concat(o||[]),u={},Me(a,(function(e){var r=Oe(t,e);u[e]=r||null})),u),c=function(){var e={};return Me(qe,(function(r){var n=Ke.O(r);e[r]=n||null})),e}();return Se(c,s)}function Je(){return navigator.language||navigator.userLanguage}function Qe(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch(e){return}}function Ze(){try{return(new Date).getTimezoneOffset()}catch(e){return}}function er(r,n){var t,i;if(!a)return{};var u,s,c=r?ke([],Ve,n||[]):[],[f,v]=function(e){for(var r=0;r<_e.length;r++){var[n,t]=_e[r],i=n.exec(e),o=i&&("function"==typeof t?t(i,e):t);if(o)return o}return["",""]}(a),d=(u=be(a))===A||u===P||"Kobo"===u||"Kindle Fire"===u||u===ae?k:u===q||u===J||u===Y||u===te?"Console":u===B?"Wearable":u?R:"Desktop";if("Desktop"===d&&"Android"===(null==(t=navigator)||null==(t=t.userAgentData)?void 0:t.platform)&&(null==(i=navigator)?void 0:i.maxTouchPoints)>0){var h,p,g,w,m,_=null!==(h=null==e||null==(p=e.screen)?void 0:p.width)&&void 0!==h?h:0,b=null!==(g=null==e||null==(w=e.screen)?void 0:w.height)&&void 0!==g?g:0;d=Math.min(_,b)/(null!==(m=null==e?void 0:e.devicePixelRatio)&&void 0!==m?m:1)>=600?"Tablet":"Mobile"}return Se(Pe({$os:f,$os_version:v,$browser:ge(a,navigator.vendor),$device:be(a),$device_type:d,$timezone:Qe(),$timezone_offset:Ze()}),{$current_url:Be(null==o?void 0:o.href,c,Xe),$host:null==o?void 0:o.host,$pathname:null==o?void 0:o.pathname,$raw_user_agent:a.length>1e3?a.substring(0,997)+"...":a,$browser_version:me(a,navigator.vendor),$browser_language:Je(),$browser_language_prefix:(s=Je(),"string"==typeof s?s.split("-")[0]:void 0),$screen_height:null==e?void 0:e.screen.height,$screen_width:null==e?void 0:e.screen.width,$viewport_height:null==e?void 0:e.innerHeight,$viewport_width:null==e?void 0:e.innerWidth,$lib:"web",$lib_version:l.LIB_VERSION,$insert_id:Math.random().toString(36).substring(2,10)+Math.random().toString(36).substring(2,10),$time:Date.now()/1e3})}function rr(e,r){return[...e||[],...p(r)?r:[r]]}function nr(e,r){return(m(e)?1:e)*r}function tr(e,r){return function(e){for(var r=0,n=0;n<e.length;n++)r=(r<<5)-r+e.charCodeAt(n),r|=0;return Math.abs(r)}(e)%100<y(100*r,0,100,ye)}var ir=["type"];function or(e){var{type:r,executionTimeMs:n}=e;return""+r+(_(n)?"":" ("+n.toFixed(2)+"ms)")}var ar=Ee("[PostHog Action RateLimiting]");function ur(e,r){console.log(e,r)}function lr(e,r,n){if(void 0===n&&(n=5),"object"!=typeof e||"object"!=typeof r)return{};if(e===r)return{};if(!e&&r)return r;if(!r||!e)return{};var t={},i=new Set([...Object.keys(e),...Object.keys(r)]);for(var o of i){var a=e[o],u=r[o];if(m(a))t[o]=u;else if(m(u))t[o]=a;else if(!(a===u||_(a)&&_(u)))if(g(a)&&g(u))if(n>1){var l=lr(a,u,n-1);w(l)||(t[o]=l)}else t[o]="max depth reached, checking for changed value";else t[o]=u}return t}var sr,cr,fr,vr=(sr=null,cr=0,fr=null,{info:e=>{fr!==e&&(cr=0,fr=e),cr++,sr&&clearTimeout(sr),sr=setTimeout((()=>{var r=cr;1===r?ar.info('action "'+e+'" has been rate limited'):ar.info('action "'+e+'" has been rate limited ('+r+" times)"),cr=0,sr=null}),1e3)}});function dr(e){void 0===e&&(e={});var{maskAction:r,maskState:n,titleFunction:t=or,logger:i=ur,include:o={prevState:!0,nextState:!1,changedState:!0},rateLimiterRefillRate:a=1,rateLimiterBucketSize:u=10,__stateComparisonDepth:l}=e,s=new E({refillRate:a,bucketSize:u,refillInterval:1e3,u:ar});return e=>a=>u=>{var c=u,f=e.getState(),v=performance.now(),d=a(c),h=performance.now()-v,p=e.getState(),g=r?r(c):c;if(!g)return d;if(s.consumeRateLimit(c.type))vr.info(c.type);else try{var w=n?n(f,g):f,m=n?n(p,g):p,_=o.changedState?lr(w,m,null!=l?l:5):void 0,{type:b}=g,x={type:b,payload:function(e,r){if(null==e)return{};var n={};for(var t in e)if({}.hasOwnProperty.call(e,t)){if(-1!==r.indexOf(t))continue;n[t]=e[t]}return n}(g,ir),timestamp:Date.now(),executionTimeMs:h,prevState:o.prevState?w:void 0,nextState:o.nextState?m:void 0,changedState:o.changedState?_:void 0},y=t(x);i(y,x)}catch(e){ar.error("Error logging state:",e)}return d}}var hr=Object.freeze({__proto__:null,browserConsoleLogger:ur,posthogKeaLogger:function(e){void 0===e&&(e={});var r=dr(e);return{name:"posthog-kea-logger",events:{beforeReduxStore(e){e.middleware.push(r)}}}},posthogReduxLogger:dr,printAndDropEverything:e=>(console.log("Would have sent event:",e),null),sampleByDistinctId:function(e){return r=>r&&tr(r.properties.distinct_id,e)?s({},r,{properties:s({},r.properties,{$sample_type:["sampleByDistinctId"],$sample_threshold:e})}):null},sampleByEvent:function(e,r){return n=>{var t,i,o;return n?c(e,n.event)?100*Math.random()<y(100*r,0,100,ye)?s({},n,{properties:s({},n.properties,{$sample_type:rr(null==(t=n.properties)?void 0:t.$sample_type,"sampleByEvent"),$sample_threshold:nr(null==(i=n.properties)?void 0:i.$sample_threshold,r),$sampled_events:rr(null==(o=n.properties)?void 0:o.$sampled_events,e)})}):null:n:null}},sampleBySessionId:function(e){return r=>r&&tr(r.properties.$session_id,e)?s({},r,{properties:s({},r.properties,{$sample_type:rr(r.properties.$sample_type,"sampleBySessionId"),$sample_threshold:nr(r.properties.$sample_threshold,e)})}):null},sessionRecordingLoggerForPostHogInstance:e=>(r,n)=>{var t;null==e||null==(t=e.sessionRecording)||t.tryAddCustomEvent("app-state",{title:r,stateEvent:n})},setAllPersonProfilePropertiesAsPersonPropertiesForFlags:e=>{var r,n=Se({},er(e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),Ye(e.config.custom_campaign_params,e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),{$referrer:(null==i?void 0:i.referrer)||"$direct",$referring_domain:null!=i&&i.referrer&&(null==(r=Ae(i.referrer))?void 0:r.host)||"$direct"}),t={};Me(n,(function(e,r){(c(Ge,r)||c(He,r))&&(t[r]=e)})),e.setPersonPropertiesForFlags(t)}});u.posthogCustomizations=hr}(); | ||
| //# sourceMappingURL=customizations.full.js.map |
@@ -8,2 +8,3 @@ import { PostHog } from '../../../posthog-core'; | ||
| export declare const PAUSED = "paused"; | ||
| export declare const PENDING_CONFIG = "pending_config"; | ||
| export declare const LAZY_LOADING = "lazy_loading"; | ||
@@ -31,3 +32,3 @@ export declare const TRIGGER_ACTIVATED: string; | ||
| */ | ||
| declare const sessionRecordingStatuses: readonly ["disabled", "sampled", "active", "buffering", "paused", "lazy_loading"]; | ||
| declare const sessionRecordingStatuses: readonly ["disabled", "sampled", "active", "buffering", "paused", "pending_config", "lazy_loading"]; | ||
| export type SessionRecordingStatus = (typeof sessionRecordingStatuses)[number]; | ||
@@ -76,3 +77,3 @@ type ReplayConfigType = RemoteConfig | SessionRecordingPersistedConfig; | ||
| triggerStatus(sessionId: string): TriggerStatus; | ||
| checkUrlTriggerConditions(onPause: () => void, onResume: () => void, onActivate: (triggerType: TriggerType) => void, sessionId: string): void; | ||
| checkUrlTriggerConditions(onPause: () => void, onResume: () => void, onActivate: (triggerType: TriggerType, matchDetail?: string) => void, sessionId: string): void; | ||
| stop(): void; | ||
@@ -105,2 +106,3 @@ } | ||
| triggerStatus(sessionId: string): TriggerStatus; | ||
| checkEventTriggerConditions(eventName: string, onActivate: (triggerType: TriggerType, matchDetail?: string) => void, sessionId: string): void; | ||
| stop(): void; | ||
@@ -107,0 +109,0 @@ } |
@@ -14,4 +14,5 @@ import { PostHog } from '../../posthog-core'; | ||
| /** | ||
| * defaults to buffering mode until a flags response is received | ||
| * once a flags response is received status can be disabled, active or sampled | ||
| * defaults to pending_config until a remote config response is received | ||
| * transitions to lazy_loading while the recording script is being loaded | ||
| * once loaded, status is delegated to the lazy-loaded recorder (active, buffering, disabled, etc.) | ||
| */ | ||
@@ -18,0 +19,0 @@ get status(): SessionRecordingStatus; |
+1
-1
| { | ||
| "name": "posthog-js", | ||
| "version": "1.356.0", | ||
| "version": "1.356.1", | ||
| "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", | ||
@@ -5,0 +5,0 @@ "repository": "https://github.com/PostHog/posthog-js", |
@@ -8,2 +8,3 @@ import { PostHog } from '../../../posthog-core'; | ||
| export declare const PAUSED = "paused"; | ||
| export declare const PENDING_CONFIG = "pending_config"; | ||
| export declare const LAZY_LOADING = "lazy_loading"; | ||
@@ -31,3 +32,3 @@ export declare const TRIGGER_ACTIVATED: string; | ||
| */ | ||
| declare const sessionRecordingStatuses: readonly ["disabled", "sampled", "active", "buffering", "paused", "lazy_loading"]; | ||
| declare const sessionRecordingStatuses: readonly ["disabled", "sampled", "active", "buffering", "paused", "pending_config", "lazy_loading"]; | ||
| export type SessionRecordingStatus = (typeof sessionRecordingStatuses)[number]; | ||
@@ -76,3 +77,3 @@ type ReplayConfigType = RemoteConfig | SessionRecordingPersistedConfig; | ||
| triggerStatus(sessionId: string): TriggerStatus; | ||
| checkUrlTriggerConditions(onPause: () => void, onResume: () => void, onActivate: (triggerType: TriggerType) => void, sessionId: string): void; | ||
| checkUrlTriggerConditions(onPause: () => void, onResume: () => void, onActivate: (triggerType: TriggerType, matchDetail?: string) => void, sessionId: string): void; | ||
| stop(): void; | ||
@@ -105,2 +106,3 @@ } | ||
| triggerStatus(sessionId: string): TriggerStatus; | ||
| checkEventTriggerConditions(eventName: string, onActivate: (triggerType: TriggerType, matchDetail?: string) => void, sessionId: string): void; | ||
| stop(): void; | ||
@@ -107,0 +109,0 @@ } |
@@ -14,3 +14,3 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.EventTriggerMatching = exports.LinkedFlagMatching = exports.URLTriggerMatching = exports.PendingTriggerMatching = exports.AndTriggerMatching = exports.OrTriggerMatching = exports.TRIGGER_DISABLED = exports.TRIGGER_PENDING = exports.TRIGGER_ACTIVATED = exports.LAZY_LOADING = exports.PAUSED = exports.BUFFERING = exports.ACTIVE = exports.SAMPLED = exports.DISABLED = void 0; | ||
| exports.EventTriggerMatching = exports.LinkedFlagMatching = exports.URLTriggerMatching = exports.PendingTriggerMatching = exports.AndTriggerMatching = exports.OrTriggerMatching = exports.TRIGGER_DISABLED = exports.TRIGGER_PENDING = exports.TRIGGER_ACTIVATED = exports.LAZY_LOADING = exports.PENDING_CONFIG = exports.PAUSED = exports.BUFFERING = exports.ACTIVE = exports.SAMPLED = exports.DISABLED = void 0; | ||
| exports.nullMatchSessionRecordingStatus = nullMatchSessionRecordingStatus; | ||
@@ -28,2 +28,3 @@ exports.anyMatchSessionRecordingStatus = anyMatchSessionRecordingStatus; | ||
| exports.PAUSED = 'paused'; | ||
| exports.PENDING_CONFIG = 'pending_config'; | ||
| exports.LAZY_LOADING = 'lazy_loading'; | ||
@@ -49,3 +50,3 @@ var TRIGGER = 'trigger'; | ||
| // eslint-disable-next-line @typescript-eslint/no-unused-vars | ||
| var sessionRecordingStatuses = [exports.DISABLED, exports.SAMPLED, exports.ACTIVE, exports.BUFFERING, exports.PAUSED, exports.LAZY_LOADING]; | ||
| var sessionRecordingStatuses = [exports.DISABLED, exports.SAMPLED, exports.ACTIVE, exports.BUFFERING, exports.PAUSED, exports.PENDING_CONFIG, exports.LAZY_LOADING]; | ||
| function sessionRecordingUrlTriggerMatches(url, triggers, compiledRegexCache) { | ||
@@ -258,3 +259,3 @@ return triggers.some(function (trigger) { | ||
| if (!isActivated && urlMatches) { | ||
| onActivate('url'); | ||
| onActivate('url', url); | ||
| } | ||
@@ -375,2 +376,11 @@ }; | ||
| }; | ||
| EventTriggerMatching.prototype.checkEventTriggerConditions = function (eventName, onActivate, sessionId) { | ||
| if (this._eventTriggers.length === 0) { | ||
| return; | ||
| } | ||
| var isActivated = this._eventTriggerStatus(sessionId) === exports.TRIGGER_ACTIVATED; | ||
| if (!isActivated && this._eventTriggers.includes(eventName)) { | ||
| onActivate('event', eventName); | ||
| } | ||
| }; | ||
| EventTriggerMatching.prototype.stop = function () { | ||
@@ -377,0 +387,0 @@ // no-op |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"triggerMatching.js","sourceRoot":"","sources":["../../../../../src/extensions/replay/external/triggerMatching.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n} from '../../../constants'\nimport { PostHog } from '../../../posthog-core'\nimport { FlagVariant, RemoteConfig, SessionRecordingPersistedConfig, SessionRecordingUrlTrigger } from '../../../types'\nimport { isNullish, isBoolean, isString, isObject } from '@posthog/core'\nimport { window } from '../../../utils/globals'\nimport { logger } from '../../../utils/logger'\n\nexport const DISABLED = 'disabled'\nexport const SAMPLED = 'sampled'\nexport const ACTIVE = 'active'\nexport const BUFFERING = 'buffering'\nexport const PAUSED = 'paused'\nexport const LAZY_LOADING = 'lazy_loading'\n\nconst TRIGGER = 'trigger'\nexport const TRIGGER_ACTIVATED = TRIGGER + '_activated'\nexport const TRIGGER_PENDING = TRIGGER + '_pending'\nexport const TRIGGER_DISABLED = TRIGGER + '_' + DISABLED\n\nexport interface RecordingTriggersStatus {\n get receivedFlags(): boolean\n get isRecordingEnabled(): false | true | undefined\n get isSampled(): false | true | null\n get urlTriggerMatching(): URLTriggerMatching\n get eventTriggerMatching(): EventTriggerMatching\n get linkedFlagMatching(): LinkedFlagMatching\n get sessionId(): string\n}\n\nexport type TriggerType = 'url' | 'event'\n/* \ntriggers can have one of three statuses:\n * - trigger_activated: the trigger met conditions to start recording\n * - trigger_pending: the trigger is present, but the conditions are not yet met\n * - trigger_disabled: the trigger is not present\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst triggerStatuses = [TRIGGER_ACTIVATED, TRIGGER_PENDING, TRIGGER_DISABLED] as const\nexport type TriggerStatus = (typeof triggerStatuses)[number]\n\n/**\n * Session recording starts in buffering mode while waiting for \"flags response\".\n * Once the response is received, it might be disabled, active or sampled.\n * When \"sampled\" that means a sample rate is set, and the last time the session ID rotated\n * the sample rate determined this session should be sent to the server.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst sessionRecordingStatuses = [DISABLED, SAMPLED, ACTIVE, BUFFERING, PAUSED, LAZY_LOADING] as const\nexport type SessionRecordingStatus = (typeof sessionRecordingStatuses)[number]\n\n// while we have both lazy and eager loaded replay we might get either type of config\ntype ReplayConfigType = RemoteConfig | SessionRecordingPersistedConfig\n\nfunction sessionRecordingUrlTriggerMatches(\n url: string,\n triggers: SessionRecordingUrlTrigger[],\n compiledRegexCache?: Map<string, RegExp>\n) {\n return triggers.some((trigger) => {\n switch (trigger.matching) {\n case 'regex': {\n const regex = compiledRegexCache?.get(trigger.url) ?? new RegExp(trigger.url)\n return regex.test(url)\n }\n default:\n return false\n }\n })\n}\n\nexport interface TriggerStatusMatching {\n triggerStatus(sessionId: string): TriggerStatus\n stop(): void\n}\nexport class OrTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = this._matchers.map((m) => m.triggerStatus(sessionId))\n if (statuses.includes(TRIGGER_ACTIVATED)) {\n return TRIGGER_ACTIVATED\n }\n if (statuses.includes(TRIGGER_PENDING)) {\n return TRIGGER_PENDING\n }\n return TRIGGER_DISABLED\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class AndTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = new Set<TriggerStatus>()\n for (const matcher of this._matchers) {\n statuses.add(matcher.triggerStatus(sessionId))\n }\n\n // trigger_disabled means no config\n statuses.delete(TRIGGER_DISABLED)\n switch (statuses.size) {\n case 0:\n return TRIGGER_DISABLED\n case 1:\n return Array.from(statuses)[0]\n default:\n return TRIGGER_PENDING\n }\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class PendingTriggerMatching implements TriggerStatusMatching {\n triggerStatus(): TriggerStatus {\n return TRIGGER_PENDING\n }\n\n stop(): void {\n // no-op\n }\n}\n\nconst isEagerLoadedConfig = (x: ReplayConfigType): x is RemoteConfig => {\n return 'sessionRecording' in x\n}\n\nexport class URLTriggerMatching implements TriggerStatusMatching {\n _urlTriggers: SessionRecordingUrlTrigger[] = []\n _urlBlocklist: SessionRecordingUrlTrigger[] = []\n\n private _compiledTriggerRegexes: Map<string, RegExp> = new Map()\n private _compiledBlocklistRegexes: Map<string, RegExp> = new Map()\n\n private _lastCheckedUrl: string = ''\n\n urlBlocked: boolean = false\n\n constructor(private readonly _instance: PostHog) {}\n\n onConfig(config: ReplayConfigType) {\n this._urlTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlTriggers\n : []\n : config?.urlTriggers) || []\n this._urlBlocklist =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlBlocklist\n : []\n : config?.urlBlocklist) || []\n\n this._compileRegexCache()\n }\n\n /**\n * Compiles and caches RegExp objects from URL triggers and blocklist.\n * This prevents recreating RegExp objects on every rrweb event\n */\n private _compileRegexCache(): void {\n this._compiledTriggerRegexes.clear()\n this._compiledBlocklistRegexes.clear()\n\n for (const trigger of this._urlTriggers) {\n if (trigger.matching === 'regex' && !this._compiledTriggerRegexes.has(trigger.url)) {\n try {\n this._compiledTriggerRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL trigger regex pattern:', trigger.url, e)\n }\n }\n }\n\n for (const trigger of this._urlBlocklist) {\n if (trigger.matching === 'regex' && !this._compiledBlocklistRegexes.has(trigger.url)) {\n try {\n this._compiledBlocklistRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL blocklist regex pattern:', trigger.url, e)\n }\n }\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _urlTriggerStatus(sessionId: string): TriggerStatus {\n if (this._urlTriggers.length === 0) {\n return TRIGGER_DISABLED\n }\n\n const currentTriggerSession = this._instance?.get_property(SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION)\n return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const urlTriggerStatus = this._urlTriggerStatus(sessionId)\n const eitherIsActivated = urlTriggerStatus === TRIGGER_ACTIVATED\n const eitherIsPending = urlTriggerStatus === TRIGGER_PENDING\n\n const result = eitherIsActivated ? TRIGGER_ACTIVATED : eitherIsPending ? TRIGGER_PENDING : TRIGGER_DISABLED\n this._instance.register_for_session({\n $sdk_debug_replay_url_trigger_status: result,\n })\n return result\n }\n\n checkUrlTriggerConditions(\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType) => void,\n sessionId: string\n ) {\n if (typeof window === 'undefined' || !window.location.href) {\n return\n }\n\n const url = window.location.href\n if (url === this._lastCheckedUrl) {\n return\n }\n this._lastCheckedUrl = url\n\n const wasBlocked = this.urlBlocked\n const isNowBlocked = sessionRecordingUrlTriggerMatches(url, this._urlBlocklist, this._compiledBlocklistRegexes)\n\n if (wasBlocked && isNowBlocked) {\n return\n }\n\n if (isNowBlocked && !wasBlocked) {\n onPause()\n } else if (!isNowBlocked && wasBlocked) {\n onResume()\n }\n\n const isActivated = this._urlTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n const urlMatches = sessionRecordingUrlTriggerMatches(url, this._urlTriggers, this._compiledTriggerRegexes)\n\n if (!isActivated && urlMatches) {\n onActivate('url')\n }\n }\n\n stop(): void {\n this._lastCheckedUrl = ''\n }\n}\n\nexport class LinkedFlagMatching implements TriggerStatusMatching {\n linkedFlag: string | FlagVariant | null = null\n linkedFlagSeen: boolean = false\n private _flagListenerCleanup: () => void = () => {}\n constructor(private readonly _instance: PostHog) {}\n\n triggerStatus(): TriggerStatus {\n let result = TRIGGER_PENDING\n if (isNullish(this.linkedFlag)) {\n result = TRIGGER_DISABLED\n }\n if (this.linkedFlagSeen) {\n result = TRIGGER_ACTIVATED\n }\n this._instance.register_for_session({\n $sdk_debug_replay_linked_flag_trigger_status: result,\n })\n return result\n }\n\n onConfig(config: ReplayConfigType, onStarted: (flag: string, variant: string | null) => void) {\n this.linkedFlag =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.linkedFlag\n : null\n : config?.linkedFlag) || null\n\n if (!isNullish(this.linkedFlag) && !this.linkedFlagSeen) {\n const linkedFlag = isString(this.linkedFlag) ? this.linkedFlag : this.linkedFlag.flag\n const linkedVariant = isString(this.linkedFlag) ? null : this.linkedFlag.variant\n this._flagListenerCleanup = this._instance.onFeatureFlags((_flags, variants) => {\n const flagIsPresent = isObject(variants) && linkedFlag in variants\n let linkedFlagMatches = false\n if (flagIsPresent) {\n const variantForFlagKey = variants[linkedFlag]\n if (isBoolean(variantForFlagKey)) {\n linkedFlagMatches = variantForFlagKey === true\n } else if (linkedVariant) {\n linkedFlagMatches = variantForFlagKey === linkedVariant\n } else {\n // then this is a variant flag and we want to match any string\n linkedFlagMatches = !!variantForFlagKey\n }\n }\n this.linkedFlagSeen = linkedFlagMatches\n if (linkedFlagMatches) {\n onStarted(linkedFlag, linkedVariant)\n }\n })\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig, onStarted: (flag: string, variant: string | null) => void) {\n this.onConfig(response, onStarted)\n }\n\n stop(): void {\n this._flagListenerCleanup()\n }\n}\n\nexport class EventTriggerMatching implements TriggerStatusMatching {\n _eventTriggers: string[] = []\n\n constructor(private readonly _instance: PostHog) {}\n\n onConfig(config: ReplayConfigType) {\n this._eventTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.eventTriggers\n : []\n : config?.eventTriggers) || []\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _eventTriggerStatus(sessionId: string): TriggerStatus {\n if (this._eventTriggers.length === 0) {\n return TRIGGER_DISABLED\n }\n\n const currentTriggerSession = this._instance?.get_property(SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION)\n return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const eventTriggerStatus = this._eventTriggerStatus(sessionId)\n const result =\n eventTriggerStatus === TRIGGER_ACTIVATED\n ? TRIGGER_ACTIVATED\n : eventTriggerStatus === TRIGGER_PENDING\n ? TRIGGER_PENDING\n : TRIGGER_DISABLED\n this._instance.register_for_session({\n $sdk_debug_replay_event_trigger_status: result,\n })\n return result\n }\n\n stop(): void {\n // no-op\n }\n}\n\n// we need a no-op matcher before we can lazy-load the other matches, since all matchers wait on remote config anyway\nexport function nullMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n return BUFFERING\n}\n\nexport function anyMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const sampledActive = triggersStatus.isSampled === true\n const triggerMatches = new OrTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ]).triggerStatus(triggersStatus.sessionId)\n\n if (sampledActive) {\n return SAMPLED\n }\n\n if (triggerMatches === TRIGGER_ACTIVATED) {\n return ACTIVE\n }\n\n if (triggerMatches === TRIGGER_PENDING) {\n // even if sampled active is false, we should still be buffering\n // since a pending trigger could override it\n return BUFFERING\n }\n\n // if sampling is set and the session is already decided to not be sampled\n // then we should never be active\n if (triggersStatus.isSampled === false) {\n return DISABLED\n }\n\n return ACTIVE\n}\n\nexport function allMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const andTriggerMatch = new AndTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ])\n const currentTriggerStatus = andTriggerMatch.triggerStatus(triggersStatus.sessionId)\n const hasTriggersConfigured = currentTriggerStatus !== TRIGGER_DISABLED\n\n const hasSamplingConfigured = isBoolean(triggersStatus.isSampled)\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_PENDING) {\n return BUFFERING\n }\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_DISABLED) {\n return DISABLED\n }\n\n // sampling can't ever cause buffering, it's always determined right away or not configured\n if (hasSamplingConfigured && !triggersStatus.isSampled) {\n return DISABLED\n }\n\n // If sampling is configured and set to true, return sampled\n if (triggersStatus.isSampled === true) {\n return SAMPLED\n }\n\n return ACTIVE\n}\n"]} | ||
| {"version":3,"file":"triggerMatching.js","sourceRoot":"","sources":["../../../../../src/extensions/replay/external/triggerMatching.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n} from '../../../constants'\nimport { PostHog } from '../../../posthog-core'\nimport { FlagVariant, RemoteConfig, SessionRecordingPersistedConfig, SessionRecordingUrlTrigger } from '../../../types'\nimport { isNullish, isBoolean, isString, isObject } from '@posthog/core'\nimport { window } from '../../../utils/globals'\nimport { logger } from '../../../utils/logger'\n\nexport const DISABLED = 'disabled'\nexport const SAMPLED = 'sampled'\nexport const ACTIVE = 'active'\nexport const BUFFERING = 'buffering'\nexport const PAUSED = 'paused'\nexport const PENDING_CONFIG = 'pending_config'\nexport const LAZY_LOADING = 'lazy_loading'\n\nconst TRIGGER = 'trigger'\nexport const TRIGGER_ACTIVATED = TRIGGER + '_activated'\nexport const TRIGGER_PENDING = TRIGGER + '_pending'\nexport const TRIGGER_DISABLED = TRIGGER + '_' + DISABLED\n\nexport interface RecordingTriggersStatus {\n get receivedFlags(): boolean\n get isRecordingEnabled(): false | true | undefined\n get isSampled(): false | true | null\n get urlTriggerMatching(): URLTriggerMatching\n get eventTriggerMatching(): EventTriggerMatching\n get linkedFlagMatching(): LinkedFlagMatching\n get sessionId(): string\n}\n\nexport type TriggerType = 'url' | 'event'\n/* \ntriggers can have one of three statuses:\n * - trigger_activated: the trigger met conditions to start recording\n * - trigger_pending: the trigger is present, but the conditions are not yet met\n * - trigger_disabled: the trigger is not present\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst triggerStatuses = [TRIGGER_ACTIVATED, TRIGGER_PENDING, TRIGGER_DISABLED] as const\nexport type TriggerStatus = (typeof triggerStatuses)[number]\n\n/**\n * Session recording starts in buffering mode while waiting for \"flags response\".\n * Once the response is received, it might be disabled, active or sampled.\n * When \"sampled\" that means a sample rate is set, and the last time the session ID rotated\n * the sample rate determined this session should be sent to the server.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst sessionRecordingStatuses = [DISABLED, SAMPLED, ACTIVE, BUFFERING, PAUSED, PENDING_CONFIG, LAZY_LOADING] as const\nexport type SessionRecordingStatus = (typeof sessionRecordingStatuses)[number]\n\n// while we have both lazy and eager loaded replay we might get either type of config\ntype ReplayConfigType = RemoteConfig | SessionRecordingPersistedConfig\n\nfunction sessionRecordingUrlTriggerMatches(\n url: string,\n triggers: SessionRecordingUrlTrigger[],\n compiledRegexCache?: Map<string, RegExp>\n) {\n return triggers.some((trigger) => {\n switch (trigger.matching) {\n case 'regex': {\n const regex = compiledRegexCache?.get(trigger.url) ?? new RegExp(trigger.url)\n return regex.test(url)\n }\n default:\n return false\n }\n })\n}\n\nexport interface TriggerStatusMatching {\n triggerStatus(sessionId: string): TriggerStatus\n stop(): void\n}\nexport class OrTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = this._matchers.map((m) => m.triggerStatus(sessionId))\n if (statuses.includes(TRIGGER_ACTIVATED)) {\n return TRIGGER_ACTIVATED\n }\n if (statuses.includes(TRIGGER_PENDING)) {\n return TRIGGER_PENDING\n }\n return TRIGGER_DISABLED\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class AndTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = new Set<TriggerStatus>()\n for (const matcher of this._matchers) {\n statuses.add(matcher.triggerStatus(sessionId))\n }\n\n // trigger_disabled means no config\n statuses.delete(TRIGGER_DISABLED)\n switch (statuses.size) {\n case 0:\n return TRIGGER_DISABLED\n case 1:\n return Array.from(statuses)[0]\n default:\n return TRIGGER_PENDING\n }\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class PendingTriggerMatching implements TriggerStatusMatching {\n triggerStatus(): TriggerStatus {\n return TRIGGER_PENDING\n }\n\n stop(): void {\n // no-op\n }\n}\n\nconst isEagerLoadedConfig = (x: ReplayConfigType): x is RemoteConfig => {\n return 'sessionRecording' in x\n}\n\nexport class URLTriggerMatching implements TriggerStatusMatching {\n _urlTriggers: SessionRecordingUrlTrigger[] = []\n _urlBlocklist: SessionRecordingUrlTrigger[] = []\n\n private _compiledTriggerRegexes: Map<string, RegExp> = new Map()\n private _compiledBlocklistRegexes: Map<string, RegExp> = new Map()\n\n private _lastCheckedUrl: string = ''\n\n urlBlocked: boolean = false\n\n constructor(private readonly _instance: PostHog) {}\n\n onConfig(config: ReplayConfigType) {\n this._urlTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlTriggers\n : []\n : config?.urlTriggers) || []\n this._urlBlocklist =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlBlocklist\n : []\n : config?.urlBlocklist) || []\n\n this._compileRegexCache()\n }\n\n /**\n * Compiles and caches RegExp objects from URL triggers and blocklist.\n * This prevents recreating RegExp objects on every rrweb event\n */\n private _compileRegexCache(): void {\n this._compiledTriggerRegexes.clear()\n this._compiledBlocklistRegexes.clear()\n\n for (const trigger of this._urlTriggers) {\n if (trigger.matching === 'regex' && !this._compiledTriggerRegexes.has(trigger.url)) {\n try {\n this._compiledTriggerRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL trigger regex pattern:', trigger.url, e)\n }\n }\n }\n\n for (const trigger of this._urlBlocklist) {\n if (trigger.matching === 'regex' && !this._compiledBlocklistRegexes.has(trigger.url)) {\n try {\n this._compiledBlocklistRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL blocklist regex pattern:', trigger.url, e)\n }\n }\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _urlTriggerStatus(sessionId: string): TriggerStatus {\n if (this._urlTriggers.length === 0) {\n return TRIGGER_DISABLED\n }\n\n const currentTriggerSession = this._instance?.get_property(SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION)\n return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const urlTriggerStatus = this._urlTriggerStatus(sessionId)\n const eitherIsActivated = urlTriggerStatus === TRIGGER_ACTIVATED\n const eitherIsPending = urlTriggerStatus === TRIGGER_PENDING\n\n const result = eitherIsActivated ? TRIGGER_ACTIVATED : eitherIsPending ? TRIGGER_PENDING : TRIGGER_DISABLED\n this._instance.register_for_session({\n $sdk_debug_replay_url_trigger_status: result,\n })\n return result\n }\n\n checkUrlTriggerConditions(\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n sessionId: string\n ) {\n if (typeof window === 'undefined' || !window.location.href) {\n return\n }\n\n const url = window.location.href\n if (url === this._lastCheckedUrl) {\n return\n }\n this._lastCheckedUrl = url\n\n const wasBlocked = this.urlBlocked\n const isNowBlocked = sessionRecordingUrlTriggerMatches(url, this._urlBlocklist, this._compiledBlocklistRegexes)\n\n if (wasBlocked && isNowBlocked) {\n return\n }\n\n if (isNowBlocked && !wasBlocked) {\n onPause()\n } else if (!isNowBlocked && wasBlocked) {\n onResume()\n }\n\n const isActivated = this._urlTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n const urlMatches = sessionRecordingUrlTriggerMatches(url, this._urlTriggers, this._compiledTriggerRegexes)\n\n if (!isActivated && urlMatches) {\n onActivate('url', url)\n }\n }\n\n stop(): void {\n this._lastCheckedUrl = ''\n }\n}\n\nexport class LinkedFlagMatching implements TriggerStatusMatching {\n linkedFlag: string | FlagVariant | null = null\n linkedFlagSeen: boolean = false\n private _flagListenerCleanup: () => void = () => {}\n constructor(private readonly _instance: PostHog) {}\n\n triggerStatus(): TriggerStatus {\n let result = TRIGGER_PENDING\n if (isNullish(this.linkedFlag)) {\n result = TRIGGER_DISABLED\n }\n if (this.linkedFlagSeen) {\n result = TRIGGER_ACTIVATED\n }\n this._instance.register_for_session({\n $sdk_debug_replay_linked_flag_trigger_status: result,\n })\n return result\n }\n\n onConfig(config: ReplayConfigType, onStarted: (flag: string, variant: string | null) => void) {\n this.linkedFlag =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.linkedFlag\n : null\n : config?.linkedFlag) || null\n\n if (!isNullish(this.linkedFlag) && !this.linkedFlagSeen) {\n const linkedFlag = isString(this.linkedFlag) ? this.linkedFlag : this.linkedFlag.flag\n const linkedVariant = isString(this.linkedFlag) ? null : this.linkedFlag.variant\n this._flagListenerCleanup = this._instance.onFeatureFlags((_flags, variants) => {\n const flagIsPresent = isObject(variants) && linkedFlag in variants\n let linkedFlagMatches = false\n if (flagIsPresent) {\n const variantForFlagKey = variants[linkedFlag]\n if (isBoolean(variantForFlagKey)) {\n linkedFlagMatches = variantForFlagKey === true\n } else if (linkedVariant) {\n linkedFlagMatches = variantForFlagKey === linkedVariant\n } else {\n // then this is a variant flag and we want to match any string\n linkedFlagMatches = !!variantForFlagKey\n }\n }\n this.linkedFlagSeen = linkedFlagMatches\n if (linkedFlagMatches) {\n onStarted(linkedFlag, linkedVariant)\n }\n })\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig, onStarted: (flag: string, variant: string | null) => void) {\n this.onConfig(response, onStarted)\n }\n\n stop(): void {\n this._flagListenerCleanup()\n }\n}\n\nexport class EventTriggerMatching implements TriggerStatusMatching {\n _eventTriggers: string[] = []\n\n constructor(private readonly _instance: PostHog) {}\n\n onConfig(config: ReplayConfigType) {\n this._eventTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.eventTriggers\n : []\n : config?.eventTriggers) || []\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _eventTriggerStatus(sessionId: string): TriggerStatus {\n if (this._eventTriggers.length === 0) {\n return TRIGGER_DISABLED\n }\n\n const currentTriggerSession = this._instance?.get_property(SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION)\n return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const eventTriggerStatus = this._eventTriggerStatus(sessionId)\n const result =\n eventTriggerStatus === TRIGGER_ACTIVATED\n ? TRIGGER_ACTIVATED\n : eventTriggerStatus === TRIGGER_PENDING\n ? TRIGGER_PENDING\n : TRIGGER_DISABLED\n this._instance.register_for_session({\n $sdk_debug_replay_event_trigger_status: result,\n })\n return result\n }\n\n checkEventTriggerConditions(\n eventName: string,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n sessionId: string\n ) {\n if (this._eventTriggers.length === 0) {\n return\n }\n\n const isActivated = this._eventTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n if (!isActivated && this._eventTriggers.includes(eventName)) {\n onActivate('event', eventName)\n }\n }\n\n stop(): void {\n // no-op\n }\n}\n\n// we need a no-op matcher before we can lazy-load the other matches, since all matchers wait on remote config anyway\nexport function nullMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n return BUFFERING\n}\n\nexport function anyMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const sampledActive = triggersStatus.isSampled === true\n const triggerMatches = new OrTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ]).triggerStatus(triggersStatus.sessionId)\n\n if (sampledActive) {\n return SAMPLED\n }\n\n if (triggerMatches === TRIGGER_ACTIVATED) {\n return ACTIVE\n }\n\n if (triggerMatches === TRIGGER_PENDING) {\n // even if sampled active is false, we should still be buffering\n // since a pending trigger could override it\n return BUFFERING\n }\n\n // if sampling is set and the session is already decided to not be sampled\n // then we should never be active\n if (triggersStatus.isSampled === false) {\n return DISABLED\n }\n\n return ACTIVE\n}\n\nexport function allMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const andTriggerMatch = new AndTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ])\n const currentTriggerStatus = andTriggerMatch.triggerStatus(triggersStatus.sessionId)\n const hasTriggersConfigured = currentTriggerStatus !== TRIGGER_DISABLED\n\n const hasSamplingConfigured = isBoolean(triggersStatus.isSampled)\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_PENDING) {\n return BUFFERING\n }\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_DISABLED) {\n return DISABLED\n }\n\n // sampling can't ever cause buffering, it's always determined right away or not configured\n if (hasSamplingConfigured && !triggersStatus.isSampled) {\n return DISABLED\n }\n\n // If sampling is configured and set to true, return sampled\n if (triggersStatus.isSampled === true) {\n return SAMPLED\n }\n\n return ACTIVE\n}\n"]} |
@@ -14,4 +14,5 @@ import { PostHog } from '../../posthog-core'; | ||
| /** | ||
| * defaults to buffering mode until a flags response is received | ||
| * once a flags response is received status can be disabled, active or sampled | ||
| * defaults to pending_config until a remote config response is received | ||
| * transitions to lazy_loading while the recording script is being loaded | ||
| * once loaded, status is delegated to the lazy-loaded recorder (active, buffering, disabled, etc.) | ||
| */ | ||
@@ -18,0 +19,0 @@ get status(): SessionRecordingStatus; |
@@ -49,4 +49,5 @@ "use strict"; | ||
| /** | ||
| * defaults to buffering mode until a flags response is received | ||
| * once a flags response is received status can be disabled, active or sampled | ||
| * defaults to pending_config until a remote config response is received | ||
| * transitions to lazy_loading while the recording script is being loaded | ||
| * once loaded, status is delegated to the lazy-loaded recorder (active, buffering, disabled, etc.) | ||
| */ | ||
@@ -57,3 +58,6 @@ get: function () { | ||
| } | ||
| if (this._receivedFlags && !this._isRecordingEnabled) { | ||
| if (!this._receivedFlags) { | ||
| return triggerMatching_1.PENDING_CONFIG; | ||
| } | ||
| if (!this._isRecordingEnabled) { | ||
| return triggerMatching_1.DISABLED; | ||
@@ -79,2 +83,6 @@ } | ||
| var _a; | ||
| // Wait for fresh remote config before starting recording | ||
| if (!this._receivedFlags) { | ||
| return; | ||
| } | ||
| if (this._isRecordingEnabled && ((_a = this._lazyLoadedSessionRecording) === null || _a === void 0 ? void 0 : _a.isStarted)) { | ||
@@ -81,0 +89,0 @@ return; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"session-recording.js","sourceRoot":"","sources":["../../../../src/extensions/replay/session-recording.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SESSION_RECORDING_IS_SAMPLED,\n SESSION_RECORDING_OVERRIDE_SAMPLING,\n SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n SESSION_RECORDING_REMOTE_CONFIG,\n} from '../../constants'\nimport { PostHog } from '../../posthog-core'\nimport { RemoteConfigLoader } from '../../remote-config'\nimport { Properties, RemoteConfig, SessionRecordingPersistedConfig, SessionStartReason } from '../../types'\nimport { type eventWithTime } from './types/rrweb-types'\n\nimport { isNullish, isUndefined } from '@posthog/core'\nimport { createLogger } from '../../utils/logger'\nimport {\n assignableWindow,\n LazyLoadedSessionRecordingInterface,\n PostHogExtensionKind,\n window,\n} from '../../utils/globals'\nimport { RECORDING_REMOTE_CONFIG_TTL_MS } from './external/lazy-loaded-session-recorder'\nimport { DISABLED, LAZY_LOADING, SessionRecordingStatus, TriggerType } from './external/triggerMatching'\n\nconst LOGGER_PREFIX = '[SessionRecording]'\nconst logger = createLogger(LOGGER_PREFIX)\n\nexport class SessionRecording {\n _forceAllowLocalhostNetworkCapture: boolean = false\n\n private _receivedFlags: boolean = false\n private _hasRequestedConfigRefresh: boolean = false\n\n private _persistFlagsOnSessionListener: (() => void) | undefined = undefined\n private _lazyLoadedSessionRecording: LazyLoadedSessionRecordingInterface | undefined\n\n public get started(): boolean {\n return !!this._lazyLoadedSessionRecording?.isStarted\n }\n\n /**\n * defaults to buffering mode until a flags response is received\n * once a flags response is received status can be disabled, active or sampled\n */\n get status(): SessionRecordingStatus {\n if (this._lazyLoadedSessionRecording) {\n return this._lazyLoadedSessionRecording.status\n }\n\n if (this._receivedFlags && !this._isRecordingEnabled) {\n return DISABLED\n }\n\n return LAZY_LOADING\n }\n\n constructor(private readonly _instance: PostHog) {\n if (!this._instance.sessionManager) {\n logger.error('started without valid sessionManager')\n throw new Error(LOGGER_PREFIX + ' started without valid sessionManager. This is a bug.')\n }\n\n if (this._instance.config.cookieless_mode === 'always') {\n throw new Error(LOGGER_PREFIX + ' cannot be used with cookieless_mode=\"always\"')\n }\n }\n\n private get _isRecordingEnabled() {\n const enabled_server_side = !!this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)?.enabled\n const enabled_client_side = !this._instance.config.disable_session_recording\n const isDisabled = this._instance.config.disable_session_recording || this._instance.consent.isOptedOut()\n return window && enabled_server_side && enabled_client_side && !isDisabled\n }\n\n startIfEnabledOrStop(startReason?: SessionStartReason) {\n if (this._isRecordingEnabled && this._lazyLoadedSessionRecording?.isStarted) {\n return\n }\n\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API, which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" and \"Array.from\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n const canRunReplay = !isUndefined(Object.assign) && !isUndefined(Array.from)\n if (this._isRecordingEnabled && canRunReplay) {\n this._lazyLoadAndStart(startReason)\n logger.info('starting')\n } else {\n this.stopRecording()\n }\n }\n\n /**\n * session recording waits until it receives remote config before loading the script\n * this is to ensure we can control the script name remotely\n * and because we wait until we have local and remote config to determine if we should start at all\n * if start is called and there is no remote config then we wait until there is\n */\n private _lazyLoadAndStart(startReason?: SessionStartReason) {\n // by checking `_isRecordingEnabled` here we know that\n // we have stored remote config and client config to read\n // replay waits for both local and remote config before starting\n if (!this._isRecordingEnabled) {\n return\n }\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported), don't load the script. Otherwise, remotely import recorder.js from cdn since it hasn't been loaded.\n if (\n !assignableWindow?.__PosthogExtensions__?.rrweb?.record ||\n !assignableWindow.__PosthogExtensions__?.initSessionRecording\n ) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this._instance,\n this._scriptName,\n (err) => {\n if (err) {\n return logger.error('could not load recorder', err)\n }\n this._onScriptLoaded(startReason)\n }\n )\n } else {\n this._onScriptLoaded(startReason)\n }\n }\n\n stopRecording() {\n this._persistFlagsOnSessionListener?.()\n this._persistFlagsOnSessionListener = undefined\n this._lazyLoadedSessionRecording?.stop()\n }\n\n private _resetSampling() {\n this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n }\n\n private _persistRemoteConfig(response: RemoteConfig): void {\n if (this._instance.persistence) {\n const persistence = this._instance.persistence\n\n const persistResponse = () => {\n const sessionRecordingConfigResponse =\n response.sessionRecording === false ? undefined : response.sessionRecording\n\n const receivedSampleRate = sessionRecordingConfigResponse?.sampleRate\n\n const parsedSampleRate = isNullish(receivedSampleRate) ? null : parseFloat(receivedSampleRate)\n if (isNullish(parsedSampleRate)) {\n this._resetSampling()\n }\n\n const receivedMinimumDuration = sessionRecordingConfigResponse?.minimumDurationMilliseconds\n\n persistence.register({\n [SESSION_RECORDING_REMOTE_CONFIG]: {\n cache_timestamp: Date.now(),\n enabled: !!sessionRecordingConfigResponse,\n ...sessionRecordingConfigResponse,\n networkPayloadCapture: {\n capturePerformance: response.capturePerformance,\n ...sessionRecordingConfigResponse?.networkPayloadCapture,\n },\n canvasRecording: {\n enabled: sessionRecordingConfigResponse?.recordCanvas,\n fps: sessionRecordingConfigResponse?.canvasFps,\n quality: sessionRecordingConfigResponse?.canvasQuality,\n },\n sampleRate: parsedSampleRate,\n minimumDurationMilliseconds: isUndefined(receivedMinimumDuration)\n ? null\n : receivedMinimumDuration,\n endpoint: sessionRecordingConfigResponse?.endpoint,\n triggerMatchType: sessionRecordingConfigResponse?.triggerMatchType,\n masking: sessionRecordingConfigResponse?.masking,\n urlTriggers: sessionRecordingConfigResponse?.urlTriggers,\n } satisfies SessionRecordingPersistedConfig,\n })\n }\n\n persistResponse()\n\n // in case we see multiple flags responses, we should only use the response from the most recent one\n this._persistFlagsOnSessionListener?.()\n // we 100% know there is a session manager by this point\n this._persistFlagsOnSessionListener = this._instance.sessionManager?.onSessionId(persistResponse)\n }\n }\n\n onRemoteConfig(response: RemoteConfig) {\n if (!('sessionRecording' in response)) {\n // if sessionRecording is not in the response, we do nothing\n logger.info('skipping remote config with no sessionRecording', response)\n return\n }\n if (response.sessionRecording === false) {\n // remotely disabled\n this._receivedFlags = true\n return\n }\n\n this._hasRequestedConfigRefresh = false\n this._persistRemoteConfig(response)\n this._receivedFlags = true\n this.startIfEnabledOrStop()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n if (this._lazyLoadedSessionRecording?.log) {\n this._lazyLoadedSessionRecording.log(message, level)\n } else {\n logger.warn('log called before recorder was ready')\n }\n }\n\n private get _scriptName(): PostHogExtensionKind {\n const remoteConfig: SessionRecordingPersistedConfig | undefined = this._instance?.persistence?.get_property(\n SESSION_RECORDING_REMOTE_CONFIG\n )\n return (remoteConfig?.scriptConfig?.script as PostHogExtensionKind) || 'lazy-recorder'\n }\n\n private _isRemoteConfigFresh(): boolean {\n const persistedConfig = this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)\n if (!persistedConfig) {\n return false\n }\n const config = typeof persistedConfig === 'object' ? persistedConfig : JSON.parse(persistedConfig)\n const cacheTimestamp = config.cache_timestamp ?? Date.now()\n return Date.now() - cacheTimestamp <= RECORDING_REMOTE_CONFIG_TTL_MS\n }\n\n private _onScriptLoaded(startReason?: SessionStartReason) {\n if (!assignableWindow.__PosthogExtensions__?.initSessionRecording) {\n throw Error('Called on script loaded before session recording is available')\n }\n\n if (!this._lazyLoadedSessionRecording) {\n this._lazyLoadedSessionRecording = assignableWindow.__PosthogExtensions__?.initSessionRecording(\n this._instance\n )\n ;(this._lazyLoadedSessionRecording as any)._forceAllowLocalhostNetworkCapture =\n this._forceAllowLocalhostNetworkCapture\n }\n\n if (!this._isRemoteConfigFresh()) {\n if (!this._hasRequestedConfigRefresh) {\n this._hasRequestedConfigRefresh = true\n logger.info('persisted remote config is stale, requesting fresh config before starting')\n new RemoteConfigLoader(this._instance).load()\n }\n return\n }\n\n this._lazyLoadedSessionRecording.start(startReason)\n }\n\n /**\n * this is maintained on the public API only because it has always been on the public API\n * if you are calling this directly you are certainly doing something wrong\n * @deprecated\n */\n onRRwebEmit(rawEvent: eventWithTime) {\n this._lazyLoadedSessionRecording?.onRRwebEmit?.(rawEvent)\n }\n\n /**\n * this ignores the linked flag config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({linked_flag: true})`\n * */\n public overrideLinkedFlag() {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [SESSION_RECORDING_OVERRIDE_LINKED_FLAG]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideLinkedFlag()\n }\n\n /**\n * this ignores the sampling config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({sampling: true})`\n * */\n public overrideSampling() {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [SESSION_RECORDING_OVERRIDE_SAMPLING]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideSampling()\n }\n\n /**\n * this ignores the URL/Event trigger config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({trigger: 'url' | 'event'})`\n * */\n public overrideTrigger(triggerType: TriggerType) {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [triggerType === 'url'\n ? SESSION_RECORDING_OVERRIDE_URL_TRIGGER\n : SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideTrigger(triggerType)\n }\n\n /*\n * whenever we capture an event, we add these properties to the event\n * these are used to debug issues with the session recording\n * when looking at the event feed for a session\n */\n get sdkDebugProperties(): Properties {\n return (\n this._lazyLoadedSessionRecording?.sdkDebugProperties || {\n $recording_status: this.status,\n }\n )\n }\n\n /**\n * This adds a custom event to the session recording\n *\n * It is not intended for arbitrary public use - playback only displays known custom events\n * And is exposed on the public interface only so that other parts of the SDK are able to use it\n *\n * if you are calling this from client code, you're probably looking for `posthog.capture('$custom_event', {...})`\n */\n tryAddCustomEvent(tag: string, payload: any): boolean {\n return !!this._lazyLoadedSessionRecording?.tryAddCustomEvent(tag, payload)\n }\n}\n"]} | ||
| {"version":3,"file":"session-recording.js","sourceRoot":"","sources":["../../../../src/extensions/replay/session-recording.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SESSION_RECORDING_IS_SAMPLED,\n SESSION_RECORDING_OVERRIDE_SAMPLING,\n SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n SESSION_RECORDING_REMOTE_CONFIG,\n} from '../../constants'\nimport { PostHog } from '../../posthog-core'\nimport { RemoteConfigLoader } from '../../remote-config'\nimport { Properties, RemoteConfig, SessionRecordingPersistedConfig, SessionStartReason } from '../../types'\nimport { type eventWithTime } from './types/rrweb-types'\n\nimport { isNullish, isUndefined } from '@posthog/core'\nimport { createLogger } from '../../utils/logger'\nimport {\n assignableWindow,\n LazyLoadedSessionRecordingInterface,\n PostHogExtensionKind,\n window,\n} from '../../utils/globals'\nimport { RECORDING_REMOTE_CONFIG_TTL_MS } from './external/lazy-loaded-session-recorder'\nimport { DISABLED, LAZY_LOADING, PENDING_CONFIG, SessionRecordingStatus, TriggerType } from './external/triggerMatching'\n\nconst LOGGER_PREFIX = '[SessionRecording]'\nconst logger = createLogger(LOGGER_PREFIX)\n\nexport class SessionRecording {\n _forceAllowLocalhostNetworkCapture: boolean = false\n\n private _receivedFlags: boolean = false\n private _hasRequestedConfigRefresh: boolean = false\n\n private _persistFlagsOnSessionListener: (() => void) | undefined = undefined\n private _lazyLoadedSessionRecording: LazyLoadedSessionRecordingInterface | undefined\n\n public get started(): boolean {\n return !!this._lazyLoadedSessionRecording?.isStarted\n }\n\n /**\n * defaults to pending_config until a remote config response is received\n * transitions to lazy_loading while the recording script is being loaded\n * once loaded, status is delegated to the lazy-loaded recorder (active, buffering, disabled, etc.)\n */\n get status(): SessionRecordingStatus {\n if (this._lazyLoadedSessionRecording) {\n return this._lazyLoadedSessionRecording.status\n }\n\n if (!this._receivedFlags) {\n return PENDING_CONFIG\n }\n\n if (!this._isRecordingEnabled) {\n return DISABLED\n }\n\n return LAZY_LOADING\n }\n\n constructor(private readonly _instance: PostHog) {\n if (!this._instance.sessionManager) {\n logger.error('started without valid sessionManager')\n throw new Error(LOGGER_PREFIX + ' started without valid sessionManager. This is a bug.')\n }\n\n if (this._instance.config.cookieless_mode === 'always') {\n throw new Error(LOGGER_PREFIX + ' cannot be used with cookieless_mode=\"always\"')\n }\n }\n\n private get _isRecordingEnabled() {\n const enabled_server_side = !!this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)?.enabled\n const enabled_client_side = !this._instance.config.disable_session_recording\n const isDisabled = this._instance.config.disable_session_recording || this._instance.consent.isOptedOut()\n return window && enabled_server_side && enabled_client_side && !isDisabled\n }\n\n startIfEnabledOrStop(startReason?: SessionStartReason) {\n // Wait for fresh remote config before starting recording\n if (!this._receivedFlags) {\n return\n }\n\n if (this._isRecordingEnabled && this._lazyLoadedSessionRecording?.isStarted) {\n return\n }\n\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API, which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" and \"Array.from\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n const canRunReplay = !isUndefined(Object.assign) && !isUndefined(Array.from)\n if (this._isRecordingEnabled && canRunReplay) {\n this._lazyLoadAndStart(startReason)\n logger.info('starting')\n } else {\n this.stopRecording()\n }\n }\n\n /**\n * session recording waits until it receives remote config before loading the script\n * this is to ensure we can control the script name remotely\n * and because we wait until we have local and remote config to determine if we should start at all\n * if start is called and there is no remote config then we wait until there is\n */\n private _lazyLoadAndStart(startReason?: SessionStartReason) {\n // by checking `_isRecordingEnabled` here we know that\n // we have stored remote config and client config to read\n // replay waits for both local and remote config before starting\n if (!this._isRecordingEnabled) {\n return\n }\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported), don't load the script. Otherwise, remotely import recorder.js from cdn since it hasn't been loaded.\n if (\n !assignableWindow?.__PosthogExtensions__?.rrweb?.record ||\n !assignableWindow.__PosthogExtensions__?.initSessionRecording\n ) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this._instance,\n this._scriptName,\n (err) => {\n if (err) {\n return logger.error('could not load recorder', err)\n }\n this._onScriptLoaded(startReason)\n }\n )\n } else {\n this._onScriptLoaded(startReason)\n }\n }\n\n stopRecording() {\n this._persistFlagsOnSessionListener?.()\n this._persistFlagsOnSessionListener = undefined\n this._lazyLoadedSessionRecording?.stop()\n }\n\n private _resetSampling() {\n this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n }\n\n private _persistRemoteConfig(response: RemoteConfig): void {\n if (this._instance.persistence) {\n const persistence = this._instance.persistence\n\n const persistResponse = () => {\n const sessionRecordingConfigResponse =\n response.sessionRecording === false ? undefined : response.sessionRecording\n\n const receivedSampleRate = sessionRecordingConfigResponse?.sampleRate\n\n const parsedSampleRate = isNullish(receivedSampleRate) ? null : parseFloat(receivedSampleRate)\n if (isNullish(parsedSampleRate)) {\n this._resetSampling()\n }\n\n const receivedMinimumDuration = sessionRecordingConfigResponse?.minimumDurationMilliseconds\n\n persistence.register({\n [SESSION_RECORDING_REMOTE_CONFIG]: {\n cache_timestamp: Date.now(),\n enabled: !!sessionRecordingConfigResponse,\n ...sessionRecordingConfigResponse,\n networkPayloadCapture: {\n capturePerformance: response.capturePerformance,\n ...sessionRecordingConfigResponse?.networkPayloadCapture,\n },\n canvasRecording: {\n enabled: sessionRecordingConfigResponse?.recordCanvas,\n fps: sessionRecordingConfigResponse?.canvasFps,\n quality: sessionRecordingConfigResponse?.canvasQuality,\n },\n sampleRate: parsedSampleRate,\n minimumDurationMilliseconds: isUndefined(receivedMinimumDuration)\n ? null\n : receivedMinimumDuration,\n endpoint: sessionRecordingConfigResponse?.endpoint,\n triggerMatchType: sessionRecordingConfigResponse?.triggerMatchType,\n masking: sessionRecordingConfigResponse?.masking,\n urlTriggers: sessionRecordingConfigResponse?.urlTriggers,\n } satisfies SessionRecordingPersistedConfig,\n })\n }\n\n persistResponse()\n\n // in case we see multiple flags responses, we should only use the response from the most recent one\n this._persistFlagsOnSessionListener?.()\n // we 100% know there is a session manager by this point\n this._persistFlagsOnSessionListener = this._instance.sessionManager?.onSessionId(persistResponse)\n }\n }\n\n onRemoteConfig(response: RemoteConfig) {\n if (!('sessionRecording' in response)) {\n // if sessionRecording is not in the response, we do nothing\n logger.info('skipping remote config with no sessionRecording', response)\n return\n }\n if (response.sessionRecording === false) {\n // remotely disabled\n this._receivedFlags = true\n return\n }\n\n this._hasRequestedConfigRefresh = false\n this._persistRemoteConfig(response)\n this._receivedFlags = true\n this.startIfEnabledOrStop()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n if (this._lazyLoadedSessionRecording?.log) {\n this._lazyLoadedSessionRecording.log(message, level)\n } else {\n logger.warn('log called before recorder was ready')\n }\n }\n\n private get _scriptName(): PostHogExtensionKind {\n const remoteConfig: SessionRecordingPersistedConfig | undefined = this._instance?.persistence?.get_property(\n SESSION_RECORDING_REMOTE_CONFIG\n )\n return (remoteConfig?.scriptConfig?.script as PostHogExtensionKind) || 'lazy-recorder'\n }\n\n private _isRemoteConfigFresh(): boolean {\n const persistedConfig = this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)\n if (!persistedConfig) {\n return false\n }\n const config = typeof persistedConfig === 'object' ? persistedConfig : JSON.parse(persistedConfig)\n const cacheTimestamp = config.cache_timestamp ?? Date.now()\n return Date.now() - cacheTimestamp <= RECORDING_REMOTE_CONFIG_TTL_MS\n }\n\n private _onScriptLoaded(startReason?: SessionStartReason) {\n if (!assignableWindow.__PosthogExtensions__?.initSessionRecording) {\n throw Error('Called on script loaded before session recording is available')\n }\n\n if (!this._lazyLoadedSessionRecording) {\n this._lazyLoadedSessionRecording = assignableWindow.__PosthogExtensions__?.initSessionRecording(\n this._instance\n )\n ;(this._lazyLoadedSessionRecording as any)._forceAllowLocalhostNetworkCapture =\n this._forceAllowLocalhostNetworkCapture\n }\n\n if (!this._isRemoteConfigFresh()) {\n if (!this._hasRequestedConfigRefresh) {\n this._hasRequestedConfigRefresh = true\n logger.info('persisted remote config is stale, requesting fresh config before starting')\n new RemoteConfigLoader(this._instance).load()\n }\n return\n }\n\n this._lazyLoadedSessionRecording.start(startReason)\n }\n\n /**\n * this is maintained on the public API only because it has always been on the public API\n * if you are calling this directly you are certainly doing something wrong\n * @deprecated\n */\n onRRwebEmit(rawEvent: eventWithTime) {\n this._lazyLoadedSessionRecording?.onRRwebEmit?.(rawEvent)\n }\n\n /**\n * this ignores the linked flag config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({linked_flag: true})`\n * */\n public overrideLinkedFlag() {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [SESSION_RECORDING_OVERRIDE_LINKED_FLAG]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideLinkedFlag()\n }\n\n /**\n * this ignores the sampling config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({sampling: true})`\n * */\n public overrideSampling() {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [SESSION_RECORDING_OVERRIDE_SAMPLING]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideSampling()\n }\n\n /**\n * this ignores the URL/Event trigger config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({trigger: 'url' | 'event'})`\n * */\n public overrideTrigger(triggerType: TriggerType) {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [triggerType === 'url'\n ? SESSION_RECORDING_OVERRIDE_URL_TRIGGER\n : SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideTrigger(triggerType)\n }\n\n /*\n * whenever we capture an event, we add these properties to the event\n * these are used to debug issues with the session recording\n * when looking at the event feed for a session\n */\n get sdkDebugProperties(): Properties {\n return (\n this._lazyLoadedSessionRecording?.sdkDebugProperties || {\n $recording_status: this.status,\n }\n )\n }\n\n /**\n * This adds a custom event to the session recording\n *\n * It is not intended for arbitrary public use - playback only displays known custom events\n * And is exposed on the public interface only so that other parts of the SDK are able to use it\n *\n * if you are calling this from client code, you're probably looking for `posthog.capture('$custom_event', {...})`\n */\n tryAddCustomEvent(tag: string, payload: any): boolean {\n return !!this._lazyLoadedSessionRecording?.tryAddCustomEvent(tag, payload)\n }\n}\n"]} |
+3
-3
| { | ||
| "name": "posthog-js", | ||
| "version": "1.356.0", | ||
| "version": "1.356.1", | ||
| "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", | ||
@@ -61,4 +61,4 @@ "repository": "https://github.com/PostHog/posthog-js", | ||
| "@opentelemetry/sdk-logs": "^0.208.0", | ||
| "@posthog/types": "1.356.0", | ||
| "@posthog/core": "1.23.1" | ||
| "@posthog/core": "1.23.1", | ||
| "@posthog/types": "1.356.1" | ||
| }, | ||
@@ -65,0 +65,0 @@ "devDependencies": { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
34254986
0.07%94019
0.04%653
-0.15%+ Added
- Removed
Updated