@multiplayer-app/session-recorder-react-native 1.0.1-beta.1 → 1.0.1-beta.10

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