@dreamhorizonorg/pulse-react-native 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/PulseReactNativeOtel.podspec +21 -0
- package/README.md +900 -0
- package/android/build.gradle +97 -0
- package/android/gradle.properties +5 -0
- package/android/proguard-rules.pro +108 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/pulsereactnativeotel/PulseOtelConstants.kt +20 -0
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelLogger.kt +73 -0
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelModule.kt +85 -0
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelPackage.kt +33 -0
- package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelTracer.kt +127 -0
- package/ios/PulseReactNativeOtel.h +5 -0
- package/ios/PulseReactNativeOtel.mm +100 -0
- package/lib/module/NativePulseReactNativeOtel.js +5 -0
- package/lib/module/NativePulseReactNativeOtel.js.map +1 -0
- package/lib/module/config.js +55 -0
- package/lib/module/config.js.map +1 -0
- package/lib/module/errorBoundary.js +62 -0
- package/lib/module/errorBoundary.js.map +1 -0
- package/lib/module/errorHandler.js +112 -0
- package/lib/module/errorHandler.js.map +1 -0
- package/lib/module/events.js +14 -0
- package/lib/module/events.js.map +1 -0
- package/lib/module/global.d.js +4 -0
- package/lib/module/global.d.js.map +1 -0
- package/lib/module/globalAttributes.js +13 -0
- package/lib/module/globalAttributes.js.map +1 -0
- package/lib/module/index.js +27 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/initialization.js +18 -0
- package/lib/module/initialization.js.map +1 -0
- package/lib/module/network-interceptor/initialization.js +25 -0
- package/lib/module/network-interceptor/initialization.js.map +1 -0
- package/lib/module/network-interceptor/network.interface.js +2 -0
- package/lib/module/network-interceptor/network.interface.js.map +1 -0
- package/lib/module/network-interceptor/request-tracker-fetch.js +72 -0
- package/lib/module/network-interceptor/request-tracker-fetch.js.map +1 -0
- package/lib/module/network-interceptor/request-tracker-xhr.js +75 -0
- package/lib/module/network-interceptor/request-tracker-xhr.js.map +1 -0
- package/lib/module/network-interceptor/request-tracker.js +25 -0
- package/lib/module/network-interceptor/request-tracker.js.map +1 -0
- package/lib/module/network-interceptor/span-helpers.js +62 -0
- package/lib/module/network-interceptor/span-helpers.js.map +1 -0
- package/lib/module/network-interceptor/url-helper.js +127 -0
- package/lib/module/network-interceptor/url-helper.js.map +1 -0
- package/lib/module/pulse.interface.js +2 -0
- package/lib/module/pulse.interface.js.map +1 -0
- package/lib/module/reactNavigation.js +100 -0
- package/lib/module/reactNavigation.js.map +1 -0
- package/lib/module/trace.js +75 -0
- package/lib/module/trace.js.map +1 -0
- package/lib/module/user.js +23 -0
- package/lib/module/user.js.map +1 -0
- package/lib/module/utility.js +34 -0
- package/lib/module/utility.js.map +1 -0
- package/lib/typescript/src/NativePulseReactNativeOtel.d.ts +31 -0
- package/lib/typescript/src/NativePulseReactNativeOtel.d.ts.map +1 -0
- package/lib/typescript/src/config.d.ts +14 -0
- package/lib/typescript/src/config.d.ts.map +1 -0
- package/lib/typescript/src/errorBoundary.d.ts +26 -0
- package/lib/typescript/src/errorBoundary.d.ts.map +1 -0
- package/lib/typescript/src/errorHandler.d.ts +4 -0
- package/lib/typescript/src/errorHandler.d.ts.map +1 -0
- package/lib/typescript/src/events.d.ts +3 -0
- package/lib/typescript/src/events.d.ts.map +1 -0
- package/lib/typescript/src/globalAttributes.d.ts +4 -0
- package/lib/typescript/src/globalAttributes.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +30 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/initialization.d.ts +3 -0
- package/lib/typescript/src/initialization.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/initialization.d.ts +3 -0
- package/lib/typescript/src/network-interceptor/initialization.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/network.interface.d.ts +29 -0
- package/lib/typescript/src/network-interceptor/network.interface.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts +7 -0
- package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/request-tracker-xhr.d.ts +4 -0
- package/lib/typescript/src/network-interceptor/request-tracker-xhr.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/request-tracker.d.ts +9 -0
- package/lib/typescript/src/network-interceptor/request-tracker.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/span-helpers.d.ts +7 -0
- package/lib/typescript/src/network-interceptor/span-helpers.d.ts.map +1 -0
- package/lib/typescript/src/network-interceptor/url-helper.d.ts +38 -0
- package/lib/typescript/src/network-interceptor/url-helper.d.ts.map +1 -0
- package/lib/typescript/src/pulse.interface.d.ts +8 -0
- package/lib/typescript/src/pulse.interface.d.ts.map +1 -0
- package/lib/typescript/src/reactNavigation.d.ts +10 -0
- package/lib/typescript/src/reactNavigation.d.ts.map +1 -0
- package/lib/typescript/src/trace.d.ts +19 -0
- package/lib/typescript/src/trace.d.ts.map +1 -0
- package/lib/typescript/src/user.d.ts +5 -0
- package/lib/typescript/src/user.d.ts.map +1 -0
- package/lib/typescript/src/utility.d.ts +8 -0
- package/lib/typescript/src/utility.d.ts.map +1 -0
- package/package.json +165 -0
- package/src/NativePulseReactNativeOtel.ts +57 -0
- package/src/config.ts +75 -0
- package/src/errorBoundary.tsx +92 -0
- package/src/errorHandler.ts +169 -0
- package/src/events.ts +15 -0
- package/src/global.d.ts +9 -0
- package/src/globalAttributes.ts +16 -0
- package/src/index.tsx +35 -0
- package/src/initialization.ts +18 -0
- package/src/network-interceptor/initialization.ts +28 -0
- package/src/network-interceptor/network.interface.ts +36 -0
- package/src/network-interceptor/request-tracker-fetch.ts +96 -0
- package/src/network-interceptor/request-tracker-xhr.ts +108 -0
- package/src/network-interceptor/request-tracker.ts +31 -0
- package/src/network-interceptor/span-helpers.ts +84 -0
- package/src/network-interceptor/url-helper.ts +155 -0
- package/src/pulse.interface.ts +14 -0
- package/src/reactNavigation.tsx +146 -0
- package/src/trace.ts +108 -0
- package/src/user.ts +24 -0
- package/src/utility.ts +36 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { setupErrorHandler } from "./errorHandler.js";
|
|
4
|
+
import { isSupportedPlatform } from "./initialization.js";
|
|
5
|
+
import { createReactNavigationIntegration } from "./reactNavigation.js";
|
|
6
|
+
import { initializeNetworkInterceptor } from "./network-interceptor/initialization.js";
|
|
7
|
+
const defaultConfig = {
|
|
8
|
+
autoDetectExceptions: true,
|
|
9
|
+
autoDetectNavigation: true,
|
|
10
|
+
autoDetectNetwork: true
|
|
11
|
+
};
|
|
12
|
+
let currentConfig = {
|
|
13
|
+
...defaultConfig
|
|
14
|
+
};
|
|
15
|
+
function configure(config) {
|
|
16
|
+
currentConfig = {
|
|
17
|
+
...currentConfig,
|
|
18
|
+
...config
|
|
19
|
+
};
|
|
20
|
+
setupErrorHandler(currentConfig.autoDetectExceptions ?? true);
|
|
21
|
+
if (currentConfig.autoDetectNetwork) {
|
|
22
|
+
initializeNetworkInterceptor();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function start(options) {
|
|
26
|
+
if (!isSupportedPlatform()) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const autoDetectExceptions = options?.autoDetectExceptions ?? true;
|
|
30
|
+
const autoDetectNavigation = options?.autoDetectNavigation ?? true;
|
|
31
|
+
const autoDetectNetwork = options?.autoDetectNetwork ?? true;
|
|
32
|
+
configure({
|
|
33
|
+
autoDetectExceptions,
|
|
34
|
+
autoDetectNavigation,
|
|
35
|
+
autoDetectNetwork
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export function createNavigationIntegrationWithConfig() {
|
|
39
|
+
if (!isSupportedPlatform()) {
|
|
40
|
+
return {
|
|
41
|
+
registerNavigationContainer: _ => {}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (!currentConfig.autoDetectNavigation) {
|
|
45
|
+
console.warn('[Pulse Navigation] auto-detection disabled via Pulse.start; createNavigationIntegration() returning no-op.');
|
|
46
|
+
const noop = {
|
|
47
|
+
registerNavigationContainer: _ => {
|
|
48
|
+
console.warn('[Pulse Navigation] auto-detection disabled via Pulse.start; registerNavigationContainer() returning no-op.');
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
return noop;
|
|
52
|
+
}
|
|
53
|
+
return createReactNavigationIntegration();
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +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,QAE3B,sBAAmB;AAC1B,SAASC,4BAA4B,QAAQ,yCAAsC;AAcnF,MAAMC,aAA0B,GAAG;EACjCC,oBAAoB,EAAE,IAAI;EAC1BC,oBAAoB,EAAE,IAAI;EAC1BC,iBAAiB,EAAE;AACrB,CAAC;AAED,IAAIC,aAA0B,GAAG;EAAE,GAAGJ;AAAc,CAAC;AAErD,SAASK,SAASA,CAACC,MAAmB,EAAQ;EAC5CF,aAAa,GAAG;IACd,GAAGA,aAAa;IAChB,GAAGE;EACL,CAAC;EACDV,iBAAiB,CAACQ,aAAa,CAACH,oBAAoB,IAAI,IAAI,CAAC;EAE7D,IAAIG,aAAa,CAACD,iBAAiB,EAAE;IACnCJ,4BAA4B,CAAC,CAAC;EAChC;AACF;AAEA,OAAO,SAASQ,KAAKA,CAACC,OAA2B,EAAQ;EACvD,IAAI,CAACX,mBAAmB,CAAC,CAAC,EAAE;IAC1B;EACF;EACA,MAAMI,oBAAoB,GAAGO,OAAO,EAAEP,oBAAoB,IAAI,IAAI;EAClE,MAAMC,oBAAoB,GAAGM,OAAO,EAAEN,oBAAoB,IAAI,IAAI;EAClE,MAAMC,iBAAiB,GAAGK,OAAO,EAAEL,iBAAiB,IAAI,IAAI;EAC5DE,SAAS,CAAC;IACRJ,oBAAoB;IACpBC,oBAAoB;IACpBC;EACF,CAAC,CAAC;AACJ;AAEA,OAAO,SAASM,qCAAqCA,CAAA,EAA+B;EAClF,IAAI,CAACZ,mBAAmB,CAAC,CAAC,EAAE;IAC1B,OAAO;MACLa,2BAA2B,EAAGC,CAAU,IAAK,CAAC;IAChD,CAAC;EACH;EACA,IAAI,CAACP,aAAa,CAACF,oBAAoB,EAAE;IACvCU,OAAO,CAACC,IAAI,CACV,4GACF,CAAC;IACD,MAAMC,IAAgC,GAAG;MACvCJ,2BAA2B,EAAGC,CAAU,IAAK;QAC3CC,OAAO,CAACC,IAAI,CACV,4GACF,CAAC;MACH;IACF,CAAC;IACD,OAAOC,IAAI;EACb;EACA,OAAOhB,gCAAgC,CAAC,CAAC;AAC3C","ignoreList":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Pulse } from "./index.js";
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
export const UNKNOWN_COMPONENT = 'unknown';
|
|
7
|
+
const COMPONENT_STACK_UNAVAILABLE = '<component stack unavailable>';
|
|
8
|
+
const INITIAL_STATE = {
|
|
9
|
+
componentStack: null,
|
|
10
|
+
error: null
|
|
11
|
+
};
|
|
12
|
+
export class ErrorBoundary extends React.Component {
|
|
13
|
+
state = INITIAL_STATE;
|
|
14
|
+
componentDidCatch(error, errorInfo) {
|
|
15
|
+
const componentStack = errorInfo.componentStack || COMPONENT_STACK_UNAVAILABLE;
|
|
16
|
+
const {
|
|
17
|
+
onError
|
|
18
|
+
} = this.props;
|
|
19
|
+
|
|
20
|
+
// Error is handled if a fallback is provided, otherwise it's unhandled (fatal)
|
|
21
|
+
const handled = !!this.props.fallback;
|
|
22
|
+
const errorToReport = error instanceof Error ? error : new Error(String(error));
|
|
23
|
+
Pulse.reportException(errorToReport, !handled);
|
|
24
|
+
if (onError) {
|
|
25
|
+
onError(error, componentStack);
|
|
26
|
+
}
|
|
27
|
+
this.setState({
|
|
28
|
+
error,
|
|
29
|
+
componentStack
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
render() {
|
|
33
|
+
const {
|
|
34
|
+
fallback,
|
|
35
|
+
children
|
|
36
|
+
} = this.props;
|
|
37
|
+
const state = this.state;
|
|
38
|
+
if (state.componentStack === null) {
|
|
39
|
+
return typeof children === 'function' ? children() : children;
|
|
40
|
+
}
|
|
41
|
+
const element = typeof fallback === 'function' ? /*#__PURE__*/React.createElement(fallback, {
|
|
42
|
+
error: state.error,
|
|
43
|
+
componentStack: state.componentStack
|
|
44
|
+
}) : fallback;
|
|
45
|
+
if (/*#__PURE__*/React.isValidElement(element)) {
|
|
46
|
+
return element;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function withErrorBoundary(WrappedComponent, errorBoundaryOptions) {
|
|
52
|
+
const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
|
|
53
|
+
const Wrapped = /*#__PURE__*/React.memo(props => /*#__PURE__*/_jsx(ErrorBoundary, {
|
|
54
|
+
...errorBoundaryOptions,
|
|
55
|
+
children: /*#__PURE__*/_jsx(WrappedComponent, {
|
|
56
|
+
...props
|
|
57
|
+
})
|
|
58
|
+
}));
|
|
59
|
+
Wrapped.displayName = `errorBoundary(${componentDisplayName})`;
|
|
60
|
+
return Wrapped;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=errorBoundary.js.map
|
|
@@ -0,0 +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,CAAyC;EAClFC,KAAK,GAAuBL,aAAa;EAEzCM,iBAAiBA,CAACJ,KAAc,EAAEK,SAA0B,EAAQ;IACzE,MAAMN,cAAc,GAAGM,SAAS,CAACN,cAAc,IAAIF,2BAA2B;IAC9E,MAAM;MAAES;IAAQ,CAAC,GAAG,IAAI,CAACC,KAAK;;IAE9B;IACA,MAAMC,OAAO,GAAG,CAAC,CAAC,IAAI,CAACD,KAAK,CAACE,QAAQ;IAErC,MAAMC,aAAa,GAAGV,KAAK,YAAYW,KAAK,GAAGX,KAAK,GAAG,IAAIW,KAAK,CAACC,MAAM,CAACZ,KAAK,CAAC,CAAC;IAC/EP,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,GAAGF,gBAAgB,CAACG,WAAW,IAAIH,gBAAgB,CAACI,IAAI,IAAI7B,iBAAiB;EAEvG,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":[]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import PulseReactNativeOtel from "./NativePulseReactNativeOtel.js";
|
|
4
|
+
import { mergeWithGlobalAttributes } from "./globalAttributes.js";
|
|
5
|
+
import { isSupportedPlatform } from "./initialization.js";
|
|
6
|
+
import { extractErrorDetails } from "./utility.js";
|
|
7
|
+
let previousErrorHandler = null;
|
|
8
|
+
let isInitialized = false;
|
|
9
|
+
let handlingFatal = false;
|
|
10
|
+
function reportToOpenTelemetry(errorMessage, stackTrace, isFatal, errorType, attributes) {
|
|
11
|
+
const observedTimeMs = Date.now();
|
|
12
|
+
const mergedAttributes = mergeWithGlobalAttributes(attributes || {});
|
|
13
|
+
PulseReactNativeOtel.reportException(errorMessage, observedTimeMs, stackTrace, isFatal, errorType, mergedAttributes);
|
|
14
|
+
}
|
|
15
|
+
function handleGlobalError(error, isFatal) {
|
|
16
|
+
const shouldHandleFatal = !!isFatal;
|
|
17
|
+
if (shouldHandleFatal) {
|
|
18
|
+
if (handlingFatal) {
|
|
19
|
+
PulseReactNativeOtel.trackEvent('Encountered multiple fatal errors. The latest:', Date.now(), {
|
|
20
|
+
message: error.message
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
handlingFatal = true;
|
|
25
|
+
}
|
|
26
|
+
const {
|
|
27
|
+
message,
|
|
28
|
+
stackTrace,
|
|
29
|
+
errorType
|
|
30
|
+
} = extractErrorDetails(error);
|
|
31
|
+
reportToOpenTelemetry(message, stackTrace, isFatal || false, errorType);
|
|
32
|
+
console.error('[Pulse RN Crash]', 'Fatal:', isFatal, 'Error:', error);
|
|
33
|
+
if (previousErrorHandler && typeof previousErrorHandler === 'function') {
|
|
34
|
+
try {
|
|
35
|
+
if (isFatal) {
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
previousErrorHandler(error, isFatal);
|
|
38
|
+
}, 150);
|
|
39
|
+
} else {
|
|
40
|
+
previousErrorHandler(error, isFatal);
|
|
41
|
+
}
|
|
42
|
+
} catch (handlerError) {
|
|
43
|
+
console.error('[Pulse RN] Previous error handler threw:', handlerError);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function reportException(error, isFatal = false, attributes) {
|
|
48
|
+
if (!isSupportedPlatform()) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
let errorMessage;
|
|
52
|
+
let stackTrace;
|
|
53
|
+
let errorType;
|
|
54
|
+
if (typeof error === 'string') {
|
|
55
|
+
errorMessage = error;
|
|
56
|
+
stackTrace = '';
|
|
57
|
+
errorType = '';
|
|
58
|
+
} else {
|
|
59
|
+
const details = extractErrorDetails(error);
|
|
60
|
+
errorMessage = details.message;
|
|
61
|
+
stackTrace = details.stackTrace;
|
|
62
|
+
errorType = details.errorType;
|
|
63
|
+
}
|
|
64
|
+
reportToOpenTelemetry(errorMessage, stackTrace, isFatal, errorType, attributes);
|
|
65
|
+
}
|
|
66
|
+
function initializeErrorHandler() {
|
|
67
|
+
if (isInitialized) {
|
|
68
|
+
console.warn('[Pulse RN] Error handler already initialized. Skipping.');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
handlingFatal = false;
|
|
72
|
+
if (!ErrorUtils) {
|
|
73
|
+
console.warn('[Pulse RN] ErrorUtils not available; cannot install global error handler.');
|
|
74
|
+
PulseReactNativeOtel.trackEvent('ErrorUtils not found. Cannot install global error handler.', Date.now());
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const currentHandler = ErrorUtils.getGlobalHandler?.();
|
|
78
|
+
if (currentHandler) {
|
|
79
|
+
previousErrorHandler = currentHandler;
|
|
80
|
+
console.log('[Pulse RN] Previous error handler detected (likely React Native default) - will be preserved');
|
|
81
|
+
} else {
|
|
82
|
+
console.log('[Pulse RN] No previous error handler detected (unusual in React Native)');
|
|
83
|
+
}
|
|
84
|
+
ErrorUtils.setGlobalHandler(handleGlobalError);
|
|
85
|
+
isInitialized = true;
|
|
86
|
+
handlingFatal = false;
|
|
87
|
+
console.log('[Pulse RN] Error handler initialized successfully');
|
|
88
|
+
}
|
|
89
|
+
function disableErrorHandler() {
|
|
90
|
+
if (!isInitialized) {
|
|
91
|
+
console.warn('[Pulse RN] Error handler not initialized. Nothing to disable.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (previousErrorHandler) {
|
|
95
|
+
ErrorUtils.setGlobalHandler(previousErrorHandler);
|
|
96
|
+
console.log('[Pulse RN] Error handler disabled. Previous handler restored.');
|
|
97
|
+
} else {
|
|
98
|
+
ErrorUtils.setGlobalHandler(null);
|
|
99
|
+
console.log('[Pulse RN] Error handler disabled. Restored to React Native default.');
|
|
100
|
+
}
|
|
101
|
+
isInitialized = false;
|
|
102
|
+
previousErrorHandler = null;
|
|
103
|
+
handlingFatal = false;
|
|
104
|
+
}
|
|
105
|
+
export function setupErrorHandler(enableErrorHandler) {
|
|
106
|
+
if (enableErrorHandler) {
|
|
107
|
+
initializeErrorHandler();
|
|
108
|
+
} else {
|
|
109
|
+
disableErrorHandler();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=errorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["PulseReactNativeOtel","mergeWithGlobalAttributes","isSupportedPlatform","extractErrorDetails","previousErrorHandler","isInitialized","handlingFatal","reportToOpenTelemetry","errorMessage","stackTrace","isFatal","errorType","attributes","observedTimeMs","Date","now","mergedAttributes","reportException","handleGlobalError","error","shouldHandleFatal","trackEvent","message","console","setTimeout","handlerError","details","initializeErrorHandler","warn","ErrorUtils","currentHandler","getGlobalHandler","log","setGlobalHandler","disableErrorHandler","setupErrorHandler","enableErrorHandler"],"sourceRoot":"../../src","sources":["errorHandler.ts"],"mappings":";;AAAA,OAAOA,oBAAoB,MAAM,iCAA8B;AAC/D,SAASC,yBAAyB,QAAQ,uBAAoB;AAC9D,SAASC,mBAAmB,QAAQ,qBAAkB;AACtD,SAASC,mBAAmB,QAAQ,cAAW;AAG/C,IAAIC,oBAAwE,GAC1E,IAAI;AAEN,IAAIC,aAAa,GAAG,KAAK;AACzB,IAAIC,aAAa,GAAG,KAAK;AAEzB,SAASC,qBAAqBA,CAC5BC,YAAoB,EACpBC,UAAkB,EAClBC,OAAgB,EAChBC,SAAiB,EACjBC,UAA4B,EACtB;EACN,MAAMC,cAAc,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EACjC,MAAMC,gBAAgB,GAAGf,yBAAyB,CAACW,UAAU,IAAI,CAAC,CAAC,CAAC;EACpEZ,oBAAoB,CAACiB,eAAe,CAClCT,YAAY,EACZK,cAAc,EACdJ,UAAU,EACVC,OAAO,EACPC,SAAS,EACTK,gBACF,CAAC;AACH;AAEA,SAASE,iBAAiBA,CAACC,KAAY,EAAET,OAAiB,EAAQ;EAChE,MAAMU,iBAAiB,GAAG,CAAC,CAACV,OAAO;EACnC,IAAIU,iBAAiB,EAAE;IACrB,IAAId,aAAa,EAAE;MACjBN,oBAAoB,CAACqB,UAAU,CAC7B,gDAAgD,EAChDP,IAAI,CAACC,GAAG,CAAC,CAAC,EACV;QACEO,OAAO,EAAEH,KAAK,CAACG;MACjB,CACF,CAAC;MACD;IACF;IACAhB,aAAa,GAAG,IAAI;EACtB;EAEA,MAAM;IAAEgB,OAAO;IAAEb,UAAU;IAAEE;EAAU,CAAC,GAAGR,mBAAmB,CAACgB,KAAK,CAAC;EACrEZ,qBAAqB,CAACe,OAAO,EAAEb,UAAU,EAAEC,OAAO,IAAI,KAAK,EAAEC,SAAS,CAAC;EACvEY,OAAO,CAACJ,KAAK,CAAC,kBAAkB,EAAE,QAAQ,EAAET,OAAO,EAAE,QAAQ,EAAES,KAAK,CAAC;EACrE,IAAIf,oBAAoB,IAAI,OAAOA,oBAAoB,KAAK,UAAU,EAAE;IACtE,IAAI;MACF,IAAIM,OAAO,EAAE;QACXc,UAAU,CAAC,MAAM;UACfpB,oBAAoB,CAAEe,KAAK,EAAET,OAAO,CAAC;QACvC,CAAC,EAAE,GAAG,CAAC;MACT,CAAC,MAAM;QACLN,oBAAoB,CAACe,KAAK,EAAET,OAAO,CAAC;MACtC;IACF,CAAC,CAAC,OAAOe,YAAY,EAAE;MACrBF,OAAO,CAACJ,KAAK,CAAC,0CAA0C,EAAEM,YAAY,CAAC;IACzE;EACF;AACF;AAEA,OAAO,SAASR,eAAeA,CAC7BE,KAAqB,EACrBT,OAAgB,GAAG,KAAK,EACxBE,UAA4B,EACtB;EACN,IAAI,CAACV,mBAAmB,CAAC,CAAC,EAAE;IAC1B;EACF;EAEA,IAAIM,YAAoB;EACxB,IAAIC,UAAkB;EACtB,IAAIE,SAAiB;EAErB,IAAI,OAAOQ,KAAK,KAAK,QAAQ,EAAE;IAC7BX,YAAY,GAAGW,KAAK;IACpBV,UAAU,GAAG,EAAE;IACfE,SAAS,GAAG,EAAE;EAChB,CAAC,MAAM;IACL,MAAMe,OAAO,GAAGvB,mBAAmB,CAACgB,KAAK,CAAC;IAC1CX,YAAY,GAAGkB,OAAO,CAACJ,OAAO;IAC9Bb,UAAU,GAAGiB,OAAO,CAACjB,UAAU;IAC/BE,SAAS,GAAGe,OAAO,CAACf,SAAS;EAC/B;EAEAJ,qBAAqB,CACnBC,YAAY,EACZC,UAAU,EACVC,OAAO,EACPC,SAAS,EACTC,UACF,CAAC;AACH;AAEA,SAASe,sBAAsBA,CAAA,EAAS;EACtC,IAAItB,aAAa,EAAE;IACjBkB,OAAO,CAACK,IAAI,CAAC,yDAAyD,CAAC;IACvE;EACF;EACAtB,aAAa,GAAG,KAAK;EAErB,IAAI,CAACuB,UAAU,EAAE;IACfN,OAAO,CAACK,IAAI,CACV,2EACF,CAAC;IACD5B,oBAAoB,CAACqB,UAAU,CAC7B,4DAA4D,EAC5DP,IAAI,CAACC,GAAG,CAAC,CACX,CAAC;IACD;EACF;EAEA,MAAMe,cAAc,GAAGD,UAAU,CAACE,gBAAgB,GAAG,CAAC;EAEtD,IAAID,cAAc,EAAE;IAClB1B,oBAAoB,GAAG0B,cAAc;IACrCP,OAAO,CAACS,GAAG,CACT,8FACF,CAAC;EACH,CAAC,MAAM;IACLT,OAAO,CAACS,GAAG,CACT,yEACF,CAAC;EACH;EAEAH,UAAU,CAACI,gBAAgB,CAACf,iBAAiB,CAAC;EAE9Cb,aAAa,GAAG,IAAI;EACpBC,aAAa,GAAG,KAAK;EAErBiB,OAAO,CAACS,GAAG,CAAC,mDAAmD,CAAC;AAClE;AAEA,SAASE,mBAAmBA,CAAA,EAAS;EACnC,IAAI,CAAC7B,aAAa,EAAE;IAClBkB,OAAO,CAACK,IAAI,CACV,+DACF,CAAC;IACD;EACF;EAEA,IAAIxB,oBAAoB,EAAE;IACxByB,UAAU,CAACI,gBAAgB,CAAC7B,oBAAoB,CAAC;IACjDmB,OAAO,CAACS,GAAG,CACT,+DACF,CAAC;EACH,CAAC,MAAM;IACLH,UAAU,CAACI,gBAAgB,CAAC,IAAW,CAAC;IACxCV,OAAO,CAACS,GAAG,CACT,sEACF,CAAC;EACH;EAEA3B,aAAa,GAAG,KAAK;EACrBD,oBAAoB,GAAG,IAAI;EAC3BE,aAAa,GAAG,KAAK;AACvB;AAEA,OAAO,SAAS6B,iBAAiBA,CAACC,kBAA2B,EAAQ;EACnE,IAAIA,kBAAkB,EAAE;IACtBT,sBAAsB,CAAC,CAAC;EAC1B,CAAC,MAAM;IACLO,mBAAmB,CAAC,CAAC;EACvB;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import PulseReactNativeOtel from "./NativePulseReactNativeOtel.js";
|
|
4
|
+
import { mergeWithGlobalAttributes } from "./globalAttributes.js";
|
|
5
|
+
import { isSupportedPlatform } from "./initialization.js";
|
|
6
|
+
export function trackEvent(event, attributes) {
|
|
7
|
+
if (!isSupportedPlatform()) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const observedTimeMs = Date.now();
|
|
11
|
+
const mergedAttributes = mergeWithGlobalAttributes(attributes || {});
|
|
12
|
+
PulseReactNativeOtel.trackEvent(event, observedTimeMs, mergedAttributes);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["global.d.ts"],"mappings":";;AAOA","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const globalAttributes = {};
|
|
4
|
+
export function setGlobalAttribute(key, value) {
|
|
5
|
+
globalAttributes[key] = value;
|
|
6
|
+
}
|
|
7
|
+
export function mergeWithGlobalAttributes(attributes) {
|
|
8
|
+
return {
|
|
9
|
+
...globalAttributes,
|
|
10
|
+
...attributes
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=globalAttributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["globalAttributes","setGlobalAttribute","key","value","mergeWithGlobalAttributes","attributes"],"sourceRoot":"../../src","sources":["globalAttributes.ts"],"mappings":";;AAEA,MAAMA,gBAAiC,GAAG,CAAC,CAAC;AAE5C,OAAO,SAASC,kBAAkBA,CAChCC,GAAW,EACXC,KAA0B,EACpB;EACNH,gBAAgB,CAACE,GAAG,CAAC,GAAGC,KAAK;AAC/B;AAEA,OAAO,SAASC,yBAAyBA,CACvCC,UAAc,EACO;EACrB,OAAO;IAAE,GAAGL,gBAAgB;IAAE,GAAGK;EAAW,CAAC;AAC/C","ignoreList":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { startSpan, trackSpan } from "./trace.js";
|
|
4
|
+
import { reportException } from "./errorHandler.js";
|
|
5
|
+
import { trackEvent } from "./events.js";
|
|
6
|
+
import { start, createNavigationIntegrationWithConfig } from "./config.js";
|
|
7
|
+
import { isInitialized } from "./initialization.js";
|
|
8
|
+
import { setGlobalAttribute } from "./globalAttributes.js";
|
|
9
|
+
import { setUserId, setUserProperty, setUserProperties } from "./user.js";
|
|
10
|
+
import { ErrorBoundary, withErrorBoundary } from "./errorBoundary.js";
|
|
11
|
+
export { SpanStatusCode } from "./trace.js";
|
|
12
|
+
export const Pulse = {
|
|
13
|
+
start,
|
|
14
|
+
isInitialized,
|
|
15
|
+
createNavigationIntegration: createNavigationIntegrationWithConfig,
|
|
16
|
+
trackEvent,
|
|
17
|
+
reportException,
|
|
18
|
+
trackSpan,
|
|
19
|
+
startSpan,
|
|
20
|
+
setGlobalAttribute,
|
|
21
|
+
setUserId,
|
|
22
|
+
setUserProperty,
|
|
23
|
+
setUserProperties,
|
|
24
|
+
ErrorBoundary,
|
|
25
|
+
withErrorBoundary
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
|
+
import PulseReactNativeOtel from "./NativePulseReactNativeOtel.js";
|
|
5
|
+
let cachedInitStatus = false;
|
|
6
|
+
export function isInitialized() {
|
|
7
|
+
if (!isSupportedPlatform()) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (!cachedInitStatus) {
|
|
11
|
+
cachedInitStatus = PulseReactNativeOtel.isInitialized();
|
|
12
|
+
}
|
|
13
|
+
return cachedInitStatus;
|
|
14
|
+
}
|
|
15
|
+
export function isSupportedPlatform() {
|
|
16
|
+
return Platform.OS === 'android';
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=initialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Platform","PulseReactNativeOtel","cachedInitStatus","isInitialized","isSupportedPlatform","OS"],"sourceRoot":"../../src","sources":["initialization.ts"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,oBAAoB,MAAM,iCAA8B;AAE/D,IAAIC,gBAAyB,GAAG,KAAK;AAErC,OAAO,SAASC,aAAaA,CAAA,EAAY;EACvC,IAAI,CAACC,mBAAmB,CAAC,CAAC,EAAE;IAC1B,OAAO,KAAK;EACd;EACA,IAAI,CAACF,gBAAgB,EAAE;IACrBA,gBAAgB,GAAGD,oBAAoB,CAACE,aAAa,CAAC,CAAC;EACzD;EACA,OAAOD,gBAAgB;AACzB;AAEA,OAAO,SAASE,mBAAmBA,CAAA,EAAY;EAC7C,OAAOJ,QAAQ,CAACK,EAAE,KAAK,SAAS;AAClC","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import createXmlHttpRequestTracker from "./request-tracker-xhr.js";
|
|
4
|
+
let isInitialized = false;
|
|
5
|
+
export function initializeNetworkInterceptor() {
|
|
6
|
+
if (isInitialized) {
|
|
7
|
+
console.warn('[Pulse] Network interceptor already initialized');
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
console.log('[Pulse] 🔄 Starting network interceptor initialization...');
|
|
11
|
+
try {
|
|
12
|
+
// In react-native, we are intercepting XMLHttpRequest only, since axios and fetch both use it internally.
|
|
13
|
+
// See: https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Network/fetch.js
|
|
14
|
+
if (typeof XMLHttpRequest !== 'undefined') {
|
|
15
|
+
createXmlHttpRequestTracker(XMLHttpRequest);
|
|
16
|
+
} else {
|
|
17
|
+
console.warn('[Pulse] XMLHttpRequest is not available');
|
|
18
|
+
}
|
|
19
|
+
isInitialized = true;
|
|
20
|
+
} catch (error) {
|
|
21
|
+
console.error('[Pulse] Failed to initialize network interceptor:', error);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const isNetworkInterceptorInitialized = () => isInitialized;
|
|
25
|
+
//# sourceMappingURL=initialization.js.map
|
|
@@ -0,0 +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;AAEzB,OAAO,SAASC,4BAA4BA,CAAA,EAAS;EACnD,IAAID,aAAa,EAAE;IACjBE,OAAO,CAACC,IAAI,CAAC,iDAAiD,CAAC;IAC/D;EACF;EAEAD,OAAO,CAACE,GAAG,CAAC,2DAA2D,CAAC;EAExE,IAAI;IACF;IACA;IACA,IAAI,OAAOC,cAAc,KAAK,WAAW,EAAE;MACzCN,2BAA2B,CAACM,cAAc,CAAC;IAC7C,CAAC,MAAM;MACLH,OAAO,CAACC,IAAI,CAAC,yCAAyC,CAAC;IACzD;IAEAH,aAAa,GAAG,IAAI;EACtB,CAAC,CAAC,OAAOM,KAAK,EAAE;IACdJ,OAAO,CAACI,KAAK,CAAC,mDAAmD,EAAEA,KAAK,CAAC;EAC3E;AACF;AAEA,OAAO,MAAMC,+BAA+B,GAAGA,CAAA,KAAeP,aAAa","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["network-interceptor/network.interface.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { RequestTracker } from "./request-tracker.js";
|
|
4
|
+
import { getAbsoluteUrl } from "../utility.js";
|
|
5
|
+
import { createNetworkSpan, completeNetworkSpan } from "./span-helpers.js";
|
|
6
|
+
function createStartContext(input, init) {
|
|
7
|
+
const inputIsRequest = isRequest(input);
|
|
8
|
+
const url = inputIsRequest ? input.url : String(input);
|
|
9
|
+
const method = !!init && init.method || inputIsRequest && input.method || 'GET';
|
|
10
|
+
return {
|
|
11
|
+
url: getAbsoluteUrl(url),
|
|
12
|
+
method,
|
|
13
|
+
type: 'fetch'
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function isRequest(input) {
|
|
17
|
+
return !!input && typeof input === 'object' && !(input instanceof URL);
|
|
18
|
+
}
|
|
19
|
+
let isFetchIntercepted = false;
|
|
20
|
+
let originalFetch = null;
|
|
21
|
+
function createFetchRequestTracker(global) {
|
|
22
|
+
if (isFetchIntercepted) {
|
|
23
|
+
console.warn('[Pulse] Fetch already intercepted');
|
|
24
|
+
return new RequestTracker();
|
|
25
|
+
}
|
|
26
|
+
if (originalFetch && global.fetch !== originalFetch) {
|
|
27
|
+
console.warn('[Pulse] Fetch already wrapped by another interceptor');
|
|
28
|
+
isFetchIntercepted = true;
|
|
29
|
+
return new RequestTracker();
|
|
30
|
+
}
|
|
31
|
+
if (global.fetch?._pulseIntercepted) {
|
|
32
|
+
console.warn('[Pulse] Fetch already wrapped by Pulse');
|
|
33
|
+
isFetchIntercepted = true;
|
|
34
|
+
return new RequestTracker();
|
|
35
|
+
}
|
|
36
|
+
const requestTracker = new RequestTracker();
|
|
37
|
+
originalFetch = global.fetch;
|
|
38
|
+
isFetchIntercepted = true;
|
|
39
|
+
const fetchWrapper = function fetch(input, init) {
|
|
40
|
+
const startContext = createStartContext(input, init);
|
|
41
|
+
const span = createNetworkSpan(startContext, 'fetch');
|
|
42
|
+
const {
|
|
43
|
+
onRequestEnd
|
|
44
|
+
} = requestTracker.start(startContext);
|
|
45
|
+
const fetchToCall = originalFetch;
|
|
46
|
+
return fetchToCall.call(global, input, init).then(response => {
|
|
47
|
+
// Determine if response is successful based on status code
|
|
48
|
+
// 2xx and 3xx are successful, 4xx and 5xx are errors
|
|
49
|
+
const isSuccess = response.status >= 200 && response.status < 400;
|
|
50
|
+
const endContext = {
|
|
51
|
+
status: response.status,
|
|
52
|
+
state: isSuccess ? 'success' : 'error'
|
|
53
|
+
};
|
|
54
|
+
completeNetworkSpan(span, startContext, endContext, !isSuccess);
|
|
55
|
+
onRequestEnd(endContext);
|
|
56
|
+
return response;
|
|
57
|
+
}).catch(error => {
|
|
58
|
+
const endContext = {
|
|
59
|
+
error,
|
|
60
|
+
state: 'error'
|
|
61
|
+
};
|
|
62
|
+
completeNetworkSpan(span, startContext, endContext, true);
|
|
63
|
+
onRequestEnd(endContext);
|
|
64
|
+
throw error;
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
fetchWrapper._pulseIntercepted = true;
|
|
68
|
+
global.fetch = fetchWrapper;
|
|
69
|
+
return requestTracker;
|
|
70
|
+
}
|
|
71
|
+
export default createFetchRequestTracker;
|
|
72
|
+
//# sourceMappingURL=request-tracker-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RequestTracker","getAbsoluteUrl","createNetworkSpan","completeNetworkSpan","createStartContext","input","init","inputIsRequest","isRequest","url","String","method","type","URL","isFetchIntercepted","originalFetch","createFetchRequestTracker","global","console","warn","fetch","_pulseIntercepted","requestTracker","fetchWrapper","startContext","span","onRequestEnd","start","fetchToCall","call","then","response","isSuccess","status","endContext","state","catch","error"],"sourceRoot":"../../../src","sources":["network-interceptor/request-tracker-fetch.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { RequestTracker } from "./request-tracker.js";
|
|
4
|
+
import { getAbsoluteUrl } from "../utility.js";
|
|
5
|
+
import { createNetworkSpan, completeNetworkSpan } from "./span-helpers.js";
|
|
6
|
+
let isXHRIntercepted = false;
|
|
7
|
+
function createXmlHttpRequestTracker(xhr) {
|
|
8
|
+
if (isXHRIntercepted) {
|
|
9
|
+
console.warn('[Pulse] XMLHttpRequest already intercepted');
|
|
10
|
+
return new RequestTracker();
|
|
11
|
+
}
|
|
12
|
+
const requestTracker = new RequestTracker();
|
|
13
|
+
const trackedRequests = new WeakMap();
|
|
14
|
+
const trackedSpans = new WeakMap();
|
|
15
|
+
const requestHandlers = new WeakMap();
|
|
16
|
+
const originalOpen = xhr.prototype.open;
|
|
17
|
+
xhr.prototype.open = function open(method, url, ...rest) {
|
|
18
|
+
trackedRequests.set(this, {
|
|
19
|
+
method,
|
|
20
|
+
url: getAbsoluteUrl(String(url))
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// @ts-expect-error rest
|
|
24
|
+
originalOpen.call(this, method, url, ...rest);
|
|
25
|
+
};
|
|
26
|
+
isXHRIntercepted = true;
|
|
27
|
+
const originalSend = xhr.prototype.send;
|
|
28
|
+
xhr.prototype.send = function send(body) {
|
|
29
|
+
const requestData = trackedRequests.get(this);
|
|
30
|
+
if (requestData) {
|
|
31
|
+
const existingHandler = requestHandlers.get(this);
|
|
32
|
+
if (existingHandler) this.removeEventListener('readystatechange', existingHandler);
|
|
33
|
+
const startContext = {
|
|
34
|
+
type: 'xmlhttprequest',
|
|
35
|
+
method: requestData.method,
|
|
36
|
+
url: requestData.url
|
|
37
|
+
};
|
|
38
|
+
const span = createNetworkSpan(startContext, 'xmlhttprequest');
|
|
39
|
+
trackedSpans.set(this, span);
|
|
40
|
+
const {
|
|
41
|
+
onRequestEnd
|
|
42
|
+
} = requestTracker.start(startContext);
|
|
43
|
+
const onReadyStateChange = () => {
|
|
44
|
+
if (this.readyState === xhr.DONE && onRequestEnd) {
|
|
45
|
+
const activeSpan = trackedSpans.get(this);
|
|
46
|
+
|
|
47
|
+
// Determine request outcome based on status code
|
|
48
|
+
let endContext;
|
|
49
|
+
if (this.status <= 0 || this.status >= 400) {
|
|
50
|
+
endContext = {
|
|
51
|
+
state: 'error',
|
|
52
|
+
status: this.status
|
|
53
|
+
};
|
|
54
|
+
} else {
|
|
55
|
+
endContext = {
|
|
56
|
+
state: 'success',
|
|
57
|
+
status: this.status
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (activeSpan) {
|
|
61
|
+
completeNetworkSpan(activeSpan, startContext, endContext, endContext.state === 'error');
|
|
62
|
+
trackedSpans.delete(this);
|
|
63
|
+
}
|
|
64
|
+
onRequestEnd(endContext);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
this.addEventListener('readystatechange', onReadyStateChange);
|
|
68
|
+
requestHandlers.set(this, onReadyStateChange);
|
|
69
|
+
}
|
|
70
|
+
originalSend.call(this, body);
|
|
71
|
+
};
|
|
72
|
+
return requestTracker;
|
|
73
|
+
}
|
|
74
|
+
export default createXmlHttpRequestTracker;
|
|
75
|
+
//# sourceMappingURL=request-tracker-xhr.js.map
|
|
@@ -0,0 +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","get","existingHandler","removeEventListener","startContext","type","span","onRequestEnd","start","onReadyStateChange","readyState","DONE","activeSpan","endContext","status","state","delete","addEventListener"],"sourceRoot":"../../../src","sources":["network-interceptor/request-tracker-xhr.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export class RequestTracker {
|
|
4
|
+
callbacks = [];
|
|
5
|
+
onStart(startCallback) {
|
|
6
|
+
this.callbacks.push(startCallback);
|
|
7
|
+
}
|
|
8
|
+
start(context) {
|
|
9
|
+
const results = [];
|
|
10
|
+
for (const startCallback of this.callbacks) {
|
|
11
|
+
const result = startCallback(context);
|
|
12
|
+
if (result) results.push(result);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
onRequestEnd: endContext => {
|
|
16
|
+
for (const result of results) {
|
|
17
|
+
if (result && result.onRequestEnd) {
|
|
18
|
+
result.onRequestEnd(endContext);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=request-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RequestTracker","callbacks","onStart","startCallback","push","start","context","results","result","onRequestEnd","endContext"],"sourceRoot":"../../../src","sources":["network-interceptor/request-tracker.ts"],"mappings":";;AAMA,OAAO,MAAMA,cAAc,CAAC;EAClBC,SAAS,GAA2B,EAAE;EAE9CC,OAAOA,CAACC,aAAmC,EAAE;IAC3C,IAAI,CAACF,SAAS,CAACG,IAAI,CAACD,aAAa,CAAC;EACpC;EAEAE,KAAKA,CAACC,OAA4B,EAAE;IAClC,MAAMC,OAAgD,GAAG,EAAE;IAC3D,KAAK,MAAMJ,aAAa,IAAI,IAAI,CAACF,SAAS,EAAE;MAC1C,MAAMO,MAAM,GAAGL,aAAa,CAACG,OAAO,CAAC;MACrC,IAAIE,MAAM,EAAED,OAAO,CAACH,IAAI,CAACI,MAAM,CAAC;IAClC;IAEA,OAAO;MACLC,YAAY,EAAGC,UAA6B,IAAK;QAC/C,KAAK,MAAMF,MAAM,IAAID,OAAO,EAAE;UAC5B,IAAIC,MAAM,IAAIA,MAAM,CAACC,YAAY,EAAE;YACjCD,MAAM,CAACC,YAAY,CAACC,UAAU,CAAC;UACjC;QACF;MACF;IACF,CAAC;EACH;AACF","ignoreList":[]}
|