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

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 +296 -156
  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/SessionRecorderNativeTurboSpec.d.ts → lib/typescript/src/SessionRecorderNativeSpec.d.ts} +14 -6
  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 +33 -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.d.ts +0 -33
  389. package/dist/native/SessionRecorderNative.js +0 -1
  390. package/dist/native/SessionRecorderNative.js.map +0 -1
  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
package/README.md CHANGED
@@ -55,6 +55,65 @@ npx expo install @react-native-async-storage/async-storage @react-native-communi
55
55
 
56
56
  If you use Expo Router or a managed workflow, no extra autolinking steps are required beyond installing the packages.
57
57
 
58
+ ### Expo Autolinking Support
59
+
60
+ This package includes full Expo autolinking support with the following configuration files:
61
+
62
+ - ✅ `expo-module.config.json` - Defines supported platforms and module names
63
+ - ✅ `react-native.config.js` - Configures React Native CLI autolinking
64
+ - ✅ Proper TurboModule registration for both iOS and Android
65
+
66
+ The module will be automatically detected and linked when you install it in your Expo project.
67
+
68
+ #### Expo Go vs Development Builds
69
+
70
+ **Important**: This package uses native modules that require custom native code. While autolinking is configured, you may encounter issues with **Expo Go** due to its limitations with custom native modules.
71
+
72
+ **If autolinking doesn't work with Expo Go**, try using development builds instead:
73
+
74
+ ```bash
75
+ # For iOS
76
+ npx expo run:ios
77
+
78
+ # For Android
79
+ npx expo run:android
80
+ ```
81
+
82
+ Development builds include your custom native modules and provide the full native functionality needed for session recording.
83
+
84
+ #### Troubleshooting Expo Autolinking
85
+
86
+ If you encounter issues with module autolinking in Expo:
87
+
88
+ 1. **Check Expo SDK compatibility**: Ensure you're using a compatible Expo SDK version
89
+ 2. **Clear cache**: Run `npx expo start -c` to clear the Expo cache
90
+ 3. **Use development builds**: Switch from Expo Go to development builds as shown above
91
+ 4. **Verify configuration**: Ensure the autolinking configuration files are present in your `node_modules/@multiplayer-app/session-recorder-react-native/` directory
92
+
93
+ #### Expo Configuration
94
+
95
+ For Expo applications, the package automatically detects the Expo environment:
96
+
97
+ ```javascript
98
+ import SessionRecorder from '@multiplayer-app/session-recorder-react-native';
99
+
100
+ SessionRecorder.init({
101
+ application: 'my-expo-app',
102
+ version: '1.0.0',
103
+ environment: 'production',
104
+ apiKey: 'YOUR_MULTIPLAYER_API_KEY',
105
+ recordGestures: true,
106
+ recordNavigation: true,
107
+ recordScreen: true,
108
+ });
109
+ ```
110
+
111
+ The package will automatically:
112
+
113
+ - Detect Expo environment using `expo-constants`
114
+ - Add Expo-specific attributes to traces
115
+ - Optimize performance for Expo runtime
116
+
58
117
  #### Why direct install is required
59
118
 
60
119
  - Autolinking scans only the app's `package.json`
@@ -92,43 +151,51 @@ If you encounter:
92
151
  #### For Basic React Native Apps (App.tsx)
93
152
 
94
153
  ```javascript
95
- import React from 'react'
96
- import { SessionRecorderProvider, SessionRecorder } from '@multiplayer-app/session-recorder-react-native'
154
+ import React from 'react';
155
+ import {
156
+ SessionRecorderProvider,
157
+ SessionRecorder,
158
+ } from '@multiplayer-app/session-recorder-react-native';
97
159
 
98
160
  // Initialize with minimal required options
99
161
  SessionRecorder.init({
100
162
  application: 'my-react-native-app',
101
163
  version: '1.0.0',
102
164
  environment: 'production',
103
- apiKey: 'YOUR_MULTIPLAYER_API_KEY'
104
- })
165
+ apiKey: 'YOUR_MULTIPLAYER_API_KEY',
166
+ });
105
167
 
106
168
  export default function App() {
107
- return <SessionRecorderProvider>{/* Your app content */}</SessionRecorderProvider>
169
+ return (
170
+ <SessionRecorderProvider>{/* Your app content */}</SessionRecorderProvider>
171
+ );
108
172
  }
109
173
  ```
110
174
 
111
175
  #### For Expo Apps (\_layout.tsx)
112
176
 
113
177
  ```javascript
114
- import React from 'react'
115
- import { Stack } from 'expo-router'
116
- import { SessionRecorderProvider, SessionRecorder } from '@multiplayer-app/session-recorder-react-native'
178
+ import React from 'react';
179
+ import { Stack } from 'expo-router';
180
+ import {
181
+ SessionRecorderProvider,
182
+ SessionRecorder,
183
+ } from '@multiplayer-app/session-recorder-react-native';
117
184
 
118
185
  // Initialize with minimal required options
119
186
  SessionRecorder.init({
120
187
  application: 'my-expo-app',
121
188
  version: '1.0.0',
122
189
  environment: 'production',
123
- apiKey: 'YOUR_MULTIPLAYER_API_KEY'
124
- })
190
+ apiKey: 'YOUR_MULTIPLAYER_API_KEY',
191
+ });
125
192
 
126
193
  export default function RootLayout() {
127
194
  return (
128
195
  <SessionRecorderProvider>
129
196
  <Stack />
130
197
  </SessionRecorderProvider>
131
- )
198
+ );
132
199
  }
133
200
  ```
134
201
 
@@ -144,8 +211,11 @@ This minimal setup will:
144
211
  #### For Basic React Native Apps (App.tsx)
145
212
 
146
213
  ```javascript
147
- import React from 'react'
148
- import { SessionRecorderProvider, SessionRecorder } from '@multiplayer-app/session-recorder-react-native'
214
+ import React from 'react';
215
+ import {
216
+ SessionRecorderProvider,
217
+ SessionRecorder,
218
+ } from '@multiplayer-app/session-recorder-react-native';
149
219
 
150
220
  SessionRecorder.init({
151
221
  application: 'my-react-native-app',
@@ -154,20 +224,25 @@ SessionRecorder.init({
154
224
  apiKey: 'YOUR_MULTIPLAYER_API_KEY',
155
225
  recordGestures: true, // default is true
156
226
  recordNavigation: true, // default is true
157
- recordScreen: true // default is true
158
- })
227
+ recordScreen: true, // default is true
228
+ });
159
229
 
160
230
  export default function App() {
161
- return <SessionRecorderProvider>{/* Your app content */}</SessionRecorderProvider>
231
+ return (
232
+ <SessionRecorderProvider>{/* Your app content */}</SessionRecorderProvider>
233
+ );
162
234
  }
163
235
  ```
164
236
 
165
237
  #### For Expo Apps (\_layout.tsx)
166
238
 
167
239
  ```javascript
168
- import React from 'react'
169
- import { Stack } from 'expo-router'
170
- import { SessionRecorderProvider, SessionRecorder } from '@multiplayer-app/session-recorder-react-native'
240
+ import React from 'react';
241
+ import { Stack } from 'expo-router';
242
+ import {
243
+ SessionRecorderProvider,
244
+ SessionRecorder,
245
+ } from '@multiplayer-app/session-recorder-react-native';
171
246
 
172
247
  SessionRecorder.init({
173
248
  application: 'my-expo-app',
@@ -176,15 +251,15 @@ SessionRecorder.init({
176
251
  apiKey: 'YOUR_MULTIPLAYER_API_KEY',
177
252
  recordGestures: true, // default is true
178
253
  recordNavigation: true, // default is true
179
- recordScreen: true // default is true
180
- })
254
+ recordScreen: true, // default is true
255
+ });
181
256
 
182
257
  export default function RootLayout() {
183
258
  return (
184
259
  <SessionRecorderProvider>
185
260
  <Stack />
186
261
  </SessionRecorderProvider>
187
- )
262
+ );
188
263
  }
189
264
  ```
190
265
 
@@ -193,11 +268,14 @@ export default function RootLayout() {
193
268
  Here's a complete example showing how to integrate the session recorder in your React Native app:
194
269
 
195
270
  ```javascript
196
- import React, { useEffect, useRef } from 'react'
197
- import { NavigationContainer } from '@react-navigation/native'
198
- import { SafeAreaProvider } from 'react-native-safe-area-context'
199
- import { SessionRecorderProvider, SessionRecorder } from '@multiplayer-app/session-recorder-react-native'
200
- import { AppNavigator } from './navigation/AppNavigator'
271
+ import React, { useEffect, useRef } from 'react';
272
+ import { NavigationContainer } from '@react-navigation/native';
273
+ import { SafeAreaProvider } from 'react-native-safe-area-context';
274
+ import {
275
+ SessionRecorderProvider,
276
+ SessionRecorder,
277
+ } from '@multiplayer-app/session-recorder-react-native';
278
+ import { AppNavigator } from './navigation/AppNavigator';
201
279
 
202
280
  // Initialize session recorder
203
281
  SessionRecorder.init({
@@ -207,20 +285,20 @@ SessionRecorder.init({
207
285
  apiKey: 'YOUR_MULTIPLAYER_API_KEY',
208
286
  recordGestures: true,
209
287
  recordNavigation: true,
210
- recordScreen: false // Enable after adding permissions
211
- })
288
+ recordScreen: false, // Enable after adding permissions
289
+ });
212
290
 
213
291
  export default function App() {
214
- const navigationRef = useRef(null)
292
+ const navigationRef = useRef(null);
215
293
 
216
294
  useEffect(() => {
217
295
  // Set session attributes for better debugging context
218
296
  SessionRecorder.setSessionAttributes({
219
297
  userId: 'user123',
220
298
  userType: 'premium',
221
- appVersion: '1.0.0'
222
- })
223
- }, [])
299
+ appVersion: '1.0.0',
300
+ });
301
+ }, []);
224
302
 
225
303
  return (
226
304
  <SessionRecorderProvider>
@@ -228,14 +306,14 @@ export default function App() {
228
306
  <NavigationContainer
229
307
  ref={navigationRef}
230
308
  onReady={() => {
231
- SessionRecorder.setNavigationRef(navigationRef.current)
309
+ SessionRecorder.setNavigationRef(navigationRef.current);
232
310
  }}
233
311
  >
234
312
  <AppNavigator />
235
313
  </NavigationContainer>
236
314
  </SafeAreaProvider>
237
315
  </SessionRecorderProvider>
238
- )
316
+ );
239
317
  }
240
318
  ```
241
319
 
@@ -244,7 +322,7 @@ export default function App() {
244
322
  For Expo applications, the package automatically detects the Expo environment:
245
323
 
246
324
  ```javascript
247
- import SessionRecorder from '@multiplayer-app/session-recorder-react-native'
325
+ import SessionRecorder from '@multiplayer-app/session-recorder-react-native';
248
326
 
249
327
  SessionRecorder.init({
250
328
  application: 'my-expo-app',
@@ -253,8 +331,8 @@ SessionRecorder.init({
253
331
  apiKey: 'YOUR_MULTIPLAYER_API_KEY',
254
332
  recordGestures: true,
255
333
  recordNavigation: true,
256
- recordScreen: true
257
- })
334
+ recordScreen: true,
335
+ });
258
336
  ```
259
337
 
260
338
  The package will automatically:
@@ -270,26 +348,29 @@ The package will automatically:
270
348
  Expo Router already manages the NavigationContainer. Don't add your own.
271
349
 
272
350
  ```tsx
273
- import { useEffect } from 'react'
274
- import { Stack, useNavigationContainerRef } from 'expo-router'
275
- import { SessionRecorderProvider, SessionRecorder } from '@multiplayer-app/session-recorder-react-native'
351
+ import { useEffect } from 'react';
352
+ import { Stack, useNavigationContainerRef } from 'expo-router';
353
+ import {
354
+ SessionRecorderProvider,
355
+ SessionRecorder,
356
+ } from '@multiplayer-app/session-recorder-react-native';
276
357
 
277
358
  export default function RootLayout() {
278
- const navigationRef = useNavigationContainerRef()
359
+ const navigationRef = useNavigationContainerRef();
279
360
 
280
361
  useEffect(() => {
281
362
  const unsub = navigationRef.addListener?.('state', () => {
282
- SessionRecorder.setNavigationRef(navigationRef)
283
- unsub?.()
284
- })
285
- return unsub
286
- }, [navigationRef])
363
+ SessionRecorder.setNavigationRef(navigationRef);
364
+ unsub?.();
365
+ });
366
+ return unsub;
367
+ }, [navigationRef]);
287
368
 
288
369
  return (
289
370
  <SessionRecorderProvider>
290
371
  <Stack />
291
372
  </SessionRecorderProvider>
292
- )
373
+ );
293
374
  }
294
375
  ```
295
376
 
@@ -298,25 +379,28 @@ export default function RootLayout() {
298
379
  If you own the `NavigationContainer`, set the ref in `onReady`:
299
380
 
300
381
  ```tsx
301
- import { NavigationContainer } from '@react-navigation/native'
302
- import { useRef } from 'react'
303
- import { SessionRecorderProvider, SessionRecorder } from '@multiplayer-app/session-recorder-react-native'
382
+ import { NavigationContainer } from '@react-navigation/native';
383
+ import { useRef } from 'react';
384
+ import {
385
+ SessionRecorderProvider,
386
+ SessionRecorder,
387
+ } from '@multiplayer-app/session-recorder-react-native';
304
388
 
305
389
  export default function App() {
306
- const navigationRef = useRef<any>(null)
390
+ const navigationRef = useRef<any>(null);
307
391
 
308
392
  return (
309
393
  <SessionRecorderProvider>
310
394
  <NavigationContainer
311
395
  ref={navigationRef}
312
396
  onReady={() => {
313
- SessionRecorder.setNavigationRef(navigationRef.current)
397
+ SessionRecorder.setNavigationRef(navigationRef.current);
314
398
  }}
315
399
  >
316
400
  {/* Your navigation stack */}
317
401
  </NavigationContainer>
318
402
  </SessionRecorderProvider>
319
- )
403
+ );
320
404
  }
321
405
  ```
322
406
 
@@ -324,26 +408,26 @@ export default function App() {
324
408
 
325
409
  ```javascript
326
410
  // Start a new recording session
327
- SessionRecorder.start()
411
+ SessionRecorder.start();
328
412
 
329
413
  // Pause current recording
330
- SessionRecorder.pause()
414
+ SessionRecorder.pause();
331
415
 
332
416
  // Resume paused recording
333
- SessionRecorder.resume()
417
+ SessionRecorder.resume();
334
418
 
335
419
  // Stop recording with optional reason
336
- SessionRecorder.stop('Session completed')
420
+ SessionRecorder.stop('Session completed');
337
421
 
338
422
  // Save continuous recording (for continuous mode)
339
- SessionRecorder.save()
423
+ SessionRecorder.save();
340
424
 
341
425
  // Set session attributes for better context
342
426
  SessionRecorder.setSessionAttributes({
343
427
  userId: 'user123',
344
428
  feature: 'checkout',
345
- version: '2.1.0'
346
- })
429
+ version: '2.1.0',
430
+ });
347
431
  ```
348
432
 
349
433
  ## Session Provider & Hooks
@@ -363,10 +447,10 @@ SessionRecorder.init({
363
447
  widget: {
364
448
  enabled: true,
365
449
  button: {
366
- visible: false // Hide the floating button
367
- }
368
- }
369
- })
450
+ visible: false, // Hide the floating button
451
+ },
452
+ },
453
+ });
370
454
  ```
371
455
 
372
456
  ### Programmatic Widget Control
@@ -374,56 +458,67 @@ SessionRecorder.init({
374
458
  Use the `useSessionRecorder` hook to control the widget modal programmatically:
375
459
 
376
460
  ```javascript
377
- import React from 'react'
378
- import { View, Button } from 'react-native'
379
- import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native'
461
+ import React from 'react';
462
+ import { View, Button } from 'react-native';
463
+ import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native';
380
464
 
381
465
  function MyComponent() {
382
- const { openWidgetModal, closeWidgetModal } = useSessionRecorder()
466
+ const { openWidgetModal, closeWidgetModal } = useSessionRecorder();
383
467
 
384
468
  return (
385
469
  <View>
386
- <Button title='Open Session Recorder' onPress={openWidgetModal} />
387
- <Button title='Close Session Recorder' onPress={closeWidgetModal} />
470
+ <Button title="Open Session Recorder" onPress={openWidgetModal} />
471
+ <Button title="Close Session Recorder" onPress={closeWidgetModal} />
388
472
  </View>
389
- )
473
+ );
390
474
  }
391
475
  ```
392
476
 
393
477
  ### Session Control with Hooks
394
478
 
395
479
  ```javascript
396
- import React from 'react'
397
- import { View, Button } from 'react-native'
398
- import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native'
480
+ import React from 'react';
481
+ import { View, Button } from 'react-native';
482
+ import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native';
399
483
 
400
484
  function SessionControls() {
401
- const { startSession, stopSession, pauseSession, resumeSession, saveSession } = useSessionRecorder()
485
+ const {
486
+ startSession,
487
+ stopSession,
488
+ pauseSession,
489
+ resumeSession,
490
+ saveSession,
491
+ } = useSessionRecorder();
402
492
 
403
493
  return (
404
494
  <View>
405
- <Button title='Start Session' onPress={() => startSession()} />
406
- <Button title='Pause Session' onPress={() => pauseSession()} />
407
- <Button title='Resume Session' onPress={() => resumeSession()} />
408
- <Button title='Stop Session' onPress={() => stopSession('User completed')} />
409
- <Button title='Save Session' onPress={() => saveSession()} />
495
+ <Button title="Start Session" onPress={() => startSession()} />
496
+ <Button title="Pause Session" onPress={() => pauseSession()} />
497
+ <Button title="Resume Session" onPress={() => resumeSession()} />
498
+ <Button
499
+ title="Stop Session"
500
+ onPress={() => stopSession('User completed')}
501
+ />
502
+ <Button title="Save Session" onPress={() => saveSession()} />
410
503
  </View>
411
- )
504
+ );
412
505
  }
413
506
  ```
414
507
 
415
508
  ### Session State with Hooks
416
509
 
417
510
  ```javascript
418
- import React from 'react'
419
- import { View, Text } from 'react-native'
420
- import { useSessionRecorderStore } from '@multiplayer-app/session-recorder-react-native'
511
+ import React from 'react';
512
+ import { View, Text } from 'react-native';
513
+ import { useSessionRecorderStore } from '@multiplayer-app/session-recorder-react-native';
421
514
 
422
515
  function SessionStatus() {
423
- const sessionType = useSessionRecorderStore((s) => s.sessionType)
424
- const isWidgetModalVisible = useSessionRecorderStore((s) => s.isWidgetModalVisible)
425
- const sessionState = useSessionRecorderStore((s) => s.sessionState)
426
- const isOnline = useSessionRecorderStore((s) => s.isOnline)
516
+ const sessionType = useSessionRecorderStore((s) => s.sessionType);
517
+ const isWidgetModalVisible = useSessionRecorderStore(
518
+ (s) => s.isWidgetModalVisible
519
+ );
520
+ const sessionState = useSessionRecorderStore((s) => s.sessionState);
521
+ const isOnline = useSessionRecorderStore((s) => s.isOnline);
427
522
 
428
523
  return (
429
524
  <View>
@@ -432,56 +527,58 @@ function SessionStatus() {
432
527
  <Text>Widget Visible: {isWidgetModalVisible ? 'Yes' : 'No'}</Text>
433
528
  <Text>Online: {isOnline ? 'Yes' : 'No'}</Text>
434
529
  </View>
435
- )
530
+ );
436
531
  }
437
532
  ```
438
533
 
439
534
  ### Complete Example with Custom UI
440
535
 
441
536
  ```javascript
442
- import React, { useEffect } from 'react'
443
- import { View, Button, Text, Alert } from 'react-native'
537
+ import React, { useEffect } from 'react';
538
+ import { View, Button, Text, Alert } from 'react-native';
444
539
  import {
445
540
  SessionRecorderProvider,
446
541
  useSessionRecorder,
447
- useSessionRecorderStore
448
- } from '@multiplayer-app/session-recorder-react-native'
542
+ useSessionRecorderStore,
543
+ } from '@multiplayer-app/session-recorder-react-native';
449
544
 
450
545
  function SessionRecorderUI() {
451
- const { startSession, stopSession, openWidgetModal } = useSessionRecorder()
452
- const { sessionState, isWidgetModalVisible } = useSessionRecorderStore((state) => ({
453
- sessionState: state.sessionState,
454
- isWidgetModalVisible: state.isWidgetModalVisible
455
- }))
546
+ const { startSession, stopSession, openWidgetModal } = useSessionRecorder();
547
+ const { sessionState, isWidgetModalVisible } = useSessionRecorderStore(
548
+ (state) => ({
549
+ sessionState: state.sessionState,
550
+ isWidgetModalVisible: state.isWidgetModalVisible,
551
+ })
552
+ );
456
553
 
457
554
  const handleStartRecording = async () => {
458
555
  try {
459
- await startSession()
460
- Alert.alert('Success', 'Session recording started')
556
+ await startSession();
557
+ Alert.alert('Success', 'Session recording started');
461
558
  } catch (error) {
462
- Alert.alert('Error', 'Failed to start recording')
559
+ Alert.alert('Error', 'Failed to start recording');
463
560
  }
464
- }
561
+ };
465
562
 
466
563
  const handleStopRecording = async () => {
467
564
  try {
468
- await stopSession('User manually stopped')
469
- Alert.alert('Success', 'Session recording stopped')
565
+ await stopSession('User manually stopped');
566
+ Alert.alert('Success', 'Session recording stopped');
470
567
  } catch (error) {
471
- Alert.alert('Error', 'Failed to stop recording')
568
+ Alert.alert('Error', 'Failed to stop recording');
472
569
  }
473
- }
570
+ };
474
571
 
475
572
  return (
476
573
  <View style={{ padding: 20 }}>
477
574
  <Text>Session State: {sessionState}</Text>
478
575
  <Text>Widget Modal: {isWidgetModalVisible ? 'Open' : 'Closed'}</Text>
479
576
 
480
- <Button title='Start Recording' onPress={handleStartRecording} />
481
- <Button title='Stop Recording' onPress={handleStopRecording} />
482
- <Button title='Open Widget' onPress={openWidgetModal} />
577
+ <Button title="Start Recording" onPress={handleStartRecording} />
578
+ <Button title="Stop Recording" onPress={handleStopRecording} />
579
+ <Button title="Open Widget" onPress={openWidgetModal} />
483
580
  </View>
484
- )
581
+ );
485
582
  }
486
583
 
487
584
  export default function App() {
@@ -489,7 +586,7 @@ export default function App() {
489
586
  <SessionRecorderProvider>
490
587
  <SessionRecorderUI />
491
588
  </SessionRecorderProvider>
492
- )
589
+ );
493
590
  }
494
591
  ```
495
592
 
@@ -537,7 +634,11 @@ To get the most useful target information in your traces, follow these practices
537
634
  #### 1. Use Accessibility Labels
538
635
 
539
636
  ```jsx
540
- <TouchableOpacity accessibilityLabel='Submit user registration form' accessibilityRole='button' onPress={handleSubmit}>
637
+ <TouchableOpacity
638
+ accessibilityLabel="Submit user registration form"
639
+ accessibilityRole="button"
640
+ onPress={handleSubmit}
641
+ >
541
642
  <Text>Submit</Text>
542
643
  </TouchableOpacity>
543
644
  ```
@@ -545,7 +646,11 @@ To get the most useful target information in your traces, follow these practices
545
646
  #### 2. Add Test IDs for Testing Context
546
647
 
547
648
  ```jsx
548
- <TouchableOpacity testID='registration-submit-btn' accessibilityLabel='Submit registration' onPress={handleSubmit}>
649
+ <TouchableOpacity
650
+ testID="registration-submit-btn"
651
+ accessibilityLabel="Submit registration"
652
+ onPress={handleSubmit}
653
+ >
549
654
  <Text>Submit</Text>
550
655
  </TouchableOpacity>
551
656
  ```
@@ -663,9 +768,12 @@ SessionRecorder.init({
663
768
  // NOTE: if frontend domain doesn't match to backend one, set backend domain to `propagateTraceHeaderCorsUrls` parameter
664
769
  propagateTraceHeaderCorsUrls: [
665
770
  new RegExp('https://your.backend.api.domain', 'i'), // can be regex or string
666
- new RegExp('https://another.backend.api.domain', 'i')
771
+ new RegExp('https://another.backend.api.domain', 'i'),
772
+ ],
773
+ ignoreUrls: [
774
+ /https:\/\/analytics\.example\.com/,
775
+ /https:\/\/crashlytics\.com/,
667
776
  ],
668
- ignoreUrls: [/https:\/\/analytics\.example\.com/, /https:\/\/crashlytics\.com/],
669
777
  captureBody: true,
670
778
  captureHeaders: true,
671
779
  maxCapturingHttpPayloadSize: 100000,
@@ -677,7 +785,7 @@ SessionRecorder.init({
677
785
  maskBodyFieldsList: ['password', 'token', 'secret', 'creditCard'],
678
786
  maskTextInputs: true,
679
787
  maskImages: false,
680
- maskButtons: false
788
+ maskButtons: false,
681
789
  },
682
790
 
683
791
  // Session widget configuration
@@ -685,19 +793,22 @@ SessionRecorder.init({
685
793
  enabled: true,
686
794
  button: {
687
795
  visible: true,
688
- placement: 'bottomRight' // or 'bottomLeft'
689
- }
796
+ placement: 'bottomRight', // or 'bottomLeft'
797
+ },
690
798
  },
691
799
 
692
800
  // Continuous recording
693
- showContinuousRecording: true
694
- })
801
+ showContinuousRecording: true,
802
+ });
695
803
  ```
696
804
 
697
805
  ### Environment-Specific Configuration
698
806
 
699
807
  ```javascript
700
- import { SessionRecorder, LogLevel } from '@multiplayer-app/session-recorder-react-native'
808
+ import {
809
+ SessionRecorder,
810
+ LogLevel,
811
+ } from '@multiplayer-app/session-recorder-react-native';
701
812
 
702
813
  const config = {
703
814
  application: 'my-app',
@@ -708,12 +819,12 @@ const config = {
708
819
  ...(__DEV__ && {
709
820
  logger: {
710
821
  enabled: true,
711
- level: LogLevel.DEBUG
712
- }
713
- })
714
- }
822
+ level: LogLevel.DEBUG,
823
+ },
824
+ }),
825
+ };
715
826
 
716
- SessionRecorder.init(config)
827
+ SessionRecorder.init(config);
717
828
  ```
718
829
 
719
830
  ## Troubleshooting
@@ -757,7 +868,27 @@ SessionRecorder.init(config)
757
868
  - Ensure `expo-constants` is installed: `npx expo install expo-constants`
758
869
  - Check that you're using the correct Expo SDK version
759
870
 
760
- #### 6. Build Issues
871
+ #### 6. TurboModule Not Found (Expo Go)
872
+
873
+ If you see this error in Expo Go:
874
+
875
+ ```
876
+ TurboModuleRegistry.getEnforcing(...): 'SessionRecorderNative' could not be found
877
+ ```
878
+
879
+ **Solution**: Switch to development builds instead of Expo Go:
880
+
881
+ ```bash
882
+ # For iOS
883
+ npx expo run:ios
884
+
885
+ # For Android
886
+ npx expo run:android
887
+ ```
888
+
889
+ Expo Go has limitations with custom native modules. Development builds include your custom native code and will resolve this issue.
890
+
891
+ #### 7. Build Issues
761
892
 
762
893
  - **iOS**: Run `cd ios && pod install` after installing dependencies
763
894
  - **Android**: Run `cd android && ./gradlew clean`
@@ -768,15 +899,18 @@ SessionRecorder.init(config)
768
899
  Enable debug logging to troubleshoot issues:
769
900
 
770
901
  ```javascript
771
- import { SessionRecorder, LogLevel } from '@multiplayer-app/session-recorder-react-native'
902
+ import {
903
+ SessionRecorder,
904
+ LogLevel,
905
+ } from '@multiplayer-app/session-recorder-react-native';
772
906
 
773
907
  SessionRecorder.init({
774
908
  // ... other config
775
909
  logger: {
776
910
  enabled: true,
777
- level: LogLevel.DEBUG
778
- }
779
- })
911
+ level: LogLevel.DEBUG,
912
+ },
913
+ });
780
914
  ```
781
915
 
782
916
  ## Examples
@@ -814,38 +948,44 @@ Both examples include:
814
948
  ```typescript
815
949
  interface SessionRecorderOptions {
816
950
  // Required
817
- apiKey: string
818
- application: string
819
- version: string
820
- environment: string
951
+ apiKey: string;
952
+ application: string;
953
+ version: string;
954
+ environment: string;
821
955
 
822
956
  // Optional
823
- exporterEndpoint?: string
824
- apiBaseUrl?: string
825
- recordGestures?: boolean
826
- recordNavigation?: boolean
827
- recordScreen?: boolean
828
- sampleTraceRatio?: number
829
- captureBody?: boolean
830
- captureHeaders?: boolean
831
- maxCapturingHttpPayloadSize?: number
832
- masking?: MaskingOptions
833
- ignoreUrls?: Array<string | RegExp>
834
- propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls
835
- showContinuousRecording?: boolean
836
- schemifyDocSpanPayload?: boolean
837
- widget?: WidgetConfig
957
+ exporterEndpoint?: string;
958
+ apiBaseUrl?: string;
959
+ recordGestures?: boolean;
960
+ recordNavigation?: boolean;
961
+ recordScreen?: boolean;
962
+ sampleTraceRatio?: number;
963
+ captureBody?: boolean;
964
+ captureHeaders?: boolean;
965
+ maxCapturingHttpPayloadSize?: number;
966
+ masking?: MaskingOptions;
967
+ ignoreUrls?: Array<string | RegExp>;
968
+ propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls;
969
+ showContinuousRecording?: boolean;
970
+ schemifyDocSpanPayload?: boolean;
971
+ widget?: WidgetConfig;
838
972
  logger?: {
839
- level?: number
840
- enabled?: boolean
841
- }
973
+ level?: number;
974
+ enabled?: boolean;
975
+ };
842
976
  }
843
977
  ```
844
978
 
845
979
  ## Contributing
846
980
 
847
- Please read our contributing guidelines before submitting pull requests.
981
+ - [Development workflow](CONTRIBUTING.md#development-workflow)
982
+ - [Sending a pull request](CONTRIBUTING.md#sending-a-pull-request)
983
+ - [Code of conduct](CODE_OF_CONDUCT.md)
848
984
 
849
985
  ## License
850
986
 
851
- MIT License - see LICENSE file for details.
987
+ MIT
988
+
989
+ ---
990
+
991
+ Made with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)