UNPKG

@deriv-com/analytics

Version:

Comprehensive analytics package for Deriv applications. Provides unified event tracking, A/B testing, and user analytics through RudderStack, PostHog and GrowthBook integrations with built-in caching and offline support.

3 lines 7.8 kB
import {a}from'./chunk-4V72P52P.mjs';import {f,h,i,g,j as j$1,k}from'./chunk-TE3DYZVQ.mjs';/* @deriv-com/analytics - NPM Package - Built with tsup */ var E="cached_analytics_events",A="cached_analytics_page_views",G=(r,d)=>{try{let t=localStorage.getItem(E),l=t?JSON.parse(t):[];l.push({name:r,properties:d,timestamp:Date.now()}),localStorage.setItem(E,JSON.stringify(l));}catch(t){console.warn("Analytics: Failed to cache event",t);}},O=(r,d)=>{try{let t=localStorage.getItem(A),l=t?JSON.parse(t):[];l.push({name:r,properties:d,timestamp:Date.now()}),localStorage.setItem(A,JSON.stringify(l));}catch(t){console.warn("Analytics: Failed to cache page view",t);}},H=()=>{try{let r=localStorage.getItem(E);if(r){let d=JSON.parse(r);return Array.isArray(d)?d:[]}}catch(r){console.warn("Analytics: Failed to get cached events",r);}return []},D=()=>{try{let r=localStorage.getItem(A);if(r){let d=JSON.parse(r);return Array.isArray(d)?d:[]}}catch(r){console.warn("Analytics: Failed to get cached pages",r);}return []},N=()=>{try{localStorage.removeItem(E);}catch(r){console.warn("Analytics: Failed to clear cached events",r);}},j=()=>{try{localStorage.removeItem(A);}catch(r){console.warn("Analytics: Failed to clear cached page views",r);}};function M(r){let d=false,t=f("",()=>d),l,s,c,f$1={},b={},w=[],_=[],F=false,J=()=>{if(!F&&s?.has_initialized){F=true;try{let e=H();e.length>0&&(t(`processStorageCache | replaying ${e.length} cached event(s)`,e),e.forEach(a=>{let i=j$1(a.properties);s?.track(a.name,i);}),N());let n=D();n.length>0&&(t(`processStorageCache | replaying ${n.length} cached page view(s)`,n),n.forEach(a=>{s?.pageView(a.name,"Deriv App",k$1(),a.properties);}),j());}catch(e){console.warn("Analytics: Failed to process storage cache",e);}}},L=()=>{t("onSdkLoaded | RudderStack SDK loaded"),J(),_.length>0&&t(`onSdkLoaded | flushing ${_.length} pending identify call(s)`),_.forEach(({userId:e,traits:n})=>{e&&s?.identifyEvent(e,n);}),_=[];},U=async({growthbookKey:e,growthbookDecryptionKey:n,rudderstackKey:a$1,growthbookOptions:i$1,posthogOptions:g,debug:h$1})=>{var u,p;h$1!==void 0&&(d=h$1),t("initialise | starting analytics initialization",{rudderstack:!!a$1,growthbook:!!e,posthog:!!g});try{let y=i$1?.attributes?.country||(e?await i():void 0);if(a$1&&(t("initialise | initializing RudderStack"),s=a.getRudderStackInstance(a$1,L,d)),i$1?.attributes&&Object.keys(i$1.attributes).length>0){let o=i$1.attributes,S=s?.getAnonymousId();f$1={...f$1,country:y,...o.user_language&&{user_language:o.user_language},...o.account_type&&{account_type:o.account_type},...o.app_id&&{app_id:o.app_id},...o.residence_country&&{residence_country:o.residence_country},...o.device_type&&{device_type:o.device_type},...o.url&&{url:o.url},...o.email_hash&&{email_hash:o.email_hash},...o.network_type&&{network_type:o.network_type},...o.network_rtt&&{network_rtt:o.network_rtt},...o.network_downlink&&{network_downlink:o.network_downlink},...o.account_currency&&{account_currency:o.account_currency},...o.account_mode&&{account_mode:o.account_mode},loggedIn:!!o.loggedIn,...o.user_id&&!h(o.user_id)&&{user_id:o.user_id},...S&&{anonymous_id:S}};}i$1??(i$1={}),i$1.attributes??(i$1.attributes={});let v=s?.getAnonymousId();if((u=i$1.attributes).id??(u.id=v),(p=i$1.attributes).country??(p.country=y),e){t("initialise | initializing GrowthBook");let{Growthbook:o}=await import('./providers/growthbook/index.mjs');l=o.getGrowthBookInstance(e,n,i$1,d),t("initialise | GrowthBook initialized");let S=setInterval(()=>{Object.keys(b).length>0?clearInterval(S):b=I("tracking-buttons-config",{});},1e3);}if(g){t("initialise | initializing PostHog");let{Posthog:o}=await import('./providers/posthog/index.mjs');c=o.getPosthogInstance(g,d),t("initialise | PostHog initialized");}t("initialise | analytics initialization complete");}catch(y){console.warn("Analytics: Failed to initialize",y);}},B=e=>{t("setAttributes | received attributes",e);let{user_id:n,...a}=e,i=n??k$1();if(l){let g={...a};n&&!h(n)&&(g.user_id=n),i&&(g.id=i,g.user_id=i),t("setAttributes | called GrowthBook setAttributes",g),l.setAttributes(g);}f$1={...f$1,...Object.fromEntries(Object.entries(a).filter(([,g])=>g!==void 0)),...n!==void 0&&!h(n)&&{user_id:n}},t("setAttributes | updated core_data",f$1);},$=e=>l?.getFeatureState(e)?.experimentResult?.name,I=(e,n)=>l?.getFeatureValue(e,n),K=async()=>await l?.getStatus(),q=e=>l?.isOn(e),W=e=>l?.setUrl(e),k$1=()=>{let e=s?.getUserId()||"";return e&&!h(e)?e:""},R={initialise:U,setAttributes:B,identifyEvent:(e,n)=>{let a=e||k$1();if(!a){t("identifyEvent | skipped \u2014 no user_id available");return}t("identifyEvent | called",{user_id:a,traits:n});let i=p=>{if(!p)return p;let{email:y,...v}=p;return {...v,...y&&{is_internal:g(y)}}},g$1=n?.rudderstack!==void 0||n?.posthog!==void 0,h,u;if(g$1){let{rudderstack:p,posthog:y,...v}=n;h=i({...v,...p}),u=i({...v,...y});}else h=i(n),u=i(n);s&&(s.has_initialized?(t("identifyEvent | calling RudderStack identify",{user_id:a,traits:h}),s.identifyEvent(a,h)):_.some(p=>p.userId===a)||(t("identifyEvent | RudderStack not initialized \u2014 queuing identify call",{user_id:a}),_.push({userId:a,traits:h}))),c?.has_initialized&&(t("identifyEvent | calling PostHog identify",{user_id:a,traits:u}),c.identifyEvent(a,u));},backfillPersonProperties:({user_id:e,email:n,language:a,country_of_residence:i})=>{t("backfillPersonProperties | called",{user_id:e}),c?.has_initialized?(t("backfillPersonProperties | backfilling person properties in PostHog",{user_id:e}),c.backfillPersonProperties({user_id:e,email:n,language:a,country_of_residence:i})):t("backfillPersonProperties | skipped \u2014 PostHog not initialized");},getFeatureState:$,getFeatureValue:I,getGrowthbookStatus:K,isFeatureOn:q,setUrl:W,getId:k$1,getAnonymousId:()=>s?.getAnonymousId()||"",trackEvent:(e,n)=>{let a=k$1();t("trackEvent | called",{event:e,analytics_data:n,userId:a,core_data:f$1});let i={...f$1,...n,...a&&!f$1.user_id&&{user_id:a}};if(t("trackEvent | built payload",{event:e,final_payload:i}),!(!(e in b)||b[e])){t("trackEvent | skipped \u2014 event disabled by tracking_config",{event:e});return}let h=s?.has_initialized;if(!navigator.onLine||!h)h?(t("trackEvent | offline \u2014 caching event to memory",{event:e}),w.push({event:e,payload:i})):(t("trackEvent | RudderStack not initialized \u2014 caching event to localStorage",{event:e}),G(e,i));else {w.length>0&&(t(`trackEvent | flushing ${w.length} offline cached event(s) to RudderStack`),w.forEach(p=>{let y=j$1(p.payload);s?.track(p.event,y);}),w=[]);let u=j$1(i);t("trackEvent | sending event to RudderStack",{event:e,payload:u}),s?.track(e,u);}if(c?.has_initialized){let u=j$1(k(i));t("trackEvent | sending event to PostHog",{event:e,payload:u}),c.capture(e,u);}},getInstances:()=>({ab:l,tracking:s,posthog:c}),pageView:(e,n="Deriv App",a)=>{let i=k$1();t("pageView | called",{current_page:e,platform:n,properties:a,userId:i}),s?.has_initialized?(t("pageView | sending page view to RudderStack",{current_page:e,platform:n}),s.pageView(e,n,i,a)):(t("pageView | RudderStack not initialized \u2014 caching page view to localStorage",{current_page:e}),O(e,{platform:n,...a}));},reset:()=>{t("reset | resetting all providers"),s?.has_initialized&&(t("reset | resetting RudderStack"),s.reset()),c?.has_initialized&&(t("reset | resetting PostHog"),c.reset());},isPosthogFeatureEnabled:e=>c?.isFeatureEnabled(e),getPosthogFeatureFlag:e=>c?.getFeatureFlag(e),getPosthogFeatureFlagPayload:e=>c?.getFeatureFlagPayload(e),getPosthogAllFlags:()=>c?.getAllFlags()??{},onPosthogFeatureFlags:e=>c?.onFeatureFlags(e)??(()=>{}),reloadPosthogFeatureFlags:()=>c?.reloadFeatureFlags()};return typeof window<"u"&&(window.AnalyticsInstance=R),R}var Q=M();export{Q as Analytics};//# sourceMappingURL=index.mjs.map //# sourceMappingURL=index.mjs.map