@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,33 @@
1
+ package com.sessionrecordernative
2
+
3
+ import com.facebook.react.BaseReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.model.ReactModuleInfo
7
+ import com.facebook.react.module.model.ReactModuleInfoProvider
8
+ import java.util.HashMap
9
+
10
+ class SessionRecorderNativePackage : BaseReactPackage() {
11
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
12
+ return if (name == SessionRecorderNativeModule.NAME) {
13
+ SessionRecorderNativeModule(reactContext) as NativeModule
14
+ } else {
15
+ null
16
+ }
17
+ }
18
+
19
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
20
+ return ReactModuleInfoProvider {
21
+ val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
22
+ moduleInfos[SessionRecorderNativeModule.NAME] = ReactModuleInfo(
23
+ SessionRecorderNativeModule.NAME,
24
+ SessionRecorderNativeModule.NAME,
25
+ false, // canOverrideExistingModule
26
+ false, // needsEagerInit
27
+ false, // isCxxModule
28
+ false // isTurboModule
29
+ )
30
+ moduleInfos
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,79 @@
1
+ package com.multiplayer.sessionrecordernative
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
5
+ import com.facebook.react.bridge.ReactMethod
6
+ import com.facebook.react.bridge.Promise
7
+ import com.facebook.react.bridge.Callback
8
+ import com.facebook.react.bridge.ReadableMap
9
+ import com.facebook.react.bridge.Arguments
10
+ import com.facebook.react.bridge.WritableMap
11
+
12
+ /**
13
+ * Spec class for SessionRecorderNative TurboModule
14
+ * This class defines the interface that React Native expects for TurboModules
15
+ */
16
+ class SessionRecorderNativeSpec(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
17
+
18
+ override fun getName(): String {
19
+ return NAME
20
+ }
21
+
22
+ companion object {
23
+ const val NAME = "SessionRecorderNative"
24
+ }
25
+
26
+ // Delegate to the actual implementation
27
+ private val implementation = SessionRecorderNativeModule(reactContext)
28
+
29
+ @ReactMethod
30
+ fun captureAndMask(promise: Promise) {
31
+ implementation.captureAndMask(promise)
32
+ }
33
+
34
+ @ReactMethod
35
+ fun captureAndMaskWithOptions(options: ReadableMap, promise: Promise) {
36
+ implementation.captureAndMaskWithOptions(options, promise)
37
+ }
38
+
39
+ @ReactMethod
40
+ fun startGestureRecording(promise: Promise) {
41
+ implementation.startGestureRecording(promise)
42
+ }
43
+
44
+ @ReactMethod
45
+ fun stopGestureRecording(promise: Promise) {
46
+ implementation.stopGestureRecording(promise)
47
+ }
48
+
49
+ @ReactMethod
50
+ fun isGestureRecordingActive(promise: Promise) {
51
+ implementation.isGestureRecordingActive(promise)
52
+ }
53
+
54
+ @ReactMethod
55
+ fun setGestureCallback(callback: Callback) {
56
+ implementation.setGestureCallback(callback)
57
+ }
58
+
59
+ @ReactMethod
60
+ fun recordGesture(
61
+ gestureType: String,
62
+ x: Double,
63
+ y: Double,
64
+ target: String?,
65
+ metadata: ReadableMap?
66
+ ) {
67
+ implementation.recordGesture(gestureType, x, y, target, metadata)
68
+ }
69
+
70
+ @ReactMethod
71
+ fun addListener(eventName: String) {
72
+ implementation.addListener(eventName)
73
+ }
74
+
75
+ @ReactMethod
76
+ fun removeListeners(count: Int) {
77
+ implementation.removeListeners(count)
78
+ }
79
+ }
@@ -0,0 +1,9 @@
1
+ package com.sessionrecordernative.model
2
+
3
+ data class TargetInfo(
4
+ val identifier: String,
5
+ val label: String?,
6
+ val role: String?,
7
+ val testId: String?,
8
+ val text: String?
9
+ )
@@ -0,0 +1,72 @@
1
+ package com.sessionrecordernative.util
2
+
3
+ import android.graphics.PointF
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+ import android.widget.*
7
+ import com.sessionrecordernative.model.TargetInfo
8
+
9
+ object ViewUtils {
10
+ fun findTargetView(point: PointF, rootView: ViewGroup?): TargetInfo {
11
+ if (rootView == null) {
12
+ return TargetInfo("unknown", null, null, null, null)
13
+ }
14
+
15
+ val targetView =
16
+ findViewAtPoint(point, rootView) ?: return TargetInfo("unknown", null, null, null, null)
17
+
18
+ val identifier =
19
+ targetView.contentDescription?.toString()
20
+ ?: targetView.tag?.toString() ?: "view-${targetView.hashCode()}"
21
+
22
+ val label = targetView.contentDescription?.toString()
23
+ val role = getAccessibilityRole(targetView)
24
+ val testId = targetView.tag?.toString()
25
+
26
+ val text =
27
+ when (targetView) {
28
+ is TextView -> targetView.text?.toString()
29
+ is Button -> targetView.text?.toString()
30
+ is EditText -> targetView.text?.toString() ?: targetView.hint?.toString()
31
+ else -> null
32
+ }
33
+
34
+ return TargetInfo(identifier, label, role, testId, text)
35
+ }
36
+
37
+ private fun findViewAtPoint(point: PointF, viewGroup: ViewGroup): View? {
38
+ for (i in viewGroup.childCount - 1 downTo 0) {
39
+ val child = viewGroup.getChildAt(i)
40
+ if (child.visibility == View.VISIBLE && child.alpha > 0.01f) {
41
+ val location = IntArray(2)
42
+ child.getLocationOnScreen(location)
43
+ val childRect =
44
+ android.graphics.Rect(
45
+ location[0],
46
+ location[1],
47
+ location[0] + child.width,
48
+ location[1] + child.height
49
+ )
50
+
51
+ if (childRect.contains(point.x.toInt(), point.y.toInt())) {
52
+ return if (child is ViewGroup) {
53
+ findViewAtPoint(point, child) ?: child
54
+ } else {
55
+ child
56
+ }
57
+ }
58
+ }
59
+ }
60
+ return null
61
+ }
62
+
63
+ private fun getAccessibilityRole(view: View): String? {
64
+ return when (view) {
65
+ is Button -> "button"
66
+ is EditText -> "textbox"
67
+ is ImageView -> "image"
68
+ is TextView -> "text"
69
+ else -> null
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,50 @@
1
+ import UIKit
2
+
3
+ struct GestureTargetInfo {
4
+ let identifier: String
5
+ let label: String?
6
+ let role: String?
7
+ let testId: String?
8
+ let text: String?
9
+ }
10
+
11
+ enum GestureTargetFinder {
12
+ static func findTargetView(at point: CGPoint, in view: UIView) -> GestureTargetInfo {
13
+ let targetView = view.hitTest(point, with: nil)
14
+
15
+ guard let target = targetView else {
16
+ return GestureTargetInfo(identifier: "unknown", label: nil, role: nil, testId: nil, text: nil)
17
+ }
18
+
19
+ let identifier = target.accessibilityIdentifier ?? target.accessibilityLabel ?? "view-\(target.hash)"
20
+ let label = target.accessibilityLabel
21
+ let role = roleFromAccessibilityTraits(target.accessibilityTraits)
22
+ let testId = target.accessibilityIdentifier
23
+
24
+ var text: String?
25
+ if let labelView = target as? UILabel {
26
+ text = labelView.text
27
+ } else if let button = target as? UIButton {
28
+ text = button.titleLabel?.text
29
+ } else if let textField = target as? UITextField {
30
+ text = textField.text ?? textField.placeholder
31
+ } else if let textView = target as? UITextView {
32
+ text = textView.text
33
+ }
34
+
35
+ return GestureTargetInfo(identifier: identifier, label: label, role: role, testId: testId, text: text)
36
+ }
37
+
38
+ static func roleFromAccessibilityTraits(_ traits: UIAccessibilityTraits) -> String? {
39
+ if traits.contains(.button) { return "button" }
40
+ if traits.contains(.link) { return "link" }
41
+ if traits.contains(.image) { return "image" }
42
+ if traits.contains(.staticText) { return "text" }
43
+ if traits.contains(.header) { return "header" }
44
+ if traits.contains(.searchField) { return "search" }
45
+ if traits.contains(.keyboardKey) { return "key" }
46
+ if traits.contains(.adjustable) { return "adjustable" }
47
+ if traits.contains(.tabBar) { return "tabbar" }
48
+ return nil
49
+ }
50
+ }
@@ -0,0 +1,2 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
@@ -1,21 +1,32 @@
1
1
  #import <React/RCTBridgeModule.h>
2
2
  #import <React/RCTEventEmitter.h>
3
3
 
4
- @interface RCT_EXTERN_MODULE(GestureRecorderNative, RCTEventEmitter)
4
+ @interface RCT_EXTERN_MODULE(SessionRecorderNative, RCTEventEmitter)
5
5
 
6
- RCT_EXTERN_METHOD(startGestureRecording:(RCTPromiseResolveBlock)resolve
6
+ RCT_EXTERN_METHOD(captureAndMask:(RCTPromiseResolveBlock)resolve
7
7
  reject:(RCTPromiseRejectBlock)reject)
8
8
 
9
- RCT_EXTERN_METHOD(stopGestureRecording:(RCTPromiseResolveBlock)resolve
9
+ RCT_EXTERN_METHOD(captureAndMaskWithOptions:(NSDictionary *)options
10
+ resolve:(RCTPromiseResolveBlock)resolve
10
11
  reject:(RCTPromiseRejectBlock)reject)
11
12
 
13
+ // Gesture recording APIs
14
+ RCT_EXTERN_METHOD(startGestureRecording:(RCTPromiseResolveBlock)resolve
15
+ reject:(RCTPromiseRejectBlock)reject)
16
+ RCT_EXTERN_METHOD(stopGestureRecording:(RCTPromiseResolveBlock)resolve
17
+ reject:(RCTPromiseRejectBlock)reject)
12
18
  RCT_EXTERN_METHOD(isGestureRecordingActive:(RCTPromiseResolveBlock)resolve
13
19
  reject:(RCTPromiseRejectBlock)reject)
14
-
20
+ RCT_EXTERN_METHOD(setGestureCallback:(RCTResponseSenderBlock)callback)
15
21
  RCT_EXTERN_METHOD(recordGesture:(NSString *)gestureType
16
- x:(NSNumber *)x
17
- y:(NSNumber *)y
22
+ x:(nonnull NSNumber *)x
23
+ y:(nonnull NSNumber *)y
18
24
  target:(NSString *)target
19
25
  metadata:(NSDictionary *)metadata)
20
26
 
27
+ + (BOOL)requiresMainQueueSetup
28
+ {
29
+ return YES;
30
+ }
31
+
21
32
  @end
@@ -3,7 +3,7 @@ import React
3
3
  import WebKit
4
4
 
5
5
  @objc(SessionRecorderNative)
6
- class SessionRecorderNative: NSObject {
6
+ class SessionRecorderNative: RCTEventEmitter, UIGestureRecognizerDelegate {
7
7
 
8
8
  // Configuration options
9
9
  private var maskTextInputs: Bool = true
@@ -44,6 +44,7 @@ class SessionRecorderNative: NSObject {
44
44
  "SwiftUI.GradientLayer", // Views like LinearGradient, RadialGradient, or AngularGradient
45
45
  ].compactMap(NSClassFromString)
46
46
 
47
+ // MARK: - Screen capture APIs
47
48
  @objc func captureAndMask(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
48
49
  DispatchQueue.main.async {
49
50
  guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else {
@@ -117,6 +118,74 @@ class SessionRecorderNative: NSObject {
117
118
  }
118
119
  }
119
120
 
121
+ // MARK: - Gesture recording state
122
+ private var isRecording = false
123
+ private var gestureCallback: RCTResponseSenderBlock?
124
+ private var rootViewController: UIViewController?
125
+
126
+ private var tapGestureRecognizer: UITapGestureRecognizer?
127
+ private var panGestureRecognizer: UIPanGestureRecognizer?
128
+ private var longPressGestureRecognizer: UILongPressGestureRecognizer?
129
+ private var pinchGestureRecognizer: UIPinchGestureRecognizer?
130
+
131
+ // MARK: - Event Emitter overrides
132
+ override func supportedEvents() -> [String]! {
133
+ return ["onGestureDetected"]
134
+ }
135
+
136
+ @objc override static func requiresMainQueueSetup() -> Bool {
137
+ return true
138
+ }
139
+
140
+ // MARK: - Gesture recording APIs
141
+ @objc func startGestureRecording(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
142
+ DispatchQueue.main.async {
143
+ guard !self.isRecording else {
144
+ resolve(nil)
145
+ return
146
+ }
147
+
148
+ self.setupGestureRecognizers()
149
+ self.isRecording = true
150
+ resolve(nil)
151
+ }
152
+ }
153
+
154
+ @objc func stopGestureRecording(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
155
+ DispatchQueue.main.async {
156
+ guard self.isRecording else {
157
+ resolve(nil)
158
+ return
159
+ }
160
+
161
+ self.removeGestureRecognizers()
162
+ self.isRecording = false
163
+ resolve(nil)
164
+ }
165
+ }
166
+
167
+ @objc func isGestureRecordingActive(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
168
+ resolve(self.isRecording)
169
+ }
170
+
171
+ @objc func setGestureCallback(_ callback: @escaping RCTResponseSenderBlock) {
172
+ self.gestureCallback = callback
173
+ }
174
+
175
+ @objc func recordGesture(_ gestureType: String, x: NSNumber, y: NSNumber, target: String?, metadata: NSDictionary?) {
176
+ let gestureEvent: [String: Any] = [
177
+ "type": gestureType,
178
+ "timestamp": Date().timeIntervalSince1970 * 1000,
179
+ "x": x.doubleValue,
180
+ "y": y.doubleValue,
181
+ "target": target ?? "",
182
+ "metadata": metadata ?? [:]
183
+ ]
184
+
185
+ self.sendEvent(withName: "onGestureDetected", body: gestureEvent)
186
+ if let cb = gestureCallback { cb([gestureEvent]) }
187
+ }
188
+
120
189
  private func updateConfiguration(from options: NSDictionary) {
121
190
  print("SessionRecorder: updateConfiguration called with options: \(options)")
122
191
 
@@ -509,6 +578,192 @@ class SessionRecorderNative: NSObject {
509
578
  UIGraphicsEndImageContext()
510
579
  return newImage ?? image
511
580
  }
581
+
582
+ // MARK: - Gesture setup and handlers
583
+ private func setupGestureRecognizers() {
584
+ guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }),
585
+ let rootViewController = window.rootViewController else {
586
+ return
587
+ }
588
+
589
+ self.rootViewController = rootViewController
590
+
591
+ // Tap
592
+ tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
593
+ tapGestureRecognizer?.numberOfTapsRequired = 1
594
+ tapGestureRecognizer?.numberOfTouchesRequired = 1
595
+ rootViewController.view.addGestureRecognizer(tapGestureRecognizer!)
596
+
597
+ // Pan
598
+ panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
599
+ rootViewController.view.addGestureRecognizer(panGestureRecognizer!)
600
+
601
+ // Long press
602
+ longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
603
+ longPressGestureRecognizer?.minimumPressDuration = 0.5
604
+ rootViewController.view.addGestureRecognizer(longPressGestureRecognizer!)
605
+
606
+ // Pinch
607
+ pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
608
+ rootViewController.view.addGestureRecognizer(pinchGestureRecognizer!)
609
+
610
+ // Allow simultaneous recognition
611
+ tapGestureRecognizer?.delegate = self
612
+ panGestureRecognizer?.delegate = self
613
+ longPressGestureRecognizer?.delegate = self
614
+ pinchGestureRecognizer?.delegate = self
615
+ }
616
+
617
+ private func removeGestureRecognizers() {
618
+ guard let rootViewController = rootViewController else { return }
619
+
620
+ if let tapGesture = tapGestureRecognizer { rootViewController.view.removeGestureRecognizer(tapGesture) }
621
+ if let panGesture = panGestureRecognizer { rootViewController.view.removeGestureRecognizer(panGesture) }
622
+ if let longPressGesture = longPressGestureRecognizer { rootViewController.view.removeGestureRecognizer(longPressGesture) }
623
+ if let pinchGesture = pinchGestureRecognizer { rootViewController.view.removeGestureRecognizer(pinchGesture) }
624
+
625
+ tapGestureRecognizer = nil
626
+ panGestureRecognizer = nil
627
+ longPressGestureRecognizer = nil
628
+ pinchGestureRecognizer = nil
629
+ self.rootViewController = nil
630
+ }
631
+
632
+ @objc private func handleTap(_ gesture: UITapGestureRecognizer) {
633
+ guard let view = gesture.view else { return }
634
+ let location = gesture.location(in: view)
635
+ let target = GestureTargetFinder.findTargetView(at: location, in: view)
636
+
637
+ let gestureEvent: [String: Any] = [
638
+ "type": "tap",
639
+ "timestamp": Date().timeIntervalSince1970 * 1000,
640
+ "x": location.x,
641
+ "y": location.y,
642
+ "target": target.identifier,
643
+ "targetInfo": [
644
+ "identifier": target.identifier,
645
+ "label": target.label as Any,
646
+ "role": target.role as Any,
647
+ "testId": target.testId as Any,
648
+ "text": target.text as Any
649
+ ],
650
+ "metadata": [
651
+ "pressure": 1.0
652
+ ]
653
+ ]
654
+
655
+ self.sendEvent(withName: "onGestureDetected", body: gestureEvent)
656
+ if let cb = gestureCallback { cb([gestureEvent]) }
657
+ }
658
+
659
+ @objc private func handlePan(_ gesture: UIPanGestureRecognizer) {
660
+ guard let view = gesture.view else { return }
661
+ let location = gesture.location(in: view)
662
+ let velocity = gesture.velocity(in: view)
663
+ let translation = gesture.translation(in: view)
664
+
665
+ let target = GestureTargetFinder.findTargetView(at: location, in: view)
666
+
667
+ let gestureType: String
668
+ switch gesture.state {
669
+ case .began: gestureType = "pan_start"
670
+ case .changed: gestureType = "pan_move"
671
+ case .ended, .cancelled: gestureType = "pan_end"
672
+ default: return
673
+ }
674
+
675
+ let gestureEvent: [String: Any] = [
676
+ "type": gestureType,
677
+ "timestamp": Date().timeIntervalSince1970 * 1000,
678
+ "x": location.x,
679
+ "y": location.y,
680
+ "target": target.identifier,
681
+ "targetInfo": [
682
+ "identifier": target.identifier,
683
+ "label": target.label as Any,
684
+ "role": target.role as Any,
685
+ "testId": target.testId as Any,
686
+ "text": target.text as Any
687
+ ],
688
+ "metadata": [
689
+ "velocity": sqrt(velocity.x * velocity.x + velocity.y * velocity.y),
690
+ "deltaX": translation.x,
691
+ "deltaY": translation.y
692
+ ]
693
+ ]
694
+
695
+ self.sendEvent(withName: "onGestureDetected", body: gestureEvent)
696
+ if let cb = gestureCallback { cb([gestureEvent]) }
697
+ }
698
+
699
+ @objc private func handleLongPress(_ gesture: UILongPressGestureRecognizer) {
700
+ guard gesture.state == .began else { return }
701
+ guard let view = gesture.view else { return }
702
+ let location = gesture.location(in: view)
703
+ let target = GestureTargetFinder.findTargetView(at: location, in: view)
704
+
705
+ let gestureEvent: [String: Any] = [
706
+ "type": "long_press",
707
+ "timestamp": Date().timeIntervalSince1970 * 1000,
708
+ "x": location.x,
709
+ "y": location.y,
710
+ "target": target.identifier,
711
+ "targetInfo": [
712
+ "identifier": target.identifier,
713
+ "label": target.label as Any,
714
+ "role": target.role as Any,
715
+ "testId": target.testId as Any,
716
+ "text": target.text as Any
717
+ ],
718
+ "metadata": [
719
+ "duration": 0.5,
720
+ "pressure": 1.0
721
+ ]
722
+ ]
723
+
724
+ self.sendEvent(withName: "onGestureDetected", body: gestureEvent)
725
+ if let cb = gestureCallback { cb([gestureEvent]) }
726
+ }
727
+
728
+ @objc private func handlePinch(_ gesture: UIPinchGestureRecognizer) {
729
+ guard let view = gesture.view else { return }
730
+ let location = gesture.location(in: view)
731
+ let scale = gesture.scale
732
+ let velocity = gesture.velocity
733
+
734
+ let target = GestureTargetFinder.findTargetView(at: location, in: view)
735
+
736
+ let gestureEvent: [String: Any] = [
737
+ "type": "pinch",
738
+ "timestamp": Date().timeIntervalSince1970 * 1000,
739
+ "x": location.x,
740
+ "y": location.y,
741
+ "target": target.identifier,
742
+ "targetInfo": [
743
+ "identifier": target.identifier,
744
+ "label": target.label as Any,
745
+ "role": target.role as Any,
746
+ "testId": target.testId as Any,
747
+ "text": target.text as Any
748
+ ],
749
+ "metadata": [
750
+ "scale": scale,
751
+ "velocity": velocity
752
+ ]
753
+ ]
754
+
755
+ self.sendEvent(withName: "onGestureDetected", body: gestureEvent)
756
+ if let cb = gestureCallback { cb([gestureEvent]) }
757
+ }
758
+
759
+ // MARK: - UIGestureRecognizerDelegate
760
+ func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
761
+ return true
762
+ }
763
+
764
+ func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
765
+ return true
766
+ }
512
767
  }
513
768
 
514
769
  private enum MaskingType {
@@ -557,9 +812,6 @@ extension UIView {
557
812
  }
558
813
 
559
814
  func isNoCapture() -> Bool {
560
- // Check for common patterns that indicate sensitive content
561
-
562
-
563
815
  // Check accessibility label for sensitive keywords
564
816
  if let accessibilityLabel = accessibilityLabel?.lowercased() {
565
817
  let sensitiveKeywords = ["password", "secret", "private", "sensitive", "confidential"]
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { NativeModules } from 'react-native';
4
+ export default NativeModules.SessionRecorderNative;
5
+ //# sourceMappingURL=SessionRecorderNativeSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","SessionRecorderNative"],"sourceRoot":"../../src","sources":["SessionRecorderNativeSpec.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,cAAc;AAmD5C,eAAeA,aAAa,CAACC,qBAAqB","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ import SessionRecorder from '@multiplayer-app/session-recorder-react-native';
4
+ import { View } from 'react-native';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ export const ScreenRecorderView = ({
7
+ children
8
+ }) => {
9
+ // Callback ref to set the viewshot ref immediately when available
10
+ const setViewShotRef = ref => {
11
+ if (ref) {
12
+ SessionRecorder.setViewShotRef?.(ref);
13
+ }
14
+ };
15
+ return /*#__PURE__*/_jsx(View, {
16
+ ref: setViewShotRef,
17
+ style: {
18
+ flex: 1
19
+ },
20
+ children: children
21
+ });
22
+ };
23
+ //# sourceMappingURL=ScreenRecorderView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SessionRecorder","View","jsx","_jsx","ScreenRecorderView","children","setViewShotRef","ref","style","flex"],"sourceRoot":"../../../../src","sources":["components/ScreenRecorderView/ScreenRecorderView.tsx"],"mappings":";;AAAA,OAAOA,eAAe,MAAM,gDAAgD;AAE5E,SAASC,IAAI,QAAQ,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAIpC,OAAO,MAAMC,kBAAkB,GAAGA,CAAC;EAAEC;AAAkC,CAAC,KAAK;EAC3E;EACA,MAAMC,cAAc,GAAIC,GAAoB,IAAK;IAC/C,IAAIA,GAAG,EAAE;MACPP,eAAe,CAACM,cAAc,GAAGC,GAAG,CAAC;IACvC;EACF,CAAC;EAED,oBACEJ,IAAA,CAACF,IAAI;IAACM,GAAG,EAAED,cAAe;IAACE,KAAK,EAAE;MAAEC,IAAI,EAAE;IAAE,CAAE;IAAAJ,QAAA,EAC3CA;EAAQ,CACL,CAAC;AAEX,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export * from "./ScreenRecorderView.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["components/ScreenRecorderView/index.ts"],"mappings":";;AAAA,cAAc,yBAAsB","ignoreList":[]}