@depup/datadog__browser-rum 6.31.0-depup.0

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 (688) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/bundle/chunks/profiler-9f1c1103f1ef0aa98257-datadog-rum.js +1 -0
  4. package/bundle/chunks/recorder-926b641c6ef51d09a378-datadog-rum.js +1 -0
  5. package/bundle/datadog-rum.js +1 -0
  6. package/changes.json +5 -0
  7. package/cjs/boot/isBrowserSupported.d.ts +4 -0
  8. package/cjs/boot/isBrowserSupported.js +17 -0
  9. package/cjs/boot/isBrowserSupported.js.map +1 -0
  10. package/cjs/boot/lazyLoadProfiler.d.ts +3 -0
  11. package/cjs/boot/lazyLoadProfiler.js +56 -0
  12. package/cjs/boot/lazyLoadProfiler.js.map +1 -0
  13. package/cjs/boot/lazyLoadRecorder.d.ts +3 -0
  14. package/cjs/boot/lazyLoadRecorder.js +56 -0
  15. package/cjs/boot/lazyLoadRecorder.js.map +1 -0
  16. package/cjs/boot/postStartStrategy.d.ts +33 -0
  17. package/cjs/boot/postStartStrategy.js +98 -0
  18. package/cjs/boot/postStartStrategy.js.map +1 -0
  19. package/cjs/boot/preStartStrategy.d.ts +6 -0
  20. package/cjs/boot/preStartStrategy.js +24 -0
  21. package/cjs/boot/preStartStrategy.js.map +1 -0
  22. package/cjs/boot/profilerApi.d.ts +2 -0
  23. package/cjs/boot/profilerApi.js +52 -0
  24. package/cjs/boot/profilerApi.js.map +1 -0
  25. package/cjs/boot/recorderApi.d.ts +3 -0
  26. package/cjs/boot/recorderApi.js +71 -0
  27. package/cjs/boot/recorderApi.js.map +1 -0
  28. package/cjs/boot/startRecording.d.ts +6 -0
  29. package/cjs/boot/startRecording.js +45 -0
  30. package/cjs/boot/startRecording.js.map +1 -0
  31. package/cjs/domain/deflate/deflateEncoder.d.ts +3 -0
  32. package/cjs/domain/deflate/deflateEncoder.js +110 -0
  33. package/cjs/domain/deflate/deflateEncoder.js.map +1 -0
  34. package/cjs/domain/deflate/deflateWorker.d.ts +29 -0
  35. package/cjs/domain/deflate/deflateWorker.js +105 -0
  36. package/cjs/domain/deflate/deflateWorker.js.map +1 -0
  37. package/cjs/domain/deflate/index.d.ts +3 -0
  38. package/cjs/domain/deflate/index.js +11 -0
  39. package/cjs/domain/deflate/index.js.map +1 -0
  40. package/cjs/domain/getSessionReplayLink.d.ts +2 -0
  41. package/cjs/domain/getSessionReplayLink.js +35 -0
  42. package/cjs/domain/getSessionReplayLink.js.map +1 -0
  43. package/cjs/domain/profiling/actionHistory.d.ts +10 -0
  44. package/cjs/domain/profiling/actionHistory.js +49 -0
  45. package/cjs/domain/profiling/actionHistory.js.map +1 -0
  46. package/cjs/domain/profiling/longTaskHistory.d.ts +11 -0
  47. package/cjs/domain/profiling/longTaskHistory.js +28 -0
  48. package/cjs/domain/profiling/longTaskHistory.js.map +1 -0
  49. package/cjs/domain/profiling/profiler.d.ts +7 -0
  50. package/cjs/domain/profiling/profiler.js +267 -0
  51. package/cjs/domain/profiling/profiler.js.map +1 -0
  52. package/cjs/domain/profiling/profilingContext.d.ts +6 -0
  53. package/cjs/domain/profiling/profilingContext.js +31 -0
  54. package/cjs/domain/profiling/profilingContext.js.map +1 -0
  55. package/cjs/domain/profiling/profilingSupported.d.ts +1 -0
  56. package/cjs/domain/profiling/profilingSupported.js +11 -0
  57. package/cjs/domain/profiling/profilingSupported.js.map +1 -0
  58. package/cjs/domain/profiling/test-utils/mockedTrace.d.ts +3 -0
  59. package/cjs/domain/profiling/test-utils/mockedTrace.js +57 -0
  60. package/cjs/domain/profiling/test-utils/mockedTrace.js.map +1 -0
  61. package/cjs/domain/profiling/transport/assembly.d.ts +7 -0
  62. package/cjs/domain/profiling/transport/assembly.js +45 -0
  63. package/cjs/domain/profiling/transport/assembly.js.map +1 -0
  64. package/cjs/domain/profiling/transport/buildProfileEventAttributes.d.ts +33 -0
  65. package/cjs/domain/profiling/transport/buildProfileEventAttributes.js +63 -0
  66. package/cjs/domain/profiling/transport/buildProfileEventAttributes.js.map +1 -0
  67. package/cjs/domain/profiling/types/index.d.ts +2 -0
  68. package/cjs/domain/profiling/types/index.js +3 -0
  69. package/cjs/domain/profiling/types/index.js.map +1 -0
  70. package/cjs/domain/profiling/types/profilerApi.types.d.ts +58 -0
  71. package/cjs/domain/profiling/types/profilerApi.types.js +5 -0
  72. package/cjs/domain/profiling/types/profilerApi.types.js.map +1 -0
  73. package/cjs/domain/profiling/types/rumProfiler.types.d.ts +55 -0
  74. package/cjs/domain/profiling/types/rumProfiler.types.js +3 -0
  75. package/cjs/domain/profiling/types/rumProfiler.types.js.map +1 -0
  76. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +1 -0
  77. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js +7 -0
  78. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -0
  79. package/cjs/domain/profiling/utils/getDefaultViewName.d.ts +1 -0
  80. package/cjs/domain/profiling/utils/getDefaultViewName.js +14 -0
  81. package/cjs/domain/profiling/utils/getDefaultViewName.js.map +1 -0
  82. package/cjs/domain/profiling/utils/getNumberOfSamples.d.ts +8 -0
  83. package/cjs/domain/profiling/utils/getNumberOfSamples.js +19 -0
  84. package/cjs/domain/profiling/utils/getNumberOfSamples.js.map +1 -0
  85. package/cjs/domain/profiling/vitalHistory.d.ts +10 -0
  86. package/cjs/domain/profiling/vitalHistory.js +42 -0
  87. package/cjs/domain/profiling/vitalHistory.js.map +1 -0
  88. package/cjs/domain/record/assembly.d.ts +3 -0
  89. package/cjs/domain/record/assembly.js +16 -0
  90. package/cjs/domain/record/assembly.js.map +1 -0
  91. package/cjs/domain/record/elementsScrollPositions.d.ts +10 -0
  92. package/cjs/domain/record/elementsScrollPositions.js +23 -0
  93. package/cjs/domain/record/elementsScrollPositions.js.map +1 -0
  94. package/cjs/domain/record/eventsUtils.d.ts +2 -0
  95. package/cjs/domain/record/eventsUtils.js +15 -0
  96. package/cjs/domain/record/eventsUtils.js.map +1 -0
  97. package/cjs/domain/record/index.d.ts +6 -0
  98. package/cjs/domain/record/index.js +17 -0
  99. package/cjs/domain/record/index.js.map +1 -0
  100. package/cjs/domain/record/internalApi.d.ts +22 -0
  101. package/cjs/domain/record/internalApi.js +55 -0
  102. package/cjs/domain/record/internalApi.js.map +1 -0
  103. package/cjs/domain/record/itemIds.d.ts +40 -0
  104. package/cjs/domain/record/itemIds.js +58 -0
  105. package/cjs/domain/record/itemIds.js.map +1 -0
  106. package/cjs/domain/record/mutationBatch.d.ts +12 -0
  107. package/cjs/domain/record/mutationBatch.js +44 -0
  108. package/cjs/domain/record/mutationBatch.js.map +1 -0
  109. package/cjs/domain/record/record.d.ts +16 -0
  110. package/cjs/domain/record/record.js +88 -0
  111. package/cjs/domain/record/record.js.map +1 -0
  112. package/cjs/domain/record/record.types.d.ts +18 -0
  113. package/cjs/domain/record/record.types.js +3 -0
  114. package/cjs/domain/record/record.types.js.map +1 -0
  115. package/cjs/domain/record/recordingScope.d.ts +24 -0
  116. package/cjs/domain/record/recordingScope.js +29 -0
  117. package/cjs/domain/record/recordingScope.js.map +1 -0
  118. package/cjs/domain/record/serialization/changeEncoder.d.ts +22 -0
  119. package/cjs/domain/record/serialization/changeEncoder.js +59 -0
  120. package/cjs/domain/record/serialization/changeEncoder.js.map +1 -0
  121. package/cjs/domain/record/serialization/conversions/changeConverter.d.ts +10 -0
  122. package/cjs/domain/record/serialization/conversions/changeConverter.js +216 -0
  123. package/cjs/domain/record/serialization/conversions/changeConverter.js.map +1 -0
  124. package/cjs/domain/record/serialization/conversions/changeDecoder.d.ts +16 -0
  125. package/cjs/domain/record/serialization/conversions/changeDecoder.js +137 -0
  126. package/cjs/domain/record/serialization/conversions/changeDecoder.js.map +1 -0
  127. package/cjs/domain/record/serialization/conversions/index.d.ts +7 -0
  128. package/cjs/domain/record/serialization/conversions/index.js +11 -0
  129. package/cjs/domain/record/serialization/conversions/index.js.map +1 -0
  130. package/cjs/domain/record/serialization/conversions/mutationLog.d.ts +15 -0
  131. package/cjs/domain/record/serialization/conversions/mutationLog.js +36 -0
  132. package/cjs/domain/record/serialization/conversions/mutationLog.js.map +1 -0
  133. package/cjs/domain/record/serialization/conversions/nodeIdRemapper.d.ts +10 -0
  134. package/cjs/domain/record/serialization/conversions/nodeIdRemapper.js +53 -0
  135. package/cjs/domain/record/serialization/conversions/nodeIdRemapper.js.map +1 -0
  136. package/cjs/domain/record/serialization/conversions/renderOptions.d.ts +6 -0
  137. package/cjs/domain/record/serialization/conversions/renderOptions.js +12 -0
  138. package/cjs/domain/record/serialization/conversions/renderOptions.js.map +1 -0
  139. package/cjs/domain/record/serialization/conversions/stringTable.d.ts +5 -0
  140. package/cjs/domain/record/serialization/conversions/stringTable.js +22 -0
  141. package/cjs/domain/record/serialization/conversions/stringTable.js.map +1 -0
  142. package/cjs/domain/record/serialization/conversions/vDocument.d.ts +23 -0
  143. package/cjs/domain/record/serialization/conversions/vDocument.js +176 -0
  144. package/cjs/domain/record/serialization/conversions/vDocument.js.map +1 -0
  145. package/cjs/domain/record/serialization/conversions/vNode.d.ts +66 -0
  146. package/cjs/domain/record/serialization/conversions/vNode.js +285 -0
  147. package/cjs/domain/record/serialization/conversions/vNode.js.map +1 -0
  148. package/cjs/domain/record/serialization/conversions/vStyleSheet.d.ts +16 -0
  149. package/cjs/domain/record/serialization/conversions/vStyleSheet.js +29 -0
  150. package/cjs/domain/record/serialization/conversions/vStyleSheet.js.map +1 -0
  151. package/cjs/domain/record/serialization/experimentalFeatures.d.ts +2 -0
  152. package/cjs/domain/record/serialization/experimentalFeatures.js +16 -0
  153. package/cjs/domain/record/serialization/experimentalFeatures.js.map +1 -0
  154. package/cjs/domain/record/serialization/index.d.ts +17 -0
  155. package/cjs/domain/record/serialization/index.js +37 -0
  156. package/cjs/domain/record/serialization/index.js.map +1 -0
  157. package/cjs/domain/record/serialization/insertionCursor.d.ts +57 -0
  158. package/cjs/domain/record/serialization/insertionCursor.js +68 -0
  159. package/cjs/domain/record/serialization/insertionCursor.js.map +1 -0
  160. package/cjs/domain/record/serialization/serialization.types.d.ts +24 -0
  161. package/cjs/domain/record/serialization/serialization.types.js +3 -0
  162. package/cjs/domain/record/serialization/serialization.types.js.map +1 -0
  163. package/cjs/domain/record/serialization/serializationStats.d.ts +12 -0
  164. package/cjs/domain/record/serialization/serializationStats.js +32 -0
  165. package/cjs/domain/record/serialization/serializationStats.js.map +1 -0
  166. package/cjs/domain/record/serialization/serializationTransaction.d.ts +96 -0
  167. package/cjs/domain/record/serialization/serializationTransaction.js +103 -0
  168. package/cjs/domain/record/serialization/serializationTransaction.js.map +1 -0
  169. package/cjs/domain/record/serialization/serializationUtils.d.ts +18 -0
  170. package/cjs/domain/record/serialization/serializationUtils.js +88 -0
  171. package/cjs/domain/record/serialization/serializationUtils.js.map +1 -0
  172. package/cjs/domain/record/serialization/serializeAttribute.d.ts +4 -0
  173. package/cjs/domain/record/serialization/serializeAttribute.js +42 -0
  174. package/cjs/domain/record/serialization/serializeAttribute.js.map +1 -0
  175. package/cjs/domain/record/serialization/serializeAttributes.d.ts +7 -0
  176. package/cjs/domain/record/serialization/serializeAttributes.js +167 -0
  177. package/cjs/domain/record/serialization/serializeAttributes.js.map +1 -0
  178. package/cjs/domain/record/serialization/serializeFullSnapshot.d.ts +5 -0
  179. package/cjs/domain/record/serialization/serializeFullSnapshot.js +34 -0
  180. package/cjs/domain/record/serialization/serializeFullSnapshot.js.map +1 -0
  181. package/cjs/domain/record/serialization/serializeFullSnapshotAsChange.d.ts +5 -0
  182. package/cjs/domain/record/serialization/serializeFullSnapshotAsChange.js +13 -0
  183. package/cjs/domain/record/serialization/serializeFullSnapshotAsChange.js.map +1 -0
  184. package/cjs/domain/record/serialization/serializeMutations.d.ts +11 -0
  185. package/cjs/domain/record/serialization/serializeMutations.js +262 -0
  186. package/cjs/domain/record/serialization/serializeMutations.js.map +1 -0
  187. package/cjs/domain/record/serialization/serializeMutationsAsChange.d.ts +5 -0
  188. package/cjs/domain/record/serialization/serializeMutationsAsChange.js +204 -0
  189. package/cjs/domain/record/serialization/serializeMutationsAsChange.js.map +1 -0
  190. package/cjs/domain/record/serialization/serializeNode.d.ts +7 -0
  191. package/cjs/domain/record/serialization/serializeNode.js +154 -0
  192. package/cjs/domain/record/serialization/serializeNode.js.map +1 -0
  193. package/cjs/domain/record/serialization/serializeNodeAsChange.d.ts +4 -0
  194. package/cjs/domain/record/serialization/serializeNodeAsChange.js +153 -0
  195. package/cjs/domain/record/serialization/serializeNodeAsChange.js.map +1 -0
  196. package/cjs/domain/record/serialization/serializeStyleSheets.d.ts +3 -0
  197. package/cjs/domain/record/serialization/serializeStyleSheets.js +30 -0
  198. package/cjs/domain/record/serialization/serializeStyleSheets.js.map +1 -0
  199. package/cjs/domain/record/serializationVerifier.d.ts +18 -0
  200. package/cjs/domain/record/serializationVerifier.js +126 -0
  201. package/cjs/domain/record/serializationVerifier.js.map +1 -0
  202. package/cjs/domain/record/shadowRootsController.d.ts +11 -0
  203. package/cjs/domain/record/shadowRootsController.js +45 -0
  204. package/cjs/domain/record/shadowRootsController.js.map +1 -0
  205. package/cjs/domain/record/startFullSnapshots.d.ts +10 -0
  206. package/cjs/domain/record/startFullSnapshots.js +50 -0
  207. package/cjs/domain/record/startFullSnapshots.js.map +1 -0
  208. package/cjs/domain/record/trackers/index.d.ts +12 -0
  209. package/cjs/domain/record/trackers/index.js +27 -0
  210. package/cjs/domain/record/trackers/index.js.map +1 -0
  211. package/cjs/domain/record/trackers/trackFocus.d.ts +5 -0
  212. package/cjs/domain/record/trackers/trackFocus.js +15 -0
  213. package/cjs/domain/record/trackers/trackFocus.js.map +1 -0
  214. package/cjs/domain/record/trackers/trackFrustration.d.ts +6 -0
  215. package/cjs/domain/record/trackers/trackFrustration.js +31 -0
  216. package/cjs/domain/record/trackers/trackFrustration.js.map +1 -0
  217. package/cjs/domain/record/trackers/trackInput.d.ts +4 -0
  218. package/cjs/domain/record/trackers/trackInput.js +104 -0
  219. package/cjs/domain/record/trackers/trackInput.js.map +1 -0
  220. package/cjs/domain/record/trackers/trackMediaInteraction.d.ts +5 -0
  221. package/cjs/domain/record/trackers/trackMediaInteraction.js +29 -0
  222. package/cjs/domain/record/trackers/trackMediaInteraction.js.map +1 -0
  223. package/cjs/domain/record/trackers/trackMouseInteraction.d.ts +5 -0
  224. package/cjs/domain/record/trackers/trackMouseInteraction.js +59 -0
  225. package/cjs/domain/record/trackers/trackMouseInteraction.js.map +1 -0
  226. package/cjs/domain/record/trackers/trackMove.d.ts +9 -0
  227. package/cjs/domain/record/trackers/trackMove.js +55 -0
  228. package/cjs/domain/record/trackers/trackMove.js.map +1 -0
  229. package/cjs/domain/record/trackers/trackMutation.d.ts +13 -0
  230. package/cjs/domain/record/trackers/trackMutation.js +41 -0
  231. package/cjs/domain/record/trackers/trackMutation.js.map +1 -0
  232. package/cjs/domain/record/trackers/trackScroll.d.ts +5 -0
  233. package/cjs/domain/record/trackers/trackScroll.js +48 -0
  234. package/cjs/domain/record/trackers/trackScroll.js.map +1 -0
  235. package/cjs/domain/record/trackers/trackStyleSheet.d.ts +6 -0
  236. package/cjs/domain/record/trackers/trackStyleSheet.js +89 -0
  237. package/cjs/domain/record/trackers/trackStyleSheet.js.map +1 -0
  238. package/cjs/domain/record/trackers/trackViewEnd.d.ts +5 -0
  239. package/cjs/domain/record/trackers/trackViewEnd.js +20 -0
  240. package/cjs/domain/record/trackers/trackViewEnd.js.map +1 -0
  241. package/cjs/domain/record/trackers/trackViewportResize.d.ts +6 -0
  242. package/cjs/domain/record/trackers/trackViewportResize.js +46 -0
  243. package/cjs/domain/record/trackers/trackViewportResize.js.map +1 -0
  244. package/cjs/domain/record/trackers/tracker.types.d.ts +3 -0
  245. package/cjs/domain/record/trackers/tracker.types.js +3 -0
  246. package/cjs/domain/record/trackers/tracker.types.js.map +1 -0
  247. package/cjs/domain/record/viewports.d.ts +20 -0
  248. package/cjs/domain/record/viewports.js +60 -0
  249. package/cjs/domain/record/viewports.js.map +1 -0
  250. package/cjs/domain/replayStats.d.ts +8 -0
  251. package/cjs/domain/replayStats.js +60 -0
  252. package/cjs/domain/replayStats.js.map +1 -0
  253. package/cjs/domain/scriptLoadingError.d.ts +6 -0
  254. package/cjs/domain/scriptLoadingError.js +26 -0
  255. package/cjs/domain/scriptLoadingError.js.map +1 -0
  256. package/cjs/domain/segmentCollection/buildReplayPayload.d.ts +15 -0
  257. package/cjs/domain/segmentCollection/buildReplayPayload.js +26 -0
  258. package/cjs/domain/segmentCollection/buildReplayPayload.js.map +1 -0
  259. package/cjs/domain/segmentCollection/index.d.ts +4 -0
  260. package/cjs/domain/segmentCollection/index.js +11 -0
  261. package/cjs/domain/segmentCollection/index.js.map +1 -0
  262. package/cjs/domain/segmentCollection/segment.d.ts +16 -0
  263. package/cjs/domain/segmentCollection/segment.js +82 -0
  264. package/cjs/domain/segmentCollection/segment.js.map +1 -0
  265. package/cjs/domain/segmentCollection/segmentCollection.d.ts +31 -0
  266. package/cjs/domain/segmentCollection/segmentCollection.js +113 -0
  267. package/cjs/domain/segmentCollection/segmentCollection.js.map +1 -0
  268. package/cjs/domain/segmentCollection/startSegmentTelemetry.d.ts +6 -0
  269. package/cjs/domain/segmentCollection/startSegmentTelemetry.js +52 -0
  270. package/cjs/domain/segmentCollection/startSegmentTelemetry.js.map +1 -0
  271. package/cjs/domain/startRecordBridge.d.ts +5 -0
  272. package/cjs/domain/startRecordBridge.js +17 -0
  273. package/cjs/domain/startRecordBridge.js.map +1 -0
  274. package/cjs/domain/startRecorderInitTelemetry.d.ts +15 -0
  275. package/cjs/domain/startRecorderInitTelemetry.js +55 -0
  276. package/cjs/domain/startRecorderInitTelemetry.js.map +1 -0
  277. package/cjs/entries/internal.d.ts +11 -0
  278. package/cjs/entries/internal.js +28 -0
  279. package/cjs/entries/internal.js.map +1 -0
  280. package/cjs/entries/internalSynthetics.d.ts +2 -0
  281. package/cjs/entries/internalSynthetics.js +27 -0
  282. package/cjs/entries/internalSynthetics.js.map +1 -0
  283. package/cjs/entries/main.d.ts +23 -0
  284. package/cjs/entries/main.js +35 -0
  285. package/cjs/entries/main.js.map +1 -0
  286. package/cjs/types/index.d.ts +3 -0
  287. package/cjs/types/index.js +18 -0
  288. package/cjs/types/index.js.map +1 -0
  289. package/cjs/types/profiling.d.ts +296 -0
  290. package/cjs/types/profiling.js +6 -0
  291. package/cjs/types/profiling.js.map +1 -0
  292. package/cjs/types/sessionReplay.d.ts +934 -0
  293. package/cjs/types/sessionReplay.js +6 -0
  294. package/cjs/types/sessionReplay.js.map +1 -0
  295. package/cjs/types/sessionReplayConstants.d.ts +71 -0
  296. package/cjs/types/sessionReplayConstants.js +67 -0
  297. package/cjs/types/sessionReplayConstants.js.map +1 -0
  298. package/esm/boot/isBrowserSupported.d.ts +4 -0
  299. package/esm/boot/isBrowserSupported.js +14 -0
  300. package/esm/boot/isBrowserSupported.js.map +1 -0
  301. package/esm/boot/lazyLoadProfiler.d.ts +3 -0
  302. package/esm/boot/lazyLoadProfiler.js +19 -0
  303. package/esm/boot/lazyLoadProfiler.js.map +1 -0
  304. package/esm/boot/lazyLoadRecorder.d.ts +3 -0
  305. package/esm/boot/lazyLoadRecorder.js +19 -0
  306. package/esm/boot/lazyLoadRecorder.js.map +1 -0
  307. package/esm/boot/postStartStrategy.d.ts +33 -0
  308. package/esm/boot/postStartStrategy.js +95 -0
  309. package/esm/boot/postStartStrategy.js.map +1 -0
  310. package/esm/boot/preStartStrategy.d.ts +6 -0
  311. package/esm/boot/preStartStrategy.js +21 -0
  312. package/esm/boot/preStartStrategy.js.map +1 -0
  313. package/esm/boot/profilerApi.d.ts +2 -0
  314. package/esm/boot/profilerApi.js +49 -0
  315. package/esm/boot/profilerApi.js.map +1 -0
  316. package/esm/boot/recorderApi.d.ts +3 -0
  317. package/esm/boot/recorderApi.js +68 -0
  318. package/esm/boot/recorderApi.js.map +1 -0
  319. package/esm/boot/startRecording.d.ts +6 -0
  320. package/esm/boot/startRecording.js +42 -0
  321. package/esm/boot/startRecording.js.map +1 -0
  322. package/esm/domain/deflate/deflateEncoder.d.ts +3 -0
  323. package/esm/domain/deflate/deflateEncoder.js +107 -0
  324. package/esm/domain/deflate/deflateEncoder.js.map +1 -0
  325. package/esm/domain/deflate/deflateWorker.d.ts +29 -0
  326. package/esm/domain/deflate/deflateWorker.js +97 -0
  327. package/esm/domain/deflate/deflateWorker.js.map +1 -0
  328. package/esm/domain/deflate/index.d.ts +3 -0
  329. package/esm/domain/deflate/index.js +3 -0
  330. package/esm/domain/deflate/index.js.map +1 -0
  331. package/esm/domain/getSessionReplayLink.d.ts +2 -0
  332. package/esm/domain/getSessionReplayLink.js +32 -0
  333. package/esm/domain/getSessionReplayLink.js.map +1 -0
  334. package/esm/domain/profiling/actionHistory.d.ts +10 -0
  335. package/esm/domain/profiling/actionHistory.js +45 -0
  336. package/esm/domain/profiling/actionHistory.js.map +1 -0
  337. package/esm/domain/profiling/longTaskHistory.d.ts +11 -0
  338. package/esm/domain/profiling/longTaskHistory.js +24 -0
  339. package/esm/domain/profiling/longTaskHistory.js.map +1 -0
  340. package/esm/domain/profiling/profiler.d.ts +7 -0
  341. package/esm/domain/profiling/profiler.js +263 -0
  342. package/esm/domain/profiling/profiler.js.map +1 -0
  343. package/esm/domain/profiling/profilingContext.d.ts +6 -0
  344. package/esm/domain/profiling/profilingContext.js +28 -0
  345. package/esm/domain/profiling/profilingContext.js.map +1 -0
  346. package/esm/domain/profiling/profilingSupported.d.ts +1 -0
  347. package/esm/domain/profiling/profilingSupported.js +8 -0
  348. package/esm/domain/profiling/profilingSupported.js.map +1 -0
  349. package/esm/domain/profiling/test-utils/mockedTrace.d.ts +3 -0
  350. package/esm/domain/profiling/test-utils/mockedTrace.js +54 -0
  351. package/esm/domain/profiling/test-utils/mockedTrace.js.map +1 -0
  352. package/esm/domain/profiling/transport/assembly.d.ts +7 -0
  353. package/esm/domain/profiling/transport/assembly.js +42 -0
  354. package/esm/domain/profiling/transport/assembly.js.map +1 -0
  355. package/esm/domain/profiling/transport/buildProfileEventAttributes.d.ts +33 -0
  356. package/esm/domain/profiling/transport/buildProfileEventAttributes.js +60 -0
  357. package/esm/domain/profiling/transport/buildProfileEventAttributes.js.map +1 -0
  358. package/esm/domain/profiling/types/index.d.ts +2 -0
  359. package/esm/domain/profiling/types/index.js +2 -0
  360. package/esm/domain/profiling/types/index.js.map +1 -0
  361. package/esm/domain/profiling/types/profilerApi.types.d.ts +58 -0
  362. package/esm/domain/profiling/types/profilerApi.types.js +4 -0
  363. package/esm/domain/profiling/types/profilerApi.types.js.map +1 -0
  364. package/esm/domain/profiling/types/rumProfiler.types.d.ts +55 -0
  365. package/esm/domain/profiling/types/rumProfiler.types.js +2 -0
  366. package/esm/domain/profiling/types/rumProfiler.types.js.map +1 -0
  367. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +1 -0
  368. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js +3 -0
  369. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -0
  370. package/esm/domain/profiling/utils/getDefaultViewName.d.ts +1 -0
  371. package/esm/domain/profiling/utils/getDefaultViewName.js +11 -0
  372. package/esm/domain/profiling/utils/getDefaultViewName.js.map +1 -0
  373. package/esm/domain/profiling/utils/getNumberOfSamples.d.ts +8 -0
  374. package/esm/domain/profiling/utils/getNumberOfSamples.js +16 -0
  375. package/esm/domain/profiling/utils/getNumberOfSamples.js.map +1 -0
  376. package/esm/domain/profiling/vitalHistory.d.ts +10 -0
  377. package/esm/domain/profiling/vitalHistory.js +38 -0
  378. package/esm/domain/profiling/vitalHistory.js.map +1 -0
  379. package/esm/domain/record/assembly.d.ts +3 -0
  380. package/esm/domain/record/assembly.js +13 -0
  381. package/esm/domain/record/assembly.js.map +1 -0
  382. package/esm/domain/record/elementsScrollPositions.d.ts +10 -0
  383. package/esm/domain/record/elementsScrollPositions.js +20 -0
  384. package/esm/domain/record/elementsScrollPositions.js.map +1 -0
  385. package/esm/domain/record/eventsUtils.d.ts +2 -0
  386. package/esm/domain/record/eventsUtils.js +11 -0
  387. package/esm/domain/record/eventsUtils.js.map +1 -0
  388. package/esm/domain/record/index.d.ts +6 -0
  389. package/esm/domain/record/index.js +5 -0
  390. package/esm/domain/record/index.js.map +1 -0
  391. package/esm/domain/record/internalApi.d.ts +22 -0
  392. package/esm/domain/record/internalApi.js +51 -0
  393. package/esm/domain/record/internalApi.js.map +1 -0
  394. package/esm/domain/record/itemIds.d.ts +40 -0
  395. package/esm/domain/record/itemIds.js +52 -0
  396. package/esm/domain/record/itemIds.js.map +1 -0
  397. package/esm/domain/record/mutationBatch.d.ts +12 -0
  398. package/esm/domain/record/mutationBatch.js +40 -0
  399. package/esm/domain/record/mutationBatch.js.map +1 -0
  400. package/esm/domain/record/record.d.ts +16 -0
  401. package/esm/domain/record/record.js +52 -0
  402. package/esm/domain/record/record.js.map +1 -0
  403. package/esm/domain/record/record.types.d.ts +18 -0
  404. package/esm/domain/record/record.types.js +2 -0
  405. package/esm/domain/record/record.types.js.map +1 -0
  406. package/esm/domain/record/recordingScope.d.ts +24 -0
  407. package/esm/domain/record/recordingScope.js +26 -0
  408. package/esm/domain/record/recordingScope.js.map +1 -0
  409. package/esm/domain/record/serialization/changeEncoder.d.ts +22 -0
  410. package/esm/domain/record/serialization/changeEncoder.js +56 -0
  411. package/esm/domain/record/serialization/changeEncoder.js.map +1 -0
  412. package/esm/domain/record/serialization/conversions/changeConverter.d.ts +10 -0
  413. package/esm/domain/record/serialization/conversions/changeConverter.js +213 -0
  414. package/esm/domain/record/serialization/conversions/changeConverter.js.map +1 -0
  415. package/esm/domain/record/serialization/conversions/changeDecoder.d.ts +16 -0
  416. package/esm/domain/record/serialization/conversions/changeDecoder.js +134 -0
  417. package/esm/domain/record/serialization/conversions/changeDecoder.js.map +1 -0
  418. package/esm/domain/record/serialization/conversions/index.d.ts +7 -0
  419. package/esm/domain/record/serialization/conversions/index.js +4 -0
  420. package/esm/domain/record/serialization/conversions/index.js.map +1 -0
  421. package/esm/domain/record/serialization/conversions/mutationLog.d.ts +15 -0
  422. package/esm/domain/record/serialization/conversions/mutationLog.js +33 -0
  423. package/esm/domain/record/serialization/conversions/mutationLog.js.map +1 -0
  424. package/esm/domain/record/serialization/conversions/nodeIdRemapper.d.ts +10 -0
  425. package/esm/domain/record/serialization/conversions/nodeIdRemapper.js +49 -0
  426. package/esm/domain/record/serialization/conversions/nodeIdRemapper.js.map +1 -0
  427. package/esm/domain/record/serialization/conversions/renderOptions.d.ts +6 -0
  428. package/esm/domain/record/serialization/conversions/renderOptions.js +9 -0
  429. package/esm/domain/record/serialization/conversions/renderOptions.js.map +1 -0
  430. package/esm/domain/record/serialization/conversions/stringTable.d.ts +5 -0
  431. package/esm/domain/record/serialization/conversions/stringTable.js +19 -0
  432. package/esm/domain/record/serialization/conversions/stringTable.js.map +1 -0
  433. package/esm/domain/record/serialization/conversions/vDocument.d.ts +23 -0
  434. package/esm/domain/record/serialization/conversions/vDocument.js +173 -0
  435. package/esm/domain/record/serialization/conversions/vDocument.js.map +1 -0
  436. package/esm/domain/record/serialization/conversions/vNode.d.ts +66 -0
  437. package/esm/domain/record/serialization/conversions/vNode.js +282 -0
  438. package/esm/domain/record/serialization/conversions/vNode.js.map +1 -0
  439. package/esm/domain/record/serialization/conversions/vStyleSheet.d.ts +16 -0
  440. package/esm/domain/record/serialization/conversions/vStyleSheet.js +26 -0
  441. package/esm/domain/record/serialization/conversions/vStyleSheet.js.map +1 -0
  442. package/esm/domain/record/serialization/experimentalFeatures.d.ts +2 -0
  443. package/esm/domain/record/serialization/experimentalFeatures.js +12 -0
  444. package/esm/domain/record/serialization/experimentalFeatures.js.map +1 -0
  445. package/esm/domain/record/serialization/index.d.ts +17 -0
  446. package/esm/domain/record/serialization/index.js +14 -0
  447. package/esm/domain/record/serialization/index.js.map +1 -0
  448. package/esm/domain/record/serialization/insertionCursor.d.ts +57 -0
  449. package/esm/domain/record/serialization/insertionCursor.js +64 -0
  450. package/esm/domain/record/serialization/insertionCursor.js.map +1 -0
  451. package/esm/domain/record/serialization/serialization.types.d.ts +24 -0
  452. package/esm/domain/record/serialization/serialization.types.js +2 -0
  453. package/esm/domain/record/serialization/serialization.types.js.map +1 -0
  454. package/esm/domain/record/serialization/serializationStats.d.ts +12 -0
  455. package/esm/domain/record/serialization/serializationStats.js +27 -0
  456. package/esm/domain/record/serialization/serializationStats.js.map +1 -0
  457. package/esm/domain/record/serialization/serializationTransaction.d.ts +96 -0
  458. package/esm/domain/record/serialization/serializationTransaction.js +99 -0
  459. package/esm/domain/record/serialization/serializationTransaction.js.map +1 -0
  460. package/esm/domain/record/serialization/serializationUtils.d.ts +18 -0
  461. package/esm/domain/record/serialization/serializationUtils.js +80 -0
  462. package/esm/domain/record/serialization/serializationUtils.js.map +1 -0
  463. package/esm/domain/record/serialization/serializeAttribute.d.ts +4 -0
  464. package/esm/domain/record/serialization/serializeAttribute.js +38 -0
  465. package/esm/domain/record/serialization/serializeAttribute.js.map +1 -0
  466. package/esm/domain/record/serialization/serializeAttributes.d.ts +7 -0
  467. package/esm/domain/record/serialization/serializeAttributes.js +161 -0
  468. package/esm/domain/record/serialization/serializeAttributes.js.map +1 -0
  469. package/esm/domain/record/serialization/serializeFullSnapshot.d.ts +5 -0
  470. package/esm/domain/record/serialization/serializeFullSnapshot.js +31 -0
  471. package/esm/domain/record/serialization/serializeFullSnapshot.js.map +1 -0
  472. package/esm/domain/record/serialization/serializeFullSnapshotAsChange.d.ts +5 -0
  473. package/esm/domain/record/serialization/serializeFullSnapshotAsChange.js +10 -0
  474. package/esm/domain/record/serialization/serializeFullSnapshotAsChange.js.map +1 -0
  475. package/esm/domain/record/serialization/serializeMutations.d.ts +11 -0
  476. package/esm/domain/record/serialization/serializeMutations.js +257 -0
  477. package/esm/domain/record/serialization/serializeMutations.js.map +1 -0
  478. package/esm/domain/record/serialization/serializeMutationsAsChange.d.ts +5 -0
  479. package/esm/domain/record/serialization/serializeMutationsAsChange.js +201 -0
  480. package/esm/domain/record/serialization/serializeMutationsAsChange.js.map +1 -0
  481. package/esm/domain/record/serialization/serializeNode.d.ts +7 -0
  482. package/esm/domain/record/serialization/serializeNode.js +149 -0
  483. package/esm/domain/record/serialization/serializeNode.js.map +1 -0
  484. package/esm/domain/record/serialization/serializeNodeAsChange.d.ts +4 -0
  485. package/esm/domain/record/serialization/serializeNodeAsChange.js +150 -0
  486. package/esm/domain/record/serialization/serializeNodeAsChange.js.map +1 -0
  487. package/esm/domain/record/serialization/serializeStyleSheets.d.ts +3 -0
  488. package/esm/domain/record/serialization/serializeStyleSheets.js +27 -0
  489. package/esm/domain/record/serialization/serializeStyleSheets.js.map +1 -0
  490. package/esm/domain/record/serializationVerifier.d.ts +18 -0
  491. package/esm/domain/record/serializationVerifier.js +123 -0
  492. package/esm/domain/record/serializationVerifier.js.map +1 -0
  493. package/esm/domain/record/shadowRootsController.d.ts +11 -0
  494. package/esm/domain/record/shadowRootsController.js +41 -0
  495. package/esm/domain/record/shadowRootsController.js.map +1 -0
  496. package/esm/domain/record/startFullSnapshots.d.ts +10 -0
  497. package/esm/domain/record/startFullSnapshots.js +46 -0
  498. package/esm/domain/record/startFullSnapshots.js.map +1 -0
  499. package/esm/domain/record/trackers/index.d.ts +12 -0
  500. package/esm/domain/record/trackers/index.js +12 -0
  501. package/esm/domain/record/trackers/index.js.map +1 -0
  502. package/esm/domain/record/trackers/trackFocus.d.ts +5 -0
  503. package/esm/domain/record/trackers/trackFocus.js +12 -0
  504. package/esm/domain/record/trackers/trackFocus.js.map +1 -0
  505. package/esm/domain/record/trackers/trackFrustration.d.ts +6 -0
  506. package/esm/domain/record/trackers/trackFrustration.js +28 -0
  507. package/esm/domain/record/trackers/trackFrustration.js.map +1 -0
  508. package/esm/domain/record/trackers/trackInput.d.ts +4 -0
  509. package/esm/domain/record/trackers/trackInput.js +101 -0
  510. package/esm/domain/record/trackers/trackInput.js.map +1 -0
  511. package/esm/domain/record/trackers/trackMediaInteraction.d.ts +5 -0
  512. package/esm/domain/record/trackers/trackMediaInteraction.js +26 -0
  513. package/esm/domain/record/trackers/trackMediaInteraction.js.map +1 -0
  514. package/esm/domain/record/trackers/trackMouseInteraction.d.ts +5 -0
  515. package/esm/domain/record/trackers/trackMouseInteraction.js +56 -0
  516. package/esm/domain/record/trackers/trackMouseInteraction.js.map +1 -0
  517. package/esm/domain/record/trackers/trackMove.d.ts +9 -0
  518. package/esm/domain/record/trackers/trackMove.js +51 -0
  519. package/esm/domain/record/trackers/trackMove.js.map +1 -0
  520. package/esm/domain/record/trackers/trackMutation.d.ts +13 -0
  521. package/esm/domain/record/trackers/trackMutation.js +38 -0
  522. package/esm/domain/record/trackers/trackMutation.js.map +1 -0
  523. package/esm/domain/record/trackers/trackScroll.d.ts +5 -0
  524. package/esm/domain/record/trackers/trackScroll.js +45 -0
  525. package/esm/domain/record/trackers/trackScroll.js.map +1 -0
  526. package/esm/domain/record/trackers/trackStyleSheet.d.ts +6 -0
  527. package/esm/domain/record/trackers/trackStyleSheet.js +85 -0
  528. package/esm/domain/record/trackers/trackStyleSheet.js.map +1 -0
  529. package/esm/domain/record/trackers/trackViewEnd.d.ts +5 -0
  530. package/esm/domain/record/trackers/trackViewEnd.js +17 -0
  531. package/esm/domain/record/trackers/trackViewEnd.js.map +1 -0
  532. package/esm/domain/record/trackers/trackViewportResize.d.ts +6 -0
  533. package/esm/domain/record/trackers/trackViewportResize.js +42 -0
  534. package/esm/domain/record/trackers/trackViewportResize.js.map +1 -0
  535. package/esm/domain/record/trackers/tracker.types.d.ts +3 -0
  536. package/esm/domain/record/trackers/tracker.types.js +2 -0
  537. package/esm/domain/record/trackers/tracker.types.js.map +1 -0
  538. package/esm/domain/record/viewports.d.ts +20 -0
  539. package/esm/domain/record/viewports.js +55 -0
  540. package/esm/domain/record/viewports.js.map +1 -0
  541. package/esm/domain/replayStats.d.ts +8 -0
  542. package/esm/domain/replayStats.js +51 -0
  543. package/esm/domain/replayStats.js.map +1 -0
  544. package/esm/domain/scriptLoadingError.d.ts +6 -0
  545. package/esm/domain/scriptLoadingError.js +23 -0
  546. package/esm/domain/scriptLoadingError.js.map +1 -0
  547. package/esm/domain/segmentCollection/buildReplayPayload.d.ts +15 -0
  548. package/esm/domain/segmentCollection/buildReplayPayload.js +23 -0
  549. package/esm/domain/segmentCollection/buildReplayPayload.js.map +1 -0
  550. package/esm/domain/segmentCollection/index.d.ts +4 -0
  551. package/esm/domain/segmentCollection/index.js +4 -0
  552. package/esm/domain/segmentCollection/index.js.map +1 -0
  553. package/esm/domain/segmentCollection/segment.d.ts +16 -0
  554. package/esm/domain/segmentCollection/segment.js +46 -0
  555. package/esm/domain/segmentCollection/segment.js.map +1 -0
  556. package/esm/domain/segmentCollection/segmentCollection.d.ts +31 -0
  557. package/esm/domain/segmentCollection/segmentCollection.js +106 -0
  558. package/esm/domain/segmentCollection/segmentCollection.js.map +1 -0
  559. package/esm/domain/segmentCollection/startSegmentTelemetry.d.ts +6 -0
  560. package/esm/domain/segmentCollection/startSegmentTelemetry.js +49 -0
  561. package/esm/domain/segmentCollection/startSegmentTelemetry.js.map +1 -0
  562. package/esm/domain/startRecordBridge.d.ts +5 -0
  563. package/esm/domain/startRecordBridge.js +14 -0
  564. package/esm/domain/startRecordBridge.js.map +1 -0
  565. package/esm/domain/startRecorderInitTelemetry.d.ts +15 -0
  566. package/esm/domain/startRecorderInitTelemetry.js +52 -0
  567. package/esm/domain/startRecorderInitTelemetry.js.map +1 -0
  568. package/esm/entries/internal.d.ts +11 -0
  569. package/esm/entries/internal.js +4 -0
  570. package/esm/entries/internal.js.map +1 -0
  571. package/esm/entries/internalSynthetics.d.ts +2 -0
  572. package/esm/entries/internalSynthetics.js +23 -0
  573. package/esm/entries/internalSynthetics.js.map +1 -0
  574. package/esm/entries/main.d.ts +23 -0
  575. package/esm/entries/main.js +31 -0
  576. package/esm/entries/main.js.map +1 -0
  577. package/esm/types/index.d.ts +3 -0
  578. package/esm/types/index.js +2 -0
  579. package/esm/types/index.js.map +1 -0
  580. package/esm/types/profiling.d.ts +296 -0
  581. package/esm/types/profiling.js +5 -0
  582. package/esm/types/profiling.js.map +1 -0
  583. package/esm/types/sessionReplay.d.ts +934 -0
  584. package/esm/types/sessionReplay.js +5 -0
  585. package/esm/types/sessionReplay.js.map +1 -0
  586. package/esm/types/sessionReplayConstants.d.ts +71 -0
  587. package/esm/types/sessionReplayConstants.js +64 -0
  588. package/esm/types/sessionReplayConstants.js.map +1 -0
  589. package/internal/package.json +6 -0
  590. package/internal-synthetics/package.json +6 -0
  591. package/package.json +52 -0
  592. package/src/boot/isBrowserSupported.ts +14 -0
  593. package/src/boot/lazyLoadProfiler.ts +20 -0
  594. package/src/boot/lazyLoadRecorder.ts +20 -0
  595. package/src/boot/postStartStrategy.ts +176 -0
  596. package/src/boot/preStartStrategy.ts +34 -0
  597. package/src/boot/profilerApi.ts +82 -0
  598. package/src/boot/recorderApi.ts +113 -0
  599. package/src/boot/startRecording.ts +70 -0
  600. package/src/domain/deflate/deflateEncoder.ts +144 -0
  601. package/src/domain/deflate/deflateWorker.ts +152 -0
  602. package/src/domain/deflate/index.ts +9 -0
  603. package/src/domain/getSessionReplayLink.ts +40 -0
  604. package/src/domain/profiling/actionHistory.ts +65 -0
  605. package/src/domain/profiling/longTaskHistory.ts +40 -0
  606. package/src/domain/profiling/profiler.ts +366 -0
  607. package/src/domain/profiling/profilingContext.ts +39 -0
  608. package/src/domain/profiling/profilingSupported.ts +10 -0
  609. package/src/domain/profiling/test-utils/mockedTrace.ts +58 -0
  610. package/src/domain/profiling/transport/assembly.ts +63 -0
  611. package/src/domain/profiling/transport/buildProfileEventAttributes.ts +106 -0
  612. package/src/domain/profiling/types/index.ts +2 -0
  613. package/src/domain/profiling/types/profilerApi.types.ts +87 -0
  614. package/src/domain/profiling/types/rumProfiler.types.ts +62 -0
  615. package/src/domain/profiling/utils/getCustomOrDefaultViewName.ts +4 -0
  616. package/src/domain/profiling/utils/getDefaultViewName.ts +12 -0
  617. package/src/domain/profiling/utils/getNumberOfSamples.ts +17 -0
  618. package/src/domain/profiling/vitalHistory.ts +58 -0
  619. package/src/domain/record/assembly.ts +19 -0
  620. package/src/domain/record/elementsScrollPositions.ts +28 -0
  621. package/src/domain/record/eventsUtils.ts +12 -0
  622. package/src/domain/record/index.ts +12 -0
  623. package/src/domain/record/internalApi.ts +84 -0
  624. package/src/domain/record/itemIds.ts +97 -0
  625. package/src/domain/record/mutationBatch.ts +47 -0
  626. package/src/domain/record/record.ts +90 -0
  627. package/src/domain/record/record.types.ts +22 -0
  628. package/src/domain/record/recordingScope.ts +58 -0
  629. package/src/domain/record/serialization/changeEncoder.ts +89 -0
  630. package/src/domain/record/serialization/conversions/changeConverter.ts +277 -0
  631. package/src/domain/record/serialization/conversions/changeDecoder.ts +192 -0
  632. package/src/domain/record/serialization/conversions/index.ts +7 -0
  633. package/src/domain/record/serialization/conversions/mutationLog.ts +56 -0
  634. package/src/domain/record/serialization/conversions/nodeIdRemapper.ts +69 -0
  635. package/src/domain/record/serialization/conversions/renderOptions.ts +14 -0
  636. package/src/domain/record/serialization/conversions/stringTable.ts +25 -0
  637. package/src/domain/record/serialization/conversions/vDocument.ts +239 -0
  638. package/src/domain/record/serialization/conversions/vNode.ts +417 -0
  639. package/src/domain/record/serialization/conversions/vStyleSheet.ts +47 -0
  640. package/src/domain/record/serialization/experimentalFeatures.ts +15 -0
  641. package/src/domain/record/serialization/index.ts +21 -0
  642. package/src/domain/record/serialization/insertionCursor.ts +131 -0
  643. package/src/domain/record/serialization/serialization.types.ts +38 -0
  644. package/src/domain/record/serialization/serializationStats.ts +43 -0
  645. package/src/domain/record/serialization/serializationTransaction.ts +255 -0
  646. package/src/domain/record/serialization/serializationUtils.ts +103 -0
  647. package/src/domain/record/serialization/serializeAttribute.ts +55 -0
  648. package/src/domain/record/serialization/serializeAttributes.ts +194 -0
  649. package/src/domain/record/serialization/serializeFullSnapshot.ts +46 -0
  650. package/src/domain/record/serialization/serializeFullSnapshotAsChange.ts +33 -0
  651. package/src/domain/record/serialization/serializeMutations.ts +395 -0
  652. package/src/domain/record/serialization/serializeMutationsAsChange.ts +298 -0
  653. package/src/domain/record/serialization/serializeNode.ts +229 -0
  654. package/src/domain/record/serialization/serializeNodeAsChange.ts +237 -0
  655. package/src/domain/record/serialization/serializeStyleSheets.ts +36 -0
  656. package/src/domain/record/serializationVerifier.ts +208 -0
  657. package/src/domain/record/shadowRootsController.ts +62 -0
  658. package/src/domain/record/startFullSnapshots.ts +92 -0
  659. package/src/domain/record/trackers/index.ts +12 -0
  660. package/src/domain/record/trackers/trackFocus.ts +16 -0
  661. package/src/domain/record/trackers/trackFrustration.ts +39 -0
  662. package/src/domain/record/trackers/trackInput.ts +128 -0
  663. package/src/domain/record/trackers/trackMediaInteraction.ts +43 -0
  664. package/src/domain/record/trackers/trackMouseInteraction.ts +74 -0
  665. package/src/domain/record/trackers/trackMove.ts +78 -0
  666. package/src/domain/record/trackers/trackMutation.ts +74 -0
  667. package/src/domain/record/trackers/trackScroll.ts +61 -0
  668. package/src/domain/record/trackers/trackStyleSheet.ts +117 -0
  669. package/src/domain/record/trackers/trackViewEnd.ts +27 -0
  670. package/src/domain/record/trackers/trackViewportResize.ts +69 -0
  671. package/src/domain/record/trackers/tracker.types.ts +3 -0
  672. package/src/domain/record/viewports.ts +68 -0
  673. package/src/domain/replayStats.ts +61 -0
  674. package/src/domain/scriptLoadingError.ts +36 -0
  675. package/src/domain/segmentCollection/buildReplayPayload.ts +52 -0
  676. package/src/domain/segmentCollection/index.ts +4 -0
  677. package/src/domain/segmentCollection/segment.ts +79 -0
  678. package/src/domain/segmentCollection/segmentCollection.ts +200 -0
  679. package/src/domain/segmentCollection/startSegmentTelemetry.ts +91 -0
  680. package/src/domain/startRecordBridge.ts +17 -0
  681. package/src/domain/startRecorderInitTelemetry.ts +90 -0
  682. package/src/entries/internal.ts +18 -0
  683. package/src/entries/internalSynthetics.ts +24 -0
  684. package/src/entries/main.ts +96 -0
  685. package/src/types/index.ts +3 -0
  686. package/src/types/profiling.ts +298 -0
  687. package/src/types/sessionReplay.ts +990 -0
  688. package/src/types/sessionReplayConstants.ts +130 -0
@@ -0,0 +1,237 @@
1
+ import {
2
+ reducePrivacyLevel,
3
+ getNodeSelfPrivacyLevel,
4
+ getTextContent,
5
+ isNodeShadowRoot,
6
+ forEachChildNodes,
7
+ NodePrivacyLevel,
8
+ PRIVACY_ATTR_NAME,
9
+ PRIVACY_ATTR_VALUE_HIDDEN,
10
+ getScrollX,
11
+ getScrollY,
12
+ isElementNode,
13
+ } from '@datadog/browser-rum-core'
14
+ import { MediaInteractionType } from '../../../types'
15
+ import type { NodeId, StyleSheetId } from '../itemIds'
16
+ import type { InsertionCursor } from './insertionCursor'
17
+ import type { ChangeSerializationTransaction } from './serializationTransaction'
18
+ import { serializeDOMAttributes, serializeVirtualAttributes } from './serializeAttributes'
19
+
20
+ export function serializeNodeAsChange(
21
+ cursor: InsertionCursor,
22
+ node: Node,
23
+ parentPrivacyLevel: NodePrivacyLevel,
24
+ transaction: ChangeSerializationTransaction
25
+ ): void {
26
+ // Ignore the children of <style> elements; the CSS rules they contain are already
27
+ // serialized as StyleSheetSnapshots.
28
+ if (node.parentNode?.nodeName === 'STYLE') {
29
+ return
30
+ }
31
+
32
+ let privacyLevel: NodePrivacyLevel
33
+
34
+ const selfPrivacyLevel = getNodeSelfPrivacyLevel(node)
35
+ if (selfPrivacyLevel) {
36
+ privacyLevel = reducePrivacyLevel(selfPrivacyLevel, parentPrivacyLevel)
37
+ } else {
38
+ privacyLevel = parentPrivacyLevel
39
+ }
40
+
41
+ if (privacyLevel === NodePrivacyLevel.HIDDEN) {
42
+ serializeHiddenNodePlaceholder(cursor, node, transaction)
43
+ return
44
+ }
45
+
46
+ // Totally ignore risky or unwanted elements. (e.g. <script>, some <link> and <meta> elements)
47
+ if (privacyLevel === NodePrivacyLevel.IGNORE) {
48
+ return
49
+ }
50
+
51
+ switch (node.nodeType) {
52
+ case node.CDATA_SECTION_NODE:
53
+ serializeCDataNodeAsChange(cursor, node as CDATASection, transaction)
54
+ break
55
+ case node.DOCUMENT_NODE:
56
+ serializeDocumentNodeAsChange(cursor, node as Document, transaction)
57
+ break
58
+ case node.DOCUMENT_FRAGMENT_NODE:
59
+ serializeDocumentFragmentNodeAsChange(cursor, node as DocumentFragment, transaction)
60
+ break
61
+ case node.DOCUMENT_TYPE_NODE:
62
+ serializeDocumentTypeNodeAsChange(cursor, node as DocumentType, transaction)
63
+ break
64
+ case node.ELEMENT_NODE:
65
+ serializeElementNodeAsChange(cursor, node as Element, privacyLevel, transaction)
66
+ break
67
+ case node.TEXT_NODE:
68
+ serializeTextNodeAsChange(cursor, node as Text, privacyLevel, transaction)
69
+ break
70
+ default:
71
+ return
72
+ }
73
+
74
+ // If this node can't have children, we're done.
75
+ switch (node.nodeType) {
76
+ case node.CDATA_SECTION_NODE:
77
+ case node.DOCUMENT_TYPE_NODE:
78
+ case node.TEXT_NODE:
79
+ return
80
+ }
81
+
82
+ cursor.descend()
83
+ forEachChildNodes(node, (childNode) => {
84
+ serializeNodeAsChange(cursor, childNode, privacyLevel, transaction)
85
+ })
86
+ cursor.ascend()
87
+ }
88
+
89
+ function serializeDocumentNodeAsChange(
90
+ cursor: InsertionCursor,
91
+ document: Document,
92
+ transaction: ChangeSerializationTransaction
93
+ ): void {
94
+ const { nodeId, insertionPoint } = cursor.advance(document)
95
+ transaction.addNode(insertionPoint, '#document')
96
+ transaction.setScrollPosition(nodeId, getScrollX(), getScrollY())
97
+ serializeStyleSheetsAsChange(document.adoptedStyleSheets, nodeId, transaction)
98
+ }
99
+
100
+ function serializeDocumentFragmentNodeAsChange(
101
+ cursor: InsertionCursor,
102
+ documentFragment: DocumentFragment,
103
+ transaction: ChangeSerializationTransaction
104
+ ): void {
105
+ const { nodeId, insertionPoint } = cursor.advance(documentFragment)
106
+ const isShadowRoot = isNodeShadowRoot(documentFragment)
107
+ if (!isShadowRoot) {
108
+ transaction.addNode(insertionPoint, '#document-fragment')
109
+ return
110
+ }
111
+
112
+ transaction.addNode(insertionPoint, '#shadow-root')
113
+ transaction.scope.shadowRootsController.addShadowRoot(documentFragment, transaction.scope)
114
+ serializeStyleSheetsAsChange(documentFragment.adoptedStyleSheets, nodeId, transaction)
115
+ }
116
+
117
+ function serializeDocumentTypeNodeAsChange(
118
+ cursor: InsertionCursor,
119
+ documentType: DocumentType,
120
+ transaction: ChangeSerializationTransaction
121
+ ): void {
122
+ const { insertionPoint } = cursor.advance(documentType)
123
+ transaction.addNode(insertionPoint, '#doctype', documentType.name, documentType.publicId, documentType.systemId)
124
+ }
125
+
126
+ function serializeElementNodeAsChange(
127
+ cursor: InsertionCursor,
128
+ element: Element,
129
+ privacyLevel: NodePrivacyLevel,
130
+ transaction: ChangeSerializationTransaction
131
+ ): void {
132
+ const { nodeId, insertionPoint } = cursor.advance(element)
133
+ const domAttributes = Object.entries(serializeDOMAttributes(element, privacyLevel, transaction))
134
+ transaction.addNode(insertionPoint, encodedElementName(element), ...domAttributes)
135
+
136
+ const {
137
+ _cssText: cssText,
138
+ rr_mediaState: mediaState,
139
+ rr_scrollLeft: scrollLeft,
140
+ rr_scrollTop: scrollTop,
141
+ } = serializeVirtualAttributes(element, privacyLevel, transaction)
142
+
143
+ const linkOrStyle = element as HTMLLinkElement | HTMLStyleElement
144
+ if (cssText !== undefined && linkOrStyle.sheet) {
145
+ const sheetId = transaction.scope.styleSheetIds.getOrInsert(linkOrStyle.sheet)
146
+ transaction.addStyleSheet(cssText)
147
+ transaction.attachStyleSheets(nodeId, [sheetId])
148
+ }
149
+
150
+ if (mediaState === 'played') {
151
+ transaction.setMediaPlaybackState(nodeId, MediaInteractionType.Play)
152
+ } else if (mediaState === 'paused') {
153
+ transaction.setMediaPlaybackState(nodeId, MediaInteractionType.Pause)
154
+ }
155
+
156
+ if (scrollLeft !== undefined || scrollTop !== undefined) {
157
+ transaction.setScrollPosition(nodeId, scrollLeft || 0, scrollTop || 0)
158
+ }
159
+ }
160
+
161
+ function serializeTextNodeAsChange(
162
+ cursor: InsertionCursor,
163
+ textNode: Text,
164
+ privacyLevel: NodePrivacyLevel,
165
+ transaction: ChangeSerializationTransaction
166
+ ): void {
167
+ const textContent = getTextContent(textNode, privacyLevel)
168
+ if (textContent === undefined) {
169
+ return
170
+ }
171
+ const { insertionPoint } = cursor.advance(textNode)
172
+ transaction.addNode(insertionPoint, '#text', textContent)
173
+ }
174
+
175
+ function serializeCDataNodeAsChange(
176
+ cursor: InsertionCursor,
177
+ cdataNode: CDATASection,
178
+ transaction: ChangeSerializationTransaction
179
+ ): void {
180
+ const { insertionPoint } = cursor.advance(cdataNode)
181
+ transaction.addNode(insertionPoint, '#cdata-section')
182
+ }
183
+
184
+ function serializeHiddenNodePlaceholder(
185
+ cursor: InsertionCursor,
186
+ node: Node,
187
+ transaction: ChangeSerializationTransaction
188
+ ): void {
189
+ // We only generate placeholders for element nodes; other hidden nodes are simply not
190
+ // serialized.
191
+ if (!isElementNode(node)) {
192
+ return
193
+ }
194
+
195
+ const { nodeId, insertionPoint } = cursor.advance(node)
196
+ transaction.addNode(insertionPoint, encodedElementName(node), [PRIVACY_ATTR_NAME, PRIVACY_ATTR_VALUE_HIDDEN])
197
+ const { width, height } = node.getBoundingClientRect()
198
+ transaction.setSize(nodeId, width, height)
199
+ }
200
+
201
+ function serializeStyleSheetsAsChange(
202
+ sheets: CSSStyleSheet[] | undefined,
203
+ nodeId: NodeId,
204
+ transaction: ChangeSerializationTransaction
205
+ ): void {
206
+ if (!sheets || sheets.length === 0) {
207
+ return undefined
208
+ }
209
+
210
+ transaction.attachStyleSheets(
211
+ nodeId,
212
+ sheets.map((sheet) => serializeStyleSheetAsChange(sheet, transaction))
213
+ )
214
+ }
215
+
216
+ function serializeStyleSheetAsChange(sheet: CSSStyleSheet, transaction: ChangeSerializationTransaction): StyleSheetId {
217
+ const rules = Array.from(sheet.cssRules || sheet.rules, (rule) => rule.cssText)
218
+ const mediaList = sheet.media.length > 0 ? Array.from(sheet.media) : undefined
219
+ transaction.addMetric(
220
+ 'cssText',
221
+ rules.reduce((totalLength, rule) => totalLength + rule.length, 0)
222
+ )
223
+ transaction.addStyleSheet(rules, mediaList, sheet.disabled)
224
+ return transaction.scope.styleSheetIds.getOrInsert(sheet)
225
+ }
226
+
227
+ function encodedElementName(element: Element): Exclude<string, `#${string}`> {
228
+ const nodeName = element.nodeName
229
+ if (isSVGElement(element)) {
230
+ return `svg>${nodeName}`
231
+ }
232
+ return nodeName
233
+ }
234
+
235
+ function isSVGElement(element: Element): element is SVGElement {
236
+ return element.namespaceURI === 'http://www.w3.org/2000/svg'
237
+ }
@@ -0,0 +1,36 @@
1
+ import type { StyleSheet } from '../../../types'
2
+ import type { SerializationTransaction } from './serializationTransaction'
3
+
4
+ export function serializeStyleSheets(
5
+ cssStyleSheets: CSSStyleSheet[] | undefined,
6
+ transaction: SerializationTransaction
7
+ ): StyleSheet[] | undefined {
8
+ if (cssStyleSheets === undefined || cssStyleSheets.length === 0) {
9
+ return undefined
10
+ }
11
+ const serializeStylesheet = (cssStyleSheet: CSSStyleSheet) => {
12
+ const rules = cssStyleSheet.cssRules || cssStyleSheet.rules
13
+ const cssRules = Array.from(rules, (cssRule) => cssRule.cssText)
14
+ transaction.addMetric(
15
+ 'cssText',
16
+ cssRules.reduce((totalLength, rule) => totalLength + rule.length, 0)
17
+ )
18
+
19
+ const styleSheet: StyleSheet = {
20
+ cssRules,
21
+ disabled: cssStyleSheet.disabled || undefined,
22
+ media: cssStyleSheet.media.length > 0 ? Array.from(cssStyleSheet.media) : undefined,
23
+ }
24
+ return styleSheet
25
+ }
26
+ // Safari iOS 16.x implements adoptedStyleSheets as a FrozenArray that:
27
+ // - can't be iterated over through map or for...of
28
+ // - can't be converted to regular array with Array.from
29
+ // - can't be detected with Array.isArray or Object.isFrozen
30
+ // Use index access to avoid the issue
31
+ const styleSheets: StyleSheet[] = []
32
+ for (let index = 0; index < cssStyleSheets.length; index++) {
33
+ styleSheets.push(serializeStylesheet(cssStyleSheets[index]))
34
+ }
35
+ return styleSheets
36
+ }
@@ -0,0 +1,208 @@
1
+ import { noop } from '@datadog/browser-core'
2
+ import { IncrementalSource, RecordType } from '../../types'
3
+ import type {
4
+ AttributeMutation,
5
+ BrowserChangeRecord,
6
+ BrowserFullSnapshotRecord,
7
+ BrowserIncrementalSnapshotRecord,
8
+ BrowserRecord,
9
+ RemovedNodeMutation,
10
+ } from '../../types'
11
+ import type { EmitRecordCallback, SerializeEvent } from './record.types'
12
+ import { createRecordingScope } from './recordingScope'
13
+ import type { RecordingScope } from './recordingScope'
14
+ import type { ShadowRootsController } from './shadowRootsController'
15
+ import {
16
+ createChangeConverter,
17
+ createCopyingNodeIdRemapper,
18
+ serializeFullSnapshotAsChange,
19
+ serializeMutationsAsChange,
20
+ } from './serialization'
21
+ import type { NodeId } from './itemIds'
22
+
23
+ /**
24
+ * SerializationVerifier compares the output of the V1 and Change serialization
25
+ * algorithms. It's designed to seamlessly add verification to existing test suites which
26
+ * are written against the V1 serialization algorithm.
27
+ *
28
+ * To use it, create a SerializationVerifier configured with the same RecordingScope used
29
+ * by the current test. The SerializationVerifier will automatically listen for V1
30
+ * serializations being performed by the test code and will perform the corresponding
31
+ * Change serialization. It will then convert the resulting BrowserChangeRecord to the old
32
+ * V1 format and compare the results to verify that the two algorithms produce the same
33
+ * output.
34
+ */
35
+ export interface SerializationVerifier {
36
+ stop(this: void): void
37
+ }
38
+
39
+ export type OnVerificationError = (message: string, context?: any) => void
40
+
41
+ export function createSerializationVerifier(
42
+ scope: RecordingScope,
43
+ onError: OnVerificationError
44
+ ): SerializationVerifier {
45
+ // Node id numbering differs between the V1 and Change serialization
46
+ // algorithms, so if we want to be able to compare their output, we need to replace the
47
+ // 'input' node ids in each Change record with the 'output' node ids produced by the V1
48
+ // serialization algorithm. This NodeIdRemapper will handle that task.
49
+ const nodeIdRemapper = createCopyingNodeIdRemapper()
50
+ scope.nodeIds = nodeIdRemapper.outputNodeIds
51
+
52
+ // Create a separate recording scope to use for Change serialization.
53
+ const changeScope = createRecordingScope(scope.configuration, scope.elementsScrollPositions, {
54
+ addShadowRoot: noop,
55
+ removeShadowRoot: noop,
56
+ flush: noop,
57
+ stop: noop,
58
+ } as ShadowRootsController)
59
+ changeScope.nodeIds = nodeIdRemapper.inputNodeIds
60
+
61
+ // Create the converter that we'll use to transform the records generated by Change
62
+ // serialization into the V1 format.
63
+ let converter = createChangeConverter()
64
+
65
+ const { unsubscribe } = scope.serializeObservable.subscribe((event: SerializeEvent) => {
66
+ let changeRecord: BrowserRecord | undefined
67
+ const emitRecord: EmitRecordCallback = (record: BrowserRecord): void => {
68
+ changeRecord = record
69
+ }
70
+
71
+ switch (event.type) {
72
+ case 'full':
73
+ // Create a new converter since we've transitioned to a new view.
74
+ converter = createChangeConverter()
75
+
76
+ serializeFullSnapshotAsChange(event.timestamp, event.kind, event.target, emitRecord, noop, changeScope)
77
+ break
78
+
79
+ case 'incremental':
80
+ serializeMutationsAsChange(event.timestamp, event.target, emitRecord, noop, changeScope)
81
+ break
82
+
83
+ default:
84
+ event satisfies never
85
+ return
86
+ }
87
+
88
+ if (!changeRecord) {
89
+ onError('No change record serialized', event)
90
+ return
91
+ }
92
+
93
+ try {
94
+ const v1Record = event.v1
95
+ const convertedChangeRecord = converter.convert(changeRecord as BrowserChangeRecord, {
96
+ nodeIdRemapper,
97
+ timestamp: v1Record.timestamp,
98
+ })
99
+
100
+ verifySnapshotsMatch(v1Record, convertedChangeRecord, onError)
101
+ } catch (error) {
102
+ onError('Error verifying change record', error)
103
+ }
104
+ })
105
+
106
+ return {
107
+ stop: unsubscribe,
108
+ }
109
+ }
110
+
111
+ function verifySnapshotsMatch(
112
+ expectedRecord: BrowserFullSnapshotRecord | BrowserIncrementalSnapshotRecord,
113
+ actualRecord: BrowserFullSnapshotRecord | BrowserIncrementalSnapshotRecord,
114
+ onError: OnVerificationError
115
+ ): void {
116
+ if (
117
+ expectedRecord.type !== RecordType.IncrementalSnapshot ||
118
+ expectedRecord.data.source !== IncrementalSource.Mutation ||
119
+ actualRecord.type !== RecordType.IncrementalSnapshot ||
120
+ actualRecord.data.source !== IncrementalSource.Mutation
121
+ ) {
122
+ // We expect full snapshots to be byte-for-byte equivalent, full stop.
123
+ verifyByteForByteEquivalence('full snapshot', expectedRecord, actualRecord, onError)
124
+ return
125
+ }
126
+
127
+ // Verify that everything but the data is byte-for-byte equivalent.
128
+ verifyByteForByteEquivalence(
129
+ 'incremental snapshot wrapper',
130
+ { ...expectedRecord, data: null },
131
+ { ...actualRecord, data: null },
132
+ onError
133
+ )
134
+
135
+ // Within the data, verify that everything but attribute mutations and node remove
136
+ // mutations are byte-for-byte equivalent.
137
+ verifyByteForByteEquivalence(
138
+ 'incremental snapshot data (without attributes and removes)',
139
+ { ...expectedRecord.data, attributes: null, removes: null },
140
+ { ...actualRecord.data, attributes: null, removes: null },
141
+ onError
142
+ )
143
+
144
+ // Verify that the attribute mutations are byte-for-byte equivalent except for order.
145
+ const orderAttributeMutations = (a: AttributeMutation, b: AttributeMutation): number => a.id - b.id
146
+ verifyByteForByteEquivalence(
147
+ 'incremental snapshot attribute mutations',
148
+ expectedRecord.data.attributes.sort(orderAttributeMutations),
149
+ actualRecord.data.attributes.sort(orderAttributeMutations),
150
+ onError
151
+ )
152
+
153
+ // Gather the set of removes performed by V1 serialization.
154
+ const expectedRemoves = expectedRecord.data.removes
155
+ const expectedRemovedNodes = new Set<NodeId>()
156
+ for (const remove of expectedRemoves) {
157
+ expectedRemovedNodes.add(remove.id as NodeId)
158
+ }
159
+
160
+ // Gather the set of removes performed by Change serialization. Change serialization is
161
+ // more conservative about remove reporting, so it will report some removes that V1
162
+ // serialization deliberately skips. To paper over that difference, we filter out
163
+ // removes that V1 serialization didn't also report.
164
+ const actualRemoves: RemovedNodeMutation[] = actualRecord.data.removes.filter((remove) =>
165
+ expectedRemovedNodes.has(remove.id as NodeId)
166
+ )
167
+
168
+ // Verify that the removes that remain are byte-for-byte equivalent.
169
+ verifyByteForByteEquivalence('incremental snapshot removes', expectedRemoves, actualRemoves, onError)
170
+ }
171
+
172
+ function verifyByteForByteEquivalence(
173
+ context: string,
174
+ expected: unknown,
175
+ actual: unknown,
176
+ onError: OnVerificationError
177
+ ): void {
178
+ const expectedString = JSON.stringify(expected)
179
+ const actualString = JSON.stringify(actual)
180
+ if (actualString !== expectedString) {
181
+ onError('Serialization mismatch', {
182
+ context,
183
+ mismatch: createSerializationMismatchContext(expectedString, actualString),
184
+ })
185
+ }
186
+ }
187
+
188
+ function createSerializationMismatchContext(expected: string, actual: string): Record<string, string> {
189
+ const length = Math.min(expected.length, actual.length)
190
+ try {
191
+ let firstDifferenceIndex = 0
192
+ while (firstDifferenceIndex < length && expected[firstDifferenceIndex] === actual[firstDifferenceIndex]) {
193
+ firstDifferenceIndex++
194
+ }
195
+ return {
196
+ expected: getStringNearPosition(expected, firstDifferenceIndex),
197
+ actual: getStringNearPosition(actual, firstDifferenceIndex),
198
+ }
199
+ } catch (e) {
200
+ return { firstDifferenceError: JSON.stringify(e) }
201
+ }
202
+ }
203
+
204
+ function getStringNearPosition(str: string, index: number): string {
205
+ const leftContextStart = Math.max(index - 50, 0)
206
+ const rightContextEnd = Math.min(index + 150, str.length)
207
+ return `${str.substring(leftContextStart, index)}(!)${str.substring(index, rightContextEnd)}`
208
+ }
@@ -0,0 +1,62 @@
1
+ import type { RecordingScope } from './recordingScope.ts'
2
+ import type { EmitRecordCallback, EmitStatsCallback } from './record.types'
3
+ import { trackInput, trackMutation, trackScroll } from './trackers'
4
+
5
+ interface ShadowRootController {
6
+ stop: () => void
7
+ flush: () => void
8
+ }
9
+
10
+ export type AddShadowRootCallBack = (shadowRoot: ShadowRoot, scope: RecordingScope) => void
11
+ export type RemoveShadowRootCallBack = (shadowRoot: ShadowRoot) => void
12
+
13
+ export interface ShadowRootsController {
14
+ addShadowRoot: AddShadowRootCallBack
15
+ removeShadowRoot: RemoveShadowRootCallBack
16
+ stop: () => void
17
+ flush: () => void
18
+ }
19
+
20
+ export const initShadowRootsController = (
21
+ emitRecord: EmitRecordCallback,
22
+ emitStats: EmitStatsCallback
23
+ ): ShadowRootsController => {
24
+ const controllerByShadowRoot = new Map<ShadowRoot, ShadowRootController>()
25
+
26
+ const shadowRootsController: ShadowRootsController = {
27
+ addShadowRoot: (shadowRoot: ShadowRoot, scope: RecordingScope) => {
28
+ if (controllerByShadowRoot.has(shadowRoot)) {
29
+ return
30
+ }
31
+ const mutationTracker = trackMutation(shadowRoot, emitRecord, emitStats, scope)
32
+ // The change event does not bubble up across the shadow root, we have to listen on the shadow root
33
+ const inputTracker = trackInput(shadowRoot, emitRecord, scope)
34
+ // The scroll event does not bubble up across the shadow root, we have to listen on the shadow root
35
+ const scrollTracker = trackScroll(shadowRoot, emitRecord, scope)
36
+ controllerByShadowRoot.set(shadowRoot, {
37
+ flush: () => mutationTracker.flush(),
38
+ stop: () => {
39
+ mutationTracker.stop()
40
+ inputTracker.stop()
41
+ scrollTracker.stop()
42
+ },
43
+ })
44
+ },
45
+ removeShadowRoot: (shadowRoot: ShadowRoot) => {
46
+ const entry = controllerByShadowRoot.get(shadowRoot)
47
+ if (!entry) {
48
+ // unidentified root cause: observed in some cases with shadow DOM added by browser extensions
49
+ return
50
+ }
51
+ entry.stop()
52
+ controllerByShadowRoot.delete(shadowRoot)
53
+ },
54
+ stop: () => {
55
+ controllerByShadowRoot.forEach(({ stop }) => stop())
56
+ },
57
+ flush: () => {
58
+ controllerByShadowRoot.forEach(({ flush }) => flush())
59
+ },
60
+ }
61
+ return shadowRootsController
62
+ }
@@ -0,0 +1,92 @@
1
+ import { LifeCycleEventType, getViewportDimension } from '@datadog/browser-rum-core'
2
+ import type { LifeCycle } from '@datadog/browser-rum-core'
3
+ import { timeStampNow } from '@datadog/browser-core'
4
+ import type { TimeStamp } from '@datadog/browser-core'
5
+ import { RecordType } from '../../types'
6
+ import {
7
+ isFullSnapshotChangeRecordsEnabled,
8
+ SerializationKind,
9
+ serializeFullSnapshotAsChange,
10
+ serializeFullSnapshot,
11
+ } from './serialization'
12
+ import { getVisualViewport } from './viewports'
13
+ import type { RecordingScope } from './recordingScope'
14
+ import type { EmitRecordCallback, EmitStatsCallback } from './record.types'
15
+
16
+ export type SerializeFullSnapshotCallback = (
17
+ timestamp: TimeStamp,
18
+ kind: SerializationKind,
19
+ document: Document,
20
+ emitRecord: EmitRecordCallback,
21
+ emitStats: EmitStatsCallback,
22
+ scope: RecordingScope
23
+ ) => void
24
+
25
+ export function startFullSnapshots(
26
+ lifeCycle: LifeCycle,
27
+ emitRecord: EmitRecordCallback,
28
+ emitStats: EmitStatsCallback,
29
+ flushMutations: () => void,
30
+ scope: RecordingScope,
31
+ serialize: SerializeFullSnapshotCallback = defaultSerializeFullSnapshotCallback()
32
+ ) {
33
+ takeFullSnapshot(timeStampNow(), SerializationKind.INITIAL_FULL_SNAPSHOT, emitRecord, emitStats, scope, serialize)
34
+
35
+ const { unsubscribe } = lifeCycle.subscribe(LifeCycleEventType.VIEW_CREATED, (view) => {
36
+ flushMutations()
37
+ takeFullSnapshot(
38
+ view.startClocks.timeStamp,
39
+ SerializationKind.SUBSEQUENT_FULL_SNAPSHOT,
40
+ emitRecord,
41
+ emitStats,
42
+ scope,
43
+ serialize
44
+ )
45
+ })
46
+
47
+ return {
48
+ stop: unsubscribe,
49
+ }
50
+ }
51
+
52
+ export function takeFullSnapshot(
53
+ timestamp: TimeStamp,
54
+ kind: SerializationKind,
55
+ emitRecord: EmitRecordCallback,
56
+ emitStats: EmitStatsCallback,
57
+ scope: RecordingScope,
58
+ serialize: SerializeFullSnapshotCallback = defaultSerializeFullSnapshotCallback()
59
+ ): void {
60
+ const { width, height } = getViewportDimension()
61
+ emitRecord({
62
+ data: {
63
+ height,
64
+ href: window.location.href,
65
+ width,
66
+ },
67
+ type: RecordType.Meta,
68
+ timestamp,
69
+ })
70
+
71
+ emitRecord({
72
+ data: {
73
+ has_focus: document.hasFocus(),
74
+ },
75
+ type: RecordType.Focus,
76
+ timestamp,
77
+ })
78
+
79
+ serialize(timestamp, kind, document, emitRecord, emitStats, scope)
80
+
81
+ if (window.visualViewport) {
82
+ emitRecord({
83
+ data: getVisualViewport(window.visualViewport),
84
+ type: RecordType.VisualViewport,
85
+ timestamp,
86
+ })
87
+ }
88
+ }
89
+
90
+ function defaultSerializeFullSnapshotCallback(): SerializeFullSnapshotCallback {
91
+ return isFullSnapshotChangeRecordsEnabled() ? serializeFullSnapshotAsChange : serializeFullSnapshot
92
+ }
@@ -0,0 +1,12 @@
1
+ export { trackMove } from './trackMove'
2
+ export { trackMouseInteraction } from './trackMouseInteraction'
3
+ export { trackScroll } from './trackScroll'
4
+ export { trackViewportResize, trackVisualViewportResize } from './trackViewportResize'
5
+ export { trackMediaInteraction } from './trackMediaInteraction'
6
+ export { trackStyleSheet } from './trackStyleSheet'
7
+ export { trackFocus } from './trackFocus'
8
+ export { trackFrustration } from './trackFrustration'
9
+ export { trackViewEnd } from './trackViewEnd'
10
+ export { trackInput } from './trackInput'
11
+ export { trackMutation } from './trackMutation'
12
+ export type { Tracker } from './tracker.types'
@@ -0,0 +1,16 @@
1
+ import { DOM_EVENT, addEventListeners, timeStampNow } from '@datadog/browser-core'
2
+ import type { FocusRecord } from '../../../types'
3
+ import { RecordType } from '../../../types'
4
+ import type { RecordingScope } from '../recordingScope'
5
+ import type { EmitRecordCallback } from '../record.types'
6
+ import type { Tracker } from './tracker.types'
7
+
8
+ export function trackFocus(emitRecord: EmitRecordCallback<FocusRecord>, scope: RecordingScope): Tracker {
9
+ return addEventListeners(scope.configuration, window, [DOM_EVENT.FOCUS, DOM_EVENT.BLUR], () => {
10
+ emitRecord({
11
+ data: { has_focus: document.hasFocus() },
12
+ type: RecordType.Focus,
13
+ timestamp: timeStampNow(),
14
+ })
15
+ })
16
+ }