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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +216 -155
  3. package/SessionRecorderNative.podspec +9 -14
  4. package/android/build.gradle +21 -44
  5. package/android/gradle.properties +4 -4
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeConfig.kt +52 -0
  8. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeModule.kt +860 -0
  9. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeModuleSpec.kt +51 -0
  10. package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativePackage.kt +33 -0
  11. package/android/src/main/java/com/multiplayer/sessionrecordernative/model/TargetInfo.kt +9 -0
  12. package/android/src/main/java/com/multiplayer/sessionrecordernative/util/ViewUtils.kt +72 -0
  13. package/android/src/main/java/com/xxx/XxxModule.kt +23 -0
  14. package/ios/SessionRecorderNative.podspec +4 -2
  15. package/ios/SessionRecorderNative.swift +1 -1
  16. package/ios/SessionRecorderNativeSpec.swift +3 -3
  17. package/ios/Xxx.h +5 -0
  18. package/ios/Xxx.mm +21 -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 +13 -0
  68. package/lib/module/index.js.map +1 -0
  69. package/lib/module/native/SessionRecorderNative.js +74 -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 +193 -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/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts +6 -0
  144. package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts.map +1 -0
  145. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts +2 -0
  146. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts.map +1 -0
  147. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ErrorBanner.d.ts +1 -0
  148. package/lib/typescript/src/components/SessionRecorderWidget/ErrorBanner.d.ts.map +1 -0
  149. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FinalPopover.d.ts +2 -1
  150. package/lib/typescript/src/components/SessionRecorderWidget/FinalPopover.d.ts.map +1 -0
  151. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FloatingButton.d.ts +1 -0
  152. package/lib/typescript/src/components/SessionRecorderWidget/FloatingButton.d.ts.map +1 -0
  153. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/InitialPopover.d.ts +2 -1
  154. package/lib/typescript/src/components/SessionRecorderWidget/InitialPopover.d.ts.map +1 -0
  155. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalContainer.d.ts +1 -0
  156. package/lib/typescript/src/components/SessionRecorderWidget/ModalContainer.d.ts.map +1 -0
  157. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalHeader.d.ts +1 -0
  158. package/lib/typescript/src/components/SessionRecorderWidget/ModalHeader.d.ts.map +1 -0
  159. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/SessionRecorderWidget.d.ts +1 -0
  160. package/lib/typescript/src/components/SessionRecorderWidget/SessionRecorderWidget.d.ts.map +1 -0
  161. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/icons.d.ts +1 -0
  162. package/lib/typescript/src/components/SessionRecorderWidget/icons.d.ts.map +1 -0
  163. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts +3 -0
  164. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts.map +1 -0
  165. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/styles.d.ts +4 -3
  166. package/lib/typescript/src/components/SessionRecorderWidget/styles.d.ts.map +1 -0
  167. package/{dist → lib/typescript/src}/components/index.d.ts +1 -0
  168. package/lib/typescript/src/components/index.d.ts.map +1 -0
  169. package/{dist → lib/typescript/src}/config/constants.d.ts +1 -0
  170. package/lib/typescript/src/config/constants.d.ts.map +1 -0
  171. package/{dist → lib/typescript/src}/config/defaults.d.ts +2 -1
  172. package/lib/typescript/src/config/defaults.d.ts.map +1 -0
  173. package/{dist → lib/typescript/src}/config/index.d.ts +1 -0
  174. package/lib/typescript/src/config/index.d.ts.map +1 -0
  175. package/lib/typescript/src/config/masking.d.ts +3 -0
  176. package/lib/typescript/src/config/masking.d.ts.map +1 -0
  177. package/lib/typescript/src/config/session-recorder.d.ts +3 -0
  178. package/lib/typescript/src/config/session-recorder.d.ts.map +1 -0
  179. package/{dist → lib/typescript/src}/config/validators.d.ts +1 -0
  180. package/lib/typescript/src/config/validators.d.ts.map +1 -0
  181. package/{dist → lib/typescript/src}/config/widget.d.ts +2 -1
  182. package/lib/typescript/src/config/widget.d.ts.map +1 -0
  183. package/{dist → lib/typescript/src}/context/SessionRecorderContext.d.ts +3 -2
  184. package/lib/typescript/src/context/SessionRecorderContext.d.ts.map +1 -0
  185. package/{dist → lib/typescript/src}/context/SessionRecorderStore.d.ts +2 -1
  186. package/lib/typescript/src/context/SessionRecorderStore.d.ts.map +1 -0
  187. package/{dist → lib/typescript/src}/context/useSessionRecorderStore.d.ts +2 -1
  188. package/lib/typescript/src/context/useSessionRecorderStore.d.ts.map +1 -0
  189. package/{dist → lib/typescript/src}/context/useStoreSelector.d.ts +2 -1
  190. package/lib/typescript/src/context/useStoreSelector.d.ts.map +1 -0
  191. package/{dist → lib/typescript/src}/index.d.ts +1 -0
  192. package/lib/typescript/src/index.d.ts.map +1 -0
  193. package/{dist → lib/typescript/src}/native/SessionRecorderNative.d.ts +21 -3
  194. package/lib/typescript/src/native/SessionRecorderNative.d.ts.map +1 -0
  195. package/{dist → lib/typescript/src}/native/index.d.ts +1 -0
  196. package/lib/typescript/src/native/index.d.ts.map +1 -0
  197. package/{dist → lib/typescript/src}/otel/helpers.d.ts +3 -2
  198. package/lib/typescript/src/otel/helpers.d.ts.map +1 -0
  199. package/{dist → lib/typescript/src}/otel/index.d.ts +2 -2
  200. package/lib/typescript/src/otel/index.d.ts.map +1 -0
  201. package/{dist → lib/typescript/src}/otel/instrumentations/index.d.ts +2 -1
  202. package/lib/typescript/src/otel/instrumentations/index.d.ts.map +1 -0
  203. package/lib/typescript/src/patch/index.d.ts +2 -0
  204. package/lib/typescript/src/patch/index.d.ts.map +1 -0
  205. package/{dist → lib/typescript/src}/patch/xhr.d.ts +1 -0
  206. package/lib/typescript/src/patch/xhr.d.ts.map +1 -0
  207. package/{dist → lib/typescript/src}/recorder/eventExporter.d.ts +2 -1
  208. package/lib/typescript/src/recorder/eventExporter.d.ts.map +1 -0
  209. package/{dist → lib/typescript/src}/recorder/gestureRecorder.d.ts +3 -2
  210. package/lib/typescript/src/recorder/gestureRecorder.d.ts.map +1 -0
  211. package/{dist → lib/typescript/src}/recorder/index.d.ts +3 -2
  212. package/lib/typescript/src/recorder/index.d.ts.map +1 -0
  213. package/{dist → lib/typescript/src}/recorder/navigationTracker.d.ts +2 -1
  214. package/lib/typescript/src/recorder/navigationTracker.d.ts.map +1 -0
  215. package/{dist → lib/typescript/src}/recorder/screenRecorder.d.ts +4 -4
  216. package/lib/typescript/src/recorder/screenRecorder.d.ts.map +1 -0
  217. package/{dist → lib/typescript/src}/services/api.service.d.ts +2 -1
  218. package/lib/typescript/src/services/api.service.d.ts.map +1 -0
  219. package/{dist → lib/typescript/src}/services/network.service.d.ts +1 -0
  220. package/lib/typescript/src/services/network.service.d.ts.map +1 -0
  221. package/{dist → lib/typescript/src}/services/screenMaskingService.d.ts +2 -1
  222. package/lib/typescript/src/services/screenMaskingService.d.ts.map +1 -0
  223. package/{dist → lib/typescript/src}/services/storage.service.d.ts +2 -1
  224. package/lib/typescript/src/services/storage.service.d.ts.map +1 -0
  225. package/{dist → lib/typescript/src}/session-recorder.d.ts +3 -2
  226. package/lib/typescript/src/session-recorder.d.ts.map +1 -0
  227. package/{dist → lib/typescript/src}/types/configs.d.ts +3 -2
  228. package/lib/typescript/src/types/configs.d.ts.map +1 -0
  229. package/{dist → lib/typescript/src}/types/index.d.ts +1 -0
  230. package/lib/typescript/src/types/index.d.ts.map +1 -0
  231. package/{dist → lib/typescript/src}/types/session-recorder.d.ts +3 -2
  232. package/lib/typescript/src/types/session-recorder.d.ts.map +1 -0
  233. package/{dist → lib/typescript/src}/types/session.d.ts +1 -0
  234. package/lib/typescript/src/types/session.d.ts.map +1 -0
  235. package/{dist → lib/typescript/src}/utils/app-metadata.d.ts +1 -0
  236. package/lib/typescript/src/utils/app-metadata.d.ts.map +1 -0
  237. package/{dist → lib/typescript/src}/utils/constants.optional.d.ts +1 -0
  238. package/lib/typescript/src/utils/constants.optional.d.ts.map +1 -0
  239. package/{dist → lib/typescript/src}/utils/constants.optional.expo.d.ts +1 -0
  240. package/lib/typescript/src/utils/constants.optional.expo.d.ts.map +1 -0
  241. package/{dist → lib/typescript/src}/utils/createStore.d.ts +1 -0
  242. package/lib/typescript/src/utils/createStore.d.ts.map +1 -0
  243. package/{dist → lib/typescript/src}/utils/index.d.ts +1 -0
  244. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  245. package/{dist → lib/typescript/src}/utils/logger.d.ts +1 -0
  246. package/lib/typescript/src/utils/logger.d.ts.map +1 -0
  247. package/{dist → lib/typescript/src}/utils/platform.d.ts +2 -1
  248. package/lib/typescript/src/utils/platform.d.ts.map +1 -0
  249. package/{dist → lib/typescript/src}/utils/request-utils.d.ts +1 -0
  250. package/lib/typescript/src/utils/request-utils.d.ts.map +1 -0
  251. package/{dist → lib/typescript/src}/utils/rrweb-events.d.ts +2 -1
  252. package/lib/typescript/src/utils/rrweb-events.d.ts.map +1 -0
  253. package/{dist → lib/typescript/src}/utils/session.d.ts +1 -0
  254. package/lib/typescript/src/utils/session.d.ts.map +1 -0
  255. package/{dist → lib/typescript/src}/utils/shallowEqual.d.ts +1 -0
  256. package/lib/typescript/src/utils/shallowEqual.d.ts.map +1 -0
  257. package/{dist → lib/typescript/src}/utils/time.d.ts +1 -0
  258. package/lib/typescript/src/utils/time.d.ts.map +1 -0
  259. package/{dist → lib/typescript/src}/utils/type-utils.d.ts +1 -0
  260. package/lib/typescript/src/utils/type-utils.d.ts.map +1 -0
  261. package/{dist → lib/typescript/src}/version.d.ts +1 -0
  262. package/lib/typescript/src/version.d.ts.map +1 -0
  263. package/package.json +133 -44
  264. package/src/components/ScreenRecorderView/ScreenRecorderView.tsx +20 -0
  265. package/src/components/SessionRecorderWidget/ErrorBanner.tsx +58 -0
  266. package/src/components/SessionRecorderWidget/FinalPopover.tsx +96 -0
  267. package/src/components/SessionRecorderWidget/FloatingButton.tsx +176 -0
  268. package/src/components/SessionRecorderWidget/InitialPopover.tsx +167 -0
  269. package/src/components/SessionRecorderWidget/ModalContainer.tsx +189 -0
  270. package/src/components/SessionRecorderWidget/ModalHeader.tsx +24 -0
  271. package/src/components/SessionRecorderWidget/SessionRecorderWidget.tsx +136 -0
  272. package/src/components/SessionRecorderWidget/icons.tsx +52 -0
  273. package/{dist/components/SessionRecorderWidget/index.d.ts → src/components/SessionRecorderWidget/index.ts} +1 -0
  274. package/src/components/SessionRecorderWidget/styles.ts +169 -0
  275. package/src/components/index.ts +2 -0
  276. package/src/config/constants.ts +68 -0
  277. package/src/config/defaults.ts +101 -0
  278. package/src/config/index.ts +6 -0
  279. package/src/config/masking.ts +34 -0
  280. package/src/config/session-recorder.ts +59 -0
  281. package/src/config/validators.ts +31 -0
  282. package/src/config/widget.ts +38 -0
  283. package/src/context/SessionRecorderContext.tsx +138 -0
  284. package/src/context/SessionRecorderStore.ts +21 -0
  285. package/src/context/useSessionRecorderStore.ts +27 -0
  286. package/src/context/useStoreSelector.ts +34 -0
  287. package/src/index.ts +10 -0
  288. package/src/native/SessionRecorderNative.ts +164 -0
  289. package/src/native/index.ts +1 -0
  290. package/src/otel/helpers.ts +274 -0
  291. package/src/otel/index.ts +135 -0
  292. package/src/otel/instrumentations/index.ts +115 -0
  293. package/src/patch/index.ts +1 -0
  294. package/src/patch/xhr.ts +149 -0
  295. package/src/recorder/eventExporter.ts +155 -0
  296. package/src/recorder/gestureRecorder.ts +681 -0
  297. package/src/recorder/index.ts +190 -0
  298. package/src/recorder/navigationTracker.ts +245 -0
  299. package/src/recorder/screenRecorder.ts +549 -0
  300. package/src/services/api.service.ts +215 -0
  301. package/src/services/network.service.ts +182 -0
  302. package/src/services/screenMaskingService.ts +122 -0
  303. package/src/services/storage.service.ts +219 -0
  304. package/src/session-recorder.ts +591 -0
  305. package/src/types/configs.ts +96 -0
  306. package/src/types/expo-constants.d.ts +7 -0
  307. package/src/types/index.ts +29 -0
  308. package/src/types/session-recorder.ts +386 -0
  309. package/src/types/session.ts +65 -0
  310. package/src/utils/app-metadata.ts +31 -0
  311. package/src/utils/constants.optional.expo.ts +5 -0
  312. package/src/utils/constants.optional.ts +16 -0
  313. package/src/utils/createStore.ts +29 -0
  314. package/src/utils/index.ts +8 -0
  315. package/src/utils/logger.ts +216 -0
  316. package/src/utils/platform.ts +370 -0
  317. package/src/utils/request-utils.ts +61 -0
  318. package/src/utils/rrweb-events.ts +316 -0
  319. package/src/utils/session.ts +19 -0
  320. package/src/utils/shallowEqual.ts +14 -0
  321. package/src/utils/time.ts +17 -0
  322. package/src/utils/type-utils.ts +75 -0
  323. package/src/version.ts +1 -0
  324. package/REACT_NATIVE_SETUP.md +0 -91
  325. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  326. package/android/gradle/wrapper/gradle-wrapper.properties +0 -7
  327. package/android/gradlew +0 -249
  328. package/android/gradlew.bat +0 -92
  329. package/copy-react-native-dist.sh +0 -56
  330. package/dist/components/ScreenRecorderView/ScreenRecorderView.d.ts +0 -5
  331. package/dist/components/ScreenRecorderView/ScreenRecorderView.js +0 -1
  332. package/dist/components/ScreenRecorderView/ScreenRecorderView.js.map +0 -1
  333. package/dist/components/ScreenRecorderView/index.js +0 -1
  334. package/dist/components/ScreenRecorderView/index.js.map +0 -1
  335. package/dist/components/SessionRecorderWidget/ErrorBanner.js +0 -1
  336. package/dist/components/SessionRecorderWidget/ErrorBanner.js.map +0 -1
  337. package/dist/components/SessionRecorderWidget/FinalPopover.js +0 -1
  338. package/dist/components/SessionRecorderWidget/FinalPopover.js.map +0 -1
  339. package/dist/components/SessionRecorderWidget/FloatingButton.js +0 -1
  340. package/dist/components/SessionRecorderWidget/FloatingButton.js.map +0 -1
  341. package/dist/components/SessionRecorderWidget/InitialPopover.js +0 -1
  342. package/dist/components/SessionRecorderWidget/InitialPopover.js.map +0 -1
  343. package/dist/components/SessionRecorderWidget/ModalContainer.js +0 -1
  344. package/dist/components/SessionRecorderWidget/ModalContainer.js.map +0 -1
  345. package/dist/components/SessionRecorderWidget/ModalHeader.js +0 -1
  346. package/dist/components/SessionRecorderWidget/ModalHeader.js.map +0 -1
  347. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js +0 -1
  348. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js.map +0 -1
  349. package/dist/components/SessionRecorderWidget/icons.js +0 -1
  350. package/dist/components/SessionRecorderWidget/icons.js.map +0 -1
  351. package/dist/components/SessionRecorderWidget/index.js +0 -1
  352. package/dist/components/SessionRecorderWidget/index.js.map +0 -1
  353. package/dist/components/SessionRecorderWidget/styles.js +0 -1
  354. package/dist/components/SessionRecorderWidget/styles.js.map +0 -1
  355. package/dist/components/index.js +0 -1
  356. package/dist/components/index.js.map +0 -1
  357. package/dist/config/constants.js +0 -1
  358. package/dist/config/constants.js.map +0 -1
  359. package/dist/config/defaults.js +0 -1
  360. package/dist/config/defaults.js.map +0 -1
  361. package/dist/config/index.js +0 -1
  362. package/dist/config/index.js.map +0 -1
  363. package/dist/config/masking.d.ts +0 -2
  364. package/dist/config/masking.js +0 -1
  365. package/dist/config/masking.js.map +0 -1
  366. package/dist/config/session-recorder.d.ts +0 -2
  367. package/dist/config/session-recorder.js +0 -1
  368. package/dist/config/session-recorder.js.map +0 -1
  369. package/dist/config/validators.js +0 -1
  370. package/dist/config/validators.js.map +0 -1
  371. package/dist/config/widget.js +0 -1
  372. package/dist/config/widget.js.map +0 -1
  373. package/dist/context/SessionRecorderContext.js +0 -1
  374. package/dist/context/SessionRecorderContext.js.map +0 -1
  375. package/dist/context/SessionRecorderStore.js +0 -1
  376. package/dist/context/SessionRecorderStore.js.map +0 -1
  377. package/dist/context/useSessionRecorderStore.js +0 -1
  378. package/dist/context/useSessionRecorderStore.js.map +0 -1
  379. package/dist/context/useStoreSelector.js +0 -1
  380. package/dist/context/useStoreSelector.js.map +0 -1
  381. package/dist/index.js +0 -1
  382. package/dist/index.js.map +0 -1
  383. package/dist/native/GestureRecorderNative.d.ts +0 -57
  384. package/dist/native/GestureRecorderNative.js +0 -1
  385. package/dist/native/GestureRecorderNative.js.map +0 -1
  386. package/dist/native/GestureRecorderNativeTurboSpec.d.ts +0 -31
  387. package/dist/native/GestureRecorderNativeTurboSpec.js +0 -1
  388. package/dist/native/GestureRecorderNativeTurboSpec.js.map +0 -1
  389. package/dist/native/SessionRecorderNative.js +0 -1
  390. package/dist/native/SessionRecorderNative.js.map +0 -1
  391. package/dist/native/SessionRecorderNativeTurboSpec.d.ts +0 -17
  392. package/dist/native/SessionRecorderNativeTurboSpec.js +0 -1
  393. package/dist/native/SessionRecorderNativeTurboSpec.js.map +0 -1
  394. package/dist/native/index.js +0 -1
  395. package/dist/native/index.js.map +0 -1
  396. package/dist/otel/helpers.js +0 -1
  397. package/dist/otel/helpers.js.map +0 -1
  398. package/dist/otel/index.js +0 -1
  399. package/dist/otel/index.js.map +0 -1
  400. package/dist/otel/instrumentations/index.js +0 -1
  401. package/dist/otel/instrumentations/index.js.map +0 -1
  402. package/dist/patch/index.d.ts +0 -1
  403. package/dist/patch/index.js +0 -1
  404. package/dist/patch/index.js.map +0 -1
  405. package/dist/patch/xhr.js +0 -1
  406. package/dist/patch/xhr.js.map +0 -1
  407. package/dist/recorder/eventExporter.js +0 -1
  408. package/dist/recorder/eventExporter.js.map +0 -1
  409. package/dist/recorder/gestureRecorder.js +0 -1
  410. package/dist/recorder/gestureRecorder.js.map +0 -1
  411. package/dist/recorder/index.js +0 -1
  412. package/dist/recorder/index.js.map +0 -1
  413. package/dist/recorder/navigationTracker.js +0 -1
  414. package/dist/recorder/navigationTracker.js.map +0 -1
  415. package/dist/recorder/screenRecorder.js +0 -1
  416. package/dist/recorder/screenRecorder.js.map +0 -1
  417. package/dist/services/api.service.js +0 -1
  418. package/dist/services/api.service.js.map +0 -1
  419. package/dist/services/network.service.js +0 -1
  420. package/dist/services/network.service.js.map +0 -1
  421. package/dist/services/screenMaskingService.js +0 -1
  422. package/dist/services/screenMaskingService.js.map +0 -1
  423. package/dist/services/storage.service.js +0 -1
  424. package/dist/services/storage.service.js.map +0 -1
  425. package/dist/session-recorder.js +0 -1
  426. package/dist/session-recorder.js.map +0 -1
  427. package/dist/types/configs.js +0 -1
  428. package/dist/types/configs.js.map +0 -1
  429. package/dist/types/index.js +0 -1
  430. package/dist/types/index.js.map +0 -1
  431. package/dist/types/session-recorder.js +0 -1
  432. package/dist/types/session-recorder.js.map +0 -1
  433. package/dist/types/session.js +0 -1
  434. package/dist/types/session.js.map +0 -1
  435. package/dist/utils/app-metadata.js +0 -1
  436. package/dist/utils/app-metadata.js.map +0 -1
  437. package/dist/utils/constants.optional.expo.js +0 -1
  438. package/dist/utils/constants.optional.expo.js.map +0 -1
  439. package/dist/utils/constants.optional.js +0 -1
  440. package/dist/utils/constants.optional.js.map +0 -1
  441. package/dist/utils/createStore.js +0 -1
  442. package/dist/utils/createStore.js.map +0 -1
  443. package/dist/utils/index.js +0 -1
  444. package/dist/utils/index.js.map +0 -1
  445. package/dist/utils/logger.js +0 -1
  446. package/dist/utils/logger.js.map +0 -1
  447. package/dist/utils/platform.js +0 -1
  448. package/dist/utils/platform.js.map +0 -1
  449. package/dist/utils/request-utils.js +0 -1
  450. package/dist/utils/request-utils.js.map +0 -1
  451. package/dist/utils/rrweb-events.js +0 -1
  452. package/dist/utils/rrweb-events.js.map +0 -1
  453. package/dist/utils/session.js +0 -1
  454. package/dist/utils/session.js.map +0 -1
  455. package/dist/utils/shallowEqual.js +0 -1
  456. package/dist/utils/shallowEqual.js.map +0 -1
  457. package/dist/utils/time.js +0 -1
  458. package/dist/utils/time.js.map +0 -1
  459. package/dist/utils/type-utils.js +0 -1
  460. package/dist/utils/type-utils.js.map +0 -1
  461. package/dist/version.js +0 -1
  462. package/dist/version.js.map +0 -1
  463. package/docs/AUTO_METADATA_DETECTION.md +0 -108
  464. package/react-native.config.js +0 -13
  465. /package/{dist/components/ScreenRecorderView/index.d.ts → src/components/ScreenRecorderView/index.ts} +0 -0
@@ -0,0 +1,215 @@
1
+ import { type IResourceAttributes, type ISessionAttributes, type ApiServiceConfig } from '../types'
2
+
3
+ export interface StartSessionRequest {
4
+ name?: string
5
+ stoppedAt?: string | number
6
+ sessionAttributes?: ISessionAttributes
7
+ resourceAttributes?: IResourceAttributes
8
+ debugSessionData?: Record<string, any>
9
+ tags?: { key?: string, value: string }[]
10
+ }
11
+
12
+ export interface StopSessionRequest {
13
+ sessionAttributes?: ISessionAttributes
14
+ stoppedAt: string | number
15
+ }
16
+
17
+ export class ApiService {
18
+ private config?: ApiServiceConfig
19
+ private baseUrl: string = 'https://api.multiplayer.app'
20
+
21
+ constructor() {
22
+ this.config = {
23
+ apiKey: '',
24
+ apiBaseUrl: '',
25
+ exporterEndpoint: '',
26
+ }
27
+ }
28
+
29
+ init(config: ApiServiceConfig): void {
30
+ this.config = {
31
+ ...this.config,
32
+ ...config,
33
+ }
34
+ if (config.apiBaseUrl) {
35
+ this.baseUrl = config.apiBaseUrl
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Update the API service configuration
41
+ * @param config - Partial configuration to update
42
+ */
43
+ public updateConfigs(config: Partial<ApiServiceConfig>) {
44
+ if (this.config) {
45
+ this.config = { ...this.config, ...config }
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Set the API key
51
+ * @param apiKey - The API key to set
52
+ */
53
+ setApiKey(apiKey: string): void {
54
+ if (this.config) {
55
+ this.config.apiKey = apiKey
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Make a request to the session debugger API
61
+ * @param path - API endpoint path (relative to the base URL)
62
+ * @param method - HTTP method (GET, POST, PATCH, etc.)
63
+ * @param body - request payload
64
+ * @param signal - AbortSignal to set request's signal
65
+ */
66
+ private async makeRequest(
67
+ path: string,
68
+ method: string,
69
+ body?: any,
70
+ signal?: AbortSignal,
71
+ ): Promise<any> {
72
+ const url = `${this.baseUrl}/v0/radar${path}`
73
+ const params = {
74
+ method,
75
+ body: body ? JSON.stringify(body) : null,
76
+ headers: {
77
+ 'Content-Type': 'application/json',
78
+ ...(this.config?.apiKey && { 'X-Api-Key': this.config.apiKey }),
79
+ },
80
+ }
81
+
82
+ try {
83
+ const response = await fetch(url, {
84
+ ...params,
85
+ signal,
86
+ })
87
+
88
+ if (!response.ok) {
89
+ throw new Error('Network response was not ok: ' + response.statusText)
90
+ }
91
+
92
+ if (response.status === 204) {
93
+ return null
94
+ }
95
+
96
+ return await response.json()
97
+ } catch (error: any) {
98
+ if (error?.name === 'AbortError') {
99
+ throw new Error('Request aborted')
100
+ }
101
+ throw new Error('Error making request: ' + error.message)
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Start a new debug session
107
+ * @param request - Session start request data
108
+ * @param signal - Optional AbortSignal for request cancellation
109
+ */
110
+ async startSession(
111
+ request: StartSessionRequest,
112
+ signal?: AbortSignal,
113
+ ): Promise<any> {
114
+ try {
115
+ const res = await this.makeRequest(
116
+ '/debug-sessions/start',
117
+ 'POST',
118
+ request,
119
+ signal,
120
+ )
121
+ return res
122
+ } catch (error: any) {
123
+ throw error
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Stop an active debug session
129
+ * @param sessionId - ID of the session to stop
130
+ * @param request - Session stop request data
131
+ */
132
+ async stopSession(
133
+ sessionId: string,
134
+ request: StopSessionRequest,
135
+ ): Promise<any> {
136
+ return this.makeRequest(
137
+ `/debug-sessions/${sessionId}/stop`,
138
+ 'PATCH',
139
+ request,
140
+ )
141
+ }
142
+
143
+ /**
144
+ * Cancel an active debug session
145
+ * @param sessionId - ID of the session to cancel
146
+ */
147
+ async cancelSession(sessionId: string): Promise<any> {
148
+ return this.makeRequest(
149
+ `/debug-sessions/${sessionId}/cancel`,
150
+ 'DELETE',
151
+ )
152
+ }
153
+
154
+ /**
155
+ * Start a new continuous debug session
156
+ * @param request - Session start request data
157
+ * @param signal - Optional AbortSignal for request cancellation
158
+ */
159
+ async startContinuousDebugSession(
160
+ request: StartSessionRequest,
161
+ signal?: AbortSignal,
162
+ ): Promise<any> {
163
+ return this.makeRequest(
164
+ '/continuous-debug-sessions/start',
165
+ 'POST',
166
+ request,
167
+ signal,
168
+ )
169
+ }
170
+
171
+ /**
172
+ * Save a continuous debug session
173
+ * @param sessionId - ID of the session to save
174
+ * @param request - Session save request data
175
+ * @param signal - Optional AbortSignal for request cancellation
176
+ */
177
+ async saveContinuousDebugSession(
178
+ sessionId: string,
179
+ request: StartSessionRequest,
180
+ signal?: AbortSignal,
181
+ ): Promise<any> {
182
+ return this.makeRequest(
183
+ `/continuous-debug-sessions/${sessionId}/save`,
184
+ 'POST',
185
+ request,
186
+ signal,
187
+ )
188
+ }
189
+
190
+ /**
191
+ * Stop an active continuous debug session
192
+ * @param sessionId - ID of the session to stop
193
+ */
194
+ async stopContinuousDebugSession(sessionId: string): Promise<any> {
195
+ return this.makeRequest(
196
+ `/continuous-debug-sessions/${sessionId}/cancel`,
197
+ 'DELETE',
198
+ )
199
+ }
200
+
201
+ /**
202
+ * Check debug session should be started remotely
203
+ */
204
+ async checkRemoteSession(
205
+ requestBody: StartSessionRequest,
206
+ signal?: AbortSignal,
207
+ ): Promise<{ state: 'START' | 'STOP' }> {
208
+ return this.makeRequest(
209
+ '/remote-debug-session/check',
210
+ 'POST',
211
+ requestBody,
212
+ signal,
213
+ )
214
+ }
215
+ }
@@ -0,0 +1,182 @@
1
+ import { Platform } from 'react-native'
2
+ import { logger } from '../utils'
3
+ import { sessionRecorderStore } from '../context/SessionRecorderStore'
4
+
5
+ // Safe import for NetInfo with web fallback
6
+ let NetInfo: any = null
7
+ const isWeb = Platform.OS === 'web'
8
+
9
+ if (!isWeb) {
10
+ try {
11
+ NetInfo = require('@react-native-community/netinfo').default
12
+ } catch (error) {
13
+ console.warn('NetInfo not available:', error)
14
+ }
15
+ } else {
16
+ // Web fallback using navigator.onLine
17
+ NetInfo = {
18
+ fetch: () => Promise.resolve({
19
+ isConnected: true, // Default to connected for web
20
+ type: 'unknown',
21
+ isInternetReachable: true
22
+ }),
23
+ addEventListener: (_callback: (state: any) => void) => {
24
+ // Return a no-op function for web
25
+ return () => { }
26
+ }
27
+ }
28
+ }
29
+
30
+ export interface NetworkState {
31
+ isConnected: boolean
32
+ type: string | null
33
+ isInternetReachable: boolean | null
34
+ }
35
+
36
+ export type NetworkStateChangeCallback = (state: NetworkState) => void
37
+
38
+ export class NetworkService {
39
+ private static instance: NetworkService | null = null
40
+ private _isOnline = true
41
+ private unsubscribe: (() => void) | null = null
42
+ private callbacks: NetworkStateChangeCallback[] = []
43
+
44
+ private constructor() {
45
+ // Private constructor for singleton
46
+ }
47
+
48
+ static getInstance(): NetworkService {
49
+ if (!NetworkService.instance) {
50
+ NetworkService.instance = new NetworkService()
51
+ }
52
+ return NetworkService.instance
53
+ }
54
+
55
+ /**
56
+ * Initialize network monitoring
57
+ */
58
+ async init(): Promise<void> {
59
+ try {
60
+ // Get initial network state
61
+ const initialState = await NetInfo.fetch()
62
+ this._isOnline = initialState.isConnected ?? true
63
+
64
+ // Update store with initial state
65
+ sessionRecorderStore.setState({ isOnline: this._isOnline })
66
+
67
+ // Notify callbacks
68
+ this.notifyCallbacks({
69
+ isConnected: this._isOnline,
70
+ type: initialState.type,
71
+ isInternetReachable: initialState.isInternetReachable,
72
+ })
73
+
74
+ // Listen for network state changes
75
+ this.unsubscribe = NetInfo.addEventListener((state: any) => {
76
+ const wasOnline = this._isOnline
77
+ this._isOnline = state.isConnected ?? true
78
+
79
+ // Update store
80
+ sessionRecorderStore.setState({ isOnline: this._isOnline })
81
+
82
+ // Notify callbacks
83
+ this.notifyCallbacks({
84
+ isConnected: this._isOnline,
85
+ type: state.type,
86
+ isInternetReachable: state.isInternetReachable,
87
+ })
88
+
89
+ // Log state changes
90
+ if (wasOnline && !this._isOnline) {
91
+ logger.info('NetworkService', 'Network went offline')
92
+ } else if (!wasOnline && this._isOnline) {
93
+ logger.info('NetworkService', 'Network came back online')
94
+ }
95
+ })
96
+
97
+ logger.info('NetworkService', 'Network monitoring initialized')
98
+ } catch (error) {
99
+ logger.error('NetworkService', 'Failed to initialize network monitoring', error)
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Get current network state
105
+ */
106
+ getCurrentState(): NetworkState {
107
+ return {
108
+ isConnected: this._isOnline,
109
+ type: null, // We don't store this in the service
110
+ isInternetReachable: null, // We don't store this in the service
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Check if device is online
116
+ */
117
+ isOnline(): boolean {
118
+ return this._isOnline
119
+ }
120
+
121
+ /**
122
+ * Add callback for network state changes
123
+ */
124
+ addCallback(callback: NetworkStateChangeCallback): void {
125
+ this.callbacks.push(callback)
126
+ }
127
+
128
+ /**
129
+ * Remove callback for network state changes
130
+ */
131
+ removeCallback(callback: NetworkStateChangeCallback): void {
132
+ this.callbacks = this.callbacks.filter(cb => cb !== callback)
133
+ }
134
+
135
+ /**
136
+ * Notify all callbacks of network state change
137
+ */
138
+ private notifyCallbacks(state: NetworkState): void {
139
+ this.callbacks.forEach(callback => {
140
+ try {
141
+ callback(state)
142
+ } catch (error) {
143
+ logger.error('NetworkService', 'Error in network state callback', error)
144
+ }
145
+ })
146
+ }
147
+
148
+ /**
149
+ * Cleanup network monitoring
150
+ */
151
+ cleanup(): void {
152
+ if (this.unsubscribe) {
153
+ this.unsubscribe()
154
+ this.unsubscribe = null
155
+ }
156
+ this.callbacks = []
157
+ logger.info('NetworkService', 'Network monitoring cleaned up')
158
+ }
159
+
160
+ /**
161
+ * Force refresh network state
162
+ */
163
+ async refresh(): Promise<NetworkState> {
164
+ try {
165
+ const state = await NetInfo.fetch()
166
+ this._isOnline = state.isConnected ?? true
167
+ sessionRecorderStore.setState({ isOnline: this._isOnline })
168
+
169
+ const networkState: NetworkState = {
170
+ isConnected: this._isOnline,
171
+ type: state.type,
172
+ isInternetReachable: state.isInternetReachable,
173
+ }
174
+
175
+ this.notifyCallbacks(networkState)
176
+ return networkState
177
+ } catch (error) {
178
+ logger.error('NetworkService', 'Failed to refresh network state', error)
179
+ throw error
180
+ }
181
+ }
182
+ }
@@ -0,0 +1,122 @@
1
+ import SessionRecorderNative, { type MaskingOptions } from '../native/SessionRecorderNative'
2
+ import { logger } from '../utils'
3
+
4
+
5
+ export interface ScreenMaskingConfig {
6
+ /** Whether screen masking is enabled */
7
+ enabled: boolean
8
+ /** Whether to mask text inputs (UITextField, UITextView, React Native text components) */
9
+ maskTextInputs?: boolean
10
+ /** Whether to mask images (UIImageView, React Native Image components) */
11
+ maskImages?: boolean
12
+ /** Whether to mask buttons (UIButton) */
13
+ maskButtons?: boolean
14
+ /** Whether to mask labels (UILabel) */
15
+ maskLabels?: boolean
16
+ /** Whether to mask web views (WKWebView) */
17
+ maskWebViews?: boolean
18
+ /** Whether to mask sandboxed views (system views that don't belong to current process) */
19
+ maskSandboxedViews?: boolean
20
+ }
21
+
22
+ export class ScreenMaskingService {
23
+ private config: ScreenMaskingConfig
24
+ private isAvailable: boolean = false
25
+
26
+ constructor(config: ScreenMaskingConfig = {
27
+ enabled: true,
28
+ maskTextInputs: true,
29
+ maskImages: false,
30
+ maskButtons: false,
31
+ maskLabels: false,
32
+ maskWebViews: false,
33
+ maskSandboxedViews: false
34
+ }) {
35
+ this.config = config
36
+ this.checkAvailability()
37
+ }
38
+
39
+ /**
40
+ * Check if the native masking module is available
41
+ */
42
+ private checkAvailability(): void {
43
+ try {
44
+ // Try to access the native module to check if it's available
45
+ if (SessionRecorderNative && typeof SessionRecorderNative.captureAndMask === 'function') {
46
+ this.isAvailable = true
47
+ logger.info('ScreenMaskingService', 'Screen masking native module is available')
48
+ } else {
49
+ this.isAvailable = false
50
+ logger.warn('ScreenMaskingService', 'Screen masking native module is not available - auto-linking may still be in progress')
51
+
52
+ }
53
+ } catch (error) {
54
+ this.isAvailable = false
55
+ logger.error('ScreenMaskingService', 'Error checking screen masking availability:', error)
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Capture screen with masking applied
61
+ */
62
+ async captureMaskedScreen(options: MaskingOptions): Promise<string | null> {
63
+ if (!this.isAvailable || !this.config.enabled) {
64
+ logger.warn('ScreenMaskingService', 'Screen masking is not available or disabled')
65
+ return null
66
+ }
67
+
68
+ try {
69
+ const maskingOptions: MaskingOptions = {
70
+ ...this.config, ...options,
71
+ }
72
+ const maskedImageBase64 = await SessionRecorderNative.captureAndMaskWithOptions(maskingOptions)
73
+ return maskedImageBase64
74
+ } catch (error) {
75
+ logger.error('ScreenMaskingService', 'Failed to capture masked screen:', error)
76
+ return null
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Capture screen with basic masking (no custom options)
82
+ */
83
+ async captureMaskedScreenBasic(): Promise<string | null> {
84
+ if (!this.isAvailable || !this.config.enabled) {
85
+ logger.warn('ScreenMaskingService', 'Screen masking is not available or disabled')
86
+ return null
87
+ }
88
+
89
+ try {
90
+ const maskedImageBase64 = await SessionRecorderNative.captureAndMask()
91
+ return maskedImageBase64
92
+ } catch (error) {
93
+ logger.error('ScreenMaskingService', 'Failed to capture masked screen (basic):', error)
94
+ return null
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Update the masking configuration
100
+ */
101
+ updateConfig(config: Partial<ScreenMaskingConfig>): void {
102
+ this.config = { ...this.config, ...config }
103
+ logger.info('ScreenMaskingService', 'Screen masking configuration updated')
104
+ }
105
+
106
+ /**
107
+ * Check if screen masking is available
108
+ */
109
+ isScreenMaskingAvailable(): boolean {
110
+ return this.isAvailable && this.config.enabled
111
+ }
112
+
113
+ /**
114
+ * Get the current configuration
115
+ */
116
+ getConfig(): ScreenMaskingConfig {
117
+ return { ...this.config }
118
+ }
119
+ }
120
+
121
+ // Create a singleton instance
122
+ export const screenMaskingService = new ScreenMaskingService()