@multiplayer-app/session-recorder-react-native 1.0.0 → 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 (463) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +216 -155
  3. package/SessionRecorderNative.podspec +35 -14
  4. package/android/build.gradle +65 -22
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/java/com/sessionrecordernative/SessionRecorderNativeConfig.kt +52 -0
  8. package/android/src/main/java/com/sessionrecordernative/SessionRecorderNativeModule.kt +861 -0
  9. package/android/src/main/java/com/sessionrecordernative/SessionRecorderNativePackage.kt +33 -0
  10. package/android/src/main/java/com/sessionrecordernative/SessionRecorderNativeSpec.kt +79 -0
  11. package/android/src/main/java/com/sessionrecordernative/model/TargetInfo.kt +9 -0
  12. package/android/src/main/java/com/sessionrecordernative/util/ViewUtils.kt +72 -0
  13. package/ios/GestureTargetFinder.swift +50 -0
  14. package/ios/SessionRecorderNative-Bridging-Header.h +2 -0
  15. package/ios/{GestureRecorderNative.m → SessionRecorderNative.mm} +17 -6
  16. package/ios/SessionRecorderNative.swift +256 -4
  17. package/lib/module/SessionRecorderNativeSpec.js +5 -0
  18. package/lib/module/SessionRecorderNativeSpec.js.map +1 -0
  19. package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js +23 -0
  20. package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js.map +1 -0
  21. package/lib/module/components/ScreenRecorderView/index.js +4 -0
  22. package/lib/module/components/ScreenRecorderView/index.js.map +1 -0
  23. package/lib/module/components/SessionRecorderWidget/ErrorBanner.js +64 -0
  24. package/lib/module/components/SessionRecorderWidget/ErrorBanner.js.map +1 -0
  25. package/lib/module/components/SessionRecorderWidget/FinalPopover.js +74 -0
  26. package/lib/module/components/SessionRecorderWidget/FinalPopover.js.map +1 -0
  27. package/lib/module/components/SessionRecorderWidget/FloatingButton.js +191 -0
  28. package/lib/module/components/SessionRecorderWidget/FloatingButton.js.map +1 -0
  29. package/lib/module/components/SessionRecorderWidget/InitialPopover.js +138 -0
  30. package/lib/module/components/SessionRecorderWidget/InitialPopover.js.map +1 -0
  31. package/lib/module/components/SessionRecorderWidget/ModalContainer.js +177 -0
  32. package/lib/module/components/SessionRecorderWidget/ModalContainer.js.map +1 -0
  33. package/lib/module/components/SessionRecorderWidget/ModalHeader.js +27 -0
  34. package/lib/module/components/SessionRecorderWidget/ModalHeader.js.map +1 -0
  35. package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js +133 -0
  36. package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js.map +1 -0
  37. package/lib/module/components/SessionRecorderWidget/icons.js +93 -0
  38. package/lib/module/components/SessionRecorderWidget/icons.js.map +1 -0
  39. package/lib/module/components/SessionRecorderWidget/index.js +5 -0
  40. package/lib/module/components/SessionRecorderWidget/index.js.map +1 -0
  41. package/lib/module/components/SessionRecorderWidget/styles.js +173 -0
  42. package/lib/module/components/SessionRecorderWidget/styles.js.map +1 -0
  43. package/lib/module/components/index.js +5 -0
  44. package/lib/module/components/index.js.map +1 -0
  45. package/lib/module/config/constants.js +42 -0
  46. package/lib/module/config/constants.js.map +1 -0
  47. package/lib/module/config/defaults.js +81 -0
  48. package/lib/module/config/defaults.js.map +1 -0
  49. package/lib/module/config/index.js +9 -0
  50. package/lib/module/config/index.js.map +1 -0
  51. package/lib/module/config/masking.js +35 -0
  52. package/lib/module/config/masking.js.map +1 -0
  53. package/lib/module/config/session-recorder.js +44 -0
  54. package/lib/module/config/session-recorder.js.map +1 -0
  55. package/lib/module/config/validators.js +28 -0
  56. package/lib/module/config/validators.js.map +1 -0
  57. package/lib/module/config/widget.js +35 -0
  58. package/lib/module/config/widget.js.map +1 -0
  59. package/lib/module/context/SessionRecorderContext.js +93 -0
  60. package/lib/module/context/SessionRecorderContext.js.map +1 -0
  61. package/lib/module/context/SessionRecorderStore.js +12 -0
  62. package/lib/module/context/SessionRecorderStore.js.map +1 -0
  63. package/lib/module/context/useSessionRecorderStore.js +20 -0
  64. package/lib/module/context/useSessionRecorderStore.js.map +1 -0
  65. package/lib/module/context/useStoreSelector.js +27 -0
  66. package/lib/module/context/useStoreSelector.js.map +1 -0
  67. package/lib/module/index.js +16 -0
  68. package/lib/module/index.js.map +1 -0
  69. package/lib/module/native/SessionRecorderNative.js +79 -0
  70. package/lib/module/native/SessionRecorderNative.js.map +1 -0
  71. package/lib/module/native/index.js +4 -0
  72. package/lib/module/native/index.js.map +1 -0
  73. package/lib/module/otel/helpers.js +218 -0
  74. package/lib/module/otel/helpers.js.map +1 -0
  75. package/lib/module/otel/index.js +95 -0
  76. package/lib/module/otel/index.js.map +1 -0
  77. package/lib/module/otel/instrumentations/index.js +102 -0
  78. package/lib/module/otel/instrumentations/index.js.map +1 -0
  79. package/lib/module/package.json +1 -0
  80. package/lib/module/patch/index.js +4 -0
  81. package/lib/module/patch/index.js.map +1 -0
  82. package/lib/module/patch/xhr.js +116 -0
  83. package/lib/module/patch/xhr.js.map +1 -0
  84. package/lib/module/recorder/eventExporter.js +130 -0
  85. package/lib/module/recorder/eventExporter.js.map +1 -0
  86. package/lib/module/recorder/gestureRecorder.js +641 -0
  87. package/lib/module/recorder/gestureRecorder.js.map +1 -0
  88. package/lib/module/recorder/index.js +168 -0
  89. package/lib/module/recorder/index.js.map +1 -0
  90. package/lib/module/recorder/navigationTracker.js +228 -0
  91. package/lib/module/recorder/navigationTracker.js.map +1 -0
  92. package/lib/module/recorder/screenRecorder.js +495 -0
  93. package/lib/module/recorder/screenRecorder.js.map +1 -0
  94. package/lib/module/services/api.service.js +149 -0
  95. package/lib/module/services/api.service.js.map +1 -0
  96. package/lib/module/services/network.service.js +178 -0
  97. package/lib/module/services/network.service.js.map +1 -0
  98. package/lib/module/services/screenMaskingService.js +107 -0
  99. package/lib/module/services/screenMaskingService.js.map +1 -0
  100. package/lib/module/services/storage.service.js +179 -0
  101. package/lib/module/services/storage.service.js.map +1 -0
  102. package/lib/module/session-recorder.js +541 -0
  103. package/lib/module/session-recorder.js.map +1 -0
  104. package/lib/module/types/configs.js +4 -0
  105. package/lib/module/types/configs.js.map +1 -0
  106. package/lib/module/types/expo-constants.d.js +2 -0
  107. package/lib/module/types/expo-constants.d.js.map +1 -0
  108. package/lib/module/types/index.js +11 -0
  109. package/lib/module/types/index.js.map +1 -0
  110. package/lib/module/types/session-recorder.js +68 -0
  111. package/lib/module/types/session-recorder.js.map +1 -0
  112. package/lib/module/types/session.js +9 -0
  113. package/lib/module/types/session.js.map +1 -0
  114. package/lib/module/utils/app-metadata.js +28 -0
  115. package/lib/module/utils/app-metadata.js.map +1 -0
  116. package/lib/module/utils/constants.optional.expo.js +6 -0
  117. package/lib/module/utils/constants.optional.expo.js.map +1 -0
  118. package/lib/module/utils/constants.optional.js +8 -0
  119. package/lib/module/utils/constants.optional.js.map +1 -0
  120. package/lib/module/utils/createStore.js +27 -0
  121. package/lib/module/utils/createStore.js.map +1 -0
  122. package/lib/module/utils/index.js +11 -0
  123. package/lib/module/utils/index.js.map +1 -0
  124. package/lib/module/utils/logger.js +185 -0
  125. package/lib/module/utils/logger.js.map +1 -0
  126. package/lib/module/utils/platform.js +340 -0
  127. package/lib/module/utils/platform.js.map +1 -0
  128. package/lib/module/utils/request-utils.js +58 -0
  129. package/lib/module/utils/request-utils.js.map +1 -0
  130. package/lib/module/utils/rrweb-events.js +276 -0
  131. package/lib/module/utils/rrweb-events.js.map +1 -0
  132. package/lib/module/utils/session.js +21 -0
  133. package/lib/module/utils/session.js.map +1 -0
  134. package/lib/module/utils/shallowEqual.js +17 -0
  135. package/lib/module/utils/shallowEqual.js.map +1 -0
  136. package/lib/module/utils/time.js +17 -0
  137. package/lib/module/utils/time.js.map +1 -0
  138. package/lib/module/utils/type-utils.js +69 -0
  139. package/lib/module/utils/type-utils.js.map +1 -0
  140. package/lib/module/version.js +4 -0
  141. package/lib/module/version.js.map +1 -0
  142. package/lib/typescript/package.json +1 -0
  143. package/{dist/native/SessionRecorderNative.d.ts → lib/typescript/src/SessionRecorderNativeSpec.d.ts} +23 -15
  144. package/lib/typescript/src/SessionRecorderNativeSpec.d.ts.map +1 -0
  145. package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts +6 -0
  146. package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts.map +1 -0
  147. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts +2 -0
  148. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts.map +1 -0
  149. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ErrorBanner.d.ts +1 -0
  150. package/lib/typescript/src/components/SessionRecorderWidget/ErrorBanner.d.ts.map +1 -0
  151. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FinalPopover.d.ts +2 -1
  152. package/lib/typescript/src/components/SessionRecorderWidget/FinalPopover.d.ts.map +1 -0
  153. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FloatingButton.d.ts +1 -0
  154. package/lib/typescript/src/components/SessionRecorderWidget/FloatingButton.d.ts.map +1 -0
  155. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/InitialPopover.d.ts +2 -1
  156. package/lib/typescript/src/components/SessionRecorderWidget/InitialPopover.d.ts.map +1 -0
  157. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalContainer.d.ts +1 -0
  158. package/lib/typescript/src/components/SessionRecorderWidget/ModalContainer.d.ts.map +1 -0
  159. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalHeader.d.ts +1 -0
  160. package/lib/typescript/src/components/SessionRecorderWidget/ModalHeader.d.ts.map +1 -0
  161. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/SessionRecorderWidget.d.ts +1 -0
  162. package/lib/typescript/src/components/SessionRecorderWidget/SessionRecorderWidget.d.ts.map +1 -0
  163. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/icons.d.ts +1 -0
  164. package/lib/typescript/src/components/SessionRecorderWidget/icons.d.ts.map +1 -0
  165. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts +3 -0
  166. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts.map +1 -0
  167. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/styles.d.ts +4 -3
  168. package/lib/typescript/src/components/SessionRecorderWidget/styles.d.ts.map +1 -0
  169. package/lib/typescript/src/components/index.d.ts +3 -0
  170. package/lib/typescript/src/components/index.d.ts.map +1 -0
  171. package/{dist → lib/typescript/src}/config/constants.d.ts +1 -0
  172. package/lib/typescript/src/config/constants.d.ts.map +1 -0
  173. package/{dist → lib/typescript/src}/config/defaults.d.ts +2 -1
  174. package/lib/typescript/src/config/defaults.d.ts.map +1 -0
  175. package/{dist → lib/typescript/src}/config/index.d.ts +1 -0
  176. package/lib/typescript/src/config/index.d.ts.map +1 -0
  177. package/lib/typescript/src/config/masking.d.ts +3 -0
  178. package/lib/typescript/src/config/masking.d.ts.map +1 -0
  179. package/lib/typescript/src/config/session-recorder.d.ts +3 -0
  180. package/lib/typescript/src/config/session-recorder.d.ts.map +1 -0
  181. package/{dist → lib/typescript/src}/config/validators.d.ts +1 -0
  182. package/lib/typescript/src/config/validators.d.ts.map +1 -0
  183. package/{dist → lib/typescript/src}/config/widget.d.ts +2 -1
  184. package/lib/typescript/src/config/widget.d.ts.map +1 -0
  185. package/{dist → lib/typescript/src}/context/SessionRecorderContext.d.ts +3 -2
  186. package/lib/typescript/src/context/SessionRecorderContext.d.ts.map +1 -0
  187. package/{dist → lib/typescript/src}/context/SessionRecorderStore.d.ts +2 -1
  188. package/lib/typescript/src/context/SessionRecorderStore.d.ts.map +1 -0
  189. package/{dist → lib/typescript/src}/context/useSessionRecorderStore.d.ts +4 -3
  190. package/lib/typescript/src/context/useSessionRecorderStore.d.ts.map +1 -0
  191. package/{dist → lib/typescript/src}/context/useStoreSelector.d.ts +2 -1
  192. package/lib/typescript/src/context/useStoreSelector.d.ts.map +1 -0
  193. package/{dist → lib/typescript/src}/index.d.ts +2 -0
  194. package/lib/typescript/src/index.d.ts.map +1 -0
  195. package/lib/typescript/src/native/SessionRecorderNative.d.ts +27 -0
  196. package/lib/typescript/src/native/SessionRecorderNative.d.ts.map +1 -0
  197. package/lib/typescript/src/native/index.d.ts +2 -0
  198. package/lib/typescript/src/native/index.d.ts.map +1 -0
  199. package/{dist → lib/typescript/src}/otel/helpers.d.ts +3 -2
  200. package/lib/typescript/src/otel/helpers.d.ts.map +1 -0
  201. package/{dist → lib/typescript/src}/otel/index.d.ts +2 -2
  202. package/lib/typescript/src/otel/index.d.ts.map +1 -0
  203. package/{dist → lib/typescript/src}/otel/instrumentations/index.d.ts +2 -1
  204. package/lib/typescript/src/otel/instrumentations/index.d.ts.map +1 -0
  205. package/lib/typescript/src/patch/index.d.ts +2 -0
  206. package/lib/typescript/src/patch/index.d.ts.map +1 -0
  207. package/{dist → lib/typescript/src}/patch/xhr.d.ts +1 -0
  208. package/lib/typescript/src/patch/xhr.d.ts.map +1 -0
  209. package/{dist → lib/typescript/src}/recorder/eventExporter.d.ts +2 -1
  210. package/lib/typescript/src/recorder/eventExporter.d.ts.map +1 -0
  211. package/{dist → lib/typescript/src}/recorder/gestureRecorder.d.ts +3 -2
  212. package/lib/typescript/src/recorder/gestureRecorder.d.ts.map +1 -0
  213. package/{dist → lib/typescript/src}/recorder/index.d.ts +3 -2
  214. package/lib/typescript/src/recorder/index.d.ts.map +1 -0
  215. package/{dist → lib/typescript/src}/recorder/navigationTracker.d.ts +2 -1
  216. package/lib/typescript/src/recorder/navigationTracker.d.ts.map +1 -0
  217. package/{dist → lib/typescript/src}/recorder/screenRecorder.d.ts +4 -4
  218. package/lib/typescript/src/recorder/screenRecorder.d.ts.map +1 -0
  219. package/{dist → lib/typescript/src}/services/api.service.d.ts +2 -1
  220. package/lib/typescript/src/services/api.service.d.ts.map +1 -0
  221. package/{dist → lib/typescript/src}/services/network.service.d.ts +1 -0
  222. package/lib/typescript/src/services/network.service.d.ts.map +1 -0
  223. package/{dist → lib/typescript/src}/services/screenMaskingService.d.ts +2 -1
  224. package/lib/typescript/src/services/screenMaskingService.d.ts.map +1 -0
  225. package/{dist → lib/typescript/src}/services/storage.service.d.ts +2 -1
  226. package/lib/typescript/src/services/storage.service.d.ts.map +1 -0
  227. package/{dist → lib/typescript/src}/session-recorder.d.ts +3 -2
  228. package/lib/typescript/src/session-recorder.d.ts.map +1 -0
  229. package/{dist → lib/typescript/src}/types/configs.d.ts +3 -2
  230. package/lib/typescript/src/types/configs.d.ts.map +1 -0
  231. package/{dist → lib/typescript/src}/types/index.d.ts +1 -0
  232. package/lib/typescript/src/types/index.d.ts.map +1 -0
  233. package/{dist → lib/typescript/src}/types/session-recorder.d.ts +7 -6
  234. package/lib/typescript/src/types/session-recorder.d.ts.map +1 -0
  235. package/{dist → lib/typescript/src}/types/session.d.ts +1 -0
  236. package/lib/typescript/src/types/session.d.ts.map +1 -0
  237. package/{dist → lib/typescript/src}/utils/app-metadata.d.ts +1 -0
  238. package/lib/typescript/src/utils/app-metadata.d.ts.map +1 -0
  239. package/{dist → lib/typescript/src}/utils/constants.optional.d.ts +1 -0
  240. package/lib/typescript/src/utils/constants.optional.d.ts.map +1 -0
  241. package/{dist → lib/typescript/src}/utils/constants.optional.expo.d.ts +1 -0
  242. package/lib/typescript/src/utils/constants.optional.expo.d.ts.map +1 -0
  243. package/{dist → lib/typescript/src}/utils/createStore.d.ts +1 -0
  244. package/lib/typescript/src/utils/createStore.d.ts.map +1 -0
  245. package/lib/typescript/src/utils/index.d.ts +8 -0
  246. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  247. package/{dist → lib/typescript/src}/utils/logger.d.ts +2 -1
  248. package/lib/typescript/src/utils/logger.d.ts.map +1 -0
  249. package/{dist → lib/typescript/src}/utils/platform.d.ts +2 -1
  250. package/lib/typescript/src/utils/platform.d.ts.map +1 -0
  251. package/{dist → lib/typescript/src}/utils/request-utils.d.ts +1 -0
  252. package/lib/typescript/src/utils/request-utils.d.ts.map +1 -0
  253. package/{dist → lib/typescript/src}/utils/rrweb-events.d.ts +2 -1
  254. package/lib/typescript/src/utils/rrweb-events.d.ts.map +1 -0
  255. package/{dist → lib/typescript/src}/utils/session.d.ts +1 -0
  256. package/lib/typescript/src/utils/session.d.ts.map +1 -0
  257. package/{dist → lib/typescript/src}/utils/shallowEqual.d.ts +1 -0
  258. package/lib/typescript/src/utils/shallowEqual.d.ts.map +1 -0
  259. package/{dist → lib/typescript/src}/utils/time.d.ts +1 -0
  260. package/lib/typescript/src/utils/time.d.ts.map +1 -0
  261. package/{dist → lib/typescript/src}/utils/type-utils.d.ts +1 -0
  262. package/lib/typescript/src/utils/type-utils.d.ts.map +1 -0
  263. package/lib/typescript/src/version.d.ts +2 -0
  264. package/lib/typescript/src/version.d.ts.map +1 -0
  265. package/package.json +157 -39
  266. package/react-native.config.js +8 -6
  267. package/src/SessionRecorderNativeSpec.ts +52 -0
  268. package/src/components/ScreenRecorderView/ScreenRecorderView.tsx +20 -0
  269. package/src/components/ScreenRecorderView/index.ts +1 -0
  270. package/src/components/SessionRecorderWidget/ErrorBanner.tsx +58 -0
  271. package/src/components/SessionRecorderWidget/FinalPopover.tsx +96 -0
  272. package/src/components/SessionRecorderWidget/FloatingButton.tsx +176 -0
  273. package/src/components/SessionRecorderWidget/InitialPopover.tsx +167 -0
  274. package/src/components/SessionRecorderWidget/ModalContainer.tsx +189 -0
  275. package/src/components/SessionRecorderWidget/ModalHeader.tsx +26 -0
  276. package/src/components/SessionRecorderWidget/SessionRecorderWidget.tsx +150 -0
  277. package/src/components/SessionRecorderWidget/icons.tsx +80 -0
  278. package/src/components/SessionRecorderWidget/index.ts +3 -0
  279. package/src/components/SessionRecorderWidget/styles.ts +168 -0
  280. package/src/config/constants.ts +67 -0
  281. package/src/config/defaults.ts +105 -0
  282. package/src/config/index.ts +6 -0
  283. package/src/config/masking.ts +60 -0
  284. package/src/config/session-recorder.ts +87 -0
  285. package/src/config/validators.ts +54 -0
  286. package/src/config/widget.ts +47 -0
  287. package/src/context/SessionRecorderContext.tsx +138 -0
  288. package/src/context/SessionRecorderStore.ts +22 -0
  289. package/src/context/useSessionRecorderStore.ts +34 -0
  290. package/src/context/useStoreSelector.ts +36 -0
  291. package/src/index.ts +13 -0
  292. package/src/native/SessionRecorderNative.ts +120 -0
  293. package/src/native/index.ts +5 -0
  294. package/src/otel/helpers.ts +290 -0
  295. package/src/otel/index.ts +132 -0
  296. package/src/otel/instrumentations/index.ts +118 -0
  297. package/src/patch/xhr.ts +148 -0
  298. package/src/recorder/eventExporter.ts +150 -0
  299. package/src/recorder/gestureRecorder.ts +828 -0
  300. package/src/recorder/index.ts +203 -0
  301. package/src/recorder/navigationTracker.ts +268 -0
  302. package/src/recorder/screenRecorder.ts +600 -0
  303. package/src/services/api.service.ts +216 -0
  304. package/src/services/network.service.ts +191 -0
  305. package/src/services/screenMaskingService.ts +153 -0
  306. package/src/services/storage.service.ts +248 -0
  307. package/src/session-recorder.ts +647 -0
  308. package/src/types/configs.ts +118 -0
  309. package/src/types/expo-constants.d.ts +7 -0
  310. package/src/types/index.ts +27 -0
  311. package/src/types/session-recorder.ts +381 -0
  312. package/src/types/session.ts +65 -0
  313. package/src/utils/app-metadata.ts +31 -0
  314. package/src/utils/constants.optional.expo.ts +5 -0
  315. package/src/utils/constants.optional.ts +18 -0
  316. package/src/utils/createStore.ts +32 -0
  317. package/{dist/utils/index.d.ts → src/utils/index.ts} +1 -0
  318. package/src/utils/logger.ts +245 -0
  319. package/src/utils/platform.ts +401 -0
  320. package/src/utils/request-utils.ts +61 -0
  321. package/src/utils/rrweb-events.ts +329 -0
  322. package/src/utils/session.ts +22 -0
  323. package/src/utils/shallowEqual.ts +20 -0
  324. package/src/utils/time.ts +20 -0
  325. package/src/utils/type-utils.ts +75 -0
  326. package/src/version.ts +1 -0
  327. package/copy-react-native-dist.sh +0 -56
  328. package/dist/components/ScreenRecorderView/ScreenRecorderView.d.ts +0 -5
  329. package/dist/components/ScreenRecorderView/ScreenRecorderView.js +0 -1
  330. package/dist/components/ScreenRecorderView/ScreenRecorderView.js.map +0 -1
  331. package/dist/components/ScreenRecorderView/index.d.ts +0 -1
  332. package/dist/components/ScreenRecorderView/index.js +0 -1
  333. package/dist/components/ScreenRecorderView/index.js.map +0 -1
  334. package/dist/components/SessionRecorderWidget/ErrorBanner.js +0 -1
  335. package/dist/components/SessionRecorderWidget/ErrorBanner.js.map +0 -1
  336. package/dist/components/SessionRecorderWidget/FinalPopover.js +0 -1
  337. package/dist/components/SessionRecorderWidget/FinalPopover.js.map +0 -1
  338. package/dist/components/SessionRecorderWidget/FloatingButton.js +0 -1
  339. package/dist/components/SessionRecorderWidget/FloatingButton.js.map +0 -1
  340. package/dist/components/SessionRecorderWidget/InitialPopover.js +0 -1
  341. package/dist/components/SessionRecorderWidget/InitialPopover.js.map +0 -1
  342. package/dist/components/SessionRecorderWidget/ModalContainer.js +0 -1
  343. package/dist/components/SessionRecorderWidget/ModalContainer.js.map +0 -1
  344. package/dist/components/SessionRecorderWidget/ModalHeader.js +0 -1
  345. package/dist/components/SessionRecorderWidget/ModalHeader.js.map +0 -1
  346. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js +0 -1
  347. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js.map +0 -1
  348. package/dist/components/SessionRecorderWidget/icons.js +0 -1
  349. package/dist/components/SessionRecorderWidget/icons.js.map +0 -1
  350. package/dist/components/SessionRecorderWidget/index.d.ts +0 -2
  351. package/dist/components/SessionRecorderWidget/index.js +0 -1
  352. package/dist/components/SessionRecorderWidget/index.js.map +0 -1
  353. package/dist/components/SessionRecorderWidget/styles.js +0 -1
  354. package/dist/components/SessionRecorderWidget/styles.js.map +0 -1
  355. package/dist/components/index.js +0 -1
  356. package/dist/components/index.js.map +0 -1
  357. package/dist/config/constants.js +0 -1
  358. package/dist/config/constants.js.map +0 -1
  359. package/dist/config/defaults.js +0 -1
  360. package/dist/config/defaults.js.map +0 -1
  361. package/dist/config/index.js +0 -1
  362. package/dist/config/index.js.map +0 -1
  363. package/dist/config/masking.d.ts +0 -2
  364. package/dist/config/masking.js +0 -1
  365. package/dist/config/masking.js.map +0 -1
  366. package/dist/config/session-recorder.d.ts +0 -2
  367. package/dist/config/session-recorder.js +0 -1
  368. package/dist/config/session-recorder.js.map +0 -1
  369. package/dist/config/validators.js +0 -1
  370. package/dist/config/validators.js.map +0 -1
  371. package/dist/config/widget.js +0 -1
  372. package/dist/config/widget.js.map +0 -1
  373. package/dist/context/SessionRecorderContext.js +0 -1
  374. package/dist/context/SessionRecorderContext.js.map +0 -1
  375. package/dist/context/SessionRecorderStore.js +0 -1
  376. package/dist/context/SessionRecorderStore.js.map +0 -1
  377. package/dist/context/useSessionRecorderStore.js +0 -1
  378. package/dist/context/useSessionRecorderStore.js.map +0 -1
  379. package/dist/context/useStoreSelector.js +0 -1
  380. package/dist/context/useStoreSelector.js.map +0 -1
  381. package/dist/index.js +0 -1
  382. package/dist/index.js.map +0 -1
  383. package/dist/native/GestureRecorderNative.d.ts +0 -57
  384. package/dist/native/GestureRecorderNative.js +0 -1
  385. package/dist/native/GestureRecorderNative.js.map +0 -1
  386. package/dist/native/SessionRecorderNative.js +0 -1
  387. package/dist/native/SessionRecorderNative.js.map +0 -1
  388. package/dist/native/index.d.ts +0 -2
  389. package/dist/native/index.js +0 -1
  390. package/dist/native/index.js.map +0 -1
  391. package/dist/otel/helpers.js +0 -1
  392. package/dist/otel/helpers.js.map +0 -1
  393. package/dist/otel/index.js +0 -1
  394. package/dist/otel/index.js.map +0 -1
  395. package/dist/otel/instrumentations/index.js +0 -1
  396. package/dist/otel/instrumentations/index.js.map +0 -1
  397. package/dist/patch/index.js +0 -1
  398. package/dist/patch/index.js.map +0 -1
  399. package/dist/patch/xhr.js +0 -1
  400. package/dist/patch/xhr.js.map +0 -1
  401. package/dist/recorder/eventExporter.js +0 -1
  402. package/dist/recorder/eventExporter.js.map +0 -1
  403. package/dist/recorder/gestureRecorder.js +0 -1
  404. package/dist/recorder/gestureRecorder.js.map +0 -1
  405. package/dist/recorder/index.js +0 -1
  406. package/dist/recorder/index.js.map +0 -1
  407. package/dist/recorder/navigationTracker.js +0 -1
  408. package/dist/recorder/navigationTracker.js.map +0 -1
  409. package/dist/recorder/screenRecorder.js +0 -1
  410. package/dist/recorder/screenRecorder.js.map +0 -1
  411. package/dist/services/api.service.js +0 -1
  412. package/dist/services/api.service.js.map +0 -1
  413. package/dist/services/network.service.js +0 -1
  414. package/dist/services/network.service.js.map +0 -1
  415. package/dist/services/screenMaskingService.js +0 -1
  416. package/dist/services/screenMaskingService.js.map +0 -1
  417. package/dist/services/storage.service.js +0 -1
  418. package/dist/services/storage.service.js.map +0 -1
  419. package/dist/session-recorder.js +0 -1
  420. package/dist/session-recorder.js.map +0 -1
  421. package/dist/types/configs.js +0 -1
  422. package/dist/types/configs.js.map +0 -1
  423. package/dist/types/index.js +0 -1
  424. package/dist/types/index.js.map +0 -1
  425. package/dist/types/session-recorder.js +0 -1
  426. package/dist/types/session-recorder.js.map +0 -1
  427. package/dist/types/session.js +0 -1
  428. package/dist/types/session.js.map +0 -1
  429. package/dist/utils/app-metadata.js +0 -1
  430. package/dist/utils/app-metadata.js.map +0 -1
  431. package/dist/utils/constants.optional.expo.js +0 -1
  432. package/dist/utils/constants.optional.expo.js.map +0 -1
  433. package/dist/utils/constants.optional.js +0 -1
  434. package/dist/utils/constants.optional.js.map +0 -1
  435. package/dist/utils/createStore.js +0 -1
  436. package/dist/utils/createStore.js.map +0 -1
  437. package/dist/utils/index.js +0 -1
  438. package/dist/utils/index.js.map +0 -1
  439. package/dist/utils/logger.js +0 -1
  440. package/dist/utils/logger.js.map +0 -1
  441. package/dist/utils/platform.js +0 -1
  442. package/dist/utils/platform.js.map +0 -1
  443. package/dist/utils/request-utils.js +0 -1
  444. package/dist/utils/request-utils.js.map +0 -1
  445. package/dist/utils/rrweb-events.js +0 -1
  446. package/dist/utils/rrweb-events.js.map +0 -1
  447. package/dist/utils/session.js +0 -1
  448. package/dist/utils/session.js.map +0 -1
  449. package/dist/utils/shallowEqual.js +0 -1
  450. package/dist/utils/shallowEqual.js.map +0 -1
  451. package/dist/utils/time.js +0 -1
  452. package/dist/utils/time.js.map +0 -1
  453. package/dist/utils/type-utils.js +0 -1
  454. package/dist/utils/type-utils.js.map +0 -1
  455. package/dist/version.d.ts +0 -1
  456. package/dist/version.js +0 -1
  457. package/dist/version.js.map +0 -1
  458. package/docs/AUTO_METADATA_DETECTION.md +0 -108
  459. package/ios/GestureRecorderNative.swift +0 -316
  460. package/ios/SessionRecorderNative.m +0 -17
  461. package/ios/SessionRecorderNative.podspec +0 -26
  462. /package/{dist/components/index.d.ts → src/components/index.ts} +0 -0
  463. /package/{dist/patch/index.d.ts → src/patch/index.ts} +0 -0
@@ -0,0 +1,150 @@
1
+ import React, { useState, useCallback, memo } from 'react';
2
+ import { View, StyleSheet } from 'react-native';
3
+ import { SessionState } from '../../types';
4
+ import { SessionType } from '@multiplayer-app/session-recorder-common';
5
+ import { useSessionRecorder } from '../../context/SessionRecorderContext';
6
+
7
+ import FinalPopover from './FinalPopover';
8
+ import ModalContainer from './ModalContainer';
9
+ import InitialPopover from './InitialPopover';
10
+ import FloatingButton from './FloatingButton';
11
+ import ErrorBanner from './ErrorBanner';
12
+ import { logger } from '../../utils';
13
+ import { useSessionRecorderStore } from '../../context/useSessionRecorderStore';
14
+ import { sessionRecorderStore } from '../../context/SessionRecorderStore';
15
+
16
+ interface SessionRecorderWidgetProps {}
17
+
18
+ const SessionRecorderWidget: React.FC<SessionRecorderWidgetProps> = memo(() => {
19
+ const { instance, openWidgetModal, closeWidgetModal } = useSessionRecorder();
20
+ const isOnline = useSessionRecorderStore<boolean>((s) => s.isOnline);
21
+ const sessionType = useSessionRecorderStore<SessionType | null>(
22
+ (s) => s.sessionType
23
+ );
24
+ const isModalVisible = useSessionRecorderStore<boolean>(
25
+ (s) => s.isWidgetModalVisible
26
+ );
27
+ const sessionState = useSessionRecorderStore<SessionState | null>(
28
+ (s) => s.sessionState
29
+ );
30
+ const error = useSessionRecorderStore<string | null>((s) => s.error);
31
+ const [isSubmitting, setIsSubmitting] = useState(false);
32
+
33
+ // Get configuration from instance
34
+ const { widget, showContinuousRecording } = instance.config;
35
+
36
+ const dismissError = useCallback(() => {
37
+ sessionRecorderStore.setState({ error: null });
38
+ }, []);
39
+
40
+ const handleError = useCallback((error: any, message: string) => {
41
+ const errorMessage = error instanceof Error ? error.message : message;
42
+ logger.error('SessionRecorderWidget', message, error);
43
+ sessionRecorderStore.setState({ error: errorMessage });
44
+ }, []);
45
+
46
+ const onStartRecording = useCallback(
47
+ async (sessionType: SessionType) => {
48
+ if (!isOnline) {
49
+ handleError(
50
+ new Error('Cannot start recording while offline'),
51
+ 'Cannot start recording while offline'
52
+ );
53
+ return;
54
+ }
55
+ try {
56
+ await instance.start(sessionType);
57
+ closeWidgetModal();
58
+ } catch (error) {
59
+ handleError(error, 'Failed to start recording');
60
+ }
61
+ },
62
+ [isOnline, handleError]
63
+ );
64
+
65
+ const onStopRecording = useCallback(
66
+ async (comment?: string) => {
67
+ try {
68
+ setIsSubmitting(true);
69
+ await instance.stop(comment);
70
+ closeWidgetModal();
71
+ } catch (error) {
72
+ handleError(error, 'Failed to stop recording');
73
+ } finally {
74
+ setIsSubmitting(false);
75
+ }
76
+ },
77
+ [handleError]
78
+ );
79
+
80
+ const onCancelSession = useCallback(async () => {
81
+ try {
82
+ await instance.cancel();
83
+ closeWidgetModal();
84
+ } catch (error) {
85
+ handleError(error, 'Failed to cancel session');
86
+ }
87
+ }, [handleError]);
88
+
89
+ const onSaveContinuousSession = useCallback(async () => {
90
+ try {
91
+ await instance.save();
92
+ } catch (error) {
93
+ handleError(error, 'Failed to save continuous session');
94
+ }
95
+ }, [handleError]);
96
+
97
+ const isStarted =
98
+ sessionState === SessionState.started ||
99
+ sessionState === SessionState.paused;
100
+ const isContinuous = sessionType === SessionType.CONTINUOUS;
101
+
102
+ return (
103
+ <>
104
+ {widget.button?.visible && (
105
+ <View pointerEvents="box-none" style={styles.overlayContainer}>
106
+ <FloatingButton
107
+ sessionState={sessionState}
108
+ onPress={openWidgetModal}
109
+ />
110
+ </View>
111
+ )}
112
+ <ModalContainer isVisible={isModalVisible} onClose={closeWidgetModal}>
113
+ {isStarted && !isContinuous ? (
114
+ <FinalPopover
115
+ isOnline={isOnline}
116
+ isSubmitting={isSubmitting}
117
+ textOverrides={widget.textOverrides}
118
+ onClose={closeWidgetModal}
119
+ onStopRecording={onStopRecording}
120
+ onCancelSession={onCancelSession}
121
+ >
122
+ {error && <ErrorBanner error={error} onDismiss={dismissError} />}
123
+ </FinalPopover>
124
+ ) : (
125
+ <InitialPopover
126
+ isOnline={isOnline}
127
+ isSubmitting={isSubmitting}
128
+ textOverrides={widget.textOverrides}
129
+ isContinuous={isStarted && isContinuous}
130
+ showContinuousRecording={showContinuousRecording}
131
+ onClose={closeWidgetModal}
132
+ onStopRecording={onStopRecording}
133
+ onStartRecording={onStartRecording}
134
+ onSaveContinuousSession={onSaveContinuousSession}
135
+ >
136
+ {error && <ErrorBanner error={error} onDismiss={dismissError} />}
137
+ </InitialPopover>
138
+ )}
139
+ </ModalContainer>
140
+ </>
141
+ );
142
+ });
143
+
144
+ export default SessionRecorderWidget;
145
+
146
+ const styles = StyleSheet.create({
147
+ overlayContainer: {
148
+ ...StyleSheet.absoluteFillObject,
149
+ },
150
+ });
@@ -0,0 +1,80 @@
1
+ import React from 'react';
2
+ import Svg, { Path, Circle } from 'react-native-svg';
3
+
4
+ interface IconProps {
5
+ size?: number;
6
+ color?: string;
7
+ }
8
+
9
+ export const RecordIcon: React.FC<IconProps> = ({
10
+ size = 19,
11
+ color = 'white',
12
+ }) => (
13
+ <Svg width={size} height={size} viewBox="0 0 19 19" fill="none">
14
+ <Path
15
+ fillRule="evenodd"
16
+ clipRule="evenodd"
17
+ d="M6.68926 5.30356C6.56568 5.38721 6.39976 5.37561 6.29459 5.26937L3.58782 2.53477C3.46424 2.40992 3.47196 2.20492 3.60862 2.09483C5.2319 0.786982 7.28494 0 9.51866 0C11.7535 0 13.8066 0.787042 15.4308 2.09586C15.5674 2.20596 15.5752 2.41091 15.4516 2.53577L12.7468 5.26931C12.6416 5.37558 12.4757 5.38719 12.3521 5.30353C11.5393 4.75345 10.571 4.42281 9.52066 4.42281C8.47036 4.42281 7.50203 4.75346 6.68926 5.30356ZM16.4926 3.4303C16.6163 3.30527 16.8197 3.31303 16.9288 3.45121C18.2224 5.08933 19.0001 7.15932 19.0001 9.4116C19.0001 11.6671 18.2204 13.7392 16.9238 15.3785C16.8147 15.5165 16.6114 15.5242 16.4877 15.3992L13.7872 12.6701C13.682 12.5638 13.6708 12.3962 13.7538 12.2716C14.3006 11.451 14.6291 10.4727 14.6291 9.4116C14.6291 8.35454 14.3016 7.37925 13.756 6.56083C13.6728 6.43616 13.6841 6.26857 13.7893 6.16224L16.4926 3.4303ZM5.21676 12.6712C5.322 12.5649 5.3333 12.3974 5.2502 12.2727C4.70331 11.4522 4.374 10.4737 4.374 9.41184C4.374 8.35469 4.70232 7.37949 5.24808 6.56106C5.33123 6.43637 5.31996 6.26872 5.2147 6.16241L2.50855 3.4293C2.38482 3.30434 2.18146 3.31213 2.07236 3.45028C0.77864 5.08841 0 7.15845 0 9.41184C0 11.6684 0.78066 13.7406 2.07831 15.3799C2.18749 15.5178 2.39066 15.5255 2.51429 15.4006L5.21676 12.6712ZM12.3323 13.707C12.4559 13.6231 12.6221 13.6346 12.7273 13.741L15.4277 16.4691C15.5513 16.594 15.5435 16.7991 15.4068 16.9091C13.7837 18.215 11.7327 19 9.49998 19C7.2693 19 5.21837 18.2159 3.59619 16.9102C3.45943 16.8001 3.45169 16.595 3.57533 16.4702L6.27769 13.7409C6.38296 13.6346 6.54906 13.6231 6.67267 13.707C7.48459 14.2577 8.45278 14.5883 9.50198 14.5883C10.5522 14.5883 11.5204 14.2578 12.3323 13.707Z"
18
+ fill={color}
19
+ />
20
+ </Svg>
21
+ );
22
+
23
+ export const CapturingIcon: React.FC<IconProps> = ({
24
+ size = 24,
25
+ color = 'white',
26
+ }) => (
27
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
28
+ <Circle cx="12" cy="12" r="4" fill={color} />
29
+ <Circle cx="12" cy="12" r="7.5" stroke={color} strokeWidth="1" />
30
+ <Circle
31
+ cx="12"
32
+ cy="12"
33
+ r="11.5"
34
+ stroke={color}
35
+ strokeWidth="1"
36
+ opacity="0.2"
37
+ />
38
+ </Svg>
39
+ );
40
+
41
+ export const PausedIcon: React.FC<IconProps> = ({
42
+ size = 24,
43
+ color = 'white',
44
+ }) => (
45
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
46
+ <Path
47
+ d="M8 5V19M16 5V19"
48
+ stroke={color}
49
+ strokeWidth="2"
50
+ strokeLinecap="round"
51
+ strokeLinejoin="round"
52
+ />
53
+ </Svg>
54
+ );
55
+
56
+ export const CheckmarkIcon: React.FC<IconProps> = ({
57
+ size = 24,
58
+ color = 'white',
59
+ }) => (
60
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
61
+ <Path
62
+ fillRule="evenodd"
63
+ clipRule="evenodd"
64
+ d="M20.0481 6.35147C20.5168 6.8201 20.5168 7.5799 20.0481 8.04853L10.4481 17.6485C9.97951 18.1172 9.21971 18.1172 8.75108 17.6485L3.95108 12.8485C3.48245 12.3799 3.48245 11.6201 3.95108 11.1515C4.41971 10.6828 5.17951 10.6828 5.64814 11.1515L9.59961 15.1029L18.3511 6.35147C18.8197 5.88284 19.5795 5.88284 20.0481 6.35147Z"
65
+ fill={color}
66
+ />
67
+ </Svg>
68
+ );
69
+
70
+ export const LogoIcon: React.FC<IconProps> = ({
71
+ size = 30,
72
+ color = '#473CFB',
73
+ }) => (
74
+ <Svg width={size} height={size * 0.8} viewBox="0 0 30 24" fill="none">
75
+ <Path
76
+ d="M28.8324 8.83643L23.5495 6.85854L21.4856 6.08553L23.6001 0.4375L15 3.65769L6.39963 0.4375L8.51441 6.08585L6.45046 6.85885L1.16757 8.83674L0.625 9.03974L9.10095 12.0981C10.0891 12.4548 10.9201 13.1265 11.4758 13.9952C11.6632 14.2883 11.8194 14.6036 11.9398 14.9369L15 23.4076L18.0602 14.9369C18.1806 14.6036 18.3368 14.288 18.5242 13.9952C19.0802 13.1265 19.9112 12.4545 20.8991 12.0981L29.375 9.03974L28.8324 8.83674V8.83643ZM19.779 10.6434C18.2872 11.1816 17.1126 12.3563 16.5744 13.848L15.014 18.173L11.5182 8.83643L10.7776 6.85854L10.2456 5.43757L9.57367 3.64272L12.3068 4.66612L18.1631 6.85885L20.8233 7.85481L23.4457 8.83674L24.104 9.08308L19.779 10.6438V10.6434Z"
77
+ fill={color}
78
+ />
79
+ </Svg>
80
+ );
@@ -0,0 +1,3 @@
1
+ import SessionRecorderWidget from './SessionRecorderWidget';
2
+
3
+ export default SessionRecorderWidget;
@@ -0,0 +1,168 @@
1
+ import { StyleSheet } from 'react-native';
2
+
3
+ export const sharedStyles = StyleSheet.create({
4
+ // Popover styles
5
+ popoverContent: {
6
+ flex: 1,
7
+ paddingHorizontal: 0,
8
+ },
9
+ popoverHeader: {
10
+ flexDirection: 'column',
11
+ paddingBottom: 8,
12
+ paddingHorizontal: 16,
13
+ borderTopLeftRadius: 20,
14
+ borderTopRightRadius: 20,
15
+ backgroundColor: '#f4f9ff',
16
+ shadowColor: '#f4f9ff',
17
+ shadowOffset: { width: 0, height: 5 },
18
+ shadowOpacity: 1,
19
+ shadowRadius: 5,
20
+ elevation: 10,
21
+ },
22
+ modalHandle: {
23
+ marginTop: 8,
24
+ marginBottom: 16,
25
+ width: 40,
26
+ height: 4,
27
+ backgroundColor: '#D1D5DB',
28
+ borderRadius: 2,
29
+ alignSelf: 'center',
30
+ },
31
+ popoverHeaderContent: {
32
+ flexDirection: 'row',
33
+ justifyContent: 'space-between',
34
+ alignItems: 'flex-start',
35
+ },
36
+
37
+ cancelButton: {
38
+ paddingHorizontal: 12,
39
+ paddingVertical: 6,
40
+ borderRadius: 6,
41
+ borderWidth: 1,
42
+ borderColor: '#e1e8f1',
43
+ backgroundColor: '#fff',
44
+ shadowColor: '#000',
45
+ shadowOffset: { width: 0, height: 2 },
46
+ shadowOpacity: 0.06,
47
+ shadowRadius: 3,
48
+ elevation: 3,
49
+ },
50
+ cancelButtonText: {
51
+ color: '#374151',
52
+ fontSize: 14,
53
+ fontWeight: '500',
54
+ },
55
+ popoverBody: {
56
+ flex: 1,
57
+ padding: 16,
58
+ paddingTop: 24,
59
+ },
60
+ title: {
61
+ fontSize: 18,
62
+ fontWeight: '600',
63
+ color: '#2d3748',
64
+ marginBottom: 12,
65
+ },
66
+ description: {
67
+ fontSize: 14,
68
+ color: '#718096',
69
+ marginBottom: 16,
70
+ },
71
+ popoverFooter: {
72
+ marginTop: 'auto',
73
+ paddingTop: 16,
74
+ },
75
+ actionButton: {
76
+ paddingVertical: 16,
77
+ paddingHorizontal: 24,
78
+ borderRadius: 12,
79
+ alignItems: 'center',
80
+ },
81
+ actionButtonText: {
82
+ color: 'white',
83
+ fontSize: 16,
84
+ fontWeight: '500',
85
+ },
86
+
87
+ // Continuous recording styles
88
+ continuousRecordingSection: {
89
+ flexDirection: 'row',
90
+ justifyContent: 'space-between',
91
+ alignItems: 'center',
92
+ marginBottom: 20,
93
+ paddingVertical: 12,
94
+ paddingHorizontal: 16,
95
+ borderWidth: 1,
96
+ borderColor: '#e1e8f1',
97
+ backgroundColor: '#fff',
98
+ borderRadius: 12,
99
+ shadowColor: '#000',
100
+ shadowOffset: { width: 0, height: 2 },
101
+ shadowOpacity: 0.06,
102
+ shadowRadius: 3,
103
+ elevation: 3,
104
+ },
105
+
106
+ continuousRecordingLabel: {
107
+ fontSize: 16,
108
+ fontWeight: '500',
109
+ color: '#374151',
110
+ },
111
+
112
+ continuousOverlay: {
113
+ borderRadius: 12,
114
+ borderWidth: 1,
115
+ borderColor: '#e1e8f1',
116
+ backgroundColor: '#fff',
117
+ padding: 12,
118
+ shadowColor: '#000',
119
+ shadowOffset: { width: 0, height: 2 },
120
+ shadowOpacity: 0.06,
121
+ shadowRadius: 3,
122
+ elevation: 3,
123
+ flexDirection: 'column',
124
+ gap: 8,
125
+ },
126
+
127
+ continuousOverlayHeader: {
128
+ flexDirection: 'row',
129
+ alignItems: 'center',
130
+ gap: 8,
131
+ },
132
+
133
+ continuousOverlayTitle: {
134
+ fontSize: 14,
135
+ fontWeight: '500',
136
+ color: '#2d3748',
137
+ },
138
+
139
+ continuousOverlayDescription: {
140
+ fontSize: 14,
141
+ color: '#718096',
142
+ lineHeight: 20,
143
+ },
144
+
145
+ // Comment input styles
146
+ commentInput: {
147
+ borderWidth: 1,
148
+ borderColor: '#D1D5DB',
149
+ borderRadius: 8,
150
+ padding: 12,
151
+ fontSize: 16,
152
+ color: '#374151',
153
+ backgroundColor: '#F9FAFB',
154
+ marginBottom: 24,
155
+ minHeight: 80,
156
+ },
157
+
158
+ // Button color variants
159
+ startButton: {
160
+ backgroundColor: '#473cfb',
161
+ },
162
+ stopButton: {
163
+ backgroundColor: '#473cfb',
164
+ },
165
+ saveButton: {
166
+ backgroundColor: '#473cfb',
167
+ },
168
+ });
@@ -0,0 +1,67 @@
1
+ export const OTEL_MP_SAMPLE_TRACE_RATIO = 0.15;
2
+
3
+ export const SESSION_ID_PROP_NAME = 'multiplayer-session-id';
4
+
5
+ export const SESSION_SHORT_ID_PROP_NAME = 'multiplayer-session-short-id';
6
+
7
+ export const SESSION_CONTINUOUS_DEBUGGING_PROP_NAME =
8
+ 'multiplayer-session-continuous-debugging';
9
+
10
+ export const SESSION_STATE_PROP_NAME = 'multiplayer-session-state';
11
+
12
+ export const SESSION_TYPE_PROP_NAME = 'multiplayer-session-type';
13
+
14
+ export const SESSION_PROP_NAME = 'multiplayer-session-data';
15
+
16
+ export const SESSION_STARTED_EVENT = 'debug-session:started';
17
+
18
+ export const SESSION_STOPPED_EVENT = 'debug-session:stopped';
19
+
20
+ export const SESSION_SUBSCRIBE_EVENT = 'debug-session:subscribe';
21
+
22
+ export const SESSION_UNSUBSCRIBE_EVENT = 'debug-session:unsubscribe';
23
+
24
+ export const SESSION_AUTO_CREATED = 'debug-session:auto-created';
25
+
26
+ export const SESSION_ADD_EVENT = 'debug-session:rrweb:add-event';
27
+
28
+ export const DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE = 100000;
29
+
30
+ export const SESSION_RESPONSE = 'multiplayer-debug-session-response';
31
+
32
+ export const CONTINUOUS_DEBUGGING_TIMEOUT = 60000; // 1 minutes
33
+
34
+ export const DEBUG_SESSION_MAX_DURATION_SECONDS = 10 * 60 + 30; // TODO: move to shared config otel core
35
+
36
+ // // Package version - injected by webpack during build
37
+ // declare const PACKAGE_VERSION: string
38
+ // export const PACKAGE_VERSION_EXPORT = PACKAGE_VERSION || '1.0.0'
39
+
40
+ // Regex patterns for OpenTelemetry ignore URLs
41
+ export const OTEL_IGNORE_URLS = [
42
+ // Traces endpoint
43
+ /.*\/v1\/traces/,
44
+ // Debug sessions endpoints
45
+ /.*\/v0\/radar\/debug-sessions\/start\/?$/,
46
+ /.*\/v0\/radar\/debug-sessions\/[^/]+\/stop\/?$/,
47
+ /.*\/v0\/radar\/debug-sessions\/[^/]+\/cancel\/?$/,
48
+
49
+ // Continuous debug sessions endpoints
50
+ /.*\/v0\/radar\/continuous-debug-sessions\/start\/?$/,
51
+ /.*\/v0\/radar\/continuous-debug-sessions\/[^/]+\/save\/?$/,
52
+ /.*\/v0\/radar\/continuous-debug-sessions\/[^/]+\/cancel\/?$/,
53
+
54
+ // Remote debug session endpoint
55
+ /.*\/v0\/radar\/remote-debug-session\/check\/?$/,
56
+
57
+ // Connectivity probe endpoints (avoid noisy spans)
58
+ /https:\/\/clients3\.google\.com\/generate_204/,
59
+ /http:\/\/clients3\.google\.com\/generate_204/,
60
+ /http(s)?:\/\/www\.google\.com\/generate_204/,
61
+ /http(s)?:\/\/connectivitycheck\.android\.com\/generate_204/,
62
+ /http(s)?:\/\/connectivitycheck\.gstatic\.com\/generate_204/,
63
+ /http(s)?:\/\/captive\.apple\.com/,
64
+
65
+ // Or use a more general pattern to catch all radar API endpoints
66
+ // /.*\/v0\/radar\/.*/
67
+ ];
@@ -0,0 +1,105 @@
1
+ import {
2
+ SessionRecorderSdk,
3
+ MULTIPLAYER_BASE_API_URL,
4
+ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,
5
+ } from '@multiplayer-app/session-recorder-common';
6
+ import {
7
+ LogLevel,
8
+ WidgetButtonPlacement,
9
+ type SessionRecorderConfigs,
10
+ } from '../types';
11
+ import {
12
+ OTEL_MP_SAMPLE_TRACE_RATIO,
13
+ DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE,
14
+ } from './constants';
15
+
16
+ const { mask, sensitiveFields, sensitiveHeaders } = SessionRecorderSdk;
17
+
18
+ export const DEFAULT_MASKING_CONFIG: SessionRecorderConfigs['masking'] = {
19
+ isContentMaskingEnabled: true,
20
+ maskBody: mask(sensitiveFields),
21
+ maskHeaders: mask(sensitiveHeaders),
22
+ maskBodyFieldsList: sensitiveFields,
23
+ maskHeadersList: sensitiveHeaders,
24
+ headersToInclude: [],
25
+ headersToExclude: [],
26
+ // Screen masking options
27
+ maskImages: false,
28
+ maskLabels: false,
29
+ maskButtons: false,
30
+ maskWebViews: false,
31
+ maskTextInputs: true,
32
+ maskSandboxedViews: false,
33
+ };
34
+
35
+ export const DEFAULT_WIDGET_TEXT_CONFIG: SessionRecorderConfigs['widget']['textOverrides'] =
36
+ {
37
+ initialTitleWithContinuous: 'Encountered an issue?',
38
+ initialTitleWithoutContinuous: 'Encountered an issue?',
39
+ initialDescriptionWithContinuous:
40
+ 'Record your session so we can see the problem and fix it faster.',
41
+ initialDescriptionWithoutContinuous:
42
+ 'Record your session so we can see the problem and fix it faster.',
43
+ continuousRecordingLabel: 'Continuous recording',
44
+ startRecordingButtonText: 'Start recording',
45
+ finalTitle: 'Done recording?',
46
+ finalDescription:
47
+ 'You can also add a quick note with extra context, expectations, or questions. Thank you!',
48
+ commentPlaceholder: 'Add a message...',
49
+ saveButtonText: 'Submit recording',
50
+ cancelButtonText: 'Cancel recording',
51
+ continuousOverlayTitle: 'Save time, skip the reproductions',
52
+ continuousOverlayDescription:
53
+ 'We keep a rolling record of your recent activity. If something doesn’t work as expected, just save the recording and continue working. No need to worry about exceptions and errors - we automatically save recordings for those!',
54
+ saveLastSnapshotButtonText: 'Save recording',
55
+ submitDialogTitle: 'Save recording',
56
+ submitDialogSubtitle:
57
+ 'This full-stack session recording will be saved directly to your selected Multiplayer project. All data is automatically correlated end-to-end.',
58
+ submitDialogCommentLabel: 'You can also add context, comments, or notes.',
59
+ submitDialogCommentPlaceholder: 'Add a message...',
60
+ submitDialogSubmitText: 'Save',
61
+ submitDialogCancelText: 'Cancel',
62
+ };
63
+
64
+ export const BASE_CONFIG: SessionRecorderConfigs = {
65
+ apiKey: '',
66
+
67
+ version: '',
68
+ application: '',
69
+ environment: '',
70
+
71
+ showContinuousRecording: true,
72
+
73
+ widget: {
74
+ enabled: true,
75
+ button: {
76
+ visible: true,
77
+ placement: WidgetButtonPlacement.bottomRight,
78
+ },
79
+ textOverrides: DEFAULT_WIDGET_TEXT_CONFIG,
80
+ },
81
+
82
+ apiBaseUrl: MULTIPLAYER_BASE_API_URL,
83
+ exporterEndpoint: MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,
84
+
85
+ schemifyDocSpanPayload: true,
86
+
87
+ ignoreUrls: [],
88
+ propagateTraceHeaderCorsUrls: [],
89
+
90
+ sampleTraceRatio: OTEL_MP_SAMPLE_TRACE_RATIO,
91
+ maxCapturingHttpPayloadSize: DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE,
92
+
93
+ captureBody: true,
94
+ captureHeaders: true,
95
+ masking: DEFAULT_MASKING_CONFIG,
96
+
97
+ recordScreen: true,
98
+ recordGestures: true,
99
+ recordNavigation: true,
100
+
101
+ logger: {
102
+ enabled: false,
103
+ level: LogLevel.INFO,
104
+ },
105
+ };
@@ -0,0 +1,6 @@
1
+ // Export all config-related functions and constants
2
+ export * from './constants';
3
+ export * from './defaults';
4
+ export * from './validators';
5
+ export * from './masking';
6
+ export * from './session-recorder';
@@ -0,0 +1,60 @@
1
+ import { type MaskingOptions, type SessionRecorderConfigs } from '../types';
2
+ import { DEFAULT_MASKING_CONFIG } from './defaults';
3
+ import { isValidArray, isValidBoolean, isValidFunction } from './validators';
4
+ import { SessionRecorderSdk } from '@multiplayer-app/session-recorder-common';
5
+
6
+ const { mask, sensitiveFields, sensitiveHeaders } = SessionRecorderSdk;
7
+
8
+ export const getMaskingConfig = (
9
+ masking?: MaskingOptions
10
+ ): SessionRecorderConfigs['masking'] => {
11
+ const baseMasking = DEFAULT_MASKING_CONFIG;
12
+
13
+ if (typeof masking !== 'object') {
14
+ return baseMasking;
15
+ }
16
+
17
+ const maskHeadersList = isValidArray(
18
+ masking.maskHeadersList,
19
+ sensitiveHeaders
20
+ );
21
+ const maskBodyFieldsList = isValidArray(
22
+ masking.maskBodyFieldsList,
23
+ sensitiveFields
24
+ );
25
+
26
+ return {
27
+ maskHeadersList,
28
+ maskBodyFieldsList,
29
+ headersToInclude: isValidArray(
30
+ masking.headersToInclude,
31
+ baseMasking.headersToInclude
32
+ ),
33
+ headersToExclude: isValidArray(
34
+ masking.headersToExclude,
35
+ baseMasking.headersToExclude
36
+ ),
37
+ isContentMaskingEnabled: isValidBoolean(
38
+ masking.isContentMaskingEnabled,
39
+ baseMasking.isContentMaskingEnabled
40
+ ),
41
+ maskBody: isValidFunction(masking.maskBody, mask(maskBodyFieldsList)),
42
+ maskHeaders: isValidFunction(masking.maskHeaders, mask(maskHeadersList)),
43
+ // Screen masking options
44
+ maskTextInputs: isValidBoolean(
45
+ masking.maskTextInputs,
46
+ baseMasking.maskTextInputs
47
+ ),
48
+ maskImages: isValidBoolean(masking.maskImages, baseMasking.maskImages),
49
+ maskButtons: isValidBoolean(masking.maskButtons, baseMasking.maskButtons),
50
+ maskLabels: isValidBoolean(masking.maskLabels, baseMasking.maskLabels),
51
+ maskWebViews: isValidBoolean(
52
+ masking.maskWebViews,
53
+ baseMasking.maskWebViews
54
+ ),
55
+ maskSandboxedViews: isValidBoolean(
56
+ masking.maskSandboxedViews,
57
+ baseMasking.maskSandboxedViews
58
+ ),
59
+ };
60
+ };