react-native-inapp-inspector 2.4.1 → 2.4.2

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 (231) hide show
  1. package/README.ar.md +163 -0
  2. package/README.de.md +163 -0
  3. package/README.es.md +164 -0
  4. package/README.fr.md +163 -0
  5. package/README.hi.md +163 -0
  6. package/README.ja.md +180 -0
  7. package/README.ko.md +163 -0
  8. package/README.md +340 -243
  9. package/README.pt-BR.md +163 -0
  10. package/README.ru.md +163 -0
  11. package/README.zh-CN.md +387 -0
  12. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +82 -21
  13. package/assets/banner_dark.svg +186 -0
  14. package/assets/banner_light.svg +186 -0
  15. package/assets/icon_circle.svg +148 -0
  16. package/assets/icon_square.svg +369 -0
  17. package/assets/inapp_inspector_icon.gif +0 -0
  18. package/assets/inapp_inspector_icon_original.gif +0 -0
  19. package/assets/social_preview.png +0 -0
  20. package/assets/walkthrough.gif +0 -0
  21. package/dist/commonjs/components/AnimatedBrandOwl.d.ts +7 -0
  22. package/dist/commonjs/components/AnimatedBrandOwl.js +175 -0
  23. package/dist/commonjs/components/AppHeaderLogo.d.ts +1 -0
  24. package/dist/commonjs/components/AppHeaderLogo.js +7 -5
  25. package/dist/commonjs/components/BrandSquareIcon.d.ts +5 -0
  26. package/dist/commonjs/components/BrandSquareIcon.js +139 -0
  27. package/dist/commonjs/components/ConsoleLogCard.d.ts +2 -1
  28. package/dist/commonjs/components/ConsoleLogCard.js +23 -39
  29. package/dist/commonjs/components/Inspector/AboutModal.js +44 -54
  30. package/dist/commonjs/components/Inspector/AnalyticsTab.js +5 -5
  31. package/dist/commonjs/components/Inspector/ConfirmationModal.d.ts +13 -0
  32. package/dist/commonjs/components/Inspector/ConfirmationModal.js +32 -0
  33. package/dist/commonjs/components/Inspector/ConsoleTab.js +11 -11
  34. package/dist/commonjs/components/Inspector/CrashTab.js +14 -12
  35. package/dist/commonjs/components/Inspector/DebuggingTab.js +17 -17
  36. package/dist/commonjs/components/Inspector/FabLauncher.js +22 -30
  37. package/dist/commonjs/components/Inspector/FeatureUnderDevNotice.js +2 -2
  38. package/dist/commonjs/components/Inspector/LanguageSelectorModal.d.ts +15 -0
  39. package/dist/commonjs/components/Inspector/LanguageSelectorModal.js +90 -0
  40. package/dist/commonjs/components/Inspector/MainScreen.js +46 -33
  41. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +21 -19
  42. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +85 -101
  43. package/dist/commonjs/components/Inspector/NetworkTab.js +50 -50
  44. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +1 -1
  45. package/dist/commonjs/components/Inspector/PushCard.d.ts +3 -2
  46. package/dist/commonjs/components/Inspector/PushCard.js +5 -4
  47. package/dist/commonjs/components/Inspector/PushDetail.js +32 -23
  48. package/dist/commonjs/components/Inspector/PushTab.js +12 -12
  49. package/dist/commonjs/components/Inspector/ReduxDetail.js +32 -32
  50. package/dist/commonjs/components/Inspector/ReduxTab.js +5 -5
  51. package/dist/commonjs/components/Inspector/SettingsPanel.js +258 -139
  52. package/dist/commonjs/components/Inspector/SocketCard.d.ts +5 -0
  53. package/dist/commonjs/components/Inspector/SocketCard.js +116 -0
  54. package/dist/commonjs/components/Inspector/SocketDetail.d.ts +4 -0
  55. package/dist/commonjs/components/Inspector/SocketDetail.js +317 -0
  56. package/dist/commonjs/components/Inspector/SocketFilterModal.d.ts +13 -0
  57. package/dist/commonjs/components/Inspector/SocketFilterModal.js +69 -0
  58. package/dist/commonjs/components/Inspector/SocketTab.d.ts +3 -0
  59. package/dist/commonjs/components/Inspector/SocketTab.js +112 -0
  60. package/dist/commonjs/components/Inspector/StorageTab.js +38 -36
  61. package/dist/commonjs/components/Inspector/SupportModal.d.ts +7 -0
  62. package/dist/commonjs/components/Inspector/SupportModal.js +125 -0
  63. package/dist/commonjs/components/Inspector/SupportPage.d.ts +5 -0
  64. package/dist/commonjs/components/Inspector/SupportPage.js +227 -0
  65. package/dist/commonjs/components/Inspector/TabBar.js +24 -23
  66. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +24 -24
  67. package/dist/commonjs/components/JsonViewer.js +7 -7
  68. package/dist/commonjs/components/LogCard.d.ts +3 -2
  69. package/dist/commonjs/components/LogCard.js +13 -13
  70. package/dist/commonjs/components/LogSyntaxHighlighter.js +5 -5
  71. package/dist/commonjs/components/ModuleErrorBoundary.js +2 -2
  72. package/dist/commonjs/components/NetworkIcons.d.ts +15 -0
  73. package/dist/commonjs/components/NetworkIcons.js +38 -3
  74. package/dist/commonjs/components/SegmentedTabs.js +1 -1
  75. package/dist/commonjs/constants/version.d.ts +1 -1
  76. package/dist/commonjs/constants/version.js +1 -1
  77. package/dist/commonjs/customHooks/socketLogger.d.ts +26 -0
  78. package/dist/commonjs/customHooks/socketLogger.js +2 -0
  79. package/dist/commonjs/helpers/index.js +3 -3
  80. package/dist/commonjs/helpers/memoryManager.d.ts +1 -0
  81. package/dist/commonjs/helpers/memoryManager.js +1 -1
  82. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  83. package/dist/commonjs/helpers/searchQueryParser.js +5 -1
  84. package/dist/commonjs/helpers/settingsStore.d.ts +1 -0
  85. package/dist/commonjs/helpers/settingsStore.js +1 -1
  86. package/dist/commonjs/helpers/shareFormatter.d.ts +3 -1
  87. package/dist/commonjs/helpers/shareFormatter.js +8 -7
  88. package/dist/commonjs/i18n/index.d.ts +99 -1
  89. package/dist/commonjs/i18n/index.js +1 -1
  90. package/dist/commonjs/i18n/locales/ar.json +1 -1
  91. package/dist/commonjs/i18n/locales/bn.json +1 -0
  92. package/dist/commonjs/i18n/locales/de.json +1 -1
  93. package/dist/commonjs/i18n/locales/en.json +1 -1
  94. package/dist/commonjs/i18n/locales/es.json +1 -1
  95. package/dist/commonjs/i18n/locales/fr.json +1 -1
  96. package/dist/commonjs/i18n/locales/gu.json +1 -0
  97. package/dist/commonjs/i18n/locales/hi.json +1 -1
  98. package/dist/commonjs/i18n/locales/id.json +1 -0
  99. package/dist/commonjs/i18n/locales/it.json +1 -0
  100. package/dist/commonjs/i18n/locales/ja.json +1 -1
  101. package/dist/commonjs/i18n/locales/kn.json +1 -0
  102. package/dist/commonjs/i18n/locales/ko.json +1 -1
  103. package/dist/commonjs/i18n/locales/ml.json +1 -0
  104. package/dist/commonjs/i18n/locales/mr.json +1 -0
  105. package/dist/commonjs/i18n/locales/nl.json +1 -0
  106. package/dist/commonjs/i18n/locales/pa.json +1 -0
  107. package/dist/commonjs/i18n/locales/pl.json +1 -0
  108. package/dist/commonjs/i18n/locales/pt.json +1 -1
  109. package/dist/commonjs/i18n/locales/ru.json +1 -1
  110. package/dist/commonjs/i18n/locales/ta.json +1 -0
  111. package/dist/commonjs/i18n/locales/te.json +1 -0
  112. package/dist/commonjs/i18n/locales/tr.json +1 -0
  113. package/dist/commonjs/i18n/locales/vi.json +1 -0
  114. package/dist/commonjs/i18n/locales/zh.json +1 -1
  115. package/dist/commonjs/index.d.ts +13 -13
  116. package/dist/commonjs/index.js +5 -4
  117. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  118. package/dist/commonjs/socket.d.ts +4 -0
  119. package/dist/commonjs/socket.js +1 -0
  120. package/dist/commonjs/styles/index.d.ts +23 -0
  121. package/dist/commonjs/styles/index.js +1 -1
  122. package/dist/commonjs/types/enums.d.ts +40 -0
  123. package/dist/commonjs/types/enums.js +1 -1
  124. package/dist/commonjs/types/interfaces.d.ts +122 -1
  125. package/dist/esm/components/AnimatedBrandOwl.d.ts +7 -0
  126. package/dist/esm/components/AnimatedBrandOwl.js +175 -0
  127. package/dist/esm/components/AppHeaderLogo.d.ts +1 -0
  128. package/dist/esm/components/AppHeaderLogo.js +7 -5
  129. package/dist/esm/components/BrandSquareIcon.d.ts +5 -0
  130. package/dist/esm/components/BrandSquareIcon.js +139 -0
  131. package/dist/esm/components/ConsoleLogCard.d.ts +2 -1
  132. package/dist/esm/components/ConsoleLogCard.js +61 -77
  133. package/dist/esm/components/Inspector/AboutModal.js +85 -95
  134. package/dist/esm/components/Inspector/AnalyticsTab.js +15 -15
  135. package/dist/esm/components/Inspector/ConfirmationModal.d.ts +13 -0
  136. package/dist/esm/components/Inspector/ConfirmationModal.js +32 -0
  137. package/dist/esm/components/Inspector/ConsoleTab.js +47 -47
  138. package/dist/esm/components/Inspector/CrashTab.js +34 -32
  139. package/dist/esm/components/Inspector/DebuggingTab.js +29 -29
  140. package/dist/esm/components/Inspector/FabLauncher.js +50 -58
  141. package/dist/esm/components/Inspector/FeatureUnderDevNotice.js +7 -7
  142. package/dist/esm/components/Inspector/LanguageSelectorModal.d.ts +15 -0
  143. package/dist/esm/components/Inspector/LanguageSelectorModal.js +90 -0
  144. package/dist/esm/components/Inspector/MainScreen.js +123 -110
  145. package/dist/esm/components/Inspector/MediaGalleryTab.js +64 -62
  146. package/dist/esm/components/Inspector/MediaPreviewModal.js +107 -123
  147. package/dist/esm/components/Inspector/NetworkTab.js +90 -90
  148. package/dist/esm/components/Inspector/NpmUpdateToast.js +1 -1
  149. package/dist/esm/components/Inspector/PushCard.d.ts +3 -2
  150. package/dist/esm/components/Inspector/PushCard.js +23 -22
  151. package/dist/esm/components/Inspector/PushDetail.js +34 -25
  152. package/dist/esm/components/Inspector/PushTab.js +23 -23
  153. package/dist/esm/components/Inspector/ReduxDetail.js +42 -42
  154. package/dist/esm/components/Inspector/ReduxTab.js +22 -22
  155. package/dist/esm/components/Inspector/SettingsPanel.js +495 -376
  156. package/dist/esm/components/Inspector/SocketCard.d.ts +5 -0
  157. package/dist/esm/components/Inspector/SocketCard.js +116 -0
  158. package/dist/esm/components/Inspector/SocketDetail.d.ts +4 -0
  159. package/dist/esm/components/Inspector/SocketDetail.js +317 -0
  160. package/dist/esm/components/Inspector/SocketFilterModal.d.ts +13 -0
  161. package/dist/esm/components/Inspector/SocketFilterModal.js +69 -0
  162. package/dist/esm/components/Inspector/SocketTab.d.ts +3 -0
  163. package/dist/esm/components/Inspector/SocketTab.js +112 -0
  164. package/dist/esm/components/Inspector/StorageTab.js +145 -143
  165. package/dist/esm/components/Inspector/SupportModal.d.ts +7 -0
  166. package/dist/esm/components/Inspector/SupportModal.js +125 -0
  167. package/dist/esm/components/Inspector/SupportPage.d.ts +5 -0
  168. package/dist/esm/components/Inspector/SupportPage.js +227 -0
  169. package/dist/esm/components/Inspector/TabBar.js +36 -35
  170. package/dist/esm/components/Inspector/UpdateAvailableModal.js +22 -22
  171. package/dist/esm/components/JsonViewer.js +55 -55
  172. package/dist/esm/components/LogCard.d.ts +3 -2
  173. package/dist/esm/components/LogCard.js +60 -60
  174. package/dist/esm/components/LogSyntaxHighlighter.js +5 -5
  175. package/dist/esm/components/ModuleErrorBoundary.js +23 -23
  176. package/dist/esm/components/NetworkIcons.d.ts +15 -0
  177. package/dist/esm/components/NetworkIcons.js +38 -3
  178. package/dist/esm/components/SegmentedTabs.js +7 -7
  179. package/dist/esm/constants/version.d.ts +1 -1
  180. package/dist/esm/constants/version.js +1 -1
  181. package/dist/esm/customHooks/socketLogger.d.ts +26 -0
  182. package/dist/esm/customHooks/socketLogger.js +2 -0
  183. package/dist/esm/helpers/index.js +3 -3
  184. package/dist/esm/helpers/memoryManager.d.ts +1 -0
  185. package/dist/esm/helpers/memoryManager.js +1 -1
  186. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  187. package/dist/esm/helpers/searchQueryParser.js +5 -1
  188. package/dist/esm/helpers/settingsStore.d.ts +1 -0
  189. package/dist/esm/helpers/settingsStore.js +1 -1
  190. package/dist/esm/helpers/shareFormatter.d.ts +3 -1
  191. package/dist/esm/helpers/shareFormatter.js +8 -7
  192. package/dist/esm/i18n/index.d.ts +99 -1
  193. package/dist/esm/i18n/index.js +1 -1
  194. package/dist/esm/i18n/locales/ar.json +1 -1
  195. package/dist/esm/i18n/locales/bn.json +1 -0
  196. package/dist/esm/i18n/locales/de.json +1 -1
  197. package/dist/esm/i18n/locales/en.json +1 -1
  198. package/dist/esm/i18n/locales/es.json +1 -1
  199. package/dist/esm/i18n/locales/fr.json +1 -1
  200. package/dist/esm/i18n/locales/gu.json +1 -0
  201. package/dist/esm/i18n/locales/hi.json +1 -1
  202. package/dist/esm/i18n/locales/id.json +1 -0
  203. package/dist/esm/i18n/locales/it.json +1 -0
  204. package/dist/esm/i18n/locales/ja.json +1 -1
  205. package/dist/esm/i18n/locales/kn.json +1 -0
  206. package/dist/esm/i18n/locales/ko.json +1 -1
  207. package/dist/esm/i18n/locales/ml.json +1 -0
  208. package/dist/esm/i18n/locales/mr.json +1 -0
  209. package/dist/esm/i18n/locales/nl.json +1 -0
  210. package/dist/esm/i18n/locales/pa.json +1 -0
  211. package/dist/esm/i18n/locales/pl.json +1 -0
  212. package/dist/esm/i18n/locales/pt.json +1 -1
  213. package/dist/esm/i18n/locales/ru.json +1 -1
  214. package/dist/esm/i18n/locales/ta.json +1 -0
  215. package/dist/esm/i18n/locales/te.json +1 -0
  216. package/dist/esm/i18n/locales/tr.json +1 -0
  217. package/dist/esm/i18n/locales/vi.json +1 -0
  218. package/dist/esm/i18n/locales/zh.json +1 -1
  219. package/dist/esm/index.d.ts +13 -13
  220. package/dist/esm/index.js +8 -7
  221. package/dist/esm/native/NativeInspector.d.ts +1 -0
  222. package/dist/esm/socket.d.ts +4 -0
  223. package/dist/esm/socket.js +1 -0
  224. package/dist/esm/styles/index.d.ts +23 -0
  225. package/dist/esm/styles/index.js +1 -1
  226. package/dist/esm/types/enums.d.ts +40 -0
  227. package/dist/esm/types/enums.js +1 -1
  228. package/dist/esm/types/interfaces.d.ts +122 -1
  229. package/ios/NetworkInspectorModule.mm +102 -12
  230. package/package.json +204 -2
  231. package/src/native/NativeInspector.ts +8 -0
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { ViewStyle } from 'react-native';
3
3
  import { Animated, PanResponderInstance } from 'react-native';
4
- import type { ActiveTab, BreadcrumbType, CrashType, GroupedListItem, LocalFilter, LogFilter, Method, PushActionType, PushAppState, SettingsPage, SettingsSubTab, SortOrder, StatusFilter } from './index';
4
+ import type { ActiveTab, BreadcrumbType, CrashType, GroupedListItem, LocalFilter, LogFilter, Method, PushActionType, PushAppState, SettingsPage, SettingsSubTab, SocketFrameDirection, SocketFrameType, SocketStatus, SortOrder, StatusFilter } from './index';
5
5
  export type SearchScope = 'all' | 'url' | 'reqBody' | 'resBody' | 'headers';
6
6
  export interface ParsedStackFrame {
7
7
  method: string;
@@ -133,6 +133,7 @@ export interface InspectorStorage {
133
133
  }
134
134
  export interface PersistedSettings {
135
135
  isDark?: boolean;
136
+ language?: string;
136
137
  modalHeightPercent?: number;
137
138
  modalAnimationType?: string;
138
139
  tabVisibility?: Record<string, boolean>;
@@ -142,6 +143,9 @@ export interface PersistedSettings {
142
143
  maxAnalyticsEventsLimit?: number;
143
144
  maxCrashLogs?: number;
144
145
  maxPushLogsLimit?: number;
146
+ maxSocketLogsLimit?: number;
147
+ isSocketAutoCaptureEnabled?: boolean;
148
+ isGroupByPageEnabled?: boolean;
145
149
  isAutoRamLimitEnabled?: boolean;
146
150
  showConsoleLevels?: {
147
151
  info: boolean;
@@ -163,6 +167,14 @@ export interface PersistedSettings {
163
167
  starPromptActioned?: boolean;
164
168
  starPromptLastShown?: number;
165
169
  starPromptFirstSeen?: number;
170
+ captureImageFormat?: 'png' | 'jpeg' | 'webp';
171
+ captureAutoHide?: boolean;
172
+ captureAudioMode?: 'none' | 'app' | 'mic';
173
+ captureFps?: number;
174
+ captureScale?: number;
175
+ captureBitrate?: number;
176
+ captureMaxDurationSeconds?: number;
177
+ captureAutoGif?: boolean;
166
178
  }
167
179
  export interface NetworkInspectorProps {
168
180
  enabled?: boolean;
@@ -185,6 +197,9 @@ export interface InspectorContextValue {
185
197
  isMinimized: boolean;
186
198
  setIsMinimized: React.Dispatch<React.SetStateAction<boolean>>;
187
199
  minimizeInspector: () => void;
200
+ isDismissed: boolean;
201
+ setIsDismissed: React.Dispatch<React.SetStateAction<boolean>>;
202
+ dismissInspector: () => void;
188
203
  isReady: boolean;
189
204
  enabled: boolean;
190
205
  isEnabled: boolean;
@@ -216,6 +231,8 @@ export interface InspectorContextValue {
216
231
  setSettingsPage: React.Dispatch<React.SetStateAction<SettingsPage>>;
217
232
  isAboutOpen: boolean;
218
233
  setIsAboutOpen: React.Dispatch<React.SetStateAction<boolean>>;
234
+ isSupportOpen: boolean;
235
+ setIsSupportOpen: React.Dispatch<React.SetStateAction<boolean>>;
219
236
  updateAvailable: boolean;
220
237
  latestNpmVersion: string | null;
221
238
  clearAnim: Animated.Value;
@@ -245,6 +262,12 @@ export interface InspectorContextValue {
245
262
  setStatusFilters: React.Dispatch<React.SetStateAction<Set<StatusFilter>>>;
246
263
  methodFilters: Set<Method>;
247
264
  setMethodFilters: React.Dispatch<React.SetStateAction<Set<Method>>>;
265
+ latencyFilter: 'all' | 'fast' | 'normal' | 'slow';
266
+ setLatencyFilter: React.Dispatch<React.SetStateAction<'all' | 'fast' | 'normal' | 'slow'>>;
267
+ protocolFilter: 'all' | 'https' | 'http';
268
+ setProtocolFilter: React.Dispatch<React.SetStateAction<'all' | 'https' | 'http'>>;
269
+ networkSortBy: 'time_desc' | 'time_asc' | 'duration_desc' | 'duration_asc' | 'size_desc';
270
+ setNetworkSortBy: React.Dispatch<React.SetStateAction<'time_desc' | 'time_asc' | 'duration_desc' | 'duration_asc' | 'size_desc'>>;
248
271
  availableMethods: Method[];
249
272
  sortOrder: SortOrder;
250
273
  setSortOrder: React.Dispatch<React.SetStateAction<SortOrder>>;
@@ -257,6 +280,8 @@ export interface InspectorContextValue {
257
280
  toggleSectionCollapse: (pageName: string) => void;
258
281
  loadMoreSection: (pageName: string, step?: number) => void;
259
282
  handleDelete: () => void;
283
+ isGroupByPageEnabled: boolean;
284
+ setIsGroupByPageEnabled: React.Dispatch<React.SetStateAction<boolean>>;
260
285
  detailTitle: string;
261
286
  detailDisplayUrl: string;
262
287
  apiDetailActiveTab: 'metadata' | 'headers' | 'request' | 'response';
@@ -332,6 +357,22 @@ export interface InspectorContextValue {
332
357
  setMaxPushLogs: React.Dispatch<React.SetStateAction<number>>;
333
358
  clearAllPushLogs: () => void;
334
359
  simulatePush: (preset?: 'salesforce' | 'fcm' | 'apns' | 'deeplink' | 'rich_media' | 'custom', customData?: any) => void;
360
+ socketRecords: SocketConnectionRecord[];
361
+ filteredSocketRecords: SocketConnectionRecord[];
362
+ selectedSocket: SocketConnectionRecord | null;
363
+ setSelectedSocket: React.Dispatch<React.SetStateAction<SocketConnectionRecord | null>>;
364
+ socketSearch: string;
365
+ setSocketSearch: React.Dispatch<React.SetStateAction<string>>;
366
+ socketQuickFilter: string;
367
+ setSocketQuickFilter: React.Dispatch<React.SetStateAction<string>>;
368
+ lastReadSocketCount: number;
369
+ unreadSocketCount: number;
370
+ maxSocketLogs: number;
371
+ setMaxSocketLogs: React.Dispatch<React.SetStateAction<number>>;
372
+ clearAllSocketLogs: () => void;
373
+ deleteSocketRecord?: (id: string) => void;
374
+ deleteMultipleSocketRecords?: (ids: string[]) => void;
375
+ simulateSocket: (preset?: 'chat' | 'crypto' | 'socketio' | 'echo' | 'custom', customData?: any) => void;
335
376
  settingsActiveSubTab: SettingsSubTab;
336
377
  setSettingsActiveSubTab: React.Dispatch<React.SetStateAction<SettingsSubTab>>;
337
378
  defaultTab: ActiveTab;
@@ -367,6 +408,22 @@ export interface InspectorContextValue {
367
408
  setReduxAutoRefreshState: React.Dispatch<React.SetStateAction<boolean>>;
368
409
  reduxExpandDepth: number;
369
410
  setReduxExpandDepth: React.Dispatch<React.SetStateAction<number>>;
411
+ captureFps: number;
412
+ setCaptureFps: React.Dispatch<React.SetStateAction<number>>;
413
+ captureScale: number;
414
+ setCaptureScale: React.Dispatch<React.SetStateAction<number>>;
415
+ captureBitrate: number;
416
+ setCaptureBitrate: React.Dispatch<React.SetStateAction<number>>;
417
+ captureMaxDurationSeconds: number;
418
+ setCaptureMaxDurationSeconds: React.Dispatch<React.SetStateAction<number>>;
419
+ captureImageFormat: 'png' | 'jpeg' | 'webp';
420
+ setCaptureImageFormat: React.Dispatch<React.SetStateAction<'png' | 'jpeg' | 'webp'>>;
421
+ captureAudioMode: 'none' | 'app' | 'mic';
422
+ setCaptureAudioMode: React.Dispatch<React.SetStateAction<'none' | 'app' | 'mic'>>;
423
+ captureAutoHide: boolean;
424
+ setCaptureAutoHide: React.Dispatch<React.SetStateAction<boolean>>;
425
+ captureAutoGif: boolean;
426
+ setCaptureAutoGif: React.Dispatch<React.SetStateAction<boolean>>;
370
427
  }
371
428
  export interface CopyButtonProps {
372
429
  value: unknown | (() => unknown);
@@ -457,6 +514,7 @@ export interface AnimatedEntranceProps {
457
514
  export interface ConsoleLogCardProps {
458
515
  item: ConsoleLog;
459
516
  searchStr?: string;
517
+ onPress?: (item: ConsoleLog) => void;
460
518
  }
461
519
  export interface JsonContent {
462
520
  header: string;
@@ -522,3 +580,66 @@ export interface PushDetailProps {
522
580
  item: PushNotificationRecord | null;
523
581
  onClose: () => void;
524
582
  }
583
+ export interface SocketFrame {
584
+ id: string;
585
+ timestamp: number;
586
+ direction: SocketFrameDirection;
587
+ type: SocketFrameType;
588
+ data: any;
589
+ raw?: any;
590
+ size?: number;
591
+ eventName?: string;
592
+ ackId?: number;
593
+ }
594
+ export interface SocketConnectionRecord {
595
+ id: string;
596
+ url: string;
597
+ protocols?: string | string[];
598
+ readyState: number;
599
+ status: SocketStatus;
600
+ startTime: number;
601
+ endTime?: number;
602
+ duration?: number;
603
+ closeCode?: number;
604
+ closeReason?: string;
605
+ error?: string | any;
606
+ client: 'websocket' | 'socket.io' | string;
607
+ frames: SocketFrame[];
608
+ sentCount: number;
609
+ receivedCount: number;
610
+ totalBytesSent: number;
611
+ totalBytesReceived: number;
612
+ caller?: string;
613
+ query?: Record<string, string>;
614
+ headers?: Record<string, string>;
615
+ routeInfo?: RouteInfo;
616
+ }
617
+ export interface SocketFilterState {
618
+ search: string;
619
+ status: Set<string>;
620
+ types: Set<string>;
621
+ sortBy: 'time_desc' | 'time_asc' | 'frames_desc' | 'duration_desc';
622
+ }
623
+ export interface SocketStats {
624
+ total: number;
625
+ open: number;
626
+ closed: number;
627
+ error: number;
628
+ totalFrames: number;
629
+ sentFrames: number;
630
+ receivedFrames: number;
631
+ totalBytes: number;
632
+ }
633
+ export interface SocketCardProps {
634
+ item: SocketConnectionRecord;
635
+ onPress: () => void;
636
+ searchStr?: string;
637
+ isNew?: boolean;
638
+ isSelected?: boolean;
639
+ onToggleSelect?: (id: string) => void;
640
+ serialNumber?: number;
641
+ }
642
+ export interface SocketDetailProps {
643
+ item: SocketConnectionRecord | null;
644
+ onClose: () => void;
645
+ }
@@ -539,6 +539,21 @@ RCT_EXPORT_MODULE(NetworkInspectorModule);
539
539
  return YES;
540
540
  }
541
541
 
542
+ - (NSDictionary *)constantsToExport {
543
+ NSBundle *mainBundle = [NSBundle mainBundle];
544
+ NSString *appName = [mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"] ?: [mainBundle objectForInfoDictionaryKey:@"CFBundleName"] ?: @"App";
545
+ NSString *appVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"] ?: @"1.0";
546
+ NSString *appBuild = [mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"] ?: @"1";
547
+ NSString *appBundleId = [mainBundle bundleIdentifier] ?: @"";
548
+ return @{
549
+ @"appName": appName,
550
+ @"appVersion": appVersion,
551
+ @"appBuild": appBuild,
552
+ @"appBundleId": appBundleId,
553
+ @"appPackageName": appBundleId
554
+ };
555
+ }
556
+
542
557
  - (void)safeSendEvent:(NSString *)eventName body:(id)body {
543
558
  if (!hasListeners) return;
544
559
  if (self.bridge == nil) return;
@@ -1235,6 +1250,9 @@ RCT_EXPORT_METHOD(getNativeCachedPage:(NSString *)pageKey
1235
1250
  rgbColorSpace,
1236
1251
  (CGBitmapInfo)kCGBitmapByteOrder32Little | (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
1237
1252
  if (context) {
1253
+ // Invert Y axis for CGBitmapContext so row 0 aligns with the top of the video frame
1254
+ CGContextTranslateCTM(context, 0, size.height);
1255
+ CGContextScaleCTM(context, 1.0, -1.0);
1238
1256
  UIGraphicsPushContext(context);
1239
1257
  [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
1240
1258
  UIGraphicsPopContext();
@@ -1275,10 +1293,25 @@ RCT_EXPORT_METHOD(getNativeCachedPage:(NSString *)pageKey
1275
1293
  return;
1276
1294
  }
1277
1295
 
1296
+ // Read bitrate from options (default: adaptive based on resolution)
1297
+ double bitrateParam = [options[@"bitrate"] doubleValue];
1298
+ if (bitrateParam <= 0.0) {
1299
+ // Auto-calculate: ~6 Mbps for 1080p, scales proportionally
1300
+ bitrateParam = (double)(width * height) * 4.0;
1301
+ if (bitrateParam < 1000000.0) bitrateParam = 1000000.0; // Floor: 1 Mbps
1302
+ if (bitrateParam > 20000000.0) bitrateParam = 20000000.0; // Ceiling: 20 Mbps
1303
+ }
1304
+
1278
1305
  NSDictionary *videoSettings = @{
1279
1306
  AVVideoCodecKey: AVVideoCodecTypeH264,
1280
1307
  AVVideoWidthKey: @(videoSize.width),
1281
1308
  AVVideoHeightKey: @(videoSize.height),
1309
+ AVVideoCompressionPropertiesKey: @{
1310
+ AVVideoAverageBitRateKey: @((NSInteger)bitrateParam),
1311
+ AVVideoMaxKeyFrameIntervalKey: @(30),
1312
+ AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel,
1313
+ AVVideoExpectedSourceFrameRateKey: @([options[@"fps"] doubleValue] > 0 ? [options[@"fps"] doubleValue] : 30),
1314
+ },
1282
1315
  };
1283
1316
 
1284
1317
  self->_softwareWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];
@@ -1307,9 +1340,12 @@ RCT_EXPORT_METHOD(getNativeCachedPage:(NSString *)pageKey
1307
1340
  self->_softwareVideoHeight = height;
1308
1341
 
1309
1342
  double fps = [options[@"fps"] doubleValue];
1310
- if (fps <= 0.0 || fps > 30.0) fps = 15.0;
1343
+ if (fps <= 0.0 || fps > 60.0) fps = 30.0;
1311
1344
  double frameInterval = 1.0 / fps;
1312
1345
 
1346
+ double maxDuration = [options[@"maxDurationSeconds"] doubleValue];
1347
+ if (maxDuration <= 0.0 || maxDuration > 300.0) maxDuration = 120.0;
1348
+
1313
1349
  // Immediately capture frame 0 & save thumbnail
1314
1350
  UIImage *firstImg = [self captureScreenHierarchyWithScale:(CGFloat)scaleParam];
1315
1351
  if (firstImg) {
@@ -1336,24 +1372,54 @@ RCT_EXPORT_METHOD(getNativeCachedPage:(NSString *)pageKey
1336
1372
  dispatch_source_set_timer(self->_softwareRecordingTimerSource, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(frameInterval * NSEC_PER_SEC)), (uint64_t)(frameInterval * NSEC_PER_SEC), (uint64_t)(frameInterval * 0.1 * NSEC_PER_SEC));
1337
1373
 
1338
1374
  __weak NetworkInspectorModule *weakSelf = self;
1375
+ __block BOOL isFrameBusy = NO;
1376
+ NSTimeInterval recordingStartTime = self->_softwareRecordingStartTime;
1339
1377
  dispatch_source_set_event_handler(self->_softwareRecordingTimerSource, ^{
1340
1378
  NetworkInspectorModule *strongSelf = weakSelf;
1341
1379
  if (!strongSelf || !strongSelf->_isSoftwareRecordingActive) return;
1342
1380
 
1343
- dispatch_sync(dispatch_get_main_queue(), ^{
1344
- if (!strongSelf || !strongSelf->_isSoftwareRecordingActive) return;
1345
- if (!strongSelf->_softwareAssetWriter || strongSelf->_softwareAssetWriter.status != AVAssetWriterStatusWriting) return;
1381
+ // Auto-stop guard: enforce max recording duration
1382
+ NSTimeInterval elapsed = [[NSDate date] timeIntervalSince1970] - recordingStartTime;
1383
+ if (elapsed >= maxDuration) {
1384
+ strongSelf->_isSoftwareRecordingActive = NO;
1385
+ return;
1386
+ }
1387
+
1388
+ if (isFrameBusy) {
1389
+ // Drop frame tick if previous frame capture or encoding is still executing to prevent UI freezing
1390
+ return;
1391
+ }
1392
+ isFrameBusy = YES;
1393
+
1394
+ // Fast snapshot on main queue without blocking user interactions
1395
+ dispatch_async(dispatch_get_main_queue(), ^{
1396
+ if (!strongSelf || !strongSelf->_isSoftwareRecordingActive) {
1397
+ isFrameBusy = NO;
1398
+ return;
1399
+ }
1400
+ if (!strongSelf->_softwareAssetWriter || strongSelf->_softwareAssetWriter.status != AVAssetWriterStatusWriting) {
1401
+ isFrameBusy = NO;
1402
+ return;
1403
+ }
1346
1404
 
1347
1405
  UIImage *frameImg = [strongSelf captureScreenHierarchyWithScale:(CGFloat)scaleParam];
1348
- if (frameImg && strongSelf->_softwareWriterInput.isReadyForMoreMediaData) {
1349
- CVPixelBufferRef buffer = [strongSelf createPixelBufferFromUIImage:frameImg size:videoSize];
1350
- if (buffer) {
1351
- CMTime presentTime = CMTimeMake((int64_t)(strongSelf->_softwareFrameIndex * 1000 / fps), 1000);
1352
- [strongSelf->_softwarePixelBufferAdaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
1353
- CVPixelBufferRelease(buffer);
1354
- strongSelf->_softwareFrameIndex++;
1406
+
1407
+ // Offload all heavy CVPixelBuffer creation, context drawing, and AVAssetWriter append to background queue
1408
+ dispatch_async(queue, ^{
1409
+ @try {
1410
+ if (strongSelf && strongSelf->_isSoftwareRecordingActive && frameImg && strongSelf->_softwareWriterInput.isReadyForMoreMediaData) {
1411
+ CVPixelBufferRef buffer = [strongSelf createPixelBufferFromUIImage:frameImg size:videoSize];
1412
+ if (buffer) {
1413
+ CMTime presentTime = CMTimeMake((int64_t)(strongSelf->_softwareFrameIndex * 1000 / fps), 1000);
1414
+ [strongSelf->_softwarePixelBufferAdaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
1415
+ CVPixelBufferRelease(buffer);
1416
+ strongSelf->_softwareFrameIndex++;
1417
+ }
1418
+ }
1419
+ } @finally {
1420
+ isFrameBusy = NO;
1355
1421
  }
1356
- }
1422
+ });
1357
1423
  });
1358
1424
  });
1359
1425
 
@@ -1487,6 +1553,30 @@ RCT_EXPORT_METHOD(stopVideoRecording:(RCTPromiseResolveBlock)resolve
1487
1553
 
1488
1554
  if (thumbPath && [[NSFileManager defaultManager] fileExistsAtPath:thumbPath]) {
1489
1555
  result[@"thumbnailUri"] = [NSURL fileURLWithPath:thumbPath].absoluteString;
1556
+ } else {
1557
+ @try {
1558
+ NSURL *vidUrl = [NSURL fileURLWithPath:filePath];
1559
+ AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidUrl options:nil];
1560
+ AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
1561
+ gen.appliesPreferredTrackTransform = YES;
1562
+ gen.requestedTimeToleranceBefore = kCMTimePositiveInfinity;
1563
+ gen.requestedTimeToleranceAfter = kCMTimePositiveInfinity;
1564
+ gen.maximumSize = CGSizeMake(720, 720);
1565
+ CMTime time = kCMTimeZero;
1566
+ NSError *err = nil;
1567
+ CGImageRef imgRef = [gen copyCGImageAtTime:time actualTime:NULL error:&err];
1568
+ if (imgRef) {
1569
+ UIImage *thumbImg = [UIImage imageWithCGImage:imgRef];
1570
+ CGImageRelease(imgRef);
1571
+ NSData *tData = UIImageJPEGRepresentation(thumbImg, 0.85);
1572
+ if (tData) {
1573
+ NSString *generatedThumbFile = [NSString stringWithFormat:@"thumb_%lld.jpg", timestamp];
1574
+ NSString *generatedThumbPath = [[self getCapturesDirectory] stringByAppendingPathComponent:generatedThumbFile];
1575
+ [tData writeToFile:generatedThumbPath atomically:YES];
1576
+ result[@"thumbnailUri"] = [NSURL fileURLWithPath:generatedThumbPath].absoluteString;
1577
+ }
1578
+ }
1579
+ } @catch (NSException *e) {}
1490
1580
  }
1491
1581
 
1492
1582
  resolve(result);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-inapp-inspector",
3
- "version": "2.4.1",
3
+ "version": "2.4.2",
4
4
  "description": "The zero-config, all-in-one in-app debugger & network logger for React Native & Expo (Flipper / Chucker alternative). Inspect Network (fetch/Axios/GraphQL), Console logs with Metro Symbolication, Redux State, Firebase Analytics, Storage (AsyncStorage/MMKV), Hardware Telemetry, and JS Bundle size directly on device.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -80,6 +80,13 @@
80
80
  "require": "./dist/commonjs/push.js",
81
81
  "default": "./dist/commonjs/push.js"
82
82
  },
83
+ "./socket": {
84
+ "react-native": "./dist/commonjs/socket.js",
85
+ "types": "./dist/commonjs/socket.d.ts",
86
+ "import": "./dist/esm/socket.js",
87
+ "require": "./dist/commonjs/socket.js",
88
+ "default": "./dist/commonjs/socket.js"
89
+ },
83
90
  "./metro": {
84
91
  "types": "./dist/commonjs/metro.d.ts",
85
92
  "import": "./dist/esm/metro.js",
@@ -92,6 +99,7 @@
92
99
  "dist",
93
100
  "src/native",
94
101
  "bin",
102
+ "assets",
95
103
  "metro.js",
96
104
  "metro.d.ts",
97
105
  "README.md",
@@ -186,7 +194,201 @@
186
194
  "zero-config",
187
195
  "debug-tool",
188
196
  "ios",
189
- "android"
197
+ "android",
198
+ "react-native-usa",
199
+ "react-native-uk",
200
+ "react-native-canada",
201
+ "react-native-australia",
202
+ "react-native-singapore",
203
+ "react-native-nigeria",
204
+ "react-native-抓包",
205
+ "移动端抓包",
206
+ "网络监控",
207
+ "调试工具",
208
+ "移动端调试器",
209
+ "移动端控制台",
210
+ "flipper替代方案",
211
+ "chucker替代方案",
212
+ "charles替代方案",
213
+ "proxyman替代",
214
+ "WebSocket抓包",
215
+ "MMKV查看器",
216
+ "AsyncStorage查看器",
217
+ "行動端偵錯",
218
+ "網路封包側錄",
219
+ "免电脑抓包",
220
+ "APP抓包工具",
221
+ "移动端开发工具",
222
+ "react-native网络日志",
223
+ "移动端网络调试",
224
+ "真机调试工具",
225
+ "react-native开发者工具",
226
+ "リアクトネイティブ",
227
+ "デバッガー",
228
+ "ネットワークロガー",
229
+ "パケットキャプチャ",
230
+ "開発ツール",
231
+ "フリッパー代替",
232
+ "通信ログ監視",
233
+ "チャールズ代替",
234
+ "アプリ内デバッガー",
235
+ "モバイル開発ツール",
236
+ "通信監視ツール",
237
+ "WebSocketデバッグ",
238
+ "端末内インスペクター",
239
+ "react-nativeデバッグ",
240
+ "モバイルパケットキャプチャ",
241
+ "通信ログ",
242
+ "端末内デバッガ",
243
+ "depurador-react-native",
244
+ "captura-de-red",
245
+ "registro-de-red",
246
+ "herramientas-desarrollo",
247
+ "alternativa-flipper",
248
+ "alternativa-charles",
249
+ "inspector-en-app",
250
+ "depuracion-movil",
251
+ "monitor-de-trafico-movil",
252
+ "react-native-mexico",
253
+ "react-native-colombia",
254
+ "react-native-argentina",
255
+ "react-native-espana",
256
+ "herramientas-desarrollador-movil",
257
+ "netzwerk-logger",
258
+ "entwicklertools",
259
+ "in-app-debugger-deutsch",
260
+ "paketmitschnitt",
261
+ "in-app-debugger-deutschland",
262
+ "netzwerk-mitschnitt",
263
+ "chucker-alternative-deutsch",
264
+ "fehlersuche-mobil",
265
+ "react-native-entwickler",
266
+ "speicher-inspektor",
267
+ "react-native-schweiz",
268
+ "react-native-oesterreich",
269
+ "debogueur-react-native",
270
+ "inspecteur-reseau",
271
+ "outils-developpement",
272
+ "capture-paquets-mobile",
273
+ "inspecteur-reseau-france",
274
+ "debogueur-mobile-france",
275
+ "alternative-flipper",
276
+ "journal-reseau",
277
+ "analyseur-reseau-mobile",
278
+ "depannage-mobile-react-native",
279
+ "depurador-mobile",
280
+ "inspetor-de-rede",
281
+ "ferramentas-dev",
282
+ "depurador-react-native-brasil",
283
+ "captura-de-pacotes",
284
+ "editor-de-storage-mobile",
285
+ "react-native-brasil",
286
+ "react-native-portugal",
287
+ "monitor-de-rede-mobile",
288
+ "리액트네이티브",
289
+ "디버거",
290
+ "네트워크로거",
291
+ "모바일디버깅",
292
+ "패킷캡처",
293
+ "플리퍼대체",
294
+ "리액트네이티브디버깅",
295
+ "모바일네트워크로거",
296
+ "차커대체",
297
+ "찰스프록시대체",
298
+ "인앱디버거",
299
+ "웹소켓로거",
300
+ "단말기디버거",
301
+ "모바일개발도구",
302
+ "отладчик-react-native",
303
+ "сниффер-сети",
304
+ "логирование-сети",
305
+ "альтернатива-flipper",
306
+ "перехватчик-трафика",
307
+ "мобильная-отладка",
308
+ "инспектор-сети",
309
+ "отладка-приложений-react-native",
310
+ "فاحص-الشبكة-رياكت-نيتف",
311
+ "مصحح-أخطاء-الموبايل",
312
+ "مراقب-الشبكة",
313
+ "بديل-فليبر",
314
+ "أدوات-مطور-رياكت-نيتف",
315
+ "فاحص-الشبكة-المحمول",
316
+ "تسجيل-حزم-البيانات",
317
+ "debugger-react-native-italia",
318
+ "ispettore-di-rete",
319
+ "strumenti-sviluppo-mobile",
320
+ "cattura-traffico-mobile",
321
+ "alternativa-flipper-italia",
322
+ "registro-chiamate-rete",
323
+ "netwerk-inspecteur-nederlands",
324
+ "netwerk-logger-nederland",
325
+ "mobiele-debugger",
326
+ "react-native-ontwikkelaar",
327
+ "pakket-sniffer-mobiel",
328
+ "flipper-alternatief-nederland",
329
+ "debuger-react-native-polska",
330
+ "inspektor-sieci-mobilnej",
331
+ "narzedzia-programistyczne",
332
+ "rejestrator-pakietow",
333
+ "rejestrator-sieci-react-native-polska",
334
+ "inspektor-aplikacji-mobilnych",
335
+ "ag-gunlukcusu-turkce",
336
+ "hata-ayiklayici",
337
+ "ag-denetleyicisi",
338
+ "flipper-alternatifi",
339
+ "react-native-gelistirici-araclari",
340
+ "mobil-paket-yakalama",
341
+ "alat-debug-react-native-indonesia",
342
+ "pelacak-jaringan-mobile",
343
+ "inspektur-jaringan",
344
+ "alternatif-flipper",
345
+ "pelacak-jaringan-aplikasi",
346
+ "debug-mobile-indonesia",
347
+ "kiem-tra-mang-react-native-vietnam",
348
+ "ghi-log-mang-mobile",
349
+ "cong-cu-debug-ung-dung",
350
+ "thay-the-flipper",
351
+ "bat-goi-tin-mang-react-native",
352
+ "phan-tich-luu-luong-mang",
353
+ "ดีบักเกอร์-react-native-thai",
354
+ "เครื่องมือตรวจสอบเครือข่าย",
355
+ "เครื่องมือบันทึกเน็ตเวิร์ก",
356
+ "ทางเลือก-flipper",
357
+ "ตัวดักจับแพ็กเก็ต-react-native",
358
+ "เครื่องมือนักพัฒนาไทย",
359
+ "налагоджувач-react-native-україна",
360
+ "логер-мережі",
361
+ "інструменти-розробника-react-native",
362
+ "natverkslogg-sverige",
363
+ "felsokare-react-native",
364
+ "utvecklarverktyg-react-native",
365
+ "tagasuri-ng-network-react-native",
366
+ "mobile-network-logger-ph",
367
+ "react-native-philippines",
368
+ "מנפה-שגיאות-אפליקציות",
369
+ "ניטור-רשת-מובייל",
370
+ "כלי-פיתוח-ריאקט-נייטיב",
371
+ "react-native-india",
372
+ "नेटवर्क-लॉगर",
373
+ "डिबगिंग-टूल",
374
+ "मोबाइल-ऐप-डिबगिंग",
375
+ "इन-ऐप-इंस्पेक्टर",
376
+ "வலைப்பின்னல்-பதிவர்",
377
+ "நெட்வொர்க்-இன்ஸ்பெக்டர்",
378
+ "வலைப்பின்னல்-ஆய்வாளர்",
379
+ "நெట్‌వర్క్-లాగర్",
380
+ "నెట్‌వర్క్-ఇన్‌స్పెక్టర్",
381
+ "ನೆಟ್‌ವರ್ಕ್-ಲಾಗರ್",
382
+ "ನೆಟ್‌ವರ್ಕ್-ಇನ್‌ಸ್ಪೆಕ್ಟರ್",
383
+ "നെറ്റ്‌വർക്ക്-ലോഗർ",
384
+ "നെറ്റ്‌വർക്ക്-ഇൻസ്പെക്ടർ",
385
+ "নেটওয়ার্ক-লগার",
386
+ "মোবাইল-ডিবাগার",
387
+ "नेटवर्क-लॉगर-मराठी",
388
+ "react-native-bangalore",
389
+ "react-native-hyderabad",
390
+ "react-native-pune",
391
+ "mobile-devtools-global"
190
392
  ],
191
393
  "author": "Vengateswaran Balakrishnan",
192
394
  "contributors": [
@@ -457,11 +457,19 @@ export interface ScreenshotResult {
457
457
  }
458
458
 
459
459
  export interface RecordingOptions {
460
+ /** Output format: 'mp4' (H.264) or 'gif' (animated GIF). Default: 'mp4' */
460
461
  format?: 'mp4' | 'gif';
462
+ /** Audio source: 'none' (muted), 'app' (in-app audio), 'mic' (microphone), 'mixed'. Default: 'none' */
461
463
  audioSource?: 'none' | 'app' | 'mic' | 'mixed';
464
+ /** Target frames per second: 5–60. Default: 30 */
462
465
  fps?: number;
466
+ /** Resolution scale factor: 0.2–1.0. Lower = smaller file, less CPU. Default: 0.5 */
467
+ scale?: number;
468
+ /** H.264 encoding bitrate in bits/sec. 0 = auto (adaptive to resolution). Default: auto */
463
469
  bitrate?: number;
470
+ /** Maximum recording duration in seconds: 5–300. Default: 120 */
464
471
  maxDurationSeconds?: number;
472
+ /** Temporarily hide inspector overlay during recording. Default: false */
465
473
  hideInspector?: boolean;
466
474
  }
467
475