@cxpinsight/react-native 0.2.0
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/LICENSE +21 -0
- package/README.md +131 -0
- package/babel.js +101 -0
- package/instrumented/Pressable.d.ts +2 -0
- package/instrumented/Pressable.js +2 -0
- package/instrumented/ScrollView.d.ts +2 -0
- package/instrumented/ScrollView.js +2 -0
- package/instrumented/TextInput.d.ts +2 -0
- package/instrumented/TextInput.js +2 -0
- package/instrumented/TouchableOpacity.d.ts +2 -0
- package/instrumented/TouchableOpacity.js +2 -0
- package/lib/CXPinsight.d.ts +113 -0
- package/lib/CXPinsight.d.ts.map +1 -0
- package/lib/CXPinsight.js +831 -0
- package/lib/CXPinsight.js.map +1 -0
- package/lib/CXPinsightProvider.d.ts +19 -0
- package/lib/CXPinsightProvider.d.ts.map +1 -0
- package/lib/CXPinsightProvider.js +382 -0
- package/lib/CXPinsightProvider.js.map +1 -0
- package/lib/core/autoScreenTracker.d.ts +20 -0
- package/lib/core/autoScreenTracker.d.ts.map +1 -0
- package/lib/core/autoScreenTracker.js +66 -0
- package/lib/core/autoScreenTracker.js.map +1 -0
- package/lib/core/deepLinkTracker.d.ts +17 -0
- package/lib/core/deepLinkTracker.d.ts.map +1 -0
- package/lib/core/deepLinkTracker.js +81 -0
- package/lib/core/deepLinkTracker.js.map +1 -0
- package/lib/core/deviceInfo.d.ts +14 -0
- package/lib/core/deviceInfo.d.ts.map +1 -0
- package/lib/core/deviceInfo.js +166 -0
- package/lib/core/deviceInfo.js.map +1 -0
- package/lib/core/eventQueue.d.ts +23 -0
- package/lib/core/eventQueue.d.ts.map +1 -0
- package/lib/core/eventQueue.js +240 -0
- package/lib/core/eventQueue.js.map +1 -0
- package/lib/core/lifecycle.d.ts +18 -0
- package/lib/core/lifecycle.d.ts.map +1 -0
- package/lib/core/lifecycle.js +127 -0
- package/lib/core/lifecycle.js.map +1 -0
- package/lib/core/mobileRecorder.d.ts +15 -0
- package/lib/core/mobileRecorder.d.ts.map +1 -0
- package/lib/core/mobileRecorder.js +231 -0
- package/lib/core/mobileRecorder.js.map +1 -0
- package/lib/core/network.d.ts +10 -0
- package/lib/core/network.d.ts.map +1 -0
- package/lib/core/network.js +74 -0
- package/lib/core/network.js.map +1 -0
- package/lib/core/networkCapture.d.ts +22 -0
- package/lib/core/networkCapture.d.ts.map +1 -0
- package/lib/core/networkCapture.js +100 -0
- package/lib/core/networkCapture.js.map +1 -0
- package/lib/core/scrollCapture.d.ts +48 -0
- package/lib/core/scrollCapture.d.ts.map +1 -0
- package/lib/core/scrollCapture.js +221 -0
- package/lib/core/scrollCapture.js.map +1 -0
- package/lib/core/session.d.ts +15 -0
- package/lib/core/session.d.ts.map +1 -0
- package/lib/core/session.js +157 -0
- package/lib/core/session.js.map +1 -0
- package/lib/core/storage.d.ts +11 -0
- package/lib/core/storage.d.ts.map +1 -0
- package/lib/core/storage.js +59 -0
- package/lib/core/storage.js.map +1 -0
- package/lib/core/triggerEngine.d.ts +56 -0
- package/lib/core/triggerEngine.d.ts.map +1 -0
- package/lib/core/triggerEngine.js +432 -0
- package/lib/core/triggerEngine.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/instrumented/Pressable.d.ts +9 -0
- package/lib/instrumented/Pressable.d.ts.map +1 -0
- package/lib/instrumented/Pressable.js +96 -0
- package/lib/instrumented/Pressable.js.map +1 -0
- package/lib/instrumented/ScrollView.d.ts +6 -0
- package/lib/instrumented/ScrollView.d.ts.map +1 -0
- package/lib/instrumented/ScrollView.js +101 -0
- package/lib/instrumented/ScrollView.js.map +1 -0
- package/lib/instrumented/TextInput.d.ts +9 -0
- package/lib/instrumented/TextInput.d.ts.map +1 -0
- package/lib/instrumented/TextInput.js +75 -0
- package/lib/instrumented/TextInput.js.map +1 -0
- package/lib/instrumented/TouchableOpacity.d.ts +11 -0
- package/lib/instrumented/TouchableOpacity.d.ts.map +1 -0
- package/lib/instrumented/TouchableOpacity.js +96 -0
- package/lib/instrumented/TouchableOpacity.js.map +1 -0
- package/lib/instrumented/index.d.ts +19 -0
- package/lib/instrumented/index.d.ts.map +1 -0
- package/lib/instrumented/index.js +28 -0
- package/lib/instrumented/index.js.map +1 -0
- package/lib/instrumented/interactionObserver.d.ts +29 -0
- package/lib/instrumented/interactionObserver.d.ts.map +1 -0
- package/lib/instrumented/interactionObserver.js +38 -0
- package/lib/instrumented/interactionObserver.js.map +1 -0
- package/lib/setup/AccessibilityScanner.d.ts +32 -0
- package/lib/setup/AccessibilityScanner.d.ts.map +1 -0
- package/lib/setup/AccessibilityScanner.js +127 -0
- package/lib/setup/AccessibilityScanner.js.map +1 -0
- package/lib/setup/ElementIdentifier.d.ts +65 -0
- package/lib/setup/ElementIdentifier.d.ts.map +1 -0
- package/lib/setup/ElementIdentifier.js +114 -0
- package/lib/setup/ElementIdentifier.js.map +1 -0
- package/lib/setup/ElementRegistry.d.ts +22 -0
- package/lib/setup/ElementRegistry.d.ts.map +1 -0
- package/lib/setup/ElementRegistry.js +47 -0
- package/lib/setup/ElementRegistry.js.map +1 -0
- package/lib/setup/SetupCodeEntry.d.ts +15 -0
- package/lib/setup/SetupCodeEntry.d.ts.map +1 -0
- package/lib/setup/SetupCodeEntry.js +198 -0
- package/lib/setup/SetupCodeEntry.js.map +1 -0
- package/lib/setup/SetupController.d.ts +29 -0
- package/lib/setup/SetupController.d.ts.map +1 -0
- package/lib/setup/SetupController.js +189 -0
- package/lib/setup/SetupController.js.map +1 -0
- package/lib/setup/SetupOverlay.d.ts +10 -0
- package/lib/setup/SetupOverlay.d.ts.map +1 -0
- package/lib/setup/SetupOverlay.js +408 -0
- package/lib/setup/SetupOverlay.js.map +1 -0
- package/lib/setup/TapInterceptor.d.ts +19 -0
- package/lib/setup/TapInterceptor.d.ts.map +1 -0
- package/lib/setup/TapInterceptor.js +98 -0
- package/lib/setup/TapInterceptor.js.map +1 -0
- package/lib/setup/TouchObserver.d.ts +25 -0
- package/lib/setup/TouchObserver.d.ts.map +1 -0
- package/lib/setup/TouchObserver.js +88 -0
- package/lib/setup/TouchObserver.js.map +1 -0
- package/lib/setup/TouchPatcher.d.ts +27 -0
- package/lib/setup/TouchPatcher.d.ts.map +1 -0
- package/lib/setup/TouchPatcher.js +182 -0
- package/lib/setup/TouchPatcher.js.map +1 -0
- package/lib/setup/index.d.ts +13 -0
- package/lib/setup/index.d.ts.map +1 -0
- package/lib/setup/index.js +45 -0
- package/lib/setup/index.js.map +1 -0
- package/lib/setup/useCXPElement.d.ts +25 -0
- package/lib/setup/useCXPElement.d.ts.map +1 -0
- package/lib/setup/useCXPElement.js +33 -0
- package/lib/setup/useCXPElement.js.map +1 -0
- package/lib/survey/SurveyModal.d.ts +10 -0
- package/lib/survey/SurveyModal.d.ts.map +1 -0
- package/lib/survey/SurveyModal.js +1650 -0
- package/lib/survey/SurveyModal.js.map +1 -0
- package/lib/survey/expressionEval.d.ts +10 -0
- package/lib/survey/expressionEval.d.ts.map +1 -0
- package/lib/survey/expressionEval.js +287 -0
- package/lib/survey/expressionEval.js.map +1 -0
- package/lib/survey/frequencyCap.d.ts +15 -0
- package/lib/survey/frequencyCap.d.ts.map +1 -0
- package/lib/survey/frequencyCap.js +116 -0
- package/lib/survey/frequencyCap.js.map +1 -0
- package/lib/survey/handsFreeVoice.d.ts +30 -0
- package/lib/survey/handsFreeVoice.d.ts.map +1 -0
- package/lib/survey/handsFreeVoice.js +312 -0
- package/lib/survey/handsFreeVoice.js.map +1 -0
- package/lib/survey/interpolate.d.ts +6 -0
- package/lib/survey/interpolate.d.ts.map +1 -0
- package/lib/survey/interpolate.js +61 -0
- package/lib/survey/interpolate.js.map +1 -0
- package/lib/survey/pagesFromV1.d.ts +6 -0
- package/lib/survey/pagesFromV1.d.ts.map +1 -0
- package/lib/survey/pagesFromV1.js +83 -0
- package/lib/survey/pagesFromV1.js.map +1 -0
- package/lib/survey/questions/CSATQuestion.d.ts +16 -0
- package/lib/survey/questions/CSATQuestion.d.ts.map +1 -0
- package/lib/survey/questions/CSATQuestion.js +37 -0
- package/lib/survey/questions/CSATQuestion.js.map +1 -0
- package/lib/survey/questions/DateQuestion.d.ts +20 -0
- package/lib/survey/questions/DateQuestion.d.ts.map +1 -0
- package/lib/survey/questions/DateQuestion.js +103 -0
- package/lib/survey/questions/DateQuestion.js.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts +33 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.js +68 -0
- package/lib/survey/questions/ImagePickerQuestion.js.map +1 -0
- package/lib/survey/questions/ImageQuestion.d.ts +26 -0
- package/lib/survey/questions/ImageQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImageQuestion.js +24 -0
- package/lib/survey/questions/ImageQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixCell.d.ts +45 -0
- package/lib/survey/questions/MatrixCell.d.ts.map +1 -0
- package/lib/survey/questions/MatrixCell.js +54 -0
- package/lib/survey/questions/MatrixCell.js.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts +29 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js +42 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts +26 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js +52 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixQuestion.d.ts +38 -0
- package/lib/survey/questions/MatrixQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixQuestion.js +64 -0
- package/lib/survey/questions/MatrixQuestion.js.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts +19 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.js +64 -0
- package/lib/survey/questions/MultiTextQuestion.js.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts +25 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js +111 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js.map +1 -0
- package/lib/survey/questions/NPSQuestion.d.ts +18 -0
- package/lib/survey/questions/NPSQuestion.d.ts.map +1 -0
- package/lib/survey/questions/NPSQuestion.js +62 -0
- package/lib/survey/questions/NPSQuestion.js.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts +50 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.js +62 -0
- package/lib/survey/questions/PanelDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/RankingQuestion.d.ts +34 -0
- package/lib/survey/questions/RankingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RankingQuestion.js +85 -0
- package/lib/survey/questions/RankingQuestion.js.map +1 -0
- package/lib/survey/questions/RatingQuestion.d.ts +20 -0
- package/lib/survey/questions/RatingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RatingQuestion.js +53 -0
- package/lib/survey/questions/RatingQuestion.js.map +1 -0
- package/lib/survey/questions/TextQuestion.d.ts +17 -0
- package/lib/survey/questions/TextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/TextQuestion.js +46 -0
- package/lib/survey/questions/TextQuestion.js.map +1 -0
- package/lib/survey/styleContract.d.ts +230 -0
- package/lib/survey/styleContract.d.ts.map +1 -0
- package/lib/survey/styleContract.js +365 -0
- package/lib/survey/styleContract.js.map +1 -0
- package/lib/survey/themePalette.d.ts +56 -0
- package/lib/survey/themePalette.d.ts.map +1 -0
- package/lib/survey/themePalette.js +63 -0
- package/lib/survey/themePalette.js.map +1 -0
- package/lib/survey/translationLookup.d.ts +4 -0
- package/lib/survey/translationLookup.d.ts.map +1 -0
- package/lib/survey/translationLookup.js +62 -0
- package/lib/survey/translationLookup.js.map +1 -0
- package/lib/survey/validate.d.ts +3 -0
- package/lib/survey/validate.d.ts.map +1 -0
- package/lib/survey/validate.js +159 -0
- package/lib/survey/validate.js.map +1 -0
- package/lib/survey/variablesResolver.d.ts +10 -0
- package/lib/survey/variablesResolver.d.ts.map +1 -0
- package/lib/survey/variablesResolver.js +107 -0
- package/lib/survey/variablesResolver.js.map +1 -0
- package/lib/survey/voiceParsers.d.ts +47 -0
- package/lib/survey/voiceParsers.d.ts.map +1 -0
- package/lib/survey/voiceParsers.js +310 -0
- package/lib/survey/voiceParsers.js.map +1 -0
- package/lib/types.d.ts +349 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +20 -0
- package/lib/types.js.map +1 -0
- package/metro.js +55 -0
- package/package.json +78 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startDeepLinkTracking = startDeepLinkTracking;
|
|
4
|
+
exports.stopDeepLinkTracking = stopDeepLinkTracking;
|
|
5
|
+
exports.parseDeepLink = parseDeepLink;
|
|
6
|
+
const react_native_1 = require("react-native");
|
|
7
|
+
let callback = null;
|
|
8
|
+
let subscription = null;
|
|
9
|
+
let debugMode = false;
|
|
10
|
+
function log(...args) {
|
|
11
|
+
if (debugMode)
|
|
12
|
+
console.log('[CXPinsight:DeepLink]', ...args);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Start tracking deep links (URL scheme + universal links).
|
|
16
|
+
* Checks the initial URL (cold start) and listens for incoming URLs (foreground).
|
|
17
|
+
*/
|
|
18
|
+
async function startDeepLinkTracking(onDeepLink, debug) {
|
|
19
|
+
debugMode = debug ?? false;
|
|
20
|
+
callback = onDeepLink;
|
|
21
|
+
// Check if app was opened via deep link (cold start)
|
|
22
|
+
try {
|
|
23
|
+
const initialUrl = await react_native_1.Linking.getInitialURL();
|
|
24
|
+
if (initialUrl) {
|
|
25
|
+
log('Cold start deep link:', initialUrl);
|
|
26
|
+
callback(initialUrl, 'cold_start');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
log('Failed to get initial URL:', err);
|
|
31
|
+
}
|
|
32
|
+
// Listen for deep links while app is running (foreground)
|
|
33
|
+
subscription?.remove();
|
|
34
|
+
subscription = react_native_1.Linking.addEventListener('url', (event) => {
|
|
35
|
+
if (event.url && callback) {
|
|
36
|
+
log('Foreground deep link:', event.url);
|
|
37
|
+
callback(event.url, 'foreground');
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Stop tracking deep links */
|
|
42
|
+
function stopDeepLinkTracking() {
|
|
43
|
+
subscription?.remove();
|
|
44
|
+
subscription = null;
|
|
45
|
+
callback = null;
|
|
46
|
+
}
|
|
47
|
+
/** Parse a deep link URL into components */
|
|
48
|
+
function parseDeepLink(url) {
|
|
49
|
+
try {
|
|
50
|
+
const parsed = new URL(url);
|
|
51
|
+
const params = {};
|
|
52
|
+
parsed.searchParams.forEach((value, key) => {
|
|
53
|
+
params[key] = value;
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
scheme: parsed.protocol.replace(':', ''),
|
|
57
|
+
host: parsed.host,
|
|
58
|
+
path: parsed.pathname,
|
|
59
|
+
params,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Fallback for custom schemes like myapp://path
|
|
64
|
+
const schemeMatch = url.match(/^([^:]+):\/\/(.*)$/);
|
|
65
|
+
if (schemeMatch) {
|
|
66
|
+
const [, scheme, rest] = schemeMatch;
|
|
67
|
+
const [pathPart, queryPart] = rest.split('?');
|
|
68
|
+
const params = {};
|
|
69
|
+
if (queryPart) {
|
|
70
|
+
queryPart.split('&').forEach(pair => {
|
|
71
|
+
const [key, value] = pair.split('=');
|
|
72
|
+
if (key)
|
|
73
|
+
params[decodeURIComponent(key)] = decodeURIComponent(value || '');
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return { scheme, host: '', path: pathPart, params };
|
|
77
|
+
}
|
|
78
|
+
return { scheme: '', host: '', path: url, params: {} };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=deepLinkTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepLinkTracker.js","sourceRoot":"","sources":["../../src/core/deepLinkTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DeviceInfo } from '../types';
|
|
2
|
+
type PaletteMap = {
|
|
3
|
+
light?: Record<string, string>;
|
|
4
|
+
dark?: Record<string, string>;
|
|
5
|
+
};
|
|
6
|
+
export declare function setDeviceTheme(theme?: string): void;
|
|
7
|
+
export declare function setDeviceBrandingPalette(pal?: PaletteMap, primary?: string): void;
|
|
8
|
+
/** Collect device info from React Native APIs */
|
|
9
|
+
export declare function getDeviceInfo(): DeviceInfo;
|
|
10
|
+
export declare function canonicalDeviceContext(info: DeviceInfo): Record<string, unknown>;
|
|
11
|
+
/** Clear cached info (useful on orientation change or reset) */
|
|
12
|
+
export declare function clearDeviceInfoCache(): void;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=deviceInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceInfo.d.ts","sourceRoot":"","sources":["../../src/core/deviceInfo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,KAAK,UAAU,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAMpF,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAGnD;AAOD,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAIjF;AAED,iDAAiD;AACjD,wBAAgB,aAAa,IAAI,UAAU,CAiF1C;AAQD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAahF;AAoBD,gEAAgE;AAChE,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setDeviceTheme = setDeviceTheme;
|
|
4
|
+
exports.setDeviceBrandingPalette = setDeviceBrandingPalette;
|
|
5
|
+
exports.getDeviceInfo = getDeviceInfo;
|
|
6
|
+
exports.canonicalDeviceContext = canonicalDeviceContext;
|
|
7
|
+
exports.clearDeviceInfoCache = clearDeviceInfoCache;
|
|
8
|
+
const react_native_1 = require("react-native");
|
|
9
|
+
let cachedInfo = null;
|
|
10
|
+
// Host user's theme preference, supplied via CXPinsight.init({ theme }). Reported
|
|
11
|
+
// as deviceInfo.theme → device.theme on the server. Set once at init.
|
|
12
|
+
let configuredTheme;
|
|
13
|
+
function setDeviceTheme(theme) {
|
|
14
|
+
configuredTheme = theme || undefined;
|
|
15
|
+
if (cachedInfo)
|
|
16
|
+
cachedInfo.theme = configuredTheme;
|
|
17
|
+
}
|
|
18
|
+
// The app's palette, supplied via CXPinsight.init({ brandingPalette: { light, dark } }).
|
|
19
|
+
// Reported (resolved to the current theme mode) as deviceInfo.themePalette so the
|
|
20
|
+
// dashboard's "Themes reported by SDK" panel can show real colours per (platform, theme).
|
|
21
|
+
let configuredBrandingPalette;
|
|
22
|
+
let configuredPrimary; // app's accent/brand colour
|
|
23
|
+
function setDeviceBrandingPalette(pal, primary) {
|
|
24
|
+
configuredBrandingPalette = pal || undefined;
|
|
25
|
+
configuredPrimary = (primary && /^#[0-9a-f]{3,8}$/i.test(primary)) ? primary : undefined;
|
|
26
|
+
cachedInfo = null; // recompute so themePalette refreshes
|
|
27
|
+
}
|
|
28
|
+
/** Collect device info from React Native APIs */
|
|
29
|
+
function getDeviceInfo() {
|
|
30
|
+
if (cachedInfo)
|
|
31
|
+
return cachedInfo;
|
|
32
|
+
const { width, height } = react_native_1.Dimensions.get('window');
|
|
33
|
+
const osName = react_native_1.Platform.OS === 'ios' ? 'iOS' : react_native_1.Platform.OS === 'android' ? 'Android' : react_native_1.Platform.OS;
|
|
34
|
+
const osVersion = typeof react_native_1.Platform.Version === 'number' ? String(react_native_1.Platform.Version) : react_native_1.Platform.Version;
|
|
35
|
+
// Attempt to read app version from expo-constants or expo-application if available
|
|
36
|
+
let appVersion = '1.0.0';
|
|
37
|
+
try {
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
39
|
+
const Constants = require('expo-constants').default;
|
|
40
|
+
appVersion = Constants.expoConfig?.version ?? Constants.manifest?.version ?? '1.0.0';
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Not available — use fallback
|
|
44
|
+
}
|
|
45
|
+
let language = 'en-US';
|
|
46
|
+
try {
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
48
|
+
const { getLocales } = require('expo-localization');
|
|
49
|
+
const locales = getLocales();
|
|
50
|
+
if (locales?.[0]?.languageTag) {
|
|
51
|
+
language = locales[0].languageTag;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Fallback — expo-localization not installed
|
|
56
|
+
if (react_native_1.Platform.OS === 'ios') {
|
|
57
|
+
// @ts-expect-error — RN internal
|
|
58
|
+
const settings = react_native_1.Platform.constants?.settings;
|
|
59
|
+
if (settings?.AppleLanguages?.[0]) {
|
|
60
|
+
language = settings.AppleLanguages[0];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// IANA timezone — same key/format as the web SDK's deviceInfo.timezone, so a
|
|
65
|
+
// `device.timezone` targeting condition resolves on both channels. RN Hermes
|
|
66
|
+
// ships Intl; guard for engines/builds without it.
|
|
67
|
+
let timezone;
|
|
68
|
+
try {
|
|
69
|
+
timezone = Intl?.DateTimeFormat?.().resolvedOptions?.().timeZone || undefined;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
timezone = undefined;
|
|
73
|
+
}
|
|
74
|
+
// Resolve the app's palette for the current theme mode (+ accent), if the host
|
|
75
|
+
// passed either. Accent (primaryColor) is folded in under the `accent` key.
|
|
76
|
+
let themePalette;
|
|
77
|
+
if (configuredBrandingPalette || configuredPrimary) {
|
|
78
|
+
let mode = 'light';
|
|
79
|
+
const t = (configuredTheme || '').toLowerCase();
|
|
80
|
+
if (t === 'light' || t === 'dark')
|
|
81
|
+
mode = t;
|
|
82
|
+
else {
|
|
83
|
+
try {
|
|
84
|
+
mode = react_native_1.Appearance.getColorScheme() === 'dark' ? 'dark' : 'light';
|
|
85
|
+
}
|
|
86
|
+
catch { /* default light */ }
|
|
87
|
+
}
|
|
88
|
+
const surfaces = configuredBrandingPalette
|
|
89
|
+
? (configuredBrandingPalette[mode] || configuredBrandingPalette.light || configuredBrandingPalette.dark || {})
|
|
90
|
+
: {};
|
|
91
|
+
const merged = { ...surfaces };
|
|
92
|
+
if (configuredPrimary)
|
|
93
|
+
merged.accent = configuredPrimary;
|
|
94
|
+
themePalette = Object.keys(merged).length ? merged : undefined;
|
|
95
|
+
}
|
|
96
|
+
const extras = deviceExtras();
|
|
97
|
+
cachedInfo = {
|
|
98
|
+
platform: 'mobile',
|
|
99
|
+
os: osName, // canonical key (matches web deviceInfo)
|
|
100
|
+
osVersion,
|
|
101
|
+
deviceType: extras.deviceType, // canonical: 'mobile' | 'tablet' | ...
|
|
102
|
+
// Object {width,height} to match web + the Event.deviceInfo schema (a string here
|
|
103
|
+
// causes a Mongoose CastError → the event is rejected).
|
|
104
|
+
screenResolution: { width: Math.round(width), height: Math.round(height) },
|
|
105
|
+
language,
|
|
106
|
+
timezone,
|
|
107
|
+
appVersion,
|
|
108
|
+
deviceModel: extras.deviceModel,
|
|
109
|
+
manufacturer: extras.manufacturer,
|
|
110
|
+
theme: configuredTheme, // host user's theme preference → device.theme
|
|
111
|
+
themePalette, // app's colours for the current theme → reported-themes panel
|
|
112
|
+
};
|
|
113
|
+
return cachedInfo;
|
|
114
|
+
}
|
|
115
|
+
// Raw deviceInfo → the canonical namespaced `device.*` values used for targeting.
|
|
116
|
+
// The wire payload keeps raw keys (deviceType/deviceModel/manufacturer) — the server
|
|
117
|
+
// remaps them — but the CLIENT-side targeting context must produce the SAME keys the
|
|
118
|
+
// server does, or a condition matches in one tier and misses in the other. Keep this
|
|
119
|
+
// mapping in lockstep with the server's eventAttributes() dmap in
|
|
120
|
+
// services/engagement/src/lib/eventSignature.js.
|
|
121
|
+
function canonicalDeviceContext(info) {
|
|
122
|
+
const out = {};
|
|
123
|
+
if (info.os)
|
|
124
|
+
out.os = info.os;
|
|
125
|
+
if (info.osVersion)
|
|
126
|
+
out.osVersion = info.osVersion;
|
|
127
|
+
if (info.deviceType)
|
|
128
|
+
out.type = String(info.deviceType).toLowerCase(); // → device.type
|
|
129
|
+
out.platform = info.platform ? String(info.platform).toLowerCase() : 'mobile'; // → device.platform
|
|
130
|
+
if (info.language)
|
|
131
|
+
out.language = String(info.language).toLowerCase();
|
|
132
|
+
if (info.timezone)
|
|
133
|
+
out.timezone = info.timezone;
|
|
134
|
+
if (info.deviceModel)
|
|
135
|
+
out.model = info.deviceModel; // → device.model
|
|
136
|
+
if (info.manufacturer)
|
|
137
|
+
out.brand = info.manufacturer; // → device.brand
|
|
138
|
+
if (info.appVersion)
|
|
139
|
+
out.appVersion = info.appVersion;
|
|
140
|
+
if (info.theme)
|
|
141
|
+
out.theme = String(info.theme); // → device.theme
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/** Device model + type (best-effort via expo-device if the app installed it). */
|
|
145
|
+
function deviceExtras() {
|
|
146
|
+
try {
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
148
|
+
const Device = require('expo-device');
|
|
149
|
+
// expo-device DeviceType enum: 1 phone, 2 tablet, 3 desktop, 4 tv. Map to the
|
|
150
|
+
// canonical Device.deviceType values ('mobile' | 'tablet' | 'desktop' | 'tv').
|
|
151
|
+
const dt = Device.deviceType;
|
|
152
|
+
return {
|
|
153
|
+
deviceModel: Device.modelName || undefined,
|
|
154
|
+
manufacturer: Device.manufacturer || undefined,
|
|
155
|
+
deviceType: dt === 1 ? 'mobile' : dt === 2 ? 'tablet' : dt === 3 ? 'desktop' : dt === 4 ? 'tv' : 'mobile',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return { deviceType: 'mobile' }; // expo-device not installed — sensible default
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** Clear cached info (useful on orientation change or reset) */
|
|
163
|
+
function clearDeviceInfoCache() {
|
|
164
|
+
cachedInfo = null;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=deviceInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceInfo.js","sourceRoot":"","sources":["../../src/core/deviceInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { TrackEvent } from '../types';
|
|
2
|
+
/** Start the event queue with optional config */
|
|
3
|
+
export declare function startQueue(options?: {
|
|
4
|
+
flushInterval?: number;
|
|
5
|
+
flushThreshold?: number;
|
|
6
|
+
debug?: boolean;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
/** Enqueue an event */
|
|
9
|
+
export declare function enqueue(event: TrackEvent): void;
|
|
10
|
+
/** Flush queued events to the server. */
|
|
11
|
+
export declare function flush(): Promise<void>;
|
|
12
|
+
/** Stop the queue and clean up */
|
|
13
|
+
export declare function stopQueue(): Promise<void>;
|
|
14
|
+
/** Clear queue without flushing */
|
|
15
|
+
export declare function clearQueue(): Promise<void>;
|
|
16
|
+
/** Queue diagnostics — used by tests and the debug command. */
|
|
17
|
+
export declare function queueStats(): {
|
|
18
|
+
pending: number;
|
|
19
|
+
dropped: number;
|
|
20
|
+
consecutiveFailures: number;
|
|
21
|
+
backingOffFor: number;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=eventQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventQueue.d.ts","sourceRoot":"","sources":["../../src/core/eventQueue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAsE3C,iDAAiD;AACjD,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhB;AAeD,uBAAuB;AACvB,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAY/C;AAED,yCAAyC;AACzC,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA+C3C;AAED,kCAAkC;AAClC,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAU/C;AAED,mCAAmC;AACnC,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAShD;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,IAAI;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB,CAOA"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startQueue = startQueue;
|
|
37
|
+
exports.enqueue = enqueue;
|
|
38
|
+
exports.flush = flush;
|
|
39
|
+
exports.stopQueue = stopQueue;
|
|
40
|
+
exports.clearQueue = clearQueue;
|
|
41
|
+
exports.queueStats = queueStats;
|
|
42
|
+
const react_native_1 = require("react-native");
|
|
43
|
+
const types_1 = require("../types");
|
|
44
|
+
const storage = __importStar(require("./storage"));
|
|
45
|
+
const network_1 = require("./network");
|
|
46
|
+
const DEFAULT_FLUSH_INTERVAL = 30000; // 30s
|
|
47
|
+
const DEFAULT_FLUSH_THRESHOLD = 10;
|
|
48
|
+
const MAX_BATCH_SIZE = 100;
|
|
49
|
+
// Upper bound on the backlog. MAX_BATCH_SIZE caps how many events go out in one
|
|
50
|
+
// request; it does NOT cap how many pile up. Without this a long offline stretch
|
|
51
|
+
// grows the queue until AsyncStorage or memory gives out — and every enqueue
|
|
52
|
+
// re-serializes the whole thing, so the cost is quadratic on the way there.
|
|
53
|
+
const MAX_QUEUE_SIZE = 1000;
|
|
54
|
+
// Retry backoff. On failure the batch goes back on the queue, and the previous
|
|
55
|
+
// implementation immediately called flush() again whenever the queue was at or
|
|
56
|
+
// above the threshold — a tight recursive loop against a dead network that
|
|
57
|
+
// drained the battery and the radio until the app was backgrounded.
|
|
58
|
+
const RETRY_BASE_MS = 1000;
|
|
59
|
+
const RETRY_MAX_MS = 5 * 60000; // 5 min ceiling
|
|
60
|
+
// Writing the entire queue to AsyncStorage on every single event is O(n) per
|
|
61
|
+
// event and hits the bridge each time. Coalesce writes into a short window
|
|
62
|
+
// instead. Durability is preserved where it actually matters: the AppState
|
|
63
|
+
// handler persists synchronously when the app leaves the foreground, which is
|
|
64
|
+
// how a session normally ends. The exposure is events from the last <500ms
|
|
65
|
+
// before an outright process kill from the foreground.
|
|
66
|
+
const PERSIST_DEBOUNCE_MS = 500;
|
|
67
|
+
let queue = [];
|
|
68
|
+
let flushTimer = null;
|
|
69
|
+
let persistTimer = null;
|
|
70
|
+
let flushThreshold = DEFAULT_FLUSH_THRESHOLD;
|
|
71
|
+
let isFlushing = false;
|
|
72
|
+
let appStateSubscription = null;
|
|
73
|
+
let debugMode = false;
|
|
74
|
+
// Backoff state
|
|
75
|
+
let consecutiveFailures = 0;
|
|
76
|
+
let nextRetryAt = 0;
|
|
77
|
+
let droppedCount = 0;
|
|
78
|
+
function log(...args) {
|
|
79
|
+
if (debugMode)
|
|
80
|
+
console.log('[CXPinsight:Queue]', ...args);
|
|
81
|
+
}
|
|
82
|
+
/** Full-jitter exponential backoff, bounded. */
|
|
83
|
+
function backoffDelay(failures) {
|
|
84
|
+
const ceiling = Math.min(RETRY_BASE_MS * 2 ** (failures - 1), RETRY_MAX_MS);
|
|
85
|
+
return Math.random() * ceiling;
|
|
86
|
+
}
|
|
87
|
+
function schedulePersist() {
|
|
88
|
+
if (persistTimer)
|
|
89
|
+
return;
|
|
90
|
+
persistTimer = setTimeout(() => {
|
|
91
|
+
persistTimer = null;
|
|
92
|
+
void storage.set(types_1.STORAGE_KEYS.EVENT_QUEUE, queue);
|
|
93
|
+
}, PERSIST_DEBOUNCE_MS);
|
|
94
|
+
}
|
|
95
|
+
/** Write the queue out now, cancelling any pending debounced write. */
|
|
96
|
+
async function persistNow() {
|
|
97
|
+
if (persistTimer) {
|
|
98
|
+
clearTimeout(persistTimer);
|
|
99
|
+
persistTimer = null;
|
|
100
|
+
}
|
|
101
|
+
await storage.set(types_1.STORAGE_KEYS.EVENT_QUEUE, queue);
|
|
102
|
+
}
|
|
103
|
+
/** Start the event queue with optional config */
|
|
104
|
+
async function startQueue(options) {
|
|
105
|
+
debugMode = options?.debug ?? false;
|
|
106
|
+
flushThreshold = options?.flushThreshold ?? DEFAULT_FLUSH_THRESHOLD;
|
|
107
|
+
const interval = options?.flushInterval ?? DEFAULT_FLUSH_INTERVAL;
|
|
108
|
+
// Restore any persisted events from a previous session
|
|
109
|
+
const persisted = await storage.get(types_1.STORAGE_KEYS.EVENT_QUEUE);
|
|
110
|
+
if (persisted?.length) {
|
|
111
|
+
queue.push(...persisted);
|
|
112
|
+
trimToCap();
|
|
113
|
+
log(`Restored ${persisted.length} events from storage`);
|
|
114
|
+
}
|
|
115
|
+
consecutiveFailures = 0;
|
|
116
|
+
nextRetryAt = 0;
|
|
117
|
+
// Periodic flush
|
|
118
|
+
stopTimer();
|
|
119
|
+
flushTimer = setInterval(() => void flush(), interval);
|
|
120
|
+
// Flush on background
|
|
121
|
+
appStateSubscription?.remove();
|
|
122
|
+
appStateSubscription = react_native_1.AppState.addEventListener('change', handleAppState);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Drop from the FRONT when over the cap. The newest events are the ones a
|
|
126
|
+
* respondent's current session depends on (triggers, targeting, the survey they
|
|
127
|
+
* are about to be shown), so an old backlog is what gives way.
|
|
128
|
+
*/
|
|
129
|
+
function trimToCap() {
|
|
130
|
+
if (queue.length <= MAX_QUEUE_SIZE)
|
|
131
|
+
return;
|
|
132
|
+
const overflow = queue.length - MAX_QUEUE_SIZE;
|
|
133
|
+
queue.splice(0, overflow);
|
|
134
|
+
droppedCount += overflow;
|
|
135
|
+
log(`Queue over ${MAX_QUEUE_SIZE} — dropped ${overflow} oldest (${droppedCount} total)`);
|
|
136
|
+
}
|
|
137
|
+
/** Enqueue an event */
|
|
138
|
+
function enqueue(event) {
|
|
139
|
+
queue.push(event);
|
|
140
|
+
trimToCap();
|
|
141
|
+
log(`Enqueued: ${event.eventName} (${queue.length} pending)`);
|
|
142
|
+
schedulePersist();
|
|
143
|
+
// Auto-flush at the threshold — but never while backing off, or the threshold
|
|
144
|
+
// itself becomes the retry loop.
|
|
145
|
+
if (queue.length >= flushThreshold && Date.now() >= nextRetryAt) {
|
|
146
|
+
void flush();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Flush queued events to the server. */
|
|
150
|
+
async function flush() {
|
|
151
|
+
if (isFlushing || queue.length === 0)
|
|
152
|
+
return;
|
|
153
|
+
if (Date.now() < nextRetryAt) {
|
|
154
|
+
log(`Backing off — next attempt in ${Math.round((nextRetryAt - Date.now()) / 1000)}s`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
isFlushing = true;
|
|
158
|
+
const eventsToSend = queue.splice(0, MAX_BATCH_SIZE);
|
|
159
|
+
log(`Flushing ${eventsToSend.length} events`);
|
|
160
|
+
let ok = false;
|
|
161
|
+
let error;
|
|
162
|
+
try {
|
|
163
|
+
const result = eventsToSend.length === 1
|
|
164
|
+
? await (0, network_1.sdkFetch)('POST', '/api/engagement/events/track', eventsToSend[0])
|
|
165
|
+
: await (0, network_1.sdkFetch)('POST', '/api/engagement/events/track-batch', { events: eventsToSend });
|
|
166
|
+
ok = result.success;
|
|
167
|
+
error = result.error;
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
ok = false;
|
|
171
|
+
error = err instanceof Error ? err.message : 'network error';
|
|
172
|
+
}
|
|
173
|
+
if (ok) {
|
|
174
|
+
consecutiveFailures = 0;
|
|
175
|
+
nextRetryAt = 0;
|
|
176
|
+
log(`Flush success: ${eventsToSend.length} events sent`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// Put the batch back at the front, preserving order, then back off.
|
|
180
|
+
queue.unshift(...eventsToSend);
|
|
181
|
+
trimToCap();
|
|
182
|
+
consecutiveFailures += 1;
|
|
183
|
+
const delay = backoffDelay(consecutiveFailures);
|
|
184
|
+
nextRetryAt = Date.now() + delay;
|
|
185
|
+
log(`Flush failed (${error ?? 'unknown'}) — attempt ${consecutiveFailures}, retrying in ${Math.round(delay)}ms`);
|
|
186
|
+
}
|
|
187
|
+
await persistNow();
|
|
188
|
+
isFlushing = false;
|
|
189
|
+
// Keep draining only while things are working. On failure the periodic timer
|
|
190
|
+
// is the retry mechanism, gated by nextRetryAt.
|
|
191
|
+
if (ok && queue.length >= flushThreshold) {
|
|
192
|
+
void flush();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Stop the queue and clean up */
|
|
196
|
+
async function stopQueue() {
|
|
197
|
+
stopTimer();
|
|
198
|
+
appStateSubscription?.remove();
|
|
199
|
+
appStateSubscription = null;
|
|
200
|
+
await flush();
|
|
201
|
+
queue = [];
|
|
202
|
+
consecutiveFailures = 0;
|
|
203
|
+
nextRetryAt = 0;
|
|
204
|
+
await persistNow();
|
|
205
|
+
await storage.remove(types_1.STORAGE_KEYS.EVENT_QUEUE);
|
|
206
|
+
}
|
|
207
|
+
/** Clear queue without flushing */
|
|
208
|
+
async function clearQueue() {
|
|
209
|
+
queue = [];
|
|
210
|
+
consecutiveFailures = 0;
|
|
211
|
+
nextRetryAt = 0;
|
|
212
|
+
if (persistTimer) {
|
|
213
|
+
clearTimeout(persistTimer);
|
|
214
|
+
persistTimer = null;
|
|
215
|
+
}
|
|
216
|
+
await storage.remove(types_1.STORAGE_KEYS.EVENT_QUEUE);
|
|
217
|
+
}
|
|
218
|
+
/** Queue diagnostics — used by tests and the debug command. */
|
|
219
|
+
function queueStats() {
|
|
220
|
+
return {
|
|
221
|
+
pending: queue.length,
|
|
222
|
+
dropped: droppedCount,
|
|
223
|
+
consecutiveFailures,
|
|
224
|
+
backingOffFor: Math.max(0, nextRetryAt - Date.now()),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
function stopTimer() {
|
|
228
|
+
if (flushTimer) {
|
|
229
|
+
clearInterval(flushTimer);
|
|
230
|
+
flushTimer = null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function handleAppState(state) {
|
|
234
|
+
if (state === 'background' || state === 'inactive') {
|
|
235
|
+
// Leaving the foreground is how a session normally ends, so this is the
|
|
236
|
+
// durability point: persist unconditionally, then try to send.
|
|
237
|
+
void persistNow().then(() => flush());
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=eventQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventQueue.js","sourceRoot":"","sources":["../../src/core/eventQueue.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA6D;AAE7D,oCAAwC;AACxC,MAAY,OAAO,sCAAkB;AACrC,uCAAqC;AAErC,MAAM,sBAAsB,GAAG,KAAM,CAAC,CAAC,MAAM;AAC7C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,gFAAgF;AAChF,iFAAiF;AACjF,6EAA6E;AAC7E,4EAA4E;AAC5E,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,oEAAoE;AACpE,MAAM,aAAa,GAAG,IAAK,CAAC;AAC5B,MAAM,YAAY,GAAG,CAAC,GAAG,KAAM,CAAC,CAAC,gBAAgB;AAEjD,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,IAAI,KAAK,GAAiB,EAAE,CAAC;AAC7B,IAAI,UAAU,GAA0C,IAAI,CAAC;AAC7D,IAAI,YAAY,GAAyC,IAAI,CAAC;AAC9D,IAAI,cAAc,GAAG,uBAAuB,CAAC;AAC7C,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,oBAAoB,GAA8B,IAAI,CAAC;AAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,gBAAgB;AAChB,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC5B,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB,SAAS,GAAG,CAAC,GAAG,IAAe;IAC7B,IAAI,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,gDAAgD;AAChD,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC;AACjC,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,YAAY,GAAG,IAAI,CAAC;QACpB,KAAK,OAAO,CAAC,GAAG,CAAC,oBAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAC1B,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,UAAU;IACvB,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3B,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,iDAAiD;AAC1C,KAAK,qBAAqB,OAIhC;IACC,SAAS,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;IACpC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,uBAAuB,CAAC;IACpE,MAAM,QAAQ,GAAG,OAAO,EAAE,aAAa,IAAI,sBAAsB,CAAC;IAElE,uDAAuD;IACvD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAe,oBAAY,CAAC,WAAW,CAAC,CAAC;IAC5E,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QACzB,SAAS,EAAE,CAAC;QACZ,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,sBAAsB,CAAC,CAAC;IAC1D,CAAC;IAED,mBAAmB,GAAG,CAAC,CAAC;IACxB,WAAW,GAAG,CAAC,CAAC;IAEhB,iBAAiB;IACjB,SAAS,EAAE,CAAC;IACZ,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;IAEvD,sBAAsB;IACtB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,GAAG,uBAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS;IAChB,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc;QAAE,OAAO;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC;IAC/C,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1B,YAAY,IAAI,QAAQ,CAAC;IACzB,GAAG,CAAC,cAAc,cAAc,cAAc,QAAQ,YAAY,YAAY,SAAS,CAAC,CAAC;AAC3F,CAAC;AAED,uBAAuB;AACvB,iBAAwB,KAAiB;IACvC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,SAAS,EAAE,CAAC;IACZ,GAAG,CAAC,aAAa,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;IAE9D,eAAe,EAAE,CAAC;IAElB,8EAA8E;IAC9E,iCAAiC;IACjC,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC;QAChE,KAAK,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,yCAAyC;AAClC,KAAK;IACV,IAAI,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC7C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QAC7B,GAAG,CAAC,iCAAiC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IACD,UAAU,GAAG,IAAI,CAAC;IAElB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACrD,GAAG,CAAC,YAAY,YAAY,CAAC,MAAM,SAAS,CAAC,CAAC;IAE9C,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,IAAI,KAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GACV,YAAY,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,CAAC,MAAM,IAAA,kBAAQ,EAAC,MAAM,EAAE,8BAA8B,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC,CAAC,MAAM,IAAA,kBAAQ,EAAC,MAAM,EAAE,oCAAoC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7F,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QACpB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,GAAG,KAAK,CAAC;QACX,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IAC/D,CAAC;IAED,IAAI,EAAE,EAAE,CAAC;QACP,mBAAmB,GAAG,CAAC,CAAC;QACxB,WAAW,GAAG,CAAC,CAAC;QAChB,GAAG,CAAC,kBAAkB,YAAY,CAAC,MAAM,cAAc,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,oEAAoE;QACpE,KAAK,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/B,SAAS,EAAE,CAAC;QACZ,mBAAmB,IAAI,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAChD,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACjC,GAAG,CAAC,iBAAiB,KAAK,IAAI,SAAS,eAAe,mBAAmB,iBAAiB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnH,CAAC;IAED,MAAM,UAAU,EAAE,CAAC;IACnB,UAAU,GAAG,KAAK,CAAC;IAEnB,6EAA6E;IAC7E,gDAAgD;IAChD,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;QACzC,KAAK,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,kCAAkC;AAC3B,KAAK;IACV,SAAS,EAAE,CAAC;IACZ,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,GAAG,IAAI,CAAC;IAC5B,MAAM,KAAK,EAAE,CAAC;IACd,KAAK,GAAG,EAAE,CAAC;IACX,mBAAmB,GAAG,CAAC,CAAC;IACxB,WAAW,GAAG,CAAC,CAAC;IAChB,MAAM,UAAU,EAAE,CAAC;IACnB,MAAM,OAAO,CAAC,MAAM,CAAC,oBAAY,CAAC,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,mCAAmC;AAC5B,KAAK;IACV,KAAK,GAAG,EAAE,CAAC;IACX,mBAAmB,GAAG,CAAC,CAAC;IACxB,WAAW,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3B,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,CAAC,MAAM,CAAC,oBAAY,CAAC,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,+DAA+D;AAC/D;IAME,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,OAAO,EAAE,YAAY;QACrB,mBAAmB;QACnB,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAqB;IAC3C,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACnD,wEAAwE;QACxE,+DAA+D;QAC/D,KAAK,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type LifecycleEventType = 'app_opened' | 'app_foregrounded' | 'app_backgrounded' | 'app_installed' | 'app_updated';
|
|
2
|
+
interface LifecycleEvent {
|
|
3
|
+
type: LifecycleEventType;
|
|
4
|
+
data: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
type LifecycleListener = (event: LifecycleEvent) => void;
|
|
7
|
+
/**
|
|
8
|
+
* Start lifecycle tracking. Call once during SDK init.
|
|
9
|
+
* Emits app_opened, app_installed, app_updated immediately,
|
|
10
|
+
* then listens for foreground/background transitions.
|
|
11
|
+
*/
|
|
12
|
+
export declare function startLifecycleTracking(onEvent: LifecycleListener, debug?: boolean): Promise<void>;
|
|
13
|
+
/** Stop lifecycle tracking */
|
|
14
|
+
export declare function stopLifecycleTracking(): void;
|
|
15
|
+
/** Increment the session event count (called by CXPinsight.track) */
|
|
16
|
+
export declare function incrementEventCount(): void;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAOA,KAAK,kBAAkB,GACnB,YAAY,GACZ,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,GACf,aAAa,CAAC;AAElB,UAAU,cAAc;IACtB,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,KAAK,iBAAiB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAYzD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED,8BAA8B;AAC9B,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
|