@multiplayer-app/session-recorder-react-native 1.0.1-beta.2 → 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 -41
  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/GestureTargetFinder.swift +50 -0
  15. package/ios/SessionRecorderNative.podspec +4 -2
  16. package/ios/SessionRecorderNative.swift +10 -1
  17. package/ios/SessionRecorderNativeSpec.swift +55 -0
  18. package/ios/Xxx.h +5 -0
  19. package/ios/Xxx.mm +21 -0
  20. package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js +23 -0
  21. package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js.map +1 -0
  22. package/lib/module/components/ScreenRecorderView/index.js +4 -0
  23. package/lib/module/components/ScreenRecorderView/index.js.map +1 -0
  24. package/lib/module/components/SessionRecorderWidget/ErrorBanner.js +64 -0
  25. package/lib/module/components/SessionRecorderWidget/ErrorBanner.js.map +1 -0
  26. package/lib/module/components/SessionRecorderWidget/FinalPopover.js +74 -0
  27. package/lib/module/components/SessionRecorderWidget/FinalPopover.js.map +1 -0
  28. package/lib/module/components/SessionRecorderWidget/FloatingButton.js +191 -0
  29. package/lib/module/components/SessionRecorderWidget/FloatingButton.js.map +1 -0
  30. package/lib/module/components/SessionRecorderWidget/InitialPopover.js +138 -0
  31. package/lib/module/components/SessionRecorderWidget/InitialPopover.js.map +1 -0
  32. package/lib/module/components/SessionRecorderWidget/ModalContainer.js +177 -0
  33. package/lib/module/components/SessionRecorderWidget/ModalContainer.js.map +1 -0
  34. package/lib/module/components/SessionRecorderWidget/ModalHeader.js +27 -0
  35. package/lib/module/components/SessionRecorderWidget/ModalHeader.js.map +1 -0
  36. package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js +133 -0
  37. package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js.map +1 -0
  38. package/lib/module/components/SessionRecorderWidget/icons.js +93 -0
  39. package/lib/module/components/SessionRecorderWidget/icons.js.map +1 -0
  40. package/lib/module/components/SessionRecorderWidget/index.js +5 -0
  41. package/lib/module/components/SessionRecorderWidget/index.js.map +1 -0
  42. package/lib/module/components/SessionRecorderWidget/styles.js +173 -0
  43. package/lib/module/components/SessionRecorderWidget/styles.js.map +1 -0
  44. package/lib/module/components/index.js +5 -0
  45. package/lib/module/components/index.js.map +1 -0
  46. package/lib/module/config/constants.js +42 -0
  47. package/lib/module/config/constants.js.map +1 -0
  48. package/lib/module/config/defaults.js +81 -0
  49. package/lib/module/config/defaults.js.map +1 -0
  50. package/lib/module/config/index.js +9 -0
  51. package/lib/module/config/index.js.map +1 -0
  52. package/lib/module/config/masking.js +35 -0
  53. package/lib/module/config/masking.js.map +1 -0
  54. package/lib/module/config/session-recorder.js +44 -0
  55. package/lib/module/config/session-recorder.js.map +1 -0
  56. package/lib/module/config/validators.js +28 -0
  57. package/lib/module/config/validators.js.map +1 -0
  58. package/lib/module/config/widget.js +35 -0
  59. package/lib/module/config/widget.js.map +1 -0
  60. package/lib/module/context/SessionRecorderContext.js +93 -0
  61. package/lib/module/context/SessionRecorderContext.js.map +1 -0
  62. package/lib/module/context/SessionRecorderStore.js +12 -0
  63. package/lib/module/context/SessionRecorderStore.js.map +1 -0
  64. package/lib/module/context/useSessionRecorderStore.js +20 -0
  65. package/lib/module/context/useSessionRecorderStore.js.map +1 -0
  66. package/lib/module/context/useStoreSelector.js +27 -0
  67. package/lib/module/context/useStoreSelector.js.map +1 -0
  68. package/lib/module/index.js +13 -0
  69. package/lib/module/index.js.map +1 -0
  70. package/lib/module/native/SessionRecorderNative.js +74 -0
  71. package/lib/module/native/SessionRecorderNative.js.map +1 -0
  72. package/lib/module/native/index.js +4 -0
  73. package/lib/module/native/index.js.map +1 -0
  74. package/lib/module/otel/helpers.js +218 -0
  75. package/lib/module/otel/helpers.js.map +1 -0
  76. package/lib/module/otel/index.js +95 -0
  77. package/lib/module/otel/index.js.map +1 -0
  78. package/lib/module/otel/instrumentations/index.js +102 -0
  79. package/lib/module/otel/instrumentations/index.js.map +1 -0
  80. package/lib/module/package.json +1 -0
  81. package/lib/module/patch/index.js +4 -0
  82. package/lib/module/patch/index.js.map +1 -0
  83. package/lib/module/patch/xhr.js +116 -0
  84. package/lib/module/patch/xhr.js.map +1 -0
  85. package/lib/module/recorder/eventExporter.js +130 -0
  86. package/lib/module/recorder/eventExporter.js.map +1 -0
  87. package/lib/module/recorder/gestureRecorder.js +641 -0
  88. package/lib/module/recorder/gestureRecorder.js.map +1 -0
  89. package/lib/module/recorder/index.js +168 -0
  90. package/lib/module/recorder/index.js.map +1 -0
  91. package/lib/module/recorder/navigationTracker.js +228 -0
  92. package/lib/module/recorder/navigationTracker.js.map +1 -0
  93. package/lib/module/recorder/screenRecorder.js +495 -0
  94. package/lib/module/recorder/screenRecorder.js.map +1 -0
  95. package/lib/module/services/api.service.js +149 -0
  96. package/lib/module/services/api.service.js.map +1 -0
  97. package/lib/module/services/network.service.js +178 -0
  98. package/lib/module/services/network.service.js.map +1 -0
  99. package/lib/module/services/screenMaskingService.js +107 -0
  100. package/lib/module/services/screenMaskingService.js.map +1 -0
  101. package/lib/module/services/storage.service.js +179 -0
  102. package/lib/module/services/storage.service.js.map +1 -0
  103. package/lib/module/session-recorder.js +541 -0
  104. package/lib/module/session-recorder.js.map +1 -0
  105. package/lib/module/types/configs.js +4 -0
  106. package/lib/module/types/configs.js.map +1 -0
  107. package/lib/module/types/expo-constants.d.js +2 -0
  108. package/lib/module/types/expo-constants.d.js.map +1 -0
  109. package/lib/module/types/index.js +11 -0
  110. package/lib/module/types/index.js.map +1 -0
  111. package/lib/module/types/session-recorder.js +68 -0
  112. package/lib/module/types/session-recorder.js.map +1 -0
  113. package/lib/module/types/session.js +9 -0
  114. package/lib/module/types/session.js.map +1 -0
  115. package/lib/module/utils/app-metadata.js +28 -0
  116. package/lib/module/utils/app-metadata.js.map +1 -0
  117. package/lib/module/utils/constants.optional.expo.js +6 -0
  118. package/lib/module/utils/constants.optional.expo.js.map +1 -0
  119. package/lib/module/utils/constants.optional.js +8 -0
  120. package/lib/module/utils/constants.optional.js.map +1 -0
  121. package/lib/module/utils/createStore.js +27 -0
  122. package/lib/module/utils/createStore.js.map +1 -0
  123. package/lib/module/utils/index.js +11 -0
  124. package/lib/module/utils/index.js.map +1 -0
  125. package/lib/module/utils/logger.js +193 -0
  126. package/lib/module/utils/logger.js.map +1 -0
  127. package/lib/module/utils/platform.js +340 -0
  128. package/lib/module/utils/platform.js.map +1 -0
  129. package/lib/module/utils/request-utils.js +58 -0
  130. package/lib/module/utils/request-utils.js.map +1 -0
  131. package/lib/module/utils/rrweb-events.js +276 -0
  132. package/lib/module/utils/rrweb-events.js.map +1 -0
  133. package/lib/module/utils/session.js +21 -0
  134. package/lib/module/utils/session.js.map +1 -0
  135. package/lib/module/utils/shallowEqual.js +17 -0
  136. package/lib/module/utils/shallowEqual.js.map +1 -0
  137. package/lib/module/utils/time.js +17 -0
  138. package/lib/module/utils/time.js.map +1 -0
  139. package/lib/module/utils/type-utils.js +69 -0
  140. package/lib/module/utils/type-utils.js.map +1 -0
  141. package/lib/module/version.js +4 -0
  142. package/lib/module/version.js.map +1 -0
  143. package/lib/typescript/package.json +1 -0
  144. package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts +6 -0
  145. package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts.map +1 -0
  146. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts +2 -0
  147. package/lib/typescript/src/components/ScreenRecorderView/index.d.ts.map +1 -0
  148. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ErrorBanner.d.ts +1 -0
  149. package/lib/typescript/src/components/SessionRecorderWidget/ErrorBanner.d.ts.map +1 -0
  150. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FinalPopover.d.ts +2 -1
  151. package/lib/typescript/src/components/SessionRecorderWidget/FinalPopover.d.ts.map +1 -0
  152. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FloatingButton.d.ts +1 -0
  153. package/lib/typescript/src/components/SessionRecorderWidget/FloatingButton.d.ts.map +1 -0
  154. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/InitialPopover.d.ts +2 -1
  155. package/lib/typescript/src/components/SessionRecorderWidget/InitialPopover.d.ts.map +1 -0
  156. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalContainer.d.ts +1 -0
  157. package/lib/typescript/src/components/SessionRecorderWidget/ModalContainer.d.ts.map +1 -0
  158. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalHeader.d.ts +1 -0
  159. package/lib/typescript/src/components/SessionRecorderWidget/ModalHeader.d.ts.map +1 -0
  160. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/SessionRecorderWidget.d.ts +1 -0
  161. package/lib/typescript/src/components/SessionRecorderWidget/SessionRecorderWidget.d.ts.map +1 -0
  162. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/icons.d.ts +1 -0
  163. package/lib/typescript/src/components/SessionRecorderWidget/icons.d.ts.map +1 -0
  164. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts +3 -0
  165. package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts.map +1 -0
  166. package/{dist → lib/typescript/src}/components/SessionRecorderWidget/styles.d.ts +4 -3
  167. package/lib/typescript/src/components/SessionRecorderWidget/styles.d.ts.map +1 -0
  168. package/{dist → lib/typescript/src}/components/index.d.ts +1 -0
  169. package/lib/typescript/src/components/index.d.ts.map +1 -0
  170. package/{dist → lib/typescript/src}/config/constants.d.ts +1 -0
  171. package/lib/typescript/src/config/constants.d.ts.map +1 -0
  172. package/{dist → lib/typescript/src}/config/defaults.d.ts +2 -1
  173. package/lib/typescript/src/config/defaults.d.ts.map +1 -0
  174. package/{dist → lib/typescript/src}/config/index.d.ts +1 -0
  175. package/lib/typescript/src/config/index.d.ts.map +1 -0
  176. package/lib/typescript/src/config/masking.d.ts +3 -0
  177. package/lib/typescript/src/config/masking.d.ts.map +1 -0
  178. package/lib/typescript/src/config/session-recorder.d.ts +3 -0
  179. package/lib/typescript/src/config/session-recorder.d.ts.map +1 -0
  180. package/{dist → lib/typescript/src}/config/validators.d.ts +1 -0
  181. package/lib/typescript/src/config/validators.d.ts.map +1 -0
  182. package/{dist → lib/typescript/src}/config/widget.d.ts +2 -1
  183. package/lib/typescript/src/config/widget.d.ts.map +1 -0
  184. package/{dist → lib/typescript/src}/context/SessionRecorderContext.d.ts +3 -2
  185. package/lib/typescript/src/context/SessionRecorderContext.d.ts.map +1 -0
  186. package/{dist → lib/typescript/src}/context/SessionRecorderStore.d.ts +2 -1
  187. package/lib/typescript/src/context/SessionRecorderStore.d.ts.map +1 -0
  188. package/{dist → lib/typescript/src}/context/useSessionRecorderStore.d.ts +2 -1
  189. package/lib/typescript/src/context/useSessionRecorderStore.d.ts.map +1 -0
  190. package/{dist → lib/typescript/src}/context/useStoreSelector.d.ts +2 -1
  191. package/lib/typescript/src/context/useStoreSelector.d.ts.map +1 -0
  192. package/{dist → lib/typescript/src}/index.d.ts +1 -0
  193. package/lib/typescript/src/index.d.ts.map +1 -0
  194. package/{dist → lib/typescript/src}/native/SessionRecorderNative.d.ts +21 -3
  195. package/lib/typescript/src/native/SessionRecorderNative.d.ts.map +1 -0
  196. package/{dist → lib/typescript/src}/native/index.d.ts +1 -0
  197. package/lib/typescript/src/native/index.d.ts.map +1 -0
  198. package/{dist → lib/typescript/src}/otel/helpers.d.ts +3 -2
  199. package/lib/typescript/src/otel/helpers.d.ts.map +1 -0
  200. package/{dist → lib/typescript/src}/otel/index.d.ts +2 -2
  201. package/lib/typescript/src/otel/index.d.ts.map +1 -0
  202. package/{dist → lib/typescript/src}/otel/instrumentations/index.d.ts +2 -1
  203. package/lib/typescript/src/otel/instrumentations/index.d.ts.map +1 -0
  204. package/lib/typescript/src/patch/index.d.ts +2 -0
  205. package/lib/typescript/src/patch/index.d.ts.map +1 -0
  206. package/{dist → lib/typescript/src}/patch/xhr.d.ts +1 -0
  207. package/lib/typescript/src/patch/xhr.d.ts.map +1 -0
  208. package/{dist → lib/typescript/src}/recorder/eventExporter.d.ts +2 -1
  209. package/lib/typescript/src/recorder/eventExporter.d.ts.map +1 -0
  210. package/{dist → lib/typescript/src}/recorder/gestureRecorder.d.ts +3 -2
  211. package/lib/typescript/src/recorder/gestureRecorder.d.ts.map +1 -0
  212. package/{dist → lib/typescript/src}/recorder/index.d.ts +3 -2
  213. package/lib/typescript/src/recorder/index.d.ts.map +1 -0
  214. package/{dist → lib/typescript/src}/recorder/navigationTracker.d.ts +2 -1
  215. package/lib/typescript/src/recorder/navigationTracker.d.ts.map +1 -0
  216. package/{dist → lib/typescript/src}/recorder/screenRecorder.d.ts +4 -4
  217. package/lib/typescript/src/recorder/screenRecorder.d.ts.map +1 -0
  218. package/{dist → lib/typescript/src}/services/api.service.d.ts +2 -1
  219. package/lib/typescript/src/services/api.service.d.ts.map +1 -0
  220. package/{dist → lib/typescript/src}/services/network.service.d.ts +1 -0
  221. package/lib/typescript/src/services/network.service.d.ts.map +1 -0
  222. package/{dist → lib/typescript/src}/services/screenMaskingService.d.ts +2 -1
  223. package/lib/typescript/src/services/screenMaskingService.d.ts.map +1 -0
  224. package/{dist → lib/typescript/src}/services/storage.service.d.ts +2 -1
  225. package/lib/typescript/src/services/storage.service.d.ts.map +1 -0
  226. package/{dist → lib/typescript/src}/session-recorder.d.ts +3 -2
  227. package/lib/typescript/src/session-recorder.d.ts.map +1 -0
  228. package/{dist → lib/typescript/src}/types/configs.d.ts +3 -2
  229. package/lib/typescript/src/types/configs.d.ts.map +1 -0
  230. package/{dist → lib/typescript/src}/types/index.d.ts +1 -0
  231. package/lib/typescript/src/types/index.d.ts.map +1 -0
  232. package/{dist → lib/typescript/src}/types/session-recorder.d.ts +3 -2
  233. package/lib/typescript/src/types/session-recorder.d.ts.map +1 -0
  234. package/{dist → lib/typescript/src}/types/session.d.ts +1 -0
  235. package/lib/typescript/src/types/session.d.ts.map +1 -0
  236. package/{dist → lib/typescript/src}/utils/app-metadata.d.ts +1 -0
  237. package/lib/typescript/src/utils/app-metadata.d.ts.map +1 -0
  238. package/{dist → lib/typescript/src}/utils/constants.optional.d.ts +1 -0
  239. package/lib/typescript/src/utils/constants.optional.d.ts.map +1 -0
  240. package/{dist → lib/typescript/src}/utils/constants.optional.expo.d.ts +1 -0
  241. package/lib/typescript/src/utils/constants.optional.expo.d.ts.map +1 -0
  242. package/{dist → lib/typescript/src}/utils/createStore.d.ts +1 -0
  243. package/lib/typescript/src/utils/createStore.d.ts.map +1 -0
  244. package/{dist → lib/typescript/src}/utils/index.d.ts +1 -0
  245. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  246. package/{dist → lib/typescript/src}/utils/logger.d.ts +1 -0
  247. package/lib/typescript/src/utils/logger.d.ts.map +1 -0
  248. package/{dist → lib/typescript/src}/utils/platform.d.ts +2 -1
  249. package/lib/typescript/src/utils/platform.d.ts.map +1 -0
  250. package/{dist → lib/typescript/src}/utils/request-utils.d.ts +1 -0
  251. package/lib/typescript/src/utils/request-utils.d.ts.map +1 -0
  252. package/{dist → lib/typescript/src}/utils/rrweb-events.d.ts +2 -1
  253. package/lib/typescript/src/utils/rrweb-events.d.ts.map +1 -0
  254. package/{dist → lib/typescript/src}/utils/session.d.ts +1 -0
  255. package/lib/typescript/src/utils/session.d.ts.map +1 -0
  256. package/{dist → lib/typescript/src}/utils/shallowEqual.d.ts +1 -0
  257. package/lib/typescript/src/utils/shallowEqual.d.ts.map +1 -0
  258. package/{dist → lib/typescript/src}/utils/time.d.ts +1 -0
  259. package/lib/typescript/src/utils/time.d.ts.map +1 -0
  260. package/{dist → lib/typescript/src}/utils/type-utils.d.ts +1 -0
  261. package/lib/typescript/src/utils/type-utils.d.ts.map +1 -0
  262. package/lib/typescript/src/version.d.ts +2 -0
  263. package/lib/typescript/src/version.d.ts.map +1 -0
  264. package/package.json +140 -39
  265. package/src/components/ScreenRecorderView/ScreenRecorderView.tsx +20 -0
  266. package/src/components/SessionRecorderWidget/ErrorBanner.tsx +58 -0
  267. package/src/components/SessionRecorderWidget/FinalPopover.tsx +96 -0
  268. package/src/components/SessionRecorderWidget/FloatingButton.tsx +176 -0
  269. package/src/components/SessionRecorderWidget/InitialPopover.tsx +167 -0
  270. package/src/components/SessionRecorderWidget/ModalContainer.tsx +189 -0
  271. package/src/components/SessionRecorderWidget/ModalHeader.tsx +24 -0
  272. package/src/components/SessionRecorderWidget/SessionRecorderWidget.tsx +136 -0
  273. package/src/components/SessionRecorderWidget/icons.tsx +52 -0
  274. package/{dist/components/SessionRecorderWidget/index.d.ts → src/components/SessionRecorderWidget/index.ts} +1 -0
  275. package/src/components/SessionRecorderWidget/styles.ts +169 -0
  276. package/src/components/index.ts +2 -0
  277. package/src/config/constants.ts +68 -0
  278. package/src/config/defaults.ts +101 -0
  279. package/src/config/index.ts +6 -0
  280. package/src/config/masking.ts +34 -0
  281. package/src/config/session-recorder.ts +59 -0
  282. package/src/config/validators.ts +31 -0
  283. package/src/config/widget.ts +38 -0
  284. package/src/context/SessionRecorderContext.tsx +138 -0
  285. package/src/context/SessionRecorderStore.ts +21 -0
  286. package/src/context/useSessionRecorderStore.ts +27 -0
  287. package/src/context/useStoreSelector.ts +34 -0
  288. package/src/index.ts +10 -0
  289. package/src/native/SessionRecorderNative.ts +164 -0
  290. package/src/native/index.ts +1 -0
  291. package/src/otel/helpers.ts +274 -0
  292. package/src/otel/index.ts +135 -0
  293. package/src/otel/instrumentations/index.ts +115 -0
  294. package/src/patch/index.ts +1 -0
  295. package/src/patch/xhr.ts +149 -0
  296. package/src/recorder/eventExporter.ts +155 -0
  297. package/src/recorder/gestureRecorder.ts +681 -0
  298. package/src/recorder/index.ts +190 -0
  299. package/src/recorder/navigationTracker.ts +245 -0
  300. package/src/recorder/screenRecorder.ts +549 -0
  301. package/src/services/api.service.ts +215 -0
  302. package/src/services/network.service.ts +182 -0
  303. package/src/services/screenMaskingService.ts +122 -0
  304. package/src/services/storage.service.ts +219 -0
  305. package/src/session-recorder.ts +591 -0
  306. package/src/types/configs.ts +96 -0
  307. package/src/types/expo-constants.d.ts +7 -0
  308. package/src/types/index.ts +29 -0
  309. package/src/types/session-recorder.ts +386 -0
  310. package/src/types/session.ts +65 -0
  311. package/src/utils/app-metadata.ts +31 -0
  312. package/src/utils/constants.optional.expo.ts +5 -0
  313. package/src/utils/constants.optional.ts +16 -0
  314. package/src/utils/createStore.ts +29 -0
  315. package/src/utils/index.ts +8 -0
  316. package/src/utils/logger.ts +216 -0
  317. package/src/utils/platform.ts +370 -0
  318. package/src/utils/request-utils.ts +61 -0
  319. package/src/utils/rrweb-events.ts +316 -0
  320. package/src/utils/session.ts +19 -0
  321. package/src/utils/shallowEqual.ts +14 -0
  322. package/src/utils/time.ts +17 -0
  323. package/src/utils/type-utils.ts +75 -0
  324. package/src/version.ts +1 -0
  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.d.ts +0 -1
  462. package/dist/version.js +0 -1
  463. package/dist/version.js.map +0 -1
  464. package/docs/AUTO_METADATA_DETECTION.md +0 -108
  465. /package/{dist/components/ScreenRecorderView/index.d.ts → src/components/ScreenRecorderView/index.ts} +0 -0
@@ -0,0 +1,316 @@
1
+ import { Dimensions } from 'react-native'
2
+ import { EventType, type eventWithTime, NodeType, type serializedNodeWithId, IncrementalSource, type mutationData } from '@rrweb/types'
3
+ import { getAppMetadata } from './platform'
4
+
5
+ /**
6
+ * Creates a meta event to mark the start of recording
7
+ * @param sessionId - The session ID
8
+ * @param sessionType - The type of session (PLAIN or CONTINUOUS)
9
+ * @param additionalData - Additional data to include in the meta event
10
+ * @returns MetaEvent object
11
+ */
12
+ export function createRecordingMetaEvent(): eventWithTime {
13
+ const screenDimensions = Dimensions.get('window')
14
+ const metadata = getAppMetadata()
15
+
16
+ return {
17
+ type: EventType.Meta,
18
+ data: {
19
+ href: metadata.bundleId || metadata.name || 'https://native.multiplayer.app',
20
+ width: screenDimensions.width,
21
+ height: screenDimensions.height,
22
+ },
23
+ timestamp: Date.now(),
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Create a full snapshot event with the given base64 image
29
+ * @param base64Image - Base64 encoded image data
30
+ * @param width - Screen width
31
+ * @param height - Screen height
32
+ * @param captureFormat - Image format (png, jpg, etc.)
33
+ * @param nodeIdCounter - Starting node ID counter (will be modified)
34
+ * @param timestamp - Optional timestamp to use for the event
35
+ * @returns Full snapshot event
36
+ */
37
+ export function createFullSnapshotEvent(
38
+ base64Image: string,
39
+ width: number,
40
+ height: number,
41
+ captureFormat: string = 'jpg',
42
+ nodeIdCounter: { current: number },
43
+ timestamp?: number,
44
+ ): eventWithTime {
45
+ // Create a virtual DOM node representing the screen as an image
46
+ const imageNode: serializedNodeWithId = {
47
+ type: NodeType.Element,
48
+ id: 0,
49
+ tagName: 'img',
50
+ attributes: {
51
+ src: `data:image/${captureFormat};base64,${base64Image}`,
52
+ width: width.toString(),
53
+ height: height.toString(),
54
+ style: `width: ${width}px; height: ${height}px;`,
55
+ },
56
+ childNodes: [],
57
+ }
58
+
59
+ // Create the root container
60
+ const rootNode: serializedNodeWithId = {
61
+ type: NodeType.Element,
62
+ id: nodeIdCounter.current++,
63
+ tagName: 'div',
64
+ attributes: {
65
+ style: `width: ${width}px; height: ${height}px; position: relative;`,
66
+ },
67
+ childNodes: [imageNode],
68
+ }
69
+
70
+ const domNode: serializedNodeWithId = {
71
+ type: NodeType.Document,
72
+ childNodes: [
73
+ {
74
+ type: NodeType.DocumentType,
75
+ name: 'html',
76
+ publicId: '',
77
+ systemId: '',
78
+ id: nodeIdCounter.current++,
79
+ },
80
+ {
81
+ type: NodeType.Element,
82
+ tagName: 'html',
83
+ attributes: {},
84
+ childNodes: [
85
+ {
86
+ type: NodeType.Element,
87
+ tagName: 'head',
88
+ attributes: {},
89
+ childNodes: [
90
+ {
91
+ type: NodeType.Element,
92
+ tagName: 'meta',
93
+ attributes: { charset: 'utf-8' },
94
+ childNodes: [],
95
+ id: nodeIdCounter.current++,
96
+ },
97
+ {
98
+ type: NodeType.Element,
99
+ tagName: 'meta',
100
+ attributes: {
101
+ name: 'viewport',
102
+ content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no',
103
+ },
104
+ childNodes: [],
105
+ id: nodeIdCounter.current++,
106
+ },
107
+ ],
108
+ id: nodeIdCounter.current++,
109
+ },
110
+ {
111
+ type: NodeType.Element,
112
+ tagName: 'body',
113
+ attributes: {
114
+ style: 'margin: 0; padding: 0; width: 100%; height: 100%;',
115
+ },
116
+ childNodes: [rootNode],
117
+ id: nodeIdCounter.current++,
118
+ },
119
+ ],
120
+ id: nodeIdCounter.current++,
121
+ },
122
+ ],
123
+ id: nodeIdCounter.current++,
124
+ }
125
+
126
+ return {
127
+ type: EventType.FullSnapshot,
128
+ data: {
129
+ node: domNode,
130
+ initialOffset: { left: 0, top: 0 },
131
+ },
132
+ timestamp: timestamp || Date.now(),
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Create an incremental snapshot event with mutation data to update image src
138
+ * @param base64Image - New base64 encoded image data
139
+ * @param captureFormat - Image format (png, jpg, etc.)
140
+ * @param timestamp - Optional timestamp to use for the event
141
+ * @returns Incremental snapshot event with mutation data
142
+ */
143
+ export function createIncrementalSnapshotWithImageUpdate(
144
+ base64Image: string,
145
+ captureFormat: string = 'jpg',
146
+ timestamp?: number,
147
+ ): eventWithTime {
148
+ const mutationData: mutationData = {
149
+ source: IncrementalSource.Mutation,
150
+ texts: [],
151
+ attributes: [
152
+ {
153
+ id: 0,
154
+ attributes: {
155
+ src: `data:image/${captureFormat};base64,${base64Image}`,
156
+ },
157
+ },
158
+ ],
159
+ removes: [],
160
+ adds: [],
161
+ }
162
+
163
+ return {
164
+ type: EventType.IncrementalSnapshot,
165
+ data: mutationData,
166
+ timestamp: timestamp || Date.now(),
167
+ }
168
+ }
169
+
170
+ /**
171
+ * Create a simple image node for React Native screen capture
172
+ * @param base64Image - Base64 encoded image data
173
+ * @param width - Image width
174
+ * @param height - Image height
175
+ * @param captureFormat - Image format (png, jpg, etc.)
176
+ * @param nodeId - Node ID for the image
177
+ * @returns Serialized node with ID
178
+ */
179
+ export function createImageNode(
180
+ base64Image: string,
181
+ width: number,
182
+ height: number,
183
+ captureFormat: string = 'jpg',
184
+ nodeId: number,
185
+ ): serializedNodeWithId {
186
+ return {
187
+ type: NodeType.Element,
188
+ id: nodeId,
189
+ tagName: 'img',
190
+ attributes: {
191
+ src: `data:image/${captureFormat};base64,${base64Image}`,
192
+ width: width.toString(),
193
+ height: height.toString(),
194
+ style: `width: ${width}px; height: ${height}px;`,
195
+ },
196
+ childNodes: [],
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Create a document node for React Native screen capture
202
+ * @param imageNode - The image node to include
203
+ * @param width - Screen width
204
+ * @param height - Screen height
205
+ * @param nodeIdCounter - Node ID counter (will be modified)
206
+ * @returns Document node
207
+ */
208
+ export function createDocumentNode(
209
+ imageNode: serializedNodeWithId,
210
+ width: number,
211
+ height: number,
212
+ nodeIdCounter: { current: number },
213
+ ): serializedNodeWithId {
214
+ // Create the root container
215
+ const rootNode: serializedNodeWithId = {
216
+ type: NodeType.Element,
217
+ id: nodeIdCounter.current++,
218
+ tagName: 'div',
219
+ attributes: {
220
+ style: `width: ${width}px; height: ${height}px; position: relative;`,
221
+ },
222
+ childNodes: [imageNode],
223
+ }
224
+
225
+ return {
226
+ type: NodeType.Document,
227
+ childNodes: [
228
+ {
229
+ type: NodeType.DocumentType,
230
+ name: 'html',
231
+ publicId: '',
232
+ systemId: '',
233
+ id: nodeIdCounter.current++,
234
+ },
235
+ {
236
+ type: NodeType.Element,
237
+ tagName: 'html',
238
+ attributes: {},
239
+ childNodes: [
240
+ {
241
+ type: NodeType.Element,
242
+ tagName: 'head',
243
+ attributes: {},
244
+ childNodes: [
245
+ {
246
+ type: NodeType.Element,
247
+ tagName: 'meta',
248
+ attributes: { charset: 'utf-8' },
249
+ childNodes: [],
250
+ id: nodeIdCounter.current++,
251
+ },
252
+ {
253
+ type: NodeType.Element,
254
+ tagName: 'meta',
255
+ attributes: {
256
+ name: 'viewport',
257
+ content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no',
258
+ },
259
+ childNodes: [],
260
+ id: nodeIdCounter.current++,
261
+ },
262
+ ],
263
+ id: nodeIdCounter.current++,
264
+ },
265
+ {
266
+ type: NodeType.Element,
267
+ tagName: 'body',
268
+ attributes: {},
269
+ childNodes: [rootNode],
270
+ id: nodeIdCounter.current++,
271
+ },
272
+ ],
273
+ id: nodeIdCounter.current++,
274
+ },
275
+ ],
276
+ id: nodeIdCounter.current++,
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Generate a simple hash for screen comparison
282
+ * This is a lightweight hash that focuses on the beginning and end of the base64 string
283
+ * to detect changes without doing a full comparison
284
+ * @param base64Image - Base64 encoded image
285
+ * @param sampleSize - Number of characters to sample from each part
286
+ * @returns Hash string for comparison
287
+ */
288
+ export function generateScreenHash(base64Image: string, sampleSize: number = 100): string {
289
+ // Use a simple hash that samples the beginning, middle, and end of the base64 string
290
+ // This is much faster than comparing the entire string
291
+ const start = base64Image.substring(0, sampleSize)
292
+ const middle = base64Image.substring(
293
+ Math.floor(base64Image.length / 2) - sampleSize / 2,
294
+ Math.floor(base64Image.length / 2) + sampleSize / 2,
295
+ )
296
+ const end = base64Image.substring(base64Image.length - sampleSize)
297
+
298
+ // Combine samples and create a simple hash
299
+ const combined = start + middle + end
300
+ return simpleHash(combined)
301
+ }
302
+
303
+ /**
304
+ * Simple hash function for string comparison
305
+ * @param str - String to hash
306
+ * @returns Hash value as string
307
+ */
308
+ export function simpleHash(str: string): string {
309
+ let hash = 0
310
+ for (let i = 0; i < str.length; i++) {
311
+ const char = str.charCodeAt(i)
312
+ hash = (hash << 5) - hash + char
313
+ hash = hash & hash // Convert to 32-bit integer
314
+ }
315
+ return Math.abs(hash).toString(36)
316
+ }
@@ -0,0 +1,19 @@
1
+ import { SessionType } from '@multiplayer-app/session-recorder-common'
2
+ import { DEBUG_SESSION_MAX_DURATION_SECONDS } from '../config/constants'
3
+
4
+ /**
5
+ * Session-related utility functions for React Native
6
+ */
7
+
8
+ export const isSessionActive = (session: any, sessionType: SessionType | null): boolean => {
9
+ if (!session) return false
10
+ if (sessionType === SessionType.CONTINUOUS) return true
11
+ const startedAt = new Date(session.startedAt || session.createdAt)
12
+ const now = new Date()
13
+ const diff = now.getTime() - startedAt.getTime()
14
+ return diff < DEBUG_SESSION_MAX_DURATION_SECONDS * 1000
15
+ }
16
+
17
+ export const isConsoleEvent = (event: any): boolean => {
18
+ return event.type === 'Plugin' && event.data?.plugin === 'rrweb/console@1'
19
+ }
@@ -0,0 +1,14 @@
1
+ export function shallowEqual<T extends Record<string, any>>(a: T, b: T): boolean {
2
+ if (Object.is(a, b)) return true
3
+ if (!a || !b) return false
4
+ const aKeys = Object.keys(a)
5
+ const bKeys = Object.keys(b)
6
+ if (aKeys.length !== bKeys.length) return false
7
+ for (let i = 0; i < aKeys.length; i++) {
8
+ const key = aKeys[i]
9
+ if (!Object.prototype.hasOwnProperty.call(b, key!) || !Object.is(a[key!], b[key!])) {
10
+ return false
11
+ }
12
+ }
13
+ return true
14
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Time and date utility functions for React Native
3
+ */
4
+
5
+ export const getFormattedDate = (date: number | Date, options?: any): string => {
6
+ return new Date(date).toLocaleDateString(
7
+ 'en-US',
8
+ options || {
9
+ month: 'short',
10
+ year: 'numeric',
11
+ day: 'numeric',
12
+ hour: 'numeric',
13
+ minute: '2-digit',
14
+ second: '2-digit',
15
+ },
16
+ )
17
+ }
@@ -0,0 +1,75 @@
1
+ const nativeIsArray = Array.isArray
2
+ const ObjProto = Object.prototype
3
+ export const hasOwnProperty = ObjProto.hasOwnProperty
4
+ const toString = ObjProto.toString
5
+
6
+ export const isArray =
7
+ nativeIsArray ||
8
+ function (obj: any): obj is any[] {
9
+ return toString.call(obj) === '[object Array]'
10
+ }
11
+ export const isUint8Array = function (x: unknown): x is Uint8Array {
12
+ return toString.call(x) === '[object Uint8Array]'
13
+ }
14
+ // from a comment on http://dbj.org/dbj/?p=286
15
+ // fails on only one very rare and deliberate custom object:
16
+ // let bomb = { toString : undefined, valueOf: function(o) { return "function BOMBA!"; }};
17
+ export const isFunction = function (f: any): f is (...args: any[]) => any {
18
+ return typeof f === 'function'
19
+ }
20
+ // Underscore Addons
21
+ export const isObject = function (x: unknown): x is Record<string, any> {
22
+ return x === Object(x) && !isArray(x)
23
+ }
24
+ export const isEmptyObject = function (x: unknown): x is Record<string, any> {
25
+ if (isObject(x)) {
26
+ for (const key in x) {
27
+ if (hasOwnProperty.call(x, key)) {
28
+ return false
29
+ }
30
+ }
31
+ return true
32
+ }
33
+ return false
34
+ }
35
+ export const isUndefined = function (x: unknown): x is undefined {
36
+ return x === void 0
37
+ }
38
+
39
+ export const isString = function (x: unknown): x is string {
40
+ return toString.call(x) == '[object String]'
41
+ }
42
+
43
+ export const isEmptyString = function (x: unknown): boolean {
44
+ return isString(x) && x.trim().length === 0
45
+ }
46
+
47
+ export const isNull = function (x: unknown): x is null {
48
+ return x === null
49
+ }
50
+
51
+ /*
52
+ sometimes you want to check if something is null or undefined
53
+ that's what this is for
54
+ */
55
+ export const isNullish = function (x: unknown): x is null | undefined {
56
+ return isUndefined(x) || isNull(x)
57
+ }
58
+
59
+ export const isDate = function (x: unknown): x is Date {
60
+ return toString.call(x) == '[object Date]'
61
+ }
62
+ export const isNumber = function (x: unknown): x is number {
63
+ return toString.call(x) == '[object Number]'
64
+ }
65
+ export const isBoolean = function (x: unknown): x is boolean {
66
+ return toString.call(x) === '[object Boolean]'
67
+ }
68
+
69
+ export const isFormData = (x: unknown): x is FormData => {
70
+ return x instanceof FormData
71
+ }
72
+
73
+ export const isFile = (x: unknown): x is File => {
74
+ return x instanceof File
75
+ }
package/src/version.ts ADDED
@@ -0,0 +1 @@
1
+ export const version = "1.0.1-beta.3"
@@ -1,7 +0,0 @@
1
- distributionBase=GRADLE_USER_HOME
2
- distributionPath=wrapper/dists
3
- distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
4
- networkTimeout=10000
5
- validateDistributionUrl=true
6
- zipStoreBase=GRADLE_USER_HOME
7
- zipStorePath=wrapper/dists