@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.
Files changed (104) hide show
  1. package/README.md +163 -14
  2. package/lib/commonjs/common/app-types.js.map +1 -1
  3. package/lib/commonjs/common/constants.js +11 -2
  4. package/lib/commonjs/common/constants.js.map +1 -1
  5. package/lib/commonjs/common/data-store.js +13 -30
  6. package/lib/commonjs/common/data-store.js.map +1 -1
  7. package/lib/commonjs/common/deeplink-helper.js +174 -0
  8. package/lib/commonjs/common/deeplink-helper.js.map +1 -0
  9. package/lib/commonjs/common/device-info-helper.js +168 -0
  10. package/lib/commonjs/common/device-info-helper.js.map +1 -0
  11. package/lib/commonjs/common/event-bus.js +39 -0
  12. package/lib/commonjs/common/event-bus.js.map +1 -1
  13. package/lib/commonjs/common/network-service.js +119 -15
  14. package/lib/commonjs/common/network-service.js.map +1 -1
  15. package/lib/commonjs/common/reporter.js +75 -14
  16. package/lib/commonjs/common/reporter.js.map +1 -1
  17. package/lib/commonjs/common/storage-helper.js +227 -0
  18. package/lib/commonjs/common/storage-helper.js.map +1 -0
  19. package/lib/commonjs/common/utils.js +62 -2
  20. package/lib/commonjs/common/utils.js.map +1 -1
  21. package/lib/commonjs/eedl/eedl.js +198 -44
  22. package/lib/commonjs/eedl/eedl.js.map +1 -1
  23. package/lib/commonjs/index.js +301 -54
  24. package/lib/commonjs/index.js.map +1 -1
  25. package/lib/commonjs/models/mp-client-sdk.js +17 -10
  26. package/lib/commonjs/models/mp-client-sdk.js.map +1 -1
  27. package/lib/commonjs/processors/data-element.processor.js +51 -7
  28. package/lib/commonjs/processors/data-element.processor.js.map +1 -1
  29. package/lib/commonjs/processors/visit-id.processor.js +78 -15
  30. package/lib/commonjs/processors/visit-id.processor.js.map +1 -1
  31. package/lib/module/common/app-types.js.map +1 -1
  32. package/lib/module/common/constants.js +11 -2
  33. package/lib/module/common/constants.js.map +1 -1
  34. package/lib/module/common/data-store.js +13 -30
  35. package/lib/module/common/data-store.js.map +1 -1
  36. package/lib/module/common/deeplink-helper.js +168 -0
  37. package/lib/module/common/deeplink-helper.js.map +1 -0
  38. package/lib/module/common/device-info-helper.js +161 -0
  39. package/lib/module/common/device-info-helper.js.map +1 -0
  40. package/lib/module/common/event-bus.js +39 -0
  41. package/lib/module/common/event-bus.js.map +1 -1
  42. package/lib/module/common/network-service.js +119 -15
  43. package/lib/module/common/network-service.js.map +1 -1
  44. package/lib/module/common/reporter.js +76 -14
  45. package/lib/module/common/reporter.js.map +1 -1
  46. package/lib/module/common/storage-helper.js +221 -0
  47. package/lib/module/common/storage-helper.js.map +1 -0
  48. package/lib/module/common/utils.js +63 -2
  49. package/lib/module/common/utils.js.map +1 -1
  50. package/lib/module/eedl/eedl.js +198 -44
  51. package/lib/module/eedl/eedl.js.map +1 -1
  52. package/lib/module/index.js +290 -53
  53. package/lib/module/index.js.map +1 -1
  54. package/lib/module/models/mp-client-sdk.js +16 -9
  55. package/lib/module/models/mp-client-sdk.js.map +1 -1
  56. package/lib/module/processors/data-element.processor.js +51 -7
  57. package/lib/module/processors/data-element.processor.js.map +1 -1
  58. package/lib/module/processors/visit-id.processor.js +78 -15
  59. package/lib/module/processors/visit-id.processor.js.map +1 -1
  60. package/lib/typescript/{common → src/common}/app-types.d.ts +30 -9
  61. package/lib/typescript/{common → src/common}/constants.d.ts +0 -1
  62. package/lib/typescript/{common → src/common}/data-store.d.ts +3 -8
  63. package/lib/typescript/src/common/deeplink-helper.d.ts +60 -0
  64. package/lib/typescript/src/common/device-info-helper.d.ts +54 -0
  65. package/lib/typescript/src/common/event-bus.d.ts +21 -0
  66. package/lib/typescript/src/common/network-service.d.ts +32 -0
  67. package/lib/typescript/{common → src/common}/reporter.d.ts +2 -1
  68. package/lib/typescript/src/common/storage-helper.d.ts +47 -0
  69. package/lib/typescript/{common → src/common}/utils.d.ts +25 -0
  70. package/lib/typescript/{eedl → src/eedl}/eedl.d.ts +43 -1
  71. package/lib/typescript/{index.d.ts → src/index.d.ts} +39 -5
  72. package/lib/typescript/{models → src/models}/mp-client-sdk.d.ts +7 -0
  73. package/lib/typescript/src/processors/visit-id.processor.d.ts +23 -0
  74. package/package.json +25 -36
  75. package/src/common/app-types.ts +33 -10
  76. package/src/common/constants.ts +0 -6
  77. package/src/common/data-store.ts +8 -30
  78. package/src/common/deeplink-helper.ts +181 -0
  79. package/src/common/device-info-helper.ts +190 -0
  80. package/src/common/event-bus.ts +39 -0
  81. package/src/common/network-service.ts +154 -21
  82. package/src/common/reporter.ts +97 -16
  83. package/src/common/storage-helper.ts +260 -0
  84. package/src/common/utils.ts +63 -2
  85. package/src/eedl/eedl.ts +225 -51
  86. package/src/index.tsx +346 -73
  87. package/src/models/mp-client-sdk.ts +8 -0
  88. package/src/processors/data-element.processor.ts +85 -7
  89. package/src/processors/visit-id.processor.ts +92 -22
  90. package/lib/commonjs/processors/trans-function.processor.js +0 -73
  91. package/lib/commonjs/processors/trans-function.processor.js.map +0 -1
  92. package/lib/module/processors/trans-function.processor.js +0 -66
  93. package/lib/module/processors/trans-function.processor.js.map +0 -1
  94. package/lib/typescript/common/event-bus.d.ts +0 -6
  95. package/lib/typescript/common/network-service.d.ts +0 -8
  96. package/lib/typescript/processors/trans-function.processor.d.ts +0 -12
  97. package/lib/typescript/processors/visit-id.processor.d.ts +0 -9
  98. package/src/processors/trans-function.processor.ts +0 -85
  99. /package/lib/typescript/{common → src/common}/logger.d.ts +0 -0
  100. /package/lib/typescript/{models → src/models}/geo-api-response.d.ts +0 -0
  101. /package/lib/typescript/{processors → src/processors}/data-element.processor.d.ts +0 -0
  102. /package/lib/typescript/{processors → src/processors}/geo-location.processor.d.ts +0 -0
  103. /package/lib/typescript/{processors → src/processors}/qc.processor.d.ts +0 -0
  104. /package/lib/typescript/{processors → src/processors}/tag.processor.d.ts +0 -0
@@ -0,0 +1,161 @@
1
+ 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; }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
+ import { Platform } from 'react-native';
5
+ import { Logger } from './logger';
6
+ /**
7
+ * Helper class to automatically detect device and app information
8
+ * Supports both Expo and bare React Native:
9
+ * 1. Tries Expo modules first (works in Expo Go)
10
+ * 2. Falls back to react-native-device-info (for bare RN)
11
+ * 3. Returns safe defaults if neither is available
12
+ */
13
+ export class DeviceInfoHelper {
14
+ /**
15
+ * Try to load Expo modules and react-native-device-info
16
+ * This uses dynamic imports to avoid errors when modules aren't available
17
+ */
18
+ static async initialize() {
19
+ if (this.initialized) return;
20
+
21
+ // Try to load Expo modules first (works in Expo Go)
22
+ try {
23
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
24
+ this.expoApplication = require('expo-application');
25
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
26
+ this.expoDevice = require('expo-device');
27
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
28
+ this.expoConstants = require('expo-constants').default;
29
+ Logger.logDbg('Using Expo modules for device info');
30
+ } catch (error) {
31
+ Logger.logDbg('Expo modules not available, will try react-native-device-info');
32
+ }
33
+
34
+ // Fall back to react-native-device-info (for bare RN)
35
+ if (!this.expoApplication) {
36
+ try {
37
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
38
+ this.deviceInfo = require('react-native-device-info').default;
39
+ Logger.logDbg('Using react-native-device-info for device info');
40
+ } catch (error) {
41
+ Logger.logError('Neither Expo modules nor react-native-device-info available:', error);
42
+ }
43
+ }
44
+ this.initialized = true;
45
+ }
46
+
47
+ /**
48
+ * Get comprehensive app and device information
49
+ * All methods are async-safe and handle errors gracefully
50
+ */
51
+ static async getAppInfo() {
52
+ await this.initialize();
53
+ try {
54
+ // Try Expo modules first
55
+ if (this.expoApplication && this.expoDevice) {
56
+ return await this.getAppInfoFromExpo();
57
+ }
58
+
59
+ // Fall back to react-native-device-info
60
+ if (this.deviceInfo) {
61
+ return await this.getAppInfoFromDeviceInfo();
62
+ }
63
+
64
+ // Return safe fallback values
65
+ return this.getSafeDefaults();
66
+ } catch (error) {
67
+ Logger.logError('Error getting device info:', error);
68
+ return this.getSafeDefaults();
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Get device info using Expo modules (works in Expo Go)
74
+ */
75
+ static async getAppInfoFromExpo() {
76
+ var _Platform$Version;
77
+ const version = this.expoApplication.nativeApplicationVersion || 'unknown';
78
+ const buildNumber = this.expoApplication.nativeBuildVersion || 'unknown';
79
+ const packageName = this.expoApplication.applicationId || 'unknown';
80
+ return {
81
+ // App information
82
+ app_version: version,
83
+ build_number: buildNumber,
84
+ package_name: packageName,
85
+ // Device information
86
+ device_model_name: this.expoDevice.modelName || 'unknown',
87
+ device_manufacturer: this.expoDevice.manufacturer || 'unknown',
88
+ device_id: this.expoConstants.sessionId || 'unknown',
89
+ // OS information
90
+ os_name: Platform.OS,
91
+ os_version: this.expoDevice.osVersion || ((_Platform$Version = Platform.Version) === null || _Platform$Version === void 0 ? void 0 : _Platform$Version.toString()) || 'unknown',
92
+ // Additional useful info
93
+ // DeviceType enum: UNKNOWN=0, PHONE=1, TABLET=2, DESKTOP=3, TV=4
94
+ is_tablet: this.expoDevice.deviceType === 2,
95
+ // DeviceType.TABLET = 2
96
+ is_emulator: !this.expoDevice.isDevice
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Get device info using react-native-device-info (for bare RN)
102
+ */
103
+ static async getAppInfoFromDeviceInfo() {
104
+ const [version, buildNumber, uniqueId, bundleId] = await Promise.all([this.deviceInfo.getVersion(), this.deviceInfo.getBuildNumber(), this.deviceInfo.getUniqueId(), this.deviceInfo.getBundleId()]);
105
+ return {
106
+ // App information
107
+ app_version: version,
108
+ build_number: buildNumber,
109
+ package_name: bundleId,
110
+ // Device information
111
+ device_model_name: this.deviceInfo.getModel(),
112
+ device_manufacturer: this.deviceInfo.getManufacturerSync(),
113
+ device_id: uniqueId,
114
+ // OS information
115
+ os_name: Platform.OS,
116
+ os_version: this.deviceInfo.getSystemVersion(),
117
+ // Additional useful info
118
+ is_tablet: this.deviceInfo.isTablet(),
119
+ is_emulator: await this.deviceInfo.isEmulator()
120
+ };
121
+ }
122
+
123
+ /**
124
+ * Safe default values when no device info library is available
125
+ */
126
+ static getSafeDefaults() {
127
+ var _Platform$Version2;
128
+ return {
129
+ app_version: 'unknown',
130
+ build_number: 'unknown',
131
+ package_name: 'unknown',
132
+ device_model_name: 'unknown',
133
+ device_manufacturer: 'unknown',
134
+ device_id: 'unknown',
135
+ os_name: Platform.OS,
136
+ os_version: ((_Platform$Version2 = Platform.Version) === null || _Platform$Version2 === void 0 ? void 0 : _Platform$Version2.toString()) || 'unknown',
137
+ is_tablet: false,
138
+ is_emulator: false
139
+ };
140
+ }
141
+
142
+ /**
143
+ * Get app version in format: "1.0.0 (123)"
144
+ * Combines version and build number for better tracking
145
+ */
146
+ static async getFormattedAppVersion() {
147
+ try {
148
+ const info = await this.getAppInfo();
149
+ return `${info.app_version} (${info.build_number})`;
150
+ } catch (error) {
151
+ Logger.logError('Error getting formatted app version:', error);
152
+ return 'unknown';
153
+ }
154
+ }
155
+ }
156
+ _defineProperty(DeviceInfoHelper, "expoApplication", null);
157
+ _defineProperty(DeviceInfoHelper, "expoDevice", null);
158
+ _defineProperty(DeviceInfoHelper, "expoConstants", null);
159
+ _defineProperty(DeviceInfoHelper, "deviceInfo", null);
160
+ _defineProperty(DeviceInfoHelper, "initialized", false);
161
+ //# sourceMappingURL=device-info-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Platform","Logger","DeviceInfoHelper","initialize","initialized","expoApplication","require","expoDevice","expoConstants","default","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","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","_defineProperty"],"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":[]}
@@ -11,6 +11,45 @@ export class EventBus {
11
11
  this.eventRegister.get(eventName).push(callback);
12
12
  }
13
13
  }
14
+
15
+ /**
16
+ * Remove a specific callback for an event
17
+ * @param eventName Event name to remove callback from
18
+ * @param callback The callback function to remove
19
+ */
20
+ static off(eventName, callback) {
21
+ if (this.eventRegister.has(eventName)) {
22
+ const callbacks = this.eventRegister.get(eventName);
23
+ const index = callbacks.indexOf(callback);
24
+ if (index > -1) {
25
+ callbacks.splice(index, 1);
26
+ Logger.logDbg(`Removed listener for event: ${eventName}`);
27
+ }
28
+ // Clean up empty arrays
29
+ if (callbacks.length === 0) {
30
+ this.eventRegister.delete(eventName);
31
+ }
32
+ }
33
+ }
34
+
35
+ /**
36
+ * Remove all callbacks for a specific event
37
+ * @param eventName Event name to clear all listeners for
38
+ */
39
+ static clearEvent(eventName) {
40
+ if (this.eventRegister.has(eventName)) {
41
+ this.eventRegister.delete(eventName);
42
+ Logger.logDbg(`Cleared all listeners for event: ${eventName}`);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Remove all event listeners (used during SDK shutdown)
48
+ */
49
+ static clearAll() {
50
+ this.eventRegister.clear();
51
+ Logger.logDbg('Cleared all event listeners');
52
+ }
14
53
  static triggerEvent(eventName, payload) {
15
54
  if (this.eventRegister.has(eventName)) {
16
55
  for (const cb of this.eventRegister.get(eventName)) {
@@ -1 +1 @@
1
- {"version":3,"names":["Logger","EventBus","on","eventName","callback","logDbg","eventRegister","has","set","get","push","triggerEvent","payload","cb","length","err","logError","_defineProperty","Map"],"sources":["event-bus.ts"],"sourcesContent":["import type { EventBusCallback } from './app-types';\nimport { Logger } from './logger';\n\nexport class EventBus {\n private static eventRegister: Map<string, Array<EventBusCallback>> = new Map<\n string,\n Array<EventBusCallback>\n >();\n\n static on(eventName: string, callback: EventBusCallback): void {\n Logger.logDbg(`Registering Listener for event: ${eventName}`);\n if (!this.eventRegister.has(eventName)) {\n this.eventRegister.set(eventName, [callback]);\n } else {\n this.eventRegister.get(eventName).push(callback);\n }\n }\n\n static triggerEvent(eventName: string, payload: any): void {\n if (this.eventRegister.has(eventName)) {\n for (const cb of this.eventRegister.get(eventName)) {\n try {\n Logger.logDbg(\n `Sending event ${eventName} to all listeners. Count = ${\n this.eventRegister.get(eventName).length\n }`\n );\n cb(eventName, payload);\n } catch (err) {\n Logger.logError('Unable to process callback for event: ' + eventName);\n }\n }\n }\n }\n}\n"],"mappings":";;;AACA,SAASA,MAAM,QAAQ,UAAU;AAEjC,OAAO,MAAMC,QAAQ,CAAC;EAMpB,OAAOC,EAAEA,CAACC,SAAiB,EAAEC,QAA0B,EAAQ;IAC7DJ,MAAM,CAACK,MAAM,CAAC,mCAAmCF,SAAS,EAAE,CAAC;IAC7D,IAAI,CAAC,IAAI,CAACG,aAAa,CAACC,GAAG,CAACJ,SAAS,CAAC,EAAE;MACtC,IAAI,CAACG,aAAa,CAACE,GAAG,CAACL,SAAS,EAAE,CAACC,QAAQ,CAAC,CAAC;IAC/C,CAAC,MAAM;MACL,IAAI,CAACE,aAAa,CAACG,GAAG,CAACN,SAAS,CAAC,CAACO,IAAI,CAACN,QAAQ,CAAC;IAClD;EACF;EAEA,OAAOO,YAAYA,CAACR,SAAiB,EAAES,OAAY,EAAQ;IACzD,IAAI,IAAI,CAACN,aAAa,CAACC,GAAG,CAACJ,SAAS,CAAC,EAAE;MACrC,KAAK,MAAMU,EAAE,IAAI,IAAI,CAACP,aAAa,CAACG,GAAG,CAACN,SAAS,CAAC,EAAE;QAClD,IAAI;UACFH,MAAM,CAACK,MAAM,CACX,iBAAiBF,SAAS,8BACxB,IAAI,CAACG,aAAa,CAACG,GAAG,CAACN,SAAS,CAAC,CAACW,MAAM,EAE5C,CAAC;UACDD,EAAE,CAACV,SAAS,EAAES,OAAO,CAAC;QACxB,CAAC,CAAC,OAAOG,GAAG,EAAE;UACZf,MAAM,CAACgB,QAAQ,CAAC,wCAAwC,GAAGb,SAAS,CAAC;QACvE;MACF;IACF;EACF;AACF;AAACc,eAAA,CA/BYhB,QAAQ,mBACkD,IAAIiB,GAAG,CAG1E,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Logger","EventBus","on","eventName","callback","logDbg","eventRegister","has","set","get","push","off","callbacks","index","indexOf","splice","length","delete","clearEvent","clearAll","clear","triggerEvent","payload","cb","err","logError","_defineProperty","Map"],"sources":["event-bus.ts"],"sourcesContent":["import type { EventBusCallback } from './app-types';\nimport { Logger } from './logger';\n\nexport class EventBus {\n private static eventRegister: Map<string, Array<EventBusCallback>> = new Map<\n string,\n Array<EventBusCallback>\n >();\n\n static on(eventName: string, callback: EventBusCallback): void {\n Logger.logDbg(`Registering Listener for event: ${eventName}`);\n if (!this.eventRegister.has(eventName)) {\n this.eventRegister.set(eventName, [callback]);\n } else {\n this.eventRegister.get(eventName).push(callback);\n }\n }\n\n /**\n * Remove a specific callback for an event\n * @param eventName Event name to remove callback from\n * @param callback The callback function to remove\n */\n static off(eventName: string, callback: EventBusCallback): void {\n if (this.eventRegister.has(eventName)) {\n const callbacks = this.eventRegister.get(eventName);\n const index = callbacks.indexOf(callback);\n if (index > -1) {\n callbacks.splice(index, 1);\n Logger.logDbg(`Removed listener for event: ${eventName}`);\n }\n // Clean up empty arrays\n if (callbacks.length === 0) {\n this.eventRegister.delete(eventName);\n }\n }\n }\n\n /**\n * Remove all callbacks for a specific event\n * @param eventName Event name to clear all listeners for\n */\n static clearEvent(eventName: string): void {\n if (this.eventRegister.has(eventName)) {\n this.eventRegister.delete(eventName);\n Logger.logDbg(`Cleared all listeners for event: ${eventName}`);\n }\n }\n\n /**\n * Remove all event listeners (used during SDK shutdown)\n */\n static clearAll(): void {\n this.eventRegister.clear();\n Logger.logDbg('Cleared all event listeners');\n }\n\n static triggerEvent(eventName: string, payload: any): void {\n if (this.eventRegister.has(eventName)) {\n for (const cb of this.eventRegister.get(eventName)) {\n try {\n Logger.logDbg(\n `Sending event ${eventName} to all listeners. Count = ${\n this.eventRegister.get(eventName).length\n }`\n );\n cb(eventName, payload);\n } catch (err) {\n Logger.logError('Unable to process callback for event: ' + eventName);\n }\n }\n }\n }\n}\n"],"mappings":";;;AACA,SAASA,MAAM,QAAQ,UAAU;AAEjC,OAAO,MAAMC,QAAQ,CAAC;EAMpB,OAAOC,EAAEA,CAACC,SAAiB,EAAEC,QAA0B,EAAQ;IAC7DJ,MAAM,CAACK,MAAM,CAAC,mCAAmCF,SAAS,EAAE,CAAC;IAC7D,IAAI,CAAC,IAAI,CAACG,aAAa,CAACC,GAAG,CAACJ,SAAS,CAAC,EAAE;MACtC,IAAI,CAACG,aAAa,CAACE,GAAG,CAACL,SAAS,EAAE,CAACC,QAAQ,CAAC,CAAC;IAC/C,CAAC,MAAM;MACL,IAAI,CAACE,aAAa,CAACG,GAAG,CAACN,SAAS,CAAC,CAACO,IAAI,CAACN,QAAQ,CAAC;IAClD;EACF;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOO,GAAGA,CAACR,SAAiB,EAAEC,QAA0B,EAAQ;IAC9D,IAAI,IAAI,CAACE,aAAa,CAACC,GAAG,CAACJ,SAAS,CAAC,EAAE;MACrC,MAAMS,SAAS,GAAG,IAAI,CAACN,aAAa,CAACG,GAAG,CAACN,SAAS,CAAC;MACnD,MAAMU,KAAK,GAAGD,SAAS,CAACE,OAAO,CAACV,QAAQ,CAAC;MACzC,IAAIS,KAAK,GAAG,CAAC,CAAC,EAAE;QACdD,SAAS,CAACG,MAAM,CAACF,KAAK,EAAE,CAAC,CAAC;QAC1Bb,MAAM,CAACK,MAAM,CAAC,+BAA+BF,SAAS,EAAE,CAAC;MAC3D;MACA;MACA,IAAIS,SAAS,CAACI,MAAM,KAAK,CAAC,EAAE;QAC1B,IAAI,CAACV,aAAa,CAACW,MAAM,CAACd,SAAS,CAAC;MACtC;IACF;EACF;;EAEA;AACF;AACA;AACA;EACE,OAAOe,UAAUA,CAACf,SAAiB,EAAQ;IACzC,IAAI,IAAI,CAACG,aAAa,CAACC,GAAG,CAACJ,SAAS,CAAC,EAAE;MACrC,IAAI,CAACG,aAAa,CAACW,MAAM,CAACd,SAAS,CAAC;MACpCH,MAAM,CAACK,MAAM,CAAC,oCAAoCF,SAAS,EAAE,CAAC;IAChE;EACF;;EAEA;AACF;AACA;EACE,OAAOgB,QAAQA,CAAA,EAAS;IACtB,IAAI,CAACb,aAAa,CAACc,KAAK,CAAC,CAAC;IAC1BpB,MAAM,CAACK,MAAM,CAAC,6BAA6B,CAAC;EAC9C;EAEA,OAAOgB,YAAYA,CAAClB,SAAiB,EAAEmB,OAAY,EAAQ;IACzD,IAAI,IAAI,CAAChB,aAAa,CAACC,GAAG,CAACJ,SAAS,CAAC,EAAE;MACrC,KAAK,MAAMoB,EAAE,IAAI,IAAI,CAACjB,aAAa,CAACG,GAAG,CAACN,SAAS,CAAC,EAAE;QAClD,IAAI;UACFH,MAAM,CAACK,MAAM,CACX,iBAAiBF,SAAS,8BACxB,IAAI,CAACG,aAAa,CAACG,GAAG,CAACN,SAAS,CAAC,CAACa,MAAM,EAE5C,CAAC;UACDO,EAAE,CAACpB,SAAS,EAAEmB,OAAO,CAAC;QACxB,CAAC,CAAC,OAAOE,GAAG,EAAE;UACZxB,MAAM,CAACyB,QAAQ,CAAC,wCAAwC,GAAGtB,SAAS,CAAC;QACvE;MACF;IACF;EACF;AACF;AAACuB,eAAA,CAtEYzB,QAAQ,mBACkD,IAAI0B,GAAG,CAG1E,CAAC","ignoreList":[]}
@@ -1,28 +1,132 @@
1
1
  import { Logger } from './logger';
2
2
  import { DataStore } from './data-store';
3
- import { Reporter } from './reporter';
3
+ const DEFAULT_RETRY_COUNT = 3;
4
+ const DEFAULT_RETRY_DELAY_MS = 1000;
5
+ const DEFAULT_TIMEOUT_MS = 10000;
4
6
  export class NetworkService {
7
+ /**
8
+ * Sleep for a specified duration
9
+ */
10
+ static sleep(ms) {
11
+ return new Promise(resolve => setTimeout(resolve, ms));
12
+ }
13
+
14
+ /**
15
+ * Fetch with timeout wrapper
16
+ */
17
+ static async fetchWithTimeout(url, options, timeoutMs = DEFAULT_TIMEOUT_MS) {
18
+ const controller = new AbortController();
19
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
20
+ try {
21
+ const response = await fetch(url, {
22
+ ...options,
23
+ signal: controller.signal
24
+ });
25
+ return response;
26
+ } finally {
27
+ clearTimeout(timeoutId);
28
+ }
29
+ }
30
+ /**
31
+ * Fetch visitor/identity info from server
32
+ * Returns null if fetch fails (caller should handle retry logic)
33
+ */
5
34
  static async fetchIdlInfo(url) {
6
- const response = await NetworkService.sendNetworkRequest('get', url);
7
- if (response) {
8
- return response.json();
9
- } else {
35
+ try {
36
+ const response = await this.fetchWithTimeout(url, {
37
+ method: 'GET',
38
+ headers: {
39
+ 'Content-Type': 'text/plain',
40
+ 'cache-control': 'no-store',
41
+ ...DataStore.getCommonCookies()
42
+ }
43
+ }, DEFAULT_TIMEOUT_MS);
44
+ if (response && response.ok) {
45
+ return response.json();
46
+ } else {
47
+ Logger.logError(`Failed to fetch IDL info: ${response === null || response === void 0 ? void 0 : response.status} ${response === null || response === void 0 ? void 0 : response.statusText}`);
48
+ return null;
49
+ }
50
+ } catch (err) {
51
+ Logger.logError('Error fetching IDL info:', err);
10
52
  return null;
11
53
  }
12
54
  }
55
+
56
+ /**
57
+ * Fetch visitor/identity info with retry logic
58
+ * @param url The IDL URL
59
+ * @param retries Number of retries (default: 3)
60
+ * @returns VisitorInfo or null if all retries fail
61
+ */
62
+ static async fetchIdlInfoWithRetry(url, retries = DEFAULT_RETRY_COUNT) {
63
+ let lastError = null;
64
+ for (let attempt = 1; attempt <= retries; attempt++) {
65
+ try {
66
+ Logger.logDbg(`Fetching IDL info (attempt ${attempt}/${retries})`);
67
+ const result = await this.fetchIdlInfo(url);
68
+ if (result) {
69
+ Logger.logDbg('IDL info fetched successfully');
70
+ return result;
71
+ }
72
+ } catch (err) {
73
+ lastError = err instanceof Error ? err : new Error(String(err));
74
+ Logger.logError(`IDL fetch attempt ${attempt} failed:`, err);
75
+ }
76
+
77
+ // Wait before retry (exponential backoff)
78
+ if (attempt < retries) {
79
+ const delay = DEFAULT_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
80
+ Logger.logDbg(`Retrying IDL fetch in ${delay}ms...`);
81
+ await this.sleep(delay);
82
+ }
83
+ }
84
+ Logger.logError(`All ${retries} IDL fetch attempts failed`, lastError);
85
+ return null;
86
+ }
87
+
88
+ /**
89
+ * Refresh client SDK JSON configuration with retry logic
90
+ * @param sdkInitOptions SDK initialization options
91
+ * @returns true if successful, throws Error if all retries fail
92
+ */
13
93
  static async refreshClientSdkJson(sdkInitOptions) {
14
- try {
15
- const response = await this.sendNetworkRequest('get', `${sdkInitOptions.baseUrl}/${sdkInitOptions.projectId}${sdkInitOptions.env === 'staging' ? '-staging' : ''}.json`);
16
- if (response) {
17
- const sdkJson = await response.json();
18
- Logger.logDbg('Client Sdk:: ', sdkJson);
19
- // sdkJson.s.c_url = 'http://localhost:3003';
20
- await DataStore.init(sdkJson);
94
+ var _lastError;
95
+ const url = `${sdkInitOptions.baseUrl}/${sdkInitOptions.projectId}${sdkInitOptions.env === 'staging' ? '-staging' : ''}.json`;
96
+ let lastError = null;
97
+ for (let attempt = 1; attempt <= DEFAULT_RETRY_COUNT; attempt++) {
98
+ try {
99
+ Logger.logDbg(`Fetching SDK config (attempt ${attempt}/${DEFAULT_RETRY_COUNT}): ${url}`);
100
+ const response = await this.fetchWithTimeout(url, {
101
+ method: 'GET',
102
+ headers: {
103
+ 'Content-Type': 'text/plain',
104
+ 'cache-control': 'no-store'
105
+ }
106
+ }, DEFAULT_TIMEOUT_MS);
107
+ if (response && response.ok) {
108
+ const sdkJson = await response.json();
109
+ Logger.logDbg('Client SDK config fetched successfully');
110
+ await DataStore.init(sdkJson);
111
+ return; // Success - exit the retry loop
112
+ } else {
113
+ throw new Error(`HTTP ${response === null || response === void 0 ? void 0 : response.status}: ${(response === null || response === void 0 ? void 0 : response.statusText) || 'Unknown error'}`);
114
+ }
115
+ } catch (err) {
116
+ lastError = err instanceof Error ? err : new Error(String(err));
117
+ Logger.logError(`SDK config fetch attempt ${attempt} failed:`, err);
118
+
119
+ // Wait before retry (exponential backoff)
120
+ if (attempt < DEFAULT_RETRY_COUNT) {
121
+ const delay = DEFAULT_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
122
+ Logger.logDbg(`Retrying SDK config fetch in ${delay}ms...`);
123
+ await this.sleep(delay);
124
+ }
21
125
  }
22
- } catch (err) {
23
- Reporter.reportError('refreshClientSdk', err);
24
- // throw new Error('Unable to fetch MagicPixel SDK at this time.');
25
126
  }
127
+
128
+ // All retries failed - throw error so caller can handle it
129
+ throw new Error(`Failed to fetch SDK configuration after ${DEFAULT_RETRY_COUNT} attempts: ${(_lastError = lastError) === null || _lastError === void 0 ? void 0 : _lastError.message}`);
26
130
  }
27
131
  static sendPostRequest(url, body) {
28
132
  this.sendNetworkRequest('post', url, body).catch(err => {
@@ -1 +1 @@
1
- {"version":3,"names":["Logger","DataStore","Reporter","NetworkService","fetchIdlInfo","url","response","sendNetworkRequest","json","refreshClientSdkJson","sdkInitOptions","baseUrl","projectId","env","sdkJson","logDbg","init","err","reportError","sendPostRequest","body","catch","logError","sendGetRequest","method","JSON","stringify","getCommonCookies","fetch","headers","Error"],"sources":["network-service.ts"],"sourcesContent":["import { Logger } from './logger';\nimport type { MapLike, SdkInitOptions, VisitorInfo } from './app-types';\nimport { DataStore } from './data-store';\nimport { Reporter } from './reporter';\nimport type { MpClientSdk } from '../models/mp-client-sdk';\n\nexport class NetworkService {\n public static async fetchIdlInfo(url: string): Promise<VisitorInfo> {\n const response = await NetworkService.sendNetworkRequest('get', url);\n if (response) {\n return response.json();\n } else {\n return null;\n }\n }\n\n public static async refreshClientSdkJson(\n sdkInitOptions: SdkInitOptions\n ): Promise<void> {\n try {\n const response = await this.sendNetworkRequest(\n 'get',\n `${sdkInitOptions.baseUrl}/${sdkInitOptions.projectId}${\n sdkInitOptions.env === 'staging' ? '-staging' : ''\n }.json`\n );\n\n if (response) {\n const sdkJson: MpClientSdk = await response.json();\n Logger.logDbg('Client Sdk:: ', sdkJson);\n // sdkJson.s.c_url = 'http://localhost:3003';\n await DataStore.init(sdkJson);\n }\n } catch (err) {\n Reporter.reportError('refreshClientSdk', err);\n // throw new Error('Unable to fetch MagicPixel SDK at this time.');\n }\n }\n\n public static sendPostRequest(url: string, body: MapLike): void {\n this.sendNetworkRequest('post', url, body).catch((err) => {\n Logger.logError(err);\n });\n }\n\n public static sendGetRequest(url: string): void {\n this.sendNetworkRequest('get', url).catch((err) => {\n Logger.logError(err);\n });\n }\n\n private static async sendNetworkRequest(\n method: 'get' | 'post',\n url: string,\n body?: MapLike\n ): Promise<any> {\n try {\n Logger.logDbg(\n `Sending ${method} request to ${url} with body ${JSON.stringify(body)}`\n );\n Logger.logDbg(\n `Common Cookies: ${JSON.stringify(DataStore.getCommonCookies() ?? {})}`\n );\n if (method === 'get') {\n return await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'text/plain',\n 'cache-control': 'no-store',\n // 'x-dbg': 'trace',\n ...DataStore.getCommonCookies(),\n },\n });\n } else if (method === 'post') {\n return await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'text/plain',\n 'cache-control': 'no-store',\n // 'x-dbg': 'trace',\n ...DataStore.getCommonCookies(),\n },\n body: JSON.stringify(body ?? '{}'),\n });\n } else {\n throw new Error('Unsupported method: ' + method);\n }\n } catch (err) {\n Logger.logError(err);\n return null;\n }\n }\n}\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,UAAU;AAEjC,SAASC,SAAS,QAAQ,cAAc;AACxC,SAASC,QAAQ,QAAQ,YAAY;AAGrC,OAAO,MAAMC,cAAc,CAAC;EAC1B,aAAoBC,YAAYA,CAACC,GAAW,EAAwB;IAClE,MAAMC,QAAQ,GAAG,MAAMH,cAAc,CAACI,kBAAkB,CAAC,KAAK,EAAEF,GAAG,CAAC;IACpE,IAAIC,QAAQ,EAAE;MACZ,OAAOA,QAAQ,CAACE,IAAI,CAAC,CAAC;IACxB,CAAC,MAAM;MACL,OAAO,IAAI;IACb;EACF;EAEA,aAAoBC,oBAAoBA,CACtCC,cAA8B,EACf;IACf,IAAI;MACF,MAAMJ,QAAQ,GAAG,MAAM,IAAI,CAACC,kBAAkB,CAC5C,KAAK,EACL,GAAGG,cAAc,CAACC,OAAO,IAAID,cAAc,CAACE,SAAS,GACnDF,cAAc,CAACG,GAAG,KAAK,SAAS,GAAG,UAAU,GAAG,EAAE,OAEtD,CAAC;MAED,IAAIP,QAAQ,EAAE;QACZ,MAAMQ,OAAoB,GAAG,MAAMR,QAAQ,CAACE,IAAI,CAAC,CAAC;QAClDR,MAAM,CAACe,MAAM,CAAC,eAAe,EAAED,OAAO,CAAC;QACvC;QACA,MAAMb,SAAS,CAACe,IAAI,CAACF,OAAO,CAAC;MAC/B;IACF,CAAC,CAAC,OAAOG,GAAG,EAAE;MACZf,QAAQ,CAACgB,WAAW,CAAC,kBAAkB,EAAED,GAAG,CAAC;MAC7C;IACF;EACF;EAEA,OAAcE,eAAeA,CAACd,GAAW,EAAEe,IAAa,EAAQ;IAC9D,IAAI,CAACb,kBAAkB,CAAC,MAAM,EAAEF,GAAG,EAAEe,IAAI,CAAC,CAACC,KAAK,CAAEJ,GAAG,IAAK;MACxDjB,MAAM,CAACsB,QAAQ,CAACL,GAAG,CAAC;IACtB,CAAC,CAAC;EACJ;EAEA,OAAcM,cAAcA,CAAClB,GAAW,EAAQ;IAC9C,IAAI,CAACE,kBAAkB,CAAC,KAAK,EAAEF,GAAG,CAAC,CAACgB,KAAK,CAAEJ,GAAG,IAAK;MACjDjB,MAAM,CAACsB,QAAQ,CAACL,GAAG,CAAC;IACtB,CAAC,CAAC;EACJ;EAEA,aAAqBV,kBAAkBA,CACrCiB,MAAsB,EACtBnB,GAAW,EACXe,IAAc,EACA;IACd,IAAI;MACFpB,MAAM,CAACe,MAAM,CACX,WAAWS,MAAM,eAAenB,GAAG,cAAcoB,IAAI,CAACC,SAAS,CAACN,IAAI,CAAC,EACvE,CAAC;MACDpB,MAAM,CAACe,MAAM,CACX,mBAAmBU,IAAI,CAACC,SAAS,CAACzB,SAAS,CAAC0B,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EACvE,CAAC;MACD,IAAIH,MAAM,KAAK,KAAK,EAAE;QACpB,OAAO,MAAMI,KAAK,CAACvB,GAAG,EAAE;UACtBmB,MAAM,EAAE,KAAK;UACbK,OAAO,EAAE;YACP,cAAc,EAAE,YAAY;YAC5B,eAAe,EAAE,UAAU;YAC3B;YACA,GAAG5B,SAAS,CAAC0B,gBAAgB,CAAC;UAChC;QACF,CAAC,CAAC;MACJ,CAAC,MAAM,IAAIH,MAAM,KAAK,MAAM,EAAE;QAC5B,OAAO,MAAMI,KAAK,CAACvB,GAAG,EAAE;UACtBmB,MAAM,EAAE,MAAM;UACdK,OAAO,EAAE;YACP,cAAc,EAAE,YAAY;YAC5B,eAAe,EAAE,UAAU;YAC3B;YACA,GAAG5B,SAAS,CAAC0B,gBAAgB,CAAC;UAChC,CAAC;UACDP,IAAI,EAAEK,IAAI,CAACC,SAAS,CAACN,IAAI,IAAI,IAAI;QACnC,CAAC,CAAC;MACJ,CAAC,MAAM;QACL,MAAM,IAAIU,KAAK,CAAC,sBAAsB,GAAGN,MAAM,CAAC;MAClD;IACF,CAAC,CAAC,OAAOP,GAAG,EAAE;MACZjB,MAAM,CAACsB,QAAQ,CAACL,GAAG,CAAC;MACpB,OAAO,IAAI;IACb;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"names":["Logger","DataStore","DEFAULT_RETRY_COUNT","DEFAULT_RETRY_DELAY_MS","DEFAULT_TIMEOUT_MS","NetworkService","sleep","ms","Promise","resolve","setTimeout","fetchWithTimeout","url","options","timeoutMs","controller","AbortController","timeoutId","abort","response","fetch","signal","clearTimeout","fetchIdlInfo","method","headers","getCommonCookies","ok","json","logError","status","statusText","err","fetchIdlInfoWithRetry","retries","lastError","attempt","logDbg","result","Error","String","delay","Math","pow","refreshClientSdkJson","sdkInitOptions","_lastError","baseUrl","projectId","env","sdkJson","init","message","sendPostRequest","body","sendNetworkRequest","catch","sendGetRequest","JSON","stringify"],"sources":["network-service.ts"],"sourcesContent":["import { Logger } from './logger';\nimport type { MapLike, SdkInitOptions, VisitorInfo } from './app-types';\nimport { DataStore } from './data-store';\nimport type { MpClientSdk } from '../models/mp-client-sdk';\n\nconst DEFAULT_RETRY_COUNT = 3;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst DEFAULT_TIMEOUT_MS = 10000;\n\nexport class NetworkService {\n /**\n * Sleep for a specified duration\n */\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Fetch with timeout wrapper\n */\n private static async fetchWithTimeout(\n url: string,\n options: RequestInit,\n timeoutMs: number = DEFAULT_TIMEOUT_MS\n ): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n /**\n * Fetch visitor/identity info from server\n * Returns null if fetch fails (caller should handle retry logic)\n */\n public static async fetchIdlInfo(url: string): Promise<VisitorInfo | null> {\n try {\n const response = await this.fetchWithTimeout(\n url,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'text/plain',\n 'cache-control': 'no-store',\n ...DataStore.getCommonCookies(),\n },\n },\n DEFAULT_TIMEOUT_MS\n );\n\n if (response && response.ok) {\n return response.json();\n } else {\n Logger.logError(\n `Failed to fetch IDL info: ${response?.status} ${response?.statusText}`\n );\n return null;\n }\n } catch (err) {\n Logger.logError('Error fetching IDL info:', err);\n return null;\n }\n }\n\n /**\n * Fetch visitor/identity info with retry logic\n * @param url The IDL URL\n * @param retries Number of retries (default: 3)\n * @returns VisitorInfo or null if all retries fail\n */\n public static async fetchIdlInfoWithRetry(\n url: string,\n retries: number = DEFAULT_RETRY_COUNT\n ): Promise<VisitorInfo | null> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n Logger.logDbg(`Fetching IDL info (attempt ${attempt}/${retries})`);\n const result = await this.fetchIdlInfo(url);\n\n if (result) {\n Logger.logDbg('IDL info fetched successfully');\n return result;\n }\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n Logger.logError(`IDL fetch attempt ${attempt} failed:`, err);\n }\n\n // Wait before retry (exponential backoff)\n if (attempt < retries) {\n const delay = DEFAULT_RETRY_DELAY_MS * Math.pow(2, attempt - 1);\n Logger.logDbg(`Retrying IDL fetch in ${delay}ms...`);\n await this.sleep(delay);\n }\n }\n\n Logger.logError(`All ${retries} IDL fetch attempts failed`, lastError);\n return null;\n }\n\n /**\n * Refresh client SDK JSON configuration with retry logic\n * @param sdkInitOptions SDK initialization options\n * @returns true if successful, throws Error if all retries fail\n */\n public static async refreshClientSdkJson(\n sdkInitOptions: SdkInitOptions\n ): Promise<void> {\n const url = `${sdkInitOptions.baseUrl}/${sdkInitOptions.projectId}${\n sdkInitOptions.env === 'staging' ? '-staging' : ''\n }.json`;\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= DEFAULT_RETRY_COUNT; attempt++) {\n try {\n Logger.logDbg(\n `Fetching SDK config (attempt ${attempt}/${DEFAULT_RETRY_COUNT}): ${url}`\n );\n\n const response = await this.fetchWithTimeout(\n url,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'text/plain',\n 'cache-control': 'no-store',\n },\n },\n DEFAULT_TIMEOUT_MS\n );\n\n if (response && response.ok) {\n const sdkJson: MpClientSdk = await response.json();\n Logger.logDbg('Client SDK config fetched successfully');\n await DataStore.init(sdkJson);\n return; // Success - exit the retry loop\n } else {\n throw new Error(\n `HTTP ${response?.status}: ${\n response?.statusText || 'Unknown error'\n }`\n );\n }\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n Logger.logError(`SDK config fetch attempt ${attempt} failed:`, err);\n\n // Wait before retry (exponential backoff)\n if (attempt < DEFAULT_RETRY_COUNT) {\n const delay = DEFAULT_RETRY_DELAY_MS * Math.pow(2, attempt - 1);\n Logger.logDbg(`Retrying SDK config fetch in ${delay}ms...`);\n await this.sleep(delay);\n }\n }\n }\n\n // All retries failed - throw error so caller can handle it\n throw new Error(\n `Failed to fetch SDK configuration after ${DEFAULT_RETRY_COUNT} attempts: ${lastError?.message}`\n );\n }\n\n public static sendPostRequest(url: string, body: MapLike): void {\n this.sendNetworkRequest('post', url, body).catch((err) => {\n Logger.logError(err);\n });\n }\n\n public static sendGetRequest(url: string): void {\n this.sendNetworkRequest('get', url).catch((err) => {\n Logger.logError(err);\n });\n }\n\n private static async sendNetworkRequest(\n method: 'get' | 'post',\n url: string,\n body?: MapLike\n ): Promise<any> {\n try {\n Logger.logDbg(\n `Sending ${method} request to ${url} with body ${JSON.stringify(body)}`\n );\n Logger.logDbg(\n `Common Cookies: ${JSON.stringify(DataStore.getCommonCookies() ?? {})}`\n );\n if (method === 'get') {\n return await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'text/plain',\n 'cache-control': 'no-store',\n // 'x-dbg': 'trace',\n ...DataStore.getCommonCookies(),\n },\n });\n } else if (method === 'post') {\n return await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'text/plain',\n 'cache-control': 'no-store',\n // 'x-dbg': 'trace',\n ...DataStore.getCommonCookies(),\n },\n body: JSON.stringify(body ?? '{}'),\n });\n } else {\n throw new Error('Unsupported method: ' + method);\n }\n } catch (err) {\n Logger.logError(err);\n return null;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -5,10 +5,23 @@ import { Logger } from './logger';
5
5
  import { DataStore } from './data-store';
6
6
  import { Utils } from './utils';
7
7
  import { NetworkService } from './network-service';
8
+
9
+ // Maximum number of reports to keep in memory
10
+ const MAX_REPORTS = 500;
8
11
  export class Reporter {
9
12
  static initReporter(envName, envId, deviceType, language, deviceOs,
10
13
  // device os is being used as a browser proxy
11
14
  pageName, evtName, evtId, clientTagsDownStream, clientSdkVersion, initialItems = []) {
15
+ // Evict oldest reports if at capacity
16
+ const reportKeys = Object.keys(this.reportMap);
17
+ if (reportKeys.length >= MAX_REPORTS) {
18
+ // Remove oldest report (first key in object)
19
+ const oldestKey = reportKeys[0];
20
+ if (oldestKey) {
21
+ delete this.reportMap[oldestKey];
22
+ Logger.logDbg(`Report map at capacity (${MAX_REPORTS}), evicted oldest report:`, oldestKey);
23
+ }
24
+ }
12
25
  this.reportMap[evtId] = {
13
26
  envName,
14
27
  envId,
@@ -31,23 +44,53 @@ export class Reporter {
31
44
  reportParent.tagCt = ct;
32
45
  }
33
46
  }
47
+ static reportDevPayload(devPayload, evtId) {
48
+ const reportParent = this.reportMap[evtId];
49
+ if (reportParent) {
50
+ reportParent.devPayload = Utils.encodeToBase64(devPayload);
51
+ }
52
+ }
34
53
  static reportItem(item, evtId) {
35
54
  const reportParent = this.reportMap[evtId];
36
55
  if (reportParent) {
37
56
  var _reportParent$items, _reportParent$items2;
38
57
  reportParent.items.push(item);
39
- if ((reportParent === null || reportParent === void 0 ? void 0 : (_reportParent$items = reportParent.items) === null || _reportParent$items === void 0 ? void 0 : _reportParent$items.length) === (reportParent === null || reportParent === void 0 ? void 0 : reportParent.tagCt) && (reportParent === null || reportParent === void 0 ? void 0 : (_reportParent$items2 = reportParent.items) === null || _reportParent$items2 === void 0 ? void 0 : _reportParent$items2.length) > 0) {
58
+ if ((reportParent === null || reportParent === void 0 || (_reportParent$items = reportParent.items) === null || _reportParent$items === void 0 ? void 0 : _reportParent$items.length) === (reportParent === null || reportParent === void 0 ? void 0 : reportParent.tagCt) && (reportParent === null || reportParent === void 0 || (_reportParent$items2 = reportParent.items) === null || _reportParent$items2 === void 0 ? void 0 : _reportParent$items2.length) > 0) {
40
59
  Logger.logDbg('Hit expected tag count. Reporting');
41
60
  this.publishReport(evtId);
42
61
  }
43
62
  }
44
63
  }
45
64
  static publishReport(evtId) {
46
- const data = this.reportMap[evtId] || {};
47
- const postUrl = `${DataStore.getUrlInfo().rptUrl}/${data.dws ?? 'n'}/${Utils.getUniqueID()}`;
48
- Logger.logDbg('Posting Info: ', postUrl);
65
+ const report = this.reportMap[evtId];
66
+ if (!report) {
67
+ Logger.logError(`No report found for evtId: ${evtId}`);
68
+ return;
69
+ }
70
+ const data = report;
49
71
  data.debugId = DataStore.getDebugId();
72
+
73
+ // Include base64 encoded developer payload
74
+ if (report.devPayload) {
75
+ data.devPayload = report.devPayload;
76
+ }
77
+
78
+ // Check payload size to prevent DoS attacks (max 250KB)
79
+ if (Utils.isPayloadOversized(data)) {
80
+ Logger.logError('Report payload exceeds 250KB limit, dropping event');
81
+ this.reportError('m::publishReport', new Error('Payload size exceeds 250KB limit'));
82
+ delete this.reportMap[evtId];
83
+ return;
84
+ }
85
+
86
+ // Build URL with event tracking params
87
+ const eventParams = `eid=${encodeURIComponent(evtId)}&enm=${encodeURIComponent(data.evt ?? '')}`;
88
+ const postUrl = `${DataStore.getUrlInfo().rptUrl}/${data.dws ?? 'n'}/${Utils.getUniqueID()}?${eventParams}`;
89
+ Logger.logDbg('Posting Info: ', postUrl);
50
90
  NetworkService.sendPostRequest(postUrl, data);
91
+
92
+ // Clean up report from memory after publishing
93
+ delete this.reportMap[evtId];
51
94
  }
52
95
  static reportError(methodMetaData, err) {
53
96
  Logger.logDbg('Reporting...', methodMetaData, err);
@@ -58,16 +101,35 @@ export class Reporter {
58
101
  };
59
102
  NetworkService.sendPostRequest(`${DataStore.getErrorReportUrl()}/${Utils.getUniqueID()}`, data);
60
103
  }
61
- static async postSST(data, envName, envId, serverTagDownStream, eventName, evtId) {
62
- data.env = envName;
63
- data.envId = envId;
64
- data.evtName = eventName;
65
- data.dws = serverTagDownStream;
66
- data.debugId = DataStore.getDebugId();
67
- data.dm = 'n/a';
68
- data.v = DataStore.getCoreVersion();
69
- // return postHttp(`${getUrlInfo().tfUrl}/${getUniqueID()}`, 'POST', data);
70
- NetworkService.sendPostRequest(`${DataStore.getSSTUrl()}/${data.dws ?? 'n'}/${evtId}`, data);
104
+ static async postSST(data, envName, envId, serverTagDownStream, eventName, evtId, eventData) {
105
+ // Clone data to avoid mutating the shared dataElements object
106
+ const payload = {
107
+ ...data
108
+ };
109
+ payload.env = envName;
110
+ payload.envId = envId;
111
+ payload.evtName = eventName;
112
+ payload.dws = serverTagDownStream;
113
+ payload.debugId = DataStore.getDebugId();
114
+ payload.dm = 'n/a';
115
+ payload.v = DataStore.getCoreVersion();
116
+
117
+ // Add base64 encoded developer payload
118
+ if (eventData) {
119
+ payload.devPayload = Utils.encodeToBase64(eventData);
120
+ }
121
+
122
+ // Check payload size to prevent DoS attacks (max 250KB)
123
+ if (Utils.isPayloadOversized(payload)) {
124
+ Logger.logError('SST payload exceeds 250KB limit, dropping event');
125
+ this.reportError('m::postSST', new Error('Payload size exceeds 250KB limit'));
126
+ return;
127
+ }
128
+
129
+ // Build URL with event tracking params
130
+ const eventParams = `eid=${encodeURIComponent(evtId)}&enm=${encodeURIComponent(eventName)}`;
131
+ const postPath = `${DataStore.getSSTUrl()}/${payload.dws ?? 'n'}/${Utils.getUniqueID()}?${eventParams}`;
132
+ NetworkService.sendPostRequest(postPath, payload);
71
133
  }
72
134
  static postAttrInfo(payload) {
73
135
  return NetworkService.sendPostRequest(DataStore.getAttrInfoUrl(), payload);
@@ -1 +1 @@
1
- {"version":3,"names":["Logger","DataStore","Utils","NetworkService","Reporter","initReporter","envName","envId","deviceType","language","deviceOs","pageName","evtName","evtId","clientTagsDownStream","clientSdkVersion","initialItems","reportMap","pname","evt","bw","bwToNum","dt","dtToNum","ln","langToNum","dm","items","dws","v","tagCt","setExpectedTagCount","ct","reportParent","reportItem","item","_reportParent$items","_reportParent$items2","push","length","logDbg","publishReport","data","postUrl","getUrlInfo","rptUrl","getUniqueID","debugId","getDebugId","sendPostRequest","reportError","methodMetaData","err","message","stack","undefined","version","getSdkVersion","getErrorReportUrl","postSST","serverTagDownStream","eventName","env","getCoreVersion","getSSTUrl","postAttrInfo","payload","getAttrInfoUrl","_defineProperty"],"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\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 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\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 data.env = envName;\n data.envId = envId;\n data.evtName = eventName;\n data.dws = serverTagDownStream;\n data.debugId = DataStore.getDebugId();\n data.dm = 'n/a';\n data.v = DataStore.getCoreVersion();\n // return postHttp(`${getUrlInfo().tfUrl}/${getUniqueID()}`, 'POST', data);\n NetworkService.sendPostRequest(\n `${DataStore.getSSTUrl()}/${data.dws ?? 'n'}/${evtId}`,\n data\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","DataStore","Utils","NetworkService","MAX_REPORTS","Reporter","initReporter","envName","envId","deviceType","language","deviceOs","pageName","evtName","evtId","clientTagsDownStream","clientSdkVersion","initialItems","reportKeys","Object","keys","reportMap","length","oldestKey","logDbg","pname","evt","bw","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","getDebugId","isPayloadOversized","reportError","Error","eventParams","encodeURIComponent","postUrl","getUrlInfo","rptUrl","getUniqueID","sendPostRequest","methodMetaData","err","message","stack","undefined","version","getSdkVersion","getErrorReportUrl","postSST","serverTagDownStream","eventName","eventData","payload","env","getCoreVersion","postPath","getSSTUrl","postAttrInfo","getAttrInfoUrl","_defineProperty"],"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":[]}