@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.
Files changed (253) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/babel.js +101 -0
  4. package/instrumented/Pressable.d.ts +2 -0
  5. package/instrumented/Pressable.js +2 -0
  6. package/instrumented/ScrollView.d.ts +2 -0
  7. package/instrumented/ScrollView.js +2 -0
  8. package/instrumented/TextInput.d.ts +2 -0
  9. package/instrumented/TextInput.js +2 -0
  10. package/instrumented/TouchableOpacity.d.ts +2 -0
  11. package/instrumented/TouchableOpacity.js +2 -0
  12. package/lib/CXPinsight.d.ts +113 -0
  13. package/lib/CXPinsight.d.ts.map +1 -0
  14. package/lib/CXPinsight.js +831 -0
  15. package/lib/CXPinsight.js.map +1 -0
  16. package/lib/CXPinsightProvider.d.ts +19 -0
  17. package/lib/CXPinsightProvider.d.ts.map +1 -0
  18. package/lib/CXPinsightProvider.js +382 -0
  19. package/lib/CXPinsightProvider.js.map +1 -0
  20. package/lib/core/autoScreenTracker.d.ts +20 -0
  21. package/lib/core/autoScreenTracker.d.ts.map +1 -0
  22. package/lib/core/autoScreenTracker.js +66 -0
  23. package/lib/core/autoScreenTracker.js.map +1 -0
  24. package/lib/core/deepLinkTracker.d.ts +17 -0
  25. package/lib/core/deepLinkTracker.d.ts.map +1 -0
  26. package/lib/core/deepLinkTracker.js +81 -0
  27. package/lib/core/deepLinkTracker.js.map +1 -0
  28. package/lib/core/deviceInfo.d.ts +14 -0
  29. package/lib/core/deviceInfo.d.ts.map +1 -0
  30. package/lib/core/deviceInfo.js +166 -0
  31. package/lib/core/deviceInfo.js.map +1 -0
  32. package/lib/core/eventQueue.d.ts +23 -0
  33. package/lib/core/eventQueue.d.ts.map +1 -0
  34. package/lib/core/eventQueue.js +240 -0
  35. package/lib/core/eventQueue.js.map +1 -0
  36. package/lib/core/lifecycle.d.ts +18 -0
  37. package/lib/core/lifecycle.d.ts.map +1 -0
  38. package/lib/core/lifecycle.js +127 -0
  39. package/lib/core/lifecycle.js.map +1 -0
  40. package/lib/core/mobileRecorder.d.ts +15 -0
  41. package/lib/core/mobileRecorder.d.ts.map +1 -0
  42. package/lib/core/mobileRecorder.js +231 -0
  43. package/lib/core/mobileRecorder.js.map +1 -0
  44. package/lib/core/network.d.ts +10 -0
  45. package/lib/core/network.d.ts.map +1 -0
  46. package/lib/core/network.js +74 -0
  47. package/lib/core/network.js.map +1 -0
  48. package/lib/core/networkCapture.d.ts +22 -0
  49. package/lib/core/networkCapture.d.ts.map +1 -0
  50. package/lib/core/networkCapture.js +100 -0
  51. package/lib/core/networkCapture.js.map +1 -0
  52. package/lib/core/scrollCapture.d.ts +48 -0
  53. package/lib/core/scrollCapture.d.ts.map +1 -0
  54. package/lib/core/scrollCapture.js +221 -0
  55. package/lib/core/scrollCapture.js.map +1 -0
  56. package/lib/core/session.d.ts +15 -0
  57. package/lib/core/session.d.ts.map +1 -0
  58. package/lib/core/session.js +157 -0
  59. package/lib/core/session.js.map +1 -0
  60. package/lib/core/storage.d.ts +11 -0
  61. package/lib/core/storage.d.ts.map +1 -0
  62. package/lib/core/storage.js +59 -0
  63. package/lib/core/storage.js.map +1 -0
  64. package/lib/core/triggerEngine.d.ts +56 -0
  65. package/lib/core/triggerEngine.d.ts.map +1 -0
  66. package/lib/core/triggerEngine.js +432 -0
  67. package/lib/core/triggerEngine.js.map +1 -0
  68. package/lib/index.d.ts +7 -0
  69. package/lib/index.d.ts.map +1 -0
  70. package/lib/index.js +11 -0
  71. package/lib/index.js.map +1 -0
  72. package/lib/instrumented/Pressable.d.ts +9 -0
  73. package/lib/instrumented/Pressable.d.ts.map +1 -0
  74. package/lib/instrumented/Pressable.js +96 -0
  75. package/lib/instrumented/Pressable.js.map +1 -0
  76. package/lib/instrumented/ScrollView.d.ts +6 -0
  77. package/lib/instrumented/ScrollView.d.ts.map +1 -0
  78. package/lib/instrumented/ScrollView.js +101 -0
  79. package/lib/instrumented/ScrollView.js.map +1 -0
  80. package/lib/instrumented/TextInput.d.ts +9 -0
  81. package/lib/instrumented/TextInput.d.ts.map +1 -0
  82. package/lib/instrumented/TextInput.js +75 -0
  83. package/lib/instrumented/TextInput.js.map +1 -0
  84. package/lib/instrumented/TouchableOpacity.d.ts +11 -0
  85. package/lib/instrumented/TouchableOpacity.d.ts.map +1 -0
  86. package/lib/instrumented/TouchableOpacity.js +96 -0
  87. package/lib/instrumented/TouchableOpacity.js.map +1 -0
  88. package/lib/instrumented/index.d.ts +19 -0
  89. package/lib/instrumented/index.d.ts.map +1 -0
  90. package/lib/instrumented/index.js +28 -0
  91. package/lib/instrumented/index.js.map +1 -0
  92. package/lib/instrumented/interactionObserver.d.ts +29 -0
  93. package/lib/instrumented/interactionObserver.d.ts.map +1 -0
  94. package/lib/instrumented/interactionObserver.js +38 -0
  95. package/lib/instrumented/interactionObserver.js.map +1 -0
  96. package/lib/setup/AccessibilityScanner.d.ts +32 -0
  97. package/lib/setup/AccessibilityScanner.d.ts.map +1 -0
  98. package/lib/setup/AccessibilityScanner.js +127 -0
  99. package/lib/setup/AccessibilityScanner.js.map +1 -0
  100. package/lib/setup/ElementIdentifier.d.ts +65 -0
  101. package/lib/setup/ElementIdentifier.d.ts.map +1 -0
  102. package/lib/setup/ElementIdentifier.js +114 -0
  103. package/lib/setup/ElementIdentifier.js.map +1 -0
  104. package/lib/setup/ElementRegistry.d.ts +22 -0
  105. package/lib/setup/ElementRegistry.d.ts.map +1 -0
  106. package/lib/setup/ElementRegistry.js +47 -0
  107. package/lib/setup/ElementRegistry.js.map +1 -0
  108. package/lib/setup/SetupCodeEntry.d.ts +15 -0
  109. package/lib/setup/SetupCodeEntry.d.ts.map +1 -0
  110. package/lib/setup/SetupCodeEntry.js +198 -0
  111. package/lib/setup/SetupCodeEntry.js.map +1 -0
  112. package/lib/setup/SetupController.d.ts +29 -0
  113. package/lib/setup/SetupController.d.ts.map +1 -0
  114. package/lib/setup/SetupController.js +189 -0
  115. package/lib/setup/SetupController.js.map +1 -0
  116. package/lib/setup/SetupOverlay.d.ts +10 -0
  117. package/lib/setup/SetupOverlay.d.ts.map +1 -0
  118. package/lib/setup/SetupOverlay.js +408 -0
  119. package/lib/setup/SetupOverlay.js.map +1 -0
  120. package/lib/setup/TapInterceptor.d.ts +19 -0
  121. package/lib/setup/TapInterceptor.d.ts.map +1 -0
  122. package/lib/setup/TapInterceptor.js +98 -0
  123. package/lib/setup/TapInterceptor.js.map +1 -0
  124. package/lib/setup/TouchObserver.d.ts +25 -0
  125. package/lib/setup/TouchObserver.d.ts.map +1 -0
  126. package/lib/setup/TouchObserver.js +88 -0
  127. package/lib/setup/TouchObserver.js.map +1 -0
  128. package/lib/setup/TouchPatcher.d.ts +27 -0
  129. package/lib/setup/TouchPatcher.d.ts.map +1 -0
  130. package/lib/setup/TouchPatcher.js +182 -0
  131. package/lib/setup/TouchPatcher.js.map +1 -0
  132. package/lib/setup/index.d.ts +13 -0
  133. package/lib/setup/index.d.ts.map +1 -0
  134. package/lib/setup/index.js +45 -0
  135. package/lib/setup/index.js.map +1 -0
  136. package/lib/setup/useCXPElement.d.ts +25 -0
  137. package/lib/setup/useCXPElement.d.ts.map +1 -0
  138. package/lib/setup/useCXPElement.js +33 -0
  139. package/lib/setup/useCXPElement.js.map +1 -0
  140. package/lib/survey/SurveyModal.d.ts +10 -0
  141. package/lib/survey/SurveyModal.d.ts.map +1 -0
  142. package/lib/survey/SurveyModal.js +1650 -0
  143. package/lib/survey/SurveyModal.js.map +1 -0
  144. package/lib/survey/expressionEval.d.ts +10 -0
  145. package/lib/survey/expressionEval.d.ts.map +1 -0
  146. package/lib/survey/expressionEval.js +287 -0
  147. package/lib/survey/expressionEval.js.map +1 -0
  148. package/lib/survey/frequencyCap.d.ts +15 -0
  149. package/lib/survey/frequencyCap.d.ts.map +1 -0
  150. package/lib/survey/frequencyCap.js +116 -0
  151. package/lib/survey/frequencyCap.js.map +1 -0
  152. package/lib/survey/handsFreeVoice.d.ts +30 -0
  153. package/lib/survey/handsFreeVoice.d.ts.map +1 -0
  154. package/lib/survey/handsFreeVoice.js +312 -0
  155. package/lib/survey/handsFreeVoice.js.map +1 -0
  156. package/lib/survey/interpolate.d.ts +6 -0
  157. package/lib/survey/interpolate.d.ts.map +1 -0
  158. package/lib/survey/interpolate.js +61 -0
  159. package/lib/survey/interpolate.js.map +1 -0
  160. package/lib/survey/pagesFromV1.d.ts +6 -0
  161. package/lib/survey/pagesFromV1.d.ts.map +1 -0
  162. package/lib/survey/pagesFromV1.js +83 -0
  163. package/lib/survey/pagesFromV1.js.map +1 -0
  164. package/lib/survey/questions/CSATQuestion.d.ts +16 -0
  165. package/lib/survey/questions/CSATQuestion.d.ts.map +1 -0
  166. package/lib/survey/questions/CSATQuestion.js +37 -0
  167. package/lib/survey/questions/CSATQuestion.js.map +1 -0
  168. package/lib/survey/questions/DateQuestion.d.ts +20 -0
  169. package/lib/survey/questions/DateQuestion.d.ts.map +1 -0
  170. package/lib/survey/questions/DateQuestion.js +103 -0
  171. package/lib/survey/questions/DateQuestion.js.map +1 -0
  172. package/lib/survey/questions/ImagePickerQuestion.d.ts +33 -0
  173. package/lib/survey/questions/ImagePickerQuestion.d.ts.map +1 -0
  174. package/lib/survey/questions/ImagePickerQuestion.js +68 -0
  175. package/lib/survey/questions/ImagePickerQuestion.js.map +1 -0
  176. package/lib/survey/questions/ImageQuestion.d.ts +26 -0
  177. package/lib/survey/questions/ImageQuestion.d.ts.map +1 -0
  178. package/lib/survey/questions/ImageQuestion.js +24 -0
  179. package/lib/survey/questions/ImageQuestion.js.map +1 -0
  180. package/lib/survey/questions/MatrixCell.d.ts +45 -0
  181. package/lib/survey/questions/MatrixCell.d.ts.map +1 -0
  182. package/lib/survey/questions/MatrixCell.js +54 -0
  183. package/lib/survey/questions/MatrixCell.js.map +1 -0
  184. package/lib/survey/questions/MatrixDropdownQuestion.d.ts +29 -0
  185. package/lib/survey/questions/MatrixDropdownQuestion.d.ts.map +1 -0
  186. package/lib/survey/questions/MatrixDropdownQuestion.js +42 -0
  187. package/lib/survey/questions/MatrixDropdownQuestion.js.map +1 -0
  188. package/lib/survey/questions/MatrixDynamicQuestion.d.ts +26 -0
  189. package/lib/survey/questions/MatrixDynamicQuestion.d.ts.map +1 -0
  190. package/lib/survey/questions/MatrixDynamicQuestion.js +52 -0
  191. package/lib/survey/questions/MatrixDynamicQuestion.js.map +1 -0
  192. package/lib/survey/questions/MatrixQuestion.d.ts +38 -0
  193. package/lib/survey/questions/MatrixQuestion.d.ts.map +1 -0
  194. package/lib/survey/questions/MatrixQuestion.js +64 -0
  195. package/lib/survey/questions/MatrixQuestion.js.map +1 -0
  196. package/lib/survey/questions/MultiTextQuestion.d.ts +19 -0
  197. package/lib/survey/questions/MultiTextQuestion.d.ts.map +1 -0
  198. package/lib/survey/questions/MultiTextQuestion.js +64 -0
  199. package/lib/survey/questions/MultiTextQuestion.js.map +1 -0
  200. package/lib/survey/questions/MultipleChoiceQuestion.d.ts +25 -0
  201. package/lib/survey/questions/MultipleChoiceQuestion.d.ts.map +1 -0
  202. package/lib/survey/questions/MultipleChoiceQuestion.js +111 -0
  203. package/lib/survey/questions/MultipleChoiceQuestion.js.map +1 -0
  204. package/lib/survey/questions/NPSQuestion.d.ts +18 -0
  205. package/lib/survey/questions/NPSQuestion.d.ts.map +1 -0
  206. package/lib/survey/questions/NPSQuestion.js +62 -0
  207. package/lib/survey/questions/NPSQuestion.js.map +1 -0
  208. package/lib/survey/questions/PanelDynamicQuestion.d.ts +50 -0
  209. package/lib/survey/questions/PanelDynamicQuestion.d.ts.map +1 -0
  210. package/lib/survey/questions/PanelDynamicQuestion.js +62 -0
  211. package/lib/survey/questions/PanelDynamicQuestion.js.map +1 -0
  212. package/lib/survey/questions/RankingQuestion.d.ts +34 -0
  213. package/lib/survey/questions/RankingQuestion.d.ts.map +1 -0
  214. package/lib/survey/questions/RankingQuestion.js +85 -0
  215. package/lib/survey/questions/RankingQuestion.js.map +1 -0
  216. package/lib/survey/questions/RatingQuestion.d.ts +20 -0
  217. package/lib/survey/questions/RatingQuestion.d.ts.map +1 -0
  218. package/lib/survey/questions/RatingQuestion.js +53 -0
  219. package/lib/survey/questions/RatingQuestion.js.map +1 -0
  220. package/lib/survey/questions/TextQuestion.d.ts +17 -0
  221. package/lib/survey/questions/TextQuestion.d.ts.map +1 -0
  222. package/lib/survey/questions/TextQuestion.js +46 -0
  223. package/lib/survey/questions/TextQuestion.js.map +1 -0
  224. package/lib/survey/styleContract.d.ts +230 -0
  225. package/lib/survey/styleContract.d.ts.map +1 -0
  226. package/lib/survey/styleContract.js +365 -0
  227. package/lib/survey/styleContract.js.map +1 -0
  228. package/lib/survey/themePalette.d.ts +56 -0
  229. package/lib/survey/themePalette.d.ts.map +1 -0
  230. package/lib/survey/themePalette.js +63 -0
  231. package/lib/survey/themePalette.js.map +1 -0
  232. package/lib/survey/translationLookup.d.ts +4 -0
  233. package/lib/survey/translationLookup.d.ts.map +1 -0
  234. package/lib/survey/translationLookup.js +62 -0
  235. package/lib/survey/translationLookup.js.map +1 -0
  236. package/lib/survey/validate.d.ts +3 -0
  237. package/lib/survey/validate.d.ts.map +1 -0
  238. package/lib/survey/validate.js +159 -0
  239. package/lib/survey/validate.js.map +1 -0
  240. package/lib/survey/variablesResolver.d.ts +10 -0
  241. package/lib/survey/variablesResolver.d.ts.map +1 -0
  242. package/lib/survey/variablesResolver.js +107 -0
  243. package/lib/survey/variablesResolver.js.map +1 -0
  244. package/lib/survey/voiceParsers.d.ts +47 -0
  245. package/lib/survey/voiceParsers.d.ts.map +1 -0
  246. package/lib/survey/voiceParsers.js +310 -0
  247. package/lib/survey/voiceParsers.js.map +1 -0
  248. package/lib/types.d.ts +349 -0
  249. package/lib/types.d.ts.map +1 -0
  250. package/lib/types.js +20 -0
  251. package/lib/types.js.map +1 -0
  252. package/metro.js +55 -0
  253. 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"}