@kubesense/kubesense-browser-rum 1.0.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.
- package/LICENSE +201 -0
- package/README.md +34 -0
- package/bundle/chunks/profiler-b64730a2109c3ddbc539-kubesense-rum.js +1 -0
- package/bundle/chunks/recorder-9ae532a18bac5f4280da-kubesense-rum.js +1 -0
- package/bundle/kubesense-rum.js +1 -0
- package/cjs/boot/isBrowserSupported.d.ts +4 -0
- package/cjs/boot/isBrowserSupported.js +17 -0
- package/cjs/boot/isBrowserSupported.js.map +1 -0
- package/cjs/boot/lazyLoadProfiler.d.ts +4 -0
- package/cjs/boot/lazyLoadProfiler.js +54 -0
- package/cjs/boot/lazyLoadProfiler.js.map +1 -0
- package/cjs/boot/lazyLoadRecorder.d.ts +4 -0
- package/cjs/boot/lazyLoadRecorder.js +54 -0
- package/cjs/boot/lazyLoadRecorder.js.map +1 -0
- package/cjs/boot/postStartStrategy.d.ts +33 -0
- package/cjs/boot/postStartStrategy.js +98 -0
- package/cjs/boot/postStartStrategy.js.map +1 -0
- package/cjs/boot/preStartStrategy.d.ts +6 -0
- package/cjs/boot/preStartStrategy.js +24 -0
- package/cjs/boot/preStartStrategy.js.map +1 -0
- package/cjs/boot/profilerApi.d.ts +2 -0
- package/cjs/boot/profilerApi.js +53 -0
- package/cjs/boot/profilerApi.js.map +1 -0
- package/cjs/boot/recorderApi.d.ts +4 -0
- package/cjs/boot/recorderApi.js +73 -0
- package/cjs/boot/recorderApi.js.map +1 -0
- package/cjs/boot/startRecording.d.ts +6 -0
- package/cjs/boot/startRecording.js +45 -0
- package/cjs/boot/startRecording.js.map +1 -0
- package/cjs/domain/deflate/deflateEncoder.d.ts +3 -0
- package/cjs/domain/deflate/deflateEncoder.js +110 -0
- package/cjs/domain/deflate/deflateEncoder.js.map +1 -0
- package/cjs/domain/deflate/deflateWorker.d.ts +30 -0
- package/cjs/domain/deflate/deflateWorker.js +104 -0
- package/cjs/domain/deflate/deflateWorker.js.map +1 -0
- package/cjs/domain/deflate/index.d.ts +3 -0
- package/cjs/domain/deflate/index.js +10 -0
- package/cjs/domain/deflate/index.js.map +1 -0
- package/cjs/domain/getSessionReplayLink.d.ts +2 -0
- package/cjs/domain/getSessionReplayLink.js +35 -0
- package/cjs/domain/getSessionReplayLink.js.map +1 -0
- package/cjs/domain/profiling/profiler.d.ts +7 -0
- package/cjs/domain/profiling/profiler.js +244 -0
- package/cjs/domain/profiling/profiler.js.map +1 -0
- package/cjs/domain/profiling/profilingContext.d.ts +6 -0
- package/cjs/domain/profiling/profilingContext.js +28 -0
- package/cjs/domain/profiling/profilingContext.js.map +1 -0
- package/cjs/domain/profiling/profilingSupported.d.ts +1 -0
- package/cjs/domain/profiling/profilingSupported.js +11 -0
- package/cjs/domain/profiling/profilingSupported.js.map +1 -0
- package/cjs/domain/profiling/test-utils/mockedTrace.d.ts +3 -0
- package/cjs/domain/profiling/test-utils/mockedTrace.js +57 -0
- package/cjs/domain/profiling/test-utils/mockedTrace.js.map +1 -0
- package/cjs/domain/profiling/transport/assembly.d.ts +21 -0
- package/cjs/domain/profiling/transport/assembly.js +45 -0
- package/cjs/domain/profiling/transport/assembly.js.map +1 -0
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.d.ts +25 -0
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.js +50 -0
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.js.map +1 -0
- package/cjs/domain/profiling/types/index.d.ts +2 -0
- package/cjs/domain/profiling/types/index.js +3 -0
- package/cjs/domain/profiling/types/index.js.map +1 -0
- package/cjs/domain/profiling/types/profilerApi.types.d.ts +58 -0
- package/cjs/domain/profiling/types/profilerApi.types.js +5 -0
- package/cjs/domain/profiling/types/profilerApi.types.js.map +1 -0
- package/cjs/domain/profiling/types/rumProfiler.types.d.ts +72 -0
- package/cjs/domain/profiling/types/rumProfiler.types.js +3 -0
- package/cjs/domain/profiling/types/rumProfiler.types.js.map +1 -0
- package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +1 -0
- package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js +7 -0
- package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -0
- package/cjs/domain/profiling/utils/getDefaultViewName.d.ts +1 -0
- package/cjs/domain/profiling/utils/getDefaultViewName.js +14 -0
- package/cjs/domain/profiling/utils/getDefaultViewName.js.map +1 -0
- package/cjs/domain/profiling/utils/getNumberOfSamples.d.ts +7 -0
- package/cjs/domain/profiling/utils/getNumberOfSamples.js +18 -0
- package/cjs/domain/profiling/utils/getNumberOfSamples.js.map +1 -0
- package/cjs/domain/record/assembly.d.ts +2 -0
- package/cjs/domain/record/assembly.js +16 -0
- package/cjs/domain/record/assembly.js.map +1 -0
- package/cjs/domain/record/elementsScrollPositions.d.ts +10 -0
- package/cjs/domain/record/elementsScrollPositions.js +23 -0
- package/cjs/domain/record/elementsScrollPositions.js.map +1 -0
- package/cjs/domain/record/eventIds.d.ts +4 -0
- package/cjs/domain/record/eventIds.js +16 -0
- package/cjs/domain/record/eventIds.js.map +1 -0
- package/cjs/domain/record/eventsUtils.d.ts +2 -0
- package/cjs/domain/record/eventsUtils.js +15 -0
- package/cjs/domain/record/eventsUtils.js.map +1 -0
- package/cjs/domain/record/index.d.ts +7 -0
- package/cjs/domain/record/index.js +17 -0
- package/cjs/domain/record/index.js.map +1 -0
- package/cjs/domain/record/internalApi.d.ts +22 -0
- package/cjs/domain/record/internalApi.js +57 -0
- package/cjs/domain/record/internalApi.js.map +1 -0
- package/cjs/domain/record/mutationBatch.d.ts +12 -0
- package/cjs/domain/record/mutationBatch.js +44 -0
- package/cjs/domain/record/mutationBatch.js.map +1 -0
- package/cjs/domain/record/nodeIds.d.ts +15 -0
- package/cjs/domain/record/nodeIds.js +32 -0
- package/cjs/domain/record/nodeIds.js.map +1 -0
- package/cjs/domain/record/record.d.ts +16 -0
- package/cjs/domain/record/record.js +90 -0
- package/cjs/domain/record/record.js.map +1 -0
- package/cjs/domain/record/record.types.d.ts +4 -0
- package/cjs/domain/record/record.types.js +3 -0
- package/cjs/domain/record/record.types.js.map +1 -0
- package/cjs/domain/record/recordingScope.d.ts +19 -0
- package/cjs/domain/record/recordingScope.js +13 -0
- package/cjs/domain/record/recordingScope.js.map +1 -0
- package/cjs/domain/record/serialization/index.d.ts +8 -0
- package/cjs/domain/record/serialization/index.js +18 -0
- package/cjs/domain/record/serialization/index.js.map +1 -0
- package/cjs/domain/record/serialization/serialization.types.d.ts +28 -0
- package/cjs/domain/record/serialization/serialization.types.js +3 -0
- package/cjs/domain/record/serialization/serialization.types.js.map +1 -0
- package/cjs/domain/record/serialization/serializationStats.d.ts +12 -0
- package/cjs/domain/record/serialization/serializationStats.js +32 -0
- package/cjs/domain/record/serialization/serializationStats.js.map +1 -0
- package/cjs/domain/record/serialization/serializationTransaction.d.ts +45 -0
- package/cjs/domain/record/serialization/serializationTransaction.js +38 -0
- package/cjs/domain/record/serialization/serializationTransaction.js.map +1 -0
- package/cjs/domain/record/serialization/serializationUtils.d.ts +18 -0
- package/cjs/domain/record/serialization/serializationUtils.js +88 -0
- package/cjs/domain/record/serialization/serializationUtils.js.map +1 -0
- package/cjs/domain/record/serialization/serializeAttribute.d.ts +4 -0
- package/cjs/domain/record/serialization/serializeAttribute.js +42 -0
- package/cjs/domain/record/serialization/serializeAttribute.js.map +1 -0
- package/cjs/domain/record/serialization/serializeAttributes.d.ts +7 -0
- package/cjs/domain/record/serialization/serializeAttributes.js +167 -0
- package/cjs/domain/record/serialization/serializeAttributes.js.map +1 -0
- package/cjs/domain/record/serialization/serializeDocument.d.ts +3 -0
- package/cjs/domain/record/serialization/serializeDocument.js +11 -0
- package/cjs/domain/record/serialization/serializeDocument.js.map +1 -0
- package/cjs/domain/record/serialization/serializeNode.d.ts +7 -0
- package/cjs/domain/record/serialization/serializeNode.js +154 -0
- package/cjs/domain/record/serialization/serializeNode.js.map +1 -0
- package/cjs/domain/record/serialization/serializeStyleSheets.d.ts +2 -0
- package/cjs/domain/record/serialization/serializeStyleSheets.js +19 -0
- package/cjs/domain/record/serialization/serializeStyleSheets.js.map +1 -0
- package/cjs/domain/record/shadowRootsController.d.ts +11 -0
- package/cjs/domain/record/shadowRootsController.js +45 -0
- package/cjs/domain/record/shadowRootsController.js.map +1 -0
- package/cjs/domain/record/startFullSnapshots.d.ts +9 -0
- package/cjs/domain/record/startFullSnapshots.js +59 -0
- package/cjs/domain/record/startFullSnapshots.js.map +1 -0
- package/cjs/domain/record/trackers/index.d.ts +12 -0
- package/cjs/domain/record/trackers/index.js +27 -0
- package/cjs/domain/record/trackers/index.js.map +1 -0
- package/cjs/domain/record/trackers/trackFocus.d.ts +5 -0
- package/cjs/domain/record/trackers/trackFocus.js +15 -0
- package/cjs/domain/record/trackers/trackFocus.js.map +1 -0
- package/cjs/domain/record/trackers/trackFrustration.d.ts +7 -0
- package/cjs/domain/record/trackers/trackFrustration.js +31 -0
- package/cjs/domain/record/trackers/trackFrustration.js.map +1 -0
- package/cjs/domain/record/trackers/trackInput.d.ts +4 -0
- package/cjs/domain/record/trackers/trackInput.js +104 -0
- package/cjs/domain/record/trackers/trackInput.js.map +1 -0
- package/cjs/domain/record/trackers/trackMediaInteraction.d.ts +5 -0
- package/cjs/domain/record/trackers/trackMediaInteraction.js +29 -0
- package/cjs/domain/record/trackers/trackMediaInteraction.js.map +1 -0
- package/cjs/domain/record/trackers/trackMouseInteraction.d.ts +5 -0
- package/cjs/domain/record/trackers/trackMouseInteraction.js +59 -0
- package/cjs/domain/record/trackers/trackMouseInteraction.js.map +1 -0
- package/cjs/domain/record/trackers/trackMove.d.ts +9 -0
- package/cjs/domain/record/trackers/trackMove.js +55 -0
- package/cjs/domain/record/trackers/trackMove.js.map +1 -0
- package/cjs/domain/record/trackers/trackMutation.d.ts +11 -0
- package/cjs/domain/record/trackers/trackMutation.js +270 -0
- package/cjs/domain/record/trackers/trackMutation.js.map +1 -0
- package/cjs/domain/record/trackers/trackScroll.d.ts +5 -0
- package/cjs/domain/record/trackers/trackScroll.js +48 -0
- package/cjs/domain/record/trackers/trackScroll.js.map +1 -0
- package/cjs/domain/record/trackers/trackStyleSheet.d.ts +6 -0
- package/cjs/domain/record/trackers/trackStyleSheet.js +89 -0
- package/cjs/domain/record/trackers/trackStyleSheet.js.map +1 -0
- package/cjs/domain/record/trackers/trackViewEnd.d.ts +5 -0
- package/cjs/domain/record/trackers/trackViewEnd.js +20 -0
- package/cjs/domain/record/trackers/trackViewEnd.js.map +1 -0
- package/cjs/domain/record/trackers/trackViewportResize.d.ts +6 -0
- package/cjs/domain/record/trackers/trackViewportResize.js +46 -0
- package/cjs/domain/record/trackers/trackViewportResize.js.map +1 -0
- package/cjs/domain/record/trackers/tracker.types.d.ts +3 -0
- package/cjs/domain/record/trackers/tracker.types.js +3 -0
- package/cjs/domain/record/trackers/tracker.types.js.map +1 -0
- package/cjs/domain/record/viewports.d.ts +20 -0
- package/cjs/domain/record/viewports.js +60 -0
- package/cjs/domain/record/viewports.js.map +1 -0
- package/cjs/domain/replayStats.d.ts +8 -0
- package/cjs/domain/replayStats.js +60 -0
- package/cjs/domain/replayStats.js.map +1 -0
- package/cjs/domain/scriptLoadingError.d.ts +6 -0
- package/cjs/domain/scriptLoadingError.js +26 -0
- package/cjs/domain/scriptLoadingError.js.map +1 -0
- package/cjs/domain/segmentCollection/buildReplayPayload.d.ts +15 -0
- package/cjs/domain/segmentCollection/buildReplayPayload.js +26 -0
- package/cjs/domain/segmentCollection/buildReplayPayload.js.map +1 -0
- package/cjs/domain/segmentCollection/index.d.ts +4 -0
- package/cjs/domain/segmentCollection/index.js +11 -0
- package/cjs/domain/segmentCollection/index.js.map +1 -0
- package/cjs/domain/segmentCollection/segment.d.ts +16 -0
- package/cjs/domain/segmentCollection/segment.js +82 -0
- package/cjs/domain/segmentCollection/segment.js.map +1 -0
- package/cjs/domain/segmentCollection/segmentCollection.d.ts +31 -0
- package/cjs/domain/segmentCollection/segmentCollection.js +113 -0
- package/cjs/domain/segmentCollection/segmentCollection.js.map +1 -0
- package/cjs/domain/segmentCollection/startSegmentTelemetry.d.ts +6 -0
- package/cjs/domain/segmentCollection/startSegmentTelemetry.js +47 -0
- package/cjs/domain/segmentCollection/startSegmentTelemetry.js.map +1 -0
- package/cjs/domain/startRecordBridge.d.ts +5 -0
- package/cjs/domain/startRecordBridge.js +17 -0
- package/cjs/domain/startRecordBridge.js.map +1 -0
- package/cjs/domain/startRecorderInitTelemetry.d.ts +15 -0
- package/cjs/domain/startRecorderInitTelemetry.js +55 -0
- package/cjs/domain/startRecorderInitTelemetry.js.map +1 -0
- package/cjs/entries/internal.d.ts +11 -0
- package/cjs/entries/internal.js +28 -0
- package/cjs/entries/internal.js.map +1 -0
- package/cjs/entries/internalSynthetics.d.ts +2 -0
- package/cjs/entries/internalSynthetics.js +27 -0
- package/cjs/entries/internalSynthetics.js.map +1 -0
- package/cjs/entries/main.d.ts +23 -0
- package/cjs/entries/main.js +35 -0
- package/cjs/entries/main.js.map +1 -0
- package/cjs/types/index.d.ts +2 -0
- package/cjs/types/index.js +18 -0
- package/cjs/types/index.js.map +1 -0
- package/cjs/types/sessionReplay.d.ts +703 -0
- package/cjs/types/sessionReplay.js +7 -0
- package/cjs/types/sessionReplay.js.map +1 -0
- package/cjs/types/sessionReplayConstants.d.ts +49 -0
- package/cjs/types/sessionReplayConstants.js +49 -0
- package/cjs/types/sessionReplayConstants.js.map +1 -0
- package/esm/boot/isBrowserSupported.d.ts +4 -0
- package/esm/boot/isBrowserSupported.js +14 -0
- package/esm/boot/isBrowserSupported.js.map +1 -0
- package/esm/boot/lazyLoadProfiler.d.ts +4 -0
- package/esm/boot/lazyLoadProfiler.js +18 -0
- package/esm/boot/lazyLoadProfiler.js.map +1 -0
- package/esm/boot/lazyLoadRecorder.d.ts +4 -0
- package/esm/boot/lazyLoadRecorder.js +18 -0
- package/esm/boot/lazyLoadRecorder.js.map +1 -0
- package/esm/boot/postStartStrategy.d.ts +33 -0
- package/esm/boot/postStartStrategy.js +95 -0
- package/esm/boot/postStartStrategy.js.map +1 -0
- package/esm/boot/preStartStrategy.d.ts +6 -0
- package/esm/boot/preStartStrategy.js +21 -0
- package/esm/boot/preStartStrategy.js.map +1 -0
- package/esm/boot/profilerApi.d.ts +2 -0
- package/esm/boot/profilerApi.js +50 -0
- package/esm/boot/profilerApi.js.map +1 -0
- package/esm/boot/recorderApi.d.ts +4 -0
- package/esm/boot/recorderApi.js +70 -0
- package/esm/boot/recorderApi.js.map +1 -0
- package/esm/boot/startRecording.d.ts +6 -0
- package/esm/boot/startRecording.js +42 -0
- package/esm/boot/startRecording.js.map +1 -0
- package/esm/domain/deflate/deflateEncoder.d.ts +3 -0
- package/esm/domain/deflate/deflateEncoder.js +107 -0
- package/esm/domain/deflate/deflateEncoder.js.map +1 -0
- package/esm/domain/deflate/deflateWorker.d.ts +30 -0
- package/esm/domain/deflate/deflateWorker.js +97 -0
- package/esm/domain/deflate/deflateWorker.js.map +1 -0
- package/esm/domain/deflate/index.d.ts +3 -0
- package/esm/domain/deflate/index.js +3 -0
- package/esm/domain/deflate/index.js.map +1 -0
- package/esm/domain/getSessionReplayLink.d.ts +2 -0
- package/esm/domain/getSessionReplayLink.js +32 -0
- package/esm/domain/getSessionReplayLink.js.map +1 -0
- package/esm/domain/profiling/profiler.d.ts +7 -0
- package/esm/domain/profiling/profiler.js +240 -0
- package/esm/domain/profiling/profiler.js.map +1 -0
- package/esm/domain/profiling/profilingContext.d.ts +6 -0
- package/esm/domain/profiling/profilingContext.js +25 -0
- package/esm/domain/profiling/profilingContext.js.map +1 -0
- package/esm/domain/profiling/profilingSupported.d.ts +1 -0
- package/esm/domain/profiling/profilingSupported.js +8 -0
- package/esm/domain/profiling/profilingSupported.js.map +1 -0
- package/esm/domain/profiling/test-utils/mockedTrace.d.ts +3 -0
- package/esm/domain/profiling/test-utils/mockedTrace.js +54 -0
- package/esm/domain/profiling/test-utils/mockedTrace.js.map +1 -0
- package/esm/domain/profiling/transport/assembly.d.ts +21 -0
- package/esm/domain/profiling/transport/assembly.js +42 -0
- package/esm/domain/profiling/transport/assembly.js.map +1 -0
- package/esm/domain/profiling/transport/buildProfileEventAttributes.d.ts +25 -0
- package/esm/domain/profiling/transport/buildProfileEventAttributes.js +47 -0
- package/esm/domain/profiling/transport/buildProfileEventAttributes.js.map +1 -0
- package/esm/domain/profiling/types/index.d.ts +2 -0
- package/esm/domain/profiling/types/index.js +2 -0
- package/esm/domain/profiling/types/index.js.map +1 -0
- package/esm/domain/profiling/types/profilerApi.types.d.ts +58 -0
- package/esm/domain/profiling/types/profilerApi.types.js +4 -0
- package/esm/domain/profiling/types/profilerApi.types.js.map +1 -0
- package/esm/domain/profiling/types/rumProfiler.types.d.ts +72 -0
- package/esm/domain/profiling/types/rumProfiler.types.js +2 -0
- package/esm/domain/profiling/types/rumProfiler.types.js.map +1 -0
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +1 -0
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js +3 -0
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -0
- package/esm/domain/profiling/utils/getDefaultViewName.d.ts +1 -0
- package/esm/domain/profiling/utils/getDefaultViewName.js +11 -0
- package/esm/domain/profiling/utils/getDefaultViewName.js.map +1 -0
- package/esm/domain/profiling/utils/getNumberOfSamples.d.ts +7 -0
- package/esm/domain/profiling/utils/getNumberOfSamples.js +15 -0
- package/esm/domain/profiling/utils/getNumberOfSamples.js.map +1 -0
- package/esm/domain/record/assembly.d.ts +2 -0
- package/esm/domain/record/assembly.js +13 -0
- package/esm/domain/record/assembly.js.map +1 -0
- package/esm/domain/record/elementsScrollPositions.d.ts +10 -0
- package/esm/domain/record/elementsScrollPositions.js +20 -0
- package/esm/domain/record/elementsScrollPositions.js.map +1 -0
- package/esm/domain/record/eventIds.d.ts +4 -0
- package/esm/domain/record/eventIds.js +13 -0
- package/esm/domain/record/eventIds.js.map +1 -0
- package/esm/domain/record/eventsUtils.d.ts +2 -0
- package/esm/domain/record/eventsUtils.js +11 -0
- package/esm/domain/record/eventsUtils.js.map +1 -0
- package/esm/domain/record/index.d.ts +7 -0
- package/esm/domain/record/index.js +6 -0
- package/esm/domain/record/index.js.map +1 -0
- package/esm/domain/record/internalApi.d.ts +22 -0
- package/esm/domain/record/internalApi.js +53 -0
- package/esm/domain/record/internalApi.js.map +1 -0
- package/esm/domain/record/mutationBatch.d.ts +12 -0
- package/esm/domain/record/mutationBatch.js +40 -0
- package/esm/domain/record/mutationBatch.js.map +1 -0
- package/esm/domain/record/nodeIds.d.ts +15 -0
- package/esm/domain/record/nodeIds.js +29 -0
- package/esm/domain/record/nodeIds.js.map +1 -0
- package/esm/domain/record/record.d.ts +16 -0
- package/esm/domain/record/record.js +54 -0
- package/esm/domain/record/record.js.map +1 -0
- package/esm/domain/record/record.types.d.ts +4 -0
- package/esm/domain/record/record.types.js +2 -0
- package/esm/domain/record/record.types.js.map +1 -0
- package/esm/domain/record/recordingScope.d.ts +19 -0
- package/esm/domain/record/recordingScope.js +10 -0
- package/esm/domain/record/recordingScope.js.map +1 -0
- package/esm/domain/record/serialization/index.d.ts +8 -0
- package/esm/domain/record/serialization/index.js +7 -0
- package/esm/domain/record/serialization/index.js.map +1 -0
- package/esm/domain/record/serialization/serialization.types.d.ts +28 -0
- package/esm/domain/record/serialization/serialization.types.js +2 -0
- package/esm/domain/record/serialization/serialization.types.js.map +1 -0
- package/esm/domain/record/serialization/serializationStats.d.ts +12 -0
- package/esm/domain/record/serialization/serializationStats.js +27 -0
- package/esm/domain/record/serialization/serializationStats.js.map +1 -0
- package/esm/domain/record/serialization/serializationTransaction.d.ts +45 -0
- package/esm/domain/record/serialization/serializationTransaction.js +35 -0
- package/esm/domain/record/serialization/serializationTransaction.js.map +1 -0
- package/esm/domain/record/serialization/serializationUtils.d.ts +18 -0
- package/esm/domain/record/serialization/serializationUtils.js +80 -0
- package/esm/domain/record/serialization/serializationUtils.js.map +1 -0
- package/esm/domain/record/serialization/serializeAttribute.d.ts +4 -0
- package/esm/domain/record/serialization/serializeAttribute.js +38 -0
- package/esm/domain/record/serialization/serializeAttribute.js.map +1 -0
- package/esm/domain/record/serialization/serializeAttributes.d.ts +7 -0
- package/esm/domain/record/serialization/serializeAttributes.js +161 -0
- package/esm/domain/record/serialization/serializeAttributes.js.map +1 -0
- package/esm/domain/record/serialization/serializeDocument.d.ts +3 -0
- package/esm/domain/record/serialization/serializeDocument.js +8 -0
- package/esm/domain/record/serialization/serializeDocument.js.map +1 -0
- package/esm/domain/record/serialization/serializeNode.d.ts +7 -0
- package/esm/domain/record/serialization/serializeNode.js +149 -0
- package/esm/domain/record/serialization/serializeNode.js.map +1 -0
- package/esm/domain/record/serialization/serializeStyleSheets.d.ts +2 -0
- package/esm/domain/record/serialization/serializeStyleSheets.js +16 -0
- package/esm/domain/record/serialization/serializeStyleSheets.js.map +1 -0
- package/esm/domain/record/shadowRootsController.d.ts +11 -0
- package/esm/domain/record/shadowRootsController.js +41 -0
- package/esm/domain/record/shadowRootsController.js.map +1 -0
- package/esm/domain/record/startFullSnapshots.d.ts +9 -0
- package/esm/domain/record/startFullSnapshots.js +55 -0
- package/esm/domain/record/startFullSnapshots.js.map +1 -0
- package/esm/domain/record/trackers/index.d.ts +12 -0
- package/esm/domain/record/trackers/index.js +12 -0
- package/esm/domain/record/trackers/index.js.map +1 -0
- package/esm/domain/record/trackers/trackFocus.d.ts +5 -0
- package/esm/domain/record/trackers/trackFocus.js +12 -0
- package/esm/domain/record/trackers/trackFocus.js.map +1 -0
- package/esm/domain/record/trackers/trackFrustration.d.ts +7 -0
- package/esm/domain/record/trackers/trackFrustration.js +28 -0
- package/esm/domain/record/trackers/trackFrustration.js.map +1 -0
- package/esm/domain/record/trackers/trackInput.d.ts +4 -0
- package/esm/domain/record/trackers/trackInput.js +101 -0
- package/esm/domain/record/trackers/trackInput.js.map +1 -0
- package/esm/domain/record/trackers/trackMediaInteraction.d.ts +5 -0
- package/esm/domain/record/trackers/trackMediaInteraction.js +26 -0
- package/esm/domain/record/trackers/trackMediaInteraction.js.map +1 -0
- package/esm/domain/record/trackers/trackMouseInteraction.d.ts +5 -0
- package/esm/domain/record/trackers/trackMouseInteraction.js +56 -0
- package/esm/domain/record/trackers/trackMouseInteraction.js.map +1 -0
- package/esm/domain/record/trackers/trackMove.d.ts +9 -0
- package/esm/domain/record/trackers/trackMove.js +51 -0
- package/esm/domain/record/trackers/trackMove.js.map +1 -0
- package/esm/domain/record/trackers/trackMutation.d.ts +11 -0
- package/esm/domain/record/trackers/trackMutation.js +266 -0
- package/esm/domain/record/trackers/trackMutation.js.map +1 -0
- package/esm/domain/record/trackers/trackScroll.d.ts +5 -0
- package/esm/domain/record/trackers/trackScroll.js +45 -0
- package/esm/domain/record/trackers/trackScroll.js.map +1 -0
- package/esm/domain/record/trackers/trackStyleSheet.d.ts +6 -0
- package/esm/domain/record/trackers/trackStyleSheet.js +85 -0
- package/esm/domain/record/trackers/trackStyleSheet.js.map +1 -0
- package/esm/domain/record/trackers/trackViewEnd.d.ts +5 -0
- package/esm/domain/record/trackers/trackViewEnd.js +17 -0
- package/esm/domain/record/trackers/trackViewEnd.js.map +1 -0
- package/esm/domain/record/trackers/trackViewportResize.d.ts +6 -0
- package/esm/domain/record/trackers/trackViewportResize.js +42 -0
- package/esm/domain/record/trackers/trackViewportResize.js.map +1 -0
- package/esm/domain/record/trackers/tracker.types.d.ts +3 -0
- package/esm/domain/record/trackers/tracker.types.js +2 -0
- package/esm/domain/record/trackers/tracker.types.js.map +1 -0
- package/esm/domain/record/viewports.d.ts +20 -0
- package/esm/domain/record/viewports.js +55 -0
- package/esm/domain/record/viewports.js.map +1 -0
- package/esm/domain/replayStats.d.ts +8 -0
- package/esm/domain/replayStats.js +51 -0
- package/esm/domain/replayStats.js.map +1 -0
- package/esm/domain/scriptLoadingError.d.ts +6 -0
- package/esm/domain/scriptLoadingError.js +23 -0
- package/esm/domain/scriptLoadingError.js.map +1 -0
- package/esm/domain/segmentCollection/buildReplayPayload.d.ts +15 -0
- package/esm/domain/segmentCollection/buildReplayPayload.js +23 -0
- package/esm/domain/segmentCollection/buildReplayPayload.js.map +1 -0
- package/esm/domain/segmentCollection/index.d.ts +4 -0
- package/esm/domain/segmentCollection/index.js +4 -0
- package/esm/domain/segmentCollection/index.js.map +1 -0
- package/esm/domain/segmentCollection/segment.d.ts +16 -0
- package/esm/domain/segmentCollection/segment.js +46 -0
- package/esm/domain/segmentCollection/segment.js.map +1 -0
- package/esm/domain/segmentCollection/segmentCollection.d.ts +31 -0
- package/esm/domain/segmentCollection/segmentCollection.js +106 -0
- package/esm/domain/segmentCollection/segmentCollection.js.map +1 -0
- package/esm/domain/segmentCollection/startSegmentTelemetry.d.ts +6 -0
- package/esm/domain/segmentCollection/startSegmentTelemetry.js +44 -0
- package/esm/domain/segmentCollection/startSegmentTelemetry.js.map +1 -0
- package/esm/domain/startRecordBridge.d.ts +5 -0
- package/esm/domain/startRecordBridge.js +14 -0
- package/esm/domain/startRecordBridge.js.map +1 -0
- package/esm/domain/startRecorderInitTelemetry.d.ts +15 -0
- package/esm/domain/startRecorderInitTelemetry.js +52 -0
- package/esm/domain/startRecorderInitTelemetry.js.map +1 -0
- package/esm/entries/internal.d.ts +11 -0
- package/esm/entries/internal.js +4 -0
- package/esm/entries/internal.js.map +1 -0
- package/esm/entries/internalSynthetics.d.ts +2 -0
- package/esm/entries/internalSynthetics.js +23 -0
- package/esm/entries/internalSynthetics.js.map +1 -0
- package/esm/entries/main.d.ts +23 -0
- package/esm/entries/main.js +31 -0
- package/esm/entries/main.js.map +1 -0
- package/esm/types/index.d.ts +2 -0
- package/esm/types/index.js +2 -0
- package/esm/types/index.js.map +1 -0
- package/esm/types/sessionReplay.d.ts +703 -0
- package/esm/types/sessionReplay.js +6 -0
- package/esm/types/sessionReplay.js.map +1 -0
- package/esm/types/sessionReplayConstants.d.ts +49 -0
- package/esm/types/sessionReplayConstants.js +46 -0
- package/esm/types/sessionReplayConstants.js.map +1 -0
- package/internal/package.json +6 -0
- package/internal-synthetics/package.json +6 -0
- package/package.json +40 -0
- package/src/boot/isBrowserSupported.ts +14 -0
- package/src/boot/lazyLoadProfiler.ts +21 -0
- package/src/boot/lazyLoadRecorder.ts +21 -0
- package/src/boot/postStartStrategy.ts +176 -0
- package/src/boot/preStartStrategy.ts +34 -0
- package/src/boot/profilerApi.ts +86 -0
- package/src/boot/recorderApi.ts +124 -0
- package/src/boot/startRecording.ts +70 -0
- package/src/domain/deflate/deflateEncoder.ts +144 -0
- package/src/domain/deflate/deflateWorker.ts +157 -0
- package/src/domain/deflate/index.ts +8 -0
- package/src/domain/getSessionReplayLink.ts +40 -0
- package/src/domain/profiling/profiler.ts +338 -0
- package/src/domain/profiling/profilingContext.ts +34 -0
- package/src/domain/profiling/profilingSupported.ts +10 -0
- package/src/domain/profiling/test-utils/mockedTrace.ts +58 -0
- package/src/domain/profiling/transport/assembly.ts +78 -0
- package/src/domain/profiling/transport/buildProfileEventAttributes.ts +66 -0
- package/src/domain/profiling/types/index.ts +2 -0
- package/src/domain/profiling/types/profilerApi.types.ts +87 -0
- package/src/domain/profiling/types/rumProfiler.types.ts +81 -0
- package/src/domain/profiling/utils/getCustomOrDefaultViewName.ts +4 -0
- package/src/domain/profiling/utils/getDefaultViewName.ts +12 -0
- package/src/domain/profiling/utils/getNumberOfSamples.ts +16 -0
- package/src/domain/record/assembly.ts +17 -0
- package/src/domain/record/elementsScrollPositions.ts +28 -0
- package/src/domain/record/eventIds.ts +17 -0
- package/src/domain/record/eventsUtils.ts +12 -0
- package/src/domain/record/index.ts +7 -0
- package/src/domain/record/internalApi.ts +88 -0
- package/src/domain/record/mutationBatch.ts +47 -0
- package/src/domain/record/nodeIds.ts +46 -0
- package/src/domain/record/record.ts +98 -0
- package/src/domain/record/record.types.ts +5 -0
- package/src/domain/record/recordingScope.ts +36 -0
- package/src/domain/record/serialization/index.ts +8 -0
- package/src/domain/record/serialization/serialization.types.ts +43 -0
- package/src/domain/record/serialization/serializationStats.ts +43 -0
- package/src/domain/record/serialization/serializationTransaction.ts +94 -0
- package/src/domain/record/serialization/serializationUtils.ts +103 -0
- package/src/domain/record/serialization/serializeAttribute.ts +55 -0
- package/src/domain/record/serialization/serializeAttributes.ts +194 -0
- package/src/domain/record/serialization/serializeDocument.ts +13 -0
- package/src/domain/record/serialization/serializeNode.ts +229 -0
- package/src/domain/record/serialization/serializeStyleSheets.ts +18 -0
- package/src/domain/record/shadowRootsController.ts +62 -0
- package/src/domain/record/startFullSnapshots.ts +84 -0
- package/src/domain/record/trackers/index.ts +12 -0
- package/src/domain/record/trackers/trackFocus.ts +16 -0
- package/src/domain/record/trackers/trackFrustration.ts +41 -0
- package/src/domain/record/trackers/trackInput.ts +128 -0
- package/src/domain/record/trackers/trackMediaInteraction.ts +43 -0
- package/src/domain/record/trackers/trackMouseInteraction.ts +74 -0
- package/src/domain/record/trackers/trackMove.ts +78 -0
- package/src/domain/record/trackers/trackMutation.ts +399 -0
- package/src/domain/record/trackers/trackScroll.ts +61 -0
- package/src/domain/record/trackers/trackStyleSheet.ts +117 -0
- package/src/domain/record/trackers/trackViewEnd.ts +27 -0
- package/src/domain/record/trackers/trackViewportResize.ts +69 -0
- package/src/domain/record/trackers/tracker.types.ts +3 -0
- package/src/domain/record/viewports.ts +68 -0
- package/src/domain/replayStats.ts +61 -0
- package/src/domain/scriptLoadingError.ts +36 -0
- package/src/domain/segmentCollection/buildReplayPayload.ts +52 -0
- package/src/domain/segmentCollection/index.ts +4 -0
- package/src/domain/segmentCollection/segment.ts +78 -0
- package/src/domain/segmentCollection/segmentCollection.ts +200 -0
- package/src/domain/segmentCollection/startSegmentTelemetry.ts +82 -0
- package/src/domain/startRecordBridge.ts +17 -0
- package/src/domain/startRecorderInitTelemetry.ts +90 -0
- package/src/entries/internal.ts +18 -0
- package/src/entries/internalSynthetics.ts +24 -0
- package/src/entries/main.ts +95 -0
- package/src/types/index.ts +2 -0
- package/src/types/sessionReplay.ts +734 -0
- package/src/types/sessionReplayConstants.ts +86 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { TimeoutId, ClocksState } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import type { LongTaskContext } from '@kubesense/kubesense-browser-rum-core'
|
|
3
|
+
import type { ProfilerTrace, Profiler } from './profilerApi.types'
|
|
4
|
+
|
|
5
|
+
export interface RumViewEntry {
|
|
6
|
+
/** Detected start time of view */
|
|
7
|
+
readonly startClocks: ClocksState
|
|
8
|
+
/** RUM view id */
|
|
9
|
+
readonly viewId: string
|
|
10
|
+
/** RUM view name */
|
|
11
|
+
readonly viewName: string | undefined
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Additional data recorded during profiling session
|
|
16
|
+
*/
|
|
17
|
+
export interface RumProfilerEnrichmentData {
|
|
18
|
+
/** List of detected long tasks */
|
|
19
|
+
readonly longTasks: LongTaskContext[]
|
|
20
|
+
/** List of detected navigation entries */
|
|
21
|
+
readonly views: RumViewEntry[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface RumProfilerTrace extends ProfilerTrace, RumProfilerEnrichmentData {
|
|
25
|
+
/** High resolution time when profiler trace started, relative to the profiling session's time origin */
|
|
26
|
+
readonly startClocks: ClocksState
|
|
27
|
+
/** High resolution time when profiler trace ended, relative to the profiling session's time origin */
|
|
28
|
+
readonly endClocks: ClocksState
|
|
29
|
+
/** Time origin of the profiling session */
|
|
30
|
+
readonly clocksOrigin: ClocksState
|
|
31
|
+
/** Sample interval in milliseconds */
|
|
32
|
+
readonly sampleInterval: number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Describes profiler session state when it's stopped
|
|
37
|
+
*/
|
|
38
|
+
export interface RumProfilerStoppedInstance {
|
|
39
|
+
readonly state: 'stopped'
|
|
40
|
+
readonly stateReason: 'session-expired' | 'stopped-by-user' | 'initializing'
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Describes profiler session state when it's paused
|
|
45
|
+
* (this happens when user focuses on a different tab)
|
|
46
|
+
*/
|
|
47
|
+
export interface RumProfilerPausedInstance {
|
|
48
|
+
readonly state: 'paused'
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Describes profiler session state when it's running
|
|
53
|
+
*/
|
|
54
|
+
export interface RumProfilerRunningInstance extends RumProfilerEnrichmentData {
|
|
55
|
+
readonly state: 'running'
|
|
56
|
+
/** Current profiler instance */
|
|
57
|
+
readonly profiler: Profiler
|
|
58
|
+
/** High resolution time when profiler session started */
|
|
59
|
+
readonly startClocks: ClocksState
|
|
60
|
+
/** Timeout id to stop current session */
|
|
61
|
+
readonly timeoutId: TimeoutId
|
|
62
|
+
/** Clean-up tasks to execute after running the Profiler */
|
|
63
|
+
readonly cleanupTasks: Array<() => void>
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export type RumProfilerInstance = RumProfilerStoppedInstance | RumProfilerPausedInstance | RumProfilerRunningInstance
|
|
67
|
+
|
|
68
|
+
export interface RUMProfiler {
|
|
69
|
+
start: () => void
|
|
70
|
+
stop: () => Promise<void>
|
|
71
|
+
isStopped: () => boolean
|
|
72
|
+
isRunning: () => boolean
|
|
73
|
+
isPaused: () => boolean
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface RUMProfilerConfiguration {
|
|
77
|
+
sampleIntervalMs: number // Sample stack trace every x milliseconds (defaults to 10ms for Unix, 16ms on Windows)
|
|
78
|
+
collectIntervalMs: number // Interval for collecting RUM Profiles (defaults to 1min)
|
|
79
|
+
minProfileDurationMs: number // Minimum duration of a profile for it be sent (defaults to 5s). Profiles shorter than this duration are discarded.
|
|
80
|
+
minNumberOfSamples: number // Minimum number of samples to be collected before it can be sent (defaults to 50). Profiles with fewer samples are discarded.
|
|
81
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This is the regex used to extract the path from the url (from SimpleUrlGroupingProcessor.java)
|
|
2
|
+
// It's a bit different from the one in the java code because we removed the lookbehind unsupported by Safari.
|
|
3
|
+
const PATH_MIXED_ALPHANUMERICS = /\/(?![vV]\d{1,2}\/)([^/\d?]*\d+[^/?]*)/g
|
|
4
|
+
|
|
5
|
+
export function getDefaultViewName(viewPathUrl: string): string {
|
|
6
|
+
if (!viewPathUrl) {
|
|
7
|
+
return '/'
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Replace all the mixed alphanumerics with a ?
|
|
11
|
+
return viewPathUrl.replace(PATH_MIXED_ALPHANUMERICS, '/?')
|
|
12
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProfilerSample } from '../types'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Counts number of samples when the thread was not idle (stackId is defined)
|
|
5
|
+
* @param samples Array of collected samples
|
|
6
|
+
* @returns Number of samples
|
|
7
|
+
*/
|
|
8
|
+
export function getNumberOfSamples(samples: ProfilerSample[]): number {
|
|
9
|
+
let numberOfSamples = 0
|
|
10
|
+
for (const sample of samples) {
|
|
11
|
+
if (sample.stackId !== undefined) {
|
|
12
|
+
numberOfSamples++
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return numberOfSamples
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { timeStampNow } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import type { BrowserIncrementalData, BrowserIncrementalSnapshotRecord } from '../../types'
|
|
3
|
+
import { RecordType } from '../../types'
|
|
4
|
+
|
|
5
|
+
export function assembleIncrementalSnapshot<Data extends BrowserIncrementalData>(
|
|
6
|
+
source: Data['source'],
|
|
7
|
+
data: Omit<Data, 'source'>
|
|
8
|
+
): BrowserIncrementalSnapshotRecord {
|
|
9
|
+
return {
|
|
10
|
+
data: {
|
|
11
|
+
source,
|
|
12
|
+
...data,
|
|
13
|
+
} as Data,
|
|
14
|
+
type: RecordType.IncrementalSnapshot,
|
|
15
|
+
timestamp: timeStampNow(),
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type ElementsScrollPositions = ReturnType<typeof createElementsScrollPositions>
|
|
2
|
+
export interface ScrollPositions {
|
|
3
|
+
scrollLeft: number
|
|
4
|
+
scrollTop: number
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function createElementsScrollPositions() {
|
|
8
|
+
const scrollPositionsByElement = new WeakMap<Element, ScrollPositions>()
|
|
9
|
+
return {
|
|
10
|
+
set(element: Element | Document, scrollPositions: ScrollPositions) {
|
|
11
|
+
if (element === document && !document.scrollingElement) {
|
|
12
|
+
// cf https://drafts.csswg.org/cssom-view/#dom-document-scrollingelement,
|
|
13
|
+
// in some cases scrolling elements can not be defined, we don't support those for now
|
|
14
|
+
return
|
|
15
|
+
}
|
|
16
|
+
scrollPositionsByElement.set(
|
|
17
|
+
element === document ? document.scrollingElement! : (element as Element),
|
|
18
|
+
scrollPositions
|
|
19
|
+
)
|
|
20
|
+
},
|
|
21
|
+
get(element: Element) {
|
|
22
|
+
return scrollPositionsByElement.get(element)
|
|
23
|
+
},
|
|
24
|
+
has(element: Element) {
|
|
25
|
+
return scrollPositionsByElement.has(element)
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface EventIds {
|
|
2
|
+
getIdForEvent(event: Event): number
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function createEventIds(): EventIds {
|
|
6
|
+
const eventIds = new WeakMap<Event, number>()
|
|
7
|
+
let nextId = 1
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
getIdForEvent(event: Event): number {
|
|
11
|
+
if (!eventIds.has(event)) {
|
|
12
|
+
eventIds.set(event, nextId++)
|
|
13
|
+
}
|
|
14
|
+
return eventIds.get(event)!
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isNodeShadowHost } from '@kubesense/kubesense-browser-rum-core'
|
|
2
|
+
|
|
3
|
+
export function isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent {
|
|
4
|
+
return Boolean((event as TouchEvent).changedTouches)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function getEventTarget(event: Event): Node {
|
|
8
|
+
if (event.composed === true && isNodeShadowHost(event.target as Node)) {
|
|
9
|
+
return event.composedPath()[0] as Node
|
|
10
|
+
}
|
|
11
|
+
return event.target as Node
|
|
12
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { takeFullSnapshot, takeNodeSnapshot } from './internalApi'
|
|
2
|
+
export { record } from './record'
|
|
3
|
+
export type { SerializationMetric, SerializationStats } from './serialization'
|
|
4
|
+
export { createSerializationStats, aggregateSerializationStats } from './serialization'
|
|
5
|
+
export { serializeNode, serializeDocument } from './serialization'
|
|
6
|
+
export { createElementsScrollPositions } from './elementsScrollPositions'
|
|
7
|
+
export type { ShadowRootsController } from './shadowRootsController'
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { noop, timeStampNow } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'
|
|
3
|
+
import { getNodePrivacyLevel, NodePrivacyLevel } from '@kubesense/kubesense-browser-rum-core'
|
|
4
|
+
import type { BrowserRecord, SerializedNodeWithId } from '../../types'
|
|
5
|
+
import { takeFullSnapshot as doTakeFullSnapshot } from './startFullSnapshots'
|
|
6
|
+
import type { ShadowRootsController } from './shadowRootsController'
|
|
7
|
+
import type { RecordingScope } from './recordingScope'
|
|
8
|
+
import { createRecordingScope } from './recordingScope'
|
|
9
|
+
import { createElementsScrollPositions } from './elementsScrollPositions'
|
|
10
|
+
import { createEventIds } from './eventIds'
|
|
11
|
+
import { createNodeIds } from './nodeIds'
|
|
12
|
+
import type { EmitRecordCallback } from './record.types'
|
|
13
|
+
import type { SerializationTransaction } from './serialization'
|
|
14
|
+
import { SerializationKind, serializeInTransaction, serializeNode } from './serialization'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Take a full snapshot of the document, generating the same records that the Kubesense browser SDK
|
|
18
|
+
* would generate.
|
|
19
|
+
*
|
|
20
|
+
* This is an internal API function. Be sure to update kubesense-internal callers if you
|
|
21
|
+
* change its signature or behavior.
|
|
22
|
+
*/
|
|
23
|
+
export function takeFullSnapshot({
|
|
24
|
+
configuration,
|
|
25
|
+
}: { configuration?: Partial<RumConfiguration> } = {}): BrowserRecord[] {
|
|
26
|
+
const records: BrowserRecord[] = []
|
|
27
|
+
const emitRecord: EmitRecordCallback = (record: BrowserRecord) => {
|
|
28
|
+
records.push(record)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
doTakeFullSnapshot(
|
|
32
|
+
timeStampNow(),
|
|
33
|
+
SerializationKind.INITIAL_FULL_SNAPSHOT,
|
|
34
|
+
emitRecord,
|
|
35
|
+
noop,
|
|
36
|
+
createTemporaryRecordingScope(configuration)
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
return records
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Take a snapshot of a DOM node, generating the serialized representation that the
|
|
44
|
+
* kubesense browser SDK would generate.
|
|
45
|
+
*
|
|
46
|
+
* This is an internal API function. Be sure to update Kubesense-internal callers if you
|
|
47
|
+
* change its signature or behavior.
|
|
48
|
+
*/
|
|
49
|
+
export function takeNodeSnapshot(
|
|
50
|
+
node: Node,
|
|
51
|
+
{ configuration }: { configuration?: Partial<RumConfiguration> } = {}
|
|
52
|
+
): SerializedNodeWithId | null {
|
|
53
|
+
let serializedNode: SerializedNodeWithId | null = null
|
|
54
|
+
|
|
55
|
+
serializeInTransaction(
|
|
56
|
+
SerializationKind.INITIAL_FULL_SNAPSHOT,
|
|
57
|
+
noop,
|
|
58
|
+
noop,
|
|
59
|
+
createTemporaryRecordingScope(configuration),
|
|
60
|
+
(transaction: SerializationTransaction): void => {
|
|
61
|
+
const privacyLevel = getNodePrivacyLevel(node, transaction.scope.configuration.defaultPrivacyLevel)
|
|
62
|
+
if (privacyLevel === NodePrivacyLevel.HIDDEN || privacyLevel === NodePrivacyLevel.IGNORE) {
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
serializedNode = serializeNode(node, privacyLevel, transaction)
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
return serializedNode
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function createTemporaryRecordingScope(configuration?: Partial<RumConfiguration>): RecordingScope {
|
|
73
|
+
return createRecordingScope(
|
|
74
|
+
{
|
|
75
|
+
defaultPrivacyLevel: NodePrivacyLevel.ALLOW,
|
|
76
|
+
...configuration,
|
|
77
|
+
} as RumConfiguration,
|
|
78
|
+
createElementsScrollPositions(),
|
|
79
|
+
createEventIds(),
|
|
80
|
+
createNodeIds(),
|
|
81
|
+
{
|
|
82
|
+
addShadowRoot: noop,
|
|
83
|
+
removeShadowRoot: noop,
|
|
84
|
+
flush: noop,
|
|
85
|
+
stop: noop,
|
|
86
|
+
} as ShadowRootsController
|
|
87
|
+
)
|
|
88
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { noop, throttle, requestIdleCallback } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import type { RumMutationRecord } from '@kubesense/kubesense-browser-rum-core'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Maximum duration to wait before processing mutations. If the browser is idle, mutations will be
|
|
6
|
+
* processed more quickly. If the browser is busy executing small tasks (ex: rendering frames), the
|
|
7
|
+
* mutations will wait MUTATION_PROCESS_MAX_DELAY milliseconds before being processed. If the
|
|
8
|
+
* browser is busy executing a longer task, mutations will be processed after this task.
|
|
9
|
+
*/
|
|
10
|
+
const MUTATION_PROCESS_MAX_DELAY = 100
|
|
11
|
+
/**
|
|
12
|
+
* Minimum duration to wait before processing mutations. This is used to batch mutations together
|
|
13
|
+
* and be able to deduplicate them to save processing time and bandwidth.
|
|
14
|
+
* 16ms is the duration of a frame at 60fps that ensure fluid UI.
|
|
15
|
+
*/
|
|
16
|
+
export const MUTATION_PROCESS_MIN_DELAY = 16
|
|
17
|
+
|
|
18
|
+
export function createMutationBatch(processMutationBatch: (mutations: RumMutationRecord[]) => void) {
|
|
19
|
+
let cancelScheduledFlush = noop
|
|
20
|
+
let pendingMutations: RumMutationRecord[] = []
|
|
21
|
+
|
|
22
|
+
function flush() {
|
|
23
|
+
cancelScheduledFlush()
|
|
24
|
+
processMutationBatch(pendingMutations)
|
|
25
|
+
pendingMutations = []
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const { throttled: throttledFlush, cancel: cancelThrottle } = throttle(flush, MUTATION_PROCESS_MIN_DELAY, {
|
|
29
|
+
leading: false,
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
addMutations: (mutations: RumMutationRecord[]) => {
|
|
34
|
+
if (pendingMutations.length === 0) {
|
|
35
|
+
cancelScheduledFlush = requestIdleCallback(throttledFlush, { timeout: MUTATION_PROCESS_MAX_DELAY })
|
|
36
|
+
}
|
|
37
|
+
pendingMutations.push(...mutations)
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
flush,
|
|
41
|
+
|
|
42
|
+
stop: () => {
|
|
43
|
+
cancelScheduledFlush()
|
|
44
|
+
cancelThrottle()
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getParentNode, isNodeShadowRoot } from '@kubesense/kubesense-browser-rum-core'
|
|
2
|
+
|
|
3
|
+
export type NodeWithSerializedNode = Node & { __brand: 'NodeWithSerializedNode' }
|
|
4
|
+
export type NodeId = number & { __brand: 'NodeId' }
|
|
5
|
+
|
|
6
|
+
export const enum NodeIdConstants {
|
|
7
|
+
FIRST_ID = 0,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface NodeIds {
|
|
11
|
+
assign(node: Node): NodeId
|
|
12
|
+
get(node: Node): NodeId | undefined
|
|
13
|
+
areAssignedForNodeAndAncestors(node: Node): node is NodeWithSerializedNode
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createNodeIds(): NodeIds {
|
|
17
|
+
const nodeIds = new WeakMap<Node, NodeId>()
|
|
18
|
+
let nextNodeId = NodeIdConstants.FIRST_ID
|
|
19
|
+
|
|
20
|
+
const get = (node: Node): NodeId | undefined => nodeIds.get(node)
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
assign: (node: Node): NodeId => {
|
|
24
|
+
// Try to reuse any existing id.
|
|
25
|
+
let nodeId = get(node)
|
|
26
|
+
if (nodeId === undefined) {
|
|
27
|
+
nodeId = nextNodeId++ as NodeId
|
|
28
|
+
nodeIds.set(node, nodeId)
|
|
29
|
+
}
|
|
30
|
+
return nodeId
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
get,
|
|
34
|
+
|
|
35
|
+
areAssignedForNodeAndAncestors: (node: Node): node is NodeWithSerializedNode => {
|
|
36
|
+
let current: Node | null = node
|
|
37
|
+
while (current) {
|
|
38
|
+
if (get(current) === undefined && !isNodeShadowRoot(current)) {
|
|
39
|
+
return false
|
|
40
|
+
}
|
|
41
|
+
current = getParentNode(current)
|
|
42
|
+
}
|
|
43
|
+
return true
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { sendToExtension } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import type { LifeCycle, RumConfiguration, ViewHistory } from '@kubesense/kubesense-browser-rum-core'
|
|
3
|
+
import * as replayStats from '../replayStats'
|
|
4
|
+
import type { BrowserRecord } from '../../types'
|
|
5
|
+
import type { Tracker } from './trackers'
|
|
6
|
+
import {
|
|
7
|
+
trackFocus,
|
|
8
|
+
trackFrustration,
|
|
9
|
+
trackInput,
|
|
10
|
+
trackMediaInteraction,
|
|
11
|
+
trackMouseInteraction,
|
|
12
|
+
trackMove,
|
|
13
|
+
trackMutation,
|
|
14
|
+
trackScroll,
|
|
15
|
+
trackStyleSheet,
|
|
16
|
+
trackViewEnd,
|
|
17
|
+
trackViewportResize,
|
|
18
|
+
trackVisualViewportResize,
|
|
19
|
+
} from './trackers'
|
|
20
|
+
import { createElementsScrollPositions } from './elementsScrollPositions'
|
|
21
|
+
import type { ShadowRootsController } from './shadowRootsController'
|
|
22
|
+
import { initShadowRootsController } from './shadowRootsController'
|
|
23
|
+
import { startFullSnapshots } from './startFullSnapshots'
|
|
24
|
+
import { createEventIds } from './eventIds'
|
|
25
|
+
import { createNodeIds } from './nodeIds'
|
|
26
|
+
import type { EmitRecordCallback, EmitStatsCallback } from './record.types'
|
|
27
|
+
import { createRecordingScope } from './recordingScope'
|
|
28
|
+
|
|
29
|
+
export interface RecordOptions {
|
|
30
|
+
emitRecord: EmitRecordCallback
|
|
31
|
+
emitStats: EmitStatsCallback
|
|
32
|
+
configuration: RumConfiguration
|
|
33
|
+
lifeCycle: LifeCycle
|
|
34
|
+
viewHistory: ViewHistory
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface RecordAPI {
|
|
38
|
+
stop: () => void
|
|
39
|
+
flushMutations: () => void
|
|
40
|
+
shadowRootsController: ShadowRootsController
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function record(options: RecordOptions): RecordAPI {
|
|
44
|
+
const { emitRecord, emitStats, configuration, lifeCycle } = options
|
|
45
|
+
// runtime checks for user options
|
|
46
|
+
if (!emitRecord || !emitStats) {
|
|
47
|
+
throw new Error('emit functions are required')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const processRecord: EmitRecordCallback = (record: BrowserRecord) => {
|
|
51
|
+
emitRecord(record)
|
|
52
|
+
sendToExtension('record', { record })
|
|
53
|
+
const view = options.viewHistory.findView()!
|
|
54
|
+
replayStats.addRecord(view.id)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const shadowRootsController = initShadowRootsController(processRecord, emitStats)
|
|
58
|
+
const scope = createRecordingScope(
|
|
59
|
+
configuration,
|
|
60
|
+
createElementsScrollPositions(),
|
|
61
|
+
createEventIds(),
|
|
62
|
+
createNodeIds(),
|
|
63
|
+
shadowRootsController
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
const { stop: stopFullSnapshots } = startFullSnapshots(lifeCycle, processRecord, emitStats, flushMutations, scope)
|
|
67
|
+
|
|
68
|
+
function flushMutations() {
|
|
69
|
+
shadowRootsController.flush()
|
|
70
|
+
mutationTracker.flush()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const mutationTracker = trackMutation(document, processRecord, emitStats, scope)
|
|
74
|
+
const trackers: Tracker[] = [
|
|
75
|
+
mutationTracker,
|
|
76
|
+
trackMove(processRecord, scope),
|
|
77
|
+
trackMouseInteraction(processRecord, scope),
|
|
78
|
+
trackScroll(document, processRecord, scope),
|
|
79
|
+
trackViewportResize(processRecord, scope),
|
|
80
|
+
trackInput(document, processRecord, scope),
|
|
81
|
+
trackMediaInteraction(processRecord, scope),
|
|
82
|
+
trackStyleSheet(processRecord, scope),
|
|
83
|
+
trackFocus(processRecord, scope),
|
|
84
|
+
trackVisualViewportResize(processRecord, scope),
|
|
85
|
+
trackFrustration(lifeCycle, processRecord, scope),
|
|
86
|
+
trackViewEnd(lifeCycle, processRecord, flushMutations),
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
stop: () => {
|
|
91
|
+
shadowRootsController.stop()
|
|
92
|
+
trackers.forEach((tracker) => tracker.stop())
|
|
93
|
+
stopFullSnapshots()
|
|
94
|
+
},
|
|
95
|
+
flushMutations,
|
|
96
|
+
shadowRootsController,
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BrowserRecord } from '../../types'
|
|
2
|
+
import type { SerializationStats } from './serialization'
|
|
3
|
+
|
|
4
|
+
export type EmitRecordCallback<Record extends BrowserRecord = BrowserRecord> = (record: Record) => void
|
|
5
|
+
export type EmitStatsCallback = (stats: SerializationStats) => void
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'
|
|
2
|
+
|
|
3
|
+
import type { ElementsScrollPositions } from './elementsScrollPositions'
|
|
4
|
+
import type { EventIds } from './eventIds'
|
|
5
|
+
import type { NodeIds } from './nodeIds'
|
|
6
|
+
import type { ShadowRootsController } from './shadowRootsController'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* State associated with a stream of session replay records. When a new stream of records
|
|
10
|
+
* starts (e.g. because recording has shut down and restarted), a new RecordingScope
|
|
11
|
+
* object must be created; this ensures that we don't generate records that reference ids
|
|
12
|
+
* or data which aren't present in the current stream.
|
|
13
|
+
*/
|
|
14
|
+
export interface RecordingScope {
|
|
15
|
+
configuration: RumConfiguration
|
|
16
|
+
elementsScrollPositions: ElementsScrollPositions
|
|
17
|
+
eventIds: EventIds
|
|
18
|
+
nodeIds: NodeIds
|
|
19
|
+
shadowRootsController: ShadowRootsController
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function createRecordingScope(
|
|
23
|
+
configuration: RumConfiguration,
|
|
24
|
+
elementsScrollPositions: ElementsScrollPositions,
|
|
25
|
+
eventIds: EventIds,
|
|
26
|
+
nodeIds: NodeIds,
|
|
27
|
+
shadowRootsController: ShadowRootsController
|
|
28
|
+
): RecordingScope {
|
|
29
|
+
return {
|
|
30
|
+
configuration,
|
|
31
|
+
elementsScrollPositions,
|
|
32
|
+
eventIds,
|
|
33
|
+
nodeIds,
|
|
34
|
+
shadowRootsController,
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { getElementInputValue } from './serializationUtils'
|
|
2
|
+
export { serializeDocument } from './serializeDocument'
|
|
3
|
+
export { serializeNode } from './serializeNode'
|
|
4
|
+
export { serializeAttribute } from './serializeAttribute'
|
|
5
|
+
export { createSerializationStats, updateSerializationStats, aggregateSerializationStats } from './serializationStats'
|
|
6
|
+
export type { SerializationMetric, SerializationStats } from './serializationStats'
|
|
7
|
+
export { serializeInTransaction, SerializationKind } from './serializationTransaction'
|
|
8
|
+
export type { SerializationTransaction, SerializationTransactionCallback } from './serializationTransaction'
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { NodePrivacyLevel } from '@kubesense/kubesense-browser-rum-core'
|
|
2
|
+
|
|
3
|
+
// Those values are the only one that can be used when inheriting privacy levels from parent to
|
|
4
|
+
// children during serialization, since HIDDEN and IGNORE shouldn't serialize their children. This
|
|
5
|
+
// ensures that no children are serialized when they shouldn't.
|
|
6
|
+
export type ParentNodePrivacyLevel =
|
|
7
|
+
| typeof NodePrivacyLevel.ALLOW
|
|
8
|
+
| typeof NodePrivacyLevel.MASK
|
|
9
|
+
| typeof NodePrivacyLevel.MASK_USER_INPUT
|
|
10
|
+
| typeof NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Virtual attributes. These attributes appear in the serialized attribute map of
|
|
14
|
+
* elements, but they're not actually derived from the DOM; they're used to represent
|
|
15
|
+
* metadata about the element they're attached to.
|
|
16
|
+
*/
|
|
17
|
+
export interface VirtualAttributes {
|
|
18
|
+
/**
|
|
19
|
+
* For <style> and <link> elements, the rules in the element's stylesheet, extracted
|
|
20
|
+
* from the CSSOM.
|
|
21
|
+
*/
|
|
22
|
+
_cssText?: string
|
|
23
|
+
|
|
24
|
+
/** For <audio> and <video> elements, the playback state of the element's media. */
|
|
25
|
+
rr_mediaState?: 'paused' | 'played'
|
|
26
|
+
|
|
27
|
+
/** For elements which are scroll containers, the element's X scroll position, if non-zero. */
|
|
28
|
+
rr_scrollLeft?: number
|
|
29
|
+
|
|
30
|
+
/** For elements which are scroll containers, the element's Y scroll position, if non-zero. */
|
|
31
|
+
rr_scrollTop?: number
|
|
32
|
+
|
|
33
|
+
/** For HIDDEN elements, the width of the element's bounding client rect. */
|
|
34
|
+
rr_width?: string
|
|
35
|
+
|
|
36
|
+
/** For HIDDEN elements, the height of the element's bounding client rect. */
|
|
37
|
+
rr_height?: string
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface SerializeOptions {
|
|
41
|
+
/** For HIDDEN elements, the height of the element's bounding client rect. */
|
|
42
|
+
rr_height?: string
|
|
43
|
+
}
|
|
@@ -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
|
+
}
|