@dreamhorizonorg/pulse-react-native 0.0.2 → 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/android/build.gradle +1 -1
- package/android/src/main/java/com/pulsereactnativeotel/Pulse.kt +2 -0
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelModule.kt +40 -24
- package/lib/module/NativePulseReactNativeOtel.js.map +1 -1
- package/lib/module/config.js +36 -18
- package/lib/module/config.js.map +1 -1
- package/lib/module/navigation/index.js +10 -3
- package/lib/module/navigation/index.js.map +1 -1
- package/lib/module/navigation/navigation.interface.js +6 -0
- package/lib/module/navigation/navigation.interface.js.map +1 -1
- package/lib/module/navigation/screen-load.js +1 -2
- package/lib/module/navigation/screen-load.js.map +1 -1
- package/lib/module/navigation/useNavigationTracking.js +4 -3
- package/lib/module/navigation/useNavigationTracking.js.map +1 -1
- 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 +59 -3
- package/lib/module/network-interceptor/request-tracker-xhr.js.map +1 -1
- package/lib/module/network-interceptor/span-helpers.js +15 -3
- package/lib/module/network-interceptor/span-helpers.js.map +1 -1
- package/lib/module/pulse.constants.js +11 -6
- package/lib/module/pulse.constants.js.map +1 -1
- package/lib/typescript/src/NativePulseReactNativeOtel.d.ts +8 -1
- package/lib/typescript/src/NativePulseReactNativeOtel.d.ts.map +1 -1
- package/lib/typescript/src/config.d.ts +7 -7
- package/lib/typescript/src/config.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/navigation/index.d.ts +1 -0
- package/lib/typescript/src/navigation/index.d.ts.map +1 -1
- package/lib/typescript/src/navigation/navigation.interface.d.ts +1 -0
- package/lib/typescript/src/navigation/navigation.interface.d.ts.map +1 -1
- package/lib/typescript/src/navigation/screen-load.d.ts.map +1 -1
- package/lib/typescript/src/navigation/useNavigationTracking.d.ts +1 -1
- package/lib/typescript/src/navigation/useNavigationTracking.d.ts.map +1 -1
- 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.map +1 -1
- package/lib/typescript/src/pulse.constants.d.ts +13 -5
- package/lib/typescript/src/pulse.constants.d.ts.map +1 -1
- package/lib/typescript/src/pulse.interface.d.ts +1 -1
- package/lib/typescript/src/pulse.interface.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/NativePulseReactNativeOtel.ts +8 -1
- package/src/config.ts +68 -26
- package/src/index.tsx +1 -1
- package/src/navigation/index.ts +36 -7
- package/src/navigation/navigation.interface.ts +7 -0
- package/src/navigation/screen-load.ts +1 -7
- package/src/navigation/useNavigationTracking.ts +13 -4
- 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 +90 -2
- package/src/network-interceptor/span-helpers.ts +23 -3
- package/src/pulse.constants.ts +19 -5
- package/src/pulse.interface.ts +1 -1
package/android/build.gradle
CHANGED
|
@@ -27,6 +27,7 @@ public object Pulse : PulseSDK by PulseSDK.INSTANCE {
|
|
|
27
27
|
spanEndpointConnectivity: EndpointConnectivity,
|
|
28
28
|
logEndpointConnectivity: EndpointConnectivity,
|
|
29
29
|
metricEndpointConnectivity: EndpointConnectivity,
|
|
30
|
+
customEventConnectivity: EndpointConnectivity,
|
|
30
31
|
resource: (ResourceBuilder.() -> Unit)?,
|
|
31
32
|
sessionConfig: SessionConfig,
|
|
32
33
|
globalAttributes: (() -> Attributes)?,
|
|
@@ -74,6 +75,7 @@ public object Pulse : PulseSDK by PulseSDK.INSTANCE {
|
|
|
74
75
|
spanEndpointConnectivity = spanEndpointConnectivity,
|
|
75
76
|
logEndpointConnectivity = logEndpointConnectivity,
|
|
76
77
|
metricEndpointConnectivity = metricEndpointConnectivity,
|
|
78
|
+
customEventConnectivity = customEventConnectivity,
|
|
77
79
|
resource = rnResource,
|
|
78
80
|
sessionConfig = sessionConfig,
|
|
79
81
|
globalAttributes = globalAttributes,
|
|
@@ -96,36 +96,52 @@ internal class PulseReactNativeOtelModule(reactContext: ReactApplicationContext)
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
override fun getAllFeatures(): WritableMap {
|
|
99
|
+
override fun getAllFeatures(): WritableMap? {
|
|
100
|
+
val context = reactApplicationContext
|
|
101
|
+
val sharedPrefs = context.getSharedPreferences(
|
|
102
|
+
"pulse_sdk_config",
|
|
103
|
+
Context.MODE_PRIVATE
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
val configJson = sharedPrefs.getString("sdk_config", null)
|
|
107
|
+
if (configJson == null) {
|
|
108
|
+
return null
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
val json = Json {
|
|
112
|
+
ignoreUnknownKeys = true
|
|
113
|
+
isLenient = true
|
|
114
|
+
}
|
|
115
|
+
val config = json.decodeFromString<PulseSdkConfig>(configJson)
|
|
116
|
+
|
|
100
117
|
val features = Arguments.createMap()
|
|
118
|
+
val featureMap = mutableMapOf<String, Boolean>()
|
|
101
119
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
val configJson = sharedPrefs.getString("sdk_config", null)
|
|
109
|
-
if (configJson != null) {
|
|
110
|
-
val json = Json {
|
|
111
|
-
ignoreUnknownKeys = true
|
|
112
|
-
isLenient = true
|
|
120
|
+
config.features.forEach { featureConfig ->
|
|
121
|
+
if (PulseSdkName.ANDROID_RN in featureConfig.sdks) {
|
|
122
|
+
if (featureConfig.featureName == PulseFeatureName.UNKNOWN) {
|
|
123
|
+
return@forEach
|
|
113
124
|
}
|
|
114
|
-
val config = json.decodeFromString<PulseSdkConfig>(configJson)
|
|
115
125
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
126
|
+
val featureNameStr = featureConfig.featureName.name.lowercase()
|
|
127
|
+
val isEnabled = featureConfig.sessionSampleRate > 0F
|
|
128
|
+
featureMap[featureNameStr] = isEnabled
|
|
129
|
+
}
|
|
130
|
+
}
|
|
121
131
|
|
|
122
|
-
|
|
123
|
-
|
|
132
|
+
val requiredFeatures = listOf(
|
|
133
|
+
"rn_screen_load",
|
|
134
|
+
"screen_session",
|
|
135
|
+
"rn_screen_interactive",
|
|
136
|
+
"network_instrumentation",
|
|
137
|
+
"custom_events",
|
|
138
|
+
"js_crash"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
requiredFeatures.forEach { featureName ->
|
|
142
|
+
features.putBoolean(featureName, featureMap[featureName] ?: false)
|
|
143
|
+
}
|
|
124
144
|
|
|
125
|
-
features.putBoolean(featureNameStr, isEnabled)
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
145
|
return features
|
|
130
146
|
}
|
|
131
147
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativePulseReactNativeOtel.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativePulseReactNativeOtel.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAwEpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,sBAAsB,CAAC","ignoreList":[]}
|
package/lib/module/config.js
CHANGED
|
@@ -5,28 +5,32 @@ import { isSupportedPlatform } from "./initialization.js";
|
|
|
5
5
|
import { createReactNavigationIntegration } from "./navigation/index.js";
|
|
6
6
|
import { initializeNetworkInterceptor } from "./network-interceptor/initialization.js";
|
|
7
7
|
import PulseReactNativeOtel from "./NativePulseReactNativeOtel.js";
|
|
8
|
+
import { PULSE_FEATURE_NAMES } from "./pulse.constants.js";
|
|
8
9
|
const defaultConfig = {
|
|
9
10
|
autoDetectExceptions: true,
|
|
10
11
|
autoDetectNavigation: true,
|
|
11
|
-
autoDetectNetwork: true
|
|
12
|
+
autoDetectNetwork: true,
|
|
13
|
+
networkHeaders: {
|
|
14
|
+
requestHeaders: [],
|
|
15
|
+
responseHeaders: []
|
|
16
|
+
}
|
|
12
17
|
};
|
|
13
18
|
let currentConfig = {
|
|
14
19
|
...defaultConfig
|
|
15
20
|
};
|
|
16
21
|
|
|
17
22
|
// Cache for features from remote SDK config
|
|
18
|
-
let cachedFeatures
|
|
23
|
+
let cachedFeatures;
|
|
19
24
|
|
|
20
25
|
/**
|
|
21
26
|
* Gets all features from the remote SDK config.
|
|
22
|
-
* @returns Record of feature names to their enabled status
|
|
27
|
+
* @returns Record of feature names to their enabled status, or null if config not available
|
|
23
28
|
*/
|
|
24
29
|
export function getFeaturesFromRemoteConfig() {
|
|
25
|
-
if (cachedFeatures !==
|
|
30
|
+
if (cachedFeatures !== undefined) {
|
|
26
31
|
return cachedFeatures;
|
|
27
32
|
}
|
|
28
|
-
|
|
29
|
-
cachedFeatures = features;
|
|
33
|
+
cachedFeatures = PulseReactNativeOtel.getAllFeatures();
|
|
30
34
|
return cachedFeatures;
|
|
31
35
|
}
|
|
32
36
|
function configure(config) {
|
|
@@ -36,22 +40,36 @@ function configure(config) {
|
|
|
36
40
|
};
|
|
37
41
|
setupErrorHandler(currentConfig.autoDetectExceptions ?? true);
|
|
38
42
|
if (currentConfig.autoDetectNetwork) {
|
|
39
|
-
initializeNetworkInterceptor(
|
|
43
|
+
initializeNetworkInterceptor(currentConfig.networkHeaders ?? {
|
|
44
|
+
requestHeaders: [],
|
|
45
|
+
responseHeaders: []
|
|
46
|
+
});
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
|
-
|
|
43
|
-
if (
|
|
44
|
-
|
|
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;
|
|
45
57
|
}
|
|
58
|
+
return optionValue;
|
|
59
|
+
}
|
|
60
|
+
export function start(options) {
|
|
61
|
+
if (!isSupportedPlatform()) return;
|
|
46
62
|
const features = getFeaturesFromRemoteConfig();
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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);
|
|
55
73
|
}
|
|
56
74
|
export function createNavigationIntegrationWithConfig(options) {
|
|
57
75
|
if (!isSupportedPlatform()) {
|
package/lib/module/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["setupErrorHandler","isSupportedPlatform","createReactNavigationIntegration","initializeNetworkInterceptor","PulseReactNativeOtel","defaultConfig","autoDetectExceptions","autoDetectNavigation","autoDetectNetwork","currentConfig","cachedFeatures","getFeaturesFromRemoteConfig","
|
|
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,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { AppState } from 'react-native';
|
|
4
|
+
import { DEFAULT_NAVIGATION_OPTIONS } from "./navigation.interface.js";
|
|
4
5
|
import { pushRecentRouteKey, LOG_TAGS } from "./utils.js";
|
|
5
6
|
import { discardSpan } from "../trace.js";
|
|
6
7
|
import { createScreenLoadTracker, INITIAL_SCREEN_LOAD_STATE } from "./screen-load.js";
|
|
@@ -10,11 +11,17 @@ import { useNavigationTracking as useNavigationTrackingBase } from "./useNavigat
|
|
|
10
11
|
import { isSupportedPlatform } from "../initialization.js";
|
|
11
12
|
import PulseReactNativeOtel from "../NativePulseReactNativeOtel.js";
|
|
12
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
|
+
}
|
|
13
20
|
export function createReactNavigationIntegration(options) {
|
|
14
21
|
const features = getFeaturesFromRemoteConfig();
|
|
15
|
-
const screenSessionTracking = features
|
|
16
|
-
const screenNavigationTracking = features
|
|
17
|
-
const screenInteractiveTracking = features
|
|
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);
|
|
18
25
|
let navigationContainer;
|
|
19
26
|
let recentRouteKeys = [];
|
|
20
27
|
let isInitialized = false;
|
|
@@ -1 +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","
|
|
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":";;AAAA,SAASA,QAAQ,QAA6B,cAAc;AAO5D,SAASC,0BAA0B,QAAQ,2BAAwB;AACnE,SAASC,kBAAkB,EAAEC,QAAQ,QAAQ,YAAS;AACtD,SAASC,WAAW,QAAQ,aAAU;AACtC,SACEC,uBAAuB,EAEvBC,yBAAyB,QACpB,kBAAe;AACtB,SACEC,8BAA8B,EAC9BC,gBAAgB,EAChBC,2BAA2B,EAE3BC,gCAAgC,QAC3B,yBAAsB;AAC7B,SACEC,0BAA0B,EAE1BC,4BAA4B,QACvB,qBAAkB;AACzB,SAASC,qBAAqB,IAAIC,yBAAyB,QAAQ,4BAAyB;AAC5F,SAASC,mBAAmB,QAAQ,sBAAmB;AACvD,OAAOC,oBAAoB,MAAM,kCAA+B;AAChE,SAASC,2BAA2B,QAAQ,cAAW;AACvD,SACEC,mBAAmB,QAEd,uBAAoB;AAG3B,SAASjB,0BAA0B,QAAQ,2BAAwB;AASnE,SAASkB,6BAA6BA,CACpCC,QAAwD,EACxDC,WAAkC,EAClCC,WAAoB,EACX;EACT,IAAIF,QAAQ,KAAKG,SAAS,IAAIH,QAAQ,KAAK,IAAI,EAC7C,OAAOA,QAAQ,CAACC,WAAW,CAAC,IAAIC,WAAW;EAC7C,OAAOA,WAAW;AACpB;AAEA,OAAO,SAASE,gCAAgCA,CAC9CC,OAAsC,EACV;EAC5B,MAAML,QAAQ,GAAGH,2BAA2B,CAAC,CAAC;EAE9C,MAAMS,qBAAqB,GAAGP,6BAA6B,CACzDC,QAAQ,EACRF,mBAAmB,CAACS,cAAc,EAClCF,OAAO,EAAEC,qBAAqB,IAC5BzB,0BAA0B,CAACyB,qBAC/B,CAAC;EAED,MAAME,wBAAwB,GAAGT,6BAA6B,CAC5DC,QAAQ,EACRF,mBAAmB,CAACW,cAAc,EAClCJ,OAAO,EAAEG,wBAAwB,IAC/B3B,0BAA0B,CAAC2B,wBAC/B,CAAC;EAED,MAAME,yBAAyB,GAAGX,6BAA6B,CAC7DC,QAAQ,EACRF,mBAAmB,CAACa,qBAAqB,EACzCN,OAAO,EAAEK,yBAAyB,IAChC7B,0BAA0B,CAAC6B,yBAC/B,CAAC;EAED,IAAIE,mBAAoD;EACxD,IAAIC,eAAyB,GAAG,EAAE;EAClC,IAAIC,aAAa,GAAG,KAAK;EACzB,IAAIC,oBAAwD;EAE5D,MAAMC,eAAgC,GAAG;IACvC,GAAG9B;EACL,CAAC;EAED,MAAM+B,sBAA8C,GAAG;IACrD,GAAG3B;EACL,CAAC;EAED,MAAM4B,kBAAsC,GAAG;IAC7C,GAAG1B;EACL,CAAC;EAED,MAAM2B,wBAAwB,GAAGhC,8BAA8B,CAC7DuB,yBAAyB,EACzBO,sBAAsB,EACtBL,mBACF,CAAC;EAED,MAAMQ,iBAAiB,GAAGnC,uBAAuB,CAC/CuB,wBAAwB,EACxBQ,eAAe,EACf,MAAMH,eAAe,EACpBQ,GAAW,IAAK;IACfR,eAAe,GAAG/B,kBAAkB,CAAC+B,eAAe,EAAEQ,GAAG,CAAC;EAC5D,CAAC,EACDlB,SACF,CAAC;EAED,MAAMmB,oBAAoB,GAAG/B,0BAA0B,CACrDe,qBAAqB,EACrBY,kBACF,CAAC;EAED,MAAMK,oBAAoB,GAAIC,UAAkB,IAAW;IACzD,IAAI7B,mBAAmB,CAAC,CAAC,EAAE;MACzBC,oBAAoB,CAAC2B,oBAAoB,CAACC,UAAU,CAAC;IACvD;EACF,CAAC;EAED,MAAMC,oBAAoB,GAAGA,CAAA,KAAY;IACvC,IAAI;MACF,IAAIf,yBAAyB,EAAE;QAC7BS,wBAAwB,CAACO,wBAAwB,CAC/C,qBACF,CAAC;MACH;MAEA,IACEpB,qBAAqB,IACrBY,kBAAkB,CAACS,iBAAiB,IACpCf,mBAAmB,EACnB;QACA,MAAMgB,YAAY,GAAGhB,mBAAmB,CAACiB,eAAe,CAAC,CAAC;QAC1DP,oBAAoB,CAACQ,gBAAgB,CAACF,YAAY,EAAEG,IAAI,CAAC;MAC3D;MAEAX,iBAAiB,CAACY,mBAAmB,CAAC,CAAC;IACzC,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACC,IAAI,CACV,GAAGpD,QAAQ,CAACqD,UAAU,iCAAiC,EACvDH,KACF,CAAC;MAED,IAAIjB,eAAe,CAACqB,cAAc,EAAEC,MAAM,EAAE;QAC1CtD,WAAW,CAACgC,eAAe,CAACqB,cAAc,CAACC,MAAM,CAAC;QAClDtB,eAAe,CAACqB,cAAc,GAAGlC,SAAS;MAC5C;IACF;EACF,CAAC;EAED,MAAMoC,aAAa,GAAGA,CAAA,KAAY;IAChC,IAAI;MACF,IAAI,CAAC3B,mBAAmB,EAAE;QACxB;MACF;MAEA,MAAMgB,YAAY,GAAGhB,mBAAmB,CAACiB,eAAe,CAAC,CAAC;MAC1D,IAAI,CAACD,YAAY,EAAE;QACjB;MACF;MAEA,IAAIA,YAAY,CAACG,IAAI,EAAE;QACrBR,oBAAoB,CAACK,YAAY,CAACG,IAAI,CAAC;MACzC;MAEAX,iBAAiB,CAACoB,iBAAiB,CAACZ,YAAY,CAAC;MAEjD,MAAMa,QAAQ,GAAG7D,QAAQ,CAAC8D,YAA8B;MACxD,IACED,QAAQ,IACRnB,oBAAoB,CAACqB,kBAAkB,CAACf,YAAY,EAAEa,QAAQ,CAAC,EAC/D;QACAnB,oBAAoB,CAACsB,kBAAkB,CAAChB,YAAY,CAAC;MACvD;MAEA,IAAIlB,yBAAyB,EAAE;QAC7BS,wBAAwB,CAAC0B,sBAAsB,CAACjB,YAAY,CAAC;MAC/D;IACF,CAAC,CAAC,OAAOK,KAAK,EAAE;MACdC,OAAO,CAACC,IAAI,CAAC,GAAGpD,QAAQ,CAACqD,UAAU,0BAA0B,EAAEH,KAAK,CAAC;MACrE,IAAIjB,eAAe,CAACqB,cAAc,EAAEC,MAAM,EAAE;QAC1CtD,WAAW,CAACgC,eAAe,CAACqB,cAAc,CAACC,MAAM,CAAC;QAClDtB,eAAe,CAACqB,cAAc,GAAGlC,SAAS;MAC5C;IACF;EACF,CAAC;EAED,MAAM2C,oBAAoB,GAAIC,YAA4B,IAAW;IACnE,IAAI;MACFzB,oBAAoB,CAACwB,oBAAoB,CACvCC,YAAY,EACZnC,mBACF,CAAC;IACH,CAAC,CAAC,OAAOqB,KAAK,EAAE;MACdC,OAAO,CAACC,IAAI,CACV,GAAGpD,QAAQ,CAACqD,UAAU,iCAAiC,EACvDH,KACF,CAAC;IACH;EACF,CAAC;EAED,MAAMe,2BAA2B,GAC/BC,wBAAiC,IAChB;IACjB,IAAI;MACF,IAAIC,SAA0C;MAC9C,IACE,OAAOD,wBAAwB,KAAK,QAAQ,IAC5CA,wBAAwB,KAAK,IAAI,IACjC,SAAS,IAAIA,wBAAwB,EACrC;QACAC,SAAS,GAAGD,wBAAwB,CAACE,OAA8B;MACrE,CAAC,MAAM;QACLD,SAAS,GAAGD,wBAA+C;MAC7D;MAEA,IAAI,CAACC,SAAS,EAAE;QACdhB,OAAO,CAACC,IAAI,CAAC,GAAGpD,QAAQ,CAACqD,UAAU,mCAAmC,CAAC;QACvE,OAAO,MAAM,CAAC,CAAC;MACjB;MAEA,IAAItB,aAAa,IAAIF,mBAAmB,KAAKsC,SAAS,EAAE;QACtD,OAAO,MAAM;UACX,IAAI5C,qBAAqB,IAAIY,kBAAkB,CAACS,iBAAiB,EAAE;YACjE,MAAMC,YAAY,GAAGsB,SAAS,CAACrB,eAAe,CAAC,CAAC;YAChDP,oBAAoB,CAACQ,gBAAgB,CAACF,YAAY,EAAEG,IAAI,CAAC;UAC3D;QACF,CAAC;MACH;MAEAnB,mBAAmB,GAAGsC,SAAS;MAE/B,MAAME,yBAAyB,GAAGjE,8BAA8B,CAC9DuB,yBAAyB,EACzBO,sBAAsB,EACtBL,mBACF,CAAC;MAEDA,mBAAmB,CAACyC,WAAW,CAC7B,mBAAmB,EACnB5B,oBACF,CAAC;MACDb,mBAAmB,CAACyC,WAAW,CAAC,OAAO,EAAEd,aAAa,CAAC;MAEvD,MAAMe,cAAc,GAAGA,CAAA,KAAY;QACjC,IAAIhD,qBAAqB,IAAIY,kBAAkB,CAACS,iBAAiB,EAAE;UACjE,MAAMC,YAAY,GAAGsB,SAAS,CAACrB,eAAe,CAAC,CAAC;UAChDP,oBAAoB,CAACQ,gBAAgB,CAACF,YAAY,EAAEG,IAAI,CAAC;QAC3D;QAEA,IAAIrB,yBAAyB,EAAE;UAC7BS,wBAAwB,CAACO,wBAAwB,CAC/C,gCACF,CAAC;QACH;QAEAN,iBAAiB,CAACmC,iBAAiB,CAAC,CAAC;QAErC,IAAI3C,mBAAmB,KAAKsC,SAAS,EAAE;UACrC,IAAInC,oBAAoB,EAAE;YACxBA,oBAAoB,CAACyC,MAAM,CAAC,CAAC;YAC7BzC,oBAAoB,GAAGZ,SAAS;UAClC;UACAS,mBAAmB,GAAGT,SAAS;UAC/BW,aAAa,GAAG,KAAK;UAErBzB,2BAA2B,CACzB+D,yBAAyB,CAAChE,gBAC5B,CAAC;QACH;MACF,CAAC;MAED,MAAMwC,YAAY,GAAGsB,SAAS,CAACrB,eAAe,CAAC,CAAC;MAChD,IAAID,YAAY,EAAE;QAChBZ,eAAe,CAACyC,WAAW,GAAG7B,YAAY;QAC1Cf,eAAe,GAAG/B,kBAAkB,CAAC+B,eAAe,EAAEe,YAAY,CAACP,GAAG,CAAC;QACvE,IAAIO,YAAY,CAACG,IAAI,EAAE;UACrBR,oBAAoB,CAACK,YAAY,CAACG,IAAI,CAAC;QACzC;QAEA,MAAMU,QAAQ,GAAG7D,QAAQ,CAAC8D,YAA8B;QACxD,IACED,QAAQ,IACRnB,oBAAoB,CAACqB,kBAAkB,CAACf,YAAY,EAAEa,QAAQ,CAAC,EAC/D;UACAnB,oBAAoB,CAACsB,kBAAkB,CAAChB,YAAY,CAAC;QACvD;QAEA,IAAIlB,yBAAyB,EAAE;UAC7B0C,yBAAyB,CAACP,sBAAsB,CAACjB,YAAY,CAAC;QAChE;MACF;MAEAb,oBAAoB,GAAGnC,QAAQ,CAAC8E,gBAAgB,CAC9C,QAAQ,EACRZ,oBACF,CAAC;MACDhC,aAAa,GAAG,IAAI;MAEpB,OAAOwC,cAAc;IACvB,CAAC,CAAC,OAAOrB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CACX,GAAGlD,QAAQ,CAACqD,UAAU,+BAA+B,EACrDH,KACF,CAAC;MACD,OAAO,MAAM,CAAC,CAAC;IACjB;EACF,CAAC;EAED,OAAO;IACLe,2BAA2B;IAC3B5D,gBAAgB,EAAE+B,wBAAwB,CAAC/B;EAC7C,CAAC;AACH;AAEA,SAASA,gBAAgB;AAEzB,OAAO,SAASK,qBAAqBA,CACnCkE,aAA6B,EAC7BtD,OAAsC,EAC1B;EACZ,MAAM;IAAEuD;EAAsC,CAAC,GAAGC,OAAO,CAAC,WAAW,CAAC;EACtE,OAAOnE,yBAAyB,CAC9BiE,aAAa,EACbtD,OAAO,EACPuD,qCACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["navigation/navigation.interface.ts"],"mappings":"","ignoreList":[]}
|
|
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":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { Pulse } from "../index.js";
|
|
4
4
|
import { Platform } from 'react-native';
|
|
5
|
-
import { SPAN_NAMES, ATTRIBUTE_KEYS, PULSE_TYPES
|
|
5
|
+
import { SPAN_NAMES, ATTRIBUTE_KEYS, PULSE_TYPES } from "../pulse.constants.js";
|
|
6
6
|
import { LOG_TAGS } from "./utils.js";
|
|
7
7
|
export const INITIAL_SCREEN_LOAD_STATE = {
|
|
8
8
|
navigationSpan: undefined,
|
|
@@ -16,7 +16,6 @@ export function createScreenLoadTracker(enabled, state, getRecentRouteKeys, push
|
|
|
16
16
|
state.navigationSpan = Pulse.startSpan(SPAN_NAMES.NAVIGATED, {
|
|
17
17
|
attributes: {
|
|
18
18
|
[ATTRIBUTE_KEYS.PULSE_TYPE]: PULSE_TYPES.SCREEN_LOAD,
|
|
19
|
-
[ATTRIBUTE_KEYS.PHASE]: PHASE_VALUES.START,
|
|
20
19
|
[ATTRIBUTE_KEYS.PLATFORM]: Platform.OS
|
|
21
20
|
}
|
|
22
21
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Pulse","Platform","SPAN_NAMES","ATTRIBUTE_KEYS","PULSE_TYPES","
|
|
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":[]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { useRef, useCallback, useEffect, useMemo } from 'react';
|
|
4
|
+
import { DEFAULT_NAVIGATION_OPTIONS } from "./navigation.interface.js";
|
|
4
5
|
export function useNavigationTracking(navigationRef, options, createIntegration) {
|
|
5
|
-
const screenSessionTracking = options?.screenSessionTracking ??
|
|
6
|
-
const screenNavigationTracking = options?.screenNavigationTracking ??
|
|
7
|
-
const screenInteractiveTracking = options?.screenInteractiveTracking ??
|
|
6
|
+
const screenSessionTracking = options?.screenSessionTracking ?? DEFAULT_NAVIGATION_OPTIONS.screenSessionTracking;
|
|
7
|
+
const screenNavigationTracking = options?.screenNavigationTracking ?? DEFAULT_NAVIGATION_OPTIONS.screenNavigationTracking;
|
|
8
|
+
const screenInteractiveTracking = options?.screenInteractiveTracking ?? DEFAULT_NAVIGATION_OPTIONS.screenInteractiveTracking;
|
|
8
9
|
const integration = useMemo(() => {
|
|
9
10
|
if (createIntegration) {
|
|
10
11
|
return createIntegration({
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"names":["useRef","useCallback","useEffect","useMemo","DEFAULT_NAVIGATION_OPTIONS","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;AAC/E,SACEC,0BAA0B,QAErB,2BAAwB;AAG/B,OAAO,SAASC,qBAAqBA,CACnCC,aAA6B,EAC7BC,OAAsC,EACtCC,iBAE+B,EACnB;EACZ,MAAMC,qBAAqB,GACzBF,OAAO,EAAEE,qBAAqB,IAC9BL,0BAA0B,CAACK,qBAAqB;EAClD,MAAMC,wBAAwB,GAC5BH,OAAO,EAAEG,wBAAwB,IACjCN,0BAA0B,CAACM,wBAAwB;EACrD,MAAMC,yBAAyB,GAC7BJ,OAAO,EAAEI,yBAAyB,IAClCP,0BAA0B,CAACO,yBAAyB;EAEtD,MAAMC,WAAW,GAAGT,OAAO,CAAC,MAAM;IAChC,IAAIK,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,GAAGd,MAAM,CAAsB,IAAI,CAAC;EAEpDE,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACX,IAAIY,UAAU,CAACC,OAAO,EAAE;QACtBD,UAAU,CAACC,OAAO,CAAC,CAAC;MACtB;IACF,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,OAAO,GAAGf,WAAW,CAAC,MAAM;IAChC,IAAIK,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,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes header name according to OpenTelemetry HTTP semantic conventions:
|
|
5
|
+
* - Lowercase
|
|
6
|
+
* - Dashes replaced by underscores
|
|
7
|
+
* - Reference: https://opentelemetry.io/docs/specs/semconv/registry/attributes/http/
|
|
8
|
+
* @example
|
|
9
|
+
* normalizeHeaderName('Content-Type') => 'content_type'
|
|
10
|
+
* normalizeHeaderName('X-Request-ID') => 'x_request_id'
|
|
11
|
+
*/
|
|
12
|
+
export function normalizeHeaderName(headerName) {
|
|
13
|
+
return headerName.toLowerCase().replace(/-/g, '_');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Checks if a header should be captured based on configuration.
|
|
18
|
+
*/
|
|
19
|
+
export function shouldCaptureHeader(headerName, headerList) {
|
|
20
|
+
if (headerList.length === 0) return false;
|
|
21
|
+
// Case-insensitive comparison
|
|
22
|
+
return headerList.some(configHeader => configHeader.toLowerCase() === headerName.toLowerCase());
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=header-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["normalizeHeaderName","headerName","toLowerCase","replace","shouldCaptureHeader","headerList","length","some","configHeader"],"sourceRoot":"../../../src","sources":["network-interceptor/header-helper.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,mBAAmBA,CAACC,UAAkB,EAAU;EAC9D,OAAOA,UAAU,CAACC,WAAW,CAAC,CAAC,CAACC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AACpD;;AAEA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CACjCH,UAAkB,EAClBI,UAAoB,EACX;EACT,IAAIA,UAAU,CAACC,MAAM,KAAK,CAAC,EAAE,OAAO,KAAK;EACzC;EACA,OAAOD,UAAU,CAACE,IAAI,CACnBC,YAAY,IAAKA,YAAY,CAACN,WAAW,CAAC,CAAC,KAAKD,UAAU,CAACC,WAAW,CAAC,CAC1E,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import createXmlHttpRequestTracker from "./request-tracker-xhr.js";
|
|
4
|
+
// Re-export header utilities for convenience (they're in a separate file to avoid dependency issues)
|
|
5
|
+
export { normalizeHeaderName, shouldCaptureHeader } from "./header-helper.js";
|
|
4
6
|
let isInitialized = false;
|
|
5
|
-
|
|
7
|
+
let headerConfig = {
|
|
8
|
+
requestHeaders: [],
|
|
9
|
+
responseHeaders: []
|
|
10
|
+
};
|
|
11
|
+
export function getHeaderConfig() {
|
|
12
|
+
return headerConfig;
|
|
13
|
+
}
|
|
14
|
+
export function initializeNetworkInterceptor(config) {
|
|
6
15
|
if (isInitialized) {
|
|
7
16
|
console.warn('[Pulse] Network interceptor already initialized');
|
|
8
17
|
return;
|
|
9
18
|
}
|
|
19
|
+
|
|
20
|
+
// Store header configuration
|
|
21
|
+
if (config) {
|
|
22
|
+
headerConfig = {
|
|
23
|
+
requestHeaders: config.requestHeaders ?? [],
|
|
24
|
+
responseHeaders: config.responseHeaders ?? []
|
|
25
|
+
};
|
|
26
|
+
}
|
|
10
27
|
console.log('[Pulse] 🔄 Starting network interceptor initialization...');
|
|
11
28
|
try {
|
|
12
29
|
// In react-native, we are intercepting XMLHttpRequest only, since axios and fetch both use it internally.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createXmlHttpRequestTracker","isInitialized","initializeNetworkInterceptor","console","warn","log","XMLHttpRequest","error","isNetworkInterceptorInitialized"],"sourceRoot":"../../../src","sources":["network-interceptor/initialization.ts"],"mappings":";;AAAA,OAAOA,2BAA2B,MAAM,0BAAuB;AAE/D,IAAIC,aAAa,GAAG,KAAK;
|
|
1
|
+
{"version":3,"names":["createXmlHttpRequestTracker","normalizeHeaderName","shouldCaptureHeader","isInitialized","headerConfig","requestHeaders","responseHeaders","getHeaderConfig","initializeNetworkInterceptor","config","console","warn","log","XMLHttpRequest","error","isNetworkInterceptorInitialized"],"sourceRoot":"../../../src","sources":["network-interceptor/initialization.ts"],"mappings":";;AAAA,OAAOA,2BAA2B,MAAM,0BAAuB;AAE/D;AACA,SAASC,mBAAmB,EAAEC,mBAAmB,QAAQ,oBAAiB;AAE1E,IAAIC,aAAa,GAAG,KAAK;AACzB,IAAIC,YAAiC,GAAG;EACtCC,cAAc,EAAE,EAAE;EAClBC,eAAe,EAAE;AACnB,CAAC;AAED,OAAO,SAASC,eAAeA,CAAA,EAAwB;EACrD,OAAOH,YAAY;AACrB;AAEA,OAAO,SAASI,4BAA4BA,CAC1CC,MAA4B,EACtB;EACN,IAAIN,aAAa,EAAE;IACjBO,OAAO,CAACC,IAAI,CAAC,iDAAiD,CAAC;IAC/D;EACF;;EAEA;EACA,IAAIF,MAAM,EAAE;IACVL,YAAY,GAAG;MACbC,cAAc,EAAEI,MAAM,CAACJ,cAAc,IAAI,EAAE;MAC3CC,eAAe,EAAEG,MAAM,CAACH,eAAe,IAAI;IAC7C,CAAC;EACH;EAEAI,OAAO,CAACE,GAAG,CAAC,2DAA2D,CAAC;EAExE,IAAI;IACF;IACA;IACA,IAAI,OAAOC,cAAc,KAAK,WAAW,EAAE;MACzCb,2BAA2B,CAACa,cAAc,CAAC;IAC7C,CAAC,MAAM;MACLH,OAAO,CAACC,IAAI,CAAC,yCAAyC,CAAC;IACzD;IAEAR,aAAa,GAAG,IAAI;EACtB,CAAC,CAAC,OAAOW,KAAK,EAAE;IACdJ,OAAO,CAACI,KAAK,CAAC,mDAAmD,EAAEA,KAAK,CAAC;EAC3E;AACF;AAEA,OAAO,MAAMC,+BAA+B,GAAGA,CAAA,KAAeZ,aAAa","ignoreList":[]}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import { RequestTracker } from "./request-tracker.js";
|
|
4
4
|
import { getAbsoluteUrl } from "../utility.js";
|
|
5
5
|
import { createNetworkSpan, completeNetworkSpan } from "./span-helpers.js";
|
|
6
|
+
import { getHeaderConfig } from "./initialization.js";
|
|
7
|
+
import { shouldCaptureHeader } from "./header-helper.js";
|
|
6
8
|
let isXHRIntercepted = false;
|
|
7
9
|
function createXmlHttpRequestTracker(xhr) {
|
|
8
10
|
if (isXHRIntercepted) {
|
|
@@ -24,16 +26,39 @@ function createXmlHttpRequestTracker(xhr) {
|
|
|
24
26
|
originalOpen.call(this, method, url, ...rest);
|
|
25
27
|
};
|
|
26
28
|
isXHRIntercepted = true;
|
|
29
|
+
|
|
30
|
+
// Store request headers before send
|
|
31
|
+
const requestHeadersMap = new WeakMap();
|
|
32
|
+
const originalSetRequestHeader = xhr.prototype.setRequestHeader;
|
|
33
|
+
xhr.prototype.setRequestHeader = function setRequestHeader(name, value) {
|
|
34
|
+
const headerConfig = getHeaderConfig();
|
|
35
|
+
const requestHeadersList = headerConfig.requestHeaders ?? [];
|
|
36
|
+
if (requestHeadersList.length > 0 && shouldCaptureHeader(name, requestHeadersList)) {
|
|
37
|
+
const existing = requestHeadersMap.get(this) || {};
|
|
38
|
+
requestHeadersMap.set(this, {
|
|
39
|
+
...existing,
|
|
40
|
+
[name]: value
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
originalSetRequestHeader.call(this, name, value);
|
|
44
|
+
};
|
|
27
45
|
const originalSend = xhr.prototype.send;
|
|
28
46
|
xhr.prototype.send = function send(body) {
|
|
29
47
|
const requestData = trackedRequests.get(this);
|
|
30
48
|
if (requestData) {
|
|
31
49
|
const existingHandler = requestHandlers.get(this);
|
|
32
50
|
if (existingHandler) this.removeEventListener('readystatechange', existingHandler);
|
|
51
|
+
|
|
52
|
+
// Capture request headers
|
|
53
|
+
const headerConfig = getHeaderConfig();
|
|
54
|
+
const capturedRequestHeaders = requestHeadersMap.get(this);
|
|
55
|
+
const requestHeadersList = headerConfig.requestHeaders ?? [];
|
|
56
|
+
const filteredRequestHeaders = capturedRequestHeaders && requestHeadersList.length > 0 ? Object.fromEntries(Object.entries(capturedRequestHeaders).filter(([name]) => shouldCaptureHeader(name, requestHeadersList))) : undefined;
|
|
33
57
|
const startContext = {
|
|
34
58
|
type: 'xmlhttprequest',
|
|
35
59
|
method: requestData.method,
|
|
36
|
-
url: requestData.url
|
|
60
|
+
url: requestData.url,
|
|
61
|
+
requestHeaders: filteredRequestHeaders && Object.keys(filteredRequestHeaders).length > 0 ? filteredRequestHeaders : undefined
|
|
37
62
|
};
|
|
38
63
|
this.setRequestHeader('X-Pulse-RN-Tracked', 'true');
|
|
39
64
|
const span = createNetworkSpan(startContext, 'xmlhttprequest', body);
|
|
@@ -45,23 +70,54 @@ function createXmlHttpRequestTracker(xhr) {
|
|
|
45
70
|
if (this.readyState === xhr.DONE && onRequestEnd) {
|
|
46
71
|
const activeSpan = trackedSpans.get(this);
|
|
47
72
|
|
|
73
|
+
// Capture response headers
|
|
74
|
+
const responseHeaderConfig = getHeaderConfig();
|
|
75
|
+
const capturedResponseHeaders = {};
|
|
76
|
+
const responseHeadersList = responseHeaderConfig.responseHeaders ?? [];
|
|
77
|
+
if (responseHeadersList.length > 0) {
|
|
78
|
+
try {
|
|
79
|
+
const allHeaders = this.getAllResponseHeaders();
|
|
80
|
+
if (allHeaders) {
|
|
81
|
+
const headerLines = allHeaders.trim().split(/[\r\n]+/);
|
|
82
|
+
for (const line of headerLines) {
|
|
83
|
+
const parts = line.split(': ');
|
|
84
|
+
if (parts.length === 2) {
|
|
85
|
+
const [name, value] = parts;
|
|
86
|
+
if (name && value && shouldCaptureHeader(name, responseHeadersList)) {
|
|
87
|
+
capturedResponseHeaders[name] = value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
} catch (e) {
|
|
93
|
+
// Headers may not be available in some cases (CORS, etc.)
|
|
94
|
+
console.debug('[Pulse] Could not read response headers:', e);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
48
98
|
// Determine request outcome based on status code
|
|
49
99
|
let endContext;
|
|
100
|
+
const responseHeaders = Object.keys(capturedResponseHeaders).length > 0 ? capturedResponseHeaders : undefined;
|
|
50
101
|
if (this.status <= 0 || this.status >= 400) {
|
|
51
102
|
endContext = {
|
|
52
103
|
state: 'error',
|
|
53
|
-
status: this.status
|
|
104
|
+
status: this.status,
|
|
105
|
+
responseHeaders
|
|
54
106
|
};
|
|
55
107
|
} else {
|
|
56
108
|
endContext = {
|
|
57
109
|
state: 'success',
|
|
58
|
-
status: this.status
|
|
110
|
+
status: this.status,
|
|
111
|
+
responseHeaders
|
|
59
112
|
};
|
|
60
113
|
}
|
|
61
114
|
if (activeSpan) {
|
|
62
115
|
completeNetworkSpan(activeSpan, startContext, endContext, endContext.state === 'error');
|
|
63
116
|
trackedSpans.delete(this);
|
|
64
117
|
}
|
|
118
|
+
|
|
119
|
+
// Clean up
|
|
120
|
+
requestHeadersMap.delete(this);
|
|
65
121
|
onRequestEnd(endContext);
|
|
66
122
|
}
|
|
67
123
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RequestTracker","getAbsoluteUrl","createNetworkSpan","completeNetworkSpan","isXHRIntercepted","createXmlHttpRequestTracker","xhr","console","warn","requestTracker","trackedRequests","WeakMap","trackedSpans","requestHandlers","originalOpen","prototype","open","method","url","rest","set","String","call","originalSend","send","body","requestData","
|
|
1
|
+
{"version":3,"names":["RequestTracker","getAbsoluteUrl","createNetworkSpan","completeNetworkSpan","getHeaderConfig","shouldCaptureHeader","isXHRIntercepted","createXmlHttpRequestTracker","xhr","console","warn","requestTracker","trackedRequests","WeakMap","trackedSpans","requestHandlers","originalOpen","prototype","open","method","url","rest","set","String","call","requestHeadersMap","originalSetRequestHeader","setRequestHeader","name","value","headerConfig","requestHeadersList","requestHeaders","length","existing","get","originalSend","send","body","requestData","existingHandler","removeEventListener","capturedRequestHeaders","filteredRequestHeaders","Object","fromEntries","entries","filter","undefined","startContext","type","keys","span","onRequestEnd","start","onReadyStateChange","readyState","DONE","activeSpan","responseHeaderConfig","capturedResponseHeaders","responseHeadersList","responseHeaders","allHeaders","getAllResponseHeaders","headerLines","trim","split","line","parts","e","debug","endContext","status","state","delete","addEventListener"],"sourceRoot":"../../../src","sources":["network-interceptor/request-tracker-xhr.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,13 +4,14 @@ import { Platform } from 'react-native';
|
|
|
4
4
|
import { Pulse, SpanStatusCode } from "../index.js";
|
|
5
5
|
import { extractHttpAttributes } from "./url-helper.js";
|
|
6
6
|
import { updateAttributesWithGraphQLData } from "./graphql-helper.js";
|
|
7
|
-
import { ATTRIBUTE_KEYS,
|
|
7
|
+
import { ATTRIBUTE_KEYS, PULSE_TYPES } from "../pulse.constants.js";
|
|
8
|
+
import { normalizeHeaderName } from "./header-helper.js";
|
|
8
9
|
export function setNetworkSpanAttributes(span, startContext, endContext) {
|
|
9
10
|
const method = startContext.method.toUpperCase();
|
|
10
11
|
let attributes = {
|
|
11
12
|
[ATTRIBUTE_KEYS.HTTP_METHOD]: method,
|
|
12
13
|
[ATTRIBUTE_KEYS.HTTP_URL]: startContext.url,
|
|
13
|
-
[ATTRIBUTE_KEYS.PULSE_TYPE]:
|
|
14
|
+
[ATTRIBUTE_KEYS.PULSE_TYPE]: `${PULSE_TYPES.NETWORK}.${endContext.status ?? 0}`,
|
|
14
15
|
[ATTRIBUTE_KEYS.HTTP_REQUEST_TYPE]: startContext.type,
|
|
15
16
|
[ATTRIBUTE_KEYS.PLATFORM]: Platform.OS
|
|
16
17
|
};
|
|
@@ -33,6 +34,18 @@ export function setNetworkSpanAttributes(span, startContext, endContext) {
|
|
|
33
34
|
}
|
|
34
35
|
span.recordException(endContext.error, attributes);
|
|
35
36
|
}
|
|
37
|
+
if (startContext.requestHeaders) {
|
|
38
|
+
for (const [headerName, headerValue] of Object.entries(startContext.requestHeaders)) {
|
|
39
|
+
const normalizedName = normalizeHeaderName(headerName);
|
|
40
|
+
attributes[`${ATTRIBUTE_KEYS.HTTP_REQUEST_HEADER}.${normalizedName}`] = headerValue;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (endContext.responseHeaders) {
|
|
44
|
+
for (const [headerName, headerValue] of Object.entries(endContext.responseHeaders)) {
|
|
45
|
+
const normalizedName = normalizeHeaderName(headerName);
|
|
46
|
+
attributes[`${ATTRIBUTE_KEYS.HTTP_RESPONSE_HEADER}.${normalizedName}`] = headerValue;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
36
49
|
span.setAttributes(attributes);
|
|
37
50
|
return attributes;
|
|
38
51
|
}
|
|
@@ -42,7 +55,6 @@ export function createNetworkSpan(startContext, interceptorType, body) {
|
|
|
42
55
|
let baseAttributes = {
|
|
43
56
|
[ATTRIBUTE_KEYS.HTTP_METHOD]: method,
|
|
44
57
|
[ATTRIBUTE_KEYS.HTTP_URL]: startContext.url,
|
|
45
|
-
[ATTRIBUTE_KEYS.PULSE_TYPE]: PHASE_VALUES.NETWORK,
|
|
46
58
|
[ATTRIBUTE_KEYS.HTTP_REQUEST_TYPE]: interceptorType
|
|
47
59
|
};
|
|
48
60
|
const graphqlAttributes = updateAttributesWithGraphQLData(startContext.url, body);
|