@dreamhorizonorg/pulse-react-native 0.0.1 → 0.0.3
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/PulseReactNativeOtel.podspec +1 -1
- package/README.md +34 -879
- package/android/build.gradle +10 -15
- package/android/proguard-rules.pro +3 -99
- package/android/src/main/java/com/pulsereactnativeotel/Pulse.kt +89 -0
- package/android/src/main/java/com/pulsereactnativeotel/PulseOtelConstants.kt +1 -1
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelLogger.kt +3 -1
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelModule.kt +69 -3
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelPackage.kt +1 -1
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelTracer.kt +24 -8
- package/android/src/main/java/com/pulsereactnativeotel/ReactNativeScreenAttributesLogRecordProcessor.kt +21 -0
- package/android/src/main/java/com/pulsereactnativeotel/ReactNativeScreenAttributesSpanProcessor.kt +30 -0
- package/android/src/main/java/com/pulsereactnativeotel/ReactNativeScreenNameTracker.kt +17 -0
- package/app.plugin.js +1 -0
- package/ios/PulseReactNativeOtel.mm +7 -1
- package/lib/module/NativePulseReactNativeOtel.js.map +1 -1
- package/lib/module/config.js +57 -19
- package/lib/module/config.js.map +1 -1
- package/lib/module/errorBoundary.js.map +1 -1
- package/lib/module/events.js +6 -0
- package/lib/module/events.js.map +1 -1
- package/lib/module/index.js +4 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/navigation/index.js +179 -0
- package/lib/module/navigation/index.js.map +1 -0
- package/lib/module/navigation/navigation.interface.js +8 -0
- package/lib/module/navigation/navigation.interface.js.map +1 -0
- package/lib/module/navigation/screen-interactive.js +101 -0
- package/lib/module/navigation/screen-interactive.js.map +1 -0
- package/lib/module/navigation/screen-load.js +67 -0
- package/lib/module/navigation/screen-load.js.map +1 -0
- package/lib/module/navigation/screen-session.js +60 -0
- package/lib/module/navigation/screen-session.js.map +1 -0
- package/lib/module/navigation/useNavigationTracking.js +34 -0
- package/lib/module/navigation/useNavigationTracking.js.map +1 -0
- package/lib/module/navigation/utils.js +17 -0
- package/lib/module/navigation/utils.js.map +1 -0
- package/lib/module/network-interceptor/graphql-helper.js +92 -0
- package/lib/module/network-interceptor/graphql-helper.js.map +1 -0
- package/lib/module/network-interceptor/header-helper.js +24 -0
- package/lib/module/network-interceptor/header-helper.js.map +1 -0
- package/lib/module/network-interceptor/initialization.js +18 -1
- package/lib/module/network-interceptor/initialization.js.map +1 -1
- package/lib/module/network-interceptor/request-tracker-xhr.js +61 -4
- package/lib/module/network-interceptor/request-tracker-xhr.js.map +1 -1
- package/lib/module/network-interceptor/span-helpers.js +36 -16
- package/lib/module/network-interceptor/span-helpers.js.map +1 -1
- package/lib/module/network-interceptor/url-helper.js +58 -2
- package/lib/module/network-interceptor/url-helper.js.map +1 -1
- package/lib/module/pulse.constants.js +47 -0
- package/lib/module/pulse.constants.js.map +1 -0
- package/lib/module/trace.js +17 -2
- package/lib/module/trace.js.map +1 -1
- package/lib/typescript/plugin/src/index.d.ts +5 -0
- package/lib/typescript/plugin/src/index.d.ts.map +1 -0
- package/lib/typescript/plugin/src/types.d.ts +27 -0
- package/lib/typescript/plugin/src/types.d.ts.map +1 -0
- package/lib/typescript/plugin/src/utils.d.ts +10 -0
- package/lib/typescript/plugin/src/utils.d.ts.map +1 -0
- package/lib/typescript/plugin/src/withAndroidPulse.d.ts +4 -0
- package/lib/typescript/plugin/src/withAndroidPulse.d.ts.map +1 -0
- package/lib/typescript/src/NativePulseReactNativeOtel.d.ts +15 -2
- package/lib/typescript/src/NativePulseReactNativeOtel.d.ts.map +1 -1
- package/lib/typescript/src/config.d.ts +14 -8
- package/lib/typescript/src/config.d.ts.map +1 -1
- package/lib/typescript/src/errorBoundary.d.ts.map +1 -1
- package/lib/typescript/src/events.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +6 -4
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/navigation/index.d.ts +13 -0
- package/lib/typescript/src/navigation/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/navigation.interface.d.ts +18 -0
- package/lib/typescript/src/navigation/navigation.interface.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen-interactive.d.ts +16 -0
- package/lib/typescript/src/navigation/screen-interactive.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen-load.d.ts +13 -0
- package/lib/typescript/src/navigation/screen-load.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen-session.d.ts +15 -0
- package/lib/typescript/src/navigation/screen-session.d.ts.map +1 -0
- package/lib/typescript/src/navigation/useNavigationTracking.d.ts +5 -0
- package/lib/typescript/src/navigation/useNavigationTracking.d.ts.map +1 -0
- package/lib/typescript/src/navigation/utils.d.ts +8 -0
- package/lib/typescript/src/navigation/utils.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/graphql-helper.d.ts +8 -0
- package/lib/typescript/src/network-interceptor/graphql-helper.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/header-helper.d.ts +15 -0
- package/lib/typescript/src/network-interceptor/header-helper.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/initialization.d.ts +4 -1
- package/lib/typescript/src/network-interceptor/initialization.d.ts.map +1 -1
- package/lib/typescript/src/network-interceptor/network.interface.d.ts +3 -0
- package/lib/typescript/src/network-interceptor/network.interface.d.ts.map +1 -1
- package/lib/typescript/src/network-interceptor/request-tracker-xhr.d.ts.map +1 -1
- package/lib/typescript/src/network-interceptor/span-helpers.d.ts +1 -1
- package/lib/typescript/src/network-interceptor/span-helpers.d.ts.map +1 -1
- package/lib/typescript/src/network-interceptor/url-helper.d.ts +9 -0
- package/lib/typescript/src/network-interceptor/url-helper.d.ts.map +1 -1
- package/lib/typescript/src/pulse.constants.d.ts +43 -0
- package/lib/typescript/src/pulse.constants.d.ts.map +1 -0
- package/lib/typescript/src/pulse.interface.d.ts +2 -1
- package/lib/typescript/src/pulse.interface.d.ts.map +1 -1
- package/lib/typescript/src/trace.d.ts +7 -0
- package/lib/typescript/src/trace.d.ts.map +1 -1
- package/package.json +29 -9
- package/plugin/build/index.d.ts +4 -0
- package/plugin/build/index.js +10 -0
- package/plugin/build/types.d.ts +26 -0
- package/plugin/build/types.js +2 -0
- package/plugin/build/utils.d.ts +9 -0
- package/plugin/build/utils.js +102 -0
- package/plugin/build/withAndroidPulse.d.ts +3 -0
- package/plugin/build/withAndroidPulse.js +53 -0
- package/scripts/pulse-cli.js +82 -0
- package/scripts/uploadService.js +122 -0
- package/scripts/utils.js +125 -0
- package/src/NativePulseReactNativeOtel.ts +18 -2
- package/src/config.ts +94 -23
- package/src/errorBoundary.tsx +11 -5
- package/src/events.ts +7 -0
- package/src/global.d.ts +0 -1
- package/src/index.tsx +7 -4
- package/src/navigation/index.ts +335 -0
- package/src/navigation/navigation.interface.ts +26 -0
- package/src/navigation/screen-interactive.ts +149 -0
- package/src/navigation/screen-load.ts +97 -0
- package/src/navigation/screen-session.ts +87 -0
- package/src/navigation/useNavigationTracking.ts +59 -0
- package/src/navigation/utils.ts +19 -0
- package/src/network-interceptor/graphql-helper.ts +110 -0
- package/src/network-interceptor/header-helper.ts +26 -0
- package/src/network-interceptor/initialization.ts +22 -1
- package/src/network-interceptor/network.interface.ts +3 -0
- package/src/network-interceptor/request-tracker-xhr.ts +93 -3
- package/src/network-interceptor/span-helpers.ts +47 -18
- package/src/network-interceptor/url-helper.ts +67 -1
- package/src/pulse.constants.ts +52 -0
- package/src/pulse.interface.ts +6 -1
- package/src/trace.ts +25 -2
- package/LICENSE +0 -20
- package/lib/module/network-interceptor/request-tracker-fetch.js +0 -72
- package/lib/module/network-interceptor/request-tracker-fetch.js.map +0 -1
- package/lib/module/reactNavigation.js +0 -100
- package/lib/module/reactNavigation.js.map +0 -1
- package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts +0 -7
- package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts.map +0 -1
- package/lib/typescript/src/reactNavigation.d.ts +0 -10
- package/lib/typescript/src/reactNavigation.d.ts.map +0 -1
- package/src/network-interceptor/request-tracker-fetch.ts +0 -96
- package/src/reactNavigation.tsx +0 -146
package/lib/module/config.js
CHANGED
|
@@ -2,16 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
import { setupErrorHandler } from "./errorHandler.js";
|
|
4
4
|
import { isSupportedPlatform } from "./initialization.js";
|
|
5
|
-
import { createReactNavigationIntegration } from "./
|
|
5
|
+
import { createReactNavigationIntegration } from "./navigation/index.js";
|
|
6
6
|
import { initializeNetworkInterceptor } from "./network-interceptor/initialization.js";
|
|
7
|
+
import PulseReactNativeOtel from "./NativePulseReactNativeOtel.js";
|
|
8
|
+
import { PULSE_FEATURE_NAMES } from "./pulse.constants.js";
|
|
7
9
|
const defaultConfig = {
|
|
8
10
|
autoDetectExceptions: true,
|
|
9
11
|
autoDetectNavigation: true,
|
|
10
|
-
autoDetectNetwork: true
|
|
12
|
+
autoDetectNetwork: true,
|
|
13
|
+
networkHeaders: {
|
|
14
|
+
requestHeaders: [],
|
|
15
|
+
responseHeaders: []
|
|
16
|
+
}
|
|
11
17
|
};
|
|
12
18
|
let currentConfig = {
|
|
13
19
|
...defaultConfig
|
|
14
20
|
};
|
|
21
|
+
|
|
22
|
+
// Cache for features from remote SDK config
|
|
23
|
+
let cachedFeatures;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Gets all features from the remote SDK config.
|
|
27
|
+
* @returns Record of feature names to their enabled status, or null if config not available
|
|
28
|
+
*/
|
|
29
|
+
export function getFeaturesFromRemoteConfig() {
|
|
30
|
+
if (cachedFeatures !== undefined) {
|
|
31
|
+
return cachedFeatures;
|
|
32
|
+
}
|
|
33
|
+
cachedFeatures = PulseReactNativeOtel.getAllFeatures();
|
|
34
|
+
return cachedFeatures;
|
|
35
|
+
}
|
|
15
36
|
function configure(config) {
|
|
16
37
|
currentConfig = {
|
|
17
38
|
...currentConfig,
|
|
@@ -19,37 +40,54 @@ function configure(config) {
|
|
|
19
40
|
};
|
|
20
41
|
setupErrorHandler(currentConfig.autoDetectExceptions ?? true);
|
|
21
42
|
if (currentConfig.autoDetectNetwork) {
|
|
22
|
-
initializeNetworkInterceptor(
|
|
43
|
+
initializeNetworkInterceptor(currentConfig.networkHeaders ?? {
|
|
44
|
+
requestHeaders: [],
|
|
45
|
+
responseHeaders: []
|
|
46
|
+
});
|
|
23
47
|
}
|
|
24
48
|
}
|
|
25
|
-
|
|
26
|
-
if (
|
|
27
|
-
|
|
49
|
+
function resolveFeatureState(features, featureName, optionValue) {
|
|
50
|
+
if (features !== undefined && features !== null) return features[featureName] ?? optionValue;
|
|
51
|
+
return optionValue;
|
|
52
|
+
}
|
|
53
|
+
function resolveNavigationState(features, optionValue) {
|
|
54
|
+
if (features !== undefined && features !== null) {
|
|
55
|
+
const hasAny = features[PULSE_FEATURE_NAMES.SCREEN_SESSION] === true || features[PULSE_FEATURE_NAMES.RN_SCREEN_LOAD] === true || features[PULSE_FEATURE_NAMES.RN_SCREEN_INTERACTIVE] === true;
|
|
56
|
+
return hasAny ?? optionValue;
|
|
28
57
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
58
|
+
return optionValue;
|
|
59
|
+
}
|
|
60
|
+
export function start(options) {
|
|
61
|
+
if (!isSupportedPlatform()) return;
|
|
62
|
+
const features = getFeaturesFromRemoteConfig();
|
|
63
|
+
const config = {
|
|
64
|
+
autoDetectExceptions: resolveFeatureState(features, PULSE_FEATURE_NAMES.JS_CRASH, options?.autoDetectExceptions ?? defaultConfig.autoDetectExceptions),
|
|
65
|
+
autoDetectNavigation: resolveNavigationState(features, options?.autoDetectNavigation ?? defaultConfig.autoDetectNavigation),
|
|
66
|
+
autoDetectNetwork: resolveFeatureState(features, PULSE_FEATURE_NAMES.NETWORK_INSTRUMENTATION, options?.autoDetectNetwork ?? defaultConfig.autoDetectNetwork),
|
|
67
|
+
networkHeaders: options?.networkHeaders ?? {
|
|
68
|
+
requestHeaders: [],
|
|
69
|
+
responseHeaders: []
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
configure(config);
|
|
37
73
|
}
|
|
38
|
-
export function createNavigationIntegrationWithConfig() {
|
|
74
|
+
export function createNavigationIntegrationWithConfig(options) {
|
|
39
75
|
if (!isSupportedPlatform()) {
|
|
40
76
|
return {
|
|
41
|
-
registerNavigationContainer: _ => {}
|
|
77
|
+
registerNavigationContainer: _ => () => {},
|
|
78
|
+
markContentReady: () => {}
|
|
42
79
|
};
|
|
43
80
|
}
|
|
44
81
|
if (!currentConfig.autoDetectNavigation) {
|
|
45
82
|
console.warn('[Pulse Navigation] auto-detection disabled via Pulse.start; createNavigationIntegration() returning no-op.');
|
|
46
83
|
const noop = {
|
|
47
|
-
registerNavigationContainer: _ => {
|
|
84
|
+
registerNavigationContainer: _ => () => {
|
|
48
85
|
console.warn('[Pulse Navigation] auto-detection disabled via Pulse.start; registerNavigationContainer() returning no-op.');
|
|
49
|
-
}
|
|
86
|
+
},
|
|
87
|
+
markContentReady: () => {}
|
|
50
88
|
};
|
|
51
89
|
return noop;
|
|
52
90
|
}
|
|
53
|
-
return createReactNavigationIntegration();
|
|
91
|
+
return createReactNavigationIntegration(options);
|
|
54
92
|
}
|
|
55
93
|
//# sourceMappingURL=config.js.map
|
package/lib/module/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["setupErrorHandler","isSupportedPlatform","createReactNavigationIntegration","initializeNetworkInterceptor","defaultConfig","autoDetectExceptions","autoDetectNavigation","autoDetectNetwork","currentConfig","configure","config","start","options","createNavigationIntegrationWithConfig","registerNavigationContainer","_","console","warn","noop"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,mBAAgB;AAClD,SAASC,mBAAmB,QAAQ,qBAAkB;AACtD,SACEC,gCAAgC,
|
|
1
|
+
{"version":3,"names":["setupErrorHandler","isSupportedPlatform","createReactNavigationIntegration","initializeNetworkInterceptor","PulseReactNativeOtel","PULSE_FEATURE_NAMES","defaultConfig","autoDetectExceptions","autoDetectNavigation","autoDetectNetwork","networkHeaders","requestHeaders","responseHeaders","currentConfig","cachedFeatures","getFeaturesFromRemoteConfig","undefined","getAllFeatures","configure","config","resolveFeatureState","features","featureName","optionValue","resolveNavigationState","hasAny","SCREEN_SESSION","RN_SCREEN_LOAD","RN_SCREEN_INTERACTIVE","start","options","JS_CRASH","NETWORK_INSTRUMENTATION","createNavigationIntegrationWithConfig","registerNavigationContainer","_","markContentReady","console","warn","noop"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Pulse","jsx","_jsx","UNKNOWN_COMPONENT","COMPONENT_STACK_UNAVAILABLE","INITIAL_STATE","componentStack","error","ErrorBoundary","Component","state","componentDidCatch","errorInfo","onError","props","handled","fallback","errorToReport","Error","String","reportException","setState","render","children","element","createElement","isValidElement","withErrorBoundary","WrappedComponent","errorBoundaryOptions","componentDisplayName","displayName","name","Wrapped","memo"],"sourceRoot":"../../src","sources":["errorBoundary.tsx"],"mappings":";;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,KAAK,QAAQ,YAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEhC,OAAO,MAAMC,iBAAiB,GAAG,SAAS;AAC1C,MAAMC,2BAA2B,GAAG,+BAA+B;AAuBnE,MAAMC,aAAiC,GAAG;EACxCC,cAAc,EAAE,IAAI;EACpBC,KAAK,EAAE;AACT,CAAC;AAED,OAAO,MAAMC,aAAa,SAAST,KAAK,CAACU,SAAS,
|
|
1
|
+
{"version":3,"names":["React","Pulse","jsx","_jsx","UNKNOWN_COMPONENT","COMPONENT_STACK_UNAVAILABLE","INITIAL_STATE","componentStack","error","ErrorBoundary","Component","state","componentDidCatch","errorInfo","onError","props","handled","fallback","errorToReport","Error","String","reportException","setState","render","children","element","createElement","isValidElement","withErrorBoundary","WrappedComponent","errorBoundaryOptions","componentDisplayName","displayName","name","Wrapped","memo"],"sourceRoot":"../../src","sources":["errorBoundary.tsx"],"mappings":";;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,KAAK,QAAQ,YAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEhC,OAAO,MAAMC,iBAAiB,GAAG,SAAS;AAC1C,MAAMC,2BAA2B,GAAG,+BAA+B;AAuBnE,MAAMC,aAAiC,GAAG;EACxCC,cAAc,EAAE,IAAI;EACpBC,KAAK,EAAE;AACT,CAAC;AAED,OAAO,MAAMC,aAAa,SAAST,KAAK,CAACU,SAAS,CAGhD;EACOC,KAAK,GAAuBL,aAAa;EAEzCM,iBAAiBA,CAACJ,KAAc,EAAEK,SAA0B,EAAQ;IACzE,MAAMN,cAAc,GAClBM,SAAS,CAACN,cAAc,IAAIF,2BAA2B;IACzD,MAAM;MAAES;IAAQ,CAAC,GAAG,IAAI,CAACC,KAAK;;IAE9B;IACA,MAAMC,OAAO,GAAG,CAAC,CAAC,IAAI,CAACD,KAAK,CAACE,QAAQ;IAErC,MAAMC,aAAa,GACjBV,KAAK,YAAYW,KAAK,GAAGX,KAAK,GAAG,IAAIW,KAAK,CAACC,MAAM,CAACZ,KAAK,CAAC,CAAC;IAC3DP,KAAK,CAACoB,eAAe,CAACH,aAAa,EAAE,CAACF,OAAO,CAAC;IAE9C,IAAIF,OAAO,EAAE;MACXA,OAAO,CAACN,KAAK,EAAED,cAAc,CAAC;IAChC;IAEA,IAAI,CAACe,QAAQ,CAAC;MAAEd,KAAK;MAAED;IAAe,CAAC,CAAC;EAC1C;EAEOgB,MAAMA,CAAA,EAAoB;IAC/B,MAAM;MAAEN,QAAQ;MAAEO;IAAS,CAAC,GAAG,IAAI,CAACT,KAAK;IACzC,MAAMJ,KAAK,GAAG,IAAI,CAACA,KAAK;IAExB,IAAIA,KAAK,CAACJ,cAAc,KAAK,IAAI,EAAE;MACjC,OAAO,OAAOiB,QAAQ,KAAK,UAAU,GAAGA,QAAQ,CAAC,CAAC,GAAGA,QAAQ;IAC/D;IAEA,MAAMC,OAAO,GACX,OAAOR,QAAQ,KAAK,UAAU,gBAC1BjB,KAAK,CAAC0B,aAAa,CAACT,QAAQ,EAAE;MAC5BT,KAAK,EAAEG,KAAK,CAACH,KAAK;MAClBD,cAAc,EAAEI,KAAK,CAACJ;IACxB,CAAC,CAAC,GACFU,QAAQ;IAEd,iBAAIjB,KAAK,CAAC2B,cAAc,CAACF,OAAO,CAAC,EAAE;MACjC,OAAOA,OAAO;IAChB;IAEA,OAAO,IAAI;EACb;AACF;AAEA,OAAO,SAASG,iBAAiBA,CAC/BC,gBAAwC,EACxCC,oBAAwC,EAC3B;EACb,MAAMC,oBAAoB,GACxBF,gBAAgB,CAACG,WAAW,IAAIH,gBAAgB,CAACI,IAAI,IAAI7B,iBAAiB;EAE5E,MAAM8B,OAAO,gBAAGlC,KAAK,CAACmC,IAAI,CAAEpB,KAAQ,iBAClCZ,IAAA,CAACM,aAAa;IAAA,GAAKqB,oBAAoB;IAAAN,QAAA,eACrCrB,IAAA,CAAC0B,gBAAgB;MAAA,GAAKd;IAAK,CAAG;EAAC,CAClB,CAChB,CAA2B;EAE5BmB,OAAO,CAACF,WAAW,GAAG,iBAAiBD,oBAAoB,GAAG;EAE9D,OAAOG,OAAO;AAChB","ignoreList":[]}
|
package/lib/module/events.js
CHANGED
|
@@ -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);
|
package/lib/module/events.js.map
CHANGED
|
@@ -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;
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
16
|
+
useNavigationTracking,
|
|
17
|
+
markContentReady,
|
|
16
18
|
trackEvent,
|
|
17
19
|
reportException,
|
|
18
20
|
trackSpan,
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["startSpan","trackSpan","reportException","trackEvent","start","
|
|
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,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { AppState } from 'react-native';
|
|
4
|
+
import { DEFAULT_NAVIGATION_OPTIONS } from "./navigation.interface.js";
|
|
5
|
+
import { pushRecentRouteKey, LOG_TAGS } from "./utils.js";
|
|
6
|
+
import { discardSpan } from "../trace.js";
|
|
7
|
+
import { createScreenLoadTracker, INITIAL_SCREEN_LOAD_STATE } from "./screen-load.js";
|
|
8
|
+
import { createScreenInteractiveTracker, markContentReady, clearGlobalMarkContentReady, INITIAL_SCREEN_INTERACTIVE_STATE } from "./screen-interactive.js";
|
|
9
|
+
import { createScreenSessionTracker, INITIAL_SCREEN_SESSION_STATE } from "./screen-session.js";
|
|
10
|
+
import { useNavigationTracking as useNavigationTrackingBase } from "./useNavigationTracking.js";
|
|
11
|
+
import { isSupportedPlatform } from "../initialization.js";
|
|
12
|
+
import PulseReactNativeOtel from "../NativePulseReactNativeOtel.js";
|
|
13
|
+
import { getFeaturesFromRemoteConfig } from "../config.js";
|
|
14
|
+
import { PULSE_FEATURE_NAMES } from "../pulse.constants.js";
|
|
15
|
+
export { DEFAULT_NAVIGATION_OPTIONS } from "./navigation.interface.js";
|
|
16
|
+
function resolveNavigationFeatureState(features, featureName, optionValue) {
|
|
17
|
+
if (features !== undefined && features !== null) return features[featureName] ?? optionValue;
|
|
18
|
+
return optionValue;
|
|
19
|
+
}
|
|
20
|
+
export function createReactNavigationIntegration(options) {
|
|
21
|
+
const features = getFeaturesFromRemoteConfig();
|
|
22
|
+
const screenSessionTracking = resolveNavigationFeatureState(features, PULSE_FEATURE_NAMES.SCREEN_SESSION, options?.screenSessionTracking ?? DEFAULT_NAVIGATION_OPTIONS.screenSessionTracking);
|
|
23
|
+
const screenNavigationTracking = resolveNavigationFeatureState(features, PULSE_FEATURE_NAMES.RN_SCREEN_LOAD, options?.screenNavigationTracking ?? DEFAULT_NAVIGATION_OPTIONS.screenNavigationTracking);
|
|
24
|
+
const screenInteractiveTracking = resolveNavigationFeatureState(features, PULSE_FEATURE_NAMES.RN_SCREEN_INTERACTIVE, options?.screenInteractiveTracking ?? DEFAULT_NAVIGATION_OPTIONS.screenInteractiveTracking);
|
|
25
|
+
let navigationContainer;
|
|
26
|
+
let recentRouteKeys = [];
|
|
27
|
+
let isInitialized = false;
|
|
28
|
+
let appStateSubscription;
|
|
29
|
+
const screenLoadState = {
|
|
30
|
+
...INITIAL_SCREEN_LOAD_STATE
|
|
31
|
+
};
|
|
32
|
+
const screenInteractiveState = {
|
|
33
|
+
...INITIAL_SCREEN_INTERACTIVE_STATE
|
|
34
|
+
};
|
|
35
|
+
const screenSessionState = {
|
|
36
|
+
...INITIAL_SCREEN_SESSION_STATE
|
|
37
|
+
};
|
|
38
|
+
const screenInteractiveTracker = createScreenInteractiveTracker(screenInteractiveTracking, screenInteractiveState, navigationContainer);
|
|
39
|
+
const screenLoadTracker = createScreenLoadTracker(screenNavigationTracking, screenLoadState, () => recentRouteKeys, key => {
|
|
40
|
+
recentRouteKeys = pushRecentRouteKey(recentRouteKeys, key);
|
|
41
|
+
}, undefined);
|
|
42
|
+
const screenSessionTracker = createScreenSessionTracker(screenSessionTracking, screenSessionState);
|
|
43
|
+
const setCurrentScreenName = screenName => {
|
|
44
|
+
if (isSupportedPlatform()) {
|
|
45
|
+
PulseReactNativeOtel.setCurrentScreenName(screenName);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const onNavigationDispatch = () => {
|
|
49
|
+
try {
|
|
50
|
+
if (screenInteractiveTracking) {
|
|
51
|
+
screenInteractiveTracker.discardScreenInteractive('user navigated away');
|
|
52
|
+
}
|
|
53
|
+
if (screenSessionTracking && screenSessionState.screenSessionSpan && navigationContainer) {
|
|
54
|
+
const currentRoute = navigationContainer.getCurrentRoute();
|
|
55
|
+
screenSessionTracker.endScreenSession(currentRoute?.name);
|
|
56
|
+
}
|
|
57
|
+
screenLoadTracker.startNavigationSpan();
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.warn(`${LOG_TAGS.NAVIGATION} Error in onNavigationDispatch:`, error);
|
|
60
|
+
if (screenLoadState.navigationSpan?.spanId) {
|
|
61
|
+
discardSpan(screenLoadState.navigationSpan.spanId);
|
|
62
|
+
screenLoadState.navigationSpan = undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const onStateChange = () => {
|
|
67
|
+
try {
|
|
68
|
+
if (!navigationContainer) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const currentRoute = navigationContainer.getCurrentRoute();
|
|
72
|
+
if (!currentRoute) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (currentRoute.name) {
|
|
76
|
+
setCurrentScreenName(currentRoute.name);
|
|
77
|
+
}
|
|
78
|
+
screenLoadTracker.handleStateChange(currentRoute);
|
|
79
|
+
const appState = AppState.currentState;
|
|
80
|
+
if (appState && screenSessionTracker.shouldStartSession(currentRoute, appState)) {
|
|
81
|
+
screenSessionTracker.startScreenSession(currentRoute);
|
|
82
|
+
}
|
|
83
|
+
if (screenInteractiveTracking) {
|
|
84
|
+
screenInteractiveTracker.startScreenInteractive(currentRoute);
|
|
85
|
+
}
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.warn(`${LOG_TAGS.NAVIGATION} Error in onStateChange:`, error);
|
|
88
|
+
if (screenLoadState.navigationSpan?.spanId) {
|
|
89
|
+
discardSpan(screenLoadState.navigationSpan.spanId);
|
|
90
|
+
screenLoadState.navigationSpan = undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const handleAppStateChange = nextAppState => {
|
|
95
|
+
try {
|
|
96
|
+
screenSessionTracker.handleAppStateChange(nextAppState, navigationContainer);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.warn(`${LOG_TAGS.NAVIGATION} Error in handleAppStateChange:`, error);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const registerNavigationContainer = maybeNavigationContainer => {
|
|
102
|
+
try {
|
|
103
|
+
let container;
|
|
104
|
+
if (typeof maybeNavigationContainer === 'object' && maybeNavigationContainer !== null && 'current' in maybeNavigationContainer) {
|
|
105
|
+
container = maybeNavigationContainer.current;
|
|
106
|
+
} else {
|
|
107
|
+
container = maybeNavigationContainer;
|
|
108
|
+
}
|
|
109
|
+
if (!container) {
|
|
110
|
+
console.warn(`${LOG_TAGS.NAVIGATION} Invalid navigation container ref`);
|
|
111
|
+
return () => {};
|
|
112
|
+
}
|
|
113
|
+
if (isInitialized && navigationContainer === container) {
|
|
114
|
+
return () => {
|
|
115
|
+
if (screenSessionTracking && screenSessionState.screenSessionSpan) {
|
|
116
|
+
const currentRoute = container.getCurrentRoute();
|
|
117
|
+
screenSessionTracker.endScreenSession(currentRoute?.name);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
navigationContainer = container;
|
|
122
|
+
const updatedInteractiveTracker = createScreenInteractiveTracker(screenInteractiveTracking, screenInteractiveState, navigationContainer);
|
|
123
|
+
navigationContainer.addListener('__unsafe_action__', onNavigationDispatch);
|
|
124
|
+
navigationContainer.addListener('state', onStateChange);
|
|
125
|
+
const unmountCleanup = () => {
|
|
126
|
+
if (screenSessionTracking && screenSessionState.screenSessionSpan) {
|
|
127
|
+
const currentRoute = container.getCurrentRoute();
|
|
128
|
+
screenSessionTracker.endScreenSession(currentRoute?.name);
|
|
129
|
+
}
|
|
130
|
+
if (screenInteractiveTracking) {
|
|
131
|
+
screenInteractiveTracker.discardScreenInteractive('navigation container unmounted');
|
|
132
|
+
}
|
|
133
|
+
screenLoadTracker.endNavigationSpan();
|
|
134
|
+
if (navigationContainer === container) {
|
|
135
|
+
if (appStateSubscription) {
|
|
136
|
+
appStateSubscription.remove();
|
|
137
|
+
appStateSubscription = undefined;
|
|
138
|
+
}
|
|
139
|
+
navigationContainer = undefined;
|
|
140
|
+
isInitialized = false;
|
|
141
|
+
clearGlobalMarkContentReady(updatedInteractiveTracker.markContentReady);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const currentRoute = container.getCurrentRoute();
|
|
145
|
+
if (currentRoute) {
|
|
146
|
+
screenLoadState.latestRoute = currentRoute;
|
|
147
|
+
recentRouteKeys = pushRecentRouteKey(recentRouteKeys, currentRoute.key);
|
|
148
|
+
if (currentRoute.name) {
|
|
149
|
+
setCurrentScreenName(currentRoute.name);
|
|
150
|
+
}
|
|
151
|
+
const appState = AppState.currentState;
|
|
152
|
+
if (appState && screenSessionTracker.shouldStartSession(currentRoute, appState)) {
|
|
153
|
+
screenSessionTracker.startScreenSession(currentRoute);
|
|
154
|
+
}
|
|
155
|
+
if (screenInteractiveTracking) {
|
|
156
|
+
updatedInteractiveTracker.startScreenInteractive(currentRoute);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
appStateSubscription = AppState.addEventListener('change', handleAppStateChange);
|
|
160
|
+
isInitialized = true;
|
|
161
|
+
return unmountCleanup;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.error(`${LOG_TAGS.NAVIGATION} Error registering container:`, error);
|
|
164
|
+
return () => {};
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
return {
|
|
168
|
+
registerNavigationContainer,
|
|
169
|
+
markContentReady: screenInteractiveTracker.markContentReady
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export { markContentReady };
|
|
173
|
+
export function useNavigationTracking(navigationRef, options) {
|
|
174
|
+
const {
|
|
175
|
+
createNavigationIntegrationWithConfig
|
|
176
|
+
} = require('../config');
|
|
177
|
+
return useNavigationTrackingBase(navigationRef, options, createNavigationIntegrationWithConfig);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AppState","DEFAULT_NAVIGATION_OPTIONS","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","PULSE_FEATURE_NAMES","resolveNavigationFeatureState","features","featureName","optionValue","undefined","createReactNavigationIntegration","options","screenSessionTracking","SCREEN_SESSION","screenNavigationTracking","RN_SCREEN_LOAD","screenInteractiveTracking","RN_SCREEN_INTERACTIVE","navigationContainer","recentRouteKeys","isInitialized","appStateSubscription","screenLoadState","screenInteractiveState","screenSessionState","screenInteractiveTracker","screenLoadTracker","key","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 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_NAVIGATION_OPTIONS","screenSessionTracking","screenNavigationTracking","screenInteractiveTracking"],"sourceRoot":"../../../src","sources":["navigation/navigation.interface.ts"],"mappings":";;AAoBA,OAAO,MAAMA,0BAAkE,GAC7E;EACEC,qBAAqB,EAAE,IAAI;EAC3BC,wBAAwB,EAAE,IAAI;EAC9BC,yBAAyB,EAAE;AAC7B,CAAC","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,67 @@
|
|
|
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_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.PLATFORM]: Platform.OS
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
console.log(`${LOG_TAGS.SCREEN_LOAD} started`);
|
|
23
|
+
};
|
|
24
|
+
const endNavigationSpan = (currentRoute, previousRoute, routeHasBeenSeen) => {
|
|
25
|
+
if (state.navigationSpan) {
|
|
26
|
+
const route = currentRoute || state.latestRoute;
|
|
27
|
+
if (route) {
|
|
28
|
+
const hasBeenSeen = routeHasBeenSeen !== undefined ? routeHasBeenSeen : getRecentRouteKeys().includes(route.key);
|
|
29
|
+
state.navigationSpan.setAttributes({
|
|
30
|
+
[ATTRIBUTE_KEYS.SCREEN_NAME]: route.name,
|
|
31
|
+
[ATTRIBUTE_KEYS.LAST_SCREEN_NAME]: previousRoute?.name || undefined,
|
|
32
|
+
[ATTRIBUTE_KEYS.ROUTE_HAS_BEEN_SEEN]: hasBeenSeen,
|
|
33
|
+
[ATTRIBUTE_KEYS.ROUTE_KEY]: route.key
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
state.navigationSpan.end();
|
|
37
|
+
state.navigationSpan = undefined;
|
|
38
|
+
if (route) {
|
|
39
|
+
console.log(`${LOG_TAGS.SCREEN_LOAD} ${route.name} ended`);
|
|
40
|
+
if (onLoadEnd) {
|
|
41
|
+
onLoadEnd(route);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const handleStateChange = currentRoute => {
|
|
47
|
+
if (!enabled || !state.navigationSpan) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const previousRoute = state.latestRoute;
|
|
51
|
+
if (previousRoute && previousRoute.key === currentRoute.key) {
|
|
52
|
+
const routeHasBeenSeen = getRecentRouteKeys().includes(currentRoute.key);
|
|
53
|
+
endNavigationSpan(currentRoute, previousRoute, routeHasBeenSeen);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const routeHasBeenSeen = getRecentRouteKeys().includes(currentRoute.key);
|
|
57
|
+
state.latestRoute = currentRoute;
|
|
58
|
+
pushRecentRouteKey(currentRoute.key);
|
|
59
|
+
endNavigationSpan(currentRoute, previousRoute, routeHasBeenSeen);
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
startNavigationSpan,
|
|
63
|
+
endNavigationSpan,
|
|
64
|
+
handleStateChange
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=screen-load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Pulse","Platform","SPAN_NAMES","ATTRIBUTE_KEYS","PULSE_TYPES","LOG_TAGS","INITIAL_SCREEN_LOAD_STATE","navigationSpan","undefined","latestRoute","createScreenLoadTracker","enabled","state","getRecentRouteKeys","pushRecentRouteKey","onLoadEnd","startNavigationSpan","startSpan","NAVIGATED","attributes","PULSE_TYPE","SCREEN_LOAD","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":"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","ignoreList":[]}
|