react-native-inapp-inspector 2.3.5 → 2.3.7

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 (226) hide show
  1. package/dist/commonjs/analytics.d.ts +0 -4
  2. package/dist/commonjs/analytics.js +0 -4
  3. package/dist/commonjs/bundle.d.ts +0 -4
  4. package/dist/commonjs/bundle.js +0 -4
  5. package/dist/commonjs/components/AnalyticsDetail.js +18 -27
  6. package/dist/commonjs/components/AnalyticsEventCard.js +9 -12
  7. package/dist/commonjs/components/AnalyticsGraph.js +10 -15
  8. package/dist/commonjs/components/AppHeaderLogo.js +0 -3
  9. package/dist/commonjs/components/BrandCircleIcon.js +15 -15
  10. package/dist/commonjs/components/BrandSquareIcon.js +20 -20
  11. package/dist/commonjs/components/CodeSnippet.js +6 -19
  12. package/dist/commonjs/components/ConsoleLogCard.js +0 -1
  13. package/dist/commonjs/components/CopyButton.js +0 -4
  14. package/dist/commonjs/components/DiffViewer.js +0 -2
  15. package/dist/commonjs/components/DomainHeader.js +0 -4
  16. package/dist/commonjs/components/EmptyState.js +0 -3
  17. package/dist/commonjs/components/ErrorBoundary.js +5 -10
  18. package/dist/commonjs/components/HeadersSection.js +0 -5
  19. package/dist/commonjs/components/HighlightText.js +1 -4
  20. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +11 -26
  21. package/dist/commonjs/components/Inspector/AnalyticsTab.js +34 -40
  22. package/dist/commonjs/components/Inspector/BundleTab.js +56 -84
  23. package/dist/commonjs/components/Inspector/ConsoleTab.js +7 -7
  24. package/dist/commonjs/components/Inspector/CrashDetail.js +18 -20
  25. package/dist/commonjs/components/Inspector/CrashFilterModal.js +0 -1
  26. package/dist/commonjs/components/Inspector/CrashTab.js +11 -20
  27. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +12 -24
  28. package/dist/commonjs/components/Inspector/FabLauncher.js +1 -1
  29. package/dist/commonjs/components/Inspector/InspectorContext.js +0 -2
  30. package/dist/commonjs/components/Inspector/InspectorHeader.js +7 -8
  31. package/dist/commonjs/components/Inspector/LogDetail.js +27 -29
  32. package/dist/commonjs/components/Inspector/MainScreen.js +9 -10
  33. package/dist/commonjs/components/Inspector/NetworkDetail.js +10 -11
  34. package/dist/commonjs/components/Inspector/NetworkTab.js +14 -14
  35. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +6 -9
  36. package/dist/commonjs/components/Inspector/PerformanceTab.js +30 -43
  37. package/dist/commonjs/components/Inspector/ReduxDetail.js +18 -34
  38. package/dist/commonjs/components/Inspector/ReduxTab.js +11 -20
  39. package/dist/commonjs/components/Inspector/SettingsPanel.js +32 -36
  40. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +6 -6
  41. package/dist/commonjs/components/Inspector/StorageTab.js +14 -26
  42. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -6
  43. package/dist/commonjs/components/JsonViewer.js +3 -10
  44. package/dist/commonjs/components/LogCard.js +7 -7
  45. package/dist/commonjs/components/MetaAccordion.js +1 -7
  46. package/dist/commonjs/components/NetworkIcons.js +12 -16
  47. package/dist/commonjs/components/SectionHeader.js +0 -4
  48. package/dist/commonjs/components/SkeletonPlaceholder.js +6 -6
  49. package/dist/commonjs/components/Slider.js +6 -6
  50. package/dist/commonjs/components/SourcePageCard.js +0 -4
  51. package/dist/commonjs/components/TreeNode.js +0 -4
  52. package/dist/commonjs/console.d.ts +0 -4
  53. package/dist/commonjs/console.js +0 -4
  54. package/dist/commonjs/constants/index.js +6 -9
  55. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -0
  56. package/dist/commonjs/constants/telemetryConfig.js +6 -0
  57. package/dist/commonjs/constants/version.d.ts +1 -1
  58. package/dist/commonjs/constants/version.js +1 -3
  59. package/dist/commonjs/crash.d.ts +0 -4
  60. package/dist/commonjs/crash.js +0 -4
  61. package/dist/commonjs/customHooks/analyticsLogger.d.ts +0 -7
  62. package/dist/commonjs/customHooks/analyticsLogger.js +3 -59
  63. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -9
  64. package/dist/commonjs/customHooks/bundleAnalyzer.js +3 -86
  65. package/dist/commonjs/customHooks/consoleLogger.js +0 -16
  66. package/dist/commonjs/customHooks/crashHandler.d.ts +0 -28
  67. package/dist/commonjs/customHooks/crashHandler.js +0 -55
  68. package/dist/commonjs/customHooks/logFilters.d.ts +0 -4
  69. package/dist/commonjs/customHooks/logFilters.js +0 -11
  70. package/dist/commonjs/customHooks/networkLogger.js +2 -13
  71. package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -27
  72. package/dist/commonjs/customHooks/performanceTracker.js +0 -31
  73. package/dist/commonjs/customHooks/reduxLogger.d.ts +0 -12
  74. package/dist/commonjs/customHooks/reduxLogger.js +0 -51
  75. package/dist/commonjs/customHooks/storageInspector.d.ts +0 -40
  76. package/dist/commonjs/customHooks/storageInspector.js +1 -56
  77. package/dist/commonjs/decorators/index.d.ts +0 -37
  78. package/dist/commonjs/decorators/index.js +0 -42
  79. package/dist/commonjs/helpers/gaAnalyticsRegistry.d.ts +0 -10
  80. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +0 -26
  81. package/dist/commonjs/helpers/index.d.ts +0 -7
  82. package/dist/commonjs/helpers/index.js +1 -42
  83. package/dist/commonjs/helpers/memoryManager.d.ts +0 -11
  84. package/dist/commonjs/helpers/memoryManager.js +0 -13
  85. package/dist/commonjs/helpers/searchQueryParser.d.ts +0 -4
  86. package/dist/commonjs/helpers/searchQueryParser.js +0 -18
  87. package/dist/commonjs/helpers/settingsStore.js +0 -8
  88. package/dist/commonjs/helpers/telemetry.d.ts +2 -0
  89. package/dist/commonjs/helpers/telemetry.js +136 -0
  90. package/dist/commonjs/i18n/index.d.ts +0 -9
  91. package/dist/commonjs/i18n/index.js +0 -15
  92. package/dist/commonjs/index.js +15 -97
  93. package/dist/commonjs/native/NativeInspector.d.ts +0 -54
  94. package/dist/commonjs/native/NativeInspector.js +0 -56
  95. package/dist/commonjs/network.d.ts +0 -4
  96. package/dist/commonjs/network.js +0 -4
  97. package/dist/commonjs/performance.d.ts +0 -4
  98. package/dist/commonjs/performance.js +0 -4
  99. package/dist/commonjs/redux.d.ts +0 -4
  100. package/dist/commonjs/redux.js +0 -4
  101. package/dist/commonjs/storage.d.ts +0 -4
  102. package/dist/commonjs/storage.js +0 -4
  103. package/dist/commonjs/styles/AppColors.d.ts +0 -3
  104. package/dist/commonjs/styles/AppColors.js +15 -30
  105. package/dist/commonjs/styles/AppFonts.d.ts +0 -4
  106. package/dist/commonjs/styles/AppFonts.js +0 -4
  107. package/dist/commonjs/styles/common.js +0 -11
  108. package/dist/commonjs/styles/index.js +0 -8
  109. package/dist/commonjs/types/enums.js +0 -3
  110. package/dist/commonjs/types/interfaces.d.ts +3 -3
  111. package/dist/esm/analytics.d.ts +0 -4
  112. package/dist/esm/analytics.js +0 -4
  113. package/dist/esm/bundle.d.ts +0 -4
  114. package/dist/esm/bundle.js +0 -4
  115. package/dist/esm/components/AnalyticsDetail.js +18 -27
  116. package/dist/esm/components/AnalyticsEventCard.js +9 -12
  117. package/dist/esm/components/AnalyticsGraph.js +10 -15
  118. package/dist/esm/components/AppHeaderLogo.js +0 -3
  119. package/dist/esm/components/BrandCircleIcon.js +15 -15
  120. package/dist/esm/components/BrandSquareIcon.js +20 -20
  121. package/dist/esm/components/CodeSnippet.js +6 -19
  122. package/dist/esm/components/ConsoleLogCard.js +0 -1
  123. package/dist/esm/components/CopyButton.js +0 -4
  124. package/dist/esm/components/DiffViewer.js +0 -2
  125. package/dist/esm/components/DomainHeader.js +0 -4
  126. package/dist/esm/components/EmptyState.js +0 -3
  127. package/dist/esm/components/ErrorBoundary.js +5 -10
  128. package/dist/esm/components/HeadersSection.js +0 -5
  129. package/dist/esm/components/HighlightText.js +1 -4
  130. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +11 -26
  131. package/dist/esm/components/Inspector/AnalyticsTab.js +34 -40
  132. package/dist/esm/components/Inspector/BundleTab.js +56 -84
  133. package/dist/esm/components/Inspector/ConsoleTab.js +7 -7
  134. package/dist/esm/components/Inspector/CrashDetail.js +18 -20
  135. package/dist/esm/components/Inspector/CrashFilterModal.js +0 -1
  136. package/dist/esm/components/Inspector/CrashTab.js +11 -20
  137. package/dist/esm/components/Inspector/DeviceInfoTab.js +12 -24
  138. package/dist/esm/components/Inspector/FabLauncher.js +1 -1
  139. package/dist/esm/components/Inspector/InspectorContext.js +0 -2
  140. package/dist/esm/components/Inspector/InspectorHeader.js +7 -8
  141. package/dist/esm/components/Inspector/LogDetail.js +27 -29
  142. package/dist/esm/components/Inspector/MainScreen.js +9 -10
  143. package/dist/esm/components/Inspector/NetworkDetail.js +10 -11
  144. package/dist/esm/components/Inspector/NetworkTab.js +14 -14
  145. package/dist/esm/components/Inspector/NpmUpdateToast.js +6 -9
  146. package/dist/esm/components/Inspector/PerformanceTab.js +30 -43
  147. package/dist/esm/components/Inspector/ReduxDetail.js +18 -34
  148. package/dist/esm/components/Inspector/ReduxTab.js +11 -20
  149. package/dist/esm/components/Inspector/SettingsPanel.js +32 -36
  150. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +6 -6
  151. package/dist/esm/components/Inspector/StorageTab.js +14 -26
  152. package/dist/esm/components/Inspector/UpdateAvailableModal.js +5 -6
  153. package/dist/esm/components/JsonViewer.js +3 -10
  154. package/dist/esm/components/LogCard.js +7 -7
  155. package/dist/esm/components/MetaAccordion.js +1 -7
  156. package/dist/esm/components/NetworkIcons.js +12 -16
  157. package/dist/esm/components/SectionHeader.js +0 -4
  158. package/dist/esm/components/SkeletonPlaceholder.js +6 -6
  159. package/dist/esm/components/Slider.js +6 -6
  160. package/dist/esm/components/SourcePageCard.js +0 -4
  161. package/dist/esm/components/TreeNode.js +0 -4
  162. package/dist/esm/console.d.ts +0 -4
  163. package/dist/esm/console.js +0 -4
  164. package/dist/esm/constants/index.js +6 -9
  165. package/dist/esm/constants/telemetryConfig.d.ts +3 -0
  166. package/dist/esm/constants/telemetryConfig.js +3 -0
  167. package/dist/esm/constants/version.d.ts +1 -1
  168. package/dist/esm/constants/version.js +1 -3
  169. package/dist/esm/crash.d.ts +0 -4
  170. package/dist/esm/crash.js +0 -4
  171. package/dist/esm/customHooks/analyticsLogger.d.ts +0 -7
  172. package/dist/esm/customHooks/analyticsLogger.js +3 -59
  173. package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -9
  174. package/dist/esm/customHooks/bundleAnalyzer.js +3 -86
  175. package/dist/esm/customHooks/consoleLogger.js +0 -16
  176. package/dist/esm/customHooks/crashHandler.d.ts +0 -28
  177. package/dist/esm/customHooks/crashHandler.js +0 -55
  178. package/dist/esm/customHooks/logFilters.d.ts +0 -4
  179. package/dist/esm/customHooks/logFilters.js +0 -11
  180. package/dist/esm/customHooks/networkLogger.js +2 -13
  181. package/dist/esm/customHooks/performanceTracker.d.ts +0 -27
  182. package/dist/esm/customHooks/performanceTracker.js +0 -31
  183. package/dist/esm/customHooks/reduxLogger.d.ts +0 -12
  184. package/dist/esm/customHooks/reduxLogger.js +0 -51
  185. package/dist/esm/customHooks/storageInspector.d.ts +0 -40
  186. package/dist/esm/customHooks/storageInspector.js +1 -56
  187. package/dist/esm/decorators/index.d.ts +0 -37
  188. package/dist/esm/decorators/index.js +0 -42
  189. package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +0 -10
  190. package/dist/esm/helpers/gaAnalyticsRegistry.js +0 -26
  191. package/dist/esm/helpers/index.d.ts +0 -7
  192. package/dist/esm/helpers/index.js +1 -42
  193. package/dist/esm/helpers/memoryManager.d.ts +0 -11
  194. package/dist/esm/helpers/memoryManager.js +0 -13
  195. package/dist/esm/helpers/searchQueryParser.d.ts +0 -4
  196. package/dist/esm/helpers/searchQueryParser.js +0 -18
  197. package/dist/esm/helpers/settingsStore.js +0 -8
  198. package/dist/esm/helpers/telemetry.d.ts +2 -0
  199. package/dist/esm/helpers/telemetry.js +132 -0
  200. package/dist/esm/i18n/index.d.ts +0 -9
  201. package/dist/esm/i18n/index.js +0 -15
  202. package/dist/esm/index.js +15 -97
  203. package/dist/esm/native/NativeInspector.d.ts +0 -54
  204. package/dist/esm/native/NativeInspector.js +0 -56
  205. package/dist/esm/network.d.ts +0 -4
  206. package/dist/esm/network.js +0 -4
  207. package/dist/esm/performance.d.ts +0 -4
  208. package/dist/esm/performance.js +0 -4
  209. package/dist/esm/redux.d.ts +0 -4
  210. package/dist/esm/redux.js +0 -4
  211. package/dist/esm/storage.d.ts +0 -4
  212. package/dist/esm/storage.js +0 -4
  213. package/dist/esm/styles/AppColors.d.ts +0 -3
  214. package/dist/esm/styles/AppColors.js +15 -30
  215. package/dist/esm/styles/AppFonts.d.ts +0 -4
  216. package/dist/esm/styles/AppFonts.js +0 -4
  217. package/dist/esm/styles/common.js +0 -11
  218. package/dist/esm/styles/index.js +0 -8
  219. package/dist/esm/types/enums.js +0 -3
  220. package/dist/esm/types/interfaces.d.ts +3 -3
  221. package/package.json +2 -2
  222. package/src/constants/telemetryConfig.ts +6 -0
  223. package/src/constants/version.ts +1 -1
  224. package/src/helpers/telemetry.ts +161 -0
  225. package/src/index.tsx +15 -1
  226. package/src/types/interfaces.ts +3 -0
@@ -55,7 +55,6 @@ export interface ConsoleLog {
55
55
  errorStack?: string;
56
56
  rawArgs?: any[];
57
57
  sourceMethod?: 'log' | 'info' | 'warn' | 'error';
58
- /** #9 — number of consecutive identical logs collapsed into this entry. */
59
58
  duplicateCount?: number;
60
59
  }
61
60
  export interface AnalyticsEvent {
@@ -101,9 +100,7 @@ export interface NetworkLog {
101
100
  response?: unknown;
102
101
  requestHeaders?: Record<string, string>;
103
102
  responseHeaders?: Record<string, string>;
104
- /** #9 — number of consecutive identical requests collapsed into this entry. */
105
103
  duplicateCount?: number;
106
- /** Client identifier: axios, fetch, xhr, apollo, etc. */
107
104
  client?: 'axios' | 'fetch' | 'xhr' | 'apollo' | 'graphql' | string;
108
105
  caller?: string;
109
106
  routeInfo?: RouteInfo;
@@ -154,9 +151,12 @@ export interface PersistedSettings {
154
151
  reduxExpandDepth?: number;
155
152
  showDuplicateLogs?: boolean;
156
153
  showUpdateToast?: boolean;
154
+ telemetryClientId?: string;
155
+ telemetryLastPing?: number;
157
156
  }
158
157
  export interface NetworkInspectorProps {
159
158
  enabled?: boolean;
159
+ telemetry?: boolean;
160
160
  storage?: InspectorStorage;
161
161
  navigationRef?: any;
162
162
  appIcon?: any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-inapp-inspector",
3
- "version": "2.3.5",
3
+ "version": "2.3.7",
4
4
  "description": "The zero-config, all-in-one in-app debugger for React Native & Expo. Inspect Network (fetch/axios), Console logs, Stack Traces, Redux State, Firebase Analytics, and JS Bundle size directly on device.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -100,7 +100,7 @@
100
100
  },
101
101
  "scripts": {
102
102
  "clean": "rm -rf dist",
103
- "prebuild": "node scripts/gen-version.js",
103
+ "prebuild": "node scripts/gen-version.js && node scripts/gen-telemetry.js",
104
104
  "build": "npm run clean && tsc && tsc -p tsconfig.esm.json",
105
105
  "prepare": "npm run build",
106
106
  "watch": "tsc -w",
@@ -0,0 +1,6 @@
1
+ // AUTO-GENERATED FILE — do not edit by hand.
2
+ // Generated by scripts/gen-telemetry.js from .env at build time.
3
+
4
+ export const ENC_MID = 'df8ace0290a695bd05986213';
5
+ export const ENC_SEC = 'db93cb0186b1f7bb0ba63a0d0a64997586849455ce37';
6
+ export const TELEMETRY_SALT = 'rn-inapp-inspector-telemetry-v1';
@@ -1,3 +1,3 @@
1
1
  // AUTO-GENERATED FILE — do not edit by hand.
2
2
  // Regenerated from package.json on every build by scripts/gen-version.js.
3
- export const LIB_VERSION = '2.3.5';
3
+ export const LIB_VERSION = '2.3.7';
@@ -0,0 +1,161 @@
1
+ import {Platform} from 'react-native';
2
+ import {LIB_VERSION} from '../constants/version';
3
+ import {loadSettings, saveSettings} from './settingsStore';
4
+ import {
5
+ ENC_MID,
6
+ ENC_SEC,
7
+ TELEMETRY_SALT,
8
+ } from '../constants/telemetryConfig';
9
+
10
+ // ─── Runtime Keystream Deobfuscation ────────────────────────────────────────
11
+
12
+ const PKG_NAME = 'react-native-inapp-inspector';
13
+ const KEY_MATERIAL = `${PKG_NAME}::${TELEMETRY_SALT}`;
14
+
15
+ function getKeystream(material: string, length: number): number[] {
16
+ const stream: number[] = [];
17
+ let acc = 0x5a827999;
18
+ for (let i = 0; i < length; i++) {
19
+ const charCode = material.charCodeAt(i % material.length);
20
+ acc = ((acc * 31 + charCode * 17 + i * 13) ^ (acc >>> 7)) & 0xffffffff;
21
+ stream.push((acc >>> (i % 24)) & 0xff);
22
+ }
23
+ return stream;
24
+ }
25
+
26
+ function deobfuscate(hexStr: string): string {
27
+ if (!hexStr) return '';
28
+ const bytes: number[] = [];
29
+ for (let i = 0; i < hexStr.length; i += 2) {
30
+ bytes.push(parseInt(hexStr.substring(i, i + 2), 16));
31
+ }
32
+ const keystream = getKeystream(KEY_MATERIAL, bytes.length);
33
+ const out: string[] = [];
34
+ for (let i = 0; i < bytes.length; i++) {
35
+ const k = keystream[i];
36
+ const s = TELEMETRY_SALT.charCodeAt(i % TELEMETRY_SALT.length);
37
+ const dec = (bytes[i] ^ k ^ s) & 0xff;
38
+ out.push(String.fromCharCode(dec));
39
+ }
40
+ return out.join('');
41
+ }
42
+
43
+ // ─── Lazy-initialized credentials ──────────────────────────────────────────
44
+ let _cachedMid: string | null = null;
45
+ let _cachedSec: string | null = null;
46
+
47
+ function getCredentials(): {measurementId: string; apiSecret: string} {
48
+ if (_cachedMid !== null && _cachedSec !== null) {
49
+ return {measurementId: _cachedMid, apiSecret: _cachedSec};
50
+ }
51
+
52
+ if (!ENC_MID || !ENC_SEC || !TELEMETRY_SALT) {
53
+ _cachedMid = '';
54
+ _cachedSec = '';
55
+ return {measurementId: '', apiSecret: ''};
56
+ }
57
+
58
+ try {
59
+ _cachedMid = deobfuscate(ENC_MID);
60
+ _cachedSec = deobfuscate(ENC_SEC);
61
+ } catch {
62
+ _cachedMid = '';
63
+ _cachedSec = '';
64
+ }
65
+
66
+ return {measurementId: _cachedMid, apiSecret: _cachedSec};
67
+ }
68
+
69
+ function getCollectUrl(): string {
70
+ const {measurementId, apiSecret} = getCredentials();
71
+ if (!measurementId || !apiSecret) return '';
72
+ return `https://www.google-analytics.com/mp/collect?measurement_id=${measurementId}&api_secret=${apiSecret}`;
73
+ }
74
+
75
+ // ─── Telemetry State & Heartbeat ───────────────────────────────────────────
76
+
77
+ const PING_INTERVAL_MS = 24 * 60 * 60 * 1000;
78
+
79
+ let isTelemetryEnabled = true;
80
+
81
+ export function setTelemetryEnabled(enabled: boolean): void {
82
+ isTelemetryEnabled = enabled;
83
+ }
84
+
85
+ async function getOrCreateClientId(): Promise<string> {
86
+ try {
87
+ const settings = await loadSettings();
88
+ if (settings.telemetryClientId) {
89
+ return settings.telemetryClientId;
90
+ }
91
+ const part1 = Math.floor(100000000 + Math.random() * 900000000);
92
+ const part2 = Math.floor(1000000000 + Math.random() * 9000000000);
93
+ const newId = `${part1}.${part2}`;
94
+ saveSettings({...settings, telemetryClientId: newId});
95
+ return newId;
96
+ } catch {
97
+ return `${Math.floor(100000000 + Math.random() * 900000000)}.${Math.floor(1000000000 + Math.random() * 9000000000)}`;
98
+ }
99
+ }
100
+
101
+ function getSystemMetadata(environment?: string) {
102
+ const rnConstants = Platform.constants as any;
103
+ const rnVersion = rnConstants?.reactNativeVersion
104
+ ? `${rnConstants.reactNativeVersion.major}.${rnConstants.reactNativeVersion.minor}.${rnConstants.reactNativeVersion.patch}`
105
+ : 'unknown';
106
+
107
+ const isHermes = Boolean(typeof (global as any).HermesInternal === 'object' && (global as any).HermesInternal !== null);
108
+ const isFabric = Boolean((global as any)?.nativeFabricUIManager !== undefined);
109
+ const isDev = Boolean(typeof __DEV__ !== 'undefined' && __DEV__);
110
+
111
+ return {
112
+ lib_version: LIB_VERSION,
113
+ platform: Platform.OS,
114
+ os_version: String(Platform.Version || 'unknown'),
115
+ rn_version: rnVersion,
116
+ is_hermes: isHermes,
117
+ is_fabric: isFabric,
118
+ is_dev: isDev,
119
+ environment: environment || (isDev ? 'DEV' : 'PROD'),
120
+ engagement_time_msec: 1000,
121
+ };
122
+ }
123
+
124
+ export async function trackActiveTelemetryHeartbeat(
125
+ telemetryEnabled = true,
126
+ environment?: string,
127
+ ): Promise<void> {
128
+ if (telemetryEnabled === false) {
129
+ isTelemetryEnabled = false;
130
+ return;
131
+ }
132
+ isTelemetryEnabled = true;
133
+
134
+ const url = getCollectUrl();
135
+ if (!url) return;
136
+
137
+ try {
138
+ const settings = await loadSettings();
139
+ const lastPing = settings.telemetryLastPing || 0;
140
+ const now = Date.now();
141
+
142
+ if (now - lastPing < PING_INTERVAL_MS) return;
143
+
144
+ const clientId = await getOrCreateClientId();
145
+ const params = getSystemMetadata(environment);
146
+
147
+ await fetch(url, {
148
+ method: 'POST',
149
+ headers: {'Content-Type': 'application/json'},
150
+ body: JSON.stringify({
151
+ client_id: clientId,
152
+ non_personalized_ads: true,
153
+ events: [{name: 'inspector_active_heartbeat', params}],
154
+ }),
155
+ });
156
+
157
+ saveSettings({...settings, telemetryLastPing: now});
158
+ } catch {
159
+ // silent
160
+ }
161
+ }
package/src/index.tsx CHANGED
@@ -84,6 +84,11 @@ import {
84
84
  setCrashModuleEnabled,
85
85
  } from './customHooks/crashHandler';
86
86
 
87
+ import {
88
+ trackActiveTelemetryHeartbeat,
89
+ setTelemetryEnabled,
90
+ } from './helpers/telemetry';
91
+
87
92
  import {
88
93
  subscribeAnalyticsEvents,
89
94
  clearAnalyticsEvents,
@@ -2170,15 +2175,24 @@ const NetworkInspector = ({
2170
2175
 
2171
2176
  const NetworkInspectorWrapper = (props: NetworkInspectorProps) => {
2172
2177
  const enabled = props?.enabled ?? true;
2178
+ const telemetry = props?.telemetry ?? true;
2173
2179
 
2174
2180
  useEffect(() => {
2175
2181
  if (!enabled) {
2182
+ // When inspector is disabled: hide FAB and kill all telemetry
2176
2183
  hideNativeFloatingButton().catch(() => {});
2184
+ setTelemetryEnabled(false);
2185
+ } else if (telemetry) {
2186
+ // Inspector is enabled and telemetry is on — fire heartbeat
2187
+ trackActiveTelemetryHeartbeat(true, props?.environment);
2188
+ } else {
2189
+ // Inspector is enabled but telemetry is explicitly off
2190
+ setTelemetryEnabled(false);
2177
2191
  }
2178
2192
  return () => {
2179
2193
  hideNativeFloatingButton().catch(() => {});
2180
2194
  };
2181
- }, [enabled]);
2195
+ }, [enabled, telemetry, props?.environment]);
2182
2196
 
2183
2197
  // If enabled is false, return null immediately with 0 overhead
2184
2198
  if (!enabled) {
@@ -180,12 +180,15 @@ export interface PersistedSettings {
180
180
  reduxExpandDepth?: number;
181
181
  showDuplicateLogs?: boolean;
182
182
  showUpdateToast?: boolean;
183
+ telemetryClientId?: string;
184
+ telemetryLastPing?: number;
183
185
  }
184
186
 
185
187
  // ─── Inspector component props / context ──────────────────────────────────────
186
188
 
187
189
  export interface NetworkInspectorProps {
188
190
  enabled?: boolean;
191
+ telemetry?: boolean;
189
192
  storage?: InspectorStorage;
190
193
  navigationRef?: any;
191
194
  appIcon?: any;