@magicpixel/rn-mp-client-sdk 0.11.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.
- package/lib/commonjs/common/app-types.js.map +1 -1
- package/lib/commonjs/common/constants.js +5 -26
- package/lib/commonjs/common/constants.js.map +1 -1
- package/lib/commonjs/common/data-store.js +36 -117
- package/lib/commonjs/common/data-store.js.map +1 -1
- package/lib/commonjs/common/event-bus.js +3 -10
- package/lib/commonjs/common/event-bus.js.map +1 -1
- package/lib/commonjs/common/logger.js +22 -14
- package/lib/commonjs/common/logger.js.map +1 -1
- package/lib/commonjs/common/network-service.js +6 -21
- package/lib/commonjs/common/network-service.js.map +1 -1
- package/lib/commonjs/common/reporter.js +8 -31
- package/lib/commonjs/common/reporter.js.map +1 -1
- package/lib/commonjs/common/utils.js +64 -65
- package/lib/commonjs/common/utils.js.map +1 -1
- package/lib/commonjs/coverage/lcov-report/block-navigation.js +6 -19
- package/lib/commonjs/coverage/lcov-report/block-navigation.js.map +1 -1
- package/lib/commonjs/coverage/lcov-report/prettify.js +2 -182
- package/lib/commonjs/coverage/lcov-report/prettify.js.map +1 -1
- package/lib/commonjs/coverage/lcov-report/sorter.js +64 -94
- package/lib/commonjs/coverage/lcov-report/sorter.js.map +1 -1
- package/lib/commonjs/eedl/eedl.js +207 -84
- package/lib/commonjs/eedl/eedl.js.map +1 -1
- package/lib/commonjs/index.js +105 -94
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/geo-api-response.js +2 -0
- package/lib/commonjs/models/geo-api-response.js.map +1 -0
- package/lib/commonjs/models/mp-client-sdk.js +3 -11
- package/lib/commonjs/models/mp-client-sdk.js.map +1 -1
- package/lib/commonjs/processors/data-element.processor.js +85 -80
- package/lib/commonjs/processors/data-element.processor.js.map +1 -1
- package/lib/commonjs/processors/geo-location.processor.js +70 -0
- package/lib/commonjs/processors/geo-location.processor.js.map +1 -0
- package/lib/commonjs/processors/qc.processor.js +2 -25
- package/lib/commonjs/processors/qc.processor.js.map +1 -1
- package/lib/commonjs/processors/tag.processor.js +17 -86
- package/lib/commonjs/processors/tag.processor.js.map +1 -1
- package/lib/commonjs/processors/trans-function.processor.js +5 -23
- package/lib/commonjs/processors/trans-function.processor.js.map +1 -1
- package/lib/commonjs/processors/visit-id.processor.js +4 -50
- package/lib/commonjs/processors/visit-id.processor.js.map +1 -1
- package/lib/module/common/app-types.js.map +1 -1
- package/lib/module/common/constants.js +4 -22
- package/lib/module/common/constants.js.map +1 -1
- package/lib/module/common/data-store.js +35 -108
- package/lib/module/common/data-store.js.map +1 -1
- package/lib/module/common/event-bus.js +3 -6
- package/lib/module/common/event-bus.js.map +1 -1
- package/lib/module/common/logger.js +22 -12
- package/lib/module/common/logger.js.map +1 -1
- package/lib/module/common/network-service.js +6 -11
- package/lib/module/common/network-service.js.map +1 -1
- package/lib/module/common/reporter.js +8 -19
- package/lib/module/common/reporter.js.map +1 -1
- package/lib/module/common/utils.js +63 -56
- package/lib/module/common/utils.js.map +1 -1
- package/lib/module/coverage/lcov-report/block-navigation.js +6 -19
- package/lib/module/coverage/lcov-report/block-navigation.js.map +1 -1
- package/lib/module/coverage/lcov-report/prettify.js +2 -182
- package/lib/module/coverage/lcov-report/prettify.js.map +1 -1
- package/lib/module/coverage/lcov-report/sorter.js +64 -94
- package/lib/module/coverage/lcov-report/sorter.js.map +1 -1
- package/lib/module/eedl/eedl.js +206 -76
- package/lib/module/eedl/eedl.js.map +1 -1
- package/lib/module/index.js +103 -57
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/geo-api-response.js +2 -0
- package/lib/module/models/geo-api-response.js.map +1 -0
- package/lib/module/models/mp-client-sdk.js +0 -5
- package/lib/module/models/mp-client-sdk.js.map +1 -1
- package/lib/module/processors/data-element.processor.js +82 -71
- package/lib/module/processors/data-element.processor.js.map +1 -1
- package/lib/module/processors/geo-location.processor.js +63 -0
- package/lib/module/processors/geo-location.processor.js.map +1 -0
- package/lib/module/processors/qc.processor.js +2 -11
- package/lib/module/processors/qc.processor.js.map +1 -1
- package/lib/module/processors/tag.processor.js +17 -57
- package/lib/module/processors/tag.processor.js.map +1 -1
- package/lib/module/processors/trans-function.processor.js +5 -12
- package/lib/module/processors/trans-function.processor.js.map +1 -1
- package/lib/module/processors/visit-id.processor.js +4 -27
- package/lib/module/processors/visit-id.processor.js.map +1 -1
- package/lib/typescript/common/app-types.d.ts +4 -0
- package/lib/typescript/common/constants.d.ts +1 -0
- package/lib/typescript/common/data-store.d.ts +8 -0
- package/lib/typescript/common/logger.d.ts +5 -0
- package/lib/typescript/common/utils.d.ts +19 -0
- package/lib/typescript/eedl/eedl.d.ts +16 -5
- package/lib/typescript/index.d.ts +53 -0
- package/lib/typescript/models/geo-api-response.d.ts +12 -0
- package/lib/typescript/processors/data-element.processor.d.ts +10 -1
- package/lib/typescript/processors/geo-location.processor.d.ts +10 -0
- package/package.json +25 -10
- package/src/common/app-types.ts +4 -0
- package/src/common/constants.ts +2 -0
- package/src/common/data-store.ts +38 -0
- package/src/common/logger.ts +19 -3
- package/src/common/network-service.ts +2 -0
- package/src/common/utils.ts +58 -0
- package/src/eedl/eedl.ts +241 -18
- package/src/index.tsx +99 -3
- package/src/models/geo-api-response.ts +13 -0
- package/src/processors/data-element.processor.ts +140 -70
- 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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
+
}
|