@magicpixel/rn-mp-client-sdk 0.12.0 → 1.12.1

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 (102) hide show
  1. package/lib/commonjs/common/app-types.js.map +1 -1
  2. package/lib/commonjs/common/constants.js +5 -26
  3. package/lib/commonjs/common/constants.js.map +1 -1
  4. package/lib/commonjs/common/data-store.js +36 -117
  5. package/lib/commonjs/common/data-store.js.map +1 -1
  6. package/lib/commonjs/common/event-bus.js +3 -10
  7. package/lib/commonjs/common/event-bus.js.map +1 -1
  8. package/lib/commonjs/common/logger.js +9 -18
  9. package/lib/commonjs/common/logger.js.map +1 -1
  10. package/lib/commonjs/common/network-service.js +6 -21
  11. package/lib/commonjs/common/network-service.js.map +1 -1
  12. package/lib/commonjs/common/reporter.js +8 -31
  13. package/lib/commonjs/common/reporter.js.map +1 -1
  14. package/lib/commonjs/common/utils.js +64 -65
  15. package/lib/commonjs/common/utils.js.map +1 -1
  16. package/lib/commonjs/coverage/lcov-report/block-navigation.js +6 -19
  17. package/lib/commonjs/coverage/lcov-report/block-navigation.js.map +1 -1
  18. package/lib/commonjs/coverage/lcov-report/prettify.js +2 -182
  19. package/lib/commonjs/coverage/lcov-report/prettify.js.map +1 -1
  20. package/lib/commonjs/coverage/lcov-report/sorter.js +64 -94
  21. package/lib/commonjs/coverage/lcov-report/sorter.js.map +1 -1
  22. package/lib/commonjs/eedl/eedl.js +207 -84
  23. package/lib/commonjs/eedl/eedl.js.map +1 -1
  24. package/lib/commonjs/index.js +104 -95
  25. package/lib/commonjs/index.js.map +1 -1
  26. package/lib/commonjs/models/geo-api-response.js +2 -0
  27. package/lib/commonjs/models/geo-api-response.js.map +1 -0
  28. package/lib/commonjs/models/mp-client-sdk.js +3 -11
  29. package/lib/commonjs/models/mp-client-sdk.js.map +1 -1
  30. package/lib/commonjs/processors/data-element.processor.js +85 -80
  31. package/lib/commonjs/processors/data-element.processor.js.map +1 -1
  32. package/lib/commonjs/processors/geo-location.processor.js +70 -0
  33. package/lib/commonjs/processors/geo-location.processor.js.map +1 -0
  34. package/lib/commonjs/processors/qc.processor.js +2 -25
  35. package/lib/commonjs/processors/qc.processor.js.map +1 -1
  36. package/lib/commonjs/processors/tag.processor.js +17 -86
  37. package/lib/commonjs/processors/tag.processor.js.map +1 -1
  38. package/lib/commonjs/processors/trans-function.processor.js +5 -23
  39. package/lib/commonjs/processors/trans-function.processor.js.map +1 -1
  40. package/lib/commonjs/processors/visit-id.processor.js +4 -50
  41. package/lib/commonjs/processors/visit-id.processor.js.map +1 -1
  42. package/lib/module/common/app-types.js.map +1 -1
  43. package/lib/module/common/constants.js +4 -22
  44. package/lib/module/common/constants.js.map +1 -1
  45. package/lib/module/common/data-store.js +35 -108
  46. package/lib/module/common/data-store.js.map +1 -1
  47. package/lib/module/common/event-bus.js +3 -6
  48. package/lib/module/common/event-bus.js.map +1 -1
  49. package/lib/module/common/logger.js +9 -16
  50. package/lib/module/common/logger.js.map +1 -1
  51. package/lib/module/common/network-service.js +6 -11
  52. package/lib/module/common/network-service.js.map +1 -1
  53. package/lib/module/common/reporter.js +8 -19
  54. package/lib/module/common/reporter.js.map +1 -1
  55. package/lib/module/common/utils.js +63 -56
  56. package/lib/module/common/utils.js.map +1 -1
  57. package/lib/module/coverage/lcov-report/block-navigation.js +6 -19
  58. package/lib/module/coverage/lcov-report/block-navigation.js.map +1 -1
  59. package/lib/module/coverage/lcov-report/prettify.js +2 -182
  60. package/lib/module/coverage/lcov-report/prettify.js.map +1 -1
  61. package/lib/module/coverage/lcov-report/sorter.js +64 -94
  62. package/lib/module/coverage/lcov-report/sorter.js.map +1 -1
  63. package/lib/module/eedl/eedl.js +206 -76
  64. package/lib/module/eedl/eedl.js.map +1 -1
  65. package/lib/module/index.js +102 -57
  66. package/lib/module/index.js.map +1 -1
  67. package/lib/module/models/geo-api-response.js +2 -0
  68. package/lib/module/models/geo-api-response.js.map +1 -0
  69. package/lib/module/models/mp-client-sdk.js +0 -5
  70. package/lib/module/models/mp-client-sdk.js.map +1 -1
  71. package/lib/module/processors/data-element.processor.js +82 -71
  72. package/lib/module/processors/data-element.processor.js.map +1 -1
  73. package/lib/module/processors/geo-location.processor.js +63 -0
  74. package/lib/module/processors/geo-location.processor.js.map +1 -0
  75. package/lib/module/processors/qc.processor.js +2 -11
  76. package/lib/module/processors/qc.processor.js.map +1 -1
  77. package/lib/module/processors/tag.processor.js +17 -57
  78. package/lib/module/processors/tag.processor.js.map +1 -1
  79. package/lib/module/processors/trans-function.processor.js +5 -12
  80. package/lib/module/processors/trans-function.processor.js.map +1 -1
  81. package/lib/module/processors/visit-id.processor.js +4 -27
  82. package/lib/module/processors/visit-id.processor.js.map +1 -1
  83. package/lib/typescript/common/app-types.d.ts +3 -0
  84. package/lib/typescript/common/constants.d.ts +1 -0
  85. package/lib/typescript/common/data-store.d.ts +8 -0
  86. package/lib/typescript/common/utils.d.ts +19 -0
  87. package/lib/typescript/eedl/eedl.d.ts +16 -5
  88. package/lib/typescript/index.d.ts +53 -0
  89. package/lib/typescript/models/geo-api-response.d.ts +12 -0
  90. package/lib/typescript/processors/data-element.processor.d.ts +10 -1
  91. package/lib/typescript/processors/geo-location.processor.d.ts +10 -0
  92. package/package.json +25 -10
  93. package/src/common/app-types.ts +3 -0
  94. package/src/common/constants.ts +2 -0
  95. package/src/common/data-store.ts +38 -0
  96. package/src/common/network-service.ts +2 -0
  97. package/src/common/utils.ts +58 -0
  98. package/src/eedl/eedl.ts +241 -18
  99. package/src/index.tsx +98 -3
  100. package/src/models/geo-api-response.ts +13 -0
  101. package/src/processors/data-element.processor.ts +140 -70
  102. package/src/processors/geo-location.processor.ts +91 -0
@@ -8,14 +8,8 @@ import type { ClientSdkDeItem } from '../models/mp-client-sdk';
8
8
  import { DataStore } from '../common/data-store';
9
9
  import { Logger } from '../common/logger';
10
10
 
11
- const deJsvTimeOutPromise = (ms = 2000): Promise<any> => {
12
- return new Promise((_resolve, reject) => {
13
- const id = setTimeout(() => {
14
- clearTimeout(id);
15
- reject('Timed out in ' + ms + 'ms.');
16
- }, ms);
17
- });
18
- };
11
+ // Note: JSV (JavaScript functions) are not supported in React Native
12
+ // This timeout function is kept for potential future use
19
13
 
20
14
  const dElemProcessors: MapLike<
21
15
  (
@@ -49,6 +43,68 @@ const dElemProcessors: MapLike<
49
43
  pg_dtype: (_helper: DeJsvHelper, _elem: ClientSdkDeItem): any => {
50
44
  return DataStore.getDeviceType();
51
45
  },
46
+ /* Geo location data elements */
47
+ mp_geo_pcode: (
48
+ _helper: DeJsvHelper,
49
+ _elem: ClientSdkDeItem,
50
+ _eventData?: Record<string, any>
51
+ ): any => {
52
+ return DataStore.getGeoInfo()?.postal ?? undefined;
53
+ },
54
+ mp_geo_country: (
55
+ _helper: DeJsvHelper,
56
+ _elem: ClientSdkDeItem,
57
+ _eventData?: Record<string, any>
58
+ ): any => {
59
+ return DataStore.getGeoInfo()?.country ?? undefined;
60
+ },
61
+
62
+ mp_geo_region: (
63
+ _helper: DeJsvHelper,
64
+ _elem: ClientSdkDeItem,
65
+ _eventData?: Record<string, any>
66
+ ): any => {
67
+ return DataStore.getGeoInfo()?.region ?? undefined;
68
+ },
69
+ mp_geo_city: (
70
+ _helper: DeJsvHelper,
71
+ _elem: ClientSdkDeItem,
72
+ _eventData?: Record<string, any>
73
+ ): any => {
74
+ return DataStore.getGeoInfo()?.city ?? undefined;
75
+ },
76
+ /* Visit info data elements */
77
+ mp_visit_count: (
78
+ _helper: DeJsvHelper,
79
+ _elem: ClientSdkDeItem,
80
+ _eventData?: Record<string, any>
81
+ ): any => {
82
+ return DataStore.getVisitInfo()?.visitCt ?? 0;
83
+ },
84
+ mp_visit_depth: (
85
+ _helper: DeJsvHelper,
86
+ _elem: ClientSdkDeItem,
87
+ _eventData?: Record<string, any>
88
+ ): any => {
89
+ return DataStore.getVisitInfo()?.visitDepth ?? 0;
90
+ },
91
+ /* Browser/Platform data elements */
92
+ pg_browser: (
93
+ _helper: DeJsvHelper,
94
+ _elem: ClientSdkDeItem,
95
+ _eventData?: Record<string, any>
96
+ ): any => {
97
+ return DataStore.getDeviceOs(); // Using device OS as browser equivalent
98
+ },
99
+ /* User status data element - TODO: Implement getMpUserStatus in DataStore */
100
+ mp_new_vis: (
101
+ _helper: DeJsvHelper,
102
+ _elem: ClientSdkDeItem,
103
+ _eventData?: Record<string, any>
104
+ ): any => {
105
+ // TODO: Implement user status functionality
106
+ return '1'; // Default to new visitor
107
+ },
52
108
  pg_random: (
53
109
  _helper: DeJsvHelper,
54
110
  _elem: ClientSdkDeItem,
@@ -122,29 +178,7 @@ const dElemProcessors: MapLike<
122
178
  _elem.key = 'ev._eventName';
123
179
  return processMpDl(_helper, _elem, _eventData);
124
180
  },
125
- jsv: async (
126
- helper: DeJsvHelper,
127
- elem: ClientSdkDeItem,
128
- _eventData?: Record<string, any>
129
- ): Promise<any> => {
130
- try {
131
- if (elem.fn) {
132
- if (!elem.isAsync) {
133
- return await elem.fn(helper, undefined);
134
- } else {
135
- return await Promise.race([
136
- elem.fn(helper, undefined),
137
- deJsvTimeOutPromise(elem.fnTOut || undefined),
138
- ]);
139
- }
140
- } else {
141
- return elem.def || undefined;
142
- }
143
- } catch (err) {
144
- Logger.logError(err);
145
- return elem.def || undefined;
146
- }
147
- },
181
+ // Note: JSV (JavaScript functions) processor removed - not supported in React Native
148
182
  };
149
183
 
150
184
  function generalCleanAndEscape(
@@ -194,10 +228,83 @@ function processMpDl(
194
228
  return generalCleanAndEscape(helper, de, de.def);
195
229
  }
196
230
 
231
+ export async function processOneDataElement(
232
+ _sdkDataElements: MapLike<ClientSdkDeItem>,
233
+ deItem: ClientSdkDeItem,
234
+ deHelper: any,
235
+ eventData?: Record<string, any>,
236
+ _optDeKeys?: string[]
237
+ ): Promise<any> {
238
+ try {
239
+ if (dElemProcessors[deItem.typ]) {
240
+ Logger.logDbg('Processing data element: ', deItem.nm);
241
+ const deValue = await dElemProcessors[deItem.typ](
242
+ deHelper,
243
+ deItem,
244
+ eventData
245
+ );
246
+
247
+ // TODO: Implement storage duration functionality for React Native
248
+ // For now, we'll just return the value without persistence
249
+
250
+ return deValue;
251
+ } else {
252
+ Logger.logError('No processor found for de typ: ', deItem.typ);
253
+ }
254
+ } catch (err) {
255
+ Logger.logError(
256
+ 'Error processing data element: ',
257
+ deItem.key,
258
+ ' with error: ',
259
+ err
260
+ );
261
+ }
262
+
263
+ return deItem.def;
264
+ }
265
+
266
+ /**
267
+ * Process all the data elements at once, or if a set of keys are specified, processes only
268
+ * those keys and updates the dataElements object in DataStore
269
+ * @param sdkDataElements
270
+ * @param eventData
271
+ * @param optDeKeys
272
+ */
273
+ export async function processDataElements(
274
+ sdkDataElements: MapLike<ClientSdkDeItem>,
275
+ eventData?: Record<string, any>,
276
+ optDeKeys?: string[]
277
+ ): Promise<MapLike<any>> {
278
+ const de = DataStore.getDataElements();
279
+ const deKeys =
280
+ optDeKeys && optDeKeys.length > 0
281
+ ? optDeKeys
282
+ : Object.keys(sdkDataElements);
283
+
284
+ try {
285
+ const deHelper = DataStore.getDataElementHelpers();
286
+ for (const key of deKeys) {
287
+ de[key] = await processOneDataElement(
288
+ sdkDataElements,
289
+ sdkDataElements[key],
290
+ deHelper,
291
+ eventData,
292
+ optDeKeys
293
+ );
294
+ }
295
+ } catch (err) {
296
+ Logger.logError('Error processing data elements: ', err);
297
+ }
298
+
299
+ DataStore.setDataElements(de);
300
+ Logger.logDbg('Data Elements: ', de);
301
+ return de;
302
+ }
303
+
197
304
  export class DataElementProcessor {
198
305
  /**
199
306
  * Process all the data elements at once, or if a set of keys are specified, processes only
200
- * those keys and updates the dataElements object in global-fns file
307
+ * those keys and updates the dataElements object in DataStore
201
308
  * @param sdkDataElements
202
309
  * @param eventData
203
310
  * @param optDeKeys
@@ -207,43 +314,6 @@ export class DataElementProcessor {
207
314
  eventData?: Record<string, any>,
208
315
  optDeKeys?: string[]
209
316
  ): Promise<MapLike<any>> {
210
- const de = DataStore.getDataElements();
211
- const deKeys =
212
- optDeKeys && optDeKeys.length > 0
213
- ? optDeKeys
214
- : Object.keys(sdkDataElements);
215
-
216
- try {
217
- const deHelper = DataStore.getDataElementHelpers();
218
- for (const key of deKeys) {
219
- try {
220
- const deItem = sdkDataElements[key];
221
- if (deItem) {
222
- const invokeItem = dElemProcessors[deItem.typ];
223
- if (dElemProcessors[deItem.typ]) {
224
- Logger.logDbg('Processing data element: ', deItem.nm);
225
- if (invokeItem) {
226
- de[key] = await invokeItem(deHelper, deItem, eventData);
227
- }
228
- } else {
229
- Logger.logError('No processor found for de typ: ', deItem.typ);
230
- }
231
- }
232
- } catch (err) {
233
- Logger.logError(
234
- 'Error processing data element: ',
235
- key,
236
- ' with error: ',
237
- err
238
- );
239
- }
240
- }
241
- } catch (err) {
242
- Logger.logError('Error processing data elements: ', err);
243
- }
244
-
245
- DataStore.setDataElements(de);
246
- Logger.logDbg('Data Elements: ', de);
247
- return de;
317
+ return processDataElements(sdkDataElements, eventData, optDeKeys);
248
318
  }
249
319
  }
@@ -0,0 +1,91 @@
1
+ import { DataStore } from '../common/data-store';
2
+ import { Utils } from '../common/utils';
3
+ import type { GeoApiResponse, GeoResponse } from '../models/geo-api-response';
4
+ import { Logger } from '../common/logger';
5
+ import { MP_VISIT_ID_COOKIE } from '../common/constants';
6
+
7
+ export class GeoLocationProcessor {
8
+ /**
9
+ * Always going to make the call if it's enabled in the sdk, because visit info cookie is passed on to the
10
+ * collector, and it's easier to make changes on the collector end when to make the
11
+ * ip info call or return with an updated cookie expiry
12
+ */
13
+ public static shouldMakeGeoLocationCall(): boolean {
14
+ return DataStore.isGeoLocationEnabledInSdk();
15
+ }
16
+
17
+ public static async makeGeoLocationApiCall(): Promise<GeoResponse | null> {
18
+ try {
19
+ if (!this.shouldMakeGeoLocationCall()) {
20
+ return null;
21
+ }
22
+
23
+ let geoResponse: GeoApiResponse;
24
+ const urlInfo = DataStore.getUrlInfo();
25
+
26
+ // In React Native, we'll get the visit ID from AsyncStorage instead of cookies
27
+ const visitId = await Utils.getValueFromAsyncStorage(
28
+ MP_VISIT_ID_COOKIE,
29
+ ''
30
+ );
31
+ const urlSuffix = `?vid=${visitId}`;
32
+
33
+ // For React Native, we'll try IPv6 first, then fallback to IPv4
34
+ if (
35
+ urlInfo.baseUrlV6 &&
36
+ (await Utils.getValueFromAsyncStorage('_mp_ipv6', 'false')) !== 'n'
37
+ ) {
38
+ try {
39
+ geoResponse = await Utils.getHttp<GeoApiResponse>(
40
+ `${urlInfo.baseUrlV6}${
41
+ urlInfo.geoUrl
42
+ }/n/${Utils.getUniqueID()}${urlSuffix}`
43
+ );
44
+ await Utils.setValueToAsyncStorage('_mp_ipv6', 'y');
45
+ } catch (err) {
46
+ Logger.logDbg('Error posting to ipv6. Posting to ipv4');
47
+ await Utils.setValueToAsyncStorage('_mp_ipv6', 'n');
48
+ geoResponse = await Utils.getHttp<GeoApiResponse>(
49
+ `${urlInfo.baseUrlV4}${
50
+ urlInfo.geoUrl
51
+ }/n/${Utils.getUniqueID()}${urlSuffix}`
52
+ );
53
+ }
54
+ } else {
55
+ // since the async storage said ipv6 failed, we will not try it again. post to ipv4 directly for this session
56
+ geoResponse = await Utils.getHttp<GeoApiResponse>(
57
+ `${urlInfo.baseUrlV4}${
58
+ urlInfo.geoUrl
59
+ }/n/${Utils.getUniqueID()}${urlSuffix}`
60
+ );
61
+ }
62
+
63
+ if (!geoResponse) {
64
+ Logger.logError('Geo API returned empty response');
65
+ return null;
66
+ }
67
+
68
+ if (geoResponse.status === 'KO') {
69
+ Logger.logError('Geo API returned error status');
70
+ return null;
71
+ }
72
+
73
+ if (geoResponse.status === 'OK' && geoResponse.info) {
74
+ // Success scenario
75
+ DataStore.setGeoInfo(geoResponse.info);
76
+ Logger.logDbg(
77
+ 'Geo location info retrieved successfully:',
78
+ geoResponse.info
79
+ );
80
+ return geoResponse.info;
81
+ } else {
82
+ Logger.logError('Geo API returned invalid response format');
83
+ return null;
84
+ }
85
+ } catch (err) {
86
+ Logger.logError('Error fetching geo info:', err);
87
+ }
88
+
89
+ return null;
90
+ }
91
+ }