@magicpixel/rn-mp-client-sdk 1.13.0 → 1.13.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -14
- package/lib/commonjs/common/app-types.js.map +1 -1
- package/lib/commonjs/common/constants.js +11 -2
- package/lib/commonjs/common/constants.js.map +1 -1
- package/lib/commonjs/common/data-store.js +13 -30
- package/lib/commonjs/common/data-store.js.map +1 -1
- package/lib/commonjs/common/deeplink-helper.js +174 -0
- package/lib/commonjs/common/deeplink-helper.js.map +1 -0
- package/lib/commonjs/common/device-info-helper.js +168 -0
- package/lib/commonjs/common/device-info-helper.js.map +1 -0
- package/lib/commonjs/common/event-bus.js +39 -0
- package/lib/commonjs/common/event-bus.js.map +1 -1
- package/lib/commonjs/common/network-service.js +119 -15
- package/lib/commonjs/common/network-service.js.map +1 -1
- package/lib/commonjs/common/reporter.js +75 -14
- package/lib/commonjs/common/reporter.js.map +1 -1
- package/lib/commonjs/common/storage-helper.js +227 -0
- package/lib/commonjs/common/storage-helper.js.map +1 -0
- package/lib/commonjs/common/utils.js +62 -2
- package/lib/commonjs/common/utils.js.map +1 -1
- package/lib/commonjs/eedl/eedl.js +198 -44
- package/lib/commonjs/eedl/eedl.js.map +1 -1
- package/lib/commonjs/index.js +301 -54
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/mp-client-sdk.js +17 -10
- package/lib/commonjs/models/mp-client-sdk.js.map +1 -1
- package/lib/commonjs/processors/data-element.processor.js +51 -7
- package/lib/commonjs/processors/data-element.processor.js.map +1 -1
- package/lib/commonjs/processors/visit-id.processor.js +78 -15
- package/lib/commonjs/processors/visit-id.processor.js.map +1 -1
- package/lib/module/common/app-types.js.map +1 -1
- package/lib/module/common/constants.js +11 -2
- package/lib/module/common/constants.js.map +1 -1
- package/lib/module/common/data-store.js +13 -30
- package/lib/module/common/data-store.js.map +1 -1
- package/lib/module/common/deeplink-helper.js +168 -0
- package/lib/module/common/deeplink-helper.js.map +1 -0
- package/lib/module/common/device-info-helper.js +161 -0
- package/lib/module/common/device-info-helper.js.map +1 -0
- package/lib/module/common/event-bus.js +39 -0
- package/lib/module/common/event-bus.js.map +1 -1
- package/lib/module/common/network-service.js +119 -15
- package/lib/module/common/network-service.js.map +1 -1
- package/lib/module/common/reporter.js +76 -14
- package/lib/module/common/reporter.js.map +1 -1
- package/lib/module/common/storage-helper.js +221 -0
- package/lib/module/common/storage-helper.js.map +1 -0
- package/lib/module/common/utils.js +63 -2
- package/lib/module/common/utils.js.map +1 -1
- package/lib/module/eedl/eedl.js +198 -44
- package/lib/module/eedl/eedl.js.map +1 -1
- package/lib/module/index.js +290 -53
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/mp-client-sdk.js +16 -9
- package/lib/module/models/mp-client-sdk.js.map +1 -1
- package/lib/module/processors/data-element.processor.js +51 -7
- package/lib/module/processors/data-element.processor.js.map +1 -1
- package/lib/module/processors/visit-id.processor.js +78 -15
- package/lib/module/processors/visit-id.processor.js.map +1 -1
- package/lib/typescript/{common → src/common}/app-types.d.ts +30 -9
- package/lib/typescript/{common → src/common}/constants.d.ts +0 -1
- package/lib/typescript/{common → src/common}/data-store.d.ts +3 -8
- package/lib/typescript/src/common/deeplink-helper.d.ts +60 -0
- package/lib/typescript/src/common/device-info-helper.d.ts +54 -0
- package/lib/typescript/src/common/event-bus.d.ts +21 -0
- package/lib/typescript/src/common/network-service.d.ts +32 -0
- package/lib/typescript/{common → src/common}/reporter.d.ts +2 -1
- package/lib/typescript/src/common/storage-helper.d.ts +47 -0
- package/lib/typescript/{common → src/common}/utils.d.ts +25 -0
- package/lib/typescript/{eedl → src/eedl}/eedl.d.ts +43 -1
- package/lib/typescript/{index.d.ts → src/index.d.ts} +39 -5
- package/lib/typescript/{models → src/models}/mp-client-sdk.d.ts +7 -0
- package/lib/typescript/src/processors/visit-id.processor.d.ts +23 -0
- package/package.json +25 -36
- package/src/common/app-types.ts +33 -10
- package/src/common/constants.ts +0 -6
- package/src/common/data-store.ts +8 -30
- package/src/common/deeplink-helper.ts +181 -0
- package/src/common/device-info-helper.ts +190 -0
- package/src/common/event-bus.ts +39 -0
- package/src/common/network-service.ts +154 -21
- package/src/common/reporter.ts +97 -16
- package/src/common/storage-helper.ts +260 -0
- package/src/common/utils.ts +63 -2
- package/src/eedl/eedl.ts +225 -51
- package/src/index.tsx +346 -73
- package/src/models/mp-client-sdk.ts +8 -0
- package/src/processors/data-element.processor.ts +85 -7
- package/src/processors/visit-id.processor.ts +92 -22
- package/lib/commonjs/processors/trans-function.processor.js +0 -73
- package/lib/commonjs/processors/trans-function.processor.js.map +0 -1
- package/lib/module/processors/trans-function.processor.js +0 -66
- package/lib/module/processors/trans-function.processor.js.map +0 -1
- package/lib/typescript/common/event-bus.d.ts +0 -6
- package/lib/typescript/common/network-service.d.ts +0 -8
- package/lib/typescript/processors/trans-function.processor.d.ts +0 -12
- package/lib/typescript/processors/visit-id.processor.d.ts +0 -9
- package/src/processors/trans-function.processor.ts +0 -85
- /package/lib/typescript/{common → src/common}/logger.d.ts +0 -0
- /package/lib/typescript/{models → src/models}/geo-api-response.d.ts +0 -0
- /package/lib/typescript/{processors → src/processors}/data-element.processor.d.ts +0 -0
- /package/lib/typescript/{processors → src/processors}/geo-location.processor.d.ts +0 -0
- /package/lib/typescript/{processors → src/processors}/qc.processor.d.ts +0 -0
- /package/lib/typescript/{processors → src/processors}/tag.processor.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_constants","require","_logger","_flat","_eventBus","_reactNative","_reactNativeUrlPolyfill","_asyncStorage","_interopRequireDefault","e","__esModule","default","Utils","triggerEvent","eventName","payload","EventBus","calculateMsp","dim","limit","scale","width","height","_makeUniqueStringArray","input","Set","parseQueryParamsToObject","url","op","trim","length","urlObject","URL","searchParams","forEach","value","name","err","Logger","logError","isTablet","Dimensions","get","sleep","delay","Promise","resolve","setTimeout","dtToNum","deviceType","bwToNum","browser","langToNum","language","mergeMaps","toMerge","mapObject","Object","keys","key","applyTransformationResourceParam","paramValue","tf","tfItem","nm","eTyp","encodeURIComponent","Buffer","from","toString","isMatch","toTest","inputs","ignoreCase","fullMatch","isMatched","i","_val","convertToRegex","test","regExpEscape","replace","RegExp","split","map","join","safeExecute","fn","getUniqueID","Constants","LARGE_RANDOM_POOL","getHttp","response","fetch","method","headers","ok","Error","status","json","error","getValueFromAsyncStorage","defaultValue","AsyncStorage","getItem","JSON","parse","setValueToAsyncStorage","setItem","stringify","getSimpleDebugId","prefix","randomNumber","min","max","Math","ceil","random","unFlattenResourceParams","transformMap","item","pId","children","id","push","values","sort","sortAscending","unFlattenObject","obj","unflatten","object","delimiter","flattenObject","flatten","maxDepth","safe","exports"],"sources":["utils.ts"],"sourcesContent":["import { Constants } from './constants';\nimport { Logger } from './logger';\nimport type {\n BaseResourceParamType,\n SdkParamEncodingTransformer,\n TFType,\n} from '../models/mp-client-sdk';\nimport type { MapLike } from './app-types';\nimport { flatten, unflatten } from 'flat';\nimport { EventBus } from './event-bus';\nimport { Dimensions, ScaledSize } from 'react-native';\nimport { URL } from 'react-native-url-polyfill';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\n\nexport class Utils {\n static triggerEvent(eventName: string, payload: any): void {\n EventBus.triggerEvent(eventName, payload);\n }\n\n static calculateMsp(dim: ScaledSize, limit: number): boolean {\n return dim.scale * dim.width >= limit || dim.scale * dim.height >= limit;\n }\n\n static _makeUniqueStringArray(input: string[]): string[] {\n return [...new Set(input)];\n }\n\n static parseQueryParamsToObject(url?: string): Record<string, any> {\n const op: Record<string, any> = {};\n try {\n if (url && url?.trim().length > 0) {\n const urlObject = new URL(url);\n urlObject.searchParams.forEach((value, name) => {\n op[name] = value;\n });\n }\n } catch (err) {\n // TODO: Report error\n Logger.logError('Unable to parse query params', err);\n }\n return op;\n }\n\n static isTablet(): boolean {\n const dim = Dimensions.get('screen');\n return (\n (dim.scale < 2 && this.calculateMsp(dim, 1000)) ||\n (dim.scale >= 2 && this.calculateMsp(dim, 1900))\n );\n }\n\n static sleep(delay = 1000): Promise<void> {\n return new Promise((resolve: (val?: any) => void) => {\n setTimeout(() => {\n return resolve();\n }, delay);\n });\n }\n\n /**\n * deviceTypesMappings = {'1':'Desktop Web','2':'Mobile Web','3':'Tablet','4':'Other'};\n * @param deviceType\n */\n static dtToNum(deviceType: string): number {\n switch (deviceType) {\n case 'desktop':\n return 1;\n case 'mobile':\n return 2;\n case 'tablet':\n return 3;\n default:\n return 4;\n }\n }\n\n /**\n * static browserToOsMappings = {'101': 'ios','102': 'android', '7': 'Other'};\n * @param browser\n */\n static bwToNum(browser: string): number {\n switch (browser) {\n case 'ios':\n return 101;\n case 'android':\n return 102;\n default:\n return 7;\n }\n }\n\n static langToNum(language: string): number {\n if (language === 'en') {\n return 1;\n } else if (language === 'es') {\n return 2;\n } else {\n return 3;\n }\n }\n\n static mergeMaps<T>(\n input: MapLike<T>,\n ...toMerge: Array<MapLike<T>>\n ): MapLike<T> {\n if (!input) {\n input = {} as MapLike<T>;\n }\n for (const mapObject of toMerge) {\n if (mapObject) {\n Object.keys(mapObject).forEach((key: string) => {\n input[key] = mapObject[key];\n });\n }\n }\n return input;\n }\n\n static applyTransformationResourceParam(\n paramValue: string,\n tf: TFType | undefined\n ): any {\n if (!tf || tf.length === 0) {\n return paramValue;\n }\n\n if (typeof paramValue === 'undefined') {\n return paramValue;\n }\n\n // transformers here are expected to be ordered when we get it from the server after build\n for (let tfItem of tf) {\n if (tfItem.nm === 'enc') {\n // only url encode is implemented now\n tfItem = tfItem as SdkParamEncodingTransformer;\n if (tfItem.eTyp === 'URL_ENC') {\n paramValue = encodeURIComponent(paramValue);\n } else if (tfItem.eTyp === 'BASE64') {\n paramValue = Buffer.from(paramValue).toString('base64');\n }\n }\n }\n\n return paramValue;\n }\n\n /**\n * Verifies if the given 'toTest' string exists in any of the input array of strings.\n * By default, this method does a case sensitive match unless specified by the ignoreCase param.\n * @param toTest\n * @param inputs\n * @param ignoreCase - pass a value of 'true' to perform case-insensitive matching.\n * @param fullMatch\n */\n static isMatch(\n toTest: string,\n inputs: string[],\n ignoreCase: boolean,\n fullMatch: boolean\n ): boolean {\n if (!toTest) {\n return false;\n }\n let isMatched = false;\n for (let i = 0; i < inputs.length; i += 1) {\n const _val = inputs[i];\n if (_val) {\n if (this.convertToRegex(_val, ignoreCase, fullMatch).test(toTest)) {\n isMatched = true;\n break;\n }\n }\n }\n return isMatched;\n }\n\n static regExpEscape(input: string): string {\n return input.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n }\n\n static convertToRegex(\n input: string,\n ignoreCase: boolean,\n fullMatch: boolean\n ): RegExp {\n if (fullMatch) {\n return new RegExp(\n '^' + input.split(/\\*+/).map(this.regExpEscape).join('.*') + '$',\n ignoreCase ? 'i' : ''\n );\n } else {\n return new RegExp(\n input.split(/\\*+/).map(this.regExpEscape).join('.*'),\n ignoreCase ? 'i' : ''\n );\n }\n }\n\n static safeExecute(fn: (payload: any) => any, payload: any): any {\n try {\n return fn(payload);\n } catch (err) {\n Logger.logError('Error executing function: ', err);\n }\n }\n\n static getUniqueID(): string {\n return Constants.LARGE_RANDOM_POOL();\n }\n\n /**\n * Make HTTP GET request - React Native implementation\n * @param url URL to fetch\n * @returns Promise with response data\n */\n static async getHttp<T>(url: string): Promise<T> {\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n Logger.logError('HTTP GET request failed:', error);\n throw error;\n }\n }\n\n /**\n * Get value from AsyncStorage (React Native equivalent of sessionStorage)\n * @param key Storage key\n * @param defaultValue Default value if key not found\n * @returns Promise with stored value or default\n */\n static async getValueFromAsyncStorage<T>(\n key: string,\n defaultValue: T\n ): Promise<T> {\n try {\n const value = await AsyncStorage.getItem(key);\n return value ? JSON.parse(value) : defaultValue;\n } catch (error) {\n Logger.logError('Error getting value from AsyncStorage:', error);\n return defaultValue;\n }\n }\n\n /**\n * Set value to AsyncStorage (React Native equivalent of sessionStorage)\n * @param key Storage key\n * @param value Value to store\n */\n static async setValueToAsyncStorage(key: string, value: any): Promise<void> {\n try {\n await AsyncStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n Logger.logError('Error setting value to AsyncStorage:', error);\n }\n }\n\n static getSimpleDebugId(prefix?: string): string {\n return `${prefix ?? ''}${this.randomNumber(100000000, 99999999999)}`;\n }\n\n static randomNumber(min: number, max: number): number {\n return Math.ceil(Math.random() * (max - min) + min);\n }\n\n static unFlattenResourceParams<T extends BaseResourceParamType>(\n input: T[]\n ): MapLike<T> {\n if (!input || input.length === 0) {\n return {};\n }\n\n const transformMap: MapLike<T> = {};\n const op: MapLike<T> = {};\n // convert input into a map for quick search O(1)\n for (const item of input) {\n if (item.pId) {\n if (!transformMap[item.pId]) {\n item.children = [];\n transformMap[item.id] = item;\n } else {\n transformMap[item.pId].children.push(item);\n }\n } else {\n item.children = [];\n transformMap[item.id] = item;\n }\n }\n\n // sort children according to child_order inside children if they have any children\n for (const item of Object.values(transformMap)) {\n if (item.children && item.children.length > 0) {\n item.children = item.children.sort(Constants.sortAscending);\n op[item.nm] = item;\n } else {\n op[item.nm] = item;\n }\n }\n\n return op;\n }\n\n static unFlattenObject(obj: any): Record<string, any> {\n if (!obj) {\n return {};\n }\n return unflatten(obj, { object: false, delimiter: '.' });\n }\n\n static flattenObject(obj: any): Record<string, any> {\n if (!obj) {\n return {};\n }\n return flatten(obj, { maxDepth: 5, safe: true });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_constants","require","_logger","_flat","_eventBus","_reactNative","_reactNativeUrlPolyfill","_asyncStorage","_interopRequireDefault","_ulid","e","__esModule","default","MAX_PAYLOAD_SIZE_BYTES","Utils","triggerEvent","eventName","payload","EventBus","calculateMsp","dim","limit","scale","width","height","_makeUniqueStringArray","input","Set","parseQueryParamsToObject","url","op","trim","length","urlObject","URL","searchParams","forEach","value","name","err","Logger","logError","isTablet","Dimensions","get","sleep","delay","Promise","resolve","setTimeout","dtToNum","deviceType","bwToNum","browser","langToNum","language","mergeMaps","toMerge","mapObject","Object","keys","key","applyTransformationResourceParam","paramValue","tf","tfItem","nm","eTyp","encodeURIComponent","toBase64","isMatch","toTest","inputs","ignoreCase","fullMatch","isMatched","i","_val","convertToRegex","test","regExpEscape","replace","RegExp","split","map","join","safeExecute","fn","str","btoa","unescape","encodeToBase64","jsonStr","JSON","stringify","getPayloadSizeBytes","TextEncoder","encode","isPayloadOversized","getUniqueID","ulid","getHttp","response","fetch","method","headers","ok","Error","status","json","error","getValueFromAsyncStorage","defaultValue","AsyncStorage","getItem","parse","setValueToAsyncStorage","setItem","getSimpleDebugId","prefix","randomNumber","min","max","Math","ceil","random","unFlattenResourceParams","transformMap","item","pId","children","id","push","values","sort","Constants","sortAscending","unFlattenObject","obj","unflatten","object","delimiter","flattenObject","flatten","maxDepth","safe","exports"],"sources":["utils.ts"],"sourcesContent":["import { Constants } from './constants';\nimport { Logger } from './logger';\nimport type {\n BaseResourceParamType,\n SdkParamEncodingTransformer,\n TFType,\n} from '../models/mp-client-sdk';\nimport type { MapLike } from './app-types';\nimport { flatten, unflatten } from 'flat';\nimport { EventBus } from './event-bus';\nimport { Dimensions, ScaledSize } from 'react-native';\nimport { URL } from 'react-native-url-polyfill';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { ulid } from 'ulid';\n\n/** Maximum payload size in bytes (250KB) to prevent DoS attacks */\nconst MAX_PAYLOAD_SIZE_BYTES = 250 * 1024;\n\nexport class Utils {\n static triggerEvent(eventName: string, payload: any): void {\n EventBus.triggerEvent(eventName, payload);\n }\n\n static calculateMsp(dim: ScaledSize, limit: number): boolean {\n return dim.scale * dim.width >= limit || dim.scale * dim.height >= limit;\n }\n\n static _makeUniqueStringArray(input: string[]): string[] {\n return [...new Set(input)];\n }\n\n static parseQueryParamsToObject(url?: string): Record<string, any> {\n const op: Record<string, any> = {};\n try {\n if (url && url?.trim().length > 0) {\n const urlObject = new URL(url);\n urlObject.searchParams.forEach((value, name) => {\n op[name] = value;\n });\n }\n } catch (err) {\n // TODO: Report error\n Logger.logError('Unable to parse query params', err);\n }\n return op;\n }\n\n static isTablet(): boolean {\n const dim = Dimensions.get('screen');\n return (\n (dim.scale < 2 && this.calculateMsp(dim, 1000)) ||\n (dim.scale >= 2 && this.calculateMsp(dim, 1900))\n );\n }\n\n static sleep(delay = 1000): Promise<void> {\n return new Promise((resolve: (val?: any) => void) => {\n setTimeout(() => {\n return resolve();\n }, delay);\n });\n }\n\n /**\n * deviceTypesMappings = {'1':'Desktop Web','2':'Mobile Web','3':'Tablet','4':'Other'};\n * @param deviceType\n */\n static dtToNum(deviceType: string): number {\n switch (deviceType) {\n case 'desktop':\n return 1;\n case 'mobile':\n return 2;\n case 'tablet':\n return 3;\n default:\n return 4;\n }\n }\n\n /**\n * static browserToOsMappings = {'101': 'ios','102': 'android', '7': 'Other'};\n * @param browser\n */\n static bwToNum(browser: string): number {\n switch (browser) {\n case 'ios':\n return 101;\n case 'android':\n return 102;\n default:\n return 7;\n }\n }\n\n static langToNum(language: string): number {\n if (language === 'en') {\n return 1;\n } else if (language === 'es') {\n return 2;\n } else {\n return 3;\n }\n }\n\n static mergeMaps<T>(\n input: MapLike<T>,\n ...toMerge: Array<MapLike<T>>\n ): MapLike<T> {\n if (!input) {\n input = {} as MapLike<T>;\n }\n for (const mapObject of toMerge) {\n if (mapObject) {\n Object.keys(mapObject).forEach((key: string) => {\n input[key] = mapObject[key];\n });\n }\n }\n return input;\n }\n\n static applyTransformationResourceParam(\n paramValue: string,\n tf: TFType | undefined\n ): any {\n if (!tf || tf.length === 0) {\n return paramValue;\n }\n\n if (typeof paramValue === 'undefined') {\n return paramValue;\n }\n\n // transformers here are expected to be ordered when we get it from the server after build\n for (let tfItem of tf) {\n if (tfItem.nm === 'enc') {\n // only url encode is implemented now\n tfItem = tfItem as SdkParamEncodingTransformer;\n if (tfItem.eTyp === 'URL_ENC') {\n paramValue = encodeURIComponent(paramValue);\n } else if (tfItem.eTyp === 'BASE64') {\n paramValue = this.toBase64(paramValue);\n }\n }\n }\n\n return paramValue;\n }\n\n /**\n * Verifies if the given 'toTest' string exists in any of the input array of strings.\n * By default, this method does a case sensitive match unless specified by the ignoreCase param.\n * @param toTest\n * @param inputs\n * @param ignoreCase - pass a value of 'true' to perform case-insensitive matching.\n * @param fullMatch\n */\n static isMatch(\n toTest: string,\n inputs: string[],\n ignoreCase: boolean,\n fullMatch: boolean\n ): boolean {\n if (!toTest) {\n return false;\n }\n let isMatched = false;\n for (let i = 0; i < inputs.length; i += 1) {\n const _val = inputs[i];\n if (_val) {\n if (this.convertToRegex(_val, ignoreCase, fullMatch).test(toTest)) {\n isMatched = true;\n break;\n }\n }\n }\n return isMatched;\n }\n\n static regExpEscape(input: string): string {\n return input.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n }\n\n static convertToRegex(\n input: string,\n ignoreCase: boolean,\n fullMatch: boolean\n ): RegExp {\n if (fullMatch) {\n return new RegExp(\n '^' + input.split(/\\*+/).map(this.regExpEscape).join('.*') + '$',\n ignoreCase ? 'i' : ''\n );\n } else {\n return new RegExp(\n input.split(/\\*+/).map(this.regExpEscape).join('.*'),\n ignoreCase ? 'i' : ''\n );\n }\n }\n\n static safeExecute(fn: (payload: any) => any, payload: any): any {\n try {\n return fn(payload);\n } catch (err) {\n Logger.logError('Error executing function: ', err);\n }\n }\n\n /**\n * Encode string to Base64 - React Native compatible\n * Works with both ASCII and UTF-8 strings\n * @param str String to encode\n * @returns Base64 encoded string\n */\n static toBase64(str: string): string {\n try {\n // Handle UTF-8 strings properly using encodeURIComponent + unescape trick\n // This works in all JavaScript engines including React Native's Hermes/JSC\n return btoa(unescape(encodeURIComponent(str)));\n } catch (err) {\n Logger.logError('Error encoding to Base64:', err);\n return str; // Return original value if encoding fails\n }\n }\n\n /**\n * Encode an object payload to Base64 string\n * @param payload Object to encode\n * @returns Base64 encoded string, or empty string on error\n */\n static encodeToBase64(payload: Record<string, any>): string {\n try {\n const jsonStr = JSON.stringify(payload);\n return this.toBase64(jsonStr);\n } catch (err) {\n Logger.logError('Error encoding payload to Base64:', err);\n return '';\n }\n }\n\n /**\n * Get the size of a payload in bytes\n * @param payload Object to measure\n * @returns Size in bytes\n */\n static getPayloadSizeBytes(payload: Record<string, any>): number {\n try {\n const jsonStr = JSON.stringify(payload);\n // Use TextEncoder for accurate byte count (handles UTF-8)\n return new TextEncoder().encode(jsonStr).length;\n } catch (err) {\n Logger.logError('Error calculating payload size:', err);\n return 0;\n }\n }\n\n /**\n * Check if payload exceeds the maximum allowed size (250KB)\n * @param payload Object to check\n * @returns True if payload is oversized\n */\n static isPayloadOversized(payload: Record<string, any>): boolean {\n return this.getPayloadSizeBytes(payload) > MAX_PAYLOAD_SIZE_BYTES;\n }\n\n static getUniqueID(): string {\n return ulid();\n }\n\n /**\n * Make HTTP GET request - React Native implementation\n * @param url URL to fetch\n * @returns Promise with response data\n */\n static async getHttp<T>(url: string): Promise<T> {\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n Logger.logError('HTTP GET request failed:', error);\n throw error;\n }\n }\n\n /**\n * Get value from AsyncStorage (React Native equivalent of sessionStorage)\n * @param key Storage key\n * @param defaultValue Default value if key not found\n * @returns Promise with stored value or default\n */\n static async getValueFromAsyncStorage<T>(\n key: string,\n defaultValue: T\n ): Promise<T> {\n try {\n const value = await AsyncStorage.getItem(key);\n return value ? JSON.parse(value) : defaultValue;\n } catch (error) {\n Logger.logError('Error getting value from AsyncStorage:', error);\n return defaultValue;\n }\n }\n\n /**\n * Set value to AsyncStorage (React Native equivalent of sessionStorage)\n * @param key Storage key\n * @param value Value to store\n */\n static async setValueToAsyncStorage(key: string, value: any): Promise<void> {\n try {\n await AsyncStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n Logger.logError('Error setting value to AsyncStorage:', error);\n }\n }\n\n static getSimpleDebugId(prefix?: string): string {\n return `${prefix ?? ''}${this.randomNumber(100000000, 99999999999)}`;\n }\n\n static randomNumber(min: number, max: number): number {\n return Math.ceil(Math.random() * (max - min) + min);\n }\n\n static unFlattenResourceParams<T extends BaseResourceParamType>(\n input: T[]\n ): MapLike<T> {\n if (!input || input.length === 0) {\n return {};\n }\n\n const transformMap: MapLike<T> = {};\n const op: MapLike<T> = {};\n // convert input into a map for quick search O(1)\n for (const item of input) {\n if (item.pId) {\n if (!transformMap[item.pId]) {\n item.children = [];\n transformMap[item.id] = item;\n } else {\n transformMap[item.pId].children.push(item);\n }\n } else {\n item.children = [];\n transformMap[item.id] = item;\n }\n }\n\n // sort children according to child_order inside children if they have any children\n for (const item of Object.values(transformMap)) {\n if (item.children && item.children.length > 0) {\n item.children = item.children.sort(Constants.sortAscending);\n op[item.nm] = item;\n } else {\n op[item.nm] = item;\n }\n }\n\n return op;\n }\n\n static unFlattenObject(obj: any): Record<string, any> {\n if (!obj) {\n return {};\n }\n return unflatten(obj, { object: false, delimiter: '.' });\n }\n\n static flattenObject(obj: any): Record<string, any> {\n if (!obj) {\n return {};\n }\n return flatten(obj, { maxDepth: 5, safe: true });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,7 +7,7 @@ exports.MpDataLayerHelper = void 0;
|
|
|
7
7
|
var _utils = require("../common/utils");
|
|
8
8
|
var _logger = require("../common/logger");
|
|
9
9
|
var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
|
|
10
|
-
var
|
|
10
|
+
var _ulid = require("ulid");
|
|
11
11
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
12
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
13
13
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
@@ -17,8 +17,8 @@ const eventsToPersist = {
|
|
|
17
17
|
mp_purchase: '_mpPendingPurchase'
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
//
|
|
21
|
-
const
|
|
20
|
+
// Maximum number of events to keep in memory for state tracking and queues
|
|
21
|
+
const MAX_TRACKED_EVENTS = 500;
|
|
22
22
|
class MpDataLayerHelper {
|
|
23
23
|
constructor(dlEventName, dlInitMode, dlInitEvent, storageKeyName = '_mpdls') {
|
|
24
24
|
this.dlEventName = dlEventName;
|
|
@@ -32,7 +32,13 @@ class MpDataLayerHelper {
|
|
|
32
32
|
_defineProperty(this, "dlInitEvent", void 0);
|
|
33
33
|
_defineProperty(this, "receivedInitialEvent", false);
|
|
34
34
|
_defineProperty(this, "eventQueue", []);
|
|
35
|
+
_defineProperty(this, "isProcessing", false);
|
|
35
36
|
_defineProperty(this, "isEntryPoint", 0);
|
|
37
|
+
// Event deduplication
|
|
38
|
+
_defineProperty(this, "eventDedupWindowMs", 5000);
|
|
39
|
+
// Default 5 seconds
|
|
40
|
+
_defineProperty(this, "eventDeduplicationCache", new Map());
|
|
41
|
+
_defineProperty(this, "purchaseTransactionCache", new Map());
|
|
36
42
|
this.dlInitEvent = dlInitEvent;
|
|
37
43
|
this.resetEntryPointInfo();
|
|
38
44
|
if (this.dlInitMode !== 'manual') {
|
|
@@ -66,25 +72,139 @@ class MpDataLayerHelper {
|
|
|
66
72
|
}
|
|
67
73
|
}
|
|
68
74
|
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Set the event deduplication window
|
|
78
|
+
* @param windowMs Window in milliseconds (0 to disable)
|
|
79
|
+
*/
|
|
80
|
+
setDeduplicationWindow(windowMs) {
|
|
81
|
+
this.eventDedupWindowMs = windowMs;
|
|
82
|
+
_logger.Logger.logDbg(`Event deduplication window set to: ${windowMs}ms`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Generate a unique fingerprint for an event
|
|
87
|
+
* @param eventName Event name
|
|
88
|
+
* @param payload Event payload
|
|
89
|
+
* @returns Fingerprint string
|
|
90
|
+
*/
|
|
91
|
+
getEventFingerprint(eventName, payload) {
|
|
92
|
+
try {
|
|
93
|
+
// Use JSON.stringify for deterministic payload representation
|
|
94
|
+
const payloadStr = JSON.stringify(payload);
|
|
95
|
+
return `${eventName}::${payloadStr}`;
|
|
96
|
+
} catch (err) {
|
|
97
|
+
_logger.Logger.logError('Error generating event fingerprint', err);
|
|
98
|
+
return `${eventName}::${Date.now()}`; // Fallback to never match
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Extract transaction_id from purchase event payload
|
|
104
|
+
* @param payload Event payload
|
|
105
|
+
* @returns transaction_id or null
|
|
106
|
+
*/
|
|
107
|
+
extractTransactionId(payload) {
|
|
108
|
+
// Check common field names for transaction_id
|
|
109
|
+
return payload.transaction_id || payload.transactionId || payload.orderId || payload.order_id || null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Check if event is a duplicate within the deduplication window
|
|
114
|
+
* @param eventName Event name
|
|
115
|
+
* @param payload Event payload
|
|
116
|
+
* @returns true if duplicate, false otherwise
|
|
117
|
+
*/
|
|
118
|
+
isDuplicateEvent(eventName, payload) {
|
|
119
|
+
// If deduplication is disabled (window = 0), never treat as duplicate
|
|
120
|
+
if (this.eventDedupWindowMs === 0) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
const now = Date.now();
|
|
124
|
+
|
|
125
|
+
// Special handling for purchase events - deduplicate by transaction_id
|
|
126
|
+
if (eventName === 'purchase' || eventName === 'mp_purchase') {
|
|
127
|
+
const transactionId = this.extractTransactionId(payload);
|
|
128
|
+
if (transactionId) {
|
|
129
|
+
const lastSeenTs = this.purchaseTransactionCache.get(transactionId);
|
|
130
|
+
if (lastSeenTs && now - lastSeenTs < this.eventDedupWindowMs) {
|
|
131
|
+
_logger.Logger.logDbg(`Duplicate purchase event detected (transaction_id: ${transactionId}) within ${this.eventDedupWindowMs}ms window, skipping`);
|
|
132
|
+
return true; // Duplicate
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Record this transaction
|
|
136
|
+
this.purchaseTransactionCache.set(transactionId, now);
|
|
137
|
+
} else {
|
|
138
|
+
_logger.Logger.logDbg('Purchase event without transaction_id, cannot deduplicate by transaction');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// General event deduplication by full fingerprint
|
|
143
|
+
const fingerprint = this.getEventFingerprint(eventName, payload);
|
|
144
|
+
const lastSeenTs = this.eventDeduplicationCache.get(fingerprint);
|
|
145
|
+
if (lastSeenTs && now - lastSeenTs < this.eventDedupWindowMs) {
|
|
146
|
+
_logger.Logger.logDbg(`Duplicate event detected (${eventName}) within ${this.eventDedupWindowMs}ms window, skipping`);
|
|
147
|
+
return true; // Duplicate
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Record this event
|
|
151
|
+
this.eventDeduplicationCache.set(fingerprint, now);
|
|
152
|
+
|
|
153
|
+
// Cleanup old entries periodically
|
|
154
|
+
this.cleanupDeduplicationCache(now);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Remove expired entries from deduplication caches
|
|
160
|
+
* @param now Current timestamp
|
|
161
|
+
*/
|
|
162
|
+
cleanupDeduplicationCache(now) {
|
|
163
|
+
// Cleanup general event cache
|
|
164
|
+
for (const [fingerprint, timestamp] of this.eventDeduplicationCache.entries()) {
|
|
165
|
+
if (now - timestamp > this.eventDedupWindowMs) {
|
|
166
|
+
this.eventDeduplicationCache.delete(fingerprint);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Cleanup purchase transaction cache
|
|
171
|
+
for (const [transactionId, timestamp] of this.purchaseTransactionCache.entries()) {
|
|
172
|
+
if (now - timestamp > this.eventDedupWindowMs) {
|
|
173
|
+
this.purchaseTransactionCache.delete(transactionId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
69
177
|
pushEvent(eventName, payload) {
|
|
70
178
|
_logger.Logger.logDbg('EV Push Event:: ', JSON.stringify(payload));
|
|
179
|
+
|
|
180
|
+
// Special events bypass queue and process immediately (no deduplication)
|
|
71
181
|
if (eventName === 'set' || eventName === 'persist' || eventName === 'clear' || eventName === 'user_info') {
|
|
72
182
|
// process regardless - fire and forget for async operations
|
|
73
183
|
this.processQItems(eventName, payload).catch(err => _logger.Logger.logError('Error processing event', err));
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Check for duplicate events BEFORE queuing
|
|
188
|
+
if (this.isDuplicateEvent(eventName, payload)) {
|
|
189
|
+
// Duplicate detected, skip this event
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Track if we received the initial event
|
|
194
|
+
if (!this.receivedInitialEvent) {
|
|
195
|
+
this.receivedInitialEvent = eventName === this.dlInitEvent;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Always queue events for sequential processing (with eviction of oldest if at capacity)
|
|
199
|
+
if (this.eventQueue.length >= MAX_TRACKED_EVENTS) {
|
|
200
|
+
const evictedEvent = this.eventQueue.shift();
|
|
201
|
+
_logger.Logger.logDbg(`Event queue at capacity (${MAX_TRACKED_EVENTS}), evicting oldest event:`, evictedEvent === null || evictedEvent === void 0 ? void 0 : evictedEvent[0]);
|
|
202
|
+
}
|
|
203
|
+
this.eventQueue.push([eventName, payload]);
|
|
204
|
+
|
|
205
|
+
// Trigger processing if ready and initial event received
|
|
206
|
+
if (this.isReady && this.receivedInitialEvent) {
|
|
207
|
+
this.processNext();
|
|
88
208
|
}
|
|
89
209
|
}
|
|
90
210
|
async processQItems(eventName, payload) {
|
|
@@ -124,7 +244,7 @@ class MpDataLayerHelper {
|
|
|
124
244
|
}
|
|
125
245
|
setUserData(payload) {
|
|
126
246
|
var _payload$zip, _payload$zip2;
|
|
127
|
-
if (payload !== null && payload !== void 0 && payload.zip && (payload === null || payload === void 0
|
|
247
|
+
if (payload !== null && payload !== void 0 && payload.zip && (payload === null || payload === void 0 || (_payload$zip = payload.zip) === null || _payload$zip === void 0 ? void 0 : _payload$zip.length) > 0 && (payload === null || payload === void 0 || (_payload$zip2 = payload.zip) === null || _payload$zip2 === void 0 ? void 0 : _payload$zip2.indexOf('-')) > -1) {
|
|
128
248
|
payload.zip = payload.zip.split('-')[0].trim();
|
|
129
249
|
}
|
|
130
250
|
const uif = {};
|
|
@@ -242,8 +362,8 @@ class MpDataLayerHelper {
|
|
|
242
362
|
if (eventName === 'reset' || eventName === this.dlInitEvent) {
|
|
243
363
|
this.reset();
|
|
244
364
|
|
|
245
|
-
// add an init event based
|
|
246
|
-
model['page_load_uid'] =
|
|
365
|
+
// add an init event based ulid to the core data model
|
|
366
|
+
model['page_load_uid'] = (0, _ulid.ulid)();
|
|
247
367
|
model['is_entry_point'] = this.getIsEntryPointValue();
|
|
248
368
|
if (model['is_entry_point'] === 1) {
|
|
249
369
|
// Note: In React Native, we don't have document.referrer, so we'll use a placeholder
|
|
@@ -282,7 +402,10 @@ class MpDataLayerHelper {
|
|
|
282
402
|
model: _clone
|
|
283
403
|
}));
|
|
284
404
|
|
|
285
|
-
// add to state tracker
|
|
405
|
+
// add to state tracker (with eviction of oldest events if at capacity)
|
|
406
|
+
if (this.stateTracker.length >= MAX_TRACKED_EVENTS) {
|
|
407
|
+
this.stateTracker.shift(); // Remove oldest event
|
|
408
|
+
}
|
|
286
409
|
this.stateTracker.push(eventPayload);
|
|
287
410
|
|
|
288
411
|
// trigger an event that can be listened to by other listeners
|
|
@@ -337,37 +460,68 @@ class MpDataLayerHelper {
|
|
|
337
460
|
this._masterDataLayer = {};
|
|
338
461
|
return true;
|
|
339
462
|
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Full shutdown - clears all state and allows reinitialization
|
|
466
|
+
*/
|
|
467
|
+
shutdown() {
|
|
468
|
+
this.isReady = false;
|
|
469
|
+
this._masterDataLayer = {};
|
|
470
|
+
this._persistedVars = {};
|
|
471
|
+
this.eventProcessors = {};
|
|
472
|
+
this.stateTracker = [];
|
|
473
|
+
this.receivedInitialEvent = false;
|
|
474
|
+
this.eventQueue = [];
|
|
475
|
+
this.isProcessing = false;
|
|
476
|
+
this.isEntryPoint = 0;
|
|
477
|
+
this.eventDeduplicationCache.clear();
|
|
478
|
+
this.purchaseTransactionCache.clear();
|
|
479
|
+
_logger.Logger.logDbg('EEDL shutdown complete');
|
|
480
|
+
}
|
|
340
481
|
ready() {
|
|
341
482
|
this.isReady = true;
|
|
342
483
|
if (this.receivedInitialEvent) {
|
|
343
484
|
_logger.Logger.logDbg('Initial event received: ', this.dlInitEvent);
|
|
344
|
-
//
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
485
|
+
// Start processing queue if we have events and initial event received
|
|
486
|
+
if (this.eventQueue.length > 0) {
|
|
487
|
+
this.processNext();
|
|
488
|
+
}
|
|
348
489
|
} else {
|
|
349
490
|
_logger.Logger.logDbg(`Initial event (${this.dlInitEvent}) NOT received. Events will be queued`);
|
|
350
491
|
}
|
|
351
492
|
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
//
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Process next event in queue with atomic check-and-set
|
|
496
|
+
* Ensures only one event processes at a time, eliminating race conditions
|
|
497
|
+
*/
|
|
498
|
+
processNext() {
|
|
499
|
+
// Atomic check-and-set: if already processing or queue empty, return
|
|
500
|
+
if (this.isProcessing || this.eventQueue.length === 0) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
this.isProcessing = true;
|
|
504
|
+
|
|
505
|
+
// Dequeue from front for FIFO ordering
|
|
506
|
+
const item = this.eventQueue.shift();
|
|
507
|
+
if (item) {
|
|
508
|
+
const [eventName, payload] = item;
|
|
509
|
+
|
|
510
|
+
// Process the event
|
|
511
|
+
this.processQItems(eventName, payload).catch(err => {
|
|
512
|
+
_logger.Logger.logError('Error processing event in queue', err);
|
|
513
|
+
}).finally(() => {
|
|
514
|
+
// Reset processing flag
|
|
515
|
+
this.isProcessing = false;
|
|
516
|
+
|
|
517
|
+
// Process next item if queue not empty
|
|
518
|
+
// Use setImmediate for non-blocking event loop
|
|
519
|
+
if (this.eventQueue.length > 0) {
|
|
520
|
+
setImmediate(() => this.processNext());
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
} else {
|
|
524
|
+
this.isProcessing = false;
|
|
371
525
|
}
|
|
372
526
|
}
|
|
373
527
|
getIsEntryPointValue() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_utils","require","_logger","_asyncStorage","_interopRequireDefault","_nonSecure","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","eventsToPersist","user_info","mp_purchase","getUUIDV4","customAlphabet","MpDataLayerHelper","constructor","dlEventName","dlInitMode","dlInitEvent","storageKeyName","resetEntryPointInfo","isReady","ready","init","globalEventListeners","globalEventListenerKeys","keys","length","key","registerProcessor","persistedEvent","AsyncStorage","getItem","event","JSON","parse","pushEvent","eventName","eventPayload","err","Logger","logError","payload","logDbg","stringify","processQItems","catch","receivedInitialEvent","eventQueue","push","setDl","storeData","Array","isArray","deleteData","setUserData","eventProcessor","obj","_tmp","Utils","flattenObject","_masterDataLayer","assign","getDl","_payload$zip","_payload$zip2","zip","indexOf","split","trim","uif","_persistedVars","pid","user_pid","email","user_email","phone","user_phone","p","country","user_country","cy","city","user_city","ct","state","user_state","st","fName","fn","lName","ln","zip_code","z","chips","fullData","getFullData","chip","storeFullData","reloadPersistedVars","storedData","setItem","model","reset","getIsEntryPointValue","undefined","ev","getUniqueID","Date","now","_clone","eventTs","stateTracker","triggerEvent","eventProcessors","processor","safeExecute","overrideDlInitEvent","eventType","get","getState","hasEventHappened","find","drainQueue","_temp","splice","initialEventObjectIndex","findIndex","_","item","currentValue","isEntryPoint","exports"],"sources":["eedl.ts"],"sourcesContent":["import { Utils } from '../common/utils';\nimport type { EventProcessorFn, MapLike, TypedAny } from '../common/app-types';\nimport { Logger } from '../common/logger';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { customAlphabet } from 'nanoid/non-secure';\n\nconst eventsToPersist: Record<string, string> = {\n user_info: '_mpPendingUserInfo',\n mp_purchase: '_mpPendingPurchase',\n};\n\n// UUID v4 generator for React Native\nconst getUUIDV4 = customAlphabet(\n '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',\n 36\n);\n\nexport class MpDataLayerHelper {\n isReady = false;\n _masterDataLayer: MapLike = {};\n _persistedVars: MapLike = {};\n eventProcessors: Record<string, any> = {};\n stateTracker: Array<any> = [];\n dlInitEvent: string;\n receivedInitialEvent = false;\n eventQueue: Array<any> = [];\n private isEntryPoint = 0;\n\n constructor(\n private readonly dlEventName: string,\n private readonly dlInitMode: string,\n dlInitEvent: string,\n private readonly storageKeyName: string = '_mpdls'\n ) {\n this.dlInitEvent = dlInitEvent;\n this.resetEntryPointInfo();\n\n if (this.dlInitMode !== 'manual') {\n this.isReady = true;\n }\n\n if (this.isReady) {\n this.ready();\n }\n }\n\n async init(\n globalEventListeners: Record<string, EventProcessorFn>\n ): Promise<void> {\n // register any global event listeners passed through to the init command\n const globalEventListenerKeys = Object.keys(globalEventListeners || {});\n if (globalEventListenerKeys?.length > 0) {\n for (const key of globalEventListenerKeys) {\n if (typeof globalEventListeners[key] !== 'undefined') {\n this.registerProcessor(key, globalEventListeners[key] as any);\n }\n }\n }\n\n // Load persisted events from AsyncStorage\n for (const key of Object.keys(eventsToPersist)) {\n try {\n const persistedEvent = await AsyncStorage.getItem(eventsToPersist[key]);\n if (persistedEvent) {\n const event: { eventName: string; eventPayload: any } =\n JSON.parse(persistedEvent);\n this.pushEvent(event.eventName, event.eventPayload);\n }\n } catch (err) {\n Logger.logError('Error parsing persisted event', err);\n }\n }\n }\n\n pushEvent(eventName: string, payload: MapLike): void {\n Logger.logDbg('EV Push Event:: ', JSON.stringify(payload));\n if (\n eventName === 'set' ||\n eventName === 'persist' ||\n eventName === 'clear' ||\n eventName === 'user_info'\n ) {\n // process regardless - fire and forget for async operations\n this.processQItems(eventName, payload).catch((err) =>\n Logger.logError('Error processing event', err)\n );\n } else {\n if (!this.receivedInitialEvent) {\n // set only if this is not true already\n this.receivedInitialEvent = eventName === this.dlInitEvent;\n this.eventQueue.push([eventName, payload]);\n if (this.isReady && this.receivedInitialEvent) {\n this.ready();\n }\n } else if (!this.isReady) {\n this.eventQueue.push([eventName, payload]);\n } else {\n // fire and forget for async operations\n this.processQItems(eventName, payload).catch((err) =>\n Logger.logError('Error processing event', err)\n );\n }\n }\n }\n\n async processQItems(eventName: string, payload: MapLike): Promise<void> {\n try {\n if (eventName === 'set') {\n this.setDl(payload);\n } else if (eventName === 'persist') {\n await this.storeData(payload?.key, payload?.value);\n } else if (eventName === 'clear') {\n if (Array.isArray(payload) && payload.length > 0) {\n await this.deleteData(payload as string[]);\n }\n } else if (eventName === 'user_info') {\n this.setUserData(payload);\n } else {\n await this.eventProcessor(eventName, payload);\n }\n /* Make sure nothing is written below this line. If you do so, remember to return on error conditions above */\n } catch (err) {\n Logger.logError('Error performing init setup on dl', err);\n }\n }\n\n /**\n * Private Processor for 'set' command object\n */\n setDl(obj: TypedAny | undefined): boolean {\n if (!obj) {\n return false;\n }\n const _tmp = Utils.flattenObject(obj);\n this._masterDataLayer = Object.assign({}, this._masterDataLayer, _tmp);\n return true;\n }\n\n getDl(): TypedAny {\n return this._masterDataLayer;\n }\n\n private setUserData(payload: {\n pid?: string;\n email?: string;\n phone?: string;\n country?: string;\n city?: string;\n state?: string;\n fName?: string;\n lName?: string;\n zip?: string;\n }): void {\n if (\n payload?.zip &&\n payload?.zip?.length > 0 &&\n payload?.zip?.indexOf('-') > -1\n ) {\n payload.zip = payload.zip.split('-')[0].trim();\n }\n\n const uif: any = {};\n this._persistedVars = this._persistedVars || {};\n this._persistedVars.uif = this._persistedVars.uif || {};\n\n if (payload.pid) {\n this._persistedVars.uif.user_pid = payload.pid;\n uif.pid = payload.pid;\n }\n\n if (payload.email) {\n this._persistedVars.uif.user_email = payload.email;\n uif.e = payload.email;\n }\n\n if (payload.phone) {\n this._persistedVars.uif.user_phone = payload.phone;\n uif.p = payload.phone;\n }\n\n if (payload.country) {\n this._persistedVars.uif.user_country = payload.country;\n uif.cy = payload.country;\n }\n\n if (payload.city) {\n this._persistedVars.uif.user_city = payload.city;\n uif.ct = payload.city;\n }\n\n if (payload.state) {\n this._persistedVars.uif.user_state = payload.state;\n uif.st = payload.state;\n }\n\n if (payload.fName) {\n this._persistedVars.uif.fn = payload.fName;\n uif.fn = payload.fName;\n }\n\n if (payload.lName) {\n this._persistedVars.uif.ln = payload.lName;\n uif.ln = payload.lName;\n }\n\n if (payload.zip) {\n this._persistedVars.uif.zip_code = payload.zip;\n uif.z = payload.zip;\n }\n\n if (Object.keys(uif).length > 0) {\n this.storeData('uif', uif);\n }\n }\n\n private async deleteData(chips: string[]): Promise<void> {\n const fullData = await this.getFullData();\n for (const chip of chips) {\n if (typeof chip === 'string') {\n delete fullData[chip];\n }\n }\n await this.storeFullData(fullData);\n }\n\n private async storeData(chip: string, value: any): Promise<void> {\n if (typeof chip !== 'undefined' && typeof value !== 'undefined') {\n const fullData = await this.getFullData();\n fullData[chip] = value;\n await this.storeFullData(fullData);\n this._persistedVars[chip] = value;\n } else {\n Logger.logError('Both key and value are required for persisting data');\n }\n }\n\n private async reloadPersistedVars(): Promise<void> {\n this._persistedVars = await this.getFullData();\n }\n\n private async getFullData(): Promise<MapLike> {\n try {\n const storedData = await AsyncStorage.getItem(this.storageKeyName);\n if (storedData) {\n return JSON.parse(storedData);\n }\n } catch (err) {\n Logger.logError('Error reloading persisted variables', err);\n }\n return {};\n }\n\n private async storeFullData(fullData: MapLike): Promise<void> {\n this._persistedVars = fullData;\n try {\n await AsyncStorage.setItem(this.storageKeyName, JSON.stringify(fullData));\n } catch (err) {\n Logger.logError('Error storing data', err);\n }\n }\n\n // private async getStoredData<T = any>(chip: string, defValue: T): Promise<T> {\n // let value: T;\n // try {\n // const storedData = await AsyncStorage.getItem(this.storageKeyName);\n // if (storedData) {\n // const parsedData = JSON.parse(storedData);\n // value = parsedData[chip];\n // }\n // } catch (err) {\n // Logger.logError('Error parsing stored data', err);\n // }\n // return value ?? defValue;\n // }\n\n /**\n * Private event processor. Idea is that whenever an event is detected, we create a copy of the master data layer,\n * add the event variables, and trigger the event requested when initializing the data layer helper\n * @param eventName\n * @param model\n */\n async eventProcessor(\n eventName: string,\n model: TypedAny | undefined\n ): Promise<void> {\n model = model ?? {};\n\n /**\n * The following If block clears the data layer when the initial event is received.\n * This is done to prevent value carry overs from one page to another in single page apps\n */\n if (eventName === 'reset' || eventName === this.dlInitEvent) {\n this.reset();\n\n // add an init event based uuid to the core data model\n model['page_load_uid'] = getUUIDV4();\n model['is_entry_point'] = this.getIsEntryPointValue();\n if (model['is_entry_point'] === 1) {\n // Note: In React Native, we don't have document.referrer, so we'll use a placeholder\n model['entry_point_referrer'] = '';\n }\n\n this.setDl(model);\n model = undefined;\n }\n\n if (model) {\n model = {\n ev: (model || {}) as any,\n };\n } else {\n model = {};\n }\n\n await this.reloadPersistedVars();\n\n // get persisted values and add them into the event model\n model['p'] = this._persistedVars ?? {};\n\n // generate a unique id for each event automatically\n model['ev._id'] = Utils.getUniqueID();\n\n // add the event ts also for every event\n model['ev._tsMs'] = Date.now();\n\n model['ev._eventName'] = eventName;\n\n model['ev._persistKey'] = eventsToPersist[eventName] || null;\n\n model = Utils.flattenObject(model);\n\n // create a clone of master data layer and merge event model to it\n const _clone = Object.assign({}, this._masterDataLayer, model);\n const eventTs = Date.now();\n\n const eventPayload = JSON.parse(\n JSON.stringify({\n eventName: eventName,\n eventTs: eventTs,\n model: _clone,\n })\n );\n\n // add to state tracker\n this.stateTracker.push(eventPayload);\n\n // trigger an event that can be listened to by other listeners\n Utils.triggerEvent(this.dlEventName, eventPayload);\n\n // see if there are any other registered processors and invoke them\n if (this.eventProcessors[eventName]) {\n for (const processor of this.eventProcessors[eventName]) {\n Utils.safeExecute(processor, eventPayload);\n }\n }\n }\n\n overrideDlInitEvent(eventName: string): string {\n if (eventName && eventName.length > 0) {\n this.dlInitEvent = eventName;\n return 'Dl Init Event Override Successful';\n }\n return 'Dl Init Event Override Failed';\n }\n\n /**\n * Exposed method for registering custom processors for events\n * @param eventType\n * @param fn\n */\n registerProcessor(eventType: string, fn: EventProcessorFn): void {\n if (!eventType || !fn || typeof fn !== 'function') {\n Logger.logError('EventType and Fn are mandatory');\n return;\n }\n if (!this.eventProcessors[eventType]) {\n this.eventProcessors[eventType] = [];\n }\n\n this.eventProcessors[eventType].push(fn);\n }\n\n /**\n * Exposed getter for getting values from data layer\n * @param key\n * @returns {*|undefined}\n */\n get(key: string): MapLike | undefined {\n return this._masterDataLayer[key] || undefined;\n }\n\n getState(): TypedAny[] {\n return this.stateTracker;\n }\n\n hasEventHappened(key: string): boolean {\n return !!this.stateTracker.find((i) => i.eventName === key);\n }\n\n reset(): boolean {\n this._masterDataLayer = {};\n return true;\n }\n\n ready(): void {\n this.isReady = true;\n if (this.receivedInitialEvent) {\n Logger.logDbg('Initial event received: ', this.dlInitEvent);\n // drain queue only if the initial configured event has been received,\n // otherwise mark isReady but dont drain the queue. queue will be drained first when the init\n // event is received\n this.drainQueue().catch((err) =>\n Logger.logError('Error draining queue', err)\n );\n } else {\n Logger.logDbg(\n `Initial event (${this.dlInitEvent}) NOT received. Events will be queued`\n );\n }\n }\n\n async drainQueue(): Promise<void> {\n Logger.logDbg('drainQueue...');\n // create a copy of the array\n const _temp = [...this.eventQueue];\n // clean the array\n this.eventQueue.splice(0, this.eventQueue.length);\n // find the event with dlInit event and execute it first, rest continues\n const initialEventObjectIndex = _temp.findIndex(\n (e) => [e][0]?.[0] === this.dlInitEvent\n );\n if (initialEventObjectIndex > -1) {\n // splice and execute it\n await this.processQItems(\n _temp[initialEventObjectIndex][0],\n _temp[initialEventObjectIndex][1]\n );\n _temp.splice(initialEventObjectIndex, 1);\n }\n // continue with other items\n for (const item of _temp) {\n await this.processQItems(item[0], item[1]);\n }\n }\n\n getIsEntryPointValue(): number {\n // In React Native, we'll use a simple approach for entry point tracking\n // This could be enhanced with proper session storage implementation\n const currentValue = this.isEntryPoint;\n this.isEntryPoint = 0; // Reset after first use\n return currentValue;\n }\n\n resetEntryPointInfo(): void {\n // In React Native, we'll default to entry point = 1 for the first session\n // This could be enhanced with proper referrer tracking if needed\n this.isEntryPoint = 1;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_utils","require","_logger","_asyncStorage","_interopRequireDefault","_ulid","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","eventsToPersist","user_info","mp_purchase","MAX_TRACKED_EVENTS","MpDataLayerHelper","constructor","dlEventName","dlInitMode","dlInitEvent","storageKeyName","Map","resetEntryPointInfo","isReady","ready","init","globalEventListeners","globalEventListenerKeys","keys","length","key","registerProcessor","persistedEvent","AsyncStorage","getItem","event","JSON","parse","pushEvent","eventName","eventPayload","err","Logger","logError","setDeduplicationWindow","windowMs","eventDedupWindowMs","logDbg","getEventFingerprint","payload","payloadStr","stringify","Date","now","extractTransactionId","transaction_id","transactionId","orderId","order_id","isDuplicateEvent","lastSeenTs","purchaseTransactionCache","get","set","fingerprint","eventDeduplicationCache","cleanupDeduplicationCache","timestamp","entries","delete","processQItems","catch","receivedInitialEvent","eventQueue","evictedEvent","shift","push","processNext","setDl","storeData","Array","isArray","deleteData","setUserData","eventProcessor","obj","_tmp","Utils","flattenObject","_masterDataLayer","assign","getDl","_payload$zip","_payload$zip2","zip","indexOf","split","trim","uif","_persistedVars","pid","user_pid","email","user_email","phone","user_phone","p","country","user_country","cy","city","user_city","ct","state","user_state","st","fName","fn","lName","ln","zip_code","z","chips","fullData","getFullData","chip","storeFullData","reloadPersistedVars","storedData","setItem","model","reset","ulid","getIsEntryPointValue","undefined","ev","getUniqueID","_clone","eventTs","stateTracker","triggerEvent","eventProcessors","processor","safeExecute","overrideDlInitEvent","eventType","getState","hasEventHappened","find","shutdown","isProcessing","isEntryPoint","clear","item","finally","setImmediate","currentValue","exports"],"sources":["eedl.ts"],"sourcesContent":["import { Utils } from '../common/utils';\nimport type { EventProcessorFn, MapLike, TypedAny } from '../common/app-types';\nimport { Logger } from '../common/logger';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { ulid } from 'ulid';\n\nconst eventsToPersist: Record<string, string> = {\n user_info: '_mpPendingUserInfo',\n mp_purchase: '_mpPendingPurchase',\n};\n\n// Maximum number of events to keep in memory for state tracking and queues\nconst MAX_TRACKED_EVENTS = 500;\n\nexport class MpDataLayerHelper {\n isReady = false;\n _masterDataLayer: MapLike = {};\n _persistedVars: MapLike = {};\n eventProcessors: Record<string, any> = {};\n stateTracker: Array<any> = [];\n dlInitEvent: string;\n receivedInitialEvent = false;\n eventQueue: Array<any> = [];\n private isProcessing = false;\n private isEntryPoint = 0;\n\n // Event deduplication\n private eventDedupWindowMs = 5000; // Default 5 seconds\n private eventDeduplicationCache: Map<string, number> = new Map();\n private purchaseTransactionCache: Map<string, number> = new Map();\n\n constructor(\n private readonly dlEventName: string,\n private readonly dlInitMode: string,\n dlInitEvent: string,\n private readonly storageKeyName: string = '_mpdls'\n ) {\n this.dlInitEvent = dlInitEvent;\n this.resetEntryPointInfo();\n\n if (this.dlInitMode !== 'manual') {\n this.isReady = true;\n }\n\n if (this.isReady) {\n this.ready();\n }\n }\n\n async init(\n globalEventListeners: Record<string, EventProcessorFn>\n ): Promise<void> {\n // register any global event listeners passed through to the init command\n const globalEventListenerKeys = Object.keys(globalEventListeners || {});\n if (globalEventListenerKeys?.length > 0) {\n for (const key of globalEventListenerKeys) {\n if (typeof globalEventListeners[key] !== 'undefined') {\n this.registerProcessor(key, globalEventListeners[key] as any);\n }\n }\n }\n\n // Load persisted events from AsyncStorage\n for (const key of Object.keys(eventsToPersist)) {\n try {\n const persistedEvent = await AsyncStorage.getItem(eventsToPersist[key]);\n if (persistedEvent) {\n const event: { eventName: string; eventPayload: any } =\n JSON.parse(persistedEvent);\n this.pushEvent(event.eventName, event.eventPayload);\n }\n } catch (err) {\n Logger.logError('Error parsing persisted event', err);\n }\n }\n }\n\n /**\n * Set the event deduplication window\n * @param windowMs Window in milliseconds (0 to disable)\n */\n setDeduplicationWindow(windowMs: number): void {\n this.eventDedupWindowMs = windowMs;\n Logger.logDbg(`Event deduplication window set to: ${windowMs}ms`);\n }\n\n /**\n * Generate a unique fingerprint for an event\n * @param eventName Event name\n * @param payload Event payload\n * @returns Fingerprint string\n */\n private getEventFingerprint(eventName: string, payload: MapLike): string {\n try {\n // Use JSON.stringify for deterministic payload representation\n const payloadStr = JSON.stringify(payload);\n return `${eventName}::${payloadStr}`;\n } catch (err) {\n Logger.logError('Error generating event fingerprint', err);\n return `${eventName}::${Date.now()}`; // Fallback to never match\n }\n }\n\n /**\n * Extract transaction_id from purchase event payload\n * @param payload Event payload\n * @returns transaction_id or null\n */\n private extractTransactionId(payload: MapLike): string | null {\n // Check common field names for transaction_id\n return (\n payload.transaction_id ||\n payload.transactionId ||\n payload.orderId ||\n payload.order_id ||\n null\n );\n }\n\n /**\n * Check if event is a duplicate within the deduplication window\n * @param eventName Event name\n * @param payload Event payload\n * @returns true if duplicate, false otherwise\n */\n private isDuplicateEvent(eventName: string, payload: MapLike): boolean {\n // If deduplication is disabled (window = 0), never treat as duplicate\n if (this.eventDedupWindowMs === 0) {\n return false;\n }\n\n const now = Date.now();\n\n // Special handling for purchase events - deduplicate by transaction_id\n if (eventName === 'purchase' || eventName === 'mp_purchase') {\n const transactionId = this.extractTransactionId(payload);\n\n if (transactionId) {\n const lastSeenTs = this.purchaseTransactionCache.get(transactionId);\n\n if (lastSeenTs && now - lastSeenTs < this.eventDedupWindowMs) {\n Logger.logDbg(\n `Duplicate purchase event detected (transaction_id: ${transactionId}) within ${this.eventDedupWindowMs}ms window, skipping`\n );\n return true; // Duplicate\n }\n\n // Record this transaction\n this.purchaseTransactionCache.set(transactionId, now);\n } else {\n Logger.logDbg(\n 'Purchase event without transaction_id, cannot deduplicate by transaction'\n );\n }\n }\n\n // General event deduplication by full fingerprint\n const fingerprint = this.getEventFingerprint(eventName, payload);\n const lastSeenTs = this.eventDeduplicationCache.get(fingerprint);\n\n if (lastSeenTs && now - lastSeenTs < this.eventDedupWindowMs) {\n Logger.logDbg(\n `Duplicate event detected (${eventName}) within ${this.eventDedupWindowMs}ms window, skipping`\n );\n return true; // Duplicate\n }\n\n // Record this event\n this.eventDeduplicationCache.set(fingerprint, now);\n\n // Cleanup old entries periodically\n this.cleanupDeduplicationCache(now);\n\n return false;\n }\n\n /**\n * Remove expired entries from deduplication caches\n * @param now Current timestamp\n */\n private cleanupDeduplicationCache(now: number): void {\n // Cleanup general event cache\n for (const [\n fingerprint,\n timestamp,\n ] of this.eventDeduplicationCache.entries()) {\n if (now - timestamp > this.eventDedupWindowMs) {\n this.eventDeduplicationCache.delete(fingerprint);\n }\n }\n\n // Cleanup purchase transaction cache\n for (const [\n transactionId,\n timestamp,\n ] of this.purchaseTransactionCache.entries()) {\n if (now - timestamp > this.eventDedupWindowMs) {\n this.purchaseTransactionCache.delete(transactionId);\n }\n }\n }\n\n pushEvent(eventName: string, payload: MapLike): void {\n Logger.logDbg('EV Push Event:: ', JSON.stringify(payload));\n\n // Special events bypass queue and process immediately (no deduplication)\n if (\n eventName === 'set' ||\n eventName === 'persist' ||\n eventName === 'clear' ||\n eventName === 'user_info'\n ) {\n // process regardless - fire and forget for async operations\n this.processQItems(eventName, payload).catch((err) =>\n Logger.logError('Error processing event', err)\n );\n return;\n }\n\n // Check for duplicate events BEFORE queuing\n if (this.isDuplicateEvent(eventName, payload)) {\n // Duplicate detected, skip this event\n return;\n }\n\n // Track if we received the initial event\n if (!this.receivedInitialEvent) {\n this.receivedInitialEvent = eventName === this.dlInitEvent;\n }\n\n // Always queue events for sequential processing (with eviction of oldest if at capacity)\n if (this.eventQueue.length >= MAX_TRACKED_EVENTS) {\n const evictedEvent = this.eventQueue.shift();\n Logger.logDbg(\n `Event queue at capacity (${MAX_TRACKED_EVENTS}), evicting oldest event:`,\n evictedEvent?.[0]\n );\n }\n this.eventQueue.push([eventName, payload]);\n\n // Trigger processing if ready and initial event received\n if (this.isReady && this.receivedInitialEvent) {\n this.processNext();\n }\n }\n\n async processQItems(eventName: string, payload: MapLike): Promise<void> {\n try {\n if (eventName === 'set') {\n this.setDl(payload);\n } else if (eventName === 'persist') {\n await this.storeData(payload?.key, payload?.value);\n } else if (eventName === 'clear') {\n if (Array.isArray(payload) && payload.length > 0) {\n await this.deleteData(payload as string[]);\n }\n } else if (eventName === 'user_info') {\n this.setUserData(payload);\n } else {\n await this.eventProcessor(eventName, payload);\n }\n /* Make sure nothing is written below this line. If you do so, remember to return on error conditions above */\n } catch (err) {\n Logger.logError('Error performing init setup on dl', err);\n }\n }\n\n /**\n * Private Processor for 'set' command object\n */\n setDl(obj: TypedAny | undefined): boolean {\n if (!obj) {\n return false;\n }\n const _tmp = Utils.flattenObject(obj);\n this._masterDataLayer = Object.assign({}, this._masterDataLayer, _tmp);\n return true;\n }\n\n getDl(): TypedAny {\n return this._masterDataLayer;\n }\n\n private setUserData(payload: {\n pid?: string;\n email?: string;\n phone?: string;\n country?: string;\n city?: string;\n state?: string;\n fName?: string;\n lName?: string;\n zip?: string;\n }): void {\n if (\n payload?.zip &&\n payload?.zip?.length > 0 &&\n payload?.zip?.indexOf('-') > -1\n ) {\n payload.zip = payload.zip.split('-')[0].trim();\n }\n\n const uif: any = {};\n this._persistedVars = this._persistedVars || {};\n this._persistedVars.uif = this._persistedVars.uif || {};\n\n if (payload.pid) {\n this._persistedVars.uif.user_pid = payload.pid;\n uif.pid = payload.pid;\n }\n\n if (payload.email) {\n this._persistedVars.uif.user_email = payload.email;\n uif.e = payload.email;\n }\n\n if (payload.phone) {\n this._persistedVars.uif.user_phone = payload.phone;\n uif.p = payload.phone;\n }\n\n if (payload.country) {\n this._persistedVars.uif.user_country = payload.country;\n uif.cy = payload.country;\n }\n\n if (payload.city) {\n this._persistedVars.uif.user_city = payload.city;\n uif.ct = payload.city;\n }\n\n if (payload.state) {\n this._persistedVars.uif.user_state = payload.state;\n uif.st = payload.state;\n }\n\n if (payload.fName) {\n this._persistedVars.uif.fn = payload.fName;\n uif.fn = payload.fName;\n }\n\n if (payload.lName) {\n this._persistedVars.uif.ln = payload.lName;\n uif.ln = payload.lName;\n }\n\n if (payload.zip) {\n this._persistedVars.uif.zip_code = payload.zip;\n uif.z = payload.zip;\n }\n\n if (Object.keys(uif).length > 0) {\n this.storeData('uif', uif);\n }\n }\n\n private async deleteData(chips: string[]): Promise<void> {\n const fullData = await this.getFullData();\n for (const chip of chips) {\n if (typeof chip === 'string') {\n delete fullData[chip];\n }\n }\n await this.storeFullData(fullData);\n }\n\n private async storeData(chip: string, value: any): Promise<void> {\n if (typeof chip !== 'undefined' && typeof value !== 'undefined') {\n const fullData = await this.getFullData();\n fullData[chip] = value;\n await this.storeFullData(fullData);\n this._persistedVars[chip] = value;\n } else {\n Logger.logError('Both key and value are required for persisting data');\n }\n }\n\n private async reloadPersistedVars(): Promise<void> {\n this._persistedVars = await this.getFullData();\n }\n\n private async getFullData(): Promise<MapLike> {\n try {\n const storedData = await AsyncStorage.getItem(this.storageKeyName);\n if (storedData) {\n return JSON.parse(storedData);\n }\n } catch (err) {\n Logger.logError('Error reloading persisted variables', err);\n }\n return {};\n }\n\n private async storeFullData(fullData: MapLike): Promise<void> {\n this._persistedVars = fullData;\n try {\n await AsyncStorage.setItem(this.storageKeyName, JSON.stringify(fullData));\n } catch (err) {\n Logger.logError('Error storing data', err);\n }\n }\n\n // private async getStoredData<T = any>(chip: string, defValue: T): Promise<T> {\n // let value: T;\n // try {\n // const storedData = await AsyncStorage.getItem(this.storageKeyName);\n // if (storedData) {\n // const parsedData = JSON.parse(storedData);\n // value = parsedData[chip];\n // }\n // } catch (err) {\n // Logger.logError('Error parsing stored data', err);\n // }\n // return value ?? defValue;\n // }\n\n /**\n * Private event processor. Idea is that whenever an event is detected, we create a copy of the master data layer,\n * add the event variables, and trigger the event requested when initializing the data layer helper\n * @param eventName\n * @param model\n */\n async eventProcessor(\n eventName: string,\n model: TypedAny | undefined\n ): Promise<void> {\n model = model ?? {};\n\n /**\n * The following If block clears the data layer when the initial event is received.\n * This is done to prevent value carry overs from one page to another in single page apps\n */\n if (eventName === 'reset' || eventName === this.dlInitEvent) {\n this.reset();\n\n // add an init event based ulid to the core data model\n model['page_load_uid'] = ulid();\n model['is_entry_point'] = this.getIsEntryPointValue();\n if (model['is_entry_point'] === 1) {\n // Note: In React Native, we don't have document.referrer, so we'll use a placeholder\n model['entry_point_referrer'] = '';\n }\n\n this.setDl(model);\n model = undefined;\n }\n\n if (model) {\n model = {\n ev: (model || {}) as any,\n };\n } else {\n model = {};\n }\n\n await this.reloadPersistedVars();\n\n // get persisted values and add them into the event model\n model['p'] = this._persistedVars ?? {};\n\n // generate a unique id for each event automatically\n model['ev._id'] = Utils.getUniqueID();\n\n // add the event ts also for every event\n model['ev._tsMs'] = Date.now();\n\n model['ev._eventName'] = eventName;\n\n model['ev._persistKey'] = eventsToPersist[eventName] || null;\n\n model = Utils.flattenObject(model);\n\n // create a clone of master data layer and merge event model to it\n const _clone = Object.assign({}, this._masterDataLayer, model);\n const eventTs = Date.now();\n\n const eventPayload = JSON.parse(\n JSON.stringify({\n eventName: eventName,\n eventTs: eventTs,\n model: _clone,\n })\n );\n\n // add to state tracker (with eviction of oldest events if at capacity)\n if (this.stateTracker.length >= MAX_TRACKED_EVENTS) {\n this.stateTracker.shift(); // Remove oldest event\n }\n this.stateTracker.push(eventPayload);\n\n // trigger an event that can be listened to by other listeners\n Utils.triggerEvent(this.dlEventName, eventPayload);\n\n // see if there are any other registered processors and invoke them\n if (this.eventProcessors[eventName]) {\n for (const processor of this.eventProcessors[eventName]) {\n Utils.safeExecute(processor, eventPayload);\n }\n }\n }\n\n overrideDlInitEvent(eventName: string): string {\n if (eventName && eventName.length > 0) {\n this.dlInitEvent = eventName;\n return 'Dl Init Event Override Successful';\n }\n return 'Dl Init Event Override Failed';\n }\n\n /**\n * Exposed method for registering custom processors for events\n * @param eventType\n * @param fn\n */\n registerProcessor(eventType: string, fn: EventProcessorFn): void {\n if (!eventType || !fn || typeof fn !== 'function') {\n Logger.logError('EventType and Fn are mandatory');\n return;\n }\n if (!this.eventProcessors[eventType]) {\n this.eventProcessors[eventType] = [];\n }\n\n this.eventProcessors[eventType].push(fn);\n }\n\n /**\n * Exposed getter for getting values from data layer\n * @param key\n * @returns {*|undefined}\n */\n get(key: string): MapLike | undefined {\n return this._masterDataLayer[key] || undefined;\n }\n\n getState(): TypedAny[] {\n return this.stateTracker;\n }\n\n hasEventHappened(key: string): boolean {\n return !!this.stateTracker.find((i) => i.eventName === key);\n }\n\n reset(): boolean {\n this._masterDataLayer = {};\n return true;\n }\n\n /**\n * Full shutdown - clears all state and allows reinitialization\n */\n shutdown(): void {\n this.isReady = false;\n this._masterDataLayer = {};\n this._persistedVars = {};\n this.eventProcessors = {};\n this.stateTracker = [];\n this.receivedInitialEvent = false;\n this.eventQueue = [];\n this.isProcessing = false;\n this.isEntryPoint = 0;\n this.eventDeduplicationCache.clear();\n this.purchaseTransactionCache.clear();\n Logger.logDbg('EEDL shutdown complete');\n }\n\n ready(): void {\n this.isReady = true;\n if (this.receivedInitialEvent) {\n Logger.logDbg('Initial event received: ', this.dlInitEvent);\n // Start processing queue if we have events and initial event received\n if (this.eventQueue.length > 0) {\n this.processNext();\n }\n } else {\n Logger.logDbg(\n `Initial event (${this.dlInitEvent}) NOT received. Events will be queued`\n );\n }\n }\n\n /**\n * Process next event in queue with atomic check-and-set\n * Ensures only one event processes at a time, eliminating race conditions\n */\n processNext(): void {\n // Atomic check-and-set: if already processing or queue empty, return\n if (this.isProcessing || this.eventQueue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n\n // Dequeue from front for FIFO ordering\n const item = this.eventQueue.shift();\n\n if (item) {\n const [eventName, payload] = item;\n\n // Process the event\n this.processQItems(eventName, payload)\n .catch((err) => {\n Logger.logError('Error processing event in queue', err);\n })\n .finally(() => {\n // Reset processing flag\n this.isProcessing = false;\n\n // Process next item if queue not empty\n // Use setImmediate for non-blocking event loop\n if (this.eventQueue.length > 0) {\n setImmediate(() => this.processNext());\n }\n });\n } else {\n this.isProcessing = false;\n }\n }\n\n getIsEntryPointValue(): number {\n // In React Native, we'll use a simple approach for entry point tracking\n // This could be enhanced with proper session storage implementation\n const currentValue = this.isEntryPoint;\n this.isEntryPoint = 0; // Reset after first use\n return currentValue;\n }\n\n resetEntryPointInfo(): void {\n // In React Native, we'll default to entry point = 1 for the first session\n // This could be enhanced with proper referrer tracking if needed\n this.isEntryPoint = 1;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|