@dreamhorizonorg/pulse-react-native 0.0.1 → 0.0.2

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 (135) hide show
  1. package/PulseReactNativeOtel.podspec +1 -1
  2. package/README.md +34 -879
  3. package/android/build.gradle +10 -15
  4. package/android/proguard-rules.pro +3 -99
  5. package/android/src/main/java/com/pulsereactnativeotel/Pulse.kt +87 -0
  6. package/android/src/main/java/com/pulsereactnativeotel/PulseOtelConstants.kt +1 -1
  7. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelLogger.kt +3 -1
  8. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelModule.kt +53 -3
  9. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelPackage.kt +1 -1
  10. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelTracer.kt +24 -8
  11. package/android/src/main/java/com/pulsereactnativeotel/ReactNativeScreenAttributesLogRecordProcessor.kt +21 -0
  12. package/android/src/main/java/com/pulsereactnativeotel/ReactNativeScreenAttributesSpanProcessor.kt +30 -0
  13. package/android/src/main/java/com/pulsereactnativeotel/ReactNativeScreenNameTracker.kt +17 -0
  14. package/app.plugin.js +1 -0
  15. package/ios/PulseReactNativeOtel.mm +7 -1
  16. package/lib/module/NativePulseReactNativeOtel.js.map +1 -1
  17. package/lib/module/config.js +29 -9
  18. package/lib/module/config.js.map +1 -1
  19. package/lib/module/errorBoundary.js.map +1 -1
  20. package/lib/module/events.js +6 -0
  21. package/lib/module/events.js.map +1 -1
  22. package/lib/module/index.js +4 -2
  23. package/lib/module/index.js.map +1 -1
  24. package/lib/module/navigation/index.js +172 -0
  25. package/lib/module/navigation/index.js.map +1 -0
  26. package/lib/module/navigation/navigation.interface.js +2 -0
  27. package/lib/module/navigation/navigation.interface.js.map +1 -0
  28. package/lib/module/navigation/screen-interactive.js +101 -0
  29. package/lib/module/navigation/screen-interactive.js.map +1 -0
  30. package/lib/module/navigation/screen-load.js +68 -0
  31. package/lib/module/navigation/screen-load.js.map +1 -0
  32. package/lib/module/navigation/screen-session.js +60 -0
  33. package/lib/module/navigation/screen-session.js.map +1 -0
  34. package/lib/module/navigation/useNavigationTracking.js +33 -0
  35. package/lib/module/navigation/useNavigationTracking.js.map +1 -0
  36. package/lib/module/navigation/utils.js +17 -0
  37. package/lib/module/navigation/utils.js.map +1 -0
  38. package/lib/module/network-interceptor/graphql-helper.js +92 -0
  39. package/lib/module/network-interceptor/graphql-helper.js.map +1 -0
  40. package/lib/module/network-interceptor/request-tracker-xhr.js +2 -1
  41. package/lib/module/network-interceptor/request-tracker-xhr.js.map +1 -1
  42. package/lib/module/network-interceptor/span-helpers.js +24 -16
  43. package/lib/module/network-interceptor/span-helpers.js.map +1 -1
  44. package/lib/module/network-interceptor/url-helper.js +58 -2
  45. package/lib/module/network-interceptor/url-helper.js.map +1 -1
  46. package/lib/module/pulse.constants.js +42 -0
  47. package/lib/module/pulse.constants.js.map +1 -0
  48. package/lib/module/trace.js +17 -2
  49. package/lib/module/trace.js.map +1 -1
  50. package/lib/typescript/plugin/src/index.d.ts +5 -0
  51. package/lib/typescript/plugin/src/index.d.ts.map +1 -0
  52. package/lib/typescript/plugin/src/types.d.ts +27 -0
  53. package/lib/typescript/plugin/src/types.d.ts.map +1 -0
  54. package/lib/typescript/plugin/src/utils.d.ts +10 -0
  55. package/lib/typescript/plugin/src/utils.d.ts.map +1 -0
  56. package/lib/typescript/plugin/src/withAndroidPulse.d.ts +4 -0
  57. package/lib/typescript/plugin/src/withAndroidPulse.d.ts.map +1 -0
  58. package/lib/typescript/src/NativePulseReactNativeOtel.d.ts +8 -2
  59. package/lib/typescript/src/NativePulseReactNativeOtel.d.ts.map +1 -1
  60. package/lib/typescript/src/config.d.ts +8 -2
  61. package/lib/typescript/src/config.d.ts.map +1 -1
  62. package/lib/typescript/src/errorBoundary.d.ts.map +1 -1
  63. package/lib/typescript/src/events.d.ts.map +1 -1
  64. package/lib/typescript/src/index.d.ts +5 -3
  65. package/lib/typescript/src/index.d.ts.map +1 -1
  66. package/lib/typescript/src/navigation/index.d.ts +12 -0
  67. package/lib/typescript/src/navigation/index.d.ts.map +1 -0
  68. package/lib/typescript/src/navigation/navigation.interface.d.ts +17 -0
  69. package/lib/typescript/src/navigation/navigation.interface.d.ts.map +1 -0
  70. package/lib/typescript/src/navigation/screen-interactive.d.ts +16 -0
  71. package/lib/typescript/src/navigation/screen-interactive.d.ts.map +1 -0
  72. package/lib/typescript/src/navigation/screen-load.d.ts +13 -0
  73. package/lib/typescript/src/navigation/screen-load.d.ts.map +1 -0
  74. package/lib/typescript/src/navigation/screen-session.d.ts +15 -0
  75. package/lib/typescript/src/navigation/screen-session.d.ts.map +1 -0
  76. package/lib/typescript/src/navigation/useNavigationTracking.d.ts +5 -0
  77. package/lib/typescript/src/navigation/useNavigationTracking.d.ts.map +1 -0
  78. package/lib/typescript/src/navigation/utils.d.ts +8 -0
  79. package/lib/typescript/src/navigation/utils.d.ts.map +1 -0
  80. package/lib/typescript/src/network-interceptor/graphql-helper.d.ts +8 -0
  81. package/lib/typescript/src/network-interceptor/graphql-helper.d.ts.map +1 -0
  82. package/lib/typescript/src/network-interceptor/request-tracker-xhr.d.ts.map +1 -1
  83. package/lib/typescript/src/network-interceptor/span-helpers.d.ts +1 -1
  84. package/lib/typescript/src/network-interceptor/span-helpers.d.ts.map +1 -1
  85. package/lib/typescript/src/network-interceptor/url-helper.d.ts +9 -0
  86. package/lib/typescript/src/network-interceptor/url-helper.d.ts.map +1 -1
  87. package/lib/typescript/src/pulse.constants.d.ts +35 -0
  88. package/lib/typescript/src/pulse.constants.d.ts.map +1 -0
  89. package/lib/typescript/src/pulse.interface.d.ts +2 -1
  90. package/lib/typescript/src/pulse.interface.d.ts.map +1 -1
  91. package/lib/typescript/src/trace.d.ts +7 -0
  92. package/lib/typescript/src/trace.d.ts.map +1 -1
  93. package/package.json +29 -9
  94. package/plugin/build/index.d.ts +4 -0
  95. package/plugin/build/index.js +10 -0
  96. package/plugin/build/types.d.ts +26 -0
  97. package/plugin/build/types.js +2 -0
  98. package/plugin/build/utils.d.ts +9 -0
  99. package/plugin/build/utils.js +102 -0
  100. package/plugin/build/withAndroidPulse.d.ts +3 -0
  101. package/plugin/build/withAndroidPulse.js +53 -0
  102. package/scripts/pulse-cli.js +82 -0
  103. package/scripts/uploadService.js +122 -0
  104. package/scripts/utils.js +125 -0
  105. package/src/NativePulseReactNativeOtel.ts +11 -2
  106. package/src/config.ts +37 -8
  107. package/src/errorBoundary.tsx +11 -5
  108. package/src/events.ts +7 -0
  109. package/src/global.d.ts +0 -1
  110. package/src/index.tsx +6 -3
  111. package/src/navigation/index.ts +306 -0
  112. package/src/navigation/navigation.interface.ts +19 -0
  113. package/src/navigation/screen-interactive.ts +149 -0
  114. package/src/navigation/screen-load.ts +103 -0
  115. package/src/navigation/screen-session.ts +87 -0
  116. package/src/navigation/useNavigationTracking.ts +50 -0
  117. package/src/navigation/utils.ts +19 -0
  118. package/src/network-interceptor/graphql-helper.ts +110 -0
  119. package/src/network-interceptor/request-tracker-xhr.ts +3 -1
  120. package/src/network-interceptor/span-helpers.ts +27 -18
  121. package/src/network-interceptor/url-helper.ts +67 -1
  122. package/src/pulse.constants.ts +38 -0
  123. package/src/pulse.interface.ts +6 -1
  124. package/src/trace.ts +25 -2
  125. package/LICENSE +0 -20
  126. package/lib/module/network-interceptor/request-tracker-fetch.js +0 -72
  127. package/lib/module/network-interceptor/request-tracker-fetch.js.map +0 -1
  128. package/lib/module/reactNavigation.js +0 -100
  129. package/lib/module/reactNavigation.js.map +0 -1
  130. package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts +0 -7
  131. package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts.map +0 -1
  132. package/lib/typescript/src/reactNavigation.d.ts +0 -10
  133. package/lib/typescript/src/reactNavigation.d.ts.map +0 -1
  134. package/src/network-interceptor/request-tracker-fetch.ts +0 -96
  135. package/src/reactNavigation.tsx +0 -146
@@ -1,12 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  import PulseReactNativeOtel from "./NativePulseReactNativeOtel.js";
4
+ import { getFeaturesFromRemoteConfig } from "./config.js";
4
5
  import { mergeWithGlobalAttributes } from "./globalAttributes.js";
5
6
  import { isSupportedPlatform } from "./initialization.js";
6
7
  export function trackEvent(event, attributes) {
7
8
  if (!isSupportedPlatform()) {
8
9
  return;
9
10
  }
11
+ const features = getFeaturesFromRemoteConfig();
12
+ const customEventsEnabled = features?.custom_events ?? true;
13
+ if (!customEventsEnabled) {
14
+ return;
15
+ }
10
16
  const observedTimeMs = Date.now();
11
17
  const mergedAttributes = mergeWithGlobalAttributes(attributes || {});
12
18
  PulseReactNativeOtel.trackEvent(event, observedTimeMs, mergedAttributes);
@@ -1 +1 @@
1
- {"version":3,"names":["PulseReactNativeOtel","mergeWithGlobalAttributes","isSupportedPlatform","trackEvent","event","attributes","observedTimeMs","Date","now","mergedAttributes"],"sourceRoot":"../../src","sources":["events.ts"],"mappings":";;AAAA,OAAOA,oBAAoB,MAAM,iCAA8B;AAC/D,SAASC,yBAAyB,QAAQ,uBAAoB;AAC9D,SAASC,mBAAmB,QAAQ,qBAAkB;AAGtD,OAAO,SAASC,UAAUA,CAACC,KAAa,EAAEC,UAA4B,EAAQ;EAC5E,IAAI,CAACH,mBAAmB,CAAC,CAAC,EAAE;IAC1B;EACF;EAEA,MAAMI,cAAc,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EACjC,MAAMC,gBAAgB,GAAGR,yBAAyB,CAACI,UAAU,IAAI,CAAC,CAAC,CAAC;EAEpEL,oBAAoB,CAACG,UAAU,CAACC,KAAK,EAAEE,cAAc,EAAEG,gBAAgB,CAAC;AAC1E","ignoreList":[]}
1
+ {"version":3,"names":["PulseReactNativeOtel","getFeaturesFromRemoteConfig","mergeWithGlobalAttributes","isSupportedPlatform","trackEvent","event","attributes","features","customEventsEnabled","custom_events","observedTimeMs","Date","now","mergedAttributes"],"sourceRoot":"../../src","sources":["events.ts"],"mappings":";;AAAA,OAAOA,oBAAoB,MAAM,iCAA8B;AAC/D,SAASC,2BAA2B,QAAQ,aAAU;AACtD,SAASC,yBAAyB,QAAQ,uBAAoB;AAC9D,SAASC,mBAAmB,QAAQ,qBAAkB;AAGtD,OAAO,SAASC,UAAUA,CAACC,KAAa,EAAEC,UAA4B,EAAQ;EAC5E,IAAI,CAACH,mBAAmB,CAAC,CAAC,EAAE;IAC1B;EACF;EACA,MAAMI,QAAQ,GAAGN,2BAA2B,CAAC,CAAC;EAC9C,MAAMO,mBAAmB,GAAGD,QAAQ,EAAEE,aAAa,IAAI,IAAI;EAE3D,IAAI,CAACD,mBAAmB,EAAE;IACxB;EACF;EAEA,MAAME,cAAc,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EACjC,MAAMC,gBAAgB,GAAGX,yBAAyB,CAACI,UAAU,IAAI,CAAC,CAAC,CAAC;EAEpEN,oBAAoB,CAACI,UAAU,CAACC,KAAK,EAAEK,cAAc,EAAEG,gBAAgB,CAAC;AAC1E","ignoreList":[]}
@@ -3,16 +3,18 @@
3
3
  import { startSpan, trackSpan } from "./trace.js";
4
4
  import { reportException } from "./errorHandler.js";
5
5
  import { trackEvent } from "./events.js";
6
- import { start, createNavigationIntegrationWithConfig } from "./config.js";
6
+ import { start } from "./config.js";
7
7
  import { isInitialized } from "./initialization.js";
8
8
  import { setGlobalAttribute } from "./globalAttributes.js";
9
9
  import { setUserId, setUserProperty, setUserProperties } from "./user.js";
10
10
  import { ErrorBoundary, withErrorBoundary } from "./errorBoundary.js";
11
+ import { useNavigationTracking, markContentReady } from "./navigation/index.js";
11
12
  export { SpanStatusCode } from "./trace.js";
12
13
  export const Pulse = {
13
14
  start,
14
15
  isInitialized,
15
- createNavigationIntegration: createNavigationIntegrationWithConfig,
16
+ useNavigationTracking,
17
+ markContentReady,
16
18
  trackEvent,
17
19
  reportException,
18
20
  trackSpan,
@@ -1 +1 @@
1
- {"version":3,"names":["startSpan","trackSpan","reportException","trackEvent","start","createNavigationIntegrationWithConfig","isInitialized","setGlobalAttribute","setUserId","setUserProperty","setUserProperties","ErrorBoundary","withErrorBoundary","SpanStatusCode","Pulse","createNavigationIntegration"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,SAAS,QAAQ,YAAS;AAC9C,SAASC,eAAe,QAAQ,mBAAgB;AAChD,SAASC,UAAU,QAAQ,aAAU;AACrC,SAASC,KAAK,EAAEC,qCAAqC,QAAQ,aAAU;AACvE,SAASC,aAAa,QAAQ,qBAAkB;AAChD,SAASC,kBAAkB,QAAQ,uBAAoB;AACvD,SAASC,SAAS,EAAEC,eAAe,EAAEC,iBAAiB,QAAQ,WAAQ;AACtE,SAASC,aAAa,EAAEC,iBAAiB,QAAQ,oBAAiB;AAYlE,SAASC,cAAc,QAAQ,YAAS;AACxC,OAAO,MAAMC,KAAK,GAAG;EACnBV,KAAK;EACLE,aAAa;EACbS,2BAA2B,EAAEV,qCAAqC;EAClEF,UAAU;EACVD,eAAe;EACfD,SAAS;EACTD,SAAS;EACTO,kBAAkB;EAClBC,SAAS;EACTC,eAAe;EACfC,iBAAiB;EACjBC,aAAa;EACbC;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["startSpan","trackSpan","reportException","trackEvent","start","isInitialized","setGlobalAttribute","setUserId","setUserProperty","setUserProperties","ErrorBoundary","withErrorBoundary","useNavigationTracking","markContentReady","SpanStatusCode","Pulse"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,SAAS,QAAQ,YAAS;AAC9C,SAASC,eAAe,QAAQ,mBAAgB;AAChD,SAASC,UAAU,QAAQ,aAAU;AACrC,SAASC,KAAK,QAAQ,aAAU;AAChC,SAASC,aAAa,QAAQ,qBAAkB;AAChD,SAASC,kBAAkB,QAAQ,uBAAoB;AACvD,SAASC,SAAS,EAAEC,eAAe,EAAEC,iBAAiB,QAAQ,WAAQ;AACtE,SAASC,aAAa,EAAEC,iBAAiB,QAAQ,oBAAiB;AAClE,SAASC,qBAAqB,EAAEC,gBAAgB,QAAQ,uBAAc;AAatE,SAASC,cAAc,QAAQ,YAAS;AACxC,OAAO,MAAMC,KAAK,GAAG;EACnBX,KAAK;EACLC,aAAa;EACbO,qBAAqB;EACrBC,gBAAgB;EAChBV,UAAU;EACVD,eAAe;EACfD,SAAS;EACTD,SAAS;EACTM,kBAAkB;EAClBC,SAAS;EACTC,eAAe;EACfC,iBAAiB;EACjBC,aAAa;EACbC;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+
3
+ import { AppState } from 'react-native';
4
+ import { pushRecentRouteKey, LOG_TAGS } from "./utils.js";
5
+ import { discardSpan } from "../trace.js";
6
+ import { createScreenLoadTracker, INITIAL_SCREEN_LOAD_STATE } from "./screen-load.js";
7
+ import { createScreenInteractiveTracker, markContentReady, clearGlobalMarkContentReady, INITIAL_SCREEN_INTERACTIVE_STATE } from "./screen-interactive.js";
8
+ import { createScreenSessionTracker, INITIAL_SCREEN_SESSION_STATE } from "./screen-session.js";
9
+ import { useNavigationTracking as useNavigationTrackingBase } from "./useNavigationTracking.js";
10
+ import { isSupportedPlatform } from "../initialization.js";
11
+ import PulseReactNativeOtel from "../NativePulseReactNativeOtel.js";
12
+ import { getFeaturesFromRemoteConfig } from "../config.js";
13
+ export function createReactNavigationIntegration(options) {
14
+ const features = getFeaturesFromRemoteConfig();
15
+ const screenSessionTracking = features?.screen_session ?? options?.screenSessionTracking ?? true;
16
+ const screenNavigationTracking = features?.rn_screen_load ?? options?.screenNavigationTracking ?? true;
17
+ const screenInteractiveTracking = features?.rn_screen_interactive ?? options?.screenInteractiveTracking ?? false;
18
+ let navigationContainer;
19
+ let recentRouteKeys = [];
20
+ let isInitialized = false;
21
+ let appStateSubscription;
22
+ const screenLoadState = {
23
+ ...INITIAL_SCREEN_LOAD_STATE
24
+ };
25
+ const screenInteractiveState = {
26
+ ...INITIAL_SCREEN_INTERACTIVE_STATE
27
+ };
28
+ const screenSessionState = {
29
+ ...INITIAL_SCREEN_SESSION_STATE
30
+ };
31
+ const screenInteractiveTracker = createScreenInteractiveTracker(screenInteractiveTracking, screenInteractiveState, navigationContainer);
32
+ const screenLoadTracker = createScreenLoadTracker(screenNavigationTracking, screenLoadState, () => recentRouteKeys, key => {
33
+ recentRouteKeys = pushRecentRouteKey(recentRouteKeys, key);
34
+ }, undefined);
35
+ const screenSessionTracker = createScreenSessionTracker(screenSessionTracking, screenSessionState);
36
+ const setCurrentScreenName = screenName => {
37
+ if (isSupportedPlatform()) {
38
+ PulseReactNativeOtel.setCurrentScreenName(screenName);
39
+ }
40
+ };
41
+ const onNavigationDispatch = () => {
42
+ try {
43
+ if (screenInteractiveTracking) {
44
+ screenInteractiveTracker.discardScreenInteractive('user navigated away');
45
+ }
46
+ if (screenSessionTracking && screenSessionState.screenSessionSpan && navigationContainer) {
47
+ const currentRoute = navigationContainer.getCurrentRoute();
48
+ screenSessionTracker.endScreenSession(currentRoute?.name);
49
+ }
50
+ screenLoadTracker.startNavigationSpan();
51
+ } catch (error) {
52
+ console.warn(`${LOG_TAGS.NAVIGATION} Error in onNavigationDispatch:`, error);
53
+ if (screenLoadState.navigationSpan?.spanId) {
54
+ discardSpan(screenLoadState.navigationSpan.spanId);
55
+ screenLoadState.navigationSpan = undefined;
56
+ }
57
+ }
58
+ };
59
+ const onStateChange = () => {
60
+ try {
61
+ if (!navigationContainer) {
62
+ return;
63
+ }
64
+ const currentRoute = navigationContainer.getCurrentRoute();
65
+ if (!currentRoute) {
66
+ return;
67
+ }
68
+ if (currentRoute.name) {
69
+ setCurrentScreenName(currentRoute.name);
70
+ }
71
+ screenLoadTracker.handleStateChange(currentRoute);
72
+ const appState = AppState.currentState;
73
+ if (appState && screenSessionTracker.shouldStartSession(currentRoute, appState)) {
74
+ screenSessionTracker.startScreenSession(currentRoute);
75
+ }
76
+ if (screenInteractiveTracking) {
77
+ screenInteractiveTracker.startScreenInteractive(currentRoute);
78
+ }
79
+ } catch (error) {
80
+ console.warn(`${LOG_TAGS.NAVIGATION} Error in onStateChange:`, error);
81
+ if (screenLoadState.navigationSpan?.spanId) {
82
+ discardSpan(screenLoadState.navigationSpan.spanId);
83
+ screenLoadState.navigationSpan = undefined;
84
+ }
85
+ }
86
+ };
87
+ const handleAppStateChange = nextAppState => {
88
+ try {
89
+ screenSessionTracker.handleAppStateChange(nextAppState, navigationContainer);
90
+ } catch (error) {
91
+ console.warn(`${LOG_TAGS.NAVIGATION} Error in handleAppStateChange:`, error);
92
+ }
93
+ };
94
+ const registerNavigationContainer = maybeNavigationContainer => {
95
+ try {
96
+ let container;
97
+ if (typeof maybeNavigationContainer === 'object' && maybeNavigationContainer !== null && 'current' in maybeNavigationContainer) {
98
+ container = maybeNavigationContainer.current;
99
+ } else {
100
+ container = maybeNavigationContainer;
101
+ }
102
+ if (!container) {
103
+ console.warn(`${LOG_TAGS.NAVIGATION} Invalid navigation container ref`);
104
+ return () => {};
105
+ }
106
+ if (isInitialized && navigationContainer === container) {
107
+ return () => {
108
+ if (screenSessionTracking && screenSessionState.screenSessionSpan) {
109
+ const currentRoute = container.getCurrentRoute();
110
+ screenSessionTracker.endScreenSession(currentRoute?.name);
111
+ }
112
+ };
113
+ }
114
+ navigationContainer = container;
115
+ const updatedInteractiveTracker = createScreenInteractiveTracker(screenInteractiveTracking, screenInteractiveState, navigationContainer);
116
+ navigationContainer.addListener('__unsafe_action__', onNavigationDispatch);
117
+ navigationContainer.addListener('state', onStateChange);
118
+ const unmountCleanup = () => {
119
+ if (screenSessionTracking && screenSessionState.screenSessionSpan) {
120
+ const currentRoute = container.getCurrentRoute();
121
+ screenSessionTracker.endScreenSession(currentRoute?.name);
122
+ }
123
+ if (screenInteractiveTracking) {
124
+ screenInteractiveTracker.discardScreenInteractive('navigation container unmounted');
125
+ }
126
+ screenLoadTracker.endNavigationSpan();
127
+ if (navigationContainer === container) {
128
+ if (appStateSubscription) {
129
+ appStateSubscription.remove();
130
+ appStateSubscription = undefined;
131
+ }
132
+ navigationContainer = undefined;
133
+ isInitialized = false;
134
+ clearGlobalMarkContentReady(updatedInteractiveTracker.markContentReady);
135
+ }
136
+ };
137
+ const currentRoute = container.getCurrentRoute();
138
+ if (currentRoute) {
139
+ screenLoadState.latestRoute = currentRoute;
140
+ recentRouteKeys = pushRecentRouteKey(recentRouteKeys, currentRoute.key);
141
+ if (currentRoute.name) {
142
+ setCurrentScreenName(currentRoute.name);
143
+ }
144
+ const appState = AppState.currentState;
145
+ if (appState && screenSessionTracker.shouldStartSession(currentRoute, appState)) {
146
+ screenSessionTracker.startScreenSession(currentRoute);
147
+ }
148
+ if (screenInteractiveTracking) {
149
+ updatedInteractiveTracker.startScreenInteractive(currentRoute);
150
+ }
151
+ }
152
+ appStateSubscription = AppState.addEventListener('change', handleAppStateChange);
153
+ isInitialized = true;
154
+ return unmountCleanup;
155
+ } catch (error) {
156
+ console.error(`${LOG_TAGS.NAVIGATION} Error registering container:`, error);
157
+ return () => {};
158
+ }
159
+ };
160
+ return {
161
+ registerNavigationContainer,
162
+ markContentReady: screenInteractiveTracker.markContentReady
163
+ };
164
+ }
165
+ export { markContentReady };
166
+ export function useNavigationTracking(navigationRef, options) {
167
+ const {
168
+ createNavigationIntegrationWithConfig
169
+ } = require('../config');
170
+ return useNavigationTrackingBase(navigationRef, options, createNavigationIntegrationWithConfig);
171
+ }
172
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppState","pushRecentRouteKey","LOG_TAGS","discardSpan","createScreenLoadTracker","INITIAL_SCREEN_LOAD_STATE","createScreenInteractiveTracker","markContentReady","clearGlobalMarkContentReady","INITIAL_SCREEN_INTERACTIVE_STATE","createScreenSessionTracker","INITIAL_SCREEN_SESSION_STATE","useNavigationTracking","useNavigationTrackingBase","isSupportedPlatform","PulseReactNativeOtel","getFeaturesFromRemoteConfig","createReactNavigationIntegration","options","features","screenSessionTracking","screen_session","screenNavigationTracking","rn_screen_load","screenInteractiveTracking","rn_screen_interactive","navigationContainer","recentRouteKeys","isInitialized","appStateSubscription","screenLoadState","screenInteractiveState","screenSessionState","screenInteractiveTracker","screenLoadTracker","key","undefined","screenSessionTracker","setCurrentScreenName","screenName","onNavigationDispatch","discardScreenInteractive","screenSessionSpan","currentRoute","getCurrentRoute","endScreenSession","name","startNavigationSpan","error","console","warn","NAVIGATION","navigationSpan","spanId","onStateChange","handleStateChange","appState","currentState","shouldStartSession","startScreenSession","startScreenInteractive","handleAppStateChange","nextAppState","registerNavigationContainer","maybeNavigationContainer","container","current","updatedInteractiveTracker","addListener","unmountCleanup","endNavigationSpan","remove","latestRoute","addEventListener","navigationRef","createNavigationIntegrationWithConfig","require"],"sourceRoot":"../../../src","sources":["navigation/index.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=navigation.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["navigation/navigation.interface.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ import { Pulse } from "../index.js";
4
+ import { Platform } from 'react-native';
5
+ import { SPAN_NAMES, ATTRIBUTE_KEYS, PULSE_TYPES } from "../pulse.constants.js";
6
+ import { discardSpan } from "../trace.js";
7
+ import { LOG_TAGS } from "./utils.js";
8
+ export const INITIAL_SCREEN_INTERACTIVE_STATE = {
9
+ screenInteractiveSpan: undefined,
10
+ currentInteractiveRouteKey: undefined
11
+ };
12
+ let globalMarkContentReady;
13
+ export function createScreenInteractiveTracker(enabled, state, navigationContainer) {
14
+ const discardScreenInteractive = reason => {
15
+ if (state.screenInteractiveSpan) {
16
+ console.log(`${LOG_TAGS.SCREEN_INTERACTIVE} screen_interactive span discarded: ${reason} (routeKey: ${state.currentInteractiveRouteKey})`);
17
+ if (state.screenInteractiveSpan.spanId) {
18
+ discardSpan(state.screenInteractiveSpan.spanId);
19
+ }
20
+ state.screenInteractiveSpan = undefined;
21
+ state.currentInteractiveRouteKey = undefined;
22
+ }
23
+ };
24
+ const startScreenInteractive = route => {
25
+ if (!enabled) {
26
+ return;
27
+ }
28
+ if (state.screenInteractiveSpan && state.currentInteractiveRouteKey === route.key) {
29
+ return;
30
+ }
31
+ if (state.screenInteractiveSpan) {
32
+ discardScreenInteractive('previous span replaced by new navigation');
33
+ }
34
+ state.screenInteractiveSpan = Pulse.startSpan(SPAN_NAMES.SCREEN_INTERACTIVE, {
35
+ attributes: {
36
+ [ATTRIBUTE_KEYS.PULSE_TYPE]: PULSE_TYPES.SCREEN_INTERACTIVE,
37
+ [ATTRIBUTE_KEYS.SCREEN_NAME]: route.name,
38
+ [ATTRIBUTE_KEYS.ROUTE_KEY]: route.key,
39
+ [ATTRIBUTE_KEYS.PLATFORM]: Platform.OS
40
+ },
41
+ inheritContext: false
42
+ });
43
+ state.currentInteractiveRouteKey = route.key;
44
+ console.log(`${LOG_TAGS.SCREEN_INTERACTIVE} ${route.name} started`);
45
+ };
46
+ const endScreenInteractive = routeName => {
47
+ if (state.screenInteractiveSpan) {
48
+ state.screenInteractiveSpan.end();
49
+ if (routeName) {
50
+ console.log(`${LOG_TAGS.SCREEN_INTERACTIVE} ${routeName} ended`);
51
+ }
52
+ state.screenInteractiveSpan = undefined;
53
+ state.currentInteractiveRouteKey = undefined;
54
+ }
55
+ };
56
+ const handleMarkContentReady = () => {
57
+ try {
58
+ if (!enabled) {
59
+ console.warn(`${LOG_TAGS.SCREEN_INTERACTIVE} markContentReady called but screenInteractiveTracking is disabled`);
60
+ return;
61
+ }
62
+ if (!state.screenInteractiveSpan) {
63
+ return;
64
+ }
65
+ const currentRoute = navigationContainer?.getCurrentRoute();
66
+ if (!currentRoute) {
67
+ console.warn(`${LOG_TAGS.SCREEN_INTERACTIVE} markContentReady called but no current route found`);
68
+ discardScreenInteractive('no current route');
69
+ return;
70
+ }
71
+ if (currentRoute.key !== state.currentInteractiveRouteKey) {
72
+ console.warn(`${LOG_TAGS.SCREEN_INTERACTIVE} markContentReady called for wrong screen. Expected routeKey: ${state.currentInteractiveRouteKey}, Current: ${currentRoute.key}`);
73
+ discardScreenInteractive('route key mismatch');
74
+ return;
75
+ }
76
+ endScreenInteractive(currentRoute.name);
77
+ } catch (error) {
78
+ console.error(`${LOG_TAGS.SCREEN_INTERACTIVE} Error in markContentReady:`, error);
79
+ }
80
+ };
81
+ globalMarkContentReady = handleMarkContentReady;
82
+ return {
83
+ startScreenInteractive,
84
+ endScreenInteractive,
85
+ discardScreenInteractive,
86
+ markContentReady: handleMarkContentReady
87
+ };
88
+ }
89
+ export function markContentReady() {
90
+ if (globalMarkContentReady) {
91
+ globalMarkContentReady();
92
+ } else {
93
+ console.warn(`${LOG_TAGS.NAVIGATION} markContentReady called but navigation integration not initialized`);
94
+ }
95
+ }
96
+ export function clearGlobalMarkContentReady(markContentReadyFn) {
97
+ if (globalMarkContentReady === markContentReadyFn) {
98
+ globalMarkContentReady = undefined;
99
+ }
100
+ }
101
+ //# sourceMappingURL=screen-interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Pulse","Platform","SPAN_NAMES","ATTRIBUTE_KEYS","PULSE_TYPES","discardSpan","LOG_TAGS","INITIAL_SCREEN_INTERACTIVE_STATE","screenInteractiveSpan","undefined","currentInteractiveRouteKey","globalMarkContentReady","createScreenInteractiveTracker","enabled","state","navigationContainer","discardScreenInteractive","reason","console","log","SCREEN_INTERACTIVE","spanId","startScreenInteractive","route","key","startSpan","attributes","PULSE_TYPE","SCREEN_NAME","name","ROUTE_KEY","PLATFORM","OS","inheritContext","endScreenInteractive","routeName","end","handleMarkContentReady","warn","currentRoute","getCurrentRoute","error","markContentReady","NAVIGATION","clearGlobalMarkContentReady","markContentReadyFn"],"sourceRoot":"../../../src","sources":["navigation/screen-interactive.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ import { Pulse } from "../index.js";
4
+ import { Platform } from 'react-native';
5
+ import { SPAN_NAMES, ATTRIBUTE_KEYS, PULSE_TYPES, PHASE_VALUES } from "../pulse.constants.js";
6
+ import { LOG_TAGS } from "./utils.js";
7
+ export const INITIAL_SCREEN_LOAD_STATE = {
8
+ navigationSpan: undefined,
9
+ latestRoute: undefined
10
+ };
11
+ export function createScreenLoadTracker(enabled, state, getRecentRouteKeys, pushRecentRouteKey, onLoadEnd) {
12
+ const startNavigationSpan = () => {
13
+ if (!enabled) {
14
+ return;
15
+ }
16
+ state.navigationSpan = Pulse.startSpan(SPAN_NAMES.NAVIGATED, {
17
+ attributes: {
18
+ [ATTRIBUTE_KEYS.PULSE_TYPE]: PULSE_TYPES.SCREEN_LOAD,
19
+ [ATTRIBUTE_KEYS.PHASE]: PHASE_VALUES.START,
20
+ [ATTRIBUTE_KEYS.PLATFORM]: Platform.OS
21
+ }
22
+ });
23
+ console.log(`${LOG_TAGS.SCREEN_LOAD} started`);
24
+ };
25
+ const endNavigationSpan = (currentRoute, previousRoute, routeHasBeenSeen) => {
26
+ if (state.navigationSpan) {
27
+ const route = currentRoute || state.latestRoute;
28
+ if (route) {
29
+ const hasBeenSeen = routeHasBeenSeen !== undefined ? routeHasBeenSeen : getRecentRouteKeys().includes(route.key);
30
+ state.navigationSpan.setAttributes({
31
+ [ATTRIBUTE_KEYS.SCREEN_NAME]: route.name,
32
+ [ATTRIBUTE_KEYS.LAST_SCREEN_NAME]: previousRoute?.name || undefined,
33
+ [ATTRIBUTE_KEYS.ROUTE_HAS_BEEN_SEEN]: hasBeenSeen,
34
+ [ATTRIBUTE_KEYS.ROUTE_KEY]: route.key
35
+ });
36
+ }
37
+ state.navigationSpan.end();
38
+ state.navigationSpan = undefined;
39
+ if (route) {
40
+ console.log(`${LOG_TAGS.SCREEN_LOAD} ${route.name} ended`);
41
+ if (onLoadEnd) {
42
+ onLoadEnd(route);
43
+ }
44
+ }
45
+ }
46
+ };
47
+ const handleStateChange = currentRoute => {
48
+ if (!enabled || !state.navigationSpan) {
49
+ return;
50
+ }
51
+ const previousRoute = state.latestRoute;
52
+ if (previousRoute && previousRoute.key === currentRoute.key) {
53
+ const routeHasBeenSeen = getRecentRouteKeys().includes(currentRoute.key);
54
+ endNavigationSpan(currentRoute, previousRoute, routeHasBeenSeen);
55
+ return;
56
+ }
57
+ const routeHasBeenSeen = getRecentRouteKeys().includes(currentRoute.key);
58
+ state.latestRoute = currentRoute;
59
+ pushRecentRouteKey(currentRoute.key);
60
+ endNavigationSpan(currentRoute, previousRoute, routeHasBeenSeen);
61
+ };
62
+ return {
63
+ startNavigationSpan,
64
+ endNavigationSpan,
65
+ handleStateChange
66
+ };
67
+ }
68
+ //# sourceMappingURL=screen-load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Pulse","Platform","SPAN_NAMES","ATTRIBUTE_KEYS","PULSE_TYPES","PHASE_VALUES","LOG_TAGS","INITIAL_SCREEN_LOAD_STATE","navigationSpan","undefined","latestRoute","createScreenLoadTracker","enabled","state","getRecentRouteKeys","pushRecentRouteKey","onLoadEnd","startNavigationSpan","startSpan","NAVIGATED","attributes","PULSE_TYPE","SCREEN_LOAD","PHASE","START","PLATFORM","OS","console","log","endNavigationSpan","currentRoute","previousRoute","routeHasBeenSeen","route","hasBeenSeen","includes","key","setAttributes","SCREEN_NAME","name","LAST_SCREEN_NAME","ROUTE_HAS_BEEN_SEEN","ROUTE_KEY","end","handleStateChange"],"sourceRoot":"../../../src","sources":["navigation/screen-load.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAmB,aAAU;AAC3C,SAASC,QAAQ,QAAQ,cAAc;AACvC,SACEC,UAAU,EACVC,cAAc,EACdC,WAAW,EACXC,YAAY,QACP,uBAAoB;AAE3B,SAASC,QAAQ,QAAQ,YAAS;AAOlC,OAAO,MAAMC,yBAA0C,GAAG;EACxDC,cAAc,EAAEC,SAAS;EACzBC,WAAW,EAAED;AACf,CAAC;AAED,OAAO,SAASE,uBAAuBA,CACrCC,OAAgB,EAChBC,KAAsB,EACtBC,kBAAkC,EAClCC,kBAAyC,EACzCC,SAA4C,EAC5C;EACA,MAAMC,mBAAmB,GAAGA,CAAA,KAAY;IACtC,IAAI,CAACL,OAAO,EAAE;MACZ;IACF;IAEAC,KAAK,CAACL,cAAc,GAAGR,KAAK,CAACkB,SAAS,CAAChB,UAAU,CAACiB,SAAS,EAAE;MAC3DC,UAAU,EAAE;QACV,CAACjB,cAAc,CAACkB,UAAU,GAAGjB,WAAW,CAACkB,WAAW;QACpD,CAACnB,cAAc,CAACoB,KAAK,GAAGlB,YAAY,CAACmB,KAAK;QAC1C,CAACrB,cAAc,CAACsB,QAAQ,GAAGxB,QAAQ,CAACyB;MACtC;IACF,CAAC,CAAC;IACFC,OAAO,CAACC,GAAG,CAAC,GAAGtB,QAAQ,CAACgB,WAAW,UAAU,CAAC;EAChD,CAAC;EAED,MAAMO,iBAAiB,GAAGA,CACxBC,YAA8B,EAC9BC,aAA+B,EAC/BC,gBAA0B,KACjB;IACT,IAAInB,KAAK,CAACL,cAAc,EAAE;MACxB,MAAMyB,KAAK,GAAGH,YAAY,IAAIjB,KAAK,CAACH,WAAW;MAE/C,IAAIuB,KAAK,EAAE;QACT,MAAMC,WAAW,GACfF,gBAAgB,KAAKvB,SAAS,GAC1BuB,gBAAgB,GAChBlB,kBAAkB,CAAC,CAAC,CAACqB,QAAQ,CAACF,KAAK,CAACG,GAAG,CAAC;QAE9CvB,KAAK,CAACL,cAAc,CAAC6B,aAAa,CAAC;UACjC,CAAClC,cAAc,CAACmC,WAAW,GAAGL,KAAK,CAACM,IAAI;UACxC,CAACpC,cAAc,CAACqC,gBAAgB,GAAGT,aAAa,EAAEQ,IAAI,IAAI9B,SAAS;UACnE,CAACN,cAAc,CAACsC,mBAAmB,GAAGP,WAAW;UACjD,CAAC/B,cAAc,CAACuC,SAAS,GAAGT,KAAK,CAACG;QACpC,CAAC,CAAC;MACJ;MAEAvB,KAAK,CAACL,cAAc,CAACmC,GAAG,CAAC,CAAC;MAC1B9B,KAAK,CAACL,cAAc,GAAGC,SAAS;MAEhC,IAAIwB,KAAK,EAAE;QACTN,OAAO,CAACC,GAAG,CAAC,GAAGtB,QAAQ,CAACgB,WAAW,IAAIW,KAAK,CAACM,IAAI,QAAQ,CAAC;QAC1D,IAAIvB,SAAS,EAAE;UACbA,SAAS,CAACiB,KAAK,CAAC;QAClB;MACF;IACF;EACF,CAAC;EAED,MAAMW,iBAAiB,GAAId,YAA6B,IAAW;IACjE,IAAI,CAAClB,OAAO,IAAI,CAACC,KAAK,CAACL,cAAc,EAAE;MACrC;IACF;IAEA,MAAMuB,aAAa,GAAGlB,KAAK,CAACH,WAAW;IAEvC,IAAIqB,aAAa,IAAIA,aAAa,CAACK,GAAG,KAAKN,YAAY,CAACM,GAAG,EAAE;MAC3D,MAAMJ,gBAAgB,GAAGlB,kBAAkB,CAAC,CAAC,CAACqB,QAAQ,CAACL,YAAY,CAACM,GAAG,CAAC;MACxEP,iBAAiB,CAACC,YAAY,EAAEC,aAAa,EAAEC,gBAAgB,CAAC;MAChE;IACF;IAEA,MAAMA,gBAAgB,GAAGlB,kBAAkB,CAAC,CAAC,CAACqB,QAAQ,CAACL,YAAY,CAACM,GAAG,CAAC;IACxEvB,KAAK,CAACH,WAAW,GAAGoB,YAAY;IAChCf,kBAAkB,CAACe,YAAY,CAACM,GAAG,CAAC;IAEpCP,iBAAiB,CAACC,YAAY,EAAEC,aAAa,EAAEC,gBAAgB,CAAC;EAClE,CAAC;EAED,OAAO;IACLf,mBAAmB;IACnBY,iBAAiB;IACjBe;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ import { Pulse } from "../index.js";
4
+ import { Platform } from 'react-native';
5
+ import { SPAN_NAMES, ATTRIBUTE_KEYS, PULSE_TYPES } from "../pulse.constants.js";
6
+ import { LOG_TAGS } from "./utils.js";
7
+ export const INITIAL_SCREEN_SESSION_STATE = {
8
+ screenSessionSpan: undefined,
9
+ currentScreenKey: undefined
10
+ };
11
+ export function createScreenSessionTracker(enabled, state) {
12
+ const startScreenSession = route => {
13
+ state.screenSessionSpan = Pulse.startSpan(SPAN_NAMES.SCREEN_SESSION, {
14
+ attributes: {
15
+ [ATTRIBUTE_KEYS.PULSE_TYPE]: PULSE_TYPES.SCREEN_SESSION,
16
+ [ATTRIBUTE_KEYS.SCREEN_NAME]: route.name,
17
+ [ATTRIBUTE_KEYS.ROUTE_KEY]: route.key,
18
+ [ATTRIBUTE_KEYS.PLATFORM]: Platform.OS
19
+ }
20
+ });
21
+ state.currentScreenKey = route.key;
22
+ console.log(`${LOG_TAGS.SCREEN_SESSION} ${route.name} started`);
23
+ };
24
+ const endScreenSession = routeName => {
25
+ if (state.screenSessionSpan) {
26
+ state.screenSessionSpan.end();
27
+ if (routeName) {
28
+ console.log(`${LOG_TAGS.SCREEN_SESSION} ${routeName} ended`);
29
+ }
30
+ state.screenSessionSpan = undefined;
31
+ state.currentScreenKey = undefined;
32
+ }
33
+ };
34
+ const handleAppStateChange = (nextAppState, navigationContainer) => {
35
+ if (!enabled) {
36
+ return;
37
+ }
38
+ if (nextAppState === 'background' || nextAppState === 'inactive') {
39
+ if (state.screenSessionSpan) {
40
+ const currentRoute = navigationContainer?.getCurrentRoute();
41
+ endScreenSession(currentRoute?.name);
42
+ }
43
+ } else if (nextAppState === 'active') {
44
+ const currentRoute = navigationContainer?.getCurrentRoute();
45
+ if (currentRoute && !state.screenSessionSpan) {
46
+ startScreenSession(currentRoute);
47
+ }
48
+ }
49
+ };
50
+ const shouldStartSession = (currentRoute, appState) => {
51
+ return enabled && appState === 'active' && !state.screenSessionSpan && state.currentScreenKey !== currentRoute.key;
52
+ };
53
+ return {
54
+ startScreenSession,
55
+ endScreenSession,
56
+ handleAppStateChange,
57
+ shouldStartSession
58
+ };
59
+ }
60
+ //# sourceMappingURL=screen-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Pulse","Platform","SPAN_NAMES","ATTRIBUTE_KEYS","PULSE_TYPES","LOG_TAGS","INITIAL_SCREEN_SESSION_STATE","screenSessionSpan","undefined","currentScreenKey","createScreenSessionTracker","enabled","state","startScreenSession","route","startSpan","SCREEN_SESSION","attributes","PULSE_TYPE","SCREEN_NAME","name","ROUTE_KEY","key","PLATFORM","OS","console","log","endScreenSession","routeName","end","handleAppStateChange","nextAppState","navigationContainer","currentRoute","getCurrentRoute","shouldStartSession","appState"],"sourceRoot":"../../../src","sources":["navigation/screen-session.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAmB,aAAU;AAC3C,SAA8BC,QAAQ,QAAQ,cAAc;AAC5D,SAASC,UAAU,EAAEC,cAAc,EAAEC,WAAW,QAAQ,uBAAoB;AAK5E,SAASC,QAAQ,QAAQ,YAAS;AAOlC,OAAO,MAAMC,4BAAgD,GAAG;EAC9DC,iBAAiB,EAAEC,SAAS;EAC5BC,gBAAgB,EAAED;AACpB,CAAC;AAED,OAAO,SAASE,0BAA0BA,CACxCC,OAAgB,EAChBC,KAAyB,EACzB;EACA,MAAMC,kBAAkB,GAAIC,KAAsB,IAAW;IAC3DF,KAAK,CAACL,iBAAiB,GAAGP,KAAK,CAACe,SAAS,CAACb,UAAU,CAACc,cAAc,EAAE;MACnEC,UAAU,EAAE;QACV,CAACd,cAAc,CAACe,UAAU,GAAGd,WAAW,CAACY,cAAc;QACvD,CAACb,cAAc,CAACgB,WAAW,GAAGL,KAAK,CAACM,IAAI;QACxC,CAACjB,cAAc,CAACkB,SAAS,GAAGP,KAAK,CAACQ,GAAG;QACrC,CAACnB,cAAc,CAACoB,QAAQ,GAAGtB,QAAQ,CAACuB;MACtC;IACF,CAAC,CAAC;IACFZ,KAAK,CAACH,gBAAgB,GAAGK,KAAK,CAACQ,GAAG;IAClCG,OAAO,CAACC,GAAG,CAAC,GAAGrB,QAAQ,CAACW,cAAc,IAAIF,KAAK,CAACM,IAAI,UAAU,CAAC;EACjE,CAAC;EAED,MAAMO,gBAAgB,GAAIC,SAAkB,IAAW;IACrD,IAAIhB,KAAK,CAACL,iBAAiB,EAAE;MAC3BK,KAAK,CAACL,iBAAiB,CAACsB,GAAG,CAAC,CAAC;MAC7B,IAAID,SAAS,EAAE;QACbH,OAAO,CAACC,GAAG,CAAC,GAAGrB,QAAQ,CAACW,cAAc,IAAIY,SAAS,QAAQ,CAAC;MAC9D;MACAhB,KAAK,CAACL,iBAAiB,GAAGC,SAAS;MACnCI,KAAK,CAACH,gBAAgB,GAAGD,SAAS;IACpC;EACF,CAAC;EAED,MAAMsB,oBAAoB,GAAGA,CAC3BC,YAA4B,EAC5BC,mBAAoD,KAC3C;IACT,IAAI,CAACrB,OAAO,EAAE;MACZ;IACF;IAEA,IAAIoB,YAAY,KAAK,YAAY,IAAIA,YAAY,KAAK,UAAU,EAAE;MAChE,IAAInB,KAAK,CAACL,iBAAiB,EAAE;QAC3B,MAAM0B,YAAY,GAAGD,mBAAmB,EAAEE,eAAe,CAAC,CAAC;QAC3DP,gBAAgB,CAACM,YAAY,EAAEb,IAAI,CAAC;MACtC;IACF,CAAC,MAAM,IAAIW,YAAY,KAAK,QAAQ,EAAE;MACpC,MAAME,YAAY,GAAGD,mBAAmB,EAAEE,eAAe,CAAC,CAAC;MAC3D,IAAID,YAAY,IAAI,CAACrB,KAAK,CAACL,iBAAiB,EAAE;QAC5CM,kBAAkB,CAACoB,YAAY,CAAC;MAClC;IACF;EACF,CAAC;EAED,MAAME,kBAAkB,GAAGA,CACzBF,YAA6B,EAC7BG,QAAwB,KACZ;IACZ,OACEzB,OAAO,IACPyB,QAAQ,KAAK,QAAQ,IACrB,CAACxB,KAAK,CAACL,iBAAiB,IACxBK,KAAK,CAACH,gBAAgB,KAAKwB,YAAY,CAACX,GAAG;EAE/C,CAAC;EAED,OAAO;IACLT,kBAAkB;IAClBc,gBAAgB;IAChBG,oBAAoB;IACpBK;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ import { useRef, useCallback, useEffect, useMemo } from 'react';
4
+ export function useNavigationTracking(navigationRef, options, createIntegration) {
5
+ const screenSessionTracking = options?.screenSessionTracking ?? true;
6
+ const screenNavigationTracking = options?.screenNavigationTracking ?? true;
7
+ const screenInteractiveTracking = options?.screenInteractiveTracking ?? false;
8
+ const integration = useMemo(() => {
9
+ if (createIntegration) {
10
+ return createIntegration({
11
+ screenSessionTracking,
12
+ screenNavigationTracking,
13
+ screenInteractiveTracking
14
+ });
15
+ }
16
+ throw new Error('createIntegration must be provided');
17
+ }, [screenSessionTracking, screenNavigationTracking, screenInteractiveTracking, createIntegration]);
18
+ const cleanupRef = useRef(null);
19
+ useEffect(() => {
20
+ return () => {
21
+ if (cleanupRef.current) {
22
+ cleanupRef.current();
23
+ }
24
+ };
25
+ }, []);
26
+ const onReady = useCallback(() => {
27
+ if (navigationRef.current && integration) {
28
+ cleanupRef.current = integration.registerNavigationContainer(navigationRef);
29
+ }
30
+ }, [navigationRef, integration]);
31
+ return onReady;
32
+ }
33
+ //# sourceMappingURL=useNavigationTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useRef","useCallback","useEffect","useMemo","useNavigationTracking","navigationRef","options","createIntegration","screenSessionTracking","screenNavigationTracking","screenInteractiveTracking","integration","Error","cleanupRef","current","onReady","registerNavigationContainer"],"sourceRoot":"../../../src","sources":["navigation/useNavigationTracking.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAwB,OAAO;AAI/E,OAAO,SAASC,qBAAqBA,CACnCC,aAA6B,EAC7BC,OAAsC,EACtCC,iBAE+B,EACnB;EACZ,MAAMC,qBAAqB,GAAGF,OAAO,EAAEE,qBAAqB,IAAI,IAAI;EACpE,MAAMC,wBAAwB,GAAGH,OAAO,EAAEG,wBAAwB,IAAI,IAAI;EAC1E,MAAMC,yBAAyB,GAAGJ,OAAO,EAAEI,yBAAyB,IAAI,KAAK;EAE7E,MAAMC,WAAW,GAAGR,OAAO,CAAC,MAAM;IAChC,IAAII,iBAAiB,EAAE;MACrB,OAAOA,iBAAiB,CAAC;QACvBC,qBAAqB;QACrBC,wBAAwB;QACxBC;MACF,CAAC,CAAC;IACJ;IACA,MAAM,IAAIE,KAAK,CAAC,oCAAoC,CAAC;EACvD,CAAC,EAAE,CACDJ,qBAAqB,EACrBC,wBAAwB,EACxBC,yBAAyB,EACzBH,iBAAiB,CAClB,CAAC;EAEF,MAAMM,UAAU,GAAGb,MAAM,CAAsB,IAAI,CAAC;EAEpDE,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACX,IAAIW,UAAU,CAACC,OAAO,EAAE;QACtBD,UAAU,CAACC,OAAO,CAAC,CAAC;MACtB;IACF,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,OAAO,GAAGd,WAAW,CAAC,MAAM;IAChC,IAAII,aAAa,CAACS,OAAO,IAAIH,WAAW,EAAE;MACxCE,UAAU,CAACC,OAAO,GAChBH,WAAW,CAACK,2BAA2B,CAACX,aAAa,CAAC;IAC1D;EACF,CAAC,EAAE,CAACA,aAAa,EAAEM,WAAW,CAAC,CAAC;EAEhC,OAAOI,OAAO;AAChB","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ const NAVIGATION_HISTORY_MAX_SIZE = 200;
4
+ export const LOG_TAGS = {
5
+ NAVIGATION: '[Pulse Navigation]',
6
+ SCREEN_LOAD: '[Pulse Screen Load]',
7
+ SCREEN_SESSION: '[Pulse Screen Session]',
8
+ SCREEN_INTERACTIVE: '[Pulse Screen Interactive]'
9
+ };
10
+ export function pushRecentRouteKey(recentRouteKeys, key) {
11
+ const updated = [...recentRouteKeys, key];
12
+ if (updated.length > NAVIGATION_HISTORY_MAX_SIZE) {
13
+ return updated.slice(updated.length - NAVIGATION_HISTORY_MAX_SIZE);
14
+ }
15
+ return updated;
16
+ }
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NAVIGATION_HISTORY_MAX_SIZE","LOG_TAGS","NAVIGATION","SCREEN_LOAD","SCREEN_SESSION","SCREEN_INTERACTIVE","pushRecentRouteKey","recentRouteKeys","key","updated","length","slice"],"sourceRoot":"../../../src","sources":["navigation/utils.ts"],"mappings":";;AAAA,MAAMA,2BAA2B,GAAG,GAAG;AAEvC,OAAO,MAAMC,QAAQ,GAAG;EACtBC,UAAU,EAAE,oBAAoB;EAChCC,WAAW,EAAE,qBAAqB;EAClCC,cAAc,EAAE,wBAAwB;EACxCC,kBAAkB,EAAE;AACtB,CAAU;AAEV,OAAO,SAASC,kBAAkBA,CAChCC,eAAyB,EACzBC,GAAW,EACD;EACV,MAAMC,OAAO,GAAG,CAAC,GAAGF,eAAe,EAAEC,GAAG,CAAC;EACzC,IAAIC,OAAO,CAACC,MAAM,GAAGV,2BAA2B,EAAE;IAChD,OAAOS,OAAO,CAACE,KAAK,CAACF,OAAO,CAACC,MAAM,GAAGV,2BAA2B,CAAC;EACpE;EACA,OAAOS,OAAO;AAChB","ignoreList":[]}