@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,43 @@
1
+ export interface SerializationMetric {
2
+ count: number
3
+ max: number
4
+ sum: number
5
+ }
6
+
7
+ export interface SerializationStats {
8
+ cssText: SerializationMetric
9
+ serializationDuration: SerializationMetric
10
+ }
11
+
12
+ export function createSerializationStats(): SerializationStats {
13
+ return {
14
+ cssText: {
15
+ count: 0,
16
+ max: 0,
17
+ sum: 0,
18
+ },
19
+ serializationDuration: {
20
+ count: 0,
21
+ max: 0,
22
+ sum: 0,
23
+ },
24
+ }
25
+ }
26
+
27
+ export function updateSerializationStats(
28
+ stats: SerializationStats,
29
+ metric: keyof SerializationStats,
30
+ value: number
31
+ ): void {
32
+ stats[metric].count += 1
33
+ stats[metric].max = Math.max(stats[metric].max, value)
34
+ stats[metric].sum += value
35
+ }
36
+
37
+ export function aggregateSerializationStats(aggregateStats: SerializationStats, stats: SerializationStats) {
38
+ for (const metric of ['cssText', 'serializationDuration'] as const) {
39
+ aggregateStats[metric].count += stats[metric].count
40
+ aggregateStats[metric].max = Math.max(aggregateStats[metric].max, stats[metric].max)
41
+ aggregateStats[metric].sum += stats[metric].sum
42
+ }
43
+ }
@@ -0,0 +1,255 @@
1
+ import type { TimeStamp } from '@datadog/browser-core'
2
+ import { elapsed, timeStampNow } from '@datadog/browser-core'
3
+
4
+ import { ChangeType, RecordType } from '../../../types'
5
+ import type {
6
+ AddCDataSectionNodeChange,
7
+ AddDocTypeNodeChange,
8
+ AddDocumentFragmentNodeChange,
9
+ AddDocumentNodeChange,
10
+ AddElementNodeChange,
11
+ AddNodeChange,
12
+ AddShadowRootNodeChange,
13
+ AddTextNodeChange,
14
+ AttachedStyleSheetsChange,
15
+ AttributeChange,
16
+ BrowserRecord,
17
+ InsertionPoint,
18
+ MediaInteractionType,
19
+ StyleSheetMediaList,
20
+ StyleSheetRules,
21
+ } from '../../../types'
22
+ import type { NodeId, StyleSheetId } from '../itemIds'
23
+ import type { EmitRecordCallback, EmitStatsCallback } from '../record.types'
24
+ import type { RecordingScope } from '../recordingScope'
25
+ import type { SerializationStats } from './serializationStats'
26
+ import { createSerializationStats, updateSerializationStats } from './serializationStats'
27
+ import { createChangeEncoder } from './changeEncoder'
28
+
29
+ export type SerializationTransactionCallback = (transaction: SerializationTransaction) => void
30
+
31
+ export const enum SerializationKind {
32
+ INITIAL_FULL_SNAPSHOT,
33
+ SUBSEQUENT_FULL_SNAPSHOT,
34
+ INCREMENTAL_SNAPSHOT,
35
+ }
36
+
37
+ /**
38
+ * A serialization transaction is used to build and emit a sequence of session replay
39
+ * records containing a serialized snapshot of the DOM.
40
+ */
41
+ export interface SerializationTransaction {
42
+ /** Add a record to the transaction. It will be emitted when the transaction ends. */
43
+ add(record: BrowserRecord): void
44
+
45
+ /**
46
+ * Add a metric to the transaction's statistics. The aggregated statistics will be
47
+ * emitted when the transaction ends.
48
+ */
49
+ addMetric(metric: keyof SerializationStats, value: number): void
50
+
51
+ /**
52
+ * Assign and return an id to the given node. If the node has previously been assigned
53
+ * an id, the existing id will be reused.
54
+ */
55
+ assignId(node: Node): NodeId
56
+
57
+ /** The kind of serialization being performed in this transaction. */
58
+ kind: SerializationKind
59
+
60
+ /**
61
+ * A set used to track nodes which have been serialized in the current transaction. If
62
+ * undefined, this feature is disabled; this is the default state in new transactions
63
+ * for performance reasons. Set the property to a non-undefined value if you need this
64
+ * capability.
65
+ */
66
+ serializedNodeIds?: Set<NodeId>
67
+
68
+ /** The recording scope in which this transaction is occurring. */
69
+ scope: RecordingScope
70
+ }
71
+
72
+ /**
73
+ * Perform serialization within a transaction. At the end of the transaction, the
74
+ * generated records and statistics will be emitted.
75
+ */
76
+ export function serializeInTransaction(
77
+ kind: SerializationKind,
78
+ emitRecord: EmitRecordCallback,
79
+ emitStats: EmitStatsCallback,
80
+ scope: RecordingScope,
81
+ serialize: SerializationTransactionCallback
82
+ ): void {
83
+ const records: BrowserRecord[] = []
84
+ const stats = createSerializationStats()
85
+
86
+ const transaction: SerializationTransaction = {
87
+ add(record: BrowserRecord): void {
88
+ records.push(record)
89
+ },
90
+ addMetric(metric: keyof SerializationStats, value: number): void {
91
+ updateSerializationStats(stats, metric, value)
92
+ },
93
+ assignId(node: Node): NodeId {
94
+ const id = scope.nodeIds.getOrInsert(node)
95
+ if (transaction.serializedNodeIds) {
96
+ transaction.serializedNodeIds.add(id)
97
+ }
98
+ return id
99
+ },
100
+ kind,
101
+ scope,
102
+ }
103
+
104
+ const start = timeStampNow()
105
+ serialize(transaction)
106
+ updateSerializationStats(stats, 'serializationDuration', elapsed(start, timeStampNow()))
107
+
108
+ for (const record of records) {
109
+ emitRecord(record)
110
+ }
111
+
112
+ emitStats(stats)
113
+ }
114
+
115
+ type AddNodeParams<NodeChange extends AddNodeChange> = NodeChange extends [any, any, ...infer Params] ? Params : never
116
+
117
+ export type ChangeSerializationTransactionCallback = (transaction: ChangeSerializationTransaction) => void
118
+
119
+ /**
120
+ * ChangeSerializationTransaction is used to build and emit a BrowserChangeRecord
121
+ * containing a serialized snapshot of the DOM. Unlike SerializationTransaction, it
122
+ * doesn't support emitting arbitrary BrowserRecords; instead, the builder methods it
123
+ * exposes are used to construct a single BrowserChangeRecord which is emitted at the end
124
+ * of the transaction.
125
+ */
126
+ export interface ChangeSerializationTransaction {
127
+ /**
128
+ * Add a metric to the transaction's statistics. The aggregated statistics will be
129
+ * emitted when the transaction ends.
130
+ */
131
+ addMetric(metric: keyof SerializationStats, value: number): void
132
+
133
+ /** Add a node to the document at the given insertion point. */
134
+ addNode(pos: InsertionPoint, nodeName: '#cdata-section', ...params: AddNodeParams<AddCDataSectionNodeChange>): void
135
+ addNode(pos: InsertionPoint, nodeName: '#doctype', ...params: AddNodeParams<AddDocTypeNodeChange>): void
136
+ addNode(pos: InsertionPoint, nodeName: '#document', ...params: AddNodeParams<AddDocumentNodeChange>): void
137
+ addNode(
138
+ pos: InsertionPoint,
139
+ nodeName: '#document-fragment',
140
+ ...params: AddNodeParams<AddDocumentFragmentNodeChange>
141
+ ): void
142
+ addNode(pos: InsertionPoint, nodeName: '#shadow-root', ...params: AddNodeParams<AddShadowRootNodeChange>): void
143
+ addNode(pos: InsertionPoint, nodeName: '#text', ...params: AddNodeParams<AddTextNodeChange>): void
144
+ addNode(
145
+ pos: InsertionPoint,
146
+ nodeName: Exclude<string, `#${string}`>,
147
+ ...params: AddNodeParams<AddElementNodeChange>
148
+ ): void
149
+ addNode(pos: InsertionPoint, nodeName: string, ...params: AddNodeParams<AddNodeChange>): void
150
+
151
+ /** Add a stylesheet to the document. */
152
+ addStyleSheet(rules: StyleSheetRules, mediaList?: StyleSheetMediaList, disabled?: boolean): void
153
+
154
+ /**
155
+ * Attach one or more stylesheets to a <link>, <style>, #document, #document-fragment,
156
+ * or #shadow-root node.
157
+ */
158
+ attachStyleSheets(nodeId: NodeId, sheetIds: StyleSheetId[]): void
159
+
160
+ /** Remove a node from the document. */
161
+ removeNode(nodeId: NodeId): void
162
+
163
+ /** Set a node's attributes to the given values. */
164
+ setAttributes(change: AttributeChange): void
165
+
166
+ /** Set the media playback state of an <audio> or <video> element. */
167
+ setMediaPlaybackState(nodeId: NodeId, state: MediaInteractionType): void
168
+
169
+ /** Set the given node's scroll position in CSS pixels. */
170
+ setScrollPosition(nodeId: NodeId, x: number, y: number): void
171
+
172
+ /** Set the given node's size in CSS pixels. */
173
+ setSize(nodeId: NodeId, width: number, height: number): void
174
+
175
+ /** Set the given node's text content. */
176
+ setText(nodeId: NodeId, content: string): void
177
+
178
+ /** The kind of serialization being performed in this transaction. */
179
+ kind: SerializationKind
180
+
181
+ /** The recording scope in which this transaction is occurring. */
182
+ scope: RecordingScope
183
+ }
184
+
185
+ export function serializeChangesInTransaction(
186
+ kind: SerializationKind,
187
+ emitRecord: EmitRecordCallback,
188
+ emitStats: EmitStatsCallback,
189
+ scope: RecordingScope,
190
+ timestamp: TimeStamp,
191
+ serialize: ChangeSerializationTransactionCallback
192
+ ): void {
193
+ const encoder = createChangeEncoder(scope.stringIds)
194
+ const stats = createSerializationStats()
195
+
196
+ const transaction: ChangeSerializationTransaction = {
197
+ addMetric(metric: keyof SerializationStats, value: number): void {
198
+ updateSerializationStats(stats, metric, value)
199
+ },
200
+ addNode(...change): void {
201
+ encoder.add(ChangeType.AddNode, change as AddNodeChange)
202
+ },
203
+ addStyleSheet(rules: StyleSheetRules, mediaList?: StyleSheetMediaList, disabled?: boolean): void {
204
+ if (disabled) {
205
+ encoder.add(ChangeType.AddStyleSheet, [rules, mediaList || [], disabled])
206
+ } else if (mediaList) {
207
+ encoder.add(ChangeType.AddStyleSheet, [rules, mediaList])
208
+ } else {
209
+ encoder.add(ChangeType.AddStyleSheet, [rules])
210
+ }
211
+ },
212
+ attachStyleSheets(nodeId: NodeId, sheetIds: StyleSheetId[]): void {
213
+ const change: AttachedStyleSheetsChange = [nodeId]
214
+ for (const sheetId of sheetIds) {
215
+ change.push(sheetId)
216
+ }
217
+ encoder.add(ChangeType.AttachedStyleSheets, change)
218
+ },
219
+ removeNode(nodeId: NodeId): void {
220
+ encoder.add(ChangeType.RemoveNode, nodeId)
221
+ },
222
+ setAttributes(change: AttributeChange): void {
223
+ encoder.add(ChangeType.Attribute, change)
224
+ },
225
+ setMediaPlaybackState(nodeId: NodeId, state: MediaInteractionType): void {
226
+ encoder.add(ChangeType.MediaPlaybackState, [nodeId, state])
227
+ },
228
+ setScrollPosition(nodeId: NodeId, x: number, y: number): void {
229
+ encoder.add(ChangeType.ScrollPosition, [nodeId, x, y])
230
+ },
231
+ setSize(nodeId: NodeId, width: number, height: number): void {
232
+ encoder.add(ChangeType.Size, [nodeId, width, height])
233
+ },
234
+ setText(nodeId: NodeId, content: string): void {
235
+ encoder.add(ChangeType.Text, [nodeId, content])
236
+ },
237
+ kind,
238
+ scope,
239
+ }
240
+
241
+ const start = timeStampNow()
242
+ serialize(transaction)
243
+ updateSerializationStats(stats, 'serializationDuration', elapsed(start, timeStampNow()))
244
+
245
+ const changes = encoder.flush()
246
+ if (changes.length > 0) {
247
+ emitRecord({
248
+ data: changes,
249
+ type: RecordType.Change,
250
+ timestamp,
251
+ })
252
+ }
253
+
254
+ emitStats(stats)
255
+ }
@@ -0,0 +1,103 @@
1
+ import { buildUrl } from '@datadog/browser-core'
2
+ import { CENSORED_STRING_MARK, shouldMaskNode } from '@datadog/browser-rum-core'
3
+ import type { NodePrivacyLevel } from '@datadog/browser-rum-core'
4
+
5
+ /**
6
+ * Get the element "value" to be serialized as an attribute or an input update record. It respects
7
+ * the input privacy mode of the element.
8
+ * PERFROMANCE OPTIMIZATION: Assumes that privacy level `HIDDEN` is never encountered because of earlier checks.
9
+ */
10
+ export function getElementInputValue(element: Element, nodePrivacyLevel: NodePrivacyLevel) {
11
+ /*
12
+ BROWSER SPEC NOTE: <input>, <select>
13
+ For some <input> elements, the `value` is an exceptional property/attribute that has the
14
+ value synced between el.value and el.getAttribute()
15
+ input[type=button,checkbox,hidden,image,radio,reset,submit]
16
+ */
17
+ const tagName = element.tagName
18
+ const value = (element as HTMLInputElement | HTMLTextAreaElement).value
19
+
20
+ if (shouldMaskNode(element, nodePrivacyLevel)) {
21
+ const type = (element as HTMLInputElement | HTMLTextAreaElement).type
22
+ if (tagName === 'INPUT' && (type === 'button' || type === 'submit' || type === 'reset')) {
23
+ // Overrule `MASK` privacy level for button-like element values, as they are used during replay
24
+ // to display their label. They can still be hidden via the "hidden" privacy attribute or class name.
25
+ return value
26
+ } else if (!value || tagName === 'OPTION') {
27
+ // <Option> value provides no benefit
28
+ return
29
+ }
30
+ return CENSORED_STRING_MARK
31
+ }
32
+
33
+ if (tagName === 'OPTION' || tagName === 'SELECT') {
34
+ return (element as HTMLOptionElement | HTMLSelectElement).value
35
+ }
36
+
37
+ if (tagName !== 'INPUT' && tagName !== 'TEXTAREA') {
38
+ return
39
+ }
40
+
41
+ return value
42
+ }
43
+
44
+ export const URL_IN_CSS_REF = /url\((?:(')([^']*)'|(")([^"]*)"|([^)]*))\)/gm
45
+ export const ABSOLUTE_URL = /^[A-Za-z]+:|^\/\//
46
+ export const DATA_URI = /^["']?data:.*,/i
47
+
48
+ export function switchToAbsoluteUrl(cssText: string, cssHref: string | null): string {
49
+ return cssText.replace(
50
+ URL_IN_CSS_REF,
51
+ (
52
+ matchingSubstring: string,
53
+ singleQuote: string | undefined,
54
+ urlWrappedInSingleQuotes: string | undefined,
55
+ doubleQuote: string | undefined,
56
+ urlWrappedInDoubleQuotes: string | undefined,
57
+ urlNotWrappedInQuotes: string | undefined
58
+ ) => {
59
+ const url = urlWrappedInSingleQuotes || urlWrappedInDoubleQuotes || urlNotWrappedInQuotes
60
+
61
+ if (!cssHref || !url || ABSOLUTE_URL.test(url) || DATA_URI.test(url)) {
62
+ return matchingSubstring
63
+ }
64
+
65
+ const quote = singleQuote || doubleQuote || ''
66
+ return `url(${quote}${makeUrlAbsolute(url, cssHref)}${quote})`
67
+ }
68
+ )
69
+ }
70
+
71
+ function makeUrlAbsolute(url: string, baseUrl: string): string {
72
+ try {
73
+ return buildUrl(url, baseUrl).href
74
+ } catch {
75
+ return url
76
+ }
77
+ }
78
+
79
+ const TAG_NAME_REGEX = /[^a-z1-6-_]/
80
+ export function getValidTagName(tagName: string): string {
81
+ const processedTagName = tagName.toLowerCase().trim()
82
+
83
+ if (TAG_NAME_REGEX.test(processedTagName)) {
84
+ // if the tag name is odd and we cannot extract
85
+ // anything from the string, then we return a
86
+ // generic div
87
+ return 'div'
88
+ }
89
+
90
+ return processedTagName
91
+ }
92
+
93
+ /**
94
+ * Returns the tag name of the given element, normalized to ensure a consistent lowercase
95
+ * representation regardless of whether the element is HTML, XHTML, or SVG.
96
+ */
97
+ export function normalizedTagName(element: Element): string {
98
+ return element.tagName.toLowerCase()
99
+ }
100
+
101
+ export function censoredImageForSize(width: number, height: number) {
102
+ return `data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='${width}' height='${height}' style='background-color:silver'%3E%3C/svg%3E`
103
+ }
@@ -0,0 +1,55 @@
1
+ import {
2
+ NodePrivacyLevel,
3
+ CENSORED_STRING_MARK,
4
+ CENSORED_IMG_MARK,
5
+ sanitizeIfLongDataUrl,
6
+ shouldMaskAttribute,
7
+ } from '@datadog/browser-rum-core'
8
+ import type { RumConfiguration } from '@datadog/browser-rum-core'
9
+ import { censoredImageForSize } from './serializationUtils'
10
+
11
+ // TODO: temporarily bump the Session Replay limit to 1Mb for dataUrls
12
+ // This limit should be removed after [PANA-2843] is implemented
13
+ export const MAX_ATTRIBUTE_VALUE_CHAR_LENGTH = 1_000_000
14
+
15
+ export function serializeAttribute(
16
+ element: Element,
17
+ nodePrivacyLevel: NodePrivacyLevel,
18
+ attributeName: string,
19
+ configuration: RumConfiguration
20
+ ): string | null {
21
+ if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) {
22
+ // dup condition for direct access case
23
+ return null
24
+ }
25
+
26
+ const attributeValue = element.getAttribute(attributeName)
27
+ const tagName = element.tagName
28
+ if (shouldMaskAttribute(tagName, attributeName, attributeValue, nodePrivacyLevel, configuration)) {
29
+ // mask image URLs
30
+ if (tagName === 'IMG') {
31
+ // generate image with similar dimension than the original to have the same rendering behaviour
32
+ const image = element as HTMLImageElement
33
+ if (image.naturalWidth > 0) {
34
+ return censoredImageForSize(image.naturalWidth, image.naturalHeight)
35
+ }
36
+ const { width, height } = element.getBoundingClientRect()
37
+ if (width > 0 || height > 0) {
38
+ return censoredImageForSize(width, height)
39
+ }
40
+ // if we can't get the image size, fallback to the censored image
41
+ return CENSORED_IMG_MARK
42
+ }
43
+ if (tagName === 'SOURCE') {
44
+ return CENSORED_IMG_MARK
45
+ }
46
+
47
+ return CENSORED_STRING_MARK
48
+ }
49
+
50
+ if (!attributeValue) {
51
+ return attributeValue
52
+ }
53
+
54
+ return sanitizeIfLongDataUrl(attributeValue, MAX_ATTRIBUTE_VALUE_CHAR_LENGTH)
55
+ }
@@ -0,0 +1,194 @@
1
+ import { NodePrivacyLevel, shouldMaskNode } from '@datadog/browser-rum-core'
2
+ import { isSafari } from '@datadog/browser-core'
3
+ import { getElementInputValue, normalizedTagName, switchToAbsoluteUrl } from './serializationUtils'
4
+ import { serializeAttribute } from './serializeAttribute'
5
+ import type { ChangeSerializationTransaction, SerializationTransaction } from './serializationTransaction'
6
+ import { SerializationKind } from './serializationTransaction'
7
+ import type { VirtualAttributes } from './serialization.types'
8
+
9
+ export function serializeAttributes(
10
+ element: Element,
11
+ nodePrivacyLevel: NodePrivacyLevel,
12
+ transaction: ChangeSerializationTransaction | SerializationTransaction
13
+ ): Record<string, number | string> {
14
+ return {
15
+ ...serializeDOMAttributes(element, nodePrivacyLevel, transaction),
16
+ ...serializeVirtualAttributes(element, nodePrivacyLevel, transaction),
17
+ }
18
+ }
19
+
20
+ export function serializeDOMAttributes(
21
+ element: Element,
22
+ nodePrivacyLevel: NodePrivacyLevel,
23
+ transaction: ChangeSerializationTransaction | SerializationTransaction
24
+ ): Record<string, string> {
25
+ if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) {
26
+ return {}
27
+ }
28
+
29
+ const attrs: Record<string, string> = {}
30
+ const tagName = normalizedTagName(element)
31
+
32
+ for (let i = 0; i < element.attributes.length; i += 1) {
33
+ const attribute = element.attributes.item(i)!
34
+ const attributeName = attribute.name
35
+ const attributeValue = serializeAttribute(element, nodePrivacyLevel, attributeName, transaction.scope.configuration)
36
+ if (attributeValue !== null) {
37
+ attrs[attributeName] = attributeValue
38
+ }
39
+ }
40
+
41
+ if (
42
+ (element as HTMLInputElement).value &&
43
+ (tagName === 'textarea' || tagName === 'select' || tagName === 'option' || tagName === 'input')
44
+ ) {
45
+ const formValue = getElementInputValue(element, nodePrivacyLevel)
46
+ if (formValue !== undefined) {
47
+ attrs.value = formValue
48
+ }
49
+ }
50
+
51
+ /**
52
+ * <Option> can be selected, which occurs if its `value` matches ancestor `<Select>.value`
53
+ */
54
+ if (tagName === 'option') {
55
+ const optionElement = element as HTMLOptionElement
56
+ if (optionElement.selected && !shouldMaskNode(optionElement, nodePrivacyLevel)) {
57
+ attrs.selected = ''
58
+ } else {
59
+ delete attrs.selected
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Forms: input[type=checkbox,radio]
65
+ * The `checked` property for <input> is a little bit special:
66
+ * 1. el.checked is a setter that returns if truthy.
67
+ * 2. getAttribute returns the string value
68
+ * getAttribute('checked') does not sync with `Element.checked`, so use JS property
69
+ * NOTE: `checked` property exists on `HTMLInputElement`. For serializer assumptions, we check for type=radio|check.
70
+ */
71
+ const inputElement = element as HTMLInputElement
72
+ if (tagName === 'input' && (inputElement.type === 'radio' || inputElement.type === 'checkbox')) {
73
+ if (inputElement.checked && !shouldMaskNode(inputElement, nodePrivacyLevel)) {
74
+ attrs.checked = ''
75
+ } else {
76
+ delete attrs.checked
77
+ }
78
+ }
79
+
80
+ return attrs
81
+ }
82
+
83
+ export function serializeVirtualAttributes(
84
+ element: Element,
85
+ nodePrivacyLevel: NodePrivacyLevel,
86
+ transaction: ChangeSerializationTransaction | SerializationTransaction
87
+ ): VirtualAttributes {
88
+ if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) {
89
+ return {}
90
+ }
91
+
92
+ const attrs: VirtualAttributes = {}
93
+ const doc = element.ownerDocument
94
+ const tagName = normalizedTagName(element)
95
+
96
+ // remote css
97
+ if (tagName === 'link') {
98
+ const stylesheet = Array.from(doc.styleSheets).find((s) => s.href === (element as HTMLLinkElement).href)
99
+ const cssText = getCssRulesString(stylesheet)
100
+ if (cssText && stylesheet) {
101
+ transaction.addMetric('cssText', cssText.length)
102
+ attrs._cssText = cssText
103
+ }
104
+ }
105
+
106
+ // dynamic stylesheet
107
+ if (tagName === 'style' && (element as HTMLStyleElement).sheet) {
108
+ const cssText = getCssRulesString((element as HTMLStyleElement).sheet)
109
+ if (cssText) {
110
+ transaction.addMetric('cssText', cssText.length)
111
+ attrs._cssText = cssText
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Serialize the media playback state
117
+ */
118
+ if (tagName === 'audio' || tagName === 'video') {
119
+ const mediaElement = element as HTMLMediaElement
120
+ attrs.rr_mediaState = mediaElement.paused ? 'paused' : 'played'
121
+ }
122
+
123
+ /**
124
+ * Serialize the scroll state for each element only for full snapshot
125
+ */
126
+ let scrollTop: number | undefined
127
+ let scrollLeft: number | undefined
128
+ switch (transaction.kind) {
129
+ case SerializationKind.INITIAL_FULL_SNAPSHOT:
130
+ scrollTop = Math.round(element.scrollTop)
131
+ scrollLeft = Math.round(element.scrollLeft)
132
+ if (scrollTop || scrollLeft) {
133
+ transaction.scope.elementsScrollPositions.set(element, { scrollTop, scrollLeft })
134
+ }
135
+ break
136
+ case SerializationKind.SUBSEQUENT_FULL_SNAPSHOT:
137
+ if (transaction.scope.elementsScrollPositions.has(element)) {
138
+ ;({ scrollTop, scrollLeft } = transaction.scope.elementsScrollPositions.get(element)!)
139
+ }
140
+ break
141
+ }
142
+ if (scrollLeft) {
143
+ attrs.rr_scrollLeft = scrollLeft
144
+ }
145
+ if (scrollTop) {
146
+ attrs.rr_scrollTop = scrollTop
147
+ }
148
+
149
+ return attrs
150
+ }
151
+
152
+ export function getCssRulesString(cssStyleSheet: CSSStyleSheet | undefined | null): string | null {
153
+ if (!cssStyleSheet) {
154
+ return null
155
+ }
156
+ let rules: CSSRuleList | undefined
157
+ try {
158
+ rules = cssStyleSheet.rules || cssStyleSheet.cssRules
159
+ } catch {
160
+ // if css is protected by CORS we cannot access cssRules see: https://www.w3.org/TR/cssom-1/#the-cssstylesheet-interface
161
+ }
162
+ if (!rules) {
163
+ return null
164
+ }
165
+ const styleSheetCssText = Array.from(rules, isSafari() ? getCssRuleStringForSafari : getCssRuleString).join('')
166
+ return switchToAbsoluteUrl(styleSheetCssText, cssStyleSheet.href)
167
+ }
168
+
169
+ function getCssRuleStringForSafari(rule: CSSRule): string {
170
+ // Safari does not escape attribute selectors containing : properly
171
+ // https://bugs.webkit.org/show_bug.cgi?id=184604
172
+ if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {
173
+ // This regex replaces [foo:bar] by [foo\\:bar]
174
+ const escapeColon = /(\[[\w-]+[^\\])(:[^\]]+\])/g
175
+ return rule.cssText.replace(escapeColon, '$1\\$2')
176
+ }
177
+
178
+ return getCssRuleString(rule)
179
+ }
180
+
181
+ function getCssRuleString(rule: CSSRule): string {
182
+ // If it's an @import rule, try to inline sub-rules recursively with `getCssRulesString`. This
183
+ // operation can fail if the imported stylesheet is protected by CORS, in which case we fallback
184
+ // to the @import rule CSS text.
185
+ return (isCSSImportRule(rule) && getCssRulesString(rule.styleSheet)) || rule.cssText
186
+ }
187
+
188
+ function isCSSImportRule(rule: CSSRule): rule is CSSImportRule {
189
+ return 'styleSheet' in rule
190
+ }
191
+
192
+ function isCSSStyleRule(rule: CSSRule): rule is CSSStyleRule {
193
+ return 'selectorText' in rule
194
+ }
@@ -0,0 +1,46 @@
1
+ import { getScrollX, getScrollY } from '@datadog/browser-rum-core'
2
+ import type { TimeStamp } from '@datadog/browser-core'
3
+ import type { BrowserFullSnapshotRecord } from '../../../types'
4
+ import { RecordType } from '../../../types'
5
+ import type { EmitRecordCallback, EmitStatsCallback } from '../record.types'
6
+ import type { RecordingScope } from '../recordingScope'
7
+ import { serializeNode } from './serializeNode'
8
+ import { serializeInTransaction } from './serializationTransaction'
9
+ import type { SerializationKind, SerializationTransaction } from './serializationTransaction'
10
+
11
+ export function serializeFullSnapshot(
12
+ timestamp: TimeStamp,
13
+ kind: SerializationKind,
14
+ document: Document,
15
+ emitRecord: EmitRecordCallback,
16
+ emitStats: EmitStatsCallback,
17
+ scope: RecordingScope
18
+ ): void {
19
+ serializeInTransaction(kind, emitRecord, emitStats, scope, (transaction: SerializationTransaction) => {
20
+ const defaultPrivacyLevel = transaction.scope.configuration.defaultPrivacyLevel
21
+
22
+ // We are sure that Documents are never ignored, so this function never returns null.
23
+ const node = serializeNode(document, defaultPrivacyLevel, transaction)!
24
+
25
+ const record: BrowserFullSnapshotRecord = {
26
+ data: {
27
+ node,
28
+ initialOffset: {
29
+ left: getScrollX(),
30
+ top: getScrollY(),
31
+ },
32
+ },
33
+ type: RecordType.FullSnapshot,
34
+ timestamp,
35
+ }
36
+ transaction.add(record)
37
+
38
+ scope.serializeObservable.notify({
39
+ type: 'full',
40
+ kind,
41
+ target: document,
42
+ timestamp,
43
+ v1: record,
44
+ })
45
+ })
46
+ }