@multiplayer-app/session-recorder-react-native 1.0.1-beta.2 → 1.0.1-beta.4

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 (465) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +216 -155
  3. package/SessionRecorderNative.podspec +9 -14
  4. package/android/build.gradle +21 -41
  5. package/android/gradle.properties +4 -4
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeConfig.kt +52 -0
  8. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeModule.kt +860 -0
  9. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeModuleSpec.kt +51 -0
  10. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativePackage.kt +33 -0
  11. package/android/src/main/java/com/multiplayer/sessionrecordernative/model/TargetInfo.kt +9 -0
  12. package/android/src/main/java/com/multiplayer/sessionrecordernative/util/ViewUtils.kt +72 -0
  13. package/android/src/main/java/com/xxx/XxxModule.kt +23 -0
  14. package/ios/GestureTargetFinder.swift +50 -0
  15. package/ios/SessionRecorderNative.podspec +4 -2
  16. package/ios/SessionRecorderNative.swift +10 -1
  17. package/ios/SessionRecorderNativeSpec.swift +55 -0
  18. package/ios/Xxx.h +5 -0
  19. package/ios/Xxx.mm +21 -0
  20. package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js +23 -0
  21. package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js.map +1 -0
  22. package/lib/module/components/ScreenRecorderView/index.js +4 -0
  23. package/lib/module/components/ScreenRecorderView/index.js.map +1 -0
  24. package/lib/module/components/SessionRecorderWidget/ErrorBanner.js +64 -0
  25. package/lib/module/components/SessionRecorderWidget/ErrorBanner.js.map +1 -0
  26. package/lib/module/components/SessionRecorderWidget/FinalPopover.js +74 -0
  27. package/lib/module/components/SessionRecorderWidget/FinalPopover.js.map +1 -0
  28. package/lib/module/components/SessionRecorderWidget/FloatingButton.js +191 -0
  29. package/lib/module/components/SessionRecorderWidget/FloatingButton.js.map +1 -0
  30. package/lib/module/components/SessionRecorderWidget/InitialPopover.js +138 -0
  31. package/lib/module/components/SessionRecorderWidget/InitialPopover.js.map +1 -0
  32. package/lib/module/components/SessionRecorderWidget/ModalContainer.js +177 -0
  33. package/lib/module/components/SessionRecorderWidget/ModalContainer.js.map +1 -0
  34. package/lib/module/components/SessionRecorderWidget/ModalHeader.js +27 -0
  35. package/lib/module/components/SessionRecorderWidget/ModalHeader.js.map +1 -0
  36. package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js +133 -0
  37. package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js.map +1 -0
  38. package/lib/module/components/SessionRecorderWidget/icons.js +93 -0
  39. package/lib/module/components/SessionRecorderWidget/icons.js.map +1 -0
  40. package/lib/module/components/SessionRecorderWidget/index.js +5 -0
  41. package/lib/module/components/SessionRecorderWidget/index.js.map +1 -0
  42. package/lib/module/components/SessionRecorderWidget/styles.js +173 -0
  43. package/lib/module/components/SessionRecorderWidget/styles.js.map +1 -0
  44. package/lib/module/components/index.js +5 -0
  45. package/lib/module/components/index.js.map +1 -0
  46. package/lib/module/config/constants.js +42 -0
  47. package/lib/module/config/constants.js.map +1 -0
  48. package/lib/module/config/defaults.js +81 -0
  49. package/lib/module/config/defaults.js.map +1 -0
  50. package/lib/module/config/index.js +9 -0
  51. package/lib/module/config/index.js.map +1 -0
  52. package/lib/module/config/masking.js +35 -0
  53. package/lib/module/config/masking.js.map +1 -0
  54. package/lib/module/config/session-recorder.js +44 -0
  55. package/lib/module/config/session-recorder.js.map +1 -0
  56. package/lib/module/config/validators.js +28 -0
  57. package/lib/module/config/validators.js.map +1 -0
  58. package/lib/module/config/widget.js +35 -0
  59. package/lib/module/config/widget.js.map +1 -0
  60. package/lib/module/context/SessionRecorderContext.js +93 -0
  61. package/lib/module/context/SessionRecorderContext.js.map +1 -0
  62. package/lib/module/context/SessionRecorderStore.js +12 -0
  63. package/lib/module/context/SessionRecorderStore.js.map +1 -0
  64. package/lib/module/context/useSessionRecorderStore.js +20 -0
  65. package/lib/module/context/useSessionRecorderStore.js.map +1 -0
  66. package/lib/module/context/useStoreSelector.js +27 -0
  67. package/lib/module/context/useStoreSelector.js.map +1 -0
  68. package/lib/module/index.js +13 -0
  69. package/lib/module/index.js.map +1 -0
  70. package/lib/module/native/SessionRecorderNative.js +74 -0
  71. package/lib/module/native/SessionRecorderNative.js.map +1 -0
  72. package/lib/module/native/index.js +4 -0
  73. package/lib/module/native/index.js.map +1 -0
  74. package/lib/module/otel/helpers.js +218 -0
  75. package/lib/module/otel/helpers.js.map +1 -0
  76. package/lib/module/otel/index.js +95 -0
  77. package/lib/module/otel/index.js.map +1 -0
  78. package/lib/module/otel/instrumentations/index.js +102 -0
  79. package/lib/module/otel/instrumentations/index.js.map +1 -0
  80. package/lib/module/package.json +1 -0
  81. package/lib/module/patch/index.js +4 -0
  82. package/lib/module/patch/index.js.map +1 -0
  83. package/lib/module/patch/xhr.js +116 -0
  84. package/lib/module/patch/xhr.js.map +1 -0
  85. package/lib/module/recorder/eventExporter.js +130 -0
  86. package/lib/module/recorder/eventExporter.js.map +1 -0
  87. package/lib/module/recorder/gestureRecorder.js +641 -0
  88. package/lib/module/recorder/gestureRecorder.js.map +1 -0
  89. package/lib/module/recorder/index.js +168 -0
  90. package/lib/module/recorder/index.js.map +1 -0
  91. package/lib/module/recorder/navigationTracker.js +228 -0
  92. package/lib/module/recorder/navigationTracker.js.map +1 -0
  93. package/lib/module/recorder/screenRecorder.js +495 -0
  94. package/lib/module/recorder/screenRecorder.js.map +1 -0
  95. package/lib/module/services/api.service.js +149 -0
  96. package/lib/module/services/api.service.js.map +1 -0
  97. package/lib/module/services/network.service.js +178 -0
  98. package/lib/module/services/network.service.js.map +1 -0
  99. package/lib/module/services/screenMaskingService.js +107 -0
  100. package/lib/module/services/screenMaskingService.js.map +1 -0
  101. package/lib/module/services/storage.service.js +179 -0
  102. package/lib/module/services/storage.service.js.map +1 -0
  103. package/lib/module/session-recorder.js +541 -0
  104. package/lib/module/session-recorder.js.map +1 -0
  105. package/lib/module/types/configs.js +4 -0
  106. package/lib/module/types/configs.js.map +1 -0
  107. package/lib/module/types/expo-constants.d.js +2 -0
  108. package/lib/module/types/expo-constants.d.js.map +1 -0
  109. package/lib/module/types/index.js +11 -0
  110. package/lib/module/types/index.js.map +1 -0
  111. package/lib/module/types/session-recorder.js +68 -0
  112. package/lib/module/types/session-recorder.js.map +1 -0
  113. package/lib/module/types/session.js +9 -0
  114. package/lib/module/types/session.js.map +1 -0
  115. package/lib/module/utils/app-metadata.js +28 -0
  116. package/lib/module/utils/app-metadata.js.map +1 -0
  117. package/lib/module/utils/constants.optional.expo.js +6 -0
  118. package/lib/module/utils/constants.optional.expo.js.map +1 -0
  119. package/lib/module/utils/constants.optional.js +8 -0
  120. package/lib/module/utils/constants.optional.js.map +1 -0
  121. package/lib/module/utils/createStore.js +27 -0
  122. package/lib/module/utils/createStore.js.map +1 -0
  123. package/lib/module/utils/index.js +11 -0
  124. package/lib/module/utils/index.js.map +1 -0
  125. package/lib/module/utils/logger.js +193 -0
  126. package/lib/module/utils/logger.js.map +1 -0
  127. package/lib/module/utils/platform.js +340 -0
  128. package/lib/module/utils/platform.js.map +1 -0
  129. package/lib/module/utils/request-utils.js +58 -0
  130. package/lib/module/utils/request-utils.js.map +1 -0
  131. package/lib/module/utils/rrweb-events.js +276 -0
  132. package/lib/module/utils/rrweb-events.js.map +1 -0
  133. package/lib/module/utils/session.js +21 -0
  134. package/lib/module/utils/session.js.map +1 -0
  135. package/lib/module/utils/shallowEqual.js +17 -0
  136. package/lib/module/utils/shallowEqual.js.map +1 -0
  137. package/lib/module/utils/time.js +17 -0
  138. package/lib/module/utils/time.js.map +1 -0
  139. package/lib/module/utils/type-utils.js +69 -0
  140. package/lib/module/utils/type-utils.js.map +1 -0
  141. package/lib/module/version.js +4 -0
  142. package/lib/module/version.js.map +1 -0
  143. package/lib/typescript/package.json +1 -0
  144. package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts +6 -0
  145. package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts.map +1 -0
  146. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts +2 -0
  147. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts.map +1 -0
  148. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ErrorBanner.d.ts +1 -0
  149. package/lib/typescript/src/components/SessionRecorderWidget/ErrorBanner.d.ts.map +1 -0
  150. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FinalPopover.d.ts +2 -1
  151. package/lib/typescript/src/components/SessionRecorderWidget/FinalPopover.d.ts.map +1 -0
  152. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FloatingButton.d.ts +1 -0
  153. package/lib/typescript/src/components/SessionRecorderWidget/FloatingButton.d.ts.map +1 -0
  154. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/InitialPopover.d.ts +2 -1
  155. package/lib/typescript/src/components/SessionRecorderWidget/InitialPopover.d.ts.map +1 -0
  156. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalContainer.d.ts +1 -0
  157. package/lib/typescript/src/components/SessionRecorderWidget/ModalContainer.d.ts.map +1 -0
  158. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalHeader.d.ts +1 -0
  159. package/lib/typescript/src/components/SessionRecorderWidget/ModalHeader.d.ts.map +1 -0
  160. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/SessionRecorderWidget.d.ts +1 -0
  161. package/lib/typescript/src/components/SessionRecorderWidget/SessionRecorderWidget.d.ts.map +1 -0
  162. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/icons.d.ts +1 -0
  163. package/lib/typescript/src/components/SessionRecorderWidget/icons.d.ts.map +1 -0
  164. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts +3 -0
  165. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts.map +1 -0
  166. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/styles.d.ts +4 -3
  167. package/lib/typescript/src/components/SessionRecorderWidget/styles.d.ts.map +1 -0
  168. package/{dist → lib/typescript/src}/components/index.d.ts +1 -0
  169. package/lib/typescript/src/components/index.d.ts.map +1 -0
  170. package/{dist → lib/typescript/src}/config/constants.d.ts +1 -0
  171. package/lib/typescript/src/config/constants.d.ts.map +1 -0
  172. package/{dist → lib/typescript/src}/config/defaults.d.ts +2 -1
  173. package/lib/typescript/src/config/defaults.d.ts.map +1 -0
  174. package/{dist → lib/typescript/src}/config/index.d.ts +1 -0
  175. package/lib/typescript/src/config/index.d.ts.map +1 -0
  176. package/lib/typescript/src/config/masking.d.ts +3 -0
  177. package/lib/typescript/src/config/masking.d.ts.map +1 -0
  178. package/lib/typescript/src/config/session-recorder.d.ts +3 -0
  179. package/lib/typescript/src/config/session-recorder.d.ts.map +1 -0
  180. package/{dist → lib/typescript/src}/config/validators.d.ts +1 -0
  181. package/lib/typescript/src/config/validators.d.ts.map +1 -0
  182. package/{dist → lib/typescript/src}/config/widget.d.ts +2 -1
  183. package/lib/typescript/src/config/widget.d.ts.map +1 -0
  184. package/{dist → lib/typescript/src}/context/SessionRecorderContext.d.ts +3 -2
  185. package/lib/typescript/src/context/SessionRecorderContext.d.ts.map +1 -0
  186. package/{dist → lib/typescript/src}/context/SessionRecorderStore.d.ts +2 -1
  187. package/lib/typescript/src/context/SessionRecorderStore.d.ts.map +1 -0
  188. package/{dist → lib/typescript/src}/context/useSessionRecorderStore.d.ts +2 -1
  189. package/lib/typescript/src/context/useSessionRecorderStore.d.ts.map +1 -0
  190. package/{dist → lib/typescript/src}/context/useStoreSelector.d.ts +2 -1
  191. package/lib/typescript/src/context/useStoreSelector.d.ts.map +1 -0
  192. package/{dist → lib/typescript/src}/index.d.ts +1 -0
  193. package/lib/typescript/src/index.d.ts.map +1 -0
  194. package/{dist → lib/typescript/src}/native/SessionRecorderNative.d.ts +21 -3
  195. package/lib/typescript/src/native/SessionRecorderNative.d.ts.map +1 -0
  196. package/{dist → lib/typescript/src}/native/index.d.ts +1 -0
  197. package/lib/typescript/src/native/index.d.ts.map +1 -0
  198. package/{dist → lib/typescript/src}/otel/helpers.d.ts +3 -2
  199. package/lib/typescript/src/otel/helpers.d.ts.map +1 -0
  200. package/{dist → lib/typescript/src}/otel/index.d.ts +2 -2
  201. package/lib/typescript/src/otel/index.d.ts.map +1 -0
  202. package/{dist → lib/typescript/src}/otel/instrumentations/index.d.ts +2 -1
  203. package/lib/typescript/src/otel/instrumentations/index.d.ts.map +1 -0
  204. package/lib/typescript/src/patch/index.d.ts +2 -0
  205. package/lib/typescript/src/patch/index.d.ts.map +1 -0
  206. package/{dist → lib/typescript/src}/patch/xhr.d.ts +1 -0
  207. package/lib/typescript/src/patch/xhr.d.ts.map +1 -0
  208. package/{dist → lib/typescript/src}/recorder/eventExporter.d.ts +2 -1
  209. package/lib/typescript/src/recorder/eventExporter.d.ts.map +1 -0
  210. package/{dist → lib/typescript/src}/recorder/gestureRecorder.d.ts +3 -2
  211. package/lib/typescript/src/recorder/gestureRecorder.d.ts.map +1 -0
  212. package/{dist → lib/typescript/src}/recorder/index.d.ts +3 -2
  213. package/lib/typescript/src/recorder/index.d.ts.map +1 -0
  214. package/{dist → lib/typescript/src}/recorder/navigationTracker.d.ts +2 -1
  215. package/lib/typescript/src/recorder/navigationTracker.d.ts.map +1 -0
  216. package/{dist → lib/typescript/src}/recorder/screenRecorder.d.ts +4 -4
  217. package/lib/typescript/src/recorder/screenRecorder.d.ts.map +1 -0
  218. package/{dist → lib/typescript/src}/services/api.service.d.ts +2 -1
  219. package/lib/typescript/src/services/api.service.d.ts.map +1 -0
  220. package/{dist → lib/typescript/src}/services/network.service.d.ts +1 -0
  221. package/lib/typescript/src/services/network.service.d.ts.map +1 -0
  222. package/{dist → lib/typescript/src}/services/screenMaskingService.d.ts +2 -1
  223. package/lib/typescript/src/services/screenMaskingService.d.ts.map +1 -0
  224. package/{dist → lib/typescript/src}/services/storage.service.d.ts +2 -1
  225. package/lib/typescript/src/services/storage.service.d.ts.map +1 -0
  226. package/{dist → lib/typescript/src}/session-recorder.d.ts +3 -2
  227. package/lib/typescript/src/session-recorder.d.ts.map +1 -0
  228. package/{dist → lib/typescript/src}/types/configs.d.ts +3 -2
  229. package/lib/typescript/src/types/configs.d.ts.map +1 -0
  230. package/{dist → lib/typescript/src}/types/index.d.ts +1 -0
  231. package/lib/typescript/src/types/index.d.ts.map +1 -0
  232. package/{dist → lib/typescript/src}/types/session-recorder.d.ts +3 -2
  233. package/lib/typescript/src/types/session-recorder.d.ts.map +1 -0
  234. package/{dist → lib/typescript/src}/types/session.d.ts +1 -0
  235. package/lib/typescript/src/types/session.d.ts.map +1 -0
  236. package/{dist → lib/typescript/src}/utils/app-metadata.d.ts +1 -0
  237. package/lib/typescript/src/utils/app-metadata.d.ts.map +1 -0
  238. package/{dist → lib/typescript/src}/utils/constants.optional.d.ts +1 -0
  239. package/lib/typescript/src/utils/constants.optional.d.ts.map +1 -0
  240. package/{dist → lib/typescript/src}/utils/constants.optional.expo.d.ts +1 -0
  241. package/lib/typescript/src/utils/constants.optional.expo.d.ts.map +1 -0
  242. package/{dist → lib/typescript/src}/utils/createStore.d.ts +1 -0
  243. package/lib/typescript/src/utils/createStore.d.ts.map +1 -0
  244. package/{dist → lib/typescript/src}/utils/index.d.ts +1 -0
  245. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  246. package/{dist → lib/typescript/src}/utils/logger.d.ts +1 -0
  247. package/lib/typescript/src/utils/logger.d.ts.map +1 -0
  248. package/{dist → lib/typescript/src}/utils/platform.d.ts +2 -1
  249. package/lib/typescript/src/utils/platform.d.ts.map +1 -0
  250. package/{dist → lib/typescript/src}/utils/request-utils.d.ts +1 -0
  251. package/lib/typescript/src/utils/request-utils.d.ts.map +1 -0
  252. package/{dist → lib/typescript/src}/utils/rrweb-events.d.ts +2 -1
  253. package/lib/typescript/src/utils/rrweb-events.d.ts.map +1 -0
  254. package/{dist → lib/typescript/src}/utils/session.d.ts +1 -0
  255. package/lib/typescript/src/utils/session.d.ts.map +1 -0
  256. package/{dist → lib/typescript/src}/utils/shallowEqual.d.ts +1 -0
  257. package/lib/typescript/src/utils/shallowEqual.d.ts.map +1 -0
  258. package/{dist → lib/typescript/src}/utils/time.d.ts +1 -0
  259. package/lib/typescript/src/utils/time.d.ts.map +1 -0
  260. package/{dist → lib/typescript/src}/utils/type-utils.d.ts +1 -0
  261. package/lib/typescript/src/utils/type-utils.d.ts.map +1 -0
  262. package/lib/typescript/src/version.d.ts +2 -0
  263. package/lib/typescript/src/version.d.ts.map +1 -0
  264. package/package.json +140 -39
  265. package/src/components/ScreenRecorderView/ScreenRecorderView.tsx +20 -0
  266. package/src/components/SessionRecorderWidget/ErrorBanner.tsx +58 -0
  267. package/src/components/SessionRecorderWidget/FinalPopover.tsx +96 -0
  268. package/src/components/SessionRecorderWidget/FloatingButton.tsx +176 -0
  269. package/src/components/SessionRecorderWidget/InitialPopover.tsx +167 -0
  270. package/src/components/SessionRecorderWidget/ModalContainer.tsx +189 -0
  271. package/src/components/SessionRecorderWidget/ModalHeader.tsx +24 -0
  272. package/src/components/SessionRecorderWidget/SessionRecorderWidget.tsx +136 -0
  273. package/src/components/SessionRecorderWidget/icons.tsx +52 -0
  274. package/{dist/components/SessionRecorderWidget/index.d.ts → src/components/SessionRecorderWidget/index.ts} +1 -0
  275. package/src/components/SessionRecorderWidget/styles.ts +169 -0
  276. package/src/components/index.ts +2 -0
  277. package/src/config/constants.ts +68 -0
  278. package/src/config/defaults.ts +101 -0
  279. package/src/config/index.ts +6 -0
  280. package/src/config/masking.ts +34 -0
  281. package/src/config/session-recorder.ts +59 -0
  282. package/src/config/validators.ts +31 -0
  283. package/src/config/widget.ts +38 -0
  284. package/src/context/SessionRecorderContext.tsx +138 -0
  285. package/src/context/SessionRecorderStore.ts +21 -0
  286. package/src/context/useSessionRecorderStore.ts +27 -0
  287. package/src/context/useStoreSelector.ts +34 -0
  288. package/src/index.ts +10 -0
  289. package/src/native/SessionRecorderNative.ts +164 -0
  290. package/src/native/index.ts +1 -0
  291. package/src/otel/helpers.ts +274 -0
  292. package/src/otel/index.ts +135 -0
  293. package/src/otel/instrumentations/index.ts +115 -0
  294. package/src/patch/index.ts +1 -0
  295. package/src/patch/xhr.ts +149 -0
  296. package/src/recorder/eventExporter.ts +155 -0
  297. package/src/recorder/gestureRecorder.ts +681 -0
  298. package/src/recorder/index.ts +190 -0
  299. package/src/recorder/navigationTracker.ts +245 -0
  300. package/src/recorder/screenRecorder.ts +549 -0
  301. package/src/services/api.service.ts +215 -0
  302. package/src/services/network.service.ts +182 -0
  303. package/src/services/screenMaskingService.ts +122 -0
  304. package/src/services/storage.service.ts +219 -0
  305. package/src/session-recorder.ts +591 -0
  306. package/src/types/configs.ts +96 -0
  307. package/src/types/expo-constants.d.ts +7 -0
  308. package/src/types/index.ts +29 -0
  309. package/src/types/session-recorder.ts +386 -0
  310. package/src/types/session.ts +65 -0
  311. package/src/utils/app-metadata.ts +31 -0
  312. package/src/utils/constants.optional.expo.ts +5 -0
  313. package/src/utils/constants.optional.ts +16 -0
  314. package/src/utils/createStore.ts +29 -0
  315. package/src/utils/index.ts +8 -0
  316. package/src/utils/logger.ts +216 -0
  317. package/src/utils/platform.ts +370 -0
  318. package/src/utils/request-utils.ts +61 -0
  319. package/src/utils/rrweb-events.ts +316 -0
  320. package/src/utils/session.ts +19 -0
  321. package/src/utils/shallowEqual.ts +14 -0
  322. package/src/utils/time.ts +17 -0
  323. package/src/utils/type-utils.ts +75 -0
  324. package/src/version.ts +1 -0
  325. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  326. package/android/gradle/wrapper/gradle-wrapper.properties +0 -7
  327. package/android/gradlew +0 -249
  328. package/android/gradlew.bat +0 -92
  329. package/copy-react-native-dist.sh +0 -56
  330. package/dist/components/ScreenRecorderView/ScreenRecorderView.d.ts +0 -5
  331. package/dist/components/ScreenRecorderView/ScreenRecorderView.js +0 -1
  332. package/dist/components/ScreenRecorderView/ScreenRecorderView.js.map +0 -1
  333. package/dist/components/ScreenRecorderView/index.js +0 -1
  334. package/dist/components/ScreenRecorderView/index.js.map +0 -1
  335. package/dist/components/SessionRecorderWidget/ErrorBanner.js +0 -1
  336. package/dist/components/SessionRecorderWidget/ErrorBanner.js.map +0 -1
  337. package/dist/components/SessionRecorderWidget/FinalPopover.js +0 -1
  338. package/dist/components/SessionRecorderWidget/FinalPopover.js.map +0 -1
  339. package/dist/components/SessionRecorderWidget/FloatingButton.js +0 -1
  340. package/dist/components/SessionRecorderWidget/FloatingButton.js.map +0 -1
  341. package/dist/components/SessionRecorderWidget/InitialPopover.js +0 -1
  342. package/dist/components/SessionRecorderWidget/InitialPopover.js.map +0 -1
  343. package/dist/components/SessionRecorderWidget/ModalContainer.js +0 -1
  344. package/dist/components/SessionRecorderWidget/ModalContainer.js.map +0 -1
  345. package/dist/components/SessionRecorderWidget/ModalHeader.js +0 -1
  346. package/dist/components/SessionRecorderWidget/ModalHeader.js.map +0 -1
  347. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js +0 -1
  348. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js.map +0 -1
  349. package/dist/components/SessionRecorderWidget/icons.js +0 -1
  350. package/dist/components/SessionRecorderWidget/icons.js.map +0 -1
  351. package/dist/components/SessionRecorderWidget/index.js +0 -1
  352. package/dist/components/SessionRecorderWidget/index.js.map +0 -1
  353. package/dist/components/SessionRecorderWidget/styles.js +0 -1
  354. package/dist/components/SessionRecorderWidget/styles.js.map +0 -1
  355. package/dist/components/index.js +0 -1
  356. package/dist/components/index.js.map +0 -1
  357. package/dist/config/constants.js +0 -1
  358. package/dist/config/constants.js.map +0 -1
  359. package/dist/config/defaults.js +0 -1
  360. package/dist/config/defaults.js.map +0 -1
  361. package/dist/config/index.js +0 -1
  362. package/dist/config/index.js.map +0 -1
  363. package/dist/config/masking.d.ts +0 -2
  364. package/dist/config/masking.js +0 -1
  365. package/dist/config/masking.js.map +0 -1
  366. package/dist/config/session-recorder.d.ts +0 -2
  367. package/dist/config/session-recorder.js +0 -1
  368. package/dist/config/session-recorder.js.map +0 -1
  369. package/dist/config/validators.js +0 -1
  370. package/dist/config/validators.js.map +0 -1
  371. package/dist/config/widget.js +0 -1
  372. package/dist/config/widget.js.map +0 -1
  373. package/dist/context/SessionRecorderContext.js +0 -1
  374. package/dist/context/SessionRecorderContext.js.map +0 -1
  375. package/dist/context/SessionRecorderStore.js +0 -1
  376. package/dist/context/SessionRecorderStore.js.map +0 -1
  377. package/dist/context/useSessionRecorderStore.js +0 -1
  378. package/dist/context/useSessionRecorderStore.js.map +0 -1
  379. package/dist/context/useStoreSelector.js +0 -1
  380. package/dist/context/useStoreSelector.js.map +0 -1
  381. package/dist/index.js +0 -1
  382. package/dist/index.js.map +0 -1
  383. package/dist/native/GestureRecorderNative.d.ts +0 -57
  384. package/dist/native/GestureRecorderNative.js +0 -1
  385. package/dist/native/GestureRecorderNative.js.map +0 -1
  386. package/dist/native/GestureRecorderNativeTurboSpec.d.ts +0 -31
  387. package/dist/native/GestureRecorderNativeTurboSpec.js +0 -1
  388. package/dist/native/GestureRecorderNativeTurboSpec.js.map +0 -1
  389. package/dist/native/SessionRecorderNative.js +0 -1
  390. package/dist/native/SessionRecorderNative.js.map +0 -1
  391. package/dist/native/SessionRecorderNativeTurboSpec.d.ts +0 -17
  392. package/dist/native/SessionRecorderNativeTurboSpec.js +0 -1
  393. package/dist/native/SessionRecorderNativeTurboSpec.js.map +0 -1
  394. package/dist/native/index.js +0 -1
  395. package/dist/native/index.js.map +0 -1
  396. package/dist/otel/helpers.js +0 -1
  397. package/dist/otel/helpers.js.map +0 -1
  398. package/dist/otel/index.js +0 -1
  399. package/dist/otel/index.js.map +0 -1
  400. package/dist/otel/instrumentations/index.js +0 -1
  401. package/dist/otel/instrumentations/index.js.map +0 -1
  402. package/dist/patch/index.d.ts +0 -1
  403. package/dist/patch/index.js +0 -1
  404. package/dist/patch/index.js.map +0 -1
  405. package/dist/patch/xhr.js +0 -1
  406. package/dist/patch/xhr.js.map +0 -1
  407. package/dist/recorder/eventExporter.js +0 -1
  408. package/dist/recorder/eventExporter.js.map +0 -1
  409. package/dist/recorder/gestureRecorder.js +0 -1
  410. package/dist/recorder/gestureRecorder.js.map +0 -1
  411. package/dist/recorder/index.js +0 -1
  412. package/dist/recorder/index.js.map +0 -1
  413. package/dist/recorder/navigationTracker.js +0 -1
  414. package/dist/recorder/navigationTracker.js.map +0 -1
  415. package/dist/recorder/screenRecorder.js +0 -1
  416. package/dist/recorder/screenRecorder.js.map +0 -1
  417. package/dist/services/api.service.js +0 -1
  418. package/dist/services/api.service.js.map +0 -1
  419. package/dist/services/network.service.js +0 -1
  420. package/dist/services/network.service.js.map +0 -1
  421. package/dist/services/screenMaskingService.js +0 -1
  422. package/dist/services/screenMaskingService.js.map +0 -1
  423. package/dist/services/storage.service.js +0 -1
  424. package/dist/services/storage.service.js.map +0 -1
  425. package/dist/session-recorder.js +0 -1
  426. package/dist/session-recorder.js.map +0 -1
  427. package/dist/types/configs.js +0 -1
  428. package/dist/types/configs.js.map +0 -1
  429. package/dist/types/index.js +0 -1
  430. package/dist/types/index.js.map +0 -1
  431. package/dist/types/session-recorder.js +0 -1
  432. package/dist/types/session-recorder.js.map +0 -1
  433. package/dist/types/session.js +0 -1
  434. package/dist/types/session.js.map +0 -1
  435. package/dist/utils/app-metadata.js +0 -1
  436. package/dist/utils/app-metadata.js.map +0 -1
  437. package/dist/utils/constants.optional.expo.js +0 -1
  438. package/dist/utils/constants.optional.expo.js.map +0 -1
  439. package/dist/utils/constants.optional.js +0 -1
  440. package/dist/utils/constants.optional.js.map +0 -1
  441. package/dist/utils/createStore.js +0 -1
  442. package/dist/utils/createStore.js.map +0 -1
  443. package/dist/utils/index.js +0 -1
  444. package/dist/utils/index.js.map +0 -1
  445. package/dist/utils/logger.js +0 -1
  446. package/dist/utils/logger.js.map +0 -1
  447. package/dist/utils/platform.js +0 -1
  448. package/dist/utils/platform.js.map +0 -1
  449. package/dist/utils/request-utils.js +0 -1
  450. package/dist/utils/request-utils.js.map +0 -1
  451. package/dist/utils/rrweb-events.js +0 -1
  452. package/dist/utils/rrweb-events.js.map +0 -1
  453. package/dist/utils/session.js +0 -1
  454. package/dist/utils/session.js.map +0 -1
  455. package/dist/utils/shallowEqual.js +0 -1
  456. package/dist/utils/shallowEqual.js.map +0 -1
  457. package/dist/utils/time.js +0 -1
  458. package/dist/utils/time.js.map +0 -1
  459. package/dist/utils/type-utils.js +0 -1
  460. package/dist/utils/type-utils.js.map +0 -1
  461. package/dist/version.d.ts +0 -1
  462. package/dist/version.js +0 -1
  463. package/dist/version.js.map +0 -1
  464. package/docs/AUTO_METADATA_DETECTION.md +0 -108
  465. /package/{dist/components/ScreenRecorderView/index.d.ts → src/components/ScreenRecorderView/index.ts} +0 -0
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Centralized logger utility for the session recorder
3
+ * Provides consistent logging across all components
4
+ */
5
+
6
+ import { LogLevel } from "../types"
7
+
8
+ export interface LoggerConfig {
9
+ level: LogLevel
10
+ enabled: boolean
11
+ enablePrefix: boolean
12
+ prefix: string
13
+ }
14
+
15
+ class Logger {
16
+ private config: LoggerConfig = {
17
+ level: LogLevel.INFO,
18
+ enabled: true,
19
+ enablePrefix: true,
20
+ prefix: '[SessionRecorder]',
21
+ }
22
+
23
+ private componentPrefixes: Map<string, string> = new Map([
24
+ ['ScreenRecorder', '📸'],
25
+ ['NativeGestureRecorder', '👆'],
26
+ ['SessionRecorderContext', '🎯'],
27
+ ['EventExporter', '📤'],
28
+ ['NavigationTracker', '📸'],
29
+ ['RecorderReactNativeSDK', '📤'],
30
+ ['DEBUGGER_LIB', '🔍'],
31
+ ])
32
+
33
+ /**
34
+ * Configure the logger
35
+ * @param config - Logger configuration
36
+ */
37
+ configure(config: Partial<LoggerConfig>): void {
38
+ this.config = { ...this.config, ...config }
39
+ }
40
+
41
+ /**
42
+ * Set the log level
43
+ * @param level - Log level to set
44
+ */
45
+ setLevel(level: LogLevel): void {
46
+ this.config.level = level
47
+ }
48
+
49
+ /**
50
+ * Enable or disable console output
51
+ * @param enabled - Whether to enable console output
52
+ */
53
+ setConsoleEnabled(enabled: boolean): void {
54
+ this.config.enabled = enabled
55
+ }
56
+
57
+ /**
58
+ * Add or update a component prefix
59
+ * @param component - Component name
60
+ * @param emoji - Emoji prefix for the component
61
+ */
62
+ setComponentPrefix(component: string, emoji: string): void {
63
+ this.componentPrefixes.set(component, emoji)
64
+ }
65
+
66
+ /**
67
+ * Get the formatted prefix for a component
68
+ * @param component - Component name
69
+ * @returns Formatted prefix string
70
+ */
71
+ private getPrefix(component: string): string {
72
+ if (!this.config.enablePrefix) return ''
73
+
74
+ const emoji = this.componentPrefixes.get(component) || '📝'
75
+ return `${this.config.prefix} ${emoji} [${component}]`
76
+ }
77
+
78
+ /**
79
+ * Check if a log level should be output
80
+ * @param level - Log level to check
81
+ * @returns True if should output
82
+ */
83
+ private shouldLog(level: LogLevel): boolean {
84
+ return level >= this.config.level && this.config.enabled
85
+ }
86
+
87
+ /**
88
+ * Format the log message
89
+ * @param component - Component name
90
+ * @param level - Log level
91
+ * @param message - Log message
92
+ * @param data - Additional data to log
93
+ * @returns Formatted log message
94
+ */
95
+ private formatMessage(component: string, level: LogLevel, message: string, data?: any): string {
96
+ const prefix = this.getPrefix(component)
97
+ const levelName = LogLevel[level]
98
+
99
+ let formattedMessage = `${prefix} ${levelName} ${message}`
100
+
101
+ if (data !== undefined) {
102
+ formattedMessage += ` ${JSON.stringify(data)}`
103
+ }
104
+
105
+ return formattedMessage
106
+ }
107
+
108
+ /**
109
+ * Log a debug message
110
+ * @param component - Component name
111
+ * @param message - Log message
112
+ * @param data - Additional data to log
113
+ */
114
+ debug(component: string, message: string, data?: any): void {
115
+ if (!this.shouldLog(LogLevel.DEBUG)) return
116
+
117
+ const formattedMessage = this.formatMessage(component, LogLevel.DEBUG, message, data)
118
+ // eslint-disable-next-line no-console
119
+ console.log(formattedMessage)
120
+ }
121
+
122
+ /**
123
+ * Log an info message
124
+ * @param component - Component name
125
+ * @param message - Log message
126
+ * @param data - Additional data to log
127
+ */
128
+ info(component: string, message: string, data?: any): void {
129
+ if (!this.shouldLog(LogLevel.INFO)) return
130
+
131
+ const formattedMessage = this.formatMessage(component, LogLevel.INFO, message, data)
132
+ // eslint-disable-next-line no-console
133
+ console.log(formattedMessage)
134
+ }
135
+
136
+ /**
137
+ * Log a warning message
138
+ * @param component - Component name
139
+ * @param message - Log message
140
+ * @param data - Additional data to log
141
+ */
142
+ warn(component: string, message: string, data?: any): void {
143
+ if (!this.shouldLog(LogLevel.WARN)) return
144
+
145
+ const formattedMessage = this.formatMessage(component, LogLevel.WARN, message, data)
146
+ // eslint-disable-next-line no-console
147
+ console.warn(formattedMessage)
148
+ }
149
+
150
+ /**
151
+ * Log an error message
152
+ * @param component - Component name
153
+ * @param message - Log message
154
+ * @param data - Additional data to log
155
+ */
156
+ error(component: string, message: string, data?: any): void {
157
+ if (!this.shouldLog(LogLevel.ERROR)) return
158
+
159
+ const formattedMessage = this.formatMessage(component, LogLevel.ERROR, message, data)
160
+ // eslint-disable-next-line no-console
161
+ console.error(formattedMessage)
162
+ }
163
+
164
+ /**
165
+ * Log a success message (info level with success emoji)
166
+ * @param component - Component name
167
+ * @param message - Log message
168
+ * @param data - Additional data to log
169
+ */
170
+ success(component: string, message: string, data?: any): void {
171
+ if (!this.shouldLog(LogLevel.INFO)) return
172
+
173
+ const prefix = this.getPrefix(component)
174
+ const formattedMessage = `${prefix} ✅ ${message}`
175
+
176
+ let fullMessage = formattedMessage
177
+ if (data !== undefined) {
178
+ fullMessage += ` ${JSON.stringify(data)}`
179
+ }
180
+
181
+ // eslint-disable-next-line no-console
182
+ console.log(fullMessage)
183
+ }
184
+
185
+ /**
186
+ * Log a failure message (error level with failure emoji)
187
+ * @param component - Component name
188
+ * @param message - Log message
189
+ * @param data - Additional data to log
190
+ */
191
+ failure(component: string, message: string, data?: any): void {
192
+ if (!this.shouldLog(LogLevel.ERROR)) return
193
+
194
+ const prefix = this.getPrefix(component)
195
+ const formattedMessage = `${prefix} ❌ ${message}`
196
+
197
+ let fullMessage = formattedMessage
198
+ if (data !== undefined) {
199
+ fullMessage += ` ${JSON.stringify(data)}`
200
+ }
201
+
202
+ // eslint-disable-next-line no-console
203
+ console.error(fullMessage)
204
+ }
205
+ }
206
+
207
+ // Export a singleton instance
208
+ export const logger = new Logger()
209
+
210
+ // Export convenience functions for common use cases
211
+ export const logDebug = (component: string, message: string, data?: any) => logger.debug(component, message, data)
212
+ export const logInfo = (component: string, message: string, data?: any) => logger.info(component, message, data)
213
+ export const logWarn = (component: string, message: string, data?: any) => logger.warn(component, message, data)
214
+ export const logError = (component: string, message: string, data?: any) => logger.error(component, message, data)
215
+ export const logSuccess = (component: string, message: string, data?: any) => logger.success(component, message, data)
216
+ export const logFailure = (component: string, message: string, data?: any) => logger.failure(component, message, data)
@@ -0,0 +1,370 @@
1
+ import { type IResourceAttributes } from '../types'
2
+ import OptionalConstants from './constants.optional'
3
+ import { Platform, Dimensions, PixelRatio } from 'react-native'
4
+ import { version } from '../version'
5
+ import { getAutoDetectedAppMetadata } from './app-metadata'
6
+
7
+ // Global app metadata configuration for non-Expo apps
8
+ let globalAppMetadata: { name?: string; version?: string; bundleId?: string } = {}
9
+
10
+ // Cache for auto-detected metadata to avoid repeated file reads
11
+ let autoDetectedMetadata: { name?: string; version?: string; bundleId?: string } | null = null
12
+
13
+ export interface PlatformInfo {
14
+ isExpo: boolean
15
+ isReactNative: boolean
16
+ platform: 'ios' | 'android' | 'web' | 'unknown'
17
+ platformVersion?: string
18
+ expoVersion?: string
19
+ deviceType: string
20
+ }
21
+
22
+ export function detectPlatform(): PlatformInfo {
23
+ try {
24
+ // Check if we're in an Expo environment
25
+ const isExpo = !!OptionalConstants?.expoVersion
26
+
27
+ if (isExpo) {
28
+ const expoVersion = OptionalConstants?.expoVersion
29
+ const platform = OptionalConstants?.platform
30
+
31
+ return {
32
+ isExpo: true,
33
+ isReactNative: true,
34
+ platform: platform?.ios ? 'ios' : platform?.android ? 'android' : 'unknown',
35
+ expoVersion,
36
+ deviceType: 'expo',
37
+ }
38
+ }
39
+
40
+ // Fallback to React Native detection
41
+ return {
42
+ isExpo: false,
43
+ isReactNative: true,
44
+ platform: Platform.OS as 'ios' | 'android' | 'web' | 'unknown',
45
+ platformVersion: Platform.Version?.toString(),
46
+ deviceType: Platform.OS,
47
+ }
48
+ } catch (error) {
49
+ // Fallback for web or other environments
50
+ return {
51
+ isExpo: false,
52
+ isReactNative: false,
53
+ platform: 'unknown',
54
+ deviceType: 'unknown',
55
+ }
56
+ }
57
+ }
58
+
59
+ export function getPlatformAttributes(): Record<string, any> {
60
+ const platformInfo = detectPlatform()
61
+
62
+ const attributes: Record<string, any> = {
63
+ platform: platformInfo.isExpo ? 'expo' : 'react-native',
64
+ 'device.type': platformInfo.deviceType,
65
+ }
66
+
67
+ if (platformInfo.platformVersion) {
68
+ attributes['platform.version'] = platformInfo.platformVersion
69
+ }
70
+
71
+ if (platformInfo.expoVersion) {
72
+ attributes['expo.version'] = platformInfo.expoVersion
73
+ }
74
+
75
+ return attributes
76
+ }
77
+
78
+ export function isExpoEnvironment(): boolean {
79
+ return detectPlatform().isExpo
80
+ }
81
+
82
+ export function isReactNativeEnvironment(): boolean {
83
+ return detectPlatform().isReactNative
84
+ }
85
+
86
+ /**
87
+ * Configure app metadata for non-Expo React Native apps
88
+ * Call this function in your app initialization to provide app information
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * import { configureAppMetadata } from '@multiplayer-app/session-recorder-react-native'
93
+ *
94
+ * // In your App.tsx or index.js
95
+ * configureAppMetadata({
96
+ * name: 'My Awesome App',
97
+ * version: '1.2.3',
98
+ * bundleId: 'com.mycompany.myapp',
99
+ * buildNumber: '123',
100
+ * displayName: 'My App',
101
+ * })
102
+ * ```
103
+ */
104
+ export function configureAppMetadata(metadata: {
105
+ name?: string
106
+ version?: string
107
+ bundleId?: string
108
+ buildNumber?: string
109
+ displayName?: string
110
+ }): void {
111
+ globalAppMetadata = { ...globalAppMetadata, ...metadata }
112
+ }
113
+
114
+ /**
115
+ * Get configured app metadata
116
+ */
117
+ export function getConfiguredAppMetadata(): { name?: string, version?: string, bundleId?: string, buildNumber?: string, displayName?: string, } {
118
+ return { ...globalAppMetadata }
119
+ }
120
+
121
+ /**
122
+ * Automatically detect app metadata from common configuration files
123
+ * This runs without developer intervention
124
+ */
125
+ function autoDetectAppMetadata(): { name?: string; version?: string; bundleId?: string } {
126
+ if (autoDetectedMetadata) {
127
+ return autoDetectedMetadata
128
+ }
129
+
130
+ try {
131
+ // Get auto-detected metadata from build-time generated file
132
+ const autoMetadata = getAutoDetectedAppMetadata()
133
+
134
+ // Filter out undefined values
135
+ const metadata: { name?: string; version?: string; bundleId?: string } = {}
136
+ if (autoMetadata.name) metadata.name = autoMetadata.name
137
+ if (autoMetadata.version) metadata.version = autoMetadata.version
138
+ if (autoMetadata.bundleId) metadata.bundleId = autoMetadata.bundleId
139
+
140
+ autoDetectedMetadata = metadata
141
+ return metadata
142
+ } catch (error) {
143
+ // Silently fail - this is optional auto-detection
144
+ autoDetectedMetadata = {}
145
+ return {}
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Enhanced app metadata detection with automatic fallbacks
151
+ */
152
+ export function getAppMetadata(): { name?: string; version?: string; bundleId?: string } {
153
+ // Priority order:
154
+ // 1. Expo config (if available)
155
+ // 2. Manually configured metadata
156
+ // 3. Auto-detected metadata
157
+ // 4. Fallbacks
158
+
159
+ const expoMetadata = getExpoMetadata()
160
+ const configuredMetadata = getConfiguredAppMetadata()
161
+ const autoMetadata = autoDetectAppMetadata()
162
+
163
+ return {
164
+ name: expoMetadata.name || configuredMetadata.name || autoMetadata.name,
165
+ version: expoMetadata.version || configuredMetadata.version || autoMetadata.version,
166
+ bundleId: expoMetadata.bundleId || configuredMetadata.bundleId || autoMetadata.bundleId,
167
+ }
168
+ }
169
+
170
+ /**
171
+ * Get metadata from Expo config
172
+ */
173
+ function getExpoMetadata(): { name?: string; version?: string; bundleId?: string } {
174
+ const expoConfig = OptionalConstants?.expoConfig
175
+ if (!expoConfig) return {}
176
+
177
+ return {
178
+ name: expoConfig.name,
179
+ version: expoConfig.version,
180
+ bundleId: expoConfig.ios?.bundleIdentifier || expoConfig.android?.package,
181
+ }
182
+ }
183
+
184
+ export const getNavigatorInfo = (): IResourceAttributes => {
185
+ const platformInfo = detectPlatform()
186
+ const screenData = Dimensions.get('window')
187
+ const screenDataScreen = Dimensions.get('screen')
188
+ const pixelRatio = PixelRatio.get()
189
+
190
+ // Get device type based on screen dimensions
191
+ const getDeviceType = (): string => {
192
+ const { width, height } = screenData
193
+ const minDimension = Math.min(width, height)
194
+ const maxDimension = Math.max(width, height)
195
+
196
+ // Rough device type detection based on screen size
197
+ if (maxDimension >= 1024) {
198
+ return 'Tablet'
199
+ } else if (minDimension >= 600) {
200
+ return 'Large Phone'
201
+ } else {
202
+ return 'Phone'
203
+ }
204
+ }
205
+
206
+ // Get orientation
207
+ const getOrientation = (): string => {
208
+ const { width, height } = screenData
209
+ return width > height ? 'Landscape' : 'Portrait'
210
+ }
211
+
212
+ // Get OS version details
213
+ const getOSInfo = (): string => {
214
+ if (platformInfo.isExpo) {
215
+ const platform = OptionalConstants?.platform
216
+ if (platform?.ios) {
217
+ return `iOS ${Platform.Version}`
218
+ } else if (platform?.android) {
219
+ return `Android ${Platform.Version}`
220
+ }
221
+ }
222
+
223
+ if (Platform.OS === 'ios') {
224
+ return `iOS ${Platform.Version}`
225
+ } else if (Platform.OS === 'android') {
226
+ return `Android ${Platform.Version}`
227
+ }
228
+
229
+ return `${Platform.OS} ${Platform.Version || 'Unknown'}`
230
+ }
231
+
232
+ // Get device info string
233
+ const getDeviceInfo = (): string => {
234
+ const deviceType = getDeviceType()
235
+ const osInfo = getOSInfo()
236
+ return `${deviceType} - ${osInfo}`
237
+ }
238
+
239
+ // Get browser/runtime info
240
+ const getBrowserInfo = (): string => {
241
+ if (platformInfo.isExpo) {
242
+ return `Expo ${platformInfo.expoVersion || 'Unknown'} - React Native`
243
+ }
244
+ return 'React Native'
245
+ }
246
+
247
+ // Get screen size string
248
+ const getScreenSize = (): string => {
249
+ return `${Math.round(screenData.width)}x${Math.round(screenData.height)}`
250
+ }
251
+ const metadata = getAppMetadata()
252
+ // Get app info with fallbacks for non-Expo apps
253
+ const getAppInfo = (): string => {
254
+ const appName = getAppName()
255
+ const appVersion = getAppVersion()
256
+ return `${appName} v${appVersion}`
257
+ }
258
+
259
+ // Get app name with automatic detection
260
+ const getAppName = (): string => {
261
+
262
+ if (metadata.name) return metadata.name
263
+
264
+ // Try configured display name as fallback
265
+ const configuredMetadata = getConfiguredAppMetadata()
266
+ if (configuredMetadata.displayName) return configuredMetadata.displayName
267
+
268
+ // Final fallback
269
+ return 'React Native App'
270
+ }
271
+
272
+ // Get app version with automatic detection
273
+ const getAppVersion = (): string => {
274
+ if (metadata.version) return metadata.version
275
+
276
+ // Final fallback
277
+ return 'Unknown'
278
+ }
279
+
280
+ // Get bundle ID with automatic detection
281
+ const getBundleId = (): string => {
282
+ if (metadata.bundleId) return metadata.bundleId
283
+
284
+ // Fallback
285
+ return 'com.reactnative.app'
286
+ }
287
+
288
+ // Get build number with multiple fallback strategies
289
+ const getBuildNumber = (): string => {
290
+ // Try Expo config first
291
+ const expoBuildNumber =
292
+ OptionalConstants?.expoConfig?.ios?.buildNumber ||
293
+ OptionalConstants?.expoConfig?.android?.versionCode
294
+ if (expoBuildNumber) return expoBuildNumber.toString()
295
+
296
+ // Try configured metadata for non-Expo apps
297
+ const configuredMetadata = getConfiguredAppMetadata()
298
+ if (configuredMetadata.buildNumber) return configuredMetadata.buildNumber
299
+
300
+ // Fallback
301
+ return '1'
302
+ }
303
+
304
+
305
+ // Get hardware info
306
+ const getHardwareInfo = (): string => {
307
+ const pixelRatioInfo = `Pixel Ratio: ${pixelRatio}`
308
+ const screenDensity = PixelRatio.getFontScale()
309
+ return `${pixelRatioInfo}, Font Scale: ${screenDensity}`
310
+ }
311
+
312
+ return {
313
+ // Core platform info
314
+ platform: platformInfo.isExpo ? 'expo' : 'react-native',
315
+ userAgent: getBrowserInfo(),
316
+ timestamp: new Date().toISOString(),
317
+
318
+ // Device and OS information
319
+ deviceInfo: getDeviceInfo(),
320
+ osInfo: getOSInfo(),
321
+ browserInfo: getBrowserInfo(),
322
+
323
+ // Screen information
324
+ screenSize: getScreenSize(),
325
+ pixelRatio: pixelRatio,
326
+ orientation: getOrientation(),
327
+ screenWidth: Math.round(screenData.width),
328
+ screenHeight: Math.round(screenData.height),
329
+ screenScale: pixelRatio,
330
+
331
+ // Device capabilities
332
+ hardwareConcurrency: 1, // React Native doesn't expose CPU cores directly
333
+ cookiesEnabled: 'N/A', // Not applicable in React Native
334
+
335
+ // App information
336
+ packageVersion: version,
337
+ appInfo: getAppInfo(),
338
+ appName: getAppName(),
339
+ appVersion: getAppVersion(),
340
+ bundleId: getBundleId(),
341
+ buildNumber: getBuildNumber(),
342
+
343
+ // Platform specific
344
+ platformType: platformInfo.platform,
345
+ platformVersion: platformInfo.platformVersion,
346
+ expoVersion: platformInfo.expoVersion,
347
+ deviceType: getDeviceType(),
348
+
349
+ // Performance and hardware
350
+ hardwareInfo: getHardwareInfo(),
351
+
352
+ // Screen details
353
+ screenDensity: PixelRatio.getFontScale(),
354
+ screenScaleFactor: pixelRatio,
355
+ windowWidth: Math.round(screenData.width),
356
+ windowHeight: Math.round(screenData.height),
357
+ fullScreenWidth: Math.round(screenDataScreen.width),
358
+ fullScreenHeight: Math.round(screenDataScreen.height),
359
+
360
+ // Environment info
361
+ isExpo: platformInfo.isExpo,
362
+ isReactNative: platformInfo.isReactNative,
363
+ environment: platformInfo.isExpo ? 'expo' : 'react-native',
364
+
365
+ // System type identifier (previously in system tags)
366
+ systemType: 'mobile',
367
+ // Additional platform attributes
368
+ // ...getPlatformAttributes(),
369
+ }
370
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Request utility functions for React Native
3
+ */
4
+
5
+ /**
6
+ * Convert FormData to query string (React Native compatible)
7
+ * @param formData - FormData object
8
+ * @returns Query string
9
+ */
10
+ export const formDataToQuery = (formData: any): string => {
11
+ if (!formData) return ''
12
+
13
+ // In React Native, FormData is handled differently
14
+ // This is a simplified implementation
15
+ const params = new URLSearchParams()
16
+
17
+ if (typeof formData.entries === 'function') {
18
+ for (const [key, value] of formData.entries()) {
19
+ params.append(key, value as string)
20
+ }
21
+ } else if (typeof formData === 'object') {
22
+ for (const [key, value] of Object.entries(formData)) {
23
+ params.append(key, String(value))
24
+ }
25
+ }
26
+
27
+ return params.toString()
28
+ }
29
+
30
+ /**
31
+ * Convert object to query string
32
+ * @param obj - Object to convert
33
+ * @returns Query string
34
+ */
35
+ export const objectToQuery = (obj: Record<string, any>): string => {
36
+ const params = new URLSearchParams()
37
+
38
+ for (const [key, value] of Object.entries(obj)) {
39
+ if (value !== null && value !== undefined) {
40
+ params.append(key, String(value))
41
+ }
42
+ }
43
+
44
+ return params.toString()
45
+ }
46
+
47
+ /**
48
+ * Parse query string to object
49
+ * @param queryString - Query string to parse
50
+ * @returns Object with parsed parameters
51
+ */
52
+ export const queryToObject = (queryString: string): Record<string, string> => {
53
+ const params = new URLSearchParams(queryString)
54
+ const obj: Record<string, string> = {}
55
+
56
+ for (const [key, value] of params.entries()) {
57
+ obj[key] = value
58
+ }
59
+
60
+ return obj
61
+ }