@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.
1 lines • 13.8 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/providers/growthbook.ts"],"names":["_Growthbook","clientKey","decryptionKey","growthbookOptions","debug","RudderAnalytics","createLogger","id","country","user_language","device_language","device_type","utm_source","utm_medium","utm_campaign","is_authorised","url","domain","utm_content","residence_country","loggedIn","network_type","network_downlink","user_id","anonymous_id","account_mode","newAttributes","key","defaultValue","value","state","href","result","status","isLocalhost","GrowthBook","growthbookApi","experiment","currentUrl","timeout","resolve","reject","startTime","checkInterval","Growthbook"],"mappings":"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","file":"index.mjs","sourcesContent":["import { GrowthBook, InitResponse } from '@growthbook/growthbook'\nimport { RudderAnalytics } from '@rudderstack/analytics-js'\nimport {\n TGrowthbookAttributes,\n TGrowthbookOptions,\n GrowthbookConfigs,\n TGrowthbookCoreAttributes,\n} from './growthbookTypes'\nimport { growthbookApi } from '../utils/urls'\nimport { createLogger } from '../utils/helpers'\n\nexport class Growthbook {\n analytics = new RudderAnalytics()\n GrowthBook: GrowthBook<GrowthbookConfigs>\n private static _instance: Growthbook\n isLoaded = false\n status: void | InitResponse = undefined\n private debug = false\n private log = createLogger('[GrowthBook]', () => this.debug)\n\n // we have to pass settings due the specific framework implementation\n constructor(clientKey: string, decryptionKey: string, growthbookOptions: TGrowthbookOptions = {}, debug = false) {\n this.debug = debug\n const isLocalhost = typeof window !== 'undefined' ? window.location.hostname.includes('localhost') : false\n\n this.GrowthBook = new GrowthBook<GrowthbookConfigs>({\n apiHost: growthbookApi,\n clientKey,\n decryptionKey,\n antiFlicker: false,\n navigateDelay: 0,\n antiFlickerTimeout: 3500,\n subscribeToChanges: true,\n enableDevMode: isLocalhost,\n trackingCallback: (experiment, result) => {\n this.log('trackingCallback | experiment viewed', {\n experiment_id: experiment.key,\n variation_id: result.variationId,\n })\n if (typeof window !== 'undefined' && window.dataLayer) {\n window.dataLayer.push({\n event: 'experiment_viewed',\n event_category: 'experiment',\n rudder_anonymous_id: this.analytics.getAnonymousId(),\n experiment_id: experiment.key,\n variation_id: result.variationId,\n })\n }\n this.analytics.track('experiment_viewed', {\n experimentId: experiment.key,\n variationId: result.variationId,\n })\n },\n ...growthbookOptions,\n })\n this.init()\n }\n\n // for make instance by singleton\n public static getGrowthBookInstance = (\n clientKey: string,\n decryptionKey?: string,\n growthbookOptions?: TGrowthbookOptions,\n debug = false\n ) => {\n if (!Growthbook._instance) {\n Growthbook._instance = new Growthbook(clientKey, decryptionKey ?? '', growthbookOptions, debug)\n return Growthbook._instance\n }\n\n // Warn if trying to reinitialize with different parameters\n if (typeof window !== 'undefined' && console.warn) {\n console.warn('GrowthBook instance already exists. Ignoring new initialization parameters.')\n }\n\n return Growthbook._instance\n }\n\n reapplyExperiment(url?: string) {\n const currentUrl = url ?? (typeof window !== 'undefined' ? window.location.href : '')\n this.GrowthBook.setURL(currentUrl)\n }\n\n // Utility function to wait for isLoaded to become true\n private waitForIsLoaded(timeout = 10000): Promise<void> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n const checkInterval = setInterval(() => {\n if (this.isLoaded) {\n clearInterval(checkInterval)\n resolve()\n } else if (Date.now() - startTime >= timeout) {\n clearInterval(checkInterval)\n reject(new Error('GrowthBook initialization timeout'))\n }\n }, 100)\n })\n }\n\n setAttributes = ({\n id,\n country,\n user_language,\n device_language,\n device_type,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n url,\n domain,\n utm_content,\n residence_country,\n loggedIn,\n network_type,\n network_downlink,\n user_id,\n anonymous_id,\n account_mode,\n }: TGrowthbookAttributes) => {\n const currentAttributes = this.GrowthBook.getAttributes()\n const newAttributes = {\n ...currentAttributes,\n id,\n ...(user_id !== undefined && { user_id }),\n ...(anonymous_id !== undefined && { anonymous_id }),\n ...(country !== undefined && { country }),\n ...(residence_country !== undefined && { residence_country }),\n ...(user_language !== undefined && { user_language }),\n ...(device_language !== undefined && { device_language }),\n ...(device_type !== undefined && { device_type }),\n ...(utm_source !== undefined && { utm_source }),\n ...(utm_medium !== undefined && { utm_medium }),\n ...(utm_campaign !== undefined && { utm_campaign }),\n ...(is_authorised !== undefined && { is_authorised }),\n ...(url !== undefined && { url }),\n ...(domain !== undefined && { domain }),\n ...(utm_content !== undefined && { utm_content }),\n ...(loggedIn !== undefined && { loggedIn }),\n ...(network_type !== undefined && { network_type }),\n ...(network_downlink !== undefined && { network_downlink }),\n ...(account_mode !== undefined && { account_mode }),\n }\n this.log('setAttributes | updating GrowthBook attributes', newAttributes)\n this.GrowthBook.setAttributes(newAttributes)\n }\n getFeatureValue = <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(key: K, defaultValue: V) => {\n const value = this.GrowthBook.getFeatureValue(key as string, defaultValue)\n this.log('getFeatureValue', { key, value, defaultValue })\n return value\n }\n getStatus = async (): Promise<{ isLoaded: boolean; status: void | InitResponse }> => {\n await this.waitForIsLoaded()\n\n return {\n isLoaded: this.isLoaded,\n status: this.status,\n }\n }\n getFeatureState = (id: string) => {\n const state = this.GrowthBook.evalFeature(id)\n this.log('getFeatureState', { id, result: state })\n return state\n }\n setUrl = (href: string) => {\n this.log('setUrl', { href })\n this.GrowthBook.setURL(href)\n }\n isOn = (key: string) => {\n const result = this.GrowthBook.isOn(key)\n this.log('isOn', { key, result })\n return result\n }\n\n init = async () => {\n this.log('init | initializing GrowthBook SDK')\n const status = await this.GrowthBook.init({ timeout: 2000, streaming: true }).catch(() => {\n // Silently handle initialization errors\n })\n\n this.status = status\n this.isLoaded = true\n this.log('init | GrowthBook SDK loaded', { status })\n }\n\n // Destroy the GrowthBook instance and reset singleton\n destroy = () => {\n this.GrowthBook.destroy()\n this.isLoaded = false\n this.status = undefined\n }\n\n // Reset the singleton instance (useful for testing)\n public static resetInstance = () => {\n if (Growthbook._instance) {\n Growthbook._instance.destroy()\n Growthbook._instance = undefined as any\n }\n }\n}\n\nexport type { GrowthbookConfigs, TGrowthbookAttributes, TGrowthbookOptions, TGrowthbookCoreAttributes }\n"]}