@kubesense/kubesense-browser-rum 1.8.0 → 2.0.0-beta.1
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 +1 -1
- package/README.md +23 -0
- package/bundle/chunks/kubesenseProfiler-4b8cfd8f889074788478-kubesense-rum.js +1 -0
- package/bundle/chunks/kubesenseRecorder-db948e96649585a2b3e9-kubesense-rum.js +1 -0
- package/bundle/kubesense-rum.js +1 -1
- package/cjs/boot/kubesenseRecorder.d.ts +6 -0
- package/cjs/boot/kubesenseRecorder.js +75 -0
- package/cjs/boot/kubesenseRecorder.js.map +1 -0
- package/cjs/boot/lazyLoadProfiler.d.ts +3 -4
- package/cjs/boot/lazyLoadProfiler.js +18 -50
- package/cjs/boot/lazyLoadProfiler.js.map +1 -1
- package/cjs/boot/lazyLoadRecorder.d.ts +3 -4
- package/cjs/boot/lazyLoadRecorder.js +18 -50
- package/cjs/boot/lazyLoadRecorder.js.map +1 -1
- package/cjs/boot/postStartStrategy.d.ts +4 -4
- package/cjs/boot/postStartStrategy.js +89 -110
- package/cjs/boot/postStartStrategy.js.map +1 -1
- package/cjs/boot/preStartStrategy.js +21 -21
- package/cjs/boot/preStartStrategy.js.map +1 -1
- package/cjs/boot/profilerApi.js +44 -50
- package/cjs/boot/profilerApi.js.map +1 -1
- package/cjs/boot/recorderApi.d.ts +1 -3
- package/cjs/boot/recorderApi.js +41 -71
- package/cjs/boot/recorderApi.js.map +1 -1
- package/cjs/domain/deflate/deflateEncoder.d.ts +1 -2
- package/cjs/domain/deflate/deflateEncoder.js +94 -108
- package/cjs/domain/deflate/deflateEncoder.js.map +1 -1
- package/cjs/domain/deflate/deflateWorker.d.ts +3 -4
- package/cjs/domain/deflate/deflateWorker.js +79 -90
- package/cjs/domain/deflate/deflateWorker.js.map +1 -1
- package/cjs/domain/deflate/index.d.ts +1 -1
- package/cjs/domain/deflate/index.js +5 -10
- package/cjs/domain/getSessionReplayLink.d.ts +3 -2
- package/cjs/domain/getSessionReplayLink.js +17 -31
- package/cjs/domain/getSessionReplayLink.js.map +1 -1
- package/cjs/domain/profiling/actionHistory.d.ts +10 -0
- package/cjs/domain/profiling/actionHistory.js +37 -0
- package/cjs/domain/profiling/actionHistory.js.map +1 -0
- package/cjs/domain/profiling/kubesenseProfiler.d.ts +6 -0
- package/cjs/domain/profiling/kubesenseProfiler.js +243 -0
- package/cjs/domain/profiling/kubesenseProfiler.js.map +1 -0
- package/cjs/domain/profiling/longTaskHistory.d.ts +11 -0
- package/cjs/domain/profiling/longTaskHistory.js +22 -0
- package/cjs/domain/profiling/longTaskHistory.js.map +1 -0
- package/cjs/domain/profiling/profilerDebugIds.d.ts +2 -0
- package/cjs/domain/profiling/profilerDebugIds.js +18 -0
- package/cjs/domain/profiling/profilerDebugIds.js.map +1 -0
- package/cjs/domain/profiling/profilingContext.js +20 -25
- package/cjs/domain/profiling/profilingContext.js.map +1 -1
- package/cjs/domain/profiling/profilingSupported.js +6 -8
- package/cjs/domain/profiling/profilingSupported.js.map +1 -1
- package/cjs/domain/profiling/quotaCheck.d.ts +9 -0
- package/cjs/domain/profiling/quotaCheck.js +66 -0
- package/cjs/domain/profiling/quotaCheck.js.map +1 -0
- package/cjs/domain/profiling/test-utils/mockedTrace.d.ts +1 -1
- package/cjs/domain/profiling/transport/buildProfileEvent.d.ts +38 -0
- package/cjs/domain/profiling/transport/buildProfileEvent.js +91 -0
- package/cjs/domain/profiling/transport/buildProfileEvent.js.map +1 -0
- package/cjs/domain/profiling/transport/formDataEmitter.d.ts +5 -0
- package/cjs/domain/profiling/transport/formDataEmitter.js +17 -0
- package/cjs/domain/profiling/transport/formDataEmitter.js.map +1 -0
- package/cjs/domain/profiling/transport/profilingBridge.d.ts +2 -0
- package/cjs/domain/profiling/transport/profilingBridge.js +12 -0
- package/cjs/domain/profiling/transport/profilingBridge.js.map +1 -0
- package/cjs/domain/profiling/{types/rumProfiler.types.d.ts → types.d.ts} +13 -24
- package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js +5 -5
- package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -1
- package/cjs/domain/profiling/utils/getDefaultViewName.js +6 -10
- package/cjs/domain/profiling/utils/getDefaultViewName.js.map +1 -1
- package/cjs/domain/profiling/vitalHistory.d.ts +13 -0
- package/cjs/domain/profiling/vitalHistory.js +56 -0
- package/cjs/domain/profiling/vitalHistory.js.map +1 -0
- package/cjs/domain/record/assembly.d.ts +2 -1
- package/cjs/domain/record/assembly.js +15 -14
- package/cjs/domain/record/assembly.js.map +1 -1
- package/cjs/domain/record/canvas/canvasHash.d.ts +2 -0
- package/cjs/domain/record/canvas/canvasHash.js +33 -0
- package/cjs/domain/record/canvas/canvasHash.js.map +1 -0
- package/cjs/domain/record/canvas/canvasManager.d.ts +42 -0
- package/cjs/domain/record/canvas/canvasManager.js +99 -0
- package/cjs/domain/record/canvas/canvasManager.js.map +1 -0
- package/cjs/domain/record/canvas/canvasSnapshot.d.ts +8 -0
- package/cjs/domain/record/canvas/canvasSnapshot.js +40 -0
- package/cjs/domain/record/canvas/canvasSnapshot.js.map +1 -0
- package/cjs/domain/record/canvas/canvasUtils.d.ts +2 -0
- package/cjs/domain/record/canvas/canvasUtils.js +14 -0
- package/cjs/domain/record/canvas/canvasUtils.js.map +1 -0
- package/cjs/domain/record/elementsScrollPositions.js +17 -20
- package/cjs/domain/record/elementsScrollPositions.js.map +1 -1
- package/cjs/domain/record/encoding/changeDecoder.d.ts +39 -0
- package/cjs/domain/record/encoding/changeDecoder.js +152 -0
- package/cjs/domain/record/encoding/changeDecoder.js.map +1 -0
- package/cjs/domain/record/encoding/changeEncoder.d.ts +39 -0
- package/cjs/domain/record/encoding/changeEncoder.js +146 -0
- package/cjs/domain/record/encoding/changeEncoder.js.map +1 -0
- package/cjs/domain/record/encoding/index.d.ts +10 -0
- package/cjs/domain/record/encoding/itemIds.d.ts +32 -0
- package/cjs/domain/record/encoding/itemIds.js +49 -0
- package/cjs/domain/record/encoding/itemIds.js.map +1 -0
- package/cjs/domain/record/encoding/roles.d.ts +52 -0
- package/cjs/domain/record/encoding/roles.js +66 -0
- package/cjs/domain/record/encoding/roles.js.map +1 -0
- package/cjs/domain/record/encoding/stringIds.d.ts +15 -0
- package/cjs/domain/record/encoding/stringIds.js +47 -0
- package/cjs/domain/record/encoding/stringIds.js.map +1 -0
- package/cjs/domain/record/encoding/stringTable.d.ts +15 -0
- package/cjs/domain/record/encoding/stringTable.js +38 -0
- package/cjs/domain/record/encoding/stringTable.js.map +1 -0
- package/cjs/domain/record/eventsUtils.js +9 -10
- package/cjs/domain/record/eventsUtils.js.map +1 -1
- package/cjs/domain/record/index.d.ts +5 -2
- package/cjs/domain/record/index.js +13 -17
- package/cjs/domain/record/internalApi.d.ts +6 -6
- package/cjs/domain/record/internalApi.js +55 -49
- package/cjs/domain/record/internalApi.js.map +1 -1
- package/cjs/domain/record/mutationBatch.d.ts +1 -0
- package/cjs/domain/record/mutationBatch.js +38 -39
- package/cjs/domain/record/mutationBatch.js.map +1 -1
- package/cjs/domain/record/record.d.ts +7 -1
- package/cjs/domain/record/record.js +76 -87
- package/cjs/domain/record/record.js.map +1 -1
- package/cjs/domain/record/record.types.d.ts +1 -0
- package/cjs/domain/record/recordingScope.d.ts +7 -3
- package/cjs/domain/record/recordingScope.js +25 -11
- package/cjs/domain/record/recordingScope.js.map +1 -1
- package/cjs/domain/record/serialization/index.d.ts +4 -2
- package/cjs/domain/record/serialization/index.js +16 -18
- package/cjs/domain/record/serialization/insertionCursor.d.ts +57 -0
- package/cjs/domain/record/serialization/insertionCursor.js +55 -0
- package/cjs/domain/record/serialization/insertionCursor.js.map +1 -0
- package/cjs/domain/record/serialization/serialization.types.d.ts +0 -6
- package/cjs/domain/record/serialization/serializationStats.js +26 -25
- package/cjs/domain/record/serialization/serializationStats.js.map +1 -1
- package/cjs/domain/record/serialization/serializationTransaction.d.ts +44 -22
- package/cjs/domain/record/serialization/serializationTransaction.js +90 -36
- package/cjs/domain/record/serialization/serializationTransaction.js.map +1 -1
- package/cjs/domain/record/serialization/serializationUtils.d.ts +0 -1
- package/cjs/domain/record/serialization/serializationUtils.js +46 -75
- package/cjs/domain/record/serialization/serializationUtils.js.map +1 -1
- package/cjs/domain/record/serialization/serializeAttribute.js +24 -39
- package/cjs/domain/record/serialization/serializeAttribute.js.map +1 -1
- package/cjs/domain/record/serialization/serializeAttributes.d.ts +2 -2
- package/cjs/domain/record/serialization/serializeAttributes.js +100 -152
- package/cjs/domain/record/serialization/serializeAttributes.js.map +1 -1
- package/cjs/domain/record/serialization/serializeFullSnapshot.d.ts +5 -0
- package/cjs/domain/record/serialization/serializeFullSnapshot.js +14 -0
- package/cjs/domain/record/serialization/serializeFullSnapshot.js.map +1 -0
- package/cjs/domain/record/serialization/serializeMutations.d.ts +5 -0
- package/cjs/domain/record/serialization/serializeMutations.js +152 -0
- package/cjs/domain/record/serialization/serializeMutations.js.map +1 -0
- package/cjs/domain/record/serialization/serializeNode.d.ts +3 -6
- package/cjs/domain/record/serialization/serializeNode.js +116 -144
- package/cjs/domain/record/serialization/serializeNode.js.map +1 -1
- package/cjs/domain/record/shadowRootsController.d.ts +2 -2
- package/cjs/domain/record/shadowRootsController.js +37 -42
- package/cjs/domain/record/shadowRootsController.js.map +1 -1
- package/cjs/domain/record/startFullSnapshots.d.ts +1 -1
- package/cjs/domain/record/startFullSnapshots.js +38 -54
- package/cjs/domain/record/startFullSnapshots.js.map +1 -1
- package/cjs/domain/record/trackers/index.d.ts +2 -1
- package/cjs/domain/record/trackers/index.js +25 -27
- package/cjs/domain/record/trackers/trackCanvasCapture.d.ts +3 -0
- package/cjs/domain/record/trackers/trackCanvasCapture.js +102 -0
- package/cjs/domain/record/trackers/trackCanvasCapture.js.map +1 -0
- package/cjs/domain/record/trackers/trackCanvasContent.d.ts +3 -0
- package/cjs/domain/record/trackers/trackCanvasContent.js +31 -0
- package/cjs/domain/record/trackers/trackCanvasContent.js.map +1 -0
- package/cjs/domain/record/trackers/trackFocus.d.ts +1 -2
- package/cjs/domain/record/trackers/trackFocus.js +15 -13
- package/cjs/domain/record/trackers/trackFocus.js.map +1 -1
- package/cjs/domain/record/trackers/trackInput.d.ts +2 -2
- package/cjs/domain/record/trackers/trackInput.js +129 -102
- package/cjs/domain/record/trackers/trackInput.js.map +1 -1
- package/cjs/domain/record/trackers/trackMediaInteraction.js +22 -26
- package/cjs/domain/record/trackers/trackMediaInteraction.js.map +1 -1
- package/cjs/domain/record/trackers/trackMouseInteraction.js +47 -54
- package/cjs/domain/record/trackers/trackMouseInteraction.js.map +1 -1
- package/cjs/domain/record/trackers/trackMove.js +43 -49
- package/cjs/domain/record/trackers/trackMove.js.map +1 -1
- package/cjs/domain/record/trackers/trackMutation.d.ts +3 -3
- package/cjs/domain/record/trackers/trackMutation.js +42 -267
- package/cjs/domain/record/trackers/trackMutation.js.map +1 -1
- package/cjs/domain/record/trackers/trackScroll.js +36 -44
- package/cjs/domain/record/trackers/trackScroll.js.map +1 -1
- package/cjs/domain/record/trackers/trackStyleSheet.js +75 -84
- package/cjs/domain/record/trackers/trackStyleSheet.js.map +1 -1
- package/cjs/domain/record/trackers/trackViewEnd.js +17 -17
- package/cjs/domain/record/trackers/trackViewEnd.js.map +1 -1
- package/cjs/domain/record/trackers/trackViewportResize.d.ts +2 -3
- package/cjs/domain/record/trackers/trackViewportResize.js +36 -42
- package/cjs/domain/record/trackers/trackViewportResize.js.map +1 -1
- package/cjs/domain/record/viewports.js +32 -50
- package/cjs/domain/record/viewports.js.map +1 -1
- package/cjs/domain/replayStats.d.ts +1 -0
- package/cjs/domain/replayStats.js +36 -44
- package/cjs/domain/replayStats.js.map +1 -1
- package/cjs/domain/scriptLoadingError.js +15 -22
- package/cjs/domain/scriptLoadingError.js.map +1 -1
- package/cjs/domain/segmentCollection/buildReplayPayload.js +22 -23
- package/cjs/domain/segmentCollection/buildReplayPayload.js.map +1 -1
- package/cjs/domain/segmentCollection/buildResourcePayload.d.ts +5 -0
- package/cjs/domain/segmentCollection/buildResourcePayload.js +19 -0
- package/cjs/domain/segmentCollection/buildResourcePayload.js.map +1 -0
- package/cjs/domain/segmentCollection/index.d.ts +3 -0
- package/cjs/domain/segmentCollection/index.js +14 -11
- package/cjs/domain/segmentCollection/replayResourceCollection.d.ts +10 -0
- package/cjs/domain/segmentCollection/replayResourceCollection.js +52 -0
- package/cjs/domain/segmentCollection/replayResourceCollection.js.map +1 -0
- package/cjs/domain/segmentCollection/segment.js +50 -80
- package/cjs/domain/segmentCollection/segment.js.map +1 -1
- package/cjs/domain/segmentCollection/segmentCollection.d.ts +4 -4
- package/cjs/domain/segmentCollection/segmentCollection.js +87 -105
- package/cjs/domain/segmentCollection/segmentCollection.js.map +1 -1
- package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.d.ts +16 -0
- package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.js +29 -0
- package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.js.map +1 -0
- package/cjs/domain/segmentCollection/startSegmentTelemetry.js +40 -42
- package/cjs/domain/segmentCollection/startSegmentTelemetry.js.map +1 -1
- package/cjs/domain/startRecordBridge.js +10 -14
- package/cjs/domain/startRecordBridge.js.map +1 -1
- package/cjs/domain/startRecorderInitTelemetry.js +42 -50
- package/cjs/domain/startRecorderInitTelemetry.js.map +1 -1
- package/cjs/entries/internal.d.ts +11 -2
- package/cjs/entries/internal.js +47 -28
- package/cjs/entries/internalSynthetics.js +26 -24
- package/cjs/entries/internalSynthetics.js.map +1 -1
- package/cjs/entries/main.d.ts +5 -3
- package/cjs/entries/main.js +50 -31
- package/cjs/entries/main.js.map +1 -1
- package/cjs/types/index.d.ts +1 -0
- package/cjs/types/profiling.d.ts +313 -0
- package/cjs/types/sessionReplay.d.ts +381 -3
- package/cjs/types/sessionReplayConstants.d.ts +57 -0
- package/cjs/types/sessionReplayConstants.js +104 -47
- package/cjs/types/sessionReplayConstants.js.map +1 -1
- package/esm/boot/kubesenseRecorder.mjs +75 -0
- package/esm/boot/kubesenseRecorder.mjs.map +1 -0
- package/esm/boot/lazyLoadProfiler.mjs +24 -0
- package/esm/boot/lazyLoadProfiler.mjs.map +1 -0
- package/esm/boot/lazyLoadRecorder.mjs +24 -0
- package/esm/boot/lazyLoadRecorder.mjs.map +1 -0
- package/esm/boot/postStartStrategy.mjs +97 -0
- package/esm/boot/postStartStrategy.mjs.map +1 -0
- package/esm/boot/preStartStrategy.mjs +24 -0
- package/esm/boot/preStartStrategy.mjs.map +1 -0
- package/esm/boot/profilerApi.mjs +47 -0
- package/esm/boot/profilerApi.mjs.map +1 -0
- package/esm/boot/recorderApi.mjs +43 -0
- package/esm/boot/recorderApi.mjs.map +1 -0
- package/esm/domain/deflate/deflateEncoder.mjs +96 -0
- package/esm/domain/deflate/deflateEncoder.mjs.map +1 -0
- package/esm/domain/deflate/deflateWorker.mjs +90 -0
- package/esm/domain/deflate/deflateWorker.mjs.map +1 -0
- package/esm/domain/deflate/index.mjs +3 -0
- package/esm/domain/getSessionReplayLink.mjs +21 -0
- package/esm/domain/getSessionReplayLink.mjs.map +1 -0
- package/esm/domain/profiling/actionHistory.mjs +36 -0
- package/esm/domain/profiling/actionHistory.mjs.map +1 -0
- package/esm/domain/profiling/kubesenseProfiler.mjs +242 -0
- package/esm/domain/profiling/kubesenseProfiler.mjs.map +1 -0
- package/esm/domain/profiling/longTaskHistory.mjs +21 -0
- package/esm/domain/profiling/longTaskHistory.mjs.map +1 -0
- package/esm/domain/profiling/profilerDebugIds.mjs +18 -0
- package/esm/domain/profiling/profilerDebugIds.mjs.map +1 -0
- package/esm/domain/profiling/profilingContext.mjs +23 -0
- package/esm/domain/profiling/profilingContext.mjs.map +1 -0
- package/esm/domain/profiling/profilingSupported.mjs +9 -0
- package/esm/domain/profiling/profilingSupported.mjs.map +1 -0
- package/esm/domain/profiling/quotaCheck.mjs +66 -0
- package/esm/domain/profiling/quotaCheck.mjs.map +1 -0
- package/esm/domain/profiling/transport/buildProfileEvent.mjs +90 -0
- package/esm/domain/profiling/transport/buildProfileEvent.mjs.map +1 -0
- package/esm/domain/profiling/transport/formDataEmitter.mjs +17 -0
- package/esm/domain/profiling/transport/formDataEmitter.mjs.map +1 -0
- package/esm/domain/profiling/transport/profilingBridge.mjs +12 -0
- package/esm/domain/profiling/transport/profilingBridge.mjs.map +1 -0
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.mjs +7 -0
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.mjs.map +1 -0
- package/esm/domain/profiling/utils/getDefaultViewName.mjs +10 -0
- package/esm/domain/profiling/utils/getDefaultViewName.mjs.map +1 -0
- package/esm/domain/profiling/vitalHistory.mjs +55 -0
- package/esm/domain/profiling/vitalHistory.mjs.map +1 -0
- package/esm/domain/record/assembly.mjs +17 -0
- package/esm/domain/record/assembly.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasHash.mjs +33 -0
- package/esm/domain/record/canvas/canvasHash.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasManager.mjs +99 -0
- package/esm/domain/record/canvas/canvasManager.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasSnapshot.mjs +38 -0
- package/esm/domain/record/canvas/canvasSnapshot.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasUtils.mjs +13 -0
- package/esm/domain/record/canvas/canvasUtils.mjs.map +1 -0
- package/esm/domain/record/elementsScrollPositions.mjs +20 -0
- package/esm/domain/record/elementsScrollPositions.mjs.map +1 -0
- package/esm/domain/record/encoding/changeDecoder.mjs +152 -0
- package/esm/domain/record/encoding/changeDecoder.mjs.map +1 -0
- package/esm/domain/record/encoding/changeEncoder.mjs +146 -0
- package/esm/domain/record/encoding/changeEncoder.mjs.map +1 -0
- package/esm/domain/record/encoding/itemIds.mjs +47 -0
- package/esm/domain/record/encoding/itemIds.mjs.map +1 -0
- package/esm/domain/record/encoding/roles.mjs +64 -0
- package/esm/domain/record/encoding/roles.mjs.map +1 -0
- package/esm/domain/record/encoding/stringIds.mjs +47 -0
- package/esm/domain/record/encoding/stringIds.mjs.map +1 -0
- package/esm/domain/record/encoding/stringTable.mjs +38 -0
- package/esm/domain/record/encoding/stringTable.mjs.map +1 -0
- package/esm/domain/record/eventsUtils.mjs +13 -0
- package/esm/domain/record/eventsUtils.mjs.map +1 -0
- package/esm/domain/record/index.mjs +8 -0
- package/esm/domain/record/internalApi.mjs +62 -0
- package/esm/domain/record/internalApi.mjs.map +1 -0
- package/esm/domain/record/mutationBatch.mjs +43 -0
- package/esm/domain/record/mutationBatch.mjs.map +1 -0
- package/esm/domain/record/record.mjs +79 -0
- package/esm/domain/record/record.mjs.map +1 -0
- package/esm/domain/record/recordingScope.mjs +27 -0
- package/esm/domain/record/recordingScope.mjs.map +1 -0
- package/esm/domain/record/serialization/index.mjs +9 -0
- package/esm/domain/record/serialization/insertionCursor.mjs +54 -0
- package/esm/domain/record/serialization/insertionCursor.mjs.map +1 -0
- package/esm/domain/record/serialization/serializationStats.mjs +31 -0
- package/esm/domain/record/serialization/serializationStats.mjs.map +1 -0
- package/esm/domain/record/serialization/serializationTransaction.mjs +92 -0
- package/esm/domain/record/serialization/serializationTransaction.mjs.map +1 -0
- package/esm/domain/record/serialization/serializationUtils.mjs +53 -0
- package/esm/domain/record/serialization/serializationUtils.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeAttribute.mjs +26 -0
- package/esm/domain/record/serialization/serializeAttribute.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeAttributes.mjs +113 -0
- package/esm/domain/record/serialization/serializeAttributes.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeFullSnapshot.mjs +14 -0
- package/esm/domain/record/serialization/serializeFullSnapshot.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeMutations.mjs +152 -0
- package/esm/domain/record/serialization/serializeMutations.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeNode.mjs +126 -0
- package/esm/domain/record/serialization/serializeNode.mjs.map +1 -0
- package/esm/domain/record/shadowRootsController.mjs +40 -0
- package/esm/domain/record/shadowRootsController.mjs.map +1 -0
- package/esm/domain/record/startFullSnapshots.mjs +42 -0
- package/esm/domain/record/startFullSnapshots.mjs.map +1 -0
- package/esm/domain/record/trackers/index.mjs +13 -0
- package/esm/domain/record/trackers/trackCanvasCapture.mjs +102 -0
- package/esm/domain/record/trackers/trackCanvasCapture.mjs.map +1 -0
- package/esm/domain/record/trackers/trackCanvasContent.mjs +31 -0
- package/esm/domain/record/trackers/trackCanvasContent.mjs.map +1 -0
- package/esm/domain/record/trackers/trackFocus.mjs +17 -0
- package/esm/domain/record/trackers/trackFocus.mjs.map +1 -0
- package/esm/domain/record/trackers/trackInput.mjs +131 -0
- package/esm/domain/record/trackers/trackInput.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMediaInteraction.mjs +25 -0
- package/esm/domain/record/trackers/trackMediaInteraction.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMouseInteraction.mjs +52 -0
- package/esm/domain/record/trackers/trackMouseInteraction.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMove.mjs +48 -0
- package/esm/domain/record/trackers/trackMove.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMutation.mjs +45 -0
- package/esm/domain/record/trackers/trackMutation.mjs.map +1 -0
- package/esm/domain/record/trackers/trackScroll.mjs +40 -0
- package/esm/domain/record/trackers/trackScroll.mjs.map +1 -0
- package/esm/domain/record/trackers/trackStyleSheet.mjs +79 -0
- package/esm/domain/record/trackers/trackStyleSheet.mjs.map +1 -0
- package/esm/domain/record/trackers/trackViewEnd.mjs +20 -0
- package/esm/domain/record/trackers/trackViewEnd.mjs.map +1 -0
- package/esm/domain/record/trackers/trackViewportResize.mjs +39 -0
- package/esm/domain/record/trackers/trackViewportResize.mjs.map +1 -0
- package/esm/domain/record/viewports.mjs +41 -0
- package/esm/domain/record/viewports.mjs.map +1 -0
- package/esm/domain/replayStats.mjs +46 -0
- package/esm/domain/replayStats.mjs.map +1 -0
- package/esm/domain/scriptLoadingError.mjs +19 -0
- package/esm/domain/scriptLoadingError.mjs.map +1 -0
- package/esm/domain/segmentCollection/buildReplayPayload.mjs +25 -0
- package/esm/domain/segmentCollection/buildReplayPayload.mjs.map +1 -0
- package/esm/domain/segmentCollection/buildResourcePayload.mjs +19 -0
- package/esm/domain/segmentCollection/buildResourcePayload.mjs.map +1 -0
- package/esm/domain/segmentCollection/index.mjs +5 -0
- package/esm/domain/segmentCollection/replayResourceCollection.mjs +52 -0
- package/esm/domain/segmentCollection/replayResourceCollection.mjs.map +1 -0
- package/esm/domain/segmentCollection/segment.mjs +52 -0
- package/esm/domain/segmentCollection/segment.mjs.map +1 -0
- package/esm/domain/segmentCollection/segmentCollection.mjs +87 -0
- package/esm/domain/segmentCollection/segmentCollection.mjs.map +1 -0
- package/esm/domain/segmentCollection/startDroppedSegmentRecovery.mjs +28 -0
- package/esm/domain/segmentCollection/startDroppedSegmentRecovery.mjs.map +1 -0
- package/esm/domain/segmentCollection/startSegmentTelemetry.mjs +45 -0
- package/esm/domain/segmentCollection/startSegmentTelemetry.mjs.map +1 -0
- package/esm/domain/startRecordBridge.mjs +13 -0
- package/esm/domain/startRecordBridge.mjs.map +1 -0
- package/esm/domain/startRecorderInitTelemetry.mjs +47 -0
- package/esm/domain/startRecorderInitTelemetry.mjs.map +1 -0
- package/esm/entries/internal.mjs +8 -0
- package/esm/entries/internalSynthetics.mjs +22 -0
- package/esm/entries/internalSynthetics.mjs.map +1 -0
- package/esm/entries/main.mjs +35 -0
- package/esm/entries/main.mjs.map +1 -0
- package/esm/types/sessionReplayConstants.mjs +97 -0
- package/esm/types/sessionReplayConstants.mjs.map +1 -0
- package/internal/package.json +1 -1
- package/internal-synthetics/package.json +1 -1
- package/package.json +26 -15
- package/src/boot/kubesenseRecorder.ts +134 -0
- package/src/boot/lazyLoadProfiler.ts +6 -7
- package/src/boot/lazyLoadRecorder.ts +6 -7
- package/src/boot/postStartStrategy.ts +18 -16
- package/src/boot/profilerApi.ts +29 -19
- package/src/boot/recorderApi.ts +6 -21
- package/src/domain/deflate/deflateEncoder.ts +3 -8
- package/src/domain/deflate/deflateWorker.ts +8 -13
- package/src/domain/deflate/index.ts +1 -0
- package/src/domain/getSessionReplayLink.ts +15 -11
- package/src/domain/profiling/actionHistory.ts +66 -0
- package/src/domain/profiling/{profiler.ts → kubesenseProfiler.ts} +166 -79
- package/src/domain/profiling/longTaskHistory.ts +45 -0
- package/src/domain/profiling/profilerDebugIds.ts +17 -0
- package/src/domain/profiling/profilingContext.ts +8 -3
- package/src/domain/profiling/profilingSupported.ts +2 -7
- package/src/domain/profiling/quotaCheck.ts +89 -0
- package/src/domain/profiling/test-utils/mockedTrace.ts +1 -2
- package/src/domain/profiling/transport/buildProfileEvent.ts +143 -0
- package/src/domain/profiling/transport/formDataEmitter.ts +17 -0
- package/src/domain/profiling/transport/profilingBridge.ts +9 -0
- package/src/domain/profiling/{types/rumProfiler.types.ts → types.ts} +14 -26
- package/src/domain/profiling/vitalHistory.ts +106 -0
- package/src/domain/record/assembly.ts +5 -3
- package/src/domain/record/canvas/canvasHash.ts +54 -0
- package/src/domain/record/canvas/canvasManager.ts +175 -0
- package/src/domain/record/canvas/canvasSnapshot.ts +52 -0
- package/src/domain/record/canvas/canvasUtils.ts +11 -0
- package/src/domain/record/encoding/changeDecoder.ts +287 -0
- package/src/domain/record/encoding/changeEncoder.ts +327 -0
- package/src/domain/record/encoding/index.ts +19 -0
- package/src/domain/record/encoding/itemIds.ts +84 -0
- package/src/domain/record/encoding/roles.ts +136 -0
- package/src/domain/record/encoding/stringIds.ts +70 -0
- package/src/domain/record/encoding/stringTable.ts +68 -0
- package/src/domain/record/index.ts +5 -2
- package/src/domain/record/internalApi.ts +21 -18
- package/src/domain/record/mutationBatch.ts +14 -3
- package/src/domain/record/record.ts +35 -16
- package/src/domain/record/record.types.ts +1 -0
- package/src/domain/record/recordingScope.ts +28 -5
- package/src/domain/record/serialization/index.ts +4 -2
- package/src/domain/record/serialization/insertionCursor.ts +131 -0
- package/src/domain/record/serialization/serialization.types.ts +0 -16
- package/src/domain/record/serialization/serializationTransaction.ts +191 -37
- package/src/domain/record/serialization/serializationUtils.ts +1 -15
- package/src/domain/record/serialization/serializeAttributes.ts +36 -32
- package/src/domain/record/serialization/serializeFullSnapshot.ts +26 -0
- package/src/domain/record/serialization/serializeMutations.ts +357 -0
- package/src/domain/record/serialization/serializeNode.ts +200 -164
- package/src/domain/record/shadowRootsController.ts +4 -3
- package/src/domain/record/startFullSnapshots.ts +28 -41
- package/src/domain/record/trackers/index.ts +2 -1
- package/src/domain/record/trackers/trackCanvasCapture.ts +137 -0
- package/src/domain/record/trackers/trackCanvasContent.ts +46 -0
- package/src/domain/record/trackers/trackFocus.ts +4 -4
- package/src/domain/record/trackers/trackInput.ts +146 -41
- package/src/domain/record/trackers/trackMediaInteraction.ts +0 -1
- package/src/domain/record/trackers/trackMouseInteraction.ts +1 -2
- package/src/domain/record/trackers/trackMove.ts +0 -1
- package/src/domain/record/trackers/trackMutation.ts +17 -355
- package/src/domain/record/trackers/trackScroll.ts +1 -1
- package/src/domain/record/trackers/trackStyleSheet.ts +1 -1
- package/src/domain/record/trackers/trackViewEnd.ts +1 -1
- package/src/domain/record/trackers/trackViewportResize.ts +7 -16
- package/src/domain/record/trackers/tracker.types.ts +1 -1
- package/src/domain/replayStats.ts +5 -0
- package/src/domain/scriptLoadingError.ts +2 -1
- package/src/domain/segmentCollection/buildResourcePayload.ts +20 -0
- package/src/domain/segmentCollection/index.ts +3 -0
- package/src/domain/segmentCollection/replayResourceCollection.ts +79 -0
- package/src/domain/segmentCollection/segment.ts +2 -1
- package/src/domain/segmentCollection/segmentCollection.ts +14 -13
- package/src/domain/segmentCollection/startDroppedSegmentRecovery.ts +37 -0
- package/src/domain/segmentCollection/startSegmentTelemetry.ts +16 -2
- package/src/domain/startRecorderInitTelemetry.ts +5 -3
- package/src/entries/internal.ts +13 -2
- package/src/entries/internalSynthetics.ts +3 -4
- package/src/entries/main.ts +23 -14
- package/src/types/index.ts +1 -0
- package/src/types/profiling.ts +315 -0
- package/src/types/sessionReplay.ts +395 -3
- package/src/types/sessionReplayConstants.ts +109 -0
- package/bundle/chunks/profiler-6f621c66a29d9f39a9bd-kubesense-rum.js +0 -1
- package/bundle/chunks/recorder-c73b8d42b98d4a01f120-kubesense-rum.js +0 -1
- package/cjs/boot/isBrowserSupported.d.ts +0 -4
- package/cjs/boot/isBrowserSupported.js +0 -17
- package/cjs/boot/isBrowserSupported.js.map +0 -1
- package/cjs/boot/startRecording.d.ts +0 -6
- package/cjs/boot/startRecording.js +0 -45
- package/cjs/boot/startRecording.js.map +0 -1
- package/cjs/domain/deflate/index.js.map +0 -1
- package/cjs/domain/profiling/profiler.d.ts +0 -7
- package/cjs/domain/profiling/profiler.js +0 -244
- package/cjs/domain/profiling/profiler.js.map +0 -1
- package/cjs/domain/profiling/test-utils/mockedTrace.js +0 -57
- package/cjs/domain/profiling/test-utils/mockedTrace.js.map +0 -1
- package/cjs/domain/profiling/transport/assembly.d.ts +0 -21
- package/cjs/domain/profiling/transport/assembly.js +0 -45
- package/cjs/domain/profiling/transport/assembly.js.map +0 -1
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.d.ts +0 -25
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.js +0 -50
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.js.map +0 -1
- package/cjs/domain/profiling/types/index.d.ts +0 -2
- package/cjs/domain/profiling/types/index.js +0 -3
- package/cjs/domain/profiling/types/index.js.map +0 -1
- package/cjs/domain/profiling/types/profilerApi.types.d.ts +0 -58
- package/cjs/domain/profiling/types/profilerApi.types.js +0 -5
- package/cjs/domain/profiling/types/profilerApi.types.js.map +0 -1
- package/cjs/domain/profiling/types/rumProfiler.types.js +0 -3
- package/cjs/domain/profiling/types/rumProfiler.types.js.map +0 -1
- package/cjs/domain/profiling/utils/getNumberOfSamples.d.ts +0 -7
- package/cjs/domain/profiling/utils/getNumberOfSamples.js +0 -18
- package/cjs/domain/profiling/utils/getNumberOfSamples.js.map +0 -1
- package/cjs/domain/record/eventIds.d.ts +0 -4
- package/cjs/domain/record/eventIds.js +0 -16
- package/cjs/domain/record/eventIds.js.map +0 -1
- package/cjs/domain/record/index.js.map +0 -1
- package/cjs/domain/record/nodeIds.d.ts +0 -15
- package/cjs/domain/record/nodeIds.js +0 -32
- package/cjs/domain/record/nodeIds.js.map +0 -1
- package/cjs/domain/record/record.types.js +0 -3
- package/cjs/domain/record/record.types.js.map +0 -1
- package/cjs/domain/record/serialization/index.js.map +0 -1
- package/cjs/domain/record/serialization/serialization.types.js +0 -3
- package/cjs/domain/record/serialization/serialization.types.js.map +0 -1
- package/cjs/domain/record/serialization/serializeDocument.d.ts +0 -3
- package/cjs/domain/record/serialization/serializeDocument.js +0 -11
- package/cjs/domain/record/serialization/serializeDocument.js.map +0 -1
- package/cjs/domain/record/serialization/serializeStyleSheets.d.ts +0 -2
- package/cjs/domain/record/serialization/serializeStyleSheets.js +0 -19
- package/cjs/domain/record/serialization/serializeStyleSheets.js.map +0 -1
- package/cjs/domain/record/trackers/index.js.map +0 -1
- package/cjs/domain/record/trackers/trackFrustration.d.ts +0 -7
- package/cjs/domain/record/trackers/trackFrustration.js +0 -31
- package/cjs/domain/record/trackers/trackFrustration.js.map +0 -1
- package/cjs/domain/record/trackers/tracker.types.js +0 -3
- package/cjs/domain/record/trackers/tracker.types.js.map +0 -1
- package/cjs/domain/segmentCollection/index.js.map +0 -1
- package/cjs/entries/internal.js.map +0 -1
- package/cjs/types/index.js +0 -18
- package/cjs/types/index.js.map +0 -1
- package/cjs/types/sessionReplay.js +0 -7
- package/cjs/types/sessionReplay.js.map +0 -1
- package/esm/boot/isBrowserSupported.d.ts +0 -4
- package/esm/boot/isBrowserSupported.js +0 -14
- package/esm/boot/isBrowserSupported.js.map +0 -1
- package/esm/boot/lazyLoadProfiler.d.ts +0 -4
- package/esm/boot/lazyLoadProfiler.js +0 -18
- package/esm/boot/lazyLoadProfiler.js.map +0 -1
- package/esm/boot/lazyLoadRecorder.d.ts +0 -4
- package/esm/boot/lazyLoadRecorder.js +0 -18
- package/esm/boot/lazyLoadRecorder.js.map +0 -1
- package/esm/boot/postStartStrategy.d.ts +0 -33
- package/esm/boot/postStartStrategy.js +0 -115
- package/esm/boot/postStartStrategy.js.map +0 -1
- package/esm/boot/preStartStrategy.d.ts +0 -6
- package/esm/boot/preStartStrategy.js +0 -21
- package/esm/boot/preStartStrategy.js.map +0 -1
- package/esm/boot/profilerApi.d.ts +0 -2
- package/esm/boot/profilerApi.js +0 -50
- package/esm/boot/profilerApi.js.map +0 -1
- package/esm/boot/recorderApi.d.ts +0 -4
- package/esm/boot/recorderApi.js +0 -70
- package/esm/boot/recorderApi.js.map +0 -1
- package/esm/boot/startRecording.d.ts +0 -6
- package/esm/boot/startRecording.js +0 -42
- package/esm/boot/startRecording.js.map +0 -1
- package/esm/domain/deflate/deflateEncoder.d.ts +0 -3
- package/esm/domain/deflate/deflateEncoder.js +0 -107
- package/esm/domain/deflate/deflateEncoder.js.map +0 -1
- package/esm/domain/deflate/deflateWorker.d.ts +0 -30
- package/esm/domain/deflate/deflateWorker.js +0 -97
- package/esm/domain/deflate/deflateWorker.js.map +0 -1
- package/esm/domain/deflate/index.d.ts +0 -3
- package/esm/domain/deflate/index.js +0 -3
- package/esm/domain/deflate/index.js.map +0 -1
- package/esm/domain/getSessionReplayLink.d.ts +0 -2
- package/esm/domain/getSessionReplayLink.js +0 -32
- package/esm/domain/getSessionReplayLink.js.map +0 -1
- package/esm/domain/profiling/profiler.d.ts +0 -7
- package/esm/domain/profiling/profiler.js +0 -240
- package/esm/domain/profiling/profiler.js.map +0 -1
- package/esm/domain/profiling/profilingContext.d.ts +0 -6
- package/esm/domain/profiling/profilingContext.js +0 -25
- package/esm/domain/profiling/profilingContext.js.map +0 -1
- package/esm/domain/profiling/profilingSupported.d.ts +0 -1
- package/esm/domain/profiling/profilingSupported.js +0 -8
- package/esm/domain/profiling/profilingSupported.js.map +0 -1
- package/esm/domain/profiling/test-utils/mockedTrace.d.ts +0 -3
- package/esm/domain/profiling/test-utils/mockedTrace.js +0 -54
- package/esm/domain/profiling/test-utils/mockedTrace.js.map +0 -1
- package/esm/domain/profiling/transport/assembly.d.ts +0 -21
- package/esm/domain/profiling/transport/assembly.js +0 -42
- package/esm/domain/profiling/transport/assembly.js.map +0 -1
- package/esm/domain/profiling/transport/buildProfileEventAttributes.d.ts +0 -25
- package/esm/domain/profiling/transport/buildProfileEventAttributes.js +0 -47
- package/esm/domain/profiling/transport/buildProfileEventAttributes.js.map +0 -1
- package/esm/domain/profiling/types/index.d.ts +0 -2
- package/esm/domain/profiling/types/index.js +0 -2
- package/esm/domain/profiling/types/index.js.map +0 -1
- package/esm/domain/profiling/types/profilerApi.types.d.ts +0 -58
- package/esm/domain/profiling/types/profilerApi.types.js +0 -4
- package/esm/domain/profiling/types/profilerApi.types.js.map +0 -1
- package/esm/domain/profiling/types/rumProfiler.types.d.ts +0 -72
- package/esm/domain/profiling/types/rumProfiler.types.js +0 -2
- package/esm/domain/profiling/types/rumProfiler.types.js.map +0 -1
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +0 -1
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js +0 -3
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js.map +0 -1
- package/esm/domain/profiling/utils/getDefaultViewName.d.ts +0 -1
- package/esm/domain/profiling/utils/getDefaultViewName.js +0 -11
- package/esm/domain/profiling/utils/getDefaultViewName.js.map +0 -1
- package/esm/domain/profiling/utils/getNumberOfSamples.d.ts +0 -7
- package/esm/domain/profiling/utils/getNumberOfSamples.js +0 -15
- package/esm/domain/profiling/utils/getNumberOfSamples.js.map +0 -1
- package/esm/domain/record/assembly.d.ts +0 -2
- package/esm/domain/record/assembly.js +0 -13
- package/esm/domain/record/assembly.js.map +0 -1
- package/esm/domain/record/elementsScrollPositions.d.ts +0 -10
- package/esm/domain/record/elementsScrollPositions.js +0 -20
- package/esm/domain/record/elementsScrollPositions.js.map +0 -1
- package/esm/domain/record/eventIds.d.ts +0 -4
- package/esm/domain/record/eventIds.js +0 -13
- package/esm/domain/record/eventIds.js.map +0 -1
- package/esm/domain/record/eventsUtils.d.ts +0 -2
- package/esm/domain/record/eventsUtils.js +0 -11
- package/esm/domain/record/eventsUtils.js.map +0 -1
- package/esm/domain/record/index.d.ts +0 -7
- package/esm/domain/record/index.js +0 -6
- package/esm/domain/record/index.js.map +0 -1
- package/esm/domain/record/internalApi.d.ts +0 -22
- package/esm/domain/record/internalApi.js +0 -53
- package/esm/domain/record/internalApi.js.map +0 -1
- package/esm/domain/record/mutationBatch.d.ts +0 -12
- package/esm/domain/record/mutationBatch.js +0 -40
- package/esm/domain/record/mutationBatch.js.map +0 -1
- package/esm/domain/record/nodeIds.d.ts +0 -15
- package/esm/domain/record/nodeIds.js +0 -29
- package/esm/domain/record/nodeIds.js.map +0 -1
- package/esm/domain/record/record.d.ts +0 -16
- package/esm/domain/record/record.js +0 -54
- package/esm/domain/record/record.js.map +0 -1
- package/esm/domain/record/record.types.d.ts +0 -4
- package/esm/domain/record/record.types.js +0 -2
- package/esm/domain/record/record.types.js.map +0 -1
- package/esm/domain/record/recordingScope.d.ts +0 -19
- package/esm/domain/record/recordingScope.js +0 -10
- package/esm/domain/record/recordingScope.js.map +0 -1
- package/esm/domain/record/serialization/index.d.ts +0 -8
- package/esm/domain/record/serialization/index.js +0 -7
- package/esm/domain/record/serialization/index.js.map +0 -1
- package/esm/domain/record/serialization/serialization.types.d.ts +0 -28
- package/esm/domain/record/serialization/serialization.types.js +0 -2
- package/esm/domain/record/serialization/serialization.types.js.map +0 -1
- package/esm/domain/record/serialization/serializationStats.d.ts +0 -12
- package/esm/domain/record/serialization/serializationStats.js +0 -27
- package/esm/domain/record/serialization/serializationStats.js.map +0 -1
- package/esm/domain/record/serialization/serializationTransaction.d.ts +0 -45
- package/esm/domain/record/serialization/serializationTransaction.js +0 -35
- package/esm/domain/record/serialization/serializationTransaction.js.map +0 -1
- package/esm/domain/record/serialization/serializationUtils.d.ts +0 -18
- package/esm/domain/record/serialization/serializationUtils.js +0 -80
- package/esm/domain/record/serialization/serializationUtils.js.map +0 -1
- package/esm/domain/record/serialization/serializeAttribute.d.ts +0 -4
- package/esm/domain/record/serialization/serializeAttribute.js +0 -38
- package/esm/domain/record/serialization/serializeAttribute.js.map +0 -1
- package/esm/domain/record/serialization/serializeAttributes.d.ts +0 -7
- package/esm/domain/record/serialization/serializeAttributes.js +0 -161
- package/esm/domain/record/serialization/serializeAttributes.js.map +0 -1
- package/esm/domain/record/serialization/serializeDocument.d.ts +0 -3
- package/esm/domain/record/serialization/serializeDocument.js +0 -8
- package/esm/domain/record/serialization/serializeDocument.js.map +0 -1
- package/esm/domain/record/serialization/serializeNode.d.ts +0 -7
- package/esm/domain/record/serialization/serializeNode.js +0 -149
- package/esm/domain/record/serialization/serializeNode.js.map +0 -1
- package/esm/domain/record/serialization/serializeStyleSheets.d.ts +0 -2
- package/esm/domain/record/serialization/serializeStyleSheets.js +0 -16
- package/esm/domain/record/serialization/serializeStyleSheets.js.map +0 -1
- package/esm/domain/record/shadowRootsController.d.ts +0 -11
- package/esm/domain/record/shadowRootsController.js +0 -41
- package/esm/domain/record/shadowRootsController.js.map +0 -1
- package/esm/domain/record/startFullSnapshots.d.ts +0 -9
- package/esm/domain/record/startFullSnapshots.js +0 -55
- package/esm/domain/record/startFullSnapshots.js.map +0 -1
- package/esm/domain/record/trackers/index.d.ts +0 -12
- package/esm/domain/record/trackers/index.js +0 -12
- package/esm/domain/record/trackers/index.js.map +0 -1
- package/esm/domain/record/trackers/trackFocus.d.ts +0 -5
- package/esm/domain/record/trackers/trackFocus.js +0 -12
- package/esm/domain/record/trackers/trackFocus.js.map +0 -1
- package/esm/domain/record/trackers/trackFrustration.d.ts +0 -7
- package/esm/domain/record/trackers/trackFrustration.js +0 -28
- package/esm/domain/record/trackers/trackFrustration.js.map +0 -1
- package/esm/domain/record/trackers/trackInput.d.ts +0 -4
- package/esm/domain/record/trackers/trackInput.js +0 -101
- package/esm/domain/record/trackers/trackInput.js.map +0 -1
- package/esm/domain/record/trackers/trackMediaInteraction.d.ts +0 -5
- package/esm/domain/record/trackers/trackMediaInteraction.js +0 -26
- package/esm/domain/record/trackers/trackMediaInteraction.js.map +0 -1
- package/esm/domain/record/trackers/trackMouseInteraction.d.ts +0 -5
- package/esm/domain/record/trackers/trackMouseInteraction.js +0 -56
- package/esm/domain/record/trackers/trackMouseInteraction.js.map +0 -1
- package/esm/domain/record/trackers/trackMove.d.ts +0 -9
- package/esm/domain/record/trackers/trackMove.js +0 -51
- package/esm/domain/record/trackers/trackMove.js.map +0 -1
- package/esm/domain/record/trackers/trackMutation.d.ts +0 -11
- package/esm/domain/record/trackers/trackMutation.js +0 -266
- package/esm/domain/record/trackers/trackMutation.js.map +0 -1
- package/esm/domain/record/trackers/trackScroll.d.ts +0 -5
- package/esm/domain/record/trackers/trackScroll.js +0 -45
- package/esm/domain/record/trackers/trackScroll.js.map +0 -1
- package/esm/domain/record/trackers/trackStyleSheet.d.ts +0 -6
- package/esm/domain/record/trackers/trackStyleSheet.js +0 -85
- package/esm/domain/record/trackers/trackStyleSheet.js.map +0 -1
- package/esm/domain/record/trackers/trackViewEnd.d.ts +0 -5
- package/esm/domain/record/trackers/trackViewEnd.js +0 -17
- package/esm/domain/record/trackers/trackViewEnd.js.map +0 -1
- package/esm/domain/record/trackers/trackViewportResize.d.ts +0 -6
- package/esm/domain/record/trackers/trackViewportResize.js +0 -42
- package/esm/domain/record/trackers/trackViewportResize.js.map +0 -1
- package/esm/domain/record/trackers/tracker.types.d.ts +0 -3
- package/esm/domain/record/trackers/tracker.types.js +0 -2
- package/esm/domain/record/trackers/tracker.types.js.map +0 -1
- package/esm/domain/record/viewports.d.ts +0 -20
- package/esm/domain/record/viewports.js +0 -55
- package/esm/domain/record/viewports.js.map +0 -1
- package/esm/domain/replayStats.d.ts +0 -8
- package/esm/domain/replayStats.js +0 -51
- package/esm/domain/replayStats.js.map +0 -1
- package/esm/domain/scriptLoadingError.d.ts +0 -6
- package/esm/domain/scriptLoadingError.js +0 -23
- package/esm/domain/scriptLoadingError.js.map +0 -1
- package/esm/domain/segmentCollection/buildReplayPayload.d.ts +0 -15
- package/esm/domain/segmentCollection/buildReplayPayload.js +0 -23
- package/esm/domain/segmentCollection/buildReplayPayload.js.map +0 -1
- package/esm/domain/segmentCollection/index.d.ts +0 -4
- package/esm/domain/segmentCollection/index.js +0 -4
- package/esm/domain/segmentCollection/index.js.map +0 -1
- package/esm/domain/segmentCollection/segment.d.ts +0 -16
- package/esm/domain/segmentCollection/segment.js +0 -46
- package/esm/domain/segmentCollection/segment.js.map +0 -1
- package/esm/domain/segmentCollection/segmentCollection.d.ts +0 -31
- package/esm/domain/segmentCollection/segmentCollection.js +0 -106
- package/esm/domain/segmentCollection/segmentCollection.js.map +0 -1
- package/esm/domain/segmentCollection/startSegmentTelemetry.d.ts +0 -6
- package/esm/domain/segmentCollection/startSegmentTelemetry.js +0 -44
- package/esm/domain/segmentCollection/startSegmentTelemetry.js.map +0 -1
- package/esm/domain/startRecordBridge.d.ts +0 -5
- package/esm/domain/startRecordBridge.js +0 -14
- package/esm/domain/startRecordBridge.js.map +0 -1
- package/esm/domain/startRecorderInitTelemetry.d.ts +0 -15
- package/esm/domain/startRecorderInitTelemetry.js +0 -52
- package/esm/domain/startRecorderInitTelemetry.js.map +0 -1
- package/esm/entries/internal.d.ts +0 -11
- package/esm/entries/internal.js +0 -4
- package/esm/entries/internal.js.map +0 -1
- package/esm/entries/internalSynthetics.d.ts +0 -2
- package/esm/entries/internalSynthetics.js +0 -23
- package/esm/entries/internalSynthetics.js.map +0 -1
- package/esm/entries/main.d.ts +0 -23
- package/esm/entries/main.js +0 -31
- package/esm/entries/main.js.map +0 -1
- package/esm/types/index.d.ts +0 -2
- package/esm/types/index.js +0 -2
- package/esm/types/index.js.map +0 -1
- package/esm/types/sessionReplay.d.ts +0 -703
- package/esm/types/sessionReplay.js +0 -6
- package/esm/types/sessionReplay.js.map +0 -1
- package/esm/types/sessionReplayConstants.d.ts +0 -49
- package/esm/types/sessionReplayConstants.js +0 -46
- package/esm/types/sessionReplayConstants.js.map +0 -1
- package/src/boot/isBrowserSupported.ts +0 -14
- package/src/boot/startRecording.ts +0 -70
- package/src/domain/profiling/transport/assembly.ts +0 -78
- package/src/domain/profiling/transport/buildProfileEventAttributes.ts +0 -66
- package/src/domain/profiling/types/index.ts +0 -2
- package/src/domain/profiling/types/profilerApi.types.ts +0 -87
- package/src/domain/profiling/utils/getNumberOfSamples.ts +0 -16
- package/src/domain/record/eventIds.ts +0 -17
- package/src/domain/record/nodeIds.ts +0 -46
- package/src/domain/record/serialization/serializeDocument.ts +0 -13
- package/src/domain/record/serialization/serializeStyleSheets.ts +0 -18
- package/src/domain/record/trackers/trackFrustration.ts +0 -41
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { clockDrift } from '@kubesense/kubesense-js-core/time'
|
|
2
|
+
import { buildTags } from '@kubesense/kubesense-browser-core'
|
|
3
|
+
import type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'
|
|
4
|
+
import type { BrowserProfileEvent, BrowserProfilerTrace, RumProfilerVitalEntry, RumViewEntry } from '../../../types'
|
|
5
|
+
|
|
6
|
+
export interface ProfileEventAttributes {
|
|
7
|
+
application: {
|
|
8
|
+
id: string
|
|
9
|
+
}
|
|
10
|
+
session?: {
|
|
11
|
+
id: string
|
|
12
|
+
}
|
|
13
|
+
view?: {
|
|
14
|
+
id: string[]
|
|
15
|
+
name: string[]
|
|
16
|
+
}
|
|
17
|
+
long_task?: {
|
|
18
|
+
id: string[]
|
|
19
|
+
}
|
|
20
|
+
action?: {
|
|
21
|
+
id: string[]
|
|
22
|
+
label: string[]
|
|
23
|
+
}
|
|
24
|
+
vital?: {
|
|
25
|
+
id: string[]
|
|
26
|
+
label: string[]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Builds a BrowserProfileEvent from a trace.
|
|
32
|
+
*/
|
|
33
|
+
export function buildProfileEvent(
|
|
34
|
+
profilerTrace: BrowserProfilerTrace,
|
|
35
|
+
configuration: RumConfiguration,
|
|
36
|
+
sessionId: string | undefined
|
|
37
|
+
): BrowserProfileEvent {
|
|
38
|
+
const tags = buildTags(configuration) // TODO: get that from the tagContext hook
|
|
39
|
+
const profileAttributes = buildProfileEventAttributes(profilerTrace, configuration.applicationId, sessionId)
|
|
40
|
+
const profileEventTags = buildProfileEventTags(tags)
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
...profileAttributes,
|
|
44
|
+
attachments: ['wall-time.json'],
|
|
45
|
+
start: new Date(profilerTrace.startClocks.timeStamp).toISOString(),
|
|
46
|
+
end: new Date(profilerTrace.endClocks.timeStamp).toISOString(),
|
|
47
|
+
family: 'chrome',
|
|
48
|
+
runtime: 'chrome',
|
|
49
|
+
format: 'json',
|
|
50
|
+
version: 4, // Ingestion event version (not the version application tag)
|
|
51
|
+
tags_profiler: profileEventTags.join(','),
|
|
52
|
+
_kubesense: {
|
|
53
|
+
clock_drift: clockDrift(),
|
|
54
|
+
},
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Builds attributes for the Profile Event.
|
|
60
|
+
*
|
|
61
|
+
* @param profilerTrace - Profiler trace
|
|
62
|
+
* @param applicationId - application id.
|
|
63
|
+
* @param sessionId - session id.
|
|
64
|
+
* @returns Additional attributes.
|
|
65
|
+
*/
|
|
66
|
+
export function buildProfileEventAttributes(
|
|
67
|
+
profilerTrace: BrowserProfilerTrace,
|
|
68
|
+
applicationId: string,
|
|
69
|
+
sessionId: string | undefined
|
|
70
|
+
): ProfileEventAttributes {
|
|
71
|
+
// Extract view ids and names from the profiler trace and add them as attributes of the profile event.
|
|
72
|
+
// This will be used to filter the profiles by @view.id and/or @view.name.
|
|
73
|
+
const { ids, names } = extractViewIdsAndNames(profilerTrace.views)
|
|
74
|
+
|
|
75
|
+
const longTaskIds: string[] = profilerTrace.longTasks.map((longTask) => longTask.id).filter((id) => id !== undefined)
|
|
76
|
+
|
|
77
|
+
const actionIds: string[] =
|
|
78
|
+
profilerTrace.actions?.map((longTask) => longTask.id).filter((id) => id !== undefined) ?? []
|
|
79
|
+
|
|
80
|
+
const { ids: vitalIds, labels: vitalLabels } = extractVitalIdsAndLabels(profilerTrace.vitals)
|
|
81
|
+
|
|
82
|
+
const attributes: ProfileEventAttributes = { application: { id: applicationId } }
|
|
83
|
+
|
|
84
|
+
if (sessionId) {
|
|
85
|
+
attributes.session = { id: sessionId }
|
|
86
|
+
}
|
|
87
|
+
if (ids.length) {
|
|
88
|
+
attributes.view = { id: ids, name: names }
|
|
89
|
+
}
|
|
90
|
+
if (longTaskIds.length) {
|
|
91
|
+
attributes.long_task = { id: longTaskIds }
|
|
92
|
+
}
|
|
93
|
+
if (actionIds.length) {
|
|
94
|
+
attributes.action = { id: actionIds, label: [] }
|
|
95
|
+
}
|
|
96
|
+
if (vitalIds.length) {
|
|
97
|
+
attributes.vital = { id: vitalIds, label: vitalLabels }
|
|
98
|
+
}
|
|
99
|
+
return attributes
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function extractViewIdsAndNames(views: RumViewEntry[]): { ids: string[]; names: string[] } {
|
|
103
|
+
const result: { ids: string[]; names: string[] } = { ids: [], names: [] }
|
|
104
|
+
for (const view of views) {
|
|
105
|
+
result.ids.push(view.viewId)
|
|
106
|
+
|
|
107
|
+
if (view.viewName) {
|
|
108
|
+
result.names.push(view.viewName)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Remove duplicates
|
|
113
|
+
result.names = Array.from(new Set(result.names))
|
|
114
|
+
|
|
115
|
+
return result
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function extractVitalIdsAndLabels(vitals?: RumProfilerVitalEntry[]): {
|
|
119
|
+
ids: string[]
|
|
120
|
+
labels: string[]
|
|
121
|
+
} {
|
|
122
|
+
const result: { ids: string[]; labels: string[] } = { ids: [], labels: [] }
|
|
123
|
+
|
|
124
|
+
if (!vitals) {
|
|
125
|
+
return result
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
for (const vital of vitals) {
|
|
129
|
+
result.ids.push(vital.id)
|
|
130
|
+
result.labels.push(vital.label)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Remove duplicates
|
|
134
|
+
result.labels = Array.from(new Set(result.labels))
|
|
135
|
+
|
|
136
|
+
return result
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function buildProfileEventTags(tags: string[]): string[] {
|
|
140
|
+
// Tags already contains the common tags for all events. (service, env, version, etc.)
|
|
141
|
+
// Here we are adding some specific-to-profiling tags.
|
|
142
|
+
return tags.concat(['language:javascript', 'runtime:chrome', 'family:chrome', 'host:browser'])
|
|
143
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Encoder } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import { DeflateEncoderStreamId } from '@kubesense/kubesense-browser-core'
|
|
3
|
+
import type { LifeCycle, RumConfiguration, TransportPayload } from '@kubesense/kubesense-browser-rum-core'
|
|
4
|
+
import { createFormDataTransport } from '@kubesense/kubesense-browser-rum-core'
|
|
5
|
+
import type { ProfilingPayload } from '../types'
|
|
6
|
+
|
|
7
|
+
export function createFormDataEmitter(
|
|
8
|
+
configuration: RumConfiguration,
|
|
9
|
+
lifeCycle: LifeCycle,
|
|
10
|
+
createEncoder: (streamId: DeflateEncoderStreamId) => Encoder
|
|
11
|
+
): (payload: ProfilingPayload) => void {
|
|
12
|
+
const transport = createFormDataTransport(configuration, lifeCycle, createEncoder, DeflateEncoderStreamId.PROFILING)
|
|
13
|
+
return ({ profile, trace }: ProfilingPayload) => {
|
|
14
|
+
const formPayload = { event: profile, 'wall-time.json': trace }
|
|
15
|
+
void transport.send(formPayload as unknown as TransportPayload)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getEventBridge } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import type { ProfilingPayload } from '../types'
|
|
3
|
+
|
|
4
|
+
export function createBridgeEmitter(): (payload: ProfilingPayload) => void {
|
|
5
|
+
const bridge = getEventBridge<'profile', ProfilingPayload>()!
|
|
6
|
+
return (payload: ProfilingPayload) => {
|
|
7
|
+
bridge.send('profile', payload)
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
}
|
|
1
|
+
import type { Profiler } from '@kubesense/kubesense-js-core/util'
|
|
2
|
+
import type { ClocksState } from '@kubesense/kubesense-js-core/time'
|
|
3
|
+
import type { TimeoutId } from '@kubesense/kubesense-browser-core'
|
|
4
|
+
import type { BrowserProfileEvent, BrowserProfilerTrace, RumViewEntry } from '../../types'
|
|
5
|
+
import type { LongTaskContext } from './longTaskHistory'
|
|
13
6
|
|
|
14
7
|
/**
|
|
15
8
|
* Additional data recorded during profiling session
|
|
@@ -21,23 +14,12 @@ export interface RumProfilerEnrichmentData {
|
|
|
21
14
|
readonly views: RumViewEntry[]
|
|
22
15
|
}
|
|
23
16
|
|
|
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
17
|
/**
|
|
36
18
|
* Describes profiler session state when it's stopped
|
|
37
19
|
*/
|
|
38
20
|
export interface RumProfilerStoppedInstance {
|
|
39
21
|
readonly state: 'stopped'
|
|
40
|
-
readonly stateReason: 'session-expired' | 'stopped-by-user' | 'initializing'
|
|
22
|
+
readonly stateReason: 'session-expired' | 'stopped-by-user' | 'initializing' | 'quota_ko'
|
|
41
23
|
}
|
|
42
24
|
|
|
43
25
|
/**
|
|
@@ -61,21 +43,27 @@ export interface RumProfilerRunningInstance extends RumProfilerEnrichmentData {
|
|
|
61
43
|
readonly timeoutId: TimeoutId
|
|
62
44
|
/** Clean-up tasks to execute after running the Profiler */
|
|
63
45
|
readonly cleanupTasks: Array<() => void>
|
|
46
|
+
/** Session ID */
|
|
47
|
+
readonly sessionId: string | undefined
|
|
64
48
|
}
|
|
65
49
|
|
|
66
50
|
export type RumProfilerInstance = RumProfilerStoppedInstance | RumProfilerPausedInstance | RumProfilerRunningInstance
|
|
67
51
|
|
|
68
52
|
export interface RUMProfiler {
|
|
69
53
|
start: () => void
|
|
70
|
-
stop: () =>
|
|
54
|
+
stop: () => void
|
|
71
55
|
isStopped: () => boolean
|
|
72
56
|
isRunning: () => boolean
|
|
73
57
|
isPaused: () => boolean
|
|
74
58
|
}
|
|
75
59
|
|
|
60
|
+
export interface ProfilingPayload {
|
|
61
|
+
profile: BrowserProfileEvent
|
|
62
|
+
trace: BrowserProfilerTrace
|
|
63
|
+
}
|
|
64
|
+
|
|
76
65
|
export interface RUMProfilerConfiguration {
|
|
77
66
|
sampleIntervalMs: number // Sample stack trace every x milliseconds (defaults to 10ms for Unix, 16ms on Windows)
|
|
78
67
|
collectIntervalMs: number // Interval for collecting RUM Profiles (defaults to 1min)
|
|
79
68
|
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
69
|
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { ClocksState, Duration } from '@kubesense/kubesense-js-core/time'
|
|
2
|
+
import { elapsed, addDuration } from '@kubesense/kubesense-js-core/time'
|
|
3
|
+
import { createValueHistory, SESSION_TIME_OUT_DELAY } from '@kubesense/kubesense-browser-core'
|
|
4
|
+
import type { LifeCycle } from '@kubesense/kubesense-browser-rum-core'
|
|
5
|
+
import { LifeCycleEventType, VitalType } from '@kubesense/kubesense-browser-rum-core'
|
|
6
|
+
|
|
7
|
+
export const VITAL_ID_HISTORY_TIME_OUT_DELAY = SESSION_TIME_OUT_DELAY
|
|
8
|
+
|
|
9
|
+
export interface VitalContext {
|
|
10
|
+
id: string
|
|
11
|
+
type: VitalType
|
|
12
|
+
label: string
|
|
13
|
+
operationKey?: string
|
|
14
|
+
duration?: Duration
|
|
15
|
+
startClocks: ClocksState
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function createVitalHistory(lifeCycle: LifeCycle) {
|
|
19
|
+
const history = createValueHistory<VitalContext>({
|
|
20
|
+
expireDelay: VITAL_ID_HISTORY_TIME_OUT_DELAY,
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
lifeCycle.subscribe(LifeCycleEventType.DURATION_VITAL_STARTED, (vitalStart) => {
|
|
24
|
+
history.add(
|
|
25
|
+
{
|
|
26
|
+
id: vitalStart.id,
|
|
27
|
+
type: VitalType.DURATION,
|
|
28
|
+
startClocks: vitalStart.startClocks,
|
|
29
|
+
duration: undefined,
|
|
30
|
+
label: vitalStart.name,
|
|
31
|
+
},
|
|
32
|
+
vitalStart.startClocks.relative
|
|
33
|
+
)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
lifeCycle.subscribe(LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, ({ rawRumEvent, startClocks, duration }) => {
|
|
37
|
+
if (rawRumEvent.type !== 'vital') {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// For operation step vitals, we only tag profiles with the start step's id.
|
|
42
|
+
// This means that if we receive an end step vital, we need to look for the
|
|
43
|
+
// corresponding start one and update its duration. If we receive a start step vital
|
|
44
|
+
// however, we just store it and wait for the end step.
|
|
45
|
+
if (rawRumEvent.vital.type === VitalType.OPERATION_STEP) {
|
|
46
|
+
if (rawRumEvent.vital.step_type === 'start') {
|
|
47
|
+
history.add(
|
|
48
|
+
{
|
|
49
|
+
id: rawRumEvent.vital.id,
|
|
50
|
+
type: rawRumEvent.vital.type,
|
|
51
|
+
operationKey: rawRumEvent.vital.operation_key,
|
|
52
|
+
startClocks,
|
|
53
|
+
label: rawRumEvent.vital.name,
|
|
54
|
+
},
|
|
55
|
+
startClocks.relative
|
|
56
|
+
)
|
|
57
|
+
} else if (rawRumEvent.vital.step_type === 'end') {
|
|
58
|
+
const historyEntry = history
|
|
59
|
+
.findAllEntries()
|
|
60
|
+
.find(
|
|
61
|
+
(entry) =>
|
|
62
|
+
entry.value.type === VitalType.OPERATION_STEP &&
|
|
63
|
+
entry.value.label === rawRumEvent.vital.name &&
|
|
64
|
+
entry.value.operationKey === rawRumEvent.vital.operation_key
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
if (!historyEntry) {
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
historyEntry.value.duration = elapsed(historyEntry.value.startClocks.relative, startClocks.relative)
|
|
72
|
+
historyEntry.close(startClocks.relative)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// All the other vital types are handled normally (i.e. stored in the
|
|
79
|
+
// history and tagged on the profiles)
|
|
80
|
+
const historyEntry = history
|
|
81
|
+
.getEntries(startClocks.relative)
|
|
82
|
+
.find((entry) => entry.value.id === rawRumEvent.vital.id)
|
|
83
|
+
|
|
84
|
+
if (historyEntry) {
|
|
85
|
+
historyEntry.value.duration = duration!
|
|
86
|
+
historyEntry.close(addDuration(startClocks.relative, duration!))
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
history
|
|
91
|
+
.add(
|
|
92
|
+
{
|
|
93
|
+
id: rawRumEvent.vital.id,
|
|
94
|
+
type: rawRumEvent.vital.type,
|
|
95
|
+
operationKey: rawRumEvent.vital.operation_key,
|
|
96
|
+
startClocks,
|
|
97
|
+
duration,
|
|
98
|
+
label: rawRumEvent.vital.name,
|
|
99
|
+
},
|
|
100
|
+
startClocks.relative
|
|
101
|
+
)
|
|
102
|
+
.close(addDuration(startClocks.relative, duration!))
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
return history
|
|
106
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { timeStampNow } from '@kubesense/kubesense-
|
|
1
|
+
import { timeStampNow } from '@kubesense/kubesense-js-core/time'
|
|
2
|
+
import type { TimeStamp } from '@kubesense/kubesense-js-core/time'
|
|
2
3
|
import type { BrowserIncrementalData, BrowserIncrementalSnapshotRecord } from '../../types'
|
|
3
4
|
import { RecordType } from '../../types'
|
|
4
5
|
|
|
5
6
|
export function assembleIncrementalSnapshot<Data extends BrowserIncrementalData>(
|
|
6
7
|
source: Data['source'],
|
|
7
|
-
data: Omit<Data, 'source'
|
|
8
|
+
data: Omit<Data, 'source'>,
|
|
9
|
+
timestamp: TimeStamp = timeStampNow()
|
|
8
10
|
): BrowserIncrementalSnapshotRecord {
|
|
9
11
|
return {
|
|
10
12
|
data: {
|
|
@@ -12,6 +14,6 @@ export function assembleIncrementalSnapshot<Data extends BrowserIncrementalData>
|
|
|
12
14
|
...data,
|
|
13
15
|
} as Data,
|
|
14
16
|
type: RecordType.IncrementalSnapshot,
|
|
15
|
-
timestamp
|
|
17
|
+
timestamp,
|
|
16
18
|
}
|
|
17
19
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { mockable } from '@kubesense/kubesense-browser-core'
|
|
2
|
+
import { globalObject } from '@kubesense/kubesense-js-core/util'
|
|
3
|
+
import type { CanvasSnapshot } from './canvasSnapshot'
|
|
4
|
+
import { createDownscaledCanvas } from './canvasSnapshot'
|
|
5
|
+
|
|
6
|
+
export function computeImageHash(snapshot: CanvasSnapshot, maxHashDimension: number): Promise<string | undefined> {
|
|
7
|
+
const { height: sourceHeight, width: sourceWidth } = snapshot.source
|
|
8
|
+
// The snapshot is already frozen, so if it already fits, hash it directly instead of downscaling it again.
|
|
9
|
+
const thumbnail =
|
|
10
|
+
Math.max(sourceWidth, sourceHeight) <= maxHashDimension
|
|
11
|
+
? snapshot.source
|
|
12
|
+
: createDownscaledCanvas(snapshot.source, sourceWidth, sourceHeight, maxHashDimension)
|
|
13
|
+
if (!thumbnail) {
|
|
14
|
+
return Promise.resolve(undefined)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const context = thumbnail.getContext('2d')
|
|
18
|
+
if (!context) {
|
|
19
|
+
return Promise.resolve(undefined)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const data = context.getImageData(0, 0, thumbnail.width, thumbnail.height).data
|
|
23
|
+
// crypto.subtle is only exposed in secure contexts, so it is missing on plain HTTP pages.
|
|
24
|
+
const subtleCrypto = mockable(globalObject.crypto?.subtle)
|
|
25
|
+
if (!subtleCrypto) {
|
|
26
|
+
return Promise.resolve(createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, fnv1aHash(data)))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return subtleCrypto.digest('SHA-256', data).then(
|
|
30
|
+
(buffer) => createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, arrayBufferToHex(buffer)),
|
|
31
|
+
() => createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, fnv1aHash(data))
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function arrayBufferToHex(buffer: ArrayBuffer): string {
|
|
36
|
+
return Array.from(new Uint8Array(buffer), (byte) => byte.toString(16).padStart(2, '0')).join('')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function createChangeHash(width: number, height: number, pixelHash: string): string {
|
|
40
|
+
return `${width}x${height}-${pixelHash}`
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* eslint-disable no-bitwise */
|
|
44
|
+
function fnv1aHash(data: ArrayLike<number>): string {
|
|
45
|
+
let hash = 0x811c9dc5
|
|
46
|
+
|
|
47
|
+
for (let index = 0; index < data.length; index += 1) {
|
|
48
|
+
hash ^= data[index]
|
|
49
|
+
hash = Math.imul(hash, 0x01000193)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return (hash >>> 0).toString(16).padStart(8, '0')
|
|
53
|
+
}
|
|
54
|
+
/* eslint-enable no-bitwise */
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
export const enum CanvasStatus {
|
|
2
|
+
/** The canvas is clean, meaning it has not been marked as dirty or tainted */
|
|
3
|
+
Clean,
|
|
4
|
+
/** The canvas is dirty, meaning it has been marked as dirty by a draw operation */
|
|
5
|
+
Dirty,
|
|
6
|
+
/** The canvas is tainted, meaning it has been marked as tainted by a SecurityError */
|
|
7
|
+
Tainted,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface CanvasCaptureAttempt {
|
|
11
|
+
/** changeHash emitted the last time this canvas was captured, taken when the attempt started */
|
|
12
|
+
readonly lastChangeHash: string | undefined
|
|
13
|
+
/** false if the canvas was forgotten/reset, or if another attempt took its place */
|
|
14
|
+
isCurrent: () => boolean
|
|
15
|
+
/** stores the changeHash */
|
|
16
|
+
setLastChangeHash: (changeHash: string) => void
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface CanvasContentMutation {
|
|
20
|
+
canvas: HTMLCanvasElement
|
|
21
|
+
captureAttempt: CanvasCaptureAttempt
|
|
22
|
+
hash: string
|
|
23
|
+
image: Blob
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CanvasManager {
|
|
27
|
+
/** Single entry point for the canvas status */
|
|
28
|
+
markCanvas: (canvas: HTMLCanvasElement, status: CanvasStatus) => void
|
|
29
|
+
/** The node left the DOM: forget its tracking state, but not its taint */
|
|
30
|
+
forgetCanvas: (canvas: HTMLCanvasElement) => void
|
|
31
|
+
/** width/height were assigned: the bitmap was cleared, so drop the last hash and mark dirty */
|
|
32
|
+
resetCanvasBitmap: (canvas: HTMLCanvasElement) => void
|
|
33
|
+
/** Takes dirty, connected, non-tainted canvases and clears their dirty state */
|
|
34
|
+
takeCapturableCanvases: () => HTMLCanvasElement[]
|
|
35
|
+
/** Starts a capture attempt for a canvas */
|
|
36
|
+
startCaptureAttempt: (canvas: HTMLCanvasElement) => CanvasCaptureAttempt
|
|
37
|
+
discardCaptureAttempt: (canvas: HTMLCanvasElement, captureAttempt: CanvasCaptureAttempt) => void
|
|
38
|
+
/** Discards the last capture hash and retries a rejected capture */
|
|
39
|
+
retryCanvas: (canvas: HTMLCanvasElement) => void
|
|
40
|
+
addCanvasContentMutation: (mutation: CanvasContentMutation) => void
|
|
41
|
+
takeCanvasContentMutations: () => CanvasContentMutation[]
|
|
42
|
+
/** New record stream: discards the per-stream tracking states (not the taint) */
|
|
43
|
+
reset: () => void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface CanvasTrackingState {
|
|
47
|
+
capturePending: boolean
|
|
48
|
+
lastChangeHash?: string
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function createCanvasManager(): CanvasManager {
|
|
52
|
+
const dirtyCanvases = new Set<HTMLCanvasElement>()
|
|
53
|
+
const taintedCanvases = new WeakSet<HTMLCanvasElement>()
|
|
54
|
+
let canvasContentMutations: CanvasContentMutation[] = []
|
|
55
|
+
let canvasTrackingStates = new WeakMap<HTMLCanvasElement, CanvasTrackingState>()
|
|
56
|
+
|
|
57
|
+
function getTrackingState(canvas: HTMLCanvasElement): CanvasTrackingState {
|
|
58
|
+
let trackingState = canvasTrackingStates.get(canvas)
|
|
59
|
+
if (!trackingState) {
|
|
60
|
+
trackingState = { capturePending: false }
|
|
61
|
+
canvasTrackingStates.set(canvas, trackingState)
|
|
62
|
+
}
|
|
63
|
+
return trackingState
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function startCaptureAttempt(canvas: HTMLCanvasElement): CanvasCaptureAttempt {
|
|
67
|
+
const trackingState = getTrackingState(canvas)
|
|
68
|
+
trackingState.capturePending = true
|
|
69
|
+
const isCurrent = () => canvasTrackingStates.get(canvas) === trackingState
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
lastChangeHash: trackingState.lastChangeHash,
|
|
73
|
+
isCurrent,
|
|
74
|
+
setLastChangeHash: (changeHash) => {
|
|
75
|
+
if (isCurrent()) {
|
|
76
|
+
trackingState.lastChangeHash = changeHash
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function markDirty(canvas: HTMLCanvasElement) {
|
|
83
|
+
if (!canvas.isConnected || taintedCanvases.has(canvas)) {
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
dirtyCanvases.add(canvas)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function markClean(canvas: HTMLCanvasElement) {
|
|
90
|
+
dirtyCanvases.delete(canvas)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function markTainted(canvas: HTMLCanvasElement) {
|
|
94
|
+
taintedCanvases.add(canvas)
|
|
95
|
+
dirtyCanvases.delete(canvas)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
markCanvas: (canvas, status) => {
|
|
100
|
+
switch (status) {
|
|
101
|
+
case CanvasStatus.Dirty:
|
|
102
|
+
markDirty(canvas)
|
|
103
|
+
return
|
|
104
|
+
case CanvasStatus.Clean:
|
|
105
|
+
markClean(canvas)
|
|
106
|
+
return
|
|
107
|
+
case CanvasStatus.Tainted:
|
|
108
|
+
markTainted(canvas)
|
|
109
|
+
return
|
|
110
|
+
default:
|
|
111
|
+
status satisfies never
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
forgetCanvas: (canvas) => {
|
|
117
|
+
dirtyCanvases.delete(canvas)
|
|
118
|
+
canvasTrackingStates.delete(canvas)
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
resetCanvasBitmap: (canvas) => {
|
|
122
|
+
canvasTrackingStates.delete(canvas)
|
|
123
|
+
markDirty(canvas)
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
takeCapturableCanvases: () => {
|
|
127
|
+
const capturableCanvases: HTMLCanvasElement[] = []
|
|
128
|
+
|
|
129
|
+
dirtyCanvases.forEach((canvas) => {
|
|
130
|
+
if (!canvas.isConnected) {
|
|
131
|
+
dirtyCanvases.delete(canvas)
|
|
132
|
+
} else if (!taintedCanvases.has(canvas) && !getTrackingState(canvas).capturePending) {
|
|
133
|
+
dirtyCanvases.delete(canvas)
|
|
134
|
+
capturableCanvases.push(canvas)
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
return capturableCanvases
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
startCaptureAttempt,
|
|
142
|
+
|
|
143
|
+
discardCaptureAttempt: (canvas, captureAttempt) => {
|
|
144
|
+
if (captureAttempt.isCurrent()) {
|
|
145
|
+
getTrackingState(canvas).capturePending = false
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
retryCanvas: (canvas) => {
|
|
150
|
+
canvasTrackingStates.delete(canvas)
|
|
151
|
+
markDirty(canvas)
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
addCanvasContentMutation: (mutation) => {
|
|
155
|
+
canvasContentMutations.push(mutation)
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
takeCanvasContentMutations: () => {
|
|
159
|
+
const mutations = canvasContentMutations
|
|
160
|
+
canvasContentMutations = []
|
|
161
|
+
for (const mutation of mutations) {
|
|
162
|
+
if (mutation.captureAttempt.isCurrent()) {
|
|
163
|
+
getTrackingState(mutation.canvas).capturePending = false
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return mutations
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
reset: () => {
|
|
170
|
+
dirtyCanvases.clear()
|
|
171
|
+
canvasContentMutations = []
|
|
172
|
+
canvasTrackingStates = new WeakMap()
|
|
173
|
+
},
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface CanvasSnapshot {
|
|
2
|
+
canvasHeight: number
|
|
3
|
+
canvasWidth: number
|
|
4
|
+
source: HTMLCanvasElement
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function createCanvasSnapshot(canvas: HTMLCanvasElement, maxImageDimension: number): CanvasSnapshot | undefined {
|
|
8
|
+
const canvasWidth = canvas.width
|
|
9
|
+
const canvasHeight = canvas.height
|
|
10
|
+
const source = createDownscaledCanvas(canvas, canvasWidth, canvasHeight, maxImageDimension)
|
|
11
|
+
if (!source) {
|
|
12
|
+
return undefined
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return { canvasHeight, canvasWidth, source }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Downscales `image` (of size `width`x`height`) to fit within `maxDimension` on a fresh canvas.
|
|
19
|
+
export function createDownscaledCanvas(
|
|
20
|
+
image: CanvasImageSource,
|
|
21
|
+
width: number,
|
|
22
|
+
height: number,
|
|
23
|
+
maxDimension: number
|
|
24
|
+
): HTMLCanvasElement | undefined {
|
|
25
|
+
const scale = Math.min(1, maxDimension / Math.max(width, height))
|
|
26
|
+
const scaledWidth = Math.max(1, Math.round(width * scale))
|
|
27
|
+
const scaledHeight = Math.max(1, Math.round(height * scale))
|
|
28
|
+
|
|
29
|
+
const canvas = document.createElement('canvas')
|
|
30
|
+
canvas.width = scaledWidth
|
|
31
|
+
canvas.height = scaledHeight
|
|
32
|
+
|
|
33
|
+
const context = canvas.getContext('2d')
|
|
34
|
+
if (!context) {
|
|
35
|
+
return undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
context.imageSmoothingQuality = 'low'
|
|
39
|
+
context.drawImage(image, 0, 0, scaledWidth, scaledHeight)
|
|
40
|
+
|
|
41
|
+
return canvas
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function captureCanvasImage(snapshot: CanvasSnapshot, encodeQuality: number): Promise<Blob | undefined> {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
try {
|
|
47
|
+
snapshot.source.toBlob((blob) => resolve(blob ?? undefined), 'image/webp', encodeQuality)
|
|
48
|
+
} catch {
|
|
49
|
+
resolve(undefined)
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { isElementNode } from '@kubesense/kubesense-browser-rum-core'
|
|
2
|
+
|
|
3
|
+
const CANVAS_SIZE_ATTRIBUTES = ['width', 'height']
|
|
4
|
+
|
|
5
|
+
export function isCanvasElement(node: Node): node is HTMLCanvasElement {
|
|
6
|
+
return isElementNode(node) && node.tagName === 'CANVAS'
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function isCanvasSizeAttribute(attributeName: string): boolean {
|
|
10
|
+
return CANVAS_SIZE_ATTRIBUTES.includes(attributeName.toLowerCase())
|
|
11
|
+
}
|