@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.
Files changed (118) hide show
  1. package/LICENSE +20 -0
  2. package/PulseReactNativeOtel.podspec +21 -0
  3. package/README.md +900 -0
  4. package/android/build.gradle +97 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/proguard-rules.pro +108 -0
  7. package/android/src/main/AndroidManifest.xml +2 -0
  8. package/android/src/main/java/com/pulsereactnativeotel/PulseOtelConstants.kt +20 -0
  9. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelLogger.kt +73 -0
  10. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelModule.kt +85 -0
  11. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelPackage.kt +33 -0
  12. package/android/src/main/java/com/pulsereactnativeotel/PulseReactNativeOtelTracer.kt +127 -0
  13. package/ios/PulseReactNativeOtel.h +5 -0
  14. package/ios/PulseReactNativeOtel.mm +100 -0
  15. package/lib/module/NativePulseReactNativeOtel.js +5 -0
  16. package/lib/module/NativePulseReactNativeOtel.js.map +1 -0
  17. package/lib/module/config.js +55 -0
  18. package/lib/module/config.js.map +1 -0
  19. package/lib/module/errorBoundary.js +62 -0
  20. package/lib/module/errorBoundary.js.map +1 -0
  21. package/lib/module/errorHandler.js +112 -0
  22. package/lib/module/errorHandler.js.map +1 -0
  23. package/lib/module/events.js +14 -0
  24. package/lib/module/events.js.map +1 -0
  25. package/lib/module/global.d.js +4 -0
  26. package/lib/module/global.d.js.map +1 -0
  27. package/lib/module/globalAttributes.js +13 -0
  28. package/lib/module/globalAttributes.js.map +1 -0
  29. package/lib/module/index.js +27 -0
  30. package/lib/module/index.js.map +1 -0
  31. package/lib/module/initialization.js +18 -0
  32. package/lib/module/initialization.js.map +1 -0
  33. package/lib/module/network-interceptor/initialization.js +25 -0
  34. package/lib/module/network-interceptor/initialization.js.map +1 -0
  35. package/lib/module/network-interceptor/network.interface.js +2 -0
  36. package/lib/module/network-interceptor/network.interface.js.map +1 -0
  37. package/lib/module/network-interceptor/request-tracker-fetch.js +72 -0
  38. package/lib/module/network-interceptor/request-tracker-fetch.js.map +1 -0
  39. package/lib/module/network-interceptor/request-tracker-xhr.js +75 -0
  40. package/lib/module/network-interceptor/request-tracker-xhr.js.map +1 -0
  41. package/lib/module/network-interceptor/request-tracker.js +25 -0
  42. package/lib/module/network-interceptor/request-tracker.js.map +1 -0
  43. package/lib/module/network-interceptor/span-helpers.js +62 -0
  44. package/lib/module/network-interceptor/span-helpers.js.map +1 -0
  45. package/lib/module/network-interceptor/url-helper.js +127 -0
  46. package/lib/module/network-interceptor/url-helper.js.map +1 -0
  47. package/lib/module/pulse.interface.js +2 -0
  48. package/lib/module/pulse.interface.js.map +1 -0
  49. package/lib/module/reactNavigation.js +100 -0
  50. package/lib/module/reactNavigation.js.map +1 -0
  51. package/lib/module/trace.js +75 -0
  52. package/lib/module/trace.js.map +1 -0
  53. package/lib/module/user.js +23 -0
  54. package/lib/module/user.js.map +1 -0
  55. package/lib/module/utility.js +34 -0
  56. package/lib/module/utility.js.map +1 -0
  57. package/lib/typescript/src/NativePulseReactNativeOtel.d.ts +31 -0
  58. package/lib/typescript/src/NativePulseReactNativeOtel.d.ts.map +1 -0
  59. package/lib/typescript/src/config.d.ts +14 -0
  60. package/lib/typescript/src/config.d.ts.map +1 -0
  61. package/lib/typescript/src/errorBoundary.d.ts +26 -0
  62. package/lib/typescript/src/errorBoundary.d.ts.map +1 -0
  63. package/lib/typescript/src/errorHandler.d.ts +4 -0
  64. package/lib/typescript/src/errorHandler.d.ts.map +1 -0
  65. package/lib/typescript/src/events.d.ts +3 -0
  66. package/lib/typescript/src/events.d.ts.map +1 -0
  67. package/lib/typescript/src/globalAttributes.d.ts +4 -0
  68. package/lib/typescript/src/globalAttributes.d.ts.map +1 -0
  69. package/lib/typescript/src/index.d.ts +30 -0
  70. package/lib/typescript/src/index.d.ts.map +1 -0
  71. package/lib/typescript/src/initialization.d.ts +3 -0
  72. package/lib/typescript/src/initialization.d.ts.map +1 -0
  73. package/lib/typescript/src/network-interceptor/initialization.d.ts +3 -0
  74. package/lib/typescript/src/network-interceptor/initialization.d.ts.map +1 -0
  75. package/lib/typescript/src/network-interceptor/network.interface.d.ts +29 -0
  76. package/lib/typescript/src/network-interceptor/network.interface.d.ts.map +1 -0
  77. package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts +7 -0
  78. package/lib/typescript/src/network-interceptor/request-tracker-fetch.d.ts.map +1 -0
  79. package/lib/typescript/src/network-interceptor/request-tracker-xhr.d.ts +4 -0
  80. package/lib/typescript/src/network-interceptor/request-tracker-xhr.d.ts.map +1 -0
  81. package/lib/typescript/src/network-interceptor/request-tracker.d.ts +9 -0
  82. package/lib/typescript/src/network-interceptor/request-tracker.d.ts.map +1 -0
  83. package/lib/typescript/src/network-interceptor/span-helpers.d.ts +7 -0
  84. package/lib/typescript/src/network-interceptor/span-helpers.d.ts.map +1 -0
  85. package/lib/typescript/src/network-interceptor/url-helper.d.ts +38 -0
  86. package/lib/typescript/src/network-interceptor/url-helper.d.ts.map +1 -0
  87. package/lib/typescript/src/pulse.interface.d.ts +8 -0
  88. package/lib/typescript/src/pulse.interface.d.ts.map +1 -0
  89. package/lib/typescript/src/reactNavigation.d.ts +10 -0
  90. package/lib/typescript/src/reactNavigation.d.ts.map +1 -0
  91. package/lib/typescript/src/trace.d.ts +19 -0
  92. package/lib/typescript/src/trace.d.ts.map +1 -0
  93. package/lib/typescript/src/user.d.ts +5 -0
  94. package/lib/typescript/src/user.d.ts.map +1 -0
  95. package/lib/typescript/src/utility.d.ts +8 -0
  96. package/lib/typescript/src/utility.d.ts.map +1 -0
  97. package/package.json +165 -0
  98. package/src/NativePulseReactNativeOtel.ts +57 -0
  99. package/src/config.ts +75 -0
  100. package/src/errorBoundary.tsx +92 -0
  101. package/src/errorHandler.ts +169 -0
  102. package/src/events.ts +15 -0
  103. package/src/global.d.ts +9 -0
  104. package/src/globalAttributes.ts +16 -0
  105. package/src/index.tsx +35 -0
  106. package/src/initialization.ts +18 -0
  107. package/src/network-interceptor/initialization.ts +28 -0
  108. package/src/network-interceptor/network.interface.ts +36 -0
  109. package/src/network-interceptor/request-tracker-fetch.ts +96 -0
  110. package/src/network-interceptor/request-tracker-xhr.ts +108 -0
  111. package/src/network-interceptor/request-tracker.ts +31 -0
  112. package/src/network-interceptor/span-helpers.ts +84 -0
  113. package/src/network-interceptor/url-helper.ts +155 -0
  114. package/src/pulse.interface.ts +14 -0
  115. package/src/reactNavigation.tsx +146 -0
  116. package/src/trace.ts +108 -0
  117. package/src/user.ts +24 -0
  118. 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":"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","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,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=global.d.js.map
@@ -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,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=network.interface.js.map
@@ -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":[]}