@magicpixel/rn-mp-client-sdk 1.13.20 → 1.13.22

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.
Files changed (36) hide show
  1. package/lib/commonjs/common/app-types.js.map +1 -1
  2. package/lib/commonjs/common/device-info-helper.js +43 -27
  3. package/lib/commonjs/common/device-info-helper.js.map +1 -1
  4. package/lib/commonjs/common/reporter.js +48 -5
  5. package/lib/commonjs/common/reporter.js.map +1 -1
  6. package/lib/commonjs/common/storage-helper.js.map +1 -1
  7. package/lib/commonjs/common/utils.js +42 -0
  8. package/lib/commonjs/common/utils.js.map +1 -1
  9. package/lib/commonjs/index.js +12 -7
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/commonjs/types/sdk.d.js +2 -0
  12. package/lib/commonjs/types/sdk.d.js.map +1 -0
  13. package/lib/module/common/app-types.js.map +1 -1
  14. package/lib/module/common/device-info-helper.js +43 -27
  15. package/lib/module/common/device-info-helper.js.map +1 -1
  16. package/lib/module/common/reporter.js +48 -5
  17. package/lib/module/common/reporter.js.map +1 -1
  18. package/lib/module/common/storage-helper.js.map +1 -1
  19. package/lib/module/common/utils.js +43 -0
  20. package/lib/module/common/utils.js.map +1 -1
  21. package/lib/module/index.js +12 -7
  22. package/lib/module/index.js.map +1 -1
  23. package/lib/module/types/sdk.d.js +2 -0
  24. package/lib/module/types/sdk.d.js.map +1 -0
  25. package/lib/typescript/src/common/app-types.d.ts +1 -0
  26. package/lib/typescript/src/common/device-info-helper.d.ts +4 -4
  27. package/lib/typescript/src/common/reporter.d.ts +2 -1
  28. package/lib/typescript/src/common/utils.d.ts +18 -0
  29. package/package.json +2 -2
  30. package/src/common/app-types.ts +1 -0
  31. package/src/common/device-info-helper.ts +56 -31
  32. package/src/common/reporter.ts +68 -8
  33. package/src/common/storage-helper.ts +2 -8
  34. package/src/common/utils.ts +43 -0
  35. package/src/index.tsx +15 -7
  36. package/src/types/sdk.d.ts +54 -0
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["app-types.ts"],"sourcesContent":["import type { Logger } from './logger';\n\nexport interface MapLike<T = any> {\n [key: string]: T;\n}\n\nexport type TypedAny = Record<\n string,\n | string\n | number\n | boolean\n | string[]\n | boolean[]\n | number[]\n | Record<string, string | number | boolean | string[] | boolean[] | number[]>\n>;\n\nexport type EventProcessorFn = (payload: TypedAny) => void;\n\nexport interface AppCustomerInfo {\n first_name?: string;\n last_name?: string;\n email?: string;\n phone_number: number;\n country_code: number;\n city?: string;\n state?: string;\n country?: string;\n}\n\nexport interface AppPageLoad {\n page_name: string;\n page_url?: string;\n is_entry?: number;\n deep_link_url?: string;\n app_version?: string;\n}\n\nexport interface DeJsvHelper {\n log: typeof Logger.logDbg;\n err: typeof Logger.logError;\n}\n\nexport interface QcInfoItem {\n nm: string;\n id: string;\n st: boolean;\n}\n\nexport interface TagInfoItem {\n id: string;\n nm: string;\n pr: string;\n prNm: string;\n status: boolean;\n qc: string | string[];\n}\n\nexport type ReplaceMode = 'kph' | 'rph';\n\nexport interface HydrateTagInfo {\n isInError: boolean;\n content: string | number | null;\n errCd: string; // error code\n errMsg: string; // any descriptive error message\n}\n\nexport interface ReportTagItem {\n st: 200 | 900 | 1000 | number; // what happened to this tag?\n t: string; // tag id\n p: string; // provider id\n tNm: string;\n req: any; // request payload\n}\n\nexport interface Report {\n envName: string; // environment name inside magic pixel\n envId: string; // environment id inside magic pixel\n pname?: string; // page name\n evt: string; // dcr event if that triggered this report\n evtId: string; // event id\n dt?: number; // device type (converted to int)\n ln?: number; // language (converted to int)\n bw?: number; // browser name (converted to int)\n dm?: string; // clean domain name\n items: ReportTagItem[]; // list of tag items fired on that page for that condition\n tagCt: number; // expected tag count on this page\n dws: 'j' | 'n'; // down stream configuration. java or node\n v: string; // client sdk version for this call\n}\n\nexport interface UrlInfo {\n tfUrl: string;\n errUrl: string;\n rptUrl: string;\n infoUrl: string;\n baseUrl: string;\n attrInfoUrl: string;\n idlUrl: string;\n geoUrl?: string;\n baseUrlV4?: string;\n baseUrlV6?: string;\n}\n\nexport interface VisitInfo {\n visitId: string;\n visitTs: number;\n visitCt: number;\n visitDepth: number;\n visitVer: number;\n}\n\nexport interface VisitorInfo {\n dId: string;\n mId: string;\n st: number;\n}\n\nexport interface SdkInitOptions {\n orgId: string;\n env: string;\n projectId: string;\n baseUrl: string;\n logLevel: string;\n\n /**\n * @deprecated device_type is now auto-detected and cannot be overridden\n * This field is ignored. The SDK uses Expo/react-native-device-info for reliable detection.\n */\n device_type?: string;\n\n /**\n * @deprecated app_version is now auto-detected and cannot be overridden\n * This field is ignored. The SDK will always use the actual app version from the device.\n */\n app_version?: string;\n\n /**\n * @deprecated os_version is now auto-detected and cannot be overridden\n * This field is ignored. The SDK will always use the actual OS version from the device.\n */\n os_version?: string;\n\n /**\n * Event deduplication window in milliseconds\n * If the same event (name + payload) fires within this window, it will be skipped\n * Purchase events are deduplicated by transaction_id regardless of other fields\n * Default: 5000ms (5 seconds)\n * Set to 0 to disable deduplication\n */\n eventDeduplicationWindowMs?: number;\n\n /**\n * Callback invoked when SDK initialization fails after all retries\n * Use this to handle initialization failures gracefully in your app\n * @param error The error that caused the failure\n */\n onInitFailure?: (error: Error) => void;\n}\n\nexport interface MpDeviceInfo {\n package_name?: string; // app package name like com.company.starter\n short_version?: string;\n long_version?: string;\n os_version?: string; // Will be auto-detected if not provided\n device_model_name?: string; // Will be auto-detected if not provided\n locale?: string;\n timezone_abbreviation?: string;\n carrier?: string;\n screen_width?: number;\n screen_height?: number;\n screen_density?: number;\n cpu_cores?: number;\n ext_storage?: number;\n free_storage?: number;\n device_timezone?: string;\n}\n\nexport type EventBusCallback = (event: string, payload: any) => void;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["app-types.ts"],"sourcesContent":["import type { Logger } from './logger';\n\nexport interface MapLike<T = any> {\n [key: string]: T;\n}\n\nexport type TypedAny = Record<\n string,\n | string\n | number\n | boolean\n | string[]\n | boolean[]\n | number[]\n | Record<string, string | number | boolean | string[] | boolean[] | number[]>\n>;\n\nexport type EventProcessorFn = (payload: TypedAny) => void;\n\nexport interface AppCustomerInfo {\n first_name?: string;\n last_name?: string;\n email?: string;\n phone_number: number;\n country_code: number;\n city?: string;\n state?: string;\n country?: string;\n}\n\nexport interface AppPageLoad {\n page_name: string;\n page_url?: string;\n is_entry?: number;\n deep_link_url?: string;\n app_version?: string;\n}\n\nexport interface DeJsvHelper {\n log: typeof Logger.logDbg;\n err: typeof Logger.logError;\n}\n\nexport interface QcInfoItem {\n nm: string;\n id: string;\n st: boolean;\n}\n\nexport interface TagInfoItem {\n id: string;\n nm: string;\n pr: string;\n prNm: string;\n status: boolean;\n qc: string | string[];\n}\n\nexport type ReplaceMode = 'kph' | 'rph';\n\nexport interface HydrateTagInfo {\n isInError: boolean;\n content: string | number | null;\n errCd: string; // error code\n errMsg: string; // any descriptive error message\n}\n\nexport interface ReportTagItem {\n st: 200 | 900 | 1000 | number; // what happened to this tag?\n t: string; // tag id\n p: string; // provider id\n tNm: string;\n req: any; // request payload\n}\n\nexport interface Report {\n envName: string; // environment name inside magic pixel\n envId: string; // environment id inside magic pixel\n pname?: string; // page name\n evt: string; // dcr event if that triggered this report\n evtId: string; // event id\n dt?: number; // device type (converted to int)\n ln?: number; // language (converted to int)\n bw?: number; // browser name (converted to int)\n dm?: string; // clean domain name\n items: ReportTagItem[]; // list of tag items fired on that page for that condition\n tagCt: number; // expected tag count on this page\n dws: 'j' | 'n'; // down stream configuration. java or node\n v: string; // client sdk version for this call\n devPayload?: string; // base64 encoded developer payload\n}\n\nexport interface UrlInfo {\n tfUrl: string;\n errUrl: string;\n rptUrl: string;\n infoUrl: string;\n baseUrl: string;\n attrInfoUrl: string;\n idlUrl: string;\n geoUrl?: string;\n baseUrlV4?: string;\n baseUrlV6?: string;\n}\n\nexport interface VisitInfo {\n visitId: string;\n visitTs: number;\n visitCt: number;\n visitDepth: number;\n visitVer: number;\n}\n\nexport interface VisitorInfo {\n dId: string;\n mId: string;\n st: number;\n}\n\nexport interface SdkInitOptions {\n orgId: string;\n env: string;\n projectId: string;\n baseUrl: string;\n logLevel: string;\n\n /**\n * @deprecated device_type is now auto-detected and cannot be overridden\n * This field is ignored. The SDK uses Expo/react-native-device-info for reliable detection.\n */\n device_type?: string;\n\n /**\n * @deprecated app_version is now auto-detected and cannot be overridden\n * This field is ignored. The SDK will always use the actual app version from the device.\n */\n app_version?: string;\n\n /**\n * @deprecated os_version is now auto-detected and cannot be overridden\n * This field is ignored. The SDK will always use the actual OS version from the device.\n */\n os_version?: string;\n\n /**\n * Event deduplication window in milliseconds\n * If the same event (name + payload) fires within this window, it will be skipped\n * Purchase events are deduplicated by transaction_id regardless of other fields\n * Default: 5000ms (5 seconds)\n * Set to 0 to disable deduplication\n */\n eventDeduplicationWindowMs?: number;\n\n /**\n * Callback invoked when SDK initialization fails after all retries\n * Use this to handle initialization failures gracefully in your app\n * @param error The error that caused the failure\n */\n onInitFailure?: (error: Error) => void;\n}\n\nexport interface MpDeviceInfo {\n package_name?: string; // app package name like com.company.starter\n short_version?: string;\n long_version?: string;\n os_version?: string; // Will be auto-detected if not provided\n device_model_name?: string; // Will be auto-detected if not provided\n locale?: string;\n timezone_abbreviation?: string;\n carrier?: string;\n screen_width?: number;\n screen_height?: number;\n screen_density?: number;\n cpu_cores?: number;\n ext_storage?: number;\n free_storage?: number;\n device_timezone?: string;\n}\n\nexport type EventBusCallback = (event: string, payload: any) => void;\n"],"mappings":"","ignoreList":[]}
@@ -12,40 +12,55 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
12
12
  /**
13
13
  * Helper class to automatically detect device and app information
14
14
  * Supports both Expo and bare React Native:
15
- * 1. Tries Expo modules first (works in Expo Go)
16
- * 2. Falls back to react-native-device-info (for bare RN)
15
+ * 1. Tries react-native-device-info first (works in bare RN and Expo custom builds)
16
+ * 2. Falls back to Expo modules (for Expo Go where native modules don't work)
17
17
  * 3. Returns safe defaults if neither is available
18
18
  */
19
19
  class DeviceInfoHelper {
20
20
  /**
21
- * Try to load Expo modules and react-native-device-info
22
- * This uses dynamic imports to avoid errors when modules aren't available
21
+ * Try to load react-native-device-info first, then Expo modules
22
+ * Uses console.log during init to avoid Logger dependency issues if module loading fails
23
23
  */
24
24
  static async initialize() {
25
25
  if (this.initialized) return;
26
26
 
27
- // Try to load Expo modules first (works in Expo Go)
27
+ // FIRST: Try react-native-device-info (preferred - works in bare RN and Expo custom builds)
28
+ // This is a direct dependency of the SDK, so it should always be available except in Expo Go
28
29
  try {
29
30
  // eslint-disable-next-line @typescript-eslint/no-var-requires
30
- this.expoApplication = require('expo-application');
31
- // eslint-disable-next-line @typescript-eslint/no-var-requires
32
- this.expoDevice = require('expo-device');
33
- // eslint-disable-next-line @typescript-eslint/no-var-requires
34
- this.expoConstants = require('expo-constants').default;
35
- _logger.Logger.logDbg('Using Expo modules for device info');
31
+ const rnDeviceInfo = require('react-native-device-info');
32
+ // Validate the module is actually loaded and functional
33
+ if (rnDeviceInfo && typeof (rnDeviceInfo.default || rnDeviceInfo).getVersion === 'function') {
34
+ this.deviceInfo = rnDeviceInfo.default || rnDeviceInfo;
35
+ this.initialized = true;
36
+ // Use console.log to avoid any Logger issues during early init
37
+ console.log('[MagicPixel DeviceInfoHelper] Using react-native-device-info');
38
+ return;
39
+ }
36
40
  } catch (error) {
37
- _logger.Logger.logDbg('Expo modules not available, will try react-native-device-info');
41
+ // react-native-device-info not available (likely Expo Go)
42
+ console.log('[MagicPixel DeviceInfoHelper] react-native-device-info not available, trying Expo modules');
38
43
  }
39
44
 
40
- // Fall back to react-native-device-info (for bare RN)
41
- if (!this.expoApplication) {
42
- try {
43
- // eslint-disable-next-line @typescript-eslint/no-var-requires
44
- this.deviceInfo = require('react-native-device-info').default;
45
- _logger.Logger.logDbg('Using react-native-device-info for device info');
46
- } catch (error) {
47
- _logger.Logger.logError('Neither Expo modules nor react-native-device-info available:', error);
45
+ // SECOND: Fall back to Expo modules (for Expo Go where native modules don't work)
46
+ try {
47
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
48
+ const expoApp = require('expo-application');
49
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
50
+ const expoDevice = require('expo-device');
51
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
52
+ const expoConst = require('expo-constants');
53
+
54
+ // Validate modules are actually loaded (not undefined placeholders from Metro)
55
+ if (expoApp && expoDevice && expoConst && typeof expoApp.nativeApplicationVersion !== 'undefined') {
56
+ this.expoApplication = expoApp;
57
+ this.expoDevice = expoDevice;
58
+ this.expoConstants = expoConst.default || expoConst;
59
+ console.log('[MagicPixel DeviceInfoHelper] Using Expo modules');
48
60
  }
61
+ } catch (error) {
62
+ // Expo modules not available
63
+ console.log('[MagicPixel DeviceInfoHelper] Expo modules not available, using safe defaults');
49
64
  }
50
65
  this.initialized = true;
51
66
  }
@@ -57,20 +72,21 @@ class DeviceInfoHelper {
57
72
  static async getAppInfo() {
58
73
  await this.initialize();
59
74
  try {
60
- // Try Expo modules first
61
- if (this.expoApplication && this.expoDevice) {
62
- return await this.getAppInfoFromExpo();
63
- }
64
-
65
- // Fall back to react-native-device-info
75
+ // Use react-native-device-info if available (preferred)
66
76
  if (this.deviceInfo) {
67
77
  return await this.getAppInfoFromDeviceInfo();
68
78
  }
69
79
 
80
+ // Fall back to Expo modules (for Expo Go)
81
+ if (this.expoApplication && this.expoDevice) {
82
+ return await this.getAppInfoFromExpo();
83
+ }
84
+
70
85
  // Return safe fallback values
71
86
  return this.getSafeDefaults();
72
87
  } catch (error) {
73
- _logger.Logger.logError('Error getting device info:', error);
88
+ // Use console.log here as well to be safe
89
+ console.error('[MagicPixel DeviceInfoHelper] Error getting device info:', error);
74
90
  return this.getSafeDefaults();
75
91
  }
76
92
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_logger","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","DeviceInfoHelper","initialize","initialized","expoApplication","expoDevice","expoConstants","default","Logger","logDbg","error","deviceInfo","logError","getAppInfo","getAppInfoFromExpo","getAppInfoFromDeviceInfo","getSafeDefaults","_Platform$Version","version","nativeApplicationVersion","buildNumber","nativeBuildVersion","packageName","applicationId","app_version","build_number","package_name","device_model_name","modelName","device_manufacturer","manufacturer","device_id","sessionId","os_name","Platform","OS","os_version","osVersion","Version","toString","is_tablet","deviceType","is_emulator","isDevice","uniqueId","bundleId","Promise","all","getVersion","getBuildNumber","getUniqueId","getBundleId","getModel","getManufacturerSync","getSystemVersion","isTablet","isEmulator","_Platform$Version2","getFormattedAppVersion","info","exports"],"sources":["device-info-helper.ts"],"sourcesContent":["import { Platform } from 'react-native';\nimport { Logger } from './logger';\n\ninterface DeviceAppInfo {\n app_version: string;\n build_number: string;\n package_name: string;\n device_model_name: string;\n device_manufacturer: string;\n device_id: string;\n os_name: string;\n os_version: string;\n is_tablet: boolean;\n is_emulator: boolean;\n}\n\n/**\n * Helper class to automatically detect device and app information\n * Supports both Expo and bare React Native:\n * 1. Tries Expo modules first (works in Expo Go)\n * 2. Falls back to react-native-device-info (for bare RN)\n * 3. Returns safe defaults if neither is available\n */\nexport class DeviceInfoHelper {\n private static expoApplication: any = null;\n private static expoDevice: any = null;\n private static expoConstants: any = null;\n private static deviceInfo: any = null;\n private static initialized = false;\n\n /**\n * Try to load Expo modules and react-native-device-info\n * This uses dynamic imports to avoid errors when modules aren't available\n */\n private static async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Try to load Expo modules first (works in Expo Go)\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n this.expoApplication = require('expo-application');\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n this.expoDevice = require('expo-device');\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n this.expoConstants = require('expo-constants').default;\n Logger.logDbg('Using Expo modules for device info');\n } catch (error) {\n Logger.logDbg(\n 'Expo modules not available, will try react-native-device-info'\n );\n }\n\n // Fall back to react-native-device-info (for bare RN)\n if (!this.expoApplication) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n this.deviceInfo = require('react-native-device-info').default;\n Logger.logDbg('Using react-native-device-info for device info');\n } catch (error) {\n Logger.logError(\n 'Neither Expo modules nor react-native-device-info available:',\n error\n );\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Get comprehensive app and device information\n * All methods are async-safe and handle errors gracefully\n */\n static async getAppInfo(): Promise<DeviceAppInfo> {\n await this.initialize();\n\n try {\n // Try Expo modules first\n if (this.expoApplication && this.expoDevice) {\n return await this.getAppInfoFromExpo();\n }\n\n // Fall back to react-native-device-info\n if (this.deviceInfo) {\n return await this.getAppInfoFromDeviceInfo();\n }\n\n // Return safe fallback values\n return this.getSafeDefaults();\n } catch (error) {\n Logger.logError('Error getting device info:', error);\n return this.getSafeDefaults();\n }\n }\n\n /**\n * Get device info using Expo modules (works in Expo Go)\n */\n private static async getAppInfoFromExpo(): Promise<DeviceAppInfo> {\n const version = this.expoApplication.nativeApplicationVersion || 'unknown';\n const buildNumber = this.expoApplication.nativeBuildVersion || 'unknown';\n const packageName = this.expoApplication.applicationId || 'unknown';\n\n return {\n // App information\n app_version: version,\n build_number: buildNumber,\n package_name: packageName,\n\n // Device information\n device_model_name: this.expoDevice.modelName || 'unknown',\n device_manufacturer: this.expoDevice.manufacturer || 'unknown',\n device_id: this.expoConstants.sessionId || 'unknown',\n\n // OS information\n os_name: Platform.OS,\n os_version:\n this.expoDevice.osVersion || Platform.Version?.toString() || 'unknown',\n\n // Additional useful info\n // DeviceType enum: UNKNOWN=0, PHONE=1, TABLET=2, DESKTOP=3, TV=4\n is_tablet: this.expoDevice.deviceType === 2, // DeviceType.TABLET = 2\n is_emulator: !this.expoDevice.isDevice,\n };\n }\n\n /**\n * Get device info using react-native-device-info (for bare RN)\n */\n private static async getAppInfoFromDeviceInfo(): Promise<DeviceAppInfo> {\n const [version, buildNumber, uniqueId, bundleId] = await Promise.all([\n this.deviceInfo.getVersion(),\n this.deviceInfo.getBuildNumber(),\n this.deviceInfo.getUniqueId(),\n this.deviceInfo.getBundleId(),\n ]);\n\n return {\n // App information\n app_version: version,\n build_number: buildNumber,\n package_name: bundleId,\n\n // Device information\n device_model_name: this.deviceInfo.getModel(),\n device_manufacturer: this.deviceInfo.getManufacturerSync(),\n device_id: uniqueId,\n\n // OS information\n os_name: Platform.OS,\n os_version: this.deviceInfo.getSystemVersion(),\n\n // Additional useful info\n is_tablet: this.deviceInfo.isTablet(),\n is_emulator: await this.deviceInfo.isEmulator(),\n };\n }\n\n /**\n * Safe default values when no device info library is available\n */\n private static getSafeDefaults(): DeviceAppInfo {\n return {\n app_version: 'unknown',\n build_number: 'unknown',\n package_name: 'unknown',\n device_model_name: 'unknown',\n device_manufacturer: 'unknown',\n device_id: 'unknown',\n os_name: Platform.OS,\n os_version: Platform.Version?.toString() || 'unknown',\n is_tablet: false,\n is_emulator: false,\n };\n }\n\n /**\n * Get app version in format: \"1.0.0 (123)\"\n * Combines version and build number for better tracking\n */\n static async getFormattedAppVersion(): Promise<string> {\n try {\n const info = await this.getAppInfo();\n return `${info.app_version} (${info.build_number})`;\n } catch (error) {\n Logger.logError('Error getting formatted app version:', error);\n return 'unknown';\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_logger","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","DeviceInfoHelper","initialize","initialized","rnDeviceInfo","default","getVersion","deviceInfo","console","log","error","expoApp","expoDevice","expoConst","nativeApplicationVersion","expoApplication","expoConstants","getAppInfo","getAppInfoFromDeviceInfo","getAppInfoFromExpo","getSafeDefaults","_Platform$Version","version","buildNumber","nativeBuildVersion","packageName","applicationId","app_version","build_number","package_name","device_model_name","modelName","device_manufacturer","manufacturer","device_id","sessionId","os_name","Platform","OS","os_version","osVersion","Version","toString","is_tablet","deviceType","is_emulator","isDevice","uniqueId","bundleId","Promise","all","getBuildNumber","getUniqueId","getBundleId","getModel","getManufacturerSync","getSystemVersion","isTablet","isEmulator","_Platform$Version2","getFormattedAppVersion","info","Logger","logError","exports"],"sources":["device-info-helper.ts"],"sourcesContent":["import { Platform } from 'react-native';\nimport { Logger } from './logger';\n\ninterface DeviceAppInfo {\n app_version: string;\n build_number: string;\n package_name: string;\n device_model_name: string;\n device_manufacturer: string;\n device_id: string;\n os_name: string;\n os_version: string;\n is_tablet: boolean;\n is_emulator: boolean;\n}\n\n/**\n * Helper class to automatically detect device and app information\n * Supports both Expo and bare React Native:\n * 1. Tries react-native-device-info first (works in bare RN and Expo custom builds)\n * 2. Falls back to Expo modules (for Expo Go where native modules don't work)\n * 3. Returns safe defaults if neither is available\n */\nexport class DeviceInfoHelper {\n private static expoApplication: any = null;\n private static expoDevice: any = null;\n private static expoConstants: any = null;\n private static deviceInfo: any = null;\n private static initialized = false;\n\n /**\n * Try to load react-native-device-info first, then Expo modules\n * Uses console.log during init to avoid Logger dependency issues if module loading fails\n */\n private static async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // FIRST: Try react-native-device-info (preferred - works in bare RN and Expo custom builds)\n // This is a direct dependency of the SDK, so it should always be available except in Expo Go\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rnDeviceInfo = require('react-native-device-info');\n // Validate the module is actually loaded and functional\n if (\n rnDeviceInfo &&\n typeof (rnDeviceInfo.default || rnDeviceInfo).getVersion === 'function'\n ) {\n this.deviceInfo = rnDeviceInfo.default || rnDeviceInfo;\n this.initialized = true;\n // Use console.log to avoid any Logger issues during early init\n console.log(\n '[MagicPixel DeviceInfoHelper] Using react-native-device-info'\n );\n return;\n }\n } catch (error) {\n // react-native-device-info not available (likely Expo Go)\n console.log(\n '[MagicPixel DeviceInfoHelper] react-native-device-info not available, trying Expo modules'\n );\n }\n\n // SECOND: Fall back to Expo modules (for Expo Go where native modules don't work)\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const expoApp = require('expo-application');\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const expoDevice = require('expo-device');\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const expoConst = require('expo-constants');\n\n // Validate modules are actually loaded (not undefined placeholders from Metro)\n if (\n expoApp &&\n expoDevice &&\n expoConst &&\n typeof expoApp.nativeApplicationVersion !== 'undefined'\n ) {\n this.expoApplication = expoApp;\n this.expoDevice = expoDevice;\n this.expoConstants = expoConst.default || expoConst;\n console.log('[MagicPixel DeviceInfoHelper] Using Expo modules');\n }\n } catch (error) {\n // Expo modules not available\n console.log(\n '[MagicPixel DeviceInfoHelper] Expo modules not available, using safe defaults'\n );\n }\n\n this.initialized = true;\n }\n\n /**\n * Get comprehensive app and device information\n * All methods are async-safe and handle errors gracefully\n */\n static async getAppInfo(): Promise<DeviceAppInfo> {\n await this.initialize();\n\n try {\n // Use react-native-device-info if available (preferred)\n if (this.deviceInfo) {\n return await this.getAppInfoFromDeviceInfo();\n }\n\n // Fall back to Expo modules (for Expo Go)\n if (this.expoApplication && this.expoDevice) {\n return await this.getAppInfoFromExpo();\n }\n\n // Return safe fallback values\n return this.getSafeDefaults();\n } catch (error) {\n // Use console.log here as well to be safe\n console.error('[MagicPixel DeviceInfoHelper] Error getting device info:', error);\n return this.getSafeDefaults();\n }\n }\n\n /**\n * Get device info using Expo modules (works in Expo Go)\n */\n private static async getAppInfoFromExpo(): Promise<DeviceAppInfo> {\n const version = this.expoApplication.nativeApplicationVersion || 'unknown';\n const buildNumber = this.expoApplication.nativeBuildVersion || 'unknown';\n const packageName = this.expoApplication.applicationId || 'unknown';\n\n return {\n // App information\n app_version: version,\n build_number: buildNumber,\n package_name: packageName,\n\n // Device information\n device_model_name: this.expoDevice.modelName || 'unknown',\n device_manufacturer: this.expoDevice.manufacturer || 'unknown',\n device_id: this.expoConstants.sessionId || 'unknown',\n\n // OS information\n os_name: Platform.OS,\n os_version:\n this.expoDevice.osVersion || Platform.Version?.toString() || 'unknown',\n\n // Additional useful info\n // DeviceType enum: UNKNOWN=0, PHONE=1, TABLET=2, DESKTOP=3, TV=4\n is_tablet: this.expoDevice.deviceType === 2, // DeviceType.TABLET = 2\n is_emulator: !this.expoDevice.isDevice,\n };\n }\n\n /**\n * Get device info using react-native-device-info (for bare RN)\n */\n private static async getAppInfoFromDeviceInfo(): Promise<DeviceAppInfo> {\n const [version, buildNumber, uniqueId, bundleId] = await Promise.all([\n this.deviceInfo.getVersion(),\n this.deviceInfo.getBuildNumber(),\n this.deviceInfo.getUniqueId(),\n this.deviceInfo.getBundleId(),\n ]);\n\n return {\n // App information\n app_version: version,\n build_number: buildNumber,\n package_name: bundleId,\n\n // Device information\n device_model_name: this.deviceInfo.getModel(),\n device_manufacturer: this.deviceInfo.getManufacturerSync(),\n device_id: uniqueId,\n\n // OS information\n os_name: Platform.OS,\n os_version: this.deviceInfo.getSystemVersion(),\n\n // Additional useful info\n is_tablet: this.deviceInfo.isTablet(),\n is_emulator: await this.deviceInfo.isEmulator(),\n };\n }\n\n /**\n * Safe default values when no device info library is available\n */\n private static getSafeDefaults(): DeviceAppInfo {\n return {\n app_version: 'unknown',\n build_number: 'unknown',\n package_name: 'unknown',\n device_model_name: 'unknown',\n device_manufacturer: 'unknown',\n device_id: 'unknown',\n os_name: Platform.OS,\n os_version: Platform.Version?.toString() || 'unknown',\n is_tablet: false,\n is_emulator: false,\n };\n }\n\n /**\n * Get app version in format: \"1.0.0 (123)\"\n * Combines version and build number for better tracking\n */\n static async getFormattedAppVersion(): Promise<string> {\n try {\n const info = await this.getAppInfo();\n return `${info.app_version} (${info.build_number})`;\n } catch (error) {\n Logger.logError('Error getting formatted app version:', error);\n return 'unknown';\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -49,6 +49,12 @@ class Reporter {
49
49
  reportParent.tagCt = ct;
50
50
  }
51
51
  }
52
+ static reportDevPayload(devPayload, evtId) {
53
+ const reportParent = this.reportMap[evtId];
54
+ if (reportParent) {
55
+ reportParent.devPayload = _utils.Utils.encodeToBase64(devPayload);
56
+ }
57
+ }
52
58
  static reportItem(item, evtId) {
53
59
  const reportParent = this.reportMap[evtId];
54
60
  if (reportParent) {
@@ -61,10 +67,31 @@ class Reporter {
61
67
  }
62
68
  }
63
69
  static publishReport(evtId) {
64
- const data = this.reportMap[evtId] || {};
65
- const postUrl = `${_dataStore.DataStore.getUrlInfo().rptUrl}/${data.dws ?? 'n'}/${_utils.Utils.getUniqueID()}`;
66
- _logger.Logger.logDbg('Posting Info: ', postUrl);
70
+ const report = this.reportMap[evtId];
71
+ if (!report) {
72
+ _logger.Logger.logError(`No report found for evtId: ${evtId}`);
73
+ return;
74
+ }
75
+ const data = report;
67
76
  data.debugId = _dataStore.DataStore.getDebugId();
77
+
78
+ // Include base64 encoded developer payload
79
+ if (report.devPayload) {
80
+ data.devPayload = report.devPayload;
81
+ }
82
+
83
+ // Check payload size to prevent DoS attacks (max 250KB)
84
+ if (_utils.Utils.isPayloadOversized(data)) {
85
+ _logger.Logger.logError('Report payload exceeds 250KB limit, dropping event');
86
+ this.reportError('m::publishReport', new Error('Payload size exceeds 250KB limit'));
87
+ delete this.reportMap[evtId];
88
+ return;
89
+ }
90
+
91
+ // Build URL with event tracking params
92
+ const eventParams = `eid=${encodeURIComponent(evtId)}&enm=${encodeURIComponent(data.evt ?? '')}`;
93
+ const postUrl = `${_dataStore.DataStore.getUrlInfo().rptUrl}/${data.dws ?? 'n'}/${_utils.Utils.getUniqueID()}?${eventParams}`;
94
+ _logger.Logger.logDbg('Posting Info: ', postUrl);
68
95
  _networkService.NetworkService.sendPostRequest(postUrl, data);
69
96
 
70
97
  // Clean up report from memory after publishing
@@ -79,7 +106,7 @@ class Reporter {
79
106
  };
80
107
  _networkService.NetworkService.sendPostRequest(`${_dataStore.DataStore.getErrorReportUrl()}/${_utils.Utils.getUniqueID()}`, data);
81
108
  }
82
- static async postSST(data, envName, envId, serverTagDownStream, eventName, evtId) {
109
+ static async postSST(data, envName, envId, serverTagDownStream, eventName, evtId, eventData) {
83
110
  // Clone data to avoid mutating the shared dataElements object
84
111
  const payload = {
85
112
  ...data
@@ -91,7 +118,23 @@ class Reporter {
91
118
  payload.debugId = _dataStore.DataStore.getDebugId();
92
119
  payload.dm = 'n/a';
93
120
  payload.v = _dataStore.DataStore.getCoreVersion();
94
- _networkService.NetworkService.sendPostRequest(`${_dataStore.DataStore.getSSTUrl()}/${payload.dws ?? 'n'}/${evtId}`, payload);
121
+
122
+ // Add base64 encoded developer payload
123
+ if (eventData) {
124
+ payload.devPayload = _utils.Utils.encodeToBase64(eventData);
125
+ }
126
+
127
+ // Check payload size to prevent DoS attacks (max 250KB)
128
+ if (_utils.Utils.isPayloadOversized(payload)) {
129
+ _logger.Logger.logError('SST payload exceeds 250KB limit, dropping event');
130
+ this.reportError('m::postSST', new Error('Payload size exceeds 250KB limit'));
131
+ return;
132
+ }
133
+
134
+ // Build URL with event tracking params
135
+ const eventParams = `eid=${encodeURIComponent(evtId)}&enm=${encodeURIComponent(eventName)}`;
136
+ const postPath = `${_dataStore.DataStore.getSSTUrl()}/${payload.dws ?? 'n'}/${_utils.Utils.getUniqueID()}?${eventParams}`;
137
+ _networkService.NetworkService.sendPostRequest(postPath, payload);
95
138
  }
96
139
  static postAttrInfo(payload) {
97
140
  return _networkService.NetworkService.sendPostRequest(_dataStore.DataStore.getAttrInfoUrl(), payload);
@@ -1 +1 @@
1
- {"version":3,"names":["_logger","require","_dataStore","_utils","_networkService","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","MAX_REPORTS","Reporter","initReporter","envName","envId","deviceType","language","deviceOs","pageName","evtName","evtId","clientTagsDownStream","clientSdkVersion","initialItems","reportKeys","keys","reportMap","length","oldestKey","Logger","logDbg","pname","evt","bw","Utils","bwToNum","dt","dtToNum","ln","langToNum","dm","items","dws","v","tagCt","setExpectedTagCount","ct","reportParent","reportItem","item","_reportParent$items","_reportParent$items2","push","publishReport","data","postUrl","DataStore","getUrlInfo","rptUrl","getUniqueID","debugId","getDebugId","NetworkService","sendPostRequest","reportError","methodMetaData","err","message","stack","undefined","version","getSdkVersion","getErrorReportUrl","postSST","serverTagDownStream","eventName","payload","env","getCoreVersion","getSSTUrl","postAttrInfo","getAttrInfoUrl","exports"],"sources":["reporter.ts"],"sourcesContent":["import type { MapLike, Report, ReportTagItem } from './app-types';\nimport { Logger } from './logger';\nimport { DataStore } from './data-store';\nimport { Utils } from './utils';\nimport { NetworkService } from './network-service';\n\n// Maximum number of reports to keep in memory\nconst MAX_REPORTS = 500;\n\nexport class Reporter {\n static reportMap: MapLike<Report> = {};\n\n static initReporter(\n envName: string,\n envId: string,\n deviceType: string,\n language: string,\n deviceOs: string, // device os is being used as a browser proxy\n pageName: string,\n evtName: string,\n evtId: string,\n clientTagsDownStream: 'j' | 'n',\n clientSdkVersion: string,\n initialItems: ReportTagItem[] = []\n ): void {\n // Evict oldest reports if at capacity\n const reportKeys = Object.keys(this.reportMap);\n if (reportKeys.length >= MAX_REPORTS) {\n // Remove oldest report (first key in object)\n const oldestKey = reportKeys[0];\n if (oldestKey) {\n delete this.reportMap[oldestKey];\n Logger.logDbg(\n `Report map at capacity (${MAX_REPORTS}), evicted oldest report:`,\n oldestKey\n );\n }\n }\n\n this.reportMap[evtId] = {\n envName,\n envId,\n pname: pageName || 'none',\n evt: evtName,\n evtId: evtId,\n bw: Utils.bwToNum(deviceOs),\n dt: Utils.dtToNum(deviceType),\n ln: Utils.langToNum(language),\n dm: 'na',\n items: initialItems || [],\n dws: clientTagsDownStream,\n v: clientSdkVersion,\n tagCt: 0,\n };\n }\n\n static setExpectedTagCount(ct: number, evtId: string): void {\n const reportParent = this.reportMap[evtId];\n if (reportParent) {\n reportParent.tagCt = ct;\n }\n }\n\n static reportItem(item: ReportTagItem, evtId: string): void {\n const reportParent = this.reportMap[evtId];\n if (reportParent) {\n reportParent.items.push(item);\n if (\n reportParent?.items?.length === reportParent?.tagCt &&\n reportParent?.items?.length > 0\n ) {\n Logger.logDbg('Hit expected tag count. Reporting');\n this.publishReport(evtId);\n }\n }\n }\n\n static publishReport(evtId: string): void {\n const data = (this.reportMap[evtId] || {}) as MapLike;\n const postUrl = `${DataStore.getUrlInfo().rptUrl}/${\n data.dws ?? 'n'\n }/${Utils.getUniqueID()}`;\n Logger.logDbg('Posting Info: ', postUrl);\n data.debugId = DataStore.getDebugId();\n NetworkService.sendPostRequest(postUrl, data);\n\n // Clean up report from memory after publishing\n delete this.reportMap[evtId];\n }\n\n static reportError(methodMetaData: string, err: any): void {\n Logger.logDbg('Reporting...', methodMetaData, err);\n const data = {\n message: err?.message,\n stack: err?.stack || undefined,\n version: DataStore.getSdkVersion(),\n };\n\n NetworkService.sendPostRequest(\n `${DataStore.getErrorReportUrl()}/${Utils.getUniqueID()}`,\n data\n );\n }\n\n static async postSST(\n data: MapLike,\n envName: string,\n envId: string,\n serverTagDownStream: 'j' | 'n',\n eventName: string,\n evtId: string\n ): Promise<void> {\n // Clone data to avoid mutating the shared dataElements object\n const payload: MapLike = { ...data };\n payload.env = envName;\n payload.envId = envId;\n payload.evtName = eventName;\n payload.dws = serverTagDownStream;\n payload.debugId = DataStore.getDebugId();\n payload.dm = 'n/a';\n payload.v = DataStore.getCoreVersion();\n NetworkService.sendPostRequest(\n `${DataStore.getSSTUrl()}/${payload.dws ?? 'n'}/${evtId}`,\n payload\n );\n }\n\n static postAttrInfo(payload: MapLike): void {\n return NetworkService.sendPostRequest(DataStore.getAttrInfoUrl(), payload);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_logger","require","_dataStore","_utils","_networkService","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","MAX_REPORTS","Reporter","initReporter","envName","envId","deviceType","language","deviceOs","pageName","evtName","evtId","clientTagsDownStream","clientSdkVersion","initialItems","reportKeys","keys","reportMap","length","oldestKey","Logger","logDbg","pname","evt","bw","Utils","bwToNum","dt","dtToNum","ln","langToNum","dm","items","dws","v","tagCt","setExpectedTagCount","ct","reportParent","reportDevPayload","devPayload","encodeToBase64","reportItem","item","_reportParent$items","_reportParent$items2","push","publishReport","report","logError","data","debugId","DataStore","getDebugId","isPayloadOversized","reportError","Error","eventParams","encodeURIComponent","postUrl","getUrlInfo","rptUrl","getUniqueID","NetworkService","sendPostRequest","methodMetaData","err","message","stack","undefined","version","getSdkVersion","getErrorReportUrl","postSST","serverTagDownStream","eventName","eventData","payload","env","getCoreVersion","postPath","getSSTUrl","postAttrInfo","getAttrInfoUrl","exports"],"sources":["reporter.ts"],"sourcesContent":["import type { MapLike, Report, ReportTagItem } from './app-types';\nimport { Logger } from './logger';\nimport { DataStore } from './data-store';\nimport { Utils } from './utils';\nimport { NetworkService } from './network-service';\n\n// Maximum number of reports to keep in memory\nconst MAX_REPORTS = 500;\n\nexport class Reporter {\n static reportMap: MapLike<Report> = {};\n\n static initReporter(\n envName: string,\n envId: string,\n deviceType: string,\n language: string,\n deviceOs: string, // device os is being used as a browser proxy\n pageName: string,\n evtName: string,\n evtId: string,\n clientTagsDownStream: 'j' | 'n',\n clientSdkVersion: string,\n initialItems: ReportTagItem[] = []\n ): void {\n // Evict oldest reports if at capacity\n const reportKeys = Object.keys(this.reportMap);\n if (reportKeys.length >= MAX_REPORTS) {\n // Remove oldest report (first key in object)\n const oldestKey = reportKeys[0];\n if (oldestKey) {\n delete this.reportMap[oldestKey];\n Logger.logDbg(\n `Report map at capacity (${MAX_REPORTS}), evicted oldest report:`,\n oldestKey\n );\n }\n }\n\n this.reportMap[evtId] = {\n envName,\n envId,\n pname: pageName || 'none',\n evt: evtName,\n evtId: evtId,\n bw: Utils.bwToNum(deviceOs),\n dt: Utils.dtToNum(deviceType),\n ln: Utils.langToNum(language),\n dm: 'na',\n items: initialItems || [],\n dws: clientTagsDownStream,\n v: clientSdkVersion,\n tagCt: 0,\n };\n }\n\n static setExpectedTagCount(ct: number, evtId: string): void {\n const reportParent = this.reportMap[evtId];\n if (reportParent) {\n reportParent.tagCt = ct;\n }\n }\n\n static reportDevPayload(\n devPayload: Record<string, any>,\n evtId: string\n ): void {\n const reportParent = this.reportMap[evtId];\n if (reportParent) {\n reportParent.devPayload = Utils.encodeToBase64(devPayload);\n }\n }\n\n static reportItem(item: ReportTagItem, evtId: string): void {\n const reportParent = this.reportMap[evtId];\n if (reportParent) {\n reportParent.items.push(item);\n if (\n reportParent?.items?.length === reportParent?.tagCt &&\n reportParent?.items?.length > 0\n ) {\n Logger.logDbg('Hit expected tag count. Reporting');\n this.publishReport(evtId);\n }\n }\n }\n\n static publishReport(evtId: string): void {\n const report = this.reportMap[evtId];\n if (!report) {\n Logger.logError(`No report found for evtId: ${evtId}`);\n return;\n }\n\n const data = report as MapLike;\n data.debugId = DataStore.getDebugId();\n\n // Include base64 encoded developer payload\n if (report.devPayload) {\n data.devPayload = report.devPayload;\n }\n\n // Check payload size to prevent DoS attacks (max 250KB)\n if (Utils.isPayloadOversized(data)) {\n Logger.logError('Report payload exceeds 250KB limit, dropping event');\n this.reportError(\n 'm::publishReport',\n new Error('Payload size exceeds 250KB limit')\n );\n delete this.reportMap[evtId];\n return;\n }\n\n // Build URL with event tracking params\n const eventParams = `eid=${encodeURIComponent(\n evtId\n )}&enm=${encodeURIComponent(data.evt ?? '')}`;\n const postUrl = `${DataStore.getUrlInfo().rptUrl}/${\n data.dws ?? 'n'\n }/${Utils.getUniqueID()}?${eventParams}`;\n Logger.logDbg('Posting Info: ', postUrl);\n\n NetworkService.sendPostRequest(postUrl, data);\n\n // Clean up report from memory after publishing\n delete this.reportMap[evtId];\n }\n\n static reportError(methodMetaData: string, err: any): void {\n Logger.logDbg('Reporting...', methodMetaData, err);\n const data = {\n message: err?.message,\n stack: err?.stack || undefined,\n version: DataStore.getSdkVersion(),\n };\n\n NetworkService.sendPostRequest(\n `${DataStore.getErrorReportUrl()}/${Utils.getUniqueID()}`,\n data\n );\n }\n\n static async postSST(\n data: MapLike,\n envName: string,\n envId: string,\n serverTagDownStream: 'j' | 'n',\n eventName: string,\n evtId: string,\n eventData?: Record<string, any>\n ): Promise<void> {\n // Clone data to avoid mutating the shared dataElements object\n const payload: MapLike = { ...data };\n payload.env = envName;\n payload.envId = envId;\n payload.evtName = eventName;\n payload.dws = serverTagDownStream;\n payload.debugId = DataStore.getDebugId();\n payload.dm = 'n/a';\n payload.v = DataStore.getCoreVersion();\n\n // Add base64 encoded developer payload\n if (eventData) {\n payload.devPayload = Utils.encodeToBase64(eventData);\n }\n\n // Check payload size to prevent DoS attacks (max 250KB)\n if (Utils.isPayloadOversized(payload)) {\n Logger.logError('SST payload exceeds 250KB limit, dropping event');\n this.reportError(\n 'm::postSST',\n new Error('Payload size exceeds 250KB limit')\n );\n return;\n }\n\n // Build URL with event tracking params\n const eventParams = `eid=${encodeURIComponent(\n evtId\n )}&enm=${encodeURIComponent(eventName)}`;\n const postPath = `${DataStore.getSSTUrl()}/${\n payload.dws ?? 'n'\n }/${Utils.getUniqueID()}?${eventParams}`;\n\n NetworkService.sendPostRequest(postPath, payload);\n }\n\n static postAttrInfo(payload: MapLike): void {\n return NetworkService.sendPostRequest(DataStore.getAttrInfoUrl(), payload);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_asyncStorage","_interopRequireDefault","require","_mpClientSdk","_logger","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","VISITOR_STORE_KEY","VISITOR_EXPIRY_MS","StorageHelper","initialize","isInitialized","storedData","AsyncStorage","getItem","visitorStoreCache","JSON","parse","Logger","logDbg","keys","length","clearExpiredVisitorData","err","logError","now","Date","keysToRemove","key","entry","timestamp","push","persistVisitorStore","setItem","stringify","isDefined","undefined","deStorageDurationSet","deKey","storageDuration","DeStorageDuration","EVENT","SESSION","sessionStore","VISITOR","catch","NONE","deStorageDurationGet","defaultValue","sessionValue","visitorEntry","clearSessionStore","clearVisitorStore","removeItem","exports"],"sources":["storage-helper.ts"],"sourcesContent":["/**\n * Storage helper for data element storage duration\n * Handles SESSION (in-memory) and VISITOR (AsyncStorage with 30-day expiry) storage\n */\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { DeStorageDuration } from '../models/mp-client-sdk';\nimport { Logger } from './logger';\n\n// AsyncStorage key for visitor-scoped data elements\nconst VISITOR_STORE_KEY = '_mp_de_visitor_store';\n\n// 30 days in milliseconds\nconst VISITOR_EXPIRY_MS = 30 * 24 * 60 * 60 * 1000;\n\n// Interface for stored visitor values (includes timestamp for expiry check)\ninterface StoredVisitorValue {\n value: any;\n timestamp: number;\n}\n\nexport class StorageHelper {\n // In-memory store for SESSION-scoped values (cleared on app restart)\n private static sessionStore: Record<string, any> = {};\n\n // In-memory cache of visitor store (loaded from AsyncStorage on init)\n private static visitorStoreCache: Record<string, StoredVisitorValue> = {};\n\n // Flag to track if initialized\n private static isInitialized = false;\n\n /**\n * Initialize the storage helper\n * Loads visitor store from AsyncStorage and cleans expired values\n * Should be called once during SDK initialization\n */\n static async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n // Load visitor store from AsyncStorage\n const storedData = await AsyncStorage.getItem(VISITOR_STORE_KEY);\n if (storedData) {\n this.visitorStoreCache = JSON.parse(storedData);\n Logger.logDbg(\n 'StorageHelper: Loaded visitor store with',\n Object.keys(this.visitorStoreCache).length,\n 'items'\n );\n }\n\n // Clean expired visitor data\n await this.clearExpiredVisitorData();\n\n this.isInitialized = true;\n Logger.logDbg('StorageHelper: Initialized successfully');\n } catch (err) {\n Logger.logError('StorageHelper: Error initializing', err);\n // Reset to empty state on error\n this.visitorStoreCache = {};\n this.isInitialized = true;\n }\n }\n\n /**\n * Clear visitor-scoped values older than 30 days\n */\n static async clearExpiredVisitorData(): Promise<void> {\n try {\n const now = Date.now();\n const keysToRemove: string[] = [];\n\n for (const key of Object.keys(this.visitorStoreCache)) {\n const entry = this.visitorStoreCache[key];\n if (entry && now - entry.timestamp > VISITOR_EXPIRY_MS) {\n keysToRemove.push(key);\n }\n }\n\n if (keysToRemove.length > 0) {\n for (const key of keysToRemove) {\n delete this.visitorStoreCache[key];\n }\n\n // Persist the cleaned store\n await this.persistVisitorStore();\n\n Logger.logDbg(\n 'StorageHelper: Cleared',\n keysToRemove.length,\n 'expired visitor values'\n );\n }\n } catch (err) {\n Logger.logError('StorageHelper: Error clearing expired data', err);\n }\n }\n\n /**\n * Persist the visitor store cache to AsyncStorage\n */\n private static async persistVisitorStore(): Promise<void> {\n try {\n await AsyncStorage.setItem(\n VISITOR_STORE_KEY,\n JSON.stringify(this.visitorStoreCache)\n );\n } catch (err) {\n Logger.logError('StorageHelper: Error persisting visitor store', err);\n }\n }\n\n /**\n * Check if a value is defined (not null, undefined, or empty string)\n */\n private static isDefined(value: any): boolean {\n return value !== null && value !== undefined && value !== '';\n }\n\n /**\n * Store a data element value based on storage duration\n * @param deKey - The data element key\n * @param value - The value to store\n * @param storageDuration - The storage duration type\n */\n static deStorageDurationSet(\n deKey: string,\n value: any,\n storageDuration: DeStorageDuration\n ): void {\n try {\n if (!this.isDefined(deKey) || !this.isDefined(value)) {\n // Key and value are required\n return;\n }\n\n if (!storageDuration) {\n storageDuration = DeStorageDuration.EVENT;\n }\n\n switch (storageDuration) {\n case DeStorageDuration.SESSION:\n // Store in memory (cleared on app restart)\n this.sessionStore[deKey] = value;\n Logger.logDbg(\n 'StorageHelper: Stored SESSION value for',\n deKey\n );\n break;\n\n case DeStorageDuration.VISITOR:\n // Store in AsyncStorage cache with timestamp\n this.visitorStoreCache[deKey] = {\n value: value,\n timestamp: Date.now(),\n };\n // Persist to AsyncStorage in background\n this.persistVisitorStore().catch((err) => {\n Logger.logError(\n 'StorageHelper: Error persisting visitor value',\n err\n );\n });\n Logger.logDbg(\n 'StorageHelper: Stored VISITOR value for',\n deKey\n );\n break;\n\n case DeStorageDuration.EVENT:\n case DeStorageDuration.NONE:\n default:\n // No persistence needed for EVENT or NONE\n break;\n }\n } catch (err) {\n Logger.logError('StorageHelper: Error in deStorageDurationSet', err);\n }\n }\n\n /**\n * Retrieve a data element value based on storage duration\n * @param deKey - The data element key\n * @param defaultValue - Default value if not found\n * @param storageDuration - The storage duration type\n * @returns The stored value or default value\n */\n static deStorageDurationGet(\n deKey: string,\n defaultValue: any,\n storageDuration: DeStorageDuration\n ): any {\n try {\n if (!this.isDefined(deKey)) {\n return defaultValue;\n }\n\n if (!storageDuration) {\n storageDuration = DeStorageDuration.EVENT;\n }\n\n switch (storageDuration) {\n case DeStorageDuration.SESSION: {\n // Get from in-memory session store\n const sessionValue = this.sessionStore[deKey];\n if (this.isDefined(sessionValue)) {\n return sessionValue;\n }\n return defaultValue;\n }\n\n case DeStorageDuration.VISITOR: {\n // Get from visitor store cache\n const visitorEntry = this.visitorStoreCache[deKey];\n if (visitorEntry && this.isDefined(visitorEntry.value)) {\n // Check if not expired\n if (Date.now() - visitorEntry.timestamp <= VISITOR_EXPIRY_MS) {\n return visitorEntry.value;\n } else {\n // Value is expired, remove it\n delete this.visitorStoreCache[deKey];\n this.persistVisitorStore().catch((err) => {\n Logger.logError(\n 'StorageHelper: Error removing expired value',\n err\n );\n });\n }\n }\n return defaultValue;\n }\n\n case DeStorageDuration.EVENT:\n case DeStorageDuration.NONE:\n default:\n // No retrieval for EVENT or NONE\n return defaultValue;\n }\n } catch (err) {\n Logger.logError('StorageHelper: Error in deStorageDurationGet', err);\n return defaultValue;\n }\n }\n\n /**\n * Clear all session-scoped values (called on new session if needed)\n */\n static clearSessionStore(): void {\n this.sessionStore = {};\n Logger.logDbg('StorageHelper: Cleared session store');\n }\n\n /**\n * Clear all visitor-scoped values\n */\n static async clearVisitorStore(): Promise<void> {\n try {\n this.visitorStoreCache = {};\n await AsyncStorage.removeItem(VISITOR_STORE_KEY);\n Logger.logDbg('StorageHelper: Cleared visitor store');\n } catch (err) {\n Logger.logError('StorageHelper: Error clearing visitor store', err);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_asyncStorage","_interopRequireDefault","require","_mpClientSdk","_logger","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","VISITOR_STORE_KEY","VISITOR_EXPIRY_MS","StorageHelper","initialize","isInitialized","storedData","AsyncStorage","getItem","visitorStoreCache","JSON","parse","Logger","logDbg","keys","length","clearExpiredVisitorData","err","logError","now","Date","keysToRemove","key","entry","timestamp","push","persistVisitorStore","setItem","stringify","isDefined","undefined","deStorageDurationSet","deKey","storageDuration","DeStorageDuration","EVENT","SESSION","sessionStore","VISITOR","catch","NONE","deStorageDurationGet","defaultValue","sessionValue","visitorEntry","clearSessionStore","clearVisitorStore","removeItem","exports"],"sources":["storage-helper.ts"],"sourcesContent":["/**\n * Storage helper for data element storage duration\n * Handles SESSION (in-memory) and VISITOR (AsyncStorage with 30-day expiry) storage\n */\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { DeStorageDuration } from '../models/mp-client-sdk';\nimport { Logger } from './logger';\n\n// AsyncStorage key for visitor-scoped data elements\nconst VISITOR_STORE_KEY = '_mp_de_visitor_store';\n\n// 30 days in milliseconds\nconst VISITOR_EXPIRY_MS = 30 * 24 * 60 * 60 * 1000;\n\n// Interface for stored visitor values (includes timestamp for expiry check)\ninterface StoredVisitorValue {\n value: any;\n timestamp: number;\n}\n\nexport class StorageHelper {\n // In-memory store for SESSION-scoped values (cleared on app restart)\n private static sessionStore: Record<string, any> = {};\n\n // In-memory cache of visitor store (loaded from AsyncStorage on init)\n private static visitorStoreCache: Record<string, StoredVisitorValue> = {};\n\n // Flag to track if initialized\n private static isInitialized = false;\n\n /**\n * Initialize the storage helper\n * Loads visitor store from AsyncStorage and cleans expired values\n * Should be called once during SDK initialization\n */\n static async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n // Load visitor store from AsyncStorage\n const storedData = await AsyncStorage.getItem(VISITOR_STORE_KEY);\n if (storedData) {\n this.visitorStoreCache = JSON.parse(storedData);\n Logger.logDbg(\n 'StorageHelper: Loaded visitor store with',\n Object.keys(this.visitorStoreCache).length,\n 'items'\n );\n }\n\n // Clean expired visitor data\n await this.clearExpiredVisitorData();\n\n this.isInitialized = true;\n Logger.logDbg('StorageHelper: Initialized successfully');\n } catch (err) {\n Logger.logError('StorageHelper: Error initializing', err);\n // Reset to empty state on error\n this.visitorStoreCache = {};\n this.isInitialized = true;\n }\n }\n\n /**\n * Clear visitor-scoped values older than 30 days\n */\n static async clearExpiredVisitorData(): Promise<void> {\n try {\n const now = Date.now();\n const keysToRemove: string[] = [];\n\n for (const key of Object.keys(this.visitorStoreCache)) {\n const entry = this.visitorStoreCache[key];\n if (entry && now - entry.timestamp > VISITOR_EXPIRY_MS) {\n keysToRemove.push(key);\n }\n }\n\n if (keysToRemove.length > 0) {\n for (const key of keysToRemove) {\n delete this.visitorStoreCache[key];\n }\n\n // Persist the cleaned store\n await this.persistVisitorStore();\n\n Logger.logDbg(\n 'StorageHelper: Cleared',\n keysToRemove.length,\n 'expired visitor values'\n );\n }\n } catch (err) {\n Logger.logError('StorageHelper: Error clearing expired data', err);\n }\n }\n\n /**\n * Persist the visitor store cache to AsyncStorage\n */\n private static async persistVisitorStore(): Promise<void> {\n try {\n await AsyncStorage.setItem(\n VISITOR_STORE_KEY,\n JSON.stringify(this.visitorStoreCache)\n );\n } catch (err) {\n Logger.logError('StorageHelper: Error persisting visitor store', err);\n }\n }\n\n /**\n * Check if a value is defined (not null, undefined, or empty string)\n */\n private static isDefined(value: any): boolean {\n return value !== null && value !== undefined && value !== '';\n }\n\n /**\n * Store a data element value based on storage duration\n * @param deKey - The data element key\n * @param value - The value to store\n * @param storageDuration - The storage duration type\n */\n static deStorageDurationSet(\n deKey: string,\n value: any,\n storageDuration: DeStorageDuration\n ): void {\n try {\n if (!this.isDefined(deKey) || !this.isDefined(value)) {\n // Key and value are required\n return;\n }\n\n if (!storageDuration) {\n storageDuration = DeStorageDuration.EVENT;\n }\n\n switch (storageDuration) {\n case DeStorageDuration.SESSION:\n // Store in memory (cleared on app restart)\n this.sessionStore[deKey] = value;\n Logger.logDbg('StorageHelper: Stored SESSION value for', deKey);\n break;\n\n case DeStorageDuration.VISITOR:\n // Store in AsyncStorage cache with timestamp\n this.visitorStoreCache[deKey] = {\n value: value,\n timestamp: Date.now(),\n };\n // Persist to AsyncStorage in background\n this.persistVisitorStore().catch((err) => {\n Logger.logError(\n 'StorageHelper: Error persisting visitor value',\n err\n );\n });\n Logger.logDbg('StorageHelper: Stored VISITOR value for', deKey);\n break;\n\n case DeStorageDuration.EVENT:\n case DeStorageDuration.NONE:\n default:\n // No persistence needed for EVENT or NONE\n break;\n }\n } catch (err) {\n Logger.logError('StorageHelper: Error in deStorageDurationSet', err);\n }\n }\n\n /**\n * Retrieve a data element value based on storage duration\n * @param deKey - The data element key\n * @param defaultValue - Default value if not found\n * @param storageDuration - The storage duration type\n * @returns The stored value or default value\n */\n static deStorageDurationGet(\n deKey: string,\n defaultValue: any,\n storageDuration: DeStorageDuration\n ): any {\n try {\n if (!this.isDefined(deKey)) {\n return defaultValue;\n }\n\n if (!storageDuration) {\n storageDuration = DeStorageDuration.EVENT;\n }\n\n switch (storageDuration) {\n case DeStorageDuration.SESSION: {\n // Get from in-memory session store\n const sessionValue = this.sessionStore[deKey];\n if (this.isDefined(sessionValue)) {\n return sessionValue;\n }\n return defaultValue;\n }\n\n case DeStorageDuration.VISITOR: {\n // Get from visitor store cache\n const visitorEntry = this.visitorStoreCache[deKey];\n if (visitorEntry && this.isDefined(visitorEntry.value)) {\n // Check if not expired\n if (Date.now() - visitorEntry.timestamp <= VISITOR_EXPIRY_MS) {\n return visitorEntry.value;\n } else {\n // Value is expired, remove it\n delete this.visitorStoreCache[deKey];\n this.persistVisitorStore().catch((err) => {\n Logger.logError(\n 'StorageHelper: Error removing expired value',\n err\n );\n });\n }\n }\n return defaultValue;\n }\n\n case DeStorageDuration.EVENT:\n case DeStorageDuration.NONE:\n default:\n // No retrieval for EVENT or NONE\n return defaultValue;\n }\n } catch (err) {\n Logger.logError('StorageHelper: Error in deStorageDurationGet', err);\n return defaultValue;\n }\n }\n\n /**\n * Clear all session-scoped values (called on new session if needed)\n */\n static clearSessionStore(): void {\n this.sessionStore = {};\n Logger.logDbg('StorageHelper: Cleared session store');\n }\n\n /**\n * Clear all visitor-scoped values\n */\n static async clearVisitorStore(): Promise<void> {\n try {\n this.visitorStoreCache = {};\n await AsyncStorage.removeItem(VISITOR_STORE_KEY);\n Logger.logDbg('StorageHelper: Cleared visitor store');\n } catch (err) {\n Logger.logError('StorageHelper: Error clearing visitor store', err);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -13,6 +13,8 @@ var _reactNativeUrlPolyfill = require("react-native-url-polyfill");
13
13
  var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
14
14
  var _ulid = require("ulid");
15
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ /** Maximum payload size in bytes (250KB) to prevent DoS attacks */
17
+ const MAX_PAYLOAD_SIZE_BYTES = 250 * 1024;
16
18
  class Utils {
17
19
  static triggerEvent(eventName, payload) {
18
20
  _eventBus.EventBus.triggerEvent(eventName, payload);
@@ -184,6 +186,46 @@ class Utils {
184
186
  return str; // Return original value if encoding fails
185
187
  }
186
188
  }
189
+
190
+ /**
191
+ * Encode an object payload to Base64 string
192
+ * @param payload Object to encode
193
+ * @returns Base64 encoded string, or empty string on error
194
+ */
195
+ static encodeToBase64(payload) {
196
+ try {
197
+ const jsonStr = JSON.stringify(payload);
198
+ return this.toBase64(jsonStr);
199
+ } catch (err) {
200
+ _logger.Logger.logError('Error encoding payload to Base64:', err);
201
+ return '';
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Get the size of a payload in bytes
207
+ * @param payload Object to measure
208
+ * @returns Size in bytes
209
+ */
210
+ static getPayloadSizeBytes(payload) {
211
+ try {
212
+ const jsonStr = JSON.stringify(payload);
213
+ // Use TextEncoder for accurate byte count (handles UTF-8)
214
+ return new TextEncoder().encode(jsonStr).length;
215
+ } catch (err) {
216
+ _logger.Logger.logError('Error calculating payload size:', err);
217
+ return 0;
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Check if payload exceeds the maximum allowed size (250KB)
223
+ * @param payload Object to check
224
+ * @returns True if payload is oversized
225
+ */
226
+ static isPayloadOversized(payload) {
227
+ return this.getPayloadSizeBytes(payload) > MAX_PAYLOAD_SIZE_BYTES;
228
+ }
187
229
  static getUniqueID() {
188
230
  return (0, _ulid.ulid)();
189
231
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_constants","require","_logger","_flat","_eventBus","_reactNative","_reactNativeUrlPolyfill","_asyncStorage","_interopRequireDefault","_ulid","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","toBase64","isMatch","toTest","inputs","ignoreCase","fullMatch","isMatched","i","_val","convertToRegex","test","regExpEscape","replace","RegExp","split","map","join","safeExecute","fn","str","btoa","unescape","getUniqueID","ulid","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","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\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 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":[]}
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":[]}