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.96 kB
'use strict';var chunk6BHMKTVG_js=require('./chunk-6BHMKTVG.js'),chunkT4BXL6JM_js=require('./chunk-T4BXL6JM.js');/* @deriv-com/analytics - NPM Package - Built with tsup */ var E="cached_analytics_events",A="cached_analytics_page_views",O=(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);}},H=(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);}},D=()=>{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 []},N=()=>{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 []},j=()=>{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 Q(r){let d=false,t=chunkT4BXL6JM_js.f("",()=>d),l,s,c,f={},b={},w=[],_=[],F=false,L=()=>{if(!F&&s?.has_initialized){F=true;try{let e=D();e.length>0&&(t(`processStorageCache | replaying ${e.length} cached event(s)`,e),e.forEach(a=>{let i=chunkT4BXL6JM_js.j(a.properties);s?.track(a.name,i);}),j());let n=N();n.length>0&&(t(`processStorageCache | replaying ${n.length} cached page view(s)`,n),n.forEach(a=>{s?.pageView(a.name,"Deriv App",k(),a.properties);}),J());}catch(e){console.warn("Analytics: Failed to process storage cache",e);}}},U=()=>{t("onSdkLoaded | RudderStack SDK loaded"),L(),_.length>0&&t(`onSdkLoaded | flushing ${_.length} pending identify call(s)`),_.forEach(({userId:e,traits:n})=>{e&&s?.identifyEvent(e,n);}),_=[];},B=async({growthbookKey:e,growthbookDecryptionKey:n,rudderstackKey:a,growthbookOptions:i,posthogOptions:g,debug:h})=>{var u,p;h!==void 0&&(d=h),t("initialise | starting analytics initialization",{rudderstack:!!a,growthbook:!!e,posthog:!!g});try{let y=i?.attributes?.country||(e?await chunkT4BXL6JM_js.i():void 0);if(a&&(t("initialise | initializing RudderStack"),s=chunk6BHMKTVG_js.a.getRudderStackInstance(a,U,d)),i?.attributes&&Object.keys(i.attributes).length>0){let o=i.attributes,S=s?.getAnonymousId();f={...f,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&&!chunkT4BXL6JM_js.h(o.user_id)&&{user_id:o.user_id},...S&&{anonymous_id:S}};}i??(i={}),i.attributes??(i.attributes={});let v=s?.getAnonymousId();if((u=i.attributes).id??(u.id=v),(p=i.attributes).country??(p.country=y),e){t("initialise | initializing GrowthBook");let{Growthbook:o}=await import('./providers/growthbook/index.js');l=o.getGrowthBookInstance(e,n,i,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.js');c=o.getPosthogInstance(g,d),t("initialise | PostHog initialized");}t("initialise | analytics initialization complete");}catch(y){console.warn("Analytics: Failed to initialize",y);}},$=e=>{t("setAttributes | received attributes",e);let{user_id:n,...a}=e,i=n??k();if(l){let g={...a};n&&!chunkT4BXL6JM_js.h(n)&&(g.user_id=n),i&&(g.id=i,g.user_id=i),t("setAttributes | called GrowthBook setAttributes",g),l.setAttributes(g);}f={...f,...Object.fromEntries(Object.entries(a).filter(([,g])=>g!==void 0)),...n!==void 0&&!chunkT4BXL6JM_js.h(n)&&{user_id:n}},t("setAttributes | updated core_data",f);},K=e=>l?.getFeatureState(e)?.experimentResult?.name,I=(e,n)=>l?.getFeatureValue(e,n),q=async()=>await l?.getStatus(),W=e=>l?.isOn(e),M=e=>l?.setUrl(e),k=()=>{let e=s?.getUserId()||"";return e&&!chunkT4BXL6JM_js.h(e)?e:""},R={initialise:B,setAttributes:$,identifyEvent:(e,n)=>{let a=e||k();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:chunkT4BXL6JM_js.g(y)}}},g=n?.rudderstack!==void 0||n?.posthog!==void 0,h,u;if(g){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:K,getFeatureValue:I,getGrowthbookStatus:q,isFeatureOn:W,setUrl:M,getId:k,getAnonymousId:()=>s?.getAnonymousId()||"",trackEvent:(e,n)=>{let a=k();t("trackEvent | called",{event:e,analytics_data:n,userId:a,core_data:f});let i={...f,...n,...a&&!f.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}),O(e,i));else {w.length>0&&(t(`trackEvent | flushing ${w.length} offline cached event(s) to RudderStack`),w.forEach(p=>{let y=chunkT4BXL6JM_js.j(p.payload);s?.track(p.event,y);}),w=[]);let u=chunkT4BXL6JM_js.j(i);t("trackEvent | sending event to RudderStack",{event:e,payload:u}),s?.track(e,u);}if(c?.has_initialized){let u=chunkT4BXL6JM_js.j(chunkT4BXL6JM_js.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();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}),H(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 X=Q();exports.Analytics=X;//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map