@kubesense/kubesense-browser-core 1.7.0 → 2.0.0-beta.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 +1 -1
- package/cjs/boot/displayAlreadyInitializedError.js +6 -7
- package/cjs/boot/displayAlreadyInitializedError.js.map +1 -1
- package/cjs/boot/init.d.ts +1 -0
- package/cjs/boot/init.js +26 -34
- package/cjs/boot/init.js.map +1 -1
- package/cjs/browser/addEventListener.d.ts +12 -9
- package/cjs/browser/addEventListener.js +107 -50
- package/cjs/browser/addEventListener.js.map +1 -1
- package/cjs/browser/browser.types.d.ts +0 -24
- package/cjs/browser/cookie.d.ts +4 -1
- package/cjs/browser/cookie.js +76 -89
- package/cjs/browser/cookie.js.map +1 -1
- package/cjs/browser/cookieAccess.d.ts +18 -0
- package/cjs/browser/cookieAccess.js +129 -0
- package/cjs/browser/cookieAccess.js.map +1 -0
- package/cjs/browser/fetch.d.ts +9 -0
- package/cjs/browser/fetch.js +18 -0
- package/cjs/browser/fetch.js.map +1 -0
- package/cjs/browser/fetchObservable.d.ts +3 -3
- package/cjs/browser/fetchObservable.js +79 -92
- package/cjs/browser/fetchObservable.js.map +1 -1
- package/cjs/browser/pageMayExitObservable.d.ts +1 -2
- package/cjs/browser/pageMayExitObservable.js +53 -51
- package/cjs/browser/pageMayExitObservable.js.map +1 -1
- package/cjs/browser/runOnReadyState.d.ts +2 -3
- package/cjs/browser/runOnReadyState.js +18 -17
- package/cjs/browser/runOnReadyState.js.map +1 -1
- package/cjs/browser/webSocketObservable.d.ts +44 -0
- package/cjs/browser/webSocketObservable.js +92 -0
- package/cjs/browser/webSocketObservable.js.map +1 -0
- package/cjs/browser/xhrObservable.d.ts +8 -3
- package/cjs/browser/xhrObservable.js +64 -77
- package/cjs/browser/xhrObservable.js.map +1 -1
- package/cjs/domain/allowedTrackingOrigins.d.ts +2 -2
- package/cjs/domain/allowedTrackingOrigins.js +27 -23
- package/cjs/domain/allowedTrackingOrigins.js.map +1 -1
- package/cjs/domain/bufferedData.d.ts +20 -6
- package/cjs/domain/bufferedData.js +41 -19
- package/cjs/domain/bufferedData.js.map +1 -1
- package/cjs/domain/configuration/configuration.d.ts +169 -76
- package/cjs/domain/configuration/configuration.js +159 -128
- package/cjs/domain/configuration/configuration.js.map +1 -1
- package/cjs/domain/configuration/index.d.ts +5 -7
- package/cjs/domain/configuration/remoteSdkConfig.d.ts +26 -6
- package/cjs/domain/configuration/remoteSdkConfig.js +152 -159
- package/cjs/domain/configuration/remoteSdkConfig.js.map +1 -1
- package/cjs/domain/connectivity/connectivity.d.ts +2 -10
- package/cjs/domain/connectivity/connectivity.js +13 -13
- package/cjs/domain/connectivity/connectivity.js.map +1 -1
- package/cjs/domain/console/consoleObservable.d.ts +1 -1
- package/cjs/domain/console/consoleObservable.js +62 -74
- package/cjs/domain/console/consoleObservable.js.map +1 -1
- package/cjs/domain/context/contextConstants.js +24 -15
- package/cjs/domain/context/contextConstants.js.map +1 -1
- package/cjs/domain/context/contextManager.js +49 -53
- package/cjs/domain/context/contextManager.js.map +1 -1
- package/cjs/domain/context/contextUtils.js +11 -12
- package/cjs/domain/context/contextUtils.js.map +1 -1
- package/cjs/domain/context/defineContextMethod.d.ts +2 -2
- package/cjs/domain/context/defineContextMethod.js +15 -16
- package/cjs/domain/context/defineContextMethod.js.map +1 -1
- package/cjs/domain/context/storeContextManager.d.ts +1 -2
- package/cjs/domain/context/storeContextManager.js +31 -33
- package/cjs/domain/context/storeContextManager.js.map +1 -1
- package/cjs/domain/contexts/accountContext.d.ts +2 -2
- package/cjs/domain/contexts/accountContext.js +26 -29
- package/cjs/domain/contexts/accountContext.js.map +1 -1
- package/cjs/domain/contexts/globalContext.d.ts +2 -2
- package/cjs/domain/contexts/globalContext.js +17 -17
- package/cjs/domain/contexts/globalContext.js.map +1 -1
- package/cjs/domain/contexts/tabContext.d.ts +4 -0
- package/cjs/domain/contexts/tabContext.js +28 -0
- package/cjs/domain/contexts/tabContext.js.map +1 -0
- package/cjs/domain/contexts/telemetrySessionContext.d.ts +4 -0
- package/cjs/domain/contexts/telemetrySessionContext.js +17 -0
- package/cjs/domain/contexts/telemetrySessionContext.js.map +1 -0
- package/cjs/domain/contexts/userContext.d.ts +8 -3
- package/cjs/domain/contexts/userContext.js +79 -114
- package/cjs/domain/contexts/userContext.js.map +1 -1
- package/cjs/domain/deflate/deflate.types.js +11 -2
- package/cjs/domain/deflate/deflate.types.js.map +1 -1
- package/cjs/domain/error/error.d.ts +14 -6
- package/cjs/domain/error/error.js +101 -70
- package/cjs/domain/error/error.js.map +1 -1
- package/cjs/domain/error/error.types.d.ts +6 -4
- package/cjs/domain/error/error.types.js +24 -11
- package/cjs/domain/error/error.types.js.map +1 -1
- package/cjs/domain/error/isError.d.ts +2 -0
- package/cjs/domain/error/isError.js +14 -0
- package/cjs/domain/error/isError.js.map +1 -0
- package/cjs/domain/error/trackRuntimeError.d.ts +3 -2
- package/cjs/domain/error/trackRuntimeError.js +44 -41
- package/cjs/domain/error/trackRuntimeError.js.map +1 -1
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.d.ts +1 -2
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.js +28 -38
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.js.map +1 -1
- package/cjs/domain/extension/extensionUtils.js +20 -25
- package/cjs/domain/extension/extensionUtils.js.map +1 -1
- package/cjs/domain/geo/geocoding.js +64 -0
- package/cjs/domain/geo/geocoding.js.map +1 -0
- package/cjs/domain/geo/geolocation.js +72 -0
- package/cjs/domain/geo/geolocation.js.map +1 -0
- package/cjs/domain/report/reportObservable.d.ts +1 -2
- package/cjs/domain/report/reportObservable.js +76 -85
- package/cjs/domain/report/reportObservable.js.map +1 -1
- package/cjs/domain/resourceUtils.d.ts +1 -0
- package/cjs/domain/resourceUtils.js +20 -17
- package/cjs/domain/resourceUtils.js.map +1 -1
- package/cjs/domain/sampler.d.ts +11 -0
- package/cjs/domain/sampler.js +40 -0
- package/cjs/domain/sampler.js.map +1 -0
- package/cjs/domain/session/sessionConstants.d.ts +1 -0
- package/cjs/domain/session/sessionConstants.js +19 -13
- package/cjs/domain/session/sessionConstants.js.map +1 -1
- package/cjs/domain/session/sessionManager.d.ts +21 -13
- package/cjs/domain/session/sessionManager.js +254 -191
- package/cjs/domain/session/sessionManager.js.map +1 -1
- package/cjs/domain/session/sessionState.d.ts +10 -1
- package/cjs/domain/session/sessionState.js +72 -56
- package/cjs/domain/session/sessionState.js.map +1 -1
- package/cjs/domain/session/sessionStateValidation.js +7 -8
- package/cjs/domain/session/sessionStateValidation.js.map +1 -1
- package/cjs/domain/session/sessionStore.d.ts +4 -33
- package/cjs/domain/session/sessionStore.js +41 -181
- package/cjs/domain/session/sessionStore.js.map +1 -1
- package/cjs/domain/session/storeStrategies/sessionInCookie.d.ts +7 -11
- package/cjs/domain/session/storeStrategies/sessionInCookie.js +90 -96
- package/cjs/domain/session/storeStrategies/sessionInCookie.js.map +1 -1
- package/cjs/domain/session/storeStrategies/sessionInLocalStorage.d.ts +1 -4
- package/cjs/domain/session/storeStrategies/sessionInLocalStorage.js +39 -38
- package/cjs/domain/session/storeStrategies/sessionInLocalStorage.js.map +1 -1
- package/cjs/domain/session/storeStrategies/sessionInMemory.d.ts +12 -0
- package/cjs/domain/session/storeStrategies/sessionInMemory.js +36 -0
- package/cjs/domain/session/storeStrategies/sessionInMemory.js.map +1 -0
- package/cjs/domain/session/storeStrategies/sessionStoreStrategy.d.ts +16 -7
- package/cjs/domain/session/storeStrategies/sessionStoreStrategy.js +7 -4
- package/cjs/domain/session/storeStrategies/sessionStoreStrategy.js.map +1 -1
- package/cjs/domain/sourceCodeContext.d.ts +22 -0
- package/cjs/domain/sourceCodeContext.js +56 -0
- package/cjs/domain/sourceCodeContext.js.map +1 -0
- package/cjs/domain/synthetics/syntheticsWorkerValues.d.ts +9 -3
- package/cjs/domain/synthetics/syntheticsWorkerValues.js +37 -25
- package/cjs/domain/synthetics/syntheticsWorkerValues.js.map +1 -1
- package/cjs/domain/tags.d.ts +1 -2
- package/cjs/domain/tags.js +23 -57
- package/cjs/domain/tags.js.map +1 -1
- package/cjs/domain/telemetry/rawTelemetryEvent.types.js +8 -7
- package/cjs/domain/telemetry/rawTelemetryEvent.types.js.map +1 -1
- package/cjs/domain/telemetry/telemetry.d.ts +7 -8
- package/cjs/domain/telemetry/telemetry.js +192 -215
- package/cjs/domain/telemetry/telemetry.js.map +1 -1
- package/cjs/domain/telemetry/telemetryEvent.types.d.ts +161 -16
- package/cjs/domain/trackingConsent.d.ts +1 -0
- package/cjs/domain/trackingConsent.js +35 -24
- package/cjs/domain/trackingConsent.js.map +1 -1
- package/cjs/domain/userAgentData/userAgentData.js +65 -96
- package/cjs/domain/userAgentData/userAgentData.js.map +1 -1
- package/cjs/index.d.ts +34 -30
- package/cjs/index.js +297 -213
- package/cjs/tools/abstractLifeCycle.js +19 -26
- package/cjs/tools/abstractLifeCycle.js.map +1 -1
- package/cjs/tools/catchUserErrors.js +12 -12
- package/cjs/tools/catchUserErrors.js.map +1 -1
- package/cjs/tools/display.d.ts +1 -37
- package/cjs/tools/display.js +8 -43
- package/cjs/tools/display.js.map +1 -1
- package/cjs/tools/encoder.js +36 -37
- package/cjs/tools/encoder.js.map +1 -1
- package/cjs/tools/experimentalFeatures.d.ts +1 -4
- package/cjs/tools/experimentalFeatures.js +29 -40
- package/cjs/tools/experimentalFeatures.js.map +1 -1
- package/cjs/tools/getZoneJsOriginalValue.d.ts +1 -1
- package/cjs/tools/getZoneJsOriginalValue.js +22 -25
- package/cjs/tools/getZoneJsOriginalValue.js.map +1 -1
- package/cjs/tools/instrumentMethod.d.ts +57 -0
- package/cjs/tools/instrumentMethod.js +179 -112
- package/cjs/tools/instrumentMethod.js.map +1 -1
- package/cjs/tools/matchOption.d.ts +0 -1
- package/cjs/tools/matchOption.js +21 -31
- package/cjs/tools/matchOption.js.map +1 -1
- package/cjs/tools/mockable.d.ts +22 -0
- package/cjs/tools/mockable.js +28 -0
- package/cjs/tools/mockable.js.map +1 -0
- package/cjs/tools/observable.d.ts +3 -1
- package/cjs/tools/observable.js +75 -85
- package/cjs/tools/observable.js.map +1 -1
- package/cjs/tools/queueMicrotask.js +9 -14
- package/cjs/tools/queueMicrotask.js.map +1 -1
- package/cjs/tools/readBytesFromStream.d.ts +1 -6
- package/cjs/tools/readBytesFromStream.js +18 -25
- package/cjs/tools/readBytesFromStream.js.map +1 -1
- package/cjs/tools/requestIdleCallback.js +23 -29
- package/cjs/tools/requestIdleCallback.js.map +1 -1
- package/cjs/tools/sendToExtension.js +10 -8
- package/cjs/tools/sendToExtension.js.map +1 -1
- package/cjs/tools/serialisation/jsonStringify.js +37 -42
- package/cjs/tools/serialisation/jsonStringify.js.map +1 -1
- package/cjs/tools/serialisation/sanitize.d.ts +1 -0
- package/cjs/tools/serialisation/sanitize.js +112 -167
- package/cjs/tools/serialisation/sanitize.js.map +1 -1
- package/cjs/tools/serialisation/stringify.d.ts +2 -0
- package/cjs/tools/serialisation/stringify.js +18 -0
- package/cjs/tools/serialisation/stringify.js.map +1 -0
- package/cjs/tools/stackTrace/computeStackTrace.js +121 -159
- package/cjs/tools/stackTrace/computeStackTrace.js.map +1 -1
- package/cjs/tools/stackTrace/handlingStack.d.ts +1 -1
- package/cjs/tools/stackTrace/handlingStack.js +39 -38
- package/cjs/tools/stackTrace/handlingStack.js.map +1 -1
- package/cjs/tools/taskQueue.js +40 -49
- package/cjs/tools/taskQueue.js.map +1 -1
- package/cjs/tools/thenable.d.ts +8 -0
- package/cjs/tools/thenable.js +27 -0
- package/cjs/tools/thenable.js.map +1 -0
- package/cjs/tools/timer.d.ts +2 -1
- package/cjs/tools/timer.js +14 -13
- package/cjs/tools/timer.js.map +1 -1
- package/cjs/tools/utils/arrayUtils.d.ts +1 -0
- package/cjs/tools/utils/arrayUtils.js +17 -13
- package/cjs/tools/utils/arrayUtils.js.map +1 -1
- package/cjs/tools/utils/browserDetection.d.ts +1 -0
- package/cjs/tools/utils/browserDetection.js +25 -23
- package/cjs/tools/utils/browserDetection.js.map +1 -1
- package/cjs/tools/utils/byteUtils.js +20 -28
- package/cjs/tools/utils/byteUtils.js.map +1 -1
- package/cjs/tools/utils/functionUtils.js +33 -40
- package/cjs/tools/utils/functionUtils.js.map +1 -1
- package/cjs/tools/utils/numberUtils.d.ts +0 -6
- package/cjs/tools/utils/numberUtils.js +7 -18
- package/cjs/tools/utils/numberUtils.js.map +1 -1
- package/cjs/tools/utils/objectUtils.d.ts +2 -0
- package/cjs/tools/utils/objectUtils.js +27 -14
- package/cjs/tools/utils/objectUtils.js.map +1 -1
- package/cjs/tools/utils/polyfills.js +12 -16
- package/cjs/tools/utils/polyfills.js.map +1 -1
- package/cjs/tools/utils/responseUtils.js +11 -12
- package/cjs/tools/utils/responseUtils.js.map +1 -1
- package/cjs/tools/utils/stringUtils.d.ts +9 -0
- package/cjs/tools/utils/stringUtils.js +73 -77
- package/cjs/tools/utils/stringUtils.js.map +1 -1
- package/cjs/tools/utils/timezone.js +9 -10
- package/cjs/tools/utils/timezone.js.map +1 -1
- package/cjs/tools/valueHistory.d.ts +16 -3
- package/cjs/tools/valueHistory.js +113 -99
- package/cjs/tools/valueHistory.js.map +1 -1
- package/cjs/transport/batch.d.ts +11 -7
- package/cjs/transport/batch.js +93 -106
- package/cjs/transport/batch.js.map +1 -1
- package/cjs/transport/eventBridge.d.ts +6 -2
- package/cjs/transport/eventBridge.js +54 -38
- package/cjs/transport/eventBridge.js.map +1 -1
- package/cjs/transport/flushController.d.ts +6 -15
- package/cjs/transport/flushController.js +99 -118
- package/cjs/transport/flushController.js.map +1 -1
- package/cjs/transport/httpRequest.d.ts +8 -9
- package/cjs/transport/httpRequest.js +61 -97
- package/cjs/transport/httpRequest.js.map +1 -1
- package/cjs/transport/index.d.ts +3 -2
- package/cjs/transport/sendWithRetryStrategy.d.ts +9 -4
- package/cjs/transport/sendWithRetryStrategy.js +144 -148
- package/cjs/transport/sendWithRetryStrategy.js.map +1 -1
- package/esm/boot/displayAlreadyInitializedError.mjs +9 -0
- package/esm/boot/displayAlreadyInitializedError.mjs.map +1 -0
- package/esm/boot/init.mjs +30 -0
- package/esm/boot/init.mjs.map +1 -0
- package/esm/browser/addEventListener.mjs +107 -0
- package/esm/browser/addEventListener.mjs.map +1 -0
- package/esm/browser/cookie.mjs +92 -0
- package/esm/browser/cookie.mjs.map +1 -0
- package/esm/browser/cookieAccess.mjs +124 -0
- package/esm/browser/cookieAccess.mjs.map +1 -0
- package/esm/browser/fetch.mjs +18 -0
- package/esm/browser/fetch.mjs.map +1 -0
- package/esm/browser/fetchObservable.mjs +89 -0
- package/esm/browser/fetchObservable.mjs.map +1 -0
- package/esm/browser/pageMayExitObservable.mjs +56 -0
- package/esm/browser/pageMayExitObservable.mjs.map +1 -0
- package/esm/browser/runOnReadyState.mjs +19 -0
- package/esm/browser/runOnReadyState.mjs.map +1 -0
- package/esm/browser/webSocketObservable.mjs +92 -0
- package/esm/browser/webSocketObservable.mjs.map +1 -0
- package/esm/browser/xhrObservable.mjs +73 -0
- package/esm/browser/xhrObservable.mjs.map +1 -0
- package/esm/domain/allowedTrackingOrigins.mjs +27 -0
- package/esm/domain/allowedTrackingOrigins.mjs.map +1 -0
- package/esm/domain/bufferedData.mjs +43 -0
- package/esm/domain/bufferedData.mjs.map +1 -0
- package/esm/domain/configuration/configuration.mjs +163 -0
- package/esm/domain/configuration/configuration.mjs.map +1 -0
- package/esm/domain/configuration/remoteSdkConfig.mjs +163 -0
- package/esm/domain/configuration/remoteSdkConfig.mjs.map +1 -0
- package/esm/domain/connectivity/connectivity.mjs +16 -0
- package/esm/domain/connectivity/connectivity.mjs.map +1 -0
- package/esm/domain/console/consoleObservable.mjs +72 -0
- package/esm/domain/console/consoleObservable.mjs.map +1 -0
- package/esm/domain/context/contextConstants.mjs +25 -0
- package/esm/domain/context/contextConstants.mjs.map +1 -0
- package/esm/domain/context/contextManager.mjs +55 -0
- package/esm/domain/context/contextManager.mjs.map +1 -0
- package/esm/domain/context/contextUtils.mjs +15 -0
- package/esm/domain/context/contextUtils.mjs.map +1 -0
- package/esm/domain/context/defineContextMethod.mjs +19 -0
- package/esm/domain/context/defineContextMethod.mjs.map +1 -0
- package/esm/domain/context/storeContextManager.mjs +36 -0
- package/esm/domain/context/storeContextManager.mjs.map +1 -0
- package/esm/domain/contexts/accountContext.mjs +29 -0
- package/esm/domain/contexts/accountContext.mjs.map +1 -0
- package/esm/domain/contexts/globalContext.mjs +20 -0
- package/esm/domain/contexts/globalContext.mjs.map +1 -0
- package/esm/domain/contexts/tabContext.mjs +27 -0
- package/esm/domain/contexts/tabContext.mjs.map +1 -0
- package/esm/domain/contexts/telemetrySessionContext.mjs +17 -0
- package/esm/domain/contexts/telemetrySessionContext.mjs.map +1 -0
- package/esm/domain/contexts/userContext.mjs +88 -0
- package/esm/domain/contexts/userContext.mjs.map +1 -0
- package/esm/domain/deflate/deflate.types.mjs +12 -0
- package/esm/domain/deflate/deflate.types.mjs.map +1 -0
- package/esm/domain/error/error.mjs +104 -0
- package/esm/domain/error/error.mjs.map +1 -0
- package/esm/domain/error/error.types.mjs +24 -0
- package/esm/domain/error/error.types.mjs.map +1 -0
- package/esm/domain/error/isError.mjs +13 -0
- package/esm/domain/error/isError.mjs.map +1 -0
- package/esm/domain/error/trackRuntimeError.mjs +49 -0
- package/esm/domain/error/trackRuntimeError.mjs.map +1 -0
- package/esm/domain/eventRateLimiter/createEventRateLimiter.mjs +31 -0
- package/esm/domain/eventRateLimiter/createEventRateLimiter.mjs.map +1 -0
- package/esm/domain/extension/extensionUtils.mjs +23 -0
- package/esm/domain/extension/extensionUtils.mjs.map +1 -0
- package/esm/domain/geo/geocoding.mjs +60 -0
- package/esm/domain/geo/geocoding.mjs.map +1 -0
- package/esm/domain/geo/geolocation.mjs +69 -0
- package/esm/domain/geo/geolocation.mjs.map +1 -0
- package/esm/domain/report/reportObservable.mjs +89 -0
- package/esm/domain/report/reportObservable.mjs.map +1 -0
- package/esm/domain/resourceUtils.mjs +22 -0
- package/esm/domain/resourceUtils.mjs.map +1 -0
- package/esm/domain/sampler.mjs +37 -0
- package/esm/domain/sampler.mjs.map +1 -0
- package/esm/domain/session/sessionConstants.mjs +18 -0
- package/esm/domain/session/sessionConstants.mjs.map +1 -0
- package/esm/domain/session/sessionManager.mjs +258 -0
- package/esm/domain/session/sessionManager.mjs.map +1 -0
- package/esm/domain/session/sessionState.mjs +76 -0
- package/esm/domain/session/sessionState.mjs.map +1 -0
- package/esm/domain/session/sessionStateValidation.mjs +9 -0
- package/esm/domain/session/sessionStateValidation.mjs.map +1 -0
- package/esm/domain/session/sessionStore.mjs +45 -0
- package/esm/domain/session/sessionStore.mjs.map +1 -0
- package/esm/domain/session/storeStrategies/sessionInCookie.mjs +96 -0
- package/esm/domain/session/storeStrategies/sessionInCookie.mjs.map +1 -0
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.mjs +42 -0
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.mjs.map +1 -0
- package/esm/domain/session/storeStrategies/sessionInMemory.mjs +34 -0
- package/esm/domain/session/storeStrategies/sessionInMemory.mjs.map +1 -0
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.mjs +7 -0
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.mjs.map +1 -0
- package/esm/domain/sourceCodeContext.mjs +55 -0
- package/esm/domain/sourceCodeContext.mjs.map +1 -0
- package/esm/domain/synthetics/syntheticsWorkerValues.mjs +37 -0
- package/esm/domain/synthetics/syntheticsWorkerValues.mjs.map +1 -0
- package/esm/domain/tags.mjs +29 -0
- package/esm/domain/tags.mjs.map +1 -0
- package/esm/domain/telemetry/rawTelemetryEvent.types.mjs +10 -0
- package/esm/domain/telemetry/rawTelemetryEvent.types.mjs.map +1 -0
- package/esm/domain/telemetry/telemetry.mjs +210 -0
- package/esm/domain/telemetry/telemetry.mjs.map +1 -0
- package/esm/domain/trackingConsent.mjs +38 -0
- package/esm/domain/trackingConsent.mjs.map +1 -0
- package/esm/domain/userAgentData/userAgentData.mjs +77 -0
- package/esm/domain/userAgentData/userAgentData.mjs.map +1 -0
- package/esm/index.mjs +85 -0
- package/esm/tools/abstractLifeCycle.mjs +21 -0
- package/esm/tools/abstractLifeCycle.mjs.map +1 -0
- package/esm/tools/catchUserErrors.mjs +15 -0
- package/esm/tools/catchUserErrors.mjs.map +1 -0
- package/esm/tools/display.mjs +8 -0
- package/esm/tools/display.mjs.map +1 -0
- package/esm/tools/encoder.mjs +39 -0
- package/esm/tools/encoder.mjs.map +1 -0
- package/esm/tools/experimentalFeatures.mjs +35 -0
- package/esm/tools/experimentalFeatures.mjs.map +1 -0
- package/esm/tools/getZoneJsOriginalValue.mjs +26 -0
- package/esm/tools/getZoneJsOriginalValue.mjs.map +1 -0
- package/esm/tools/instrumentMethod.mjs +183 -0
- package/esm/tools/instrumentMethod.mjs.map +1 -0
- package/esm/tools/matchOption.mjs +25 -0
- package/esm/tools/matchOption.mjs.map +1 -0
- package/esm/tools/mockable.mjs +28 -0
- package/esm/tools/mockable.mjs.map +1 -0
- package/esm/tools/observable.mjs +77 -0
- package/esm/tools/observable.mjs.map +1 -0
- package/esm/tools/queueMicrotask.mjs +12 -0
- package/esm/tools/queueMicrotask.mjs.map +1 -0
- package/esm/tools/readBytesFromStream.mjs +21 -0
- package/esm/tools/readBytesFromStream.mjs.map +1 -0
- package/esm/tools/requestIdleCallback.mjs +28 -0
- package/esm/tools/requestIdleCallback.mjs.map +1 -0
- package/esm/tools/sendToExtension.mjs +13 -0
- package/esm/tools/sendToExtension.mjs.map +1 -0
- package/esm/tools/serialisation/jsonStringify.mjs +42 -0
- package/esm/tools/serialisation/jsonStringify.mjs.map +1 -0
- package/esm/tools/serialisation/sanitize.mjs +132 -0
- package/esm/tools/serialisation/sanitize.mjs.map +1 -0
- package/esm/tools/serialisation/stringify.mjs +17 -0
- package/esm/tools/serialisation/stringify.mjs.map +1 -0
- package/esm/tools/stackTrace/computeStackTrace.mjs +148 -0
- package/esm/tools/stackTrace/computeStackTrace.mjs.map +1 -0
- package/esm/tools/stackTrace/handlingStack.mjs +45 -0
- package/esm/tools/stackTrace/handlingStack.mjs.map +1 -0
- package/esm/tools/taskQueue.mjs +45 -0
- package/esm/tools/taskQueue.mjs.map +1 -0
- package/esm/tools/thenable.mjs +24 -0
- package/esm/tools/thenable.mjs.map +1 -0
- package/esm/tools/timer.mjs +20 -0
- package/esm/tools/timer.mjs.map +1 -0
- package/esm/tools/utils/arrayUtils.mjs +21 -0
- package/esm/tools/utils/arrayUtils.mjs.map +1 -0
- package/esm/tools/utils/browserDetection.mjs +31 -0
- package/esm/tools/utils/browserDetection.mjs.map +1 -0
- package/esm/tools/utils/byteUtils.mjs +23 -0
- package/esm/tools/utils/byteUtils.mjs.map +1 -0
- package/esm/tools/utils/functionUtils.mjs +35 -0
- package/esm/tools/utils/functionUtils.mjs.map +1 -0
- package/esm/tools/utils/numberUtils.mjs +11 -0
- package/esm/tools/utils/numberUtils.mjs.map +1 -0
- package/esm/tools/utils/objectUtils.mjs +31 -0
- package/esm/tools/utils/objectUtils.mjs.map +1 -0
- package/esm/tools/utils/polyfills.mjs +17 -0
- package/esm/tools/utils/polyfills.mjs.map +1 -0
- package/esm/tools/utils/responseUtils.mjs +15 -0
- package/esm/tools/utils/responseUtils.mjs.map +1 -0
- package/esm/tools/utils/stringUtils.mjs +81 -0
- package/esm/tools/utils/stringUtils.mjs.map +1 -0
- package/esm/tools/utils/timezone.mjs +12 -0
- package/esm/tools/utils/timezone.mjs.map +1 -0
- package/esm/tools/valueHistory.mjs +117 -0
- package/esm/tools/valueHistory.mjs.map +1 -0
- package/esm/transport/batch.mjs +96 -0
- package/esm/transport/batch.mjs.map +1 -0
- package/esm/transport/eventBridge.mjs +58 -0
- package/esm/transport/eventBridge.mjs.map +1 -0
- package/esm/transport/flushController.mjs +103 -0
- package/esm/transport/flushController.mjs.map +1 -0
- package/esm/transport/httpRequest.mjs +69 -0
- package/esm/transport/httpRequest.mjs.map +1 -0
- package/esm/transport/sendWithRetryStrategy.mjs +154 -0
- package/esm/transport/sendWithRetryStrategy.mjs.map +1 -0
- package/package.json +20 -11
- package/src/boot/displayAlreadyInitializedError.ts +4 -1
- package/src/boot/init.ts +3 -2
- package/src/browser/addEventListener.ts +43 -8
- package/src/browser/browser.types.ts +0 -32
- package/src/browser/cookie.ts +45 -30
- package/src/browser/cookieAccess.ts +172 -0
- package/src/browser/fetch.ts +14 -0
- package/src/browser/fetchObservable.ts +25 -26
- package/src/browser/pageMayExitObservable.ts +9 -5
- package/src/browser/runOnReadyState.ts +3 -8
- package/src/browser/webSocketObservable.ts +181 -0
- package/src/browser/xhrObservable.ts +22 -13
- package/src/domain/allowedTrackingOrigins.ts +7 -6
- package/src/domain/bufferedData.ts +41 -14
- package/src/domain/configuration/configuration.ts +121 -171
- package/src/domain/configuration/index.ts +6 -7
- package/src/domain/configuration/remoteSdkConfig.ts +65 -16
- package/src/domain/connectivity/connectivity.ts +11 -23
- package/src/domain/console/consoleObservable.ts +9 -5
- package/src/domain/context/contextManager.ts +6 -2
- package/src/domain/context/contextUtils.ts +1 -1
- package/src/domain/context/defineContextMethod.ts +4 -4
- package/src/domain/context/storeContextManager.ts +9 -6
- package/src/domain/contexts/accountContext.ts +5 -5
- package/src/domain/contexts/globalContext.ts +4 -5
- package/src/domain/contexts/tabContext.ts +43 -0
- package/src/domain/contexts/telemetrySessionContext.ts +26 -0
- package/src/domain/contexts/userContext.ts +21 -16
- package/src/domain/error/error.ts +83 -35
- package/src/domain/error/error.types.ts +6 -4
- package/src/domain/error/isError.ts +13 -0
- package/src/domain/error/trackRuntimeError.ts +11 -4
- package/src/domain/eventRateLimiter/createEventRateLimiter.ts +3 -9
- package/src/{tools/utils → domain/geo}/geocoding.ts +7 -18
- package/src/{tools/utils → domain/geo}/geolocation.ts +1 -1
- package/src/domain/report/reportObservable.ts +15 -8
- package/src/domain/resourceUtils.ts +1 -0
- package/src/domain/sampler.ts +59 -0
- package/src/domain/session/sessionConstants.ts +2 -1
- package/src/domain/session/sessionManager.ts +347 -178
- package/src/domain/session/sessionState.ts +71 -10
- package/src/domain/session/sessionStore.ts +53 -226
- package/src/domain/session/storeStrategies/sessionInCookie.ts +122 -107
- package/src/domain/session/storeStrategies/sessionInLocalStorage.ts +33 -21
- package/src/domain/session/storeStrategies/sessionInMemory.ts +55 -0
- package/src/domain/session/storeStrategies/sessionStoreStrategy.ts +28 -6
- package/src/domain/sourceCodeContext.ts +100 -0
- package/src/domain/synthetics/syntheticsWorkerValues.ts +47 -15
- package/src/domain/tags.ts +5 -19
- package/src/domain/telemetry/rawTelemetryEvent.types.ts +1 -1
- package/src/domain/telemetry/telemetry.ts +44 -52
- package/src/domain/telemetry/telemetryEvent.types.ts +177 -19
- package/src/domain/trackingConsent.ts +18 -3
- package/src/domain/userAgentData/userAgentData.ts +1 -1
- package/src/index.ts +59 -43
- package/src/tools/display.ts +2 -52
- package/src/tools/experimentalFeatures.ts +3 -4
- package/src/tools/getZoneJsOriginalValue.ts +3 -3
- package/src/tools/instrumentMethod.ts +228 -18
- package/src/tools/matchOption.ts +2 -6
- package/src/tools/mockable.ts +32 -0
- package/src/tools/observable.ts +11 -2
- package/src/tools/queueMicrotask.ts +8 -3
- package/src/tools/readBytesFromStream.ts +3 -12
- package/src/tools/requestIdleCallback.ts +2 -2
- package/src/tools/sendToExtension.ts +1 -1
- package/src/tools/serialisation/sanitize.ts +71 -64
- package/src/tools/serialisation/stringify.ts +18 -0
- package/src/tools/stackTrace/computeStackTrace.ts +19 -19
- package/src/tools/stackTrace/handlingStack.ts +15 -2
- package/src/tools/taskQueue.ts +5 -3
- package/src/tools/thenable.ts +23 -0
- package/src/tools/timer.ts +8 -7
- package/src/tools/utils/arrayUtils.ts +8 -2
- package/src/tools/utils/browserDetection.ts +8 -0
- package/src/tools/utils/byteUtils.ts +2 -6
- package/src/tools/utils/functionUtils.ts +2 -2
- package/src/tools/utils/numberUtils.ts +0 -12
- package/src/tools/utils/objectUtils.ts +20 -0
- package/src/tools/utils/stringUtils.ts +23 -1
- package/src/tools/valueHistory.ts +59 -18
- package/src/transport/batch.ts +50 -31
- package/src/transport/eventBridge.ts +24 -10
- package/src/transport/flushController.ts +22 -30
- package/src/transport/httpRequest.ts +18 -47
- package/src/transport/index.ts +3 -2
- package/src/transport/sendWithRetryStrategy.ts +29 -17
- package/cjs/browser/browser.types.js +0 -6
- package/cjs/browser/browser.types.js.map +0 -1
- package/cjs/domain/configuration/endpointBuilder.d.ts +0 -12
- package/cjs/domain/configuration/endpointBuilder.js +0 -66
- package/cjs/domain/configuration/endpointBuilder.js.map +0 -1
- package/cjs/domain/configuration/index.js +0 -44
- package/cjs/domain/configuration/index.js.map +0 -1
- package/cjs/domain/configuration/transportConfiguration.d.ts +0 -21
- package/cjs/domain/configuration/transportConfiguration.js +0 -58
- package/cjs/domain/configuration/transportConfiguration.js.map +0 -1
- package/cjs/domain/connectivity/index.js +0 -18
- package/cjs/domain/connectivity/index.js.map +0 -1
- package/cjs/domain/contexts/rumInternalContext.type.js +0 -3
- package/cjs/domain/contexts/rumInternalContext.type.js.map +0 -1
- package/cjs/domain/deflate/index.js +0 -18
- package/cjs/domain/deflate/index.js.map +0 -1
- package/cjs/domain/intakeSites.d.ts +0 -4
- package/cjs/domain/intakeSites.js +0 -7
- package/cjs/domain/intakeSites.js.map +0 -1
- package/cjs/domain/report/browser.types.js +0 -3
- package/cjs/domain/report/browser.types.js.map +0 -1
- package/cjs/domain/session/oldCookiesMigration.d.ts +0 -11
- package/cjs/domain/session/oldCookiesMigration.js +0 -40
- package/cjs/domain/session/oldCookiesMigration.js.map +0 -1
- package/cjs/domain/session/sessionStoreOperations.d.ts +0 -12
- package/cjs/domain/session/sessionStoreOperations.js +0 -119
- package/cjs/domain/session/sessionStoreOperations.js.map +0 -1
- package/cjs/domain/telemetry/index.js +0 -28
- package/cjs/domain/telemetry/index.js.map +0 -1
- package/cjs/domain/telemetry/telemetryEvent.types.js +0 -7
- package/cjs/domain/telemetry/telemetryEvent.types.js.map +0 -1
- package/cjs/domain/userAgentData/index.js +0 -18
- package/cjs/domain/userAgentData/index.js.map +0 -1
- package/cjs/index.js.map +0 -1
- package/cjs/tools/abstractHooks.d.ts +0 -24
- package/cjs/tools/abstractHooks.js +0 -41
- package/cjs/tools/abstractHooks.js.map +0 -1
- package/cjs/tools/boundedBuffer.d.ts +0 -16
- package/cjs/tools/boundedBuffer.js +0 -32
- package/cjs/tools/boundedBuffer.js.map +0 -1
- package/cjs/tools/globalObject.d.ts +0 -19
- package/cjs/tools/globalObject.js +0 -44
- package/cjs/tools/globalObject.js.map +0 -1
- package/cjs/tools/mergeInto.d.ts +0 -25
- package/cjs/tools/mergeInto.js +0 -98
- package/cjs/tools/mergeInto.js.map +0 -1
- package/cjs/tools/monitor.d.ts +0 -9
- package/cjs/tools/monitor.js +0 -61
- package/cjs/tools/monitor.js.map +0 -1
- package/cjs/tools/serialisation/context.js +0 -3
- package/cjs/tools/serialisation/context.js.map +0 -1
- package/cjs/tools/utils/geocoding.js +0 -80
- package/cjs/tools/utils/geocoding.js.map +0 -1
- package/cjs/tools/utils/geolocation.js +0 -77
- package/cjs/tools/utils/geolocation.js.map +0 -1
- package/cjs/tools/utils/timeUtils.d.ts +0 -53
- package/cjs/tools/utils/timeUtils.js +0 -101
- package/cjs/tools/utils/timeUtils.js.map +0 -1
- package/cjs/tools/utils/typeUtils.d.ts +0 -4
- package/cjs/tools/utils/typeUtils.js +0 -16
- package/cjs/tools/utils/typeUtils.js.map +0 -1
- package/cjs/tools/utils/urlPolyfill.d.ts +0 -5
- package/cjs/tools/utils/urlPolyfill.js +0 -59
- package/cjs/tools/utils/urlPolyfill.js.map +0 -1
- package/cjs/transport/index.js +0 -15
- package/cjs/transport/index.js.map +0 -1
- package/esm/boot/displayAlreadyInitializedError.d.ts +0 -2
- package/esm/boot/displayAlreadyInitializedError.js +0 -7
- package/esm/boot/displayAlreadyInitializedError.js.map +0 -1
- package/esm/boot/init.d.ts +0 -13
- package/esm/boot/init.js +0 -35
- package/esm/boot/init.js.map +0 -1
- package/esm/browser/addEventListener.d.ts +0 -87
- package/esm/browser/addEventListener.js +0 -51
- package/esm/browser/addEventListener.js.map +0 -1
- package/esm/browser/browser.types.d.ts +0 -51
- package/esm/browser/browser.types.js +0 -5
- package/esm/browser/browser.types.js.map +0 -1
- package/esm/browser/cookie.d.ts +0 -26
- package/esm/browser/cookie.js +0 -101
- package/esm/browser/cookie.js.map +0 -1
- package/esm/browser/fetchObservable.d.ts +0 -38
- package/esm/browser/fetchObservable.js +0 -99
- package/esm/browser/fetchObservable.js.map +0 -1
- package/esm/browser/pageMayExitObservable.d.ts +0 -14
- package/esm/browser/pageMayExitObservable.js +0 -51
- package/esm/browser/pageMayExitObservable.js.map +0 -1
- package/esm/browser/runOnReadyState.d.ts +0 -5
- package/esm/browser/runOnReadyState.js +0 -16
- package/esm/browser/runOnReadyState.js.map +0 -1
- package/esm/browser/xhrObservable.d.ts +0 -24
- package/esm/browser/xhrObservable.js +0 -83
- package/esm/browser/xhrObservable.js.map +0 -1
- package/esm/domain/allowedTrackingOrigins.d.ts +0 -4
- package/esm/domain/allowedTrackingOrigins.js +0 -21
- package/esm/domain/allowedTrackingOrigins.js.map +0 -1
- package/esm/domain/bufferedData.d.ts +0 -14
- package/esm/domain/bufferedData.js +0 -19
- package/esm/domain/bufferedData.js.map +0 -1
- package/esm/domain/configuration/configuration.d.ts +0 -284
- package/esm/domain/configuration/configuration.js +0 -129
- package/esm/domain/configuration/configuration.js.map +0 -1
- package/esm/domain/configuration/endpointBuilder.d.ts +0 -12
- package/esm/domain/configuration/endpointBuilder.js +0 -62
- package/esm/domain/configuration/endpointBuilder.js.map +0 -1
- package/esm/domain/configuration/index.d.ts +0 -8
- package/esm/domain/configuration/index.js +0 -6
- package/esm/domain/configuration/index.js.map +0 -1
- package/esm/domain/configuration/remoteSdkConfig.d.ts +0 -81
- package/esm/domain/configuration/remoteSdkConfig.js +0 -172
- package/esm/domain/configuration/remoteSdkConfig.js.map +0 -1
- package/esm/domain/configuration/transportConfiguration.d.ts +0 -21
- package/esm/domain/configuration/transportConfiguration.js +0 -54
- package/esm/domain/configuration/transportConfiguration.js.map +0 -1
- package/esm/domain/connectivity/connectivity.d.ts +0 -18
- package/esm/domain/connectivity/connectivity.js +0 -13
- package/esm/domain/connectivity/connectivity.js.map +0 -1
- package/esm/domain/connectivity/index.d.ts +0 -1
- package/esm/domain/connectivity/index.js +0 -2
- package/esm/domain/connectivity/index.js.map +0 -1
- package/esm/domain/console/consoleObservable.d.ts +0 -21
- package/esm/domain/console/consoleObservable.js +0 -80
- package/esm/domain/console/consoleObservable.js.map +0 -1
- package/esm/domain/context/contextConstants.d.ts +0 -21
- package/esm/domain/context/contextConstants.js +0 -15
- package/esm/domain/context/contextConstants.js.map +0 -1
- package/esm/domain/context/contextManager.d.ts +0 -19
- package/esm/domain/context/contextManager.js +0 -56
- package/esm/domain/context/contextManager.js.map +0 -1
- package/esm/domain/context/contextUtils.d.ts +0 -5
- package/esm/domain/context/contextUtils.js +0 -13
- package/esm/domain/context/contextUtils.js.map +0 -1
- package/esm/domain/context/defineContextMethod.d.ts +0 -6
- package/esm/domain/context/defineContextMethod.js +0 -17
- package/esm/domain/context/defineContextMethod.js.map +0 -1
- package/esm/domain/context/storeContextManager.d.ts +0 -6
- package/esm/domain/context/storeContextManager.js +0 -35
- package/esm/domain/context/storeContextManager.js.map +0 -1
- package/esm/domain/contexts/accountContext.d.ts +0 -26
- package/esm/domain/contexts/accountContext.js +0 -29
- package/esm/domain/contexts/accountContext.js.map +0 -1
- package/esm/domain/contexts/globalContext.d.ts +0 -18
- package/esm/domain/contexts/globalContext.js +0 -17
- package/esm/domain/contexts/globalContext.js.map +0 -1
- package/esm/domain/contexts/rumInternalContext.type.d.ts +0 -14
- package/esm/domain/contexts/rumInternalContext.type.js +0 -2
- package/esm/domain/contexts/rumInternalContext.type.js.map +0 -1
- package/esm/domain/contexts/userContext.d.ts +0 -32
- package/esm/domain/contexts/userContext.js +0 -120
- package/esm/domain/contexts/userContext.js.map +0 -1
- package/esm/domain/deflate/deflate.types.d.ts +0 -40
- package/esm/domain/deflate/deflate.types.js +0 -2
- package/esm/domain/deflate/deflate.types.js.map +0 -1
- package/esm/domain/deflate/index.d.ts +0 -1
- package/esm/domain/deflate/index.js +0 -2
- package/esm/domain/deflate/index.js.map +0 -1
- package/esm/domain/error/error.d.ts +0 -23
- package/esm/domain/error/error.js +0 -72
- package/esm/domain/error/error.js.map +0 -1
- package/esm/domain/error/error.types.d.ts +0 -47
- package/esm/domain/error/error.types.js +0 -10
- package/esm/domain/error/error.types.js.map +0 -1
- package/esm/domain/error/trackRuntimeError.d.ts +0 -11
- package/esm/domain/error/trackRuntimeError.js +0 -43
- package/esm/domain/error/trackRuntimeError.js.map +0 -1
- package/esm/domain/eventRateLimiter/createEventRateLimiter.d.ts +0 -5
- package/esm/domain/eventRateLimiter/createEventRateLimiter.js +0 -38
- package/esm/domain/eventRateLimiter/createEventRateLimiter.js.map +0 -1
- package/esm/domain/extension/extensionUtils.d.ts +0 -10
- package/esm/domain/extension/extensionUtils.js +0 -25
- package/esm/domain/extension/extensionUtils.js.map +0 -1
- package/esm/domain/intakeSites.d.ts +0 -4
- package/esm/domain/intakeSites.js +0 -4
- package/esm/domain/intakeSites.js.map +0 -1
- package/esm/domain/report/browser.types.d.ts +0 -34
- package/esm/domain/report/browser.types.js +0 -2
- package/esm/domain/report/browser.types.js.map +0 -1
- package/esm/domain/report/reportObservable.d.ts +0 -14
- package/esm/domain/report/reportObservable.js +0 -95
- package/esm/domain/report/reportObservable.js.map +0 -1
- package/esm/domain/resourceUtils.d.ts +0 -18
- package/esm/domain/resourceUtils.js +0 -17
- package/esm/domain/resourceUtils.js.map +0 -1
- package/esm/domain/session/oldCookiesMigration.d.ts +0 -11
- package/esm/domain/session/oldCookiesMigration.js +0 -36
- package/esm/domain/session/oldCookiesMigration.js.map +0 -1
- package/esm/domain/session/sessionConstants.d.ts +0 -15
- package/esm/domain/session/sessionConstants.js +0 -13
- package/esm/domain/session/sessionConstants.js.map +0 -1
- package/esm/domain/session/sessionManager.d.ts +0 -28
- package/esm/domain/session/sessionManager.js +0 -196
- package/esm/domain/session/sessionManager.js.map +0 -1
- package/esm/domain/session/sessionState.d.ts +0 -16
- package/esm/domain/session/sessionState.js +0 -60
- package/esm/domain/session/sessionState.js.map +0 -1
- package/esm/domain/session/sessionStateValidation.d.ts +0 -3
- package/esm/domain/session/sessionStateValidation.js +0 -7
- package/esm/domain/session/sessionStateValidation.js.map +0 -1
- package/esm/domain/session/sessionStore.d.ts +0 -38
- package/esm/domain/session/sessionStore.js +0 -180
- package/esm/domain/session/sessionStore.js.map +0 -1
- package/esm/domain/session/sessionStoreOperations.d.ts +0 -12
- package/esm/domain/session/sessionStoreOperations.js +0 -114
- package/esm/domain/session/sessionStoreOperations.js.map +0 -1
- package/esm/domain/session/storeStrategies/sessionInCookie.d.ts +0 -12
- package/esm/domain/session/storeStrategies/sessionInCookie.js +0 -98
- package/esm/domain/session/storeStrategies/sessionInCookie.js.map +0 -1
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.d.ts +0 -6
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.js +0 -37
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.js.map +0 -1
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.d.ts +0 -16
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.js +0 -2
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.js.map +0 -1
- package/esm/domain/synthetics/syntheticsWorkerValues.d.ts +0 -12
- package/esm/domain/synthetics/syntheticsWorkerValues.js +0 -24
- package/esm/domain/synthetics/syntheticsWorkerValues.js.map +0 -1
- package/esm/domain/tags.d.ts +0 -6
- package/esm/domain/tags.js +0 -59
- package/esm/domain/tags.js.map +0 -1
- package/esm/domain/telemetry/index.d.ts +0 -4
- package/esm/domain/telemetry/index.js +0 -3
- package/esm/domain/telemetry/index.js.map +0 -1
- package/esm/domain/telemetry/rawTelemetryEvent.types.d.ts +0 -18
- package/esm/domain/telemetry/rawTelemetryEvent.types.js +0 -6
- package/esm/domain/telemetry/rawTelemetryEvent.types.js.map +0 -1
- package/esm/domain/telemetry/telemetry.d.ts +0 -56
- package/esm/domain/telemetry/telemetry.js +0 -232
- package/esm/domain/telemetry/telemetry.js.map +0 -1
- package/esm/domain/telemetry/telemetryEvent.types.d.ts +0 -866
- package/esm/domain/telemetry/telemetryEvent.types.js +0 -6
- package/esm/domain/telemetry/telemetryEvent.types.js.map +0 -1
- package/esm/domain/trackingConsent.d.ts +0 -13
- package/esm/domain/trackingConsent.js +0 -24
- package/esm/domain/trackingConsent.js.map +0 -1
- package/esm/domain/userAgentData/index.d.ts +0 -1
- package/esm/domain/userAgentData/index.js +0 -2
- package/esm/domain/userAgentData/index.js.map +0 -1
- package/esm/domain/userAgentData/userAgentData.d.ts +0 -22
- package/esm/domain/userAgentData/userAgentData.js +0 -105
- package/esm/domain/userAgentData/userAgentData.js.map +0 -1
- package/esm/index.d.ts +0 -104
- package/esm/index.js +0 -79
- package/esm/index.js.map +0 -1
- package/esm/tools/abstractHooks.d.ts +0 -24
- package/esm/tools/abstractHooks.js +0 -37
- package/esm/tools/abstractHooks.js.map +0 -1
- package/esm/tools/abstractLifeCycle.d.ts +0 -23
- package/esm/tools/abstractLifeCycle.js +0 -24
- package/esm/tools/abstractLifeCycle.js.map +0 -1
- package/esm/tools/boundedBuffer.d.ts +0 -16
- package/esm/tools/boundedBuffer.js +0 -29
- package/esm/tools/boundedBuffer.js.map +0 -1
- package/esm/tools/catchUserErrors.d.ts +0 -1
- package/esm/tools/catchUserErrors.js +0 -12
- package/esm/tools/catchUserErrors.js.map +0 -1
- package/esm/tools/display.d.ts +0 -38
- package/esm/tools/display.js +0 -41
- package/esm/tools/display.js.map +0 -1
- package/esm/tools/encoder.d.ts +0 -54
- package/esm/tools/encoder.js +0 -37
- package/esm/tools/encoder.js.map +0 -1
- package/esm/tools/experimentalFeatures.d.ts +0 -21
- package/esm/tools/experimentalFeatures.js +0 -42
- package/esm/tools/experimentalFeatures.js.map +0 -1
- package/esm/tools/getZoneJsOriginalValue.d.ts +0 -19
- package/esm/tools/getZoneJsOriginalValue.js +0 -26
- package/esm/tools/getZoneJsOriginalValue.js.map +0 -1
- package/esm/tools/globalObject.d.ts +0 -19
- package/esm/tools/globalObject.js +0 -40
- package/esm/tools/globalObject.js.map +0 -1
- package/esm/tools/instrumentMethod.d.ts +0 -75
- package/esm/tools/instrumentMethod.js +0 -114
- package/esm/tools/instrumentMethod.js.map +0 -1
- package/esm/tools/matchOption.d.ts +0 -8
- package/esm/tools/matchOption.js +0 -31
- package/esm/tools/matchOption.js.map +0 -1
- package/esm/tools/mergeInto.d.ts +0 -25
- package/esm/tools/mergeInto.js +0 -93
- package/esm/tools/mergeInto.js.map +0 -1
- package/esm/tools/monitor.d.ts +0 -9
- package/esm/tools/monitor.js +0 -51
- package/esm/tools/monitor.js.map +0 -1
- package/esm/tools/observable.d.ts +0 -30
- package/esm/tools/observable.js +0 -83
- package/esm/tools/observable.js.map +0 -1
- package/esm/tools/queueMicrotask.d.ts +0 -1
- package/esm/tools/queueMicrotask.js +0 -14
- package/esm/tools/queueMicrotask.js.map +0 -1
- package/esm/tools/readBytesFromStream.d.ts +0 -10
- package/esm/tools/readBytesFromStream.js +0 -25
- package/esm/tools/readBytesFromStream.js.map +0 -1
- package/esm/tools/requestIdleCallback.d.ts +0 -12
- package/esm/tools/requestIdleCallback.js +0 -30
- package/esm/tools/requestIdleCallback.js.map +0 -1
- package/esm/tools/sendToExtension.d.ts +0 -3
- package/esm/tools/sendToExtension.js +0 -8
- package/esm/tools/sendToExtension.js.map +0 -1
- package/esm/tools/serialisation/context.d.ts +0 -9
- package/esm/tools/serialisation/context.js +0 -2
- package/esm/tools/serialisation/context.js.map +0 -1
- package/esm/tools/serialisation/jsonStringify.d.ts +0 -13
- package/esm/tools/serialisation/jsonStringify.js +0 -44
- package/esm/tools/serialisation/jsonStringify.js.map +0 -1
- package/esm/tools/serialisation/sanitize.d.ts +0 -18
- package/esm/tools/serialisation/sanitize.js +0 -185
- package/esm/tools/serialisation/sanitize.js.map +0 -1
- package/esm/tools/stackTrace/computeStackTrace.d.ts +0 -25
- package/esm/tools/stackTrace/computeStackTrace.js +0 -183
- package/esm/tools/stackTrace/computeStackTrace.js.map +0 -1
- package/esm/tools/stackTrace/handlingStack.d.ts +0 -10
- package/esm/tools/stackTrace/handlingStack.js +0 -41
- package/esm/tools/stackTrace/handlingStack.js.map +0 -1
- package/esm/tools/taskQueue.d.ts +0 -15
- package/esm/tools/taskQueue.js +0 -50
- package/esm/tools/taskQueue.js.map +0 -1
- package/esm/tools/timer.d.ts +0 -5
- package/esm/tools/timer.js +0 -16
- package/esm/tools/timer.js.map +0 -1
- package/esm/tools/utils/arrayUtils.d.ts +0 -3
- package/esm/tools/utils/arrayUtils.js +0 -15
- package/esm/tools/utils/arrayUtils.js.map +0 -1
- package/esm/tools/utils/browserDetection.d.ts +0 -8
- package/esm/tools/utils/browserDetection.js +0 -28
- package/esm/tools/utils/browserDetection.js.map +0 -1
- package/esm/tools/utils/byteUtils.d.ts +0 -8
- package/esm/tools/utils/byteUtils.js +0 -29
- package/esm/tools/utils/byteUtils.js.map +0 -1
- package/esm/tools/utils/functionUtils.d.ts +0 -8
- package/esm/tools/utils/functionUtils.js +0 -39
- package/esm/tools/utils/functionUtils.js.map +0 -1
- package/esm/tools/utils/geocoding.d.ts +0 -60
- package/esm/tools/utils/geocoding.js +0 -73
- package/esm/tools/utils/geocoding.js.map +0 -1
- package/esm/tools/utils/geolocation.d.ts +0 -24
- package/esm/tools/utils/geolocation.js +0 -71
- package/esm/tools/utils/geolocation.js.map +0 -1
- package/esm/tools/utils/numberUtils.d.ts +0 -8
- package/esm/tools/utils/numberUtils.js +0 -17
- package/esm/tools/utils/numberUtils.js.map +0 -1
- package/esm/tools/utils/objectUtils.d.ts +0 -10
- package/esm/tools/utils/objectUtils.js +0 -17
- package/esm/tools/utils/objectUtils.js.map +0 -1
- package/esm/tools/utils/polyfills.d.ts +0 -7
- package/esm/tools/utils/polyfills.js +0 -18
- package/esm/tools/utils/polyfills.js.map +0 -1
- package/esm/tools/utils/responseUtils.d.ts +0 -2
- package/esm/tools/utils/responseUtils.js +0 -13
- package/esm/tools/utils/responseUtils.js.map +0 -1
- package/esm/tools/utils/stringUtils.d.ts +0 -23
- package/esm/tools/utils/stringUtils.js +0 -84
- package/esm/tools/utils/stringUtils.js.map +0 -1
- package/esm/tools/utils/timeUtils.d.ts +0 -53
- package/esm/tools/utils/timeUtils.js +0 -84
- package/esm/tools/utils/timeUtils.js.map +0 -1
- package/esm/tools/utils/timezone.d.ts +0 -1
- package/esm/tools/utils/timezone.js +0 -10
- package/esm/tools/utils/timezone.js.map +0 -1
- package/esm/tools/utils/typeUtils.d.ts +0 -4
- package/esm/tools/utils/typeUtils.js +0 -13
- package/esm/tools/utils/typeUtils.js.map +0 -1
- package/esm/tools/utils/urlPolyfill.d.ts +0 -5
- package/esm/tools/utils/urlPolyfill.js +0 -52
- package/esm/tools/utils/urlPolyfill.js.map +0 -1
- package/esm/tools/valueHistory.d.ts +0 -27
- package/esm/tools/valueHistory.js +0 -100
- package/esm/tools/valueHistory.js.map +0 -1
- package/esm/transport/batch.d.ts +0 -16
- package/esm/transport/batch.js +0 -106
- package/esm/transport/batch.js.map +0 -1
- package/esm/transport/eventBridge.d.ts +0 -21
- package/esm/transport/eventBridge.js +0 -41
- package/esm/transport/eventBridge.js.map +0 -1
- package/esm/transport/flushController.d.ts +0 -65
- package/esm/transport/flushController.js +0 -119
- package/esm/transport/flushController.js.map +0 -1
- package/esm/transport/httpRequest.d.ts +0 -57
- package/esm/transport/httpRequest.js +0 -101
- package/esm/transport/httpRequest.js.map +0 -1
- package/esm/transport/index.d.ts +0 -7
- package/esm/transport/index.js +0 -5
- package/esm/transport/index.js.map +0 -1
- package/esm/transport/sendWithRetryStrategy.d.ts +0 -41
- package/esm/transport/sendWithRetryStrategy.js +0 -158
- package/esm/transport/sendWithRetryStrategy.js.map +0 -1
- package/src/domain/configuration/endpointBuilder.ts +0 -105
- package/src/domain/configuration/transportConfiguration.ts +0 -86
- package/src/domain/intakeSites.ts +0 -6
- package/src/domain/session/oldCookiesMigration.ts +0 -42
- package/src/domain/session/sessionStoreOperations.ts +0 -131
- package/src/tools/abstractHooks.ts +0 -72
- package/src/tools/boundedBuffer.ts +0 -44
- package/src/tools/globalObject.ts +0 -51
- package/src/tools/mergeInto.ts +0 -177
- package/src/tools/monitor.ts +0 -71
- package/src/tools/utils/timeUtils.ts +0 -117
- package/src/tools/utils/typeUtils.ts +0 -12
- package/src/tools/utils/urlPolyfill.ts +0 -55
- /package/cjs/{tools/utils → domain/geo}/geocoding.d.ts +0 -0
- /package/cjs/{tools/utils → domain/geo}/geolocation.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.mjs","names":[],"sources":["../../../src/domain/session/sessionManager.ts"],"sourcesContent":["import {\n ONE_HOUR,\n ONE_MINUTE,\n ONE_SECOND,\n dateNow,\n elapsed,\n timeStampNow,\n clocksOrigin,\n relativeNow,\n clocksNow,\n timeStampToClocks,\n toTimeStamp,\n} from '@kubesense/kubesense-js-core/time'\nimport type { ClocksState, TimeStamp, RelativeTime } from '@kubesense/kubesense-js-core/time'\nimport { isWorkerEnvironment } from '@kubesense/kubesense-js-core/util'\nimport { monitorError } from '@kubesense/kubesense-js-core/monitor'\nimport { Observable } from '../../tools/observable'\nimport { createValueHistory } from '../../tools/valueHistory'\nimport { addEventListener, addEventListeners, DOM_EVENT } from '../../browser/addEventListener'\nimport { clearInterval, clearTimeout, setInterval, setTimeout } from '../../tools/timer'\nimport { mockable } from '../../tools/mockable'\nimport { noop, throttle } from '../../tools/utils/functionUtils'\nimport { generateUUID } from '../../tools/utils/stringUtils'\nimport type { Configuration } from '../configuration'\nimport type { TrackingConsentState } from '../trackingConsent'\nimport { display } from '../../tools/display'\nimport { isSampled } from '../sampler'\nimport { TelemetryMetrics, addTelemetryMetrics } from '../telemetry'\nimport type { SessionState } from './sessionState'\nimport {\n expandOnly,\n expandOrRenew,\n getCreatedDate,\n getExpireDate,\n getExpiredSessionState,\n initializeSession,\n isSessionInExpiredState,\n} from './sessionState'\nimport { getSessionStoreStrategy, selectSessionStoreStrategyType } from './sessionStore'\nimport { SESSION_TIME_OUT_DELAY } from './sessionConstants'\n\nexport interface SessionManager {\n findSession: (startTime?: RelativeTime, options?: { returnInactive: boolean }) => SessionContext | undefined\n findTrackedSession: (\n startTime?: RelativeTime,\n options?: { returnInactive?: boolean; maxAge?: number }\n ) => SessionContext | undefined\n renewObservable: Observable<void>\n expireObservable: Observable<void>\n expire: () => void\n updateSessionState: (state: Partial<SessionState>) => void\n}\n\nexport interface SessionContext {\n id: string\n anonymousId?: string | undefined\n isReplayForced?: boolean\n createdAt: TimeStamp\n}\n\nexport const VISIBILITY_CHECK_DELAY = ONE_MINUTE\n\n// Arbitrary value to cap memory consumption for very long-lived pages with many session\n// renewals. Entries are *not* evicted based on elapsed time: an idle session's sole (closed)\n// entry must survive indefinitely so browser-logs can keep sending logs after it expires, with\n// or without a session attached (see browser-logs/src/domain/contexts/sessionContext.ts).\nexport const MAX_SESSION_CONTEXT_HISTORY_ENTRIES = 1000\n\n// Maximum duration for which we can send data related to a session.\n//\n// The backend behavior depends on how old the session is when it receives an event:\n// - Session started < 4h ago: the backend updates the session normally.\n// - Session started between 4h and 24h ago: the backend ignores the event (safe).\n// - Session started > 24h ago: the backend recreates a session with that id (problematic).\n//\n// We choose 12h as a threshold — safely between 4h and 24h — to avoid both recreating\n// sessions and discarding too many legitimate late events.\nexport const TRACKED_SESSION_MAX_AGE = ONE_HOUR * 12\nlet stopCallbacks: Array<() => void> = []\n\nexport async function startSessionManager(\n configuration: Configuration,\n trackingConsentState: TrackingConsentState\n): Promise<SessionManager | undefined> {\n const startTime = relativeNow()\n const renewObservable = new Observable<void>()\n const expireObservable = new Observable<void>()\n\n const sessionStoreStrategyType = await mockable(selectSessionStoreStrategyType)(configuration)\n if (!sessionStoreStrategyType) {\n display.warn('No storage available for session. We will not send any data.')\n return\n }\n\n const strategy = mockable(getSessionStoreStrategy)(sessionStoreStrategyType, configuration)\n\n const sessionContextHistory = createValueHistory<SessionContext>({\n maxEntries: MAX_SESSION_CONTEXT_HISTORY_ENTRIES,\n })\n stopCallbacks.push(() => sessionContextHistory.stop())\n\n let sessionExpired = false\n\n const { throttled: throttledExpandOrRenew, cancel: cancelExpandOrRenew } = throttle(() => {\n expireTimedOutSession()\n sessionExpired = false\n strategy\n .setSessionState((state) => expandOrRenew(state, configuration), 'expandOrRenewOnActivity')\n .catch(monitorError)\n }, ONE_SECOND)\n stopCallbacks.push(cancelExpandOrRenew)\n\n let expirationTimeoutId: ReturnType<typeof setTimeout> | undefined\n stopCallbacks.push(() => clearTimeout(expirationTimeoutId))\n\n let stopped = false\n stopCallbacks.push(() => {\n stopped = true\n })\n\n let initialState = await resolveInitialState().catch((error) =>\n monitorError(new Error(`Error while resolving initial session state: ${error}`))\n )\n if (!initialState || stopped) {\n return\n }\n\n // Consent is always granted when the session manager is started, but it may\n // be revoked during the async initialization (e.g., while waiting for cookie lock).\n // Mirror setupSessionTracking's revoke/grant handler until the manager is installed:\n // expire the session in storage, wait for the next grant, then re-resolve.\n while (!trackingConsentState.isGranted()) {\n expire()\n await new Promise<void>((resolve) => trackingConsentState.onGrantedOnce(resolve))\n if (stopped) {\n return\n }\n initialState = await resolveInitialState().catch(monitorError)\n if (!initialState || stopped) {\n return\n }\n }\n\n sessionContextHistory.add(buildSessionContext(initialState), clocksOrigin().relative)\n scheduleExpirationTimeout(initialState)\n subscribeToSessionChanges()\n setupSessionTracking()\n\n // monitor-until: 2026-10-15\n addTelemetryMetrics(TelemetryMetrics.SESSION_MANAGER_INIT_METRICS_TELEMETRY_NAME, {\n metrics: { duration: elapsed(startTime, relativeNow()) },\n })\n\n return buildSessionManager()\n\n async function resolveInitialState() {\n let state: SessionState = {}\n await strategy.setSessionState((currentState) => {\n const initialState = initializeSession(currentState, configuration)\n state = expandOrRenew(initialState, configuration)\n return state\n }, 'initialize')\n return state\n }\n\n function subscribeToSessionChanges() {\n const subscription = strategy.sessionObservable.subscribe((sessionState) => {\n scheduleExpirationTimeout(sessionState)\n handleStateChange(sessionState)\n })\n stopCallbacks.push(() => subscription.unsubscribe())\n }\n\n function scheduleExpirationTimeout(state: SessionState) {\n clearTimeout(expirationTimeoutId)\n const expireDate = getExpireDate(state)\n if (expireDate) {\n const delay = expireDate - dateNow()\n expirationTimeoutId = setTimeout(() => {\n strategy\n .setSessionState((state) => {\n if (isSessionInExpiredState(state)) {\n const nextState = getExpiredSessionState(state, configuration)\n if (!trackingConsentState.isGranted()) {\n delete nextState.anonymousId\n }\n\n return nextState\n }\n\n return state\n }, 'expireOnTimeout')\n .catch(monitorError)\n }, delay)\n }\n }\n\n function setupSessionTracking() {\n trackingConsentState.observable.subscribe(() => {\n if (trackingConsentState.isGranted()) {\n sessionExpired = false\n strategy\n .setSessionState((state) => expandOrRenew(state, configuration), 'expandOrRenewOnConsent')\n .catch(monitorError)\n } else {\n expire()\n }\n })\n\n if (!isWorkerEnvironment) {\n trackActivity(() => {\n if (trackingConsentState.isGranted()) {\n throttledExpandOrRenew()\n }\n })\n trackVisibility(() => {\n if (!sessionExpired) {\n strategy.setSessionState((state) => expandOnly(state), 'expandOnVisibility').catch(monitorError)\n }\n })\n trackResume(() => {\n strategy\n .setSessionState((state) => initializeSession(state, configuration), 'initializeOnResume')\n .catch(monitorError)\n })\n }\n }\n\n function buildSessionManager(): SessionManager {\n return {\n findSession: (startTime, options) => sessionContextHistory.find(startTime, options),\n findTrackedSession: (startTime, { returnInactive = false, maxAge = TRACKED_SESSION_MAX_AGE } = {}) => {\n const session = sessionContextHistory.find(startTime, { returnInactive })\n\n if (!session || session.id === 'invalid' || !isSampled(session.id, configuration.sessionSampleRate)) {\n return\n }\n\n if (dateNow() - session.createdAt > maxAge) {\n return\n }\n\n // A session lasts SESSION_TIME_OUT_DELAY at most, and nothing that happens after that\n // belongs to it. The expiry timeout enforces it, but a hidden tab runs that timeout late:\n // browsers throttle background timers, and Edge and Chrome freeze a sleeping tab outright.\n // Until it runs, the history still holds the session as active, so a woken tab kept\n // sending view updates under an id that had expired 20 minutes earlier, and a route\n // change started a new view in it. `returnInactive` callers ask for a past session on\n // purpose (logs keep sending after expiry), so they are left as they are.\n if (!returnInactive && eventTimeStamp(startTime) >= getSessionTimeoutDate(session)) {\n return\n }\n\n return session\n },\n renewObservable,\n expireObservable,\n expire,\n updateSessionState: (partialState) => {\n strategy.setSessionState((state) => ({ ...state, ...partialState }), 'updateState').catch(monitorError)\n },\n }\n }\n\n function handleStateChange(newState: SessionState) {\n const previousSession = sessionContextHistory.find()\n const hadSession = previousSession?.id !== undefined\n const hasSession = newState.id !== undefined\n const sessionIdChanged = hadSession && hasSession && previousSession.id !== newState.id\n\n if (hadSession && (!hasSession || sessionIdChanged)) {\n // Session expired or replaced\n sessionExpired = true\n expireObservable.notify()\n sessionContextHistory.closeActive(getSessionEndClocks(previousSession).relative)\n }\n\n if (hasSession && (!hadSession || sessionIdChanged)) {\n if (sessionExpired) {\n // Don't adopt another tab's session — this tab needs its own user interaction to renew\n return\n }\n // New session appeared\n sessionContextHistory.add(buildSessionContext(newState), relativeNow())\n renewObservable.notify()\n } else if (hadSession && hasSession && !sessionIdChanged) {\n // Same session,\n // Mutate the session context in the history for replay forced changes\n\n previousSession.isReplayForced = !!newState.forcedReplay\n }\n }\n\n // What the expiry timeout does in memory, for a tab that did not run it on time (see\n // findTrackedSession). Called before renewing on activity, so the old session is closed by the\n // time the renewal lands: otherwise the renewed session reads as another tab replacing a live one,\n // which is not adopted, and the tab has no session until a second interaction.\n function expireTimedOutSession() {\n const session = sessionContextHistory.find()\n if (session && timeStampNow() >= getSessionTimeoutDate(session)) {\n handleStateChange(getExpiredSessionState(session, configuration))\n }\n }\n\n function expire() {\n cancelExpandOrRenew()\n // Update in-memory state synchronously so events stop being collected immediately\n const expiredState = getExpiredSessionState(sessionContextHistory.find(), configuration)\n if (!trackingConsentState.isGranted()) {\n delete expiredState.anonymousId\n }\n handleStateChange(expiredState)\n // Persist to storage asynchronously\n strategy\n .setSessionState((state) => {\n const nextState = getExpiredSessionState(state, configuration)\n if (!trackingConsentState.isGranted()) {\n // The anonymous id is regenerated for the next session, so it has to be dropped from the\n // result rather than from the previous state.\n delete nextState.anonymousId\n }\n return nextState\n }, 'expire')\n .catch(monitorError)\n }\n\n function buildSessionContext(sessionState: SessionState): SessionContext {\n const createdAt = getCreatedDate(sessionState) ?? timeStampNow()\n\n if (!sessionState.id) {\n return {\n id: 'invalid',\n isReplayForced: false,\n anonymousId: undefined,\n createdAt,\n }\n }\n\n return {\n id: sessionState.id,\n isReplayForced: !!sessionState.forcedReplay,\n anonymousId: sessionState.anonymousId,\n createdAt,\n }\n }\n}\n\n/**\n * When a session times out: SESSION_TIME_OUT_DELAY after it was created, however much later the tab\n * finds out.\n */\nfunction getSessionTimeoutDate(session: SessionContext): TimeStamp {\n return (session.createdAt + SESSION_TIME_OUT_DELAY) as TimeStamp\n}\n\n/**\n * When a session that is expiring now ended: now, or its timeout if that came first. Views and\n * the session history are closed at this time, so a tab that learns of a timeout late does not\n * stretch the session past it.\n */\nexport function getSessionEndClocks(session: SessionContext | undefined): ClocksState {\n const now = clocksNow()\n if (!session) {\n return now\n }\n const timeoutDate = getSessionTimeoutDate(session)\n return timeoutDate < now.timeStamp ? timeStampToClocks(timeoutDate) : now\n}\n\nfunction eventTimeStamp(startTime: RelativeTime | undefined): TimeStamp {\n return startTime === undefined ? timeStampNow() : toTimeStamp(startTime)\n}\n\nexport function startSessionManagerStub(): Promise<SessionManager> {\n const stubSessionId = generateUUID()\n let sessionContext: SessionContext = {\n id: stubSessionId,\n isReplayForced: false,\n anonymousId: undefined,\n createdAt: timeStampNow(),\n }\n return Promise.resolve({\n findSession: () => sessionContext,\n findTrackedSession: () => sessionContext,\n renewObservable: new Observable(),\n expireObservable: new Observable(),\n expire: noop,\n updateSessionState: (state) => {\n sessionContext = {\n ...sessionContext,\n ...state,\n }\n },\n })\n}\n\nexport function stopSessionManager() {\n stopCallbacks.forEach((e) => e())\n stopCallbacks = []\n}\n\nfunction trackActivity(expandOrRenewSession: () => void) {\n const { stop } = addEventListeners(\n window,\n [DOM_EVENT.CLICK, DOM_EVENT.TOUCH_START, DOM_EVENT.KEY_DOWN, DOM_EVENT.SCROLL],\n expandOrRenewSession,\n { capture: true, passive: true }\n )\n stopCallbacks.push(stop)\n}\n\nfunction trackVisibility(expandSession: () => void) {\n const expandSessionWhenVisible = () => {\n if (document.visibilityState === 'visible') {\n expandSession()\n }\n }\n\n const { stop } = addEventListener(document, DOM_EVENT.VISIBILITY_CHANGE, expandSessionWhenVisible)\n stopCallbacks.push(stop)\n\n const visibilityCheckInterval = setInterval(expandSessionWhenVisible, VISIBILITY_CHECK_DELAY)\n stopCallbacks.push(() => {\n clearInterval(visibilityCheckInterval)\n })\n}\n\nfunction trackResume(cb: () => void) {\n const { stop } = addEventListener(window, DOM_EVENT.RESUME, cb, { capture: true })\n stopCallbacks.push(stop)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA4DA,MAAa,yBAAyB;AAMtC,MAAa,sCAAsC;AAWnD,MAAa,0BAA0B,WAAW;AAClD,IAAI,gBAAmC,CAAC;AAExC,eAAsB,oBACpB,eACA,sBACqC;CACrC,MAAM,YAAY,YAAY;CAC9B,MAAM,kBAAkB,IAAI,WAAiB;CAC7C,MAAM,mBAAmB,IAAI,WAAiB;CAE9C,MAAM,2BAA2B,MAAM,SAAS,8BAA8B,CAAC,CAAC,aAAa;CAC7F,IAAI,CAAC,0BAA0B;EAC7B,QAAQ,KAAK,8DAA8D;EAC3E;CACF;CAEA,MAAM,WAAW,SAAS,uBAAuB,CAAC,CAAC,0BAA0B,aAAa;CAE1F,MAAM,wBAAwB,mBAAmC,EAC/D,YAAY,oCACd,CAAC;CACD,cAAc,WAAW,sBAAsB,KAAK,CAAC;CAErD,IAAI,iBAAiB;CAErB,MAAM,EAAE,WAAW,wBAAwB,QAAQ,wBAAwB,eAAe;EACxF,sBAAsB;EACtB,iBAAiB;EACjB,SACG,iBAAiB,UAAU,cAAc,OAAO,aAAa,GAAG,yBAAyB,CAAC,CAC1F,MAAM,YAAY;CACvB,GAAG,UAAU;CACb,cAAc,KAAK,mBAAmB;CAEtC,IAAI;CACJ,cAAc,WAAW,aAAa,mBAAmB,CAAC;CAE1D,IAAI,UAAU;CACd,cAAc,WAAW;EACvB,UAAU;CACZ,CAAC;CAED,IAAI,eAAe,MAAM,oBAAoB,CAAC,CAAC,OAAO,UACpD,6BAAa,IAAI,MAAM,gDAAgD,OAAO,CAAC,CACjF;CACA,IAAI,CAAC,gBAAgB,SACnB;CAOF,OAAO,CAAC,qBAAqB,UAAU,GAAG;EACxC,OAAO;EACP,MAAM,IAAI,SAAe,YAAY,qBAAqB,cAAc,OAAO,CAAC;EAChF,IAAI,SACF;EAEF,eAAe,MAAM,oBAAoB,CAAC,CAAC,MAAM,YAAY;EAC7D,IAAI,CAAC,gBAAgB,SACnB;CAEJ;CAEA,sBAAsB,IAAI,oBAAoB,YAAY,GAAG,aAAa,CAAC,CAAC,QAAQ;CACpF,0BAA0B,YAAY;CACtC,0BAA0B;CAC1B,qBAAqB;CAGrB,oBAAA,gCAAkF,EAChF,SAAS,EAAE,UAAU,QAAQ,WAAW,YAAY,CAAC,EAAE,EACzD,CAAC;CAED,OAAO,oBAAoB;CAE3B,eAAe,sBAAsB;EACnC,IAAI,QAAsB,CAAC;EAC3B,MAAM,SAAS,iBAAiB,iBAAiB;GAC/C,MAAM,eAAe,kBAAkB,cAAc,aAAa;GAClE,QAAQ,cAAc,cAAc,aAAa;GACjD,OAAO;EACT,GAAG,YAAY;EACf,OAAO;CACT;CAEA,SAAS,4BAA4B;EACnC,MAAM,eAAe,SAAS,kBAAkB,WAAW,iBAAiB;GAC1E,0BAA0B,YAAY;GACtC,kBAAkB,YAAY;EAChC,CAAC;EACD,cAAc,WAAW,aAAa,YAAY,CAAC;CACrD;CAEA,SAAS,0BAA0B,OAAqB;EACtD,aAAa,mBAAmB;EAChC,MAAM,aAAa,cAAc,KAAK;EACtC,IAAI,YAAY;GACd,MAAM,QAAQ,aAAa,QAAQ;GACnC,sBAAsB,iBAAiB;IACrC,SACG,iBAAiB,UAAU;KAC1B,IAAI,wBAAwB,KAAK,GAAG;MAClC,MAAM,YAAY,uBAAuB,OAAO,aAAa;MAC7D,IAAI,CAAC,qBAAqB,UAAU,GAClC,OAAO,UAAU;MAGnB,OAAO;KACT;KAEA,OAAO;IACT,GAAG,iBAAiB,CAAC,CACpB,MAAM,YAAY;GACvB,GAAG,KAAK;EACV;CACF;CAEA,SAAS,uBAAuB;EAC9B,qBAAqB,WAAW,gBAAgB;GAC9C,IAAI,qBAAqB,UAAU,GAAG;IACpC,iBAAiB;IACjB,SACG,iBAAiB,UAAU,cAAc,OAAO,aAAa,GAAG,wBAAwB,CAAC,CACzF,MAAM,YAAY;GACvB,OACE,OAAO;EAEX,CAAC;EAED,IAAI,CAAC,qBAAqB;GACxB,oBAAoB;IAClB,IAAI,qBAAqB,UAAU,GACjC,uBAAuB;GAE3B,CAAC;GACD,sBAAsB;IACpB,IAAI,CAAC,gBACH,SAAS,iBAAiB,UAAU,WAAW,KAAK,GAAG,oBAAoB,CAAC,CAAC,MAAM,YAAY;GAEnG,CAAC;GACD,kBAAkB;IAChB,SACG,iBAAiB,UAAU,kBAAkB,OAAO,aAAa,GAAG,oBAAoB,CAAC,CACzF,MAAM,YAAY;GACvB,CAAC;EACH;CACF;CAEA,SAAS,sBAAsC;EAC7C,OAAO;GACL,cAAc,WAAW,YAAY,sBAAsB,KAAK,WAAW,OAAO;GAClF,qBAAqB,WAAW,EAAE,iBAAiB,OAAO,SAAS,4BAA4B,CAAC,MAAM;IACpG,MAAM,UAAU,sBAAsB,KAAK,WAAW,EAAE,eAAe,CAAC;IAExE,IAAI,CAAC,WAAW,QAAQ,OAAO,aAAa,CAAC,UAAU,QAAQ,IAAI,cAAc,iBAAiB,GAChG;IAGF,IAAI,QAAQ,IAAI,QAAQ,YAAY,QAClC;IAUF,IAAI,CAAC,kBAAkB,eAAe,SAAS,KAAK,sBAAsB,OAAO,GAC/E;IAGF,OAAO;GACT;GACA;GACA;GACA;GACA,qBAAqB,iBAAiB;IACpC,SAAS,iBAAiB,WAAW;KAAE,GAAG;KAAO,GAAG;IAAa,IAAI,aAAa,CAAC,CAAC,MAAM,YAAY;GACxG;EACF;CACF;CAEA,SAAS,kBAAkB,UAAwB;EACjD,MAAM,kBAAkB,sBAAsB,KAAK;EACnD,MAAM,aAAa,iBAAiB,OAAO,KAAA;EAC3C,MAAM,aAAa,SAAS,OAAO,KAAA;EACnC,MAAM,mBAAmB,cAAc,cAAc,gBAAgB,OAAO,SAAS;EAErF,IAAI,eAAe,CAAC,cAAc,mBAAmB;GAEnD,iBAAiB;GACjB,iBAAiB,OAAO;GACxB,sBAAsB,YAAY,oBAAoB,eAAe,CAAC,CAAC,QAAQ;EACjF;EAEA,IAAI,eAAe,CAAC,cAAc,mBAAmB;GACnD,IAAI,gBAEF;GAGF,sBAAsB,IAAI,oBAAoB,QAAQ,GAAG,YAAY,CAAC;GACtE,gBAAgB,OAAO;EACzB,OAAO,IAAI,cAAc,cAAc,CAAC,kBAItC,gBAAgB,iBAAiB,CAAC,CAAC,SAAS;CAEhD;CAMA,SAAS,wBAAwB;EAC/B,MAAM,UAAU,sBAAsB,KAAK;EAC3C,IAAI,WAAW,aAAa,KAAK,sBAAsB,OAAO,GAC5D,kBAAkB,uBAAuB,SAAS,aAAa,CAAC;CAEpE;CAEA,SAAS,SAAS;EAChB,oBAAoB;EAEpB,MAAM,eAAe,uBAAuB,sBAAsB,KAAK,GAAG,aAAa;EACvF,IAAI,CAAC,qBAAqB,UAAU,GAClC,OAAO,aAAa;EAEtB,kBAAkB,YAAY;EAE9B,SACG,iBAAiB,UAAU;GAC1B,MAAM,YAAY,uBAAuB,OAAO,aAAa;GAC7D,IAAI,CAAC,qBAAqB,UAAU,GAGlC,OAAO,UAAU;GAEnB,OAAO;EACT,GAAG,QAAQ,CAAC,CACX,MAAM,YAAY;CACvB;CAEA,SAAS,oBAAoB,cAA4C;EACvE,MAAM,YAAY,eAAe,YAAY,KAAK,aAAa;EAE/D,IAAI,CAAC,aAAa,IAChB,OAAO;GACL,IAAI;GACJ,gBAAgB;GAChB,aAAa,KAAA;GACb;EACF;EAGF,OAAO;GACL,IAAI,aAAa;GACjB,gBAAgB,CAAC,CAAC,aAAa;GAC/B,aAAa,aAAa;GAC1B;EACF;CACF;AACF;;;;;AAMA,SAAS,sBAAsB,SAAoC;CACjE,OAAQ,QAAQ,YAAY;AAC9B;;;;;;AAOA,SAAgB,oBAAoB,SAAkD;CACpF,MAAM,MAAM,UAAU;CACtB,IAAI,CAAC,SACH,OAAO;CAET,MAAM,cAAc,sBAAsB,OAAO;CACjD,OAAO,cAAc,IAAI,YAAY,kBAAkB,WAAW,IAAI;AACxE;AAEA,SAAS,eAAe,WAAgD;CACtE,OAAO,cAAc,KAAA,IAAY,aAAa,IAAI,YAAY,SAAS;AACzE;AAEA,SAAgB,0BAAmD;CAEjE,IAAI,iBAAiC;EACnC,IAFoB,aAEJ;EAChB,gBAAgB;EAChB,aAAa,KAAA;EACb,WAAW,aAAa;CAC1B;CACA,OAAO,QAAQ,QAAQ;EACrB,mBAAmB;EACnB,0BAA0B;EAC1B,iBAAiB,IAAI,WAAW;EAChC,kBAAkB,IAAI,WAAW;EACjC,QAAQ;EACR,qBAAqB,UAAU;GAC7B,iBAAiB;IACf,GAAG;IACH,GAAG;GACL;EACF;CACF,CAAC;AACH;AAEA,SAAgB,qBAAqB;CACnC,cAAc,SAAS,MAAM,EAAE,CAAC;CAChC,gBAAgB,CAAC;AACnB;AAEA,SAAS,cAAc,sBAAkC;CACvD,MAAM,EAAE,SAAS,kBACf,QACA;;;;;CAA6E,GAC7E,sBACA;EAAE,SAAS;EAAM,SAAS;CAAK,CACjC;CACA,cAAc,KAAK,IAAI;AACzB;AAEA,SAAS,gBAAgB,eAA2B;CAClD,MAAM,iCAAiC;EACrC,IAAI,SAAS,oBAAoB,WAC/B,cAAc;CAElB;CAEA,MAAM,EAAE,SAAS,iBAAiB,UAAA,oBAAuC,wBAAwB;CACjG,cAAc,KAAK,IAAI;CAEvB,MAAM,0BAA0B,YAAY,0BAA0B,sBAAsB;CAC5F,cAAc,WAAW;EACvB,cAAc,uBAAuB;CACvC,CAAC;AACH;AAEA,SAAS,YAAY,IAAgB;CACnC,MAAM,EAAE,SAAS,iBAAiB,QAAA,UAA0B,IAAI,EAAE,SAAS,KAAK,CAAC;CACjF,cAAc,KAAK,IAAI;AACzB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { generateUUID } from "../../tools/utils/stringUtils.mjs";
|
|
2
|
+
import { isEmptyObject } from "../../tools/utils/objectUtils.mjs";
|
|
3
|
+
import { objectEntries } from "../../tools/utils/polyfills.mjs";
|
|
4
|
+
import { SESSION_EXPIRATION_DELAY, SESSION_TIME_OUT_DELAY } from "./sessionConstants.mjs";
|
|
5
|
+
import { SESSION_ENTRY_REGEXP, isValidSessionString } from "./sessionStateValidation.mjs";
|
|
6
|
+
import { dateNow } from "@kubesense/kubesense-js-core/time";
|
|
7
|
+
function getCreatedDate(state) {
|
|
8
|
+
return state.created ? Number(state.created) : void 0;
|
|
9
|
+
}
|
|
10
|
+
function getExpireDate(state) {
|
|
11
|
+
const expireDate = state.expire && Number(state.expire);
|
|
12
|
+
const createdDate = getCreatedDate(state);
|
|
13
|
+
if (expireDate && createdDate) return Math.min(expireDate, createdDate + SESSION_TIME_OUT_DELAY);
|
|
14
|
+
}
|
|
15
|
+
function getExpiredSessionState(_previousSessionState, configuration) {
|
|
16
|
+
const expiredSessionState = { isExpired: "1" };
|
|
17
|
+
if (configuration.trackAnonymousUser) expiredSessionState.anonymousId = generateUUID();
|
|
18
|
+
return expiredSessionState;
|
|
19
|
+
}
|
|
20
|
+
function isSessionInNotStartedState(session) {
|
|
21
|
+
return isEmptyObject(session);
|
|
22
|
+
}
|
|
23
|
+
function isSessionInExpiredState(session) {
|
|
24
|
+
return session.isExpired !== void 0 || !isActiveSession(session);
|
|
25
|
+
}
|
|
26
|
+
function isActiveSession(sessionState) {
|
|
27
|
+
const expireDate = getExpireDate(sessionState);
|
|
28
|
+
return expireDate ? dateNow() < expireDate : false;
|
|
29
|
+
}
|
|
30
|
+
function expandSessionState(session) {
|
|
31
|
+
session.expire = String(dateNow() + SESSION_EXPIRATION_DELAY);
|
|
32
|
+
}
|
|
33
|
+
function toSessionString(session) {
|
|
34
|
+
return objectEntries(session).map(([key, value]) => key === "anonymousId" ? `aid=${value}` : `${key}=${value}`).join("&");
|
|
35
|
+
}
|
|
36
|
+
function toSessionState(sessionString) {
|
|
37
|
+
const session = {};
|
|
38
|
+
if (isValidSessionString(sessionString)) sessionString.split("&").forEach((entry) => {
|
|
39
|
+
const matches = SESSION_ENTRY_REGEXP.exec(entry);
|
|
40
|
+
if (matches !== null) {
|
|
41
|
+
const [, key, value] = matches;
|
|
42
|
+
if (key === "aid") session.anonymousId = value;
|
|
43
|
+
else session[key] = value;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return session;
|
|
47
|
+
}
|
|
48
|
+
function initializeSession(state, configuration) {
|
|
49
|
+
if (isSessionInNotStartedState(state)) {
|
|
50
|
+
if (configuration.trackAnonymousUser) state.anonymousId = generateUUID();
|
|
51
|
+
return getExpiredSessionState(state, configuration);
|
|
52
|
+
}
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
function expandOrRenew(state, configuration) {
|
|
56
|
+
if (isSessionInNotStartedState(state)) return state;
|
|
57
|
+
let newState = state;
|
|
58
|
+
if (isSessionInExpiredState(state)) newState = getExpiredSessionState(state, configuration);
|
|
59
|
+
if (!newState.id) {
|
|
60
|
+
newState.id = generateUUID();
|
|
61
|
+
newState.created = String(dateNow());
|
|
62
|
+
}
|
|
63
|
+
if (configuration.trackAnonymousUser && !newState.anonymousId) newState.anonymousId = generateUUID();
|
|
64
|
+
delete newState.isExpired;
|
|
65
|
+
expandSessionState(newState);
|
|
66
|
+
return newState;
|
|
67
|
+
}
|
|
68
|
+
function expandOnly(state) {
|
|
69
|
+
if (isSessionInExpiredState(state) || isSessionInNotStartedState(state) || !state.id) return state;
|
|
70
|
+
expandSessionState(state);
|
|
71
|
+
return state;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { expandOnly, expandOrRenew, expandSessionState, getCreatedDate, getExpireDate, getExpiredSessionState, initializeSession, isSessionInExpiredState, isSessionInNotStartedState, toSessionState, toSessionString };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=sessionState.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionState.mjs","names":[],"sources":["../../../src/domain/session/sessionState.ts"],"sourcesContent":["import { dateNow } from '@kubesense/kubesense-js-core/time'\nimport type { TimeStamp } from '@kubesense/kubesense-js-core/time'\nimport { isEmptyObject } from '../../tools/utils/objectUtils'\nimport { objectEntries } from '../../tools/utils/polyfills'\nimport { generateUUID } from '../../tools/utils/stringUtils'\nimport type { Configuration } from '../configuration'\nimport { SESSION_EXPIRATION_DELAY, SESSION_TIME_OUT_DELAY } from './sessionConstants'\nimport { isValidSessionString, SESSION_ENTRY_REGEXP, SESSION_ENTRY_SEPARATOR } from './sessionStateValidation'\nexport const EXPIRED = '1'\n\nexport interface SessionState {\n id?: string\n created?: string\n expire?: string\n isExpired?: typeof EXPIRED\n anonymousId?: string\n\n [key: string]: string | undefined\n}\n\nexport function getCreatedDate(state: SessionState): TimeStamp | undefined {\n return state.created ? (Number(state.created) as TimeStamp) : undefined\n}\n\nexport function getExpireDate(state: SessionState): TimeStamp | undefined {\n const expireDate = state.expire && (Number(state.expire) as TimeStamp)\n const createdDate = getCreatedDate(state)\n if (expireDate && createdDate) {\n return Math.min(expireDate, createdDate + SESSION_TIME_OUT_DELAY) as TimeStamp\n }\n}\n\nexport function getExpiredSessionState(\n // Kept for call-site symmetry with upstream: KubeSense regenerates the anonymous id rather than\n // carrying the previous one forward, so the previous state is not read here.\n _previousSessionState: { anonymousId?: string } | undefined,\n configuration: Configuration\n): SessionState {\n const expiredSessionState: SessionState = {\n isExpired: EXPIRED,\n }\n // KubeSense rotates the anonymous id with the session rather than carrying the previous one\n // forward, so a device is not linkable across sessions. The id is still stable for the whole\n // lifetime of a session, which is what anonymous-user attribution within a session needs.\n if (configuration.trackAnonymousUser) {\n expiredSessionState.anonymousId = generateUUID()\n }\n\n return expiredSessionState\n}\n\nexport function isSessionInNotStartedState(session: SessionState) {\n return isEmptyObject(session)\n}\n\nexport function isSessionStarted(session: SessionState) {\n return !isSessionInNotStartedState(session)\n}\n\nexport function isSessionInExpiredState(session: SessionState) {\n return session.isExpired !== undefined || !isActiveSession(session)\n}\n\n// An active session is a session in either `Tracked` or `NotTracked` state\nfunction isActiveSession(sessionState: SessionState) {\n const expireDate = getExpireDate(sessionState)\n return expireDate ? dateNow() < expireDate : false\n}\n\nexport function expandSessionState(session: SessionState) {\n session.expire = String(dateNow() + SESSION_EXPIRATION_DELAY)\n}\n\nexport function toSessionString(session: SessionState) {\n return (\n objectEntries(session)\n // we use `aid` as a key for anonymousId\n .map(([key, value]) => (key === 'anonymousId' ? `aid=${value}` : `${key}=${value}`))\n .join(SESSION_ENTRY_SEPARATOR)\n )\n}\n\nexport function toSessionState(sessionString: string | undefined | null) {\n const session: SessionState = {}\n if (isValidSessionString(sessionString)) {\n sessionString.split(SESSION_ENTRY_SEPARATOR).forEach((entry) => {\n const matches = SESSION_ENTRY_REGEXP.exec(entry)\n if (matches !== null) {\n const [, key, value] = matches\n if (key === 'aid') {\n // we use `aid` as a key for anonymousId\n session.anonymousId = value\n } else {\n session[key] = value\n }\n }\n })\n }\n return session\n}\n\nexport function initializeSession(state: SessionState, configuration: Configuration): SessionState {\n if (isSessionInNotStartedState(state)) {\n if (configuration.trackAnonymousUser) {\n state.anonymousId = generateUUID()\n }\n return getExpiredSessionState(state, configuration)\n }\n return state\n}\n\nexport function expandOrRenew(state: SessionState, configuration: Configuration): SessionState {\n // prevent renewing if state is altered by a 3rd party (e.g. adblocker deleting the cookie)\n if (isSessionInNotStartedState(state)) {\n return state\n }\n\n let newState = state\n\n if (isSessionInExpiredState(state)) {\n newState = getExpiredSessionState(state, configuration)\n }\n\n if (!newState.id) {\n newState.id = generateUUID()\n newState.created = String(dateNow())\n }\n if (configuration.trackAnonymousUser && !newState.anonymousId) {\n newState.anonymousId = generateUUID()\n }\n\n delete newState.isExpired\n expandSessionState(newState)\n\n return newState\n}\n\nexport function expandOnly(state: SessionState): SessionState {\n if (isSessionInExpiredState(state) || isSessionInNotStartedState(state) || !state.id) {\n return state\n }\n expandSessionState(state)\n return state\n}\n"],"mappings":";;;;;;AAoBA,SAAgB,eAAe,OAA4C;CACzE,OAAO,MAAM,UAAW,OAAO,MAAM,OAAO,IAAkB,KAAA;AAChE;AAEA,SAAgB,cAAc,OAA4C;CACxE,MAAM,aAAa,MAAM,UAAW,OAAO,MAAM,MAAM;CACvD,MAAM,cAAc,eAAe,KAAK;CACxC,IAAI,cAAc,aAChB,OAAO,KAAK,IAAI,YAAY,cAAc,sBAAsB;AAEpE;AAEA,SAAgB,uBAGd,uBACA,eACc;CACd,MAAM,sBAAoC,EACxC,WAAA,IACF;CAIA,IAAI,cAAc,oBAChB,oBAAoB,cAAc,aAAa;CAGjD,OAAO;AACT;AAEA,SAAgB,2BAA2B,SAAuB;CAChE,OAAO,cAAc,OAAO;AAC9B;AAMA,SAAgB,wBAAwB,SAAuB;CAC7D,OAAO,QAAQ,cAAc,KAAA,KAAa,CAAC,gBAAgB,OAAO;AACpE;AAGA,SAAS,gBAAgB,cAA4B;CACnD,MAAM,aAAa,cAAc,YAAY;CAC7C,OAAO,aAAa,QAAQ,IAAI,aAAa;AAC/C;AAEA,SAAgB,mBAAmB,SAAuB;CACxD,QAAQ,SAAS,OAAO,QAAQ,IAAI,wBAAwB;AAC9D;AAEA,SAAgB,gBAAgB,SAAuB;CACrD,OACE,cAAc,OAAO,CAAC,CAEnB,KAAK,CAAC,KAAK,WAAY,QAAQ,gBAAgB,OAAO,UAAU,GAAG,IAAI,GAAG,OAAQ,CAAC,CACnF,KAAA,GAA4B;AAEnC;AAEA,SAAgB,eAAe,eAA0C;CACvE,MAAM,UAAwB,CAAC;CAC/B,IAAI,qBAAqB,aAAa,GACpC,cAAc,MAAA,GAA6B,CAAC,CAAC,SAAS,UAAU;EAC9D,MAAM,UAAU,qBAAqB,KAAK,KAAK;EAC/C,IAAI,YAAY,MAAM;GACpB,MAAM,GAAG,KAAK,SAAS;GACvB,IAAI,QAAQ,OAEV,QAAQ,cAAc;QAEtB,QAAQ,OAAO;EAEnB;CACF,CAAC;CAEH,OAAO;AACT;AAEA,SAAgB,kBAAkB,OAAqB,eAA4C;CACjG,IAAI,2BAA2B,KAAK,GAAG;EACrC,IAAI,cAAc,oBAChB,MAAM,cAAc,aAAa;EAEnC,OAAO,uBAAuB,OAAO,aAAa;CACpD;CACA,OAAO;AACT;AAEA,SAAgB,cAAc,OAAqB,eAA4C;CAE7F,IAAI,2BAA2B,KAAK,GAClC,OAAO;CAGT,IAAI,WAAW;CAEf,IAAI,wBAAwB,KAAK,GAC/B,WAAW,uBAAuB,OAAO,aAAa;CAGxD,IAAI,CAAC,SAAS,IAAI;EAChB,SAAS,KAAK,aAAa;EAC3B,SAAS,UAAU,OAAO,QAAQ,CAAC;CACrC;CACA,IAAI,cAAc,sBAAsB,CAAC,SAAS,aAChD,SAAS,cAAc,aAAa;CAGtC,OAAO,SAAS;CAChB,mBAAmB,QAAQ;CAE3B,OAAO;AACT;AAEA,SAAgB,WAAW,OAAmC;CAC5D,IAAI,wBAAwB,KAAK,KAAK,2BAA2B,KAAK,KAAK,CAAC,MAAM,IAChF,OAAO;CAET,mBAAmB,KAAK;CACxB,OAAO;AACT"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/domain/session/sessionStateValidation.ts
|
|
2
|
+
const SESSION_ENTRY_REGEXP = /^([a-zA-Z]+)=([a-z0-9-]+)$/;
|
|
3
|
+
function isValidSessionString(sessionString) {
|
|
4
|
+
return !!sessionString && (sessionString.indexOf("&") !== -1 || SESSION_ENTRY_REGEXP.test(sessionString));
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { SESSION_ENTRY_REGEXP, isValidSessionString };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=sessionStateValidation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStateValidation.mjs","names":[],"sources":["../../../src/domain/session/sessionStateValidation.ts"],"sourcesContent":["export const SESSION_ENTRY_REGEXP = /^([a-zA-Z]+)=([a-z0-9-]+)$/\nexport const SESSION_ENTRY_SEPARATOR = '&'\n\nexport function isValidSessionString(sessionString: string | undefined | null): sessionString is string {\n return (\n !!sessionString &&\n (sessionString.indexOf(SESSION_ENTRY_SEPARATOR) !== -1 || SESSION_ENTRY_REGEXP.test(sessionString))\n )\n}\n"],"mappings":";AAAA,MAAa,uBAAuB;AAGpC,SAAgB,qBAAqB,eAAmE;CACtG,OACE,CAAC,CAAC,kBACD,cAAc,QAAA,GAA+B,MAAM,MAAM,qBAAqB,KAAK,aAAa;AAErG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { display } from "../../tools/display.mjs";
|
|
2
|
+
import { SessionPersistence } from "./sessionConstants.mjs";
|
|
3
|
+
import { initCookieStrategy, selectCookieStrategy } from "./storeStrategies/sessionInCookie.mjs";
|
|
4
|
+
import { initLocalStorageStrategy, selectLocalStorageStrategy } from "./storeStrategies/sessionInLocalStorage.mjs";
|
|
5
|
+
import { initMemorySessionStoreStrategy, selectMemorySessionStoreStrategy } from "./storeStrategies/sessionInMemory.mjs";
|
|
6
|
+
import { isWorkerEnvironment } from "@kubesense/kubesense-js-core/util";
|
|
7
|
+
//#region src/domain/session/sessionStore.ts
|
|
8
|
+
/**
|
|
9
|
+
* Selects the correct session store strategy type based on the configuration and storage
|
|
10
|
+
* availability. When an array is provided, tries each persistence type in order until one
|
|
11
|
+
* successfully initializes.
|
|
12
|
+
*/
|
|
13
|
+
async function selectSessionStoreStrategyType(configuration) {
|
|
14
|
+
const persistenceList = normalizePersistenceList(configuration.sessionPersistence);
|
|
15
|
+
for (const persistence of persistenceList) {
|
|
16
|
+
const strategyType = await selectStrategyForPersistence(persistence, configuration);
|
|
17
|
+
if (strategyType !== void 0) return strategyType;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function normalizePersistenceList(sessionPersistence) {
|
|
21
|
+
if (sessionPersistence !== void 0) return sessionPersistence;
|
|
22
|
+
if (isWorkerEnvironment) return [SessionPersistence.MEMORY];
|
|
23
|
+
return [SessionPersistence.COOKIE];
|
|
24
|
+
}
|
|
25
|
+
function selectStrategyForPersistence(persistence, configuration) {
|
|
26
|
+
switch (persistence) {
|
|
27
|
+
case SessionPersistence.COOKIE: return selectCookieStrategy(configuration);
|
|
28
|
+
case SessionPersistence.LOCAL_STORAGE: return selectLocalStorageStrategy();
|
|
29
|
+
case SessionPersistence.MEMORY: return selectMemorySessionStoreStrategy();
|
|
30
|
+
default:
|
|
31
|
+
display.error(`Invalid session persistence '${String(persistence)}'`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function getSessionStoreStrategy(sessionStoreStrategyType, configuration) {
|
|
36
|
+
switch (sessionStoreStrategyType.type) {
|
|
37
|
+
case SessionPersistence.COOKIE: return initCookieStrategy(sessionStoreStrategyType, configuration);
|
|
38
|
+
case SessionPersistence.LOCAL_STORAGE: return initLocalStorageStrategy();
|
|
39
|
+
case SessionPersistence.MEMORY: return initMemorySessionStoreStrategy();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { getSessionStoreStrategy, selectSessionStoreStrategyType };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=sessionStore.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.mjs","names":[],"sources":["../../../src/domain/session/sessionStore.ts"],"sourcesContent":["import { isWorkerEnvironment } from '@kubesense/kubesense-js-core/util'\nimport type { Configuration } from '../configuration'\nimport { display } from '../../tools/display'\nimport { SessionPersistence } from './sessionConstants'\nimport type { SessionStoreStrategy, SessionStoreStrategyType } from './storeStrategies/sessionStoreStrategy'\nimport { selectCookieStrategy, initCookieStrategy } from './storeStrategies/sessionInCookie'\nimport { selectLocalStorageStrategy, initLocalStorageStrategy } from './storeStrategies/sessionInLocalStorage'\nimport { selectMemorySessionStoreStrategy, initMemorySessionStoreStrategy } from './storeStrategies/sessionInMemory'\n\n/**\n * Selects the correct session store strategy type based on the configuration and storage\n * availability. When an array is provided, tries each persistence type in order until one\n * successfully initializes.\n */\nexport async function selectSessionStoreStrategyType(\n configuration: Configuration\n): Promise<SessionStoreStrategyType | undefined> {\n const persistenceList = normalizePersistenceList(configuration.sessionPersistence)\n\n for (const persistence of persistenceList) {\n const strategyType = await selectStrategyForPersistence(persistence, configuration)\n if (strategyType !== undefined) {\n return strategyType\n }\n }\n\n return undefined\n}\n\nfunction normalizePersistenceList(sessionPersistence: SessionPersistence[] | undefined): SessionPersistence[] {\n if (sessionPersistence !== undefined) {\n return sessionPersistence\n }\n\n // In worker environments, default to memory since cookie and localStorage are not available\n // TODO: make it work when we start using Cookie Store API\n // @see https://developer.mozilla.org/en-US/docs/Web/API/CookieStore\n if (isWorkerEnvironment) {\n return [SessionPersistence.MEMORY]\n }\n\n return [SessionPersistence.COOKIE]\n}\n\nfunction selectStrategyForPersistence(\n persistence: SessionPersistence,\n configuration: Configuration\n): Promise<SessionStoreStrategyType | undefined> | SessionStoreStrategyType | undefined {\n switch (persistence) {\n case SessionPersistence.COOKIE:\n return selectCookieStrategy(configuration)\n\n case SessionPersistence.LOCAL_STORAGE:\n return selectLocalStorageStrategy()\n\n case SessionPersistence.MEMORY:\n return selectMemorySessionStoreStrategy()\n\n default:\n display.error(`Invalid session persistence '${String(persistence)}'`)\n return undefined\n }\n}\n\nexport function getSessionStoreStrategy(\n sessionStoreStrategyType: SessionStoreStrategyType,\n configuration: Configuration\n): SessionStoreStrategy {\n switch (sessionStoreStrategyType.type) {\n case SessionPersistence.COOKIE:\n return initCookieStrategy(sessionStoreStrategyType, configuration)\n case SessionPersistence.LOCAL_STORAGE:\n return initLocalStorageStrategy()\n case SessionPersistence.MEMORY:\n return initMemorySessionStoreStrategy()\n }\n}\n"],"mappings":";;;;;;;;;;;;AAcA,eAAsB,+BACpB,eAC+C;CAC/C,MAAM,kBAAkB,yBAAyB,cAAc,kBAAkB;CAEjF,KAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,eAAe,MAAM,6BAA6B,aAAa,aAAa;EAClF,IAAI,iBAAiB,KAAA,GACnB,OAAO;CAEX;AAGF;AAEA,SAAS,yBAAyB,oBAA4E;CAC5G,IAAI,uBAAuB,KAAA,GACzB,OAAO;CAMT,IAAI,qBACF,OAAO,CAAC,mBAAmB,MAAM;CAGnC,OAAO,CAAC,mBAAmB,MAAM;AACnC;AAEA,SAAS,6BACP,aACA,eACsF;CACtF,QAAQ,aAAR;EACE,KAAK,mBAAmB,QACtB,OAAO,qBAAqB,aAAa;EAE3C,KAAK,mBAAmB,eACtB,OAAO,2BAA2B;EAEpC,KAAK,mBAAmB,QACtB,OAAO,iCAAiC;EAE1C;GACE,QAAQ,MAAM,gCAAgC,OAAO,WAAW,EAAE,EAAE;GACpE;CACJ;AACF;AAEA,SAAgB,wBACd,0BACA,eACsB;CACtB,QAAQ,yBAAyB,MAAjC;EACE,KAAK,mBAAmB,QACtB,OAAO,mBAAmB,0BAA0B,aAAa;EACnE,KAAK,mBAAmB,eACtB,OAAO,yBAAyB;EAClC,KAAK,mBAAmB,QACtB,OAAO,+BAA+B;CAC1C;AACF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Observable } from "../../../tools/observable.mjs";
|
|
2
|
+
import { buildCookieOptions, getCookies } from "../../../browser/cookie.mjs";
|
|
3
|
+
import { mockable } from "../../../tools/mockable.mjs";
|
|
4
|
+
import { isEmptyObject } from "../../../tools/utils/objectUtils.mjs";
|
|
5
|
+
import { SESSION_COOKIE_EXPIRATION_DELAY, SESSION_TIME_OUT_DELAY, SessionPersistence } from "../sessionConstants.mjs";
|
|
6
|
+
import { toSessionState, toSessionString } from "../sessionState.mjs";
|
|
7
|
+
import { areCookiesAuthorized, createCookieStoreAccess, createDocumentCookieAccess, isCookieStoreSupported } from "../../../browser/cookieAccess.mjs";
|
|
8
|
+
import { LEGACY_SESSION_STORE_KEY, SESSION_STORE_KEY } from "./sessionStoreStrategy.mjs";
|
|
9
|
+
import { monitorError } from "@kubesense/kubesense-js-core/monitor";
|
|
10
|
+
//#region src/domain/session/storeStrategies/sessionInCookie.ts
|
|
11
|
+
async function selectCookieStrategy(configuration) {
|
|
12
|
+
const cookieOptions = buildCookieOptions(configuration);
|
|
13
|
+
if (!cookieOptions) return;
|
|
14
|
+
if (isCookieStoreSupported() && await areCookiesAuthorized(createCookieStoreAccess, cookieOptions)) return {
|
|
15
|
+
type: SessionPersistence.COOKIE,
|
|
16
|
+
cookieOptions,
|
|
17
|
+
cookieApi: 1
|
|
18
|
+
};
|
|
19
|
+
if (await areCookiesAuthorized(createDocumentCookieAccess, cookieOptions)) return {
|
|
20
|
+
type: SessionPersistence.COOKIE,
|
|
21
|
+
cookieOptions,
|
|
22
|
+
cookieApi: 0
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
let pendingChain;
|
|
26
|
+
function initCookieStrategy(sessionStoreStrategyType, configuration) {
|
|
27
|
+
const { cookieOptions, cookieApi } = sessionStoreStrategyType;
|
|
28
|
+
const sessionObservable = new Observable();
|
|
29
|
+
const trackAnonymousUser = !!configuration.trackAnonymousUser;
|
|
30
|
+
const opts = encodeCookieOptions(cookieOptions);
|
|
31
|
+
const cookieAccess = mockable(createCookieAccess)(cookieApi, cookieOptions);
|
|
32
|
+
let isFirstCall = true;
|
|
33
|
+
cookieAccess.observable.subscribe(() => {
|
|
34
|
+
cookieAccess.getAll().then((cookieValues) => {
|
|
35
|
+
sessionObservable.notify(findMatchingSessionState(cookieValues, opts));
|
|
36
|
+
}).catch((error) => monitorError(/* @__PURE__ */ new Error(`Error while reading session cookies on change: ${error}`)));
|
|
37
|
+
});
|
|
38
|
+
function applyAndWrite(fn) {
|
|
39
|
+
return cookieAccess.getAllAndSet((cookieValues) => {
|
|
40
|
+
let currentState = findMatchingSessionState(cookieValues, opts);
|
|
41
|
+
if (isFirstCall && isEmptyObject(currentState)) currentState = findMatchingSessionState(getCookies(LEGACY_SESSION_STORE_KEY), opts);
|
|
42
|
+
isFirstCall = false;
|
|
43
|
+
return {
|
|
44
|
+
value: buildSessionString(fn(currentState), cookieOptions),
|
|
45
|
+
expireDelay: trackAnonymousUser ? SESSION_COOKIE_EXPIRATION_DELAY : SESSION_TIME_OUT_DELAY
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
async setSessionState(fn, _operation) {
|
|
51
|
+
if (typeof navigator !== "undefined" && navigator.locks) await navigator.locks.request(SESSION_STORE_KEY, () => applyAndWrite(fn)).catch((error) => {
|
|
52
|
+
if (isContextGoingAwayError(error)) return;
|
|
53
|
+
throw error;
|
|
54
|
+
});
|
|
55
|
+
else {
|
|
56
|
+
pendingChain = (pendingChain ?? Promise.resolve()).then(() => applyAndWrite(fn));
|
|
57
|
+
await pendingChain;
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
sessionObservable
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function isContextGoingAwayError(error) {
|
|
64
|
+
if (!(error instanceof Error)) return false;
|
|
65
|
+
return error.name === "AbortError" || error.message.includes("no longer runnable");
|
|
66
|
+
}
|
|
67
|
+
function createCookieAccess(cookieApi, cookieOptions) {
|
|
68
|
+
return cookieApi === 1 ? createCookieStoreAccess(SESSION_STORE_KEY, cookieOptions) : createDocumentCookieAccess(SESSION_STORE_KEY, cookieOptions);
|
|
69
|
+
}
|
|
70
|
+
function findMatchingSessionState(items, opts) {
|
|
71
|
+
let sessionState;
|
|
72
|
+
for (const item of items.slice().reverse()) {
|
|
73
|
+
sessionState = toSessionState(item);
|
|
74
|
+
if (sessionState.c === opts) break;
|
|
75
|
+
}
|
|
76
|
+
delete sessionState?.c;
|
|
77
|
+
return sessionState ?? {};
|
|
78
|
+
}
|
|
79
|
+
function buildSessionString(sessionState, cookieOptions) {
|
|
80
|
+
return toSessionString(isEmptyObject(sessionState) ? sessionState : {
|
|
81
|
+
...sessionState,
|
|
82
|
+
c: encodeCookieOptions(cookieOptions)
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function encodeCookieOptions(cookieOptions) {
|
|
86
|
+
const domainCount = cookieOptions.domain ? cookieOptions.domain.split(".").length - 1 : 0;
|
|
87
|
+
let byte = 0;
|
|
88
|
+
byte |= 0;
|
|
89
|
+
byte |= domainCount << 1;
|
|
90
|
+
byte |= cookieOptions.crossSite ? 1 : 0;
|
|
91
|
+
return byte.toString(16);
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { createCookieAccess, initCookieStrategy, selectCookieStrategy };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=sessionInCookie.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionInCookie.mjs","names":[],"sources":["../../../../src/domain/session/storeStrategies/sessionInCookie.ts"],"sourcesContent":["import { monitorError } from '@kubesense/kubesense-js-core/monitor'\nimport { isEmptyObject } from '../../../tools/utils/objectUtils'\nimport type { CookieOptions } from '../../../browser/cookie'\nimport { getCookies } from '../../../browser/cookie'\nimport type { Configuration } from '../../configuration'\nimport { buildCookieOptions } from '../../configuration'\nimport { SESSION_COOKIE_EXPIRATION_DELAY, SESSION_TIME_OUT_DELAY, SessionPersistence } from '../sessionConstants'\nimport type { SessionState } from '../sessionState'\nimport { toSessionString, toSessionState } from '../sessionState'\nimport { Observable } from '../../../tools/observable'\nimport { mockable } from '../../../tools/mockable'\nimport type { CookieAccess } from '../../../browser/cookieAccess'\nimport {\n areCookiesAuthorized,\n createCookieStoreAccess,\n createDocumentCookieAccess,\n isCookieStoreSupported,\n} from '../../../browser/cookieAccess'\nimport { CookieApi, LEGACY_SESSION_STORE_KEY, SESSION_STORE_KEY } from './sessionStoreStrategy'\nimport type {\n SessionStoreStrategy,\n SessionStoreStrategyType,\n CookieSessionStoreStrategyType,\n SessionStateOperation,\n} from './sessionStoreStrategy'\n\nconst SESSION_COOKIE_VERSION = 0\n\nexport async function selectCookieStrategy(\n configuration: Configuration\n): Promise<SessionStoreStrategyType | undefined> {\n const cookieOptions = buildCookieOptions(configuration)\n if (!cookieOptions) {\n return undefined\n }\n\n if (isCookieStoreSupported() && (await areCookiesAuthorized(createCookieStoreAccess, cookieOptions))) {\n return { type: SessionPersistence.COOKIE, cookieOptions, cookieApi: CookieApi.COOKIE_STORE }\n }\n\n if (await areCookiesAuthorized(createDocumentCookieAccess, cookieOptions)) {\n return { type: SessionPersistence.COOKIE, cookieOptions, cookieApi: CookieApi.DOCUMENT_COOKIE }\n }\n\n return undefined\n}\n\n// Promise chain serializes calls when Web Locks are unavailable\nlet pendingChain: Promise<void> | undefined\n\nexport function initCookieStrategy(\n sessionStoreStrategyType: CookieSessionStoreStrategyType,\n configuration: Configuration\n): SessionStoreStrategy {\n const { cookieOptions, cookieApi } = sessionStoreStrategyType\n const sessionObservable = new Observable<SessionState>()\n const trackAnonymousUser = !!configuration.trackAnonymousUser\n const opts = encodeCookieOptions(cookieOptions)\n const cookieAccess = mockable(createCookieAccess)(cookieApi, cookieOptions)\n let isFirstCall = true\n\n cookieAccess.observable.subscribe(() => {\n cookieAccess\n .getAll()\n .then((cookieValues) => {\n sessionObservable.notify(findMatchingSessionState(cookieValues, opts))\n })\n .catch((error) => monitorError(new Error(`Error while reading session cookies on change: ${error}`)))\n })\n\n function applyAndWrite(fn: (state: SessionState) => SessionState) {\n return cookieAccess.getAllAndSet((cookieValues) => {\n let currentState = findMatchingSessionState(cookieValues, opts)\n\n if (isFirstCall && isEmptyObject(currentState)) {\n currentState = findMatchingSessionState(getCookies(LEGACY_SESSION_STORE_KEY), opts)\n }\n isFirstCall = false\n\n const newState = fn(currentState)\n const sessionString = buildSessionString(newState, cookieOptions)\n const expireDelay = trackAnonymousUser ? SESSION_COOKIE_EXPIRATION_DELAY : SESSION_TIME_OUT_DELAY\n\n return { value: sessionString, expireDelay }\n })\n }\n\n return {\n async setSessionState(\n fn: (sessionState: SessionState) => SessionState,\n _operation: SessionStateOperation\n ): Promise<void> {\n if (typeof navigator !== 'undefined' && navigator.locks) {\n await navigator.locks\n .request(SESSION_STORE_KEY, () => applyAndWrite(fn))\n .catch((error: unknown) => {\n if (isContextGoingAwayError(error)) {\n return\n }\n throw error\n })\n } else {\n pendingChain = (pendingChain ?? Promise.resolve()).then(() => applyAndWrite(fn))\n await pendingChain\n }\n },\n sessionObservable,\n }\n}\n\n// Thrown when the browsing context tears down mid-lock-request.\n// - \"AbortError: Promise was rejected because the browsing context is going away\" (Webkit)\n// - \"Error: Failed to execute 'request' on 'LockManager': The provided callback is no longer runnable.\" (Chromium)\nfunction isContextGoingAwayError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false\n }\n return error.name === 'AbortError' || error.message.includes('no longer runnable')\n}\n\nexport function createCookieAccess(cookieApi: CookieApi, cookieOptions: CookieOptions): CookieAccess {\n return cookieApi === CookieApi.COOKIE_STORE\n ? createCookieStoreAccess(SESSION_STORE_KEY, cookieOptions)\n : createDocumentCookieAccess(SESSION_STORE_KEY, cookieOptions)\n}\n\nfunction findMatchingSessionState(items: string[], opts: string): SessionState {\n let sessionState: SessionState | undefined\n\n // reverse the cookies so that if there is no match, the cookie returned is the first one\n for (const item of items.slice().reverse()) {\n sessionState = toSessionState(item)\n if (sessionState.c === opts) {\n break\n }\n }\n\n // remove the cookie options from the session state as this is not part of the session state\n delete sessionState?.c\n\n return sessionState ?? {}\n}\n\nfunction buildSessionString(sessionState: SessionState, cookieOptions: CookieOptions): string {\n return toSessionString(\n isEmptyObject(sessionState) ? sessionState : { ...sessionState, c: encodeCookieOptions(cookieOptions) }\n )\n}\n\nfunction encodeCookieOptions(cookieOptions: CookieOptions): string {\n const domainCount = cookieOptions.domain ? cookieOptions.domain.split('.').length - 1 : 0\n\n /* eslint-disable no-bitwise */\n let byte = 0\n byte |= SESSION_COOKIE_VERSION << 5 // Store version in upper 3 bits\n byte |= domainCount << 1 // Store domain count in next 4 bits\n byte |= cookieOptions.crossSite ? 1 : 0 // Store useCrossSiteScripting in next bit\n /* eslint-enable no-bitwise */\n\n return byte.toString(16) // Convert to hex string\n}\n"],"mappings":";;;;;;;;;;AA4BA,eAAsB,qBACpB,eAC+C;CAC/C,MAAM,gBAAgB,mBAAmB,aAAa;CACtD,IAAI,CAAC,eACH;CAGF,IAAI,uBAAuB,KAAM,MAAM,qBAAqB,yBAAyB,aAAa,GAChG,OAAO;EAAE,MAAM,mBAAmB;EAAQ;EAAe,WAAA;CAAkC;CAG7F,IAAI,MAAM,qBAAqB,4BAA4B,aAAa,GACtE,OAAO;EAAE,MAAM,mBAAmB;EAAQ;EAAe,WAAA;CAAqC;AAIlG;AAGA,IAAI;AAEJ,SAAgB,mBACd,0BACA,eACsB;CACtB,MAAM,EAAE,eAAe,cAAc;CACrC,MAAM,oBAAoB,IAAI,WAAyB;CACvD,MAAM,qBAAqB,CAAC,CAAC,cAAc;CAC3C,MAAM,OAAO,oBAAoB,aAAa;CAC9C,MAAM,eAAe,SAAS,kBAAkB,CAAC,CAAC,WAAW,aAAa;CAC1E,IAAI,cAAc;CAElB,aAAa,WAAW,gBAAgB;EACtC,aACG,OAAO,CAAC,CACR,MAAM,iBAAiB;GACtB,kBAAkB,OAAO,yBAAyB,cAAc,IAAI,CAAC;EACvE,CAAC,CAAC,CACD,OAAO,UAAU,6BAAa,IAAI,MAAM,kDAAkD,OAAO,CAAC,CAAC;CACxG,CAAC;CAED,SAAS,cAAc,IAA2C;EAChE,OAAO,aAAa,cAAc,iBAAiB;GACjD,IAAI,eAAe,yBAAyB,cAAc,IAAI;GAE9D,IAAI,eAAe,cAAc,YAAY,GAC3C,eAAe,yBAAyB,WAAW,wBAAwB,GAAG,IAAI;GAEpF,cAAc;GAMd,OAAO;IAAE,OAHa,mBADL,GAAG,YAC4B,GAAG,aAGvB;IAAG,aAFX,qBAAqB,kCAAkC;GAEhC;EAC7C,CAAC;CACH;CAEA,OAAO;EACL,MAAM,gBACJ,IACA,YACe;GACf,IAAI,OAAO,cAAc,eAAe,UAAU,OAChD,MAAM,UAAU,MACb,QAAQ,yBAAyB,cAAc,EAAE,CAAC,CAAC,CACnD,OAAO,UAAmB;IACzB,IAAI,wBAAwB,KAAK,GAC/B;IAEF,MAAM;GACR,CAAC;QACE;IACL,gBAAgB,gBAAgB,QAAQ,QAAQ,EAAA,CAAG,WAAW,cAAc,EAAE,CAAC;IAC/E,MAAM;GACR;EACF;EACA;CACF;AACF;AAKA,SAAS,wBAAwB,OAAyB;CACxD,IAAI,EAAE,iBAAiB,QACrB,OAAO;CAET,OAAO,MAAM,SAAS,gBAAgB,MAAM,QAAQ,SAAS,oBAAoB;AACnF;AAEA,SAAgB,mBAAmB,WAAsB,eAA4C;CACnG,OAAO,cAAA,IACH,wBAAwB,mBAAmB,aAAa,IACxD,2BAA2B,mBAAmB,aAAa;AACjE;AAEA,SAAS,yBAAyB,OAAiB,MAA4B;CAC7E,IAAI;CAGJ,KAAK,MAAM,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,GAAG;EAC1C,eAAe,eAAe,IAAI;EAClC,IAAI,aAAa,MAAM,MACrB;CAEJ;CAGA,OAAO,cAAc;CAErB,OAAO,gBAAgB,CAAC;AAC1B;AAEA,SAAS,mBAAmB,cAA4B,eAAsC;CAC5F,OAAO,gBACL,cAAc,YAAY,IAAI,eAAe;EAAE,GAAG;EAAc,GAAG,oBAAoB,aAAa;CAAE,CACxG;AACF;AAEA,SAAS,oBAAoB,eAAsC;CACjE,MAAM,cAAc,cAAc,SAAS,cAAc,OAAO,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI;CAGxF,IAAI,OAAO;CACX,QAAQ;CACR,QAAQ,eAAe;CACvB,QAAQ,cAAc,YAAY,IAAI;CAGtC,OAAO,KAAK,SAAS,EAAE;AACzB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Observable } from "../../../tools/observable.mjs";
|
|
2
|
+
import { generateUUID } from "../../../tools/utils/stringUtils.mjs";
|
|
3
|
+
import { addEventListener } from "../../../browser/addEventListener.mjs";
|
|
4
|
+
import { SessionPersistence } from "../sessionConstants.mjs";
|
|
5
|
+
import { isSessionInNotStartedState, toSessionState, toSessionString } from "../sessionState.mjs";
|
|
6
|
+
import { LEGACY_SESSION_STORE_KEY, SESSION_STORE_KEY } from "./sessionStoreStrategy.mjs";
|
|
7
|
+
//#region src/domain/session/storeStrategies/sessionInLocalStorage.ts
|
|
8
|
+
const LOCAL_STORAGE_TEST_KEY = "_kubesense_test_";
|
|
9
|
+
function selectLocalStorageStrategy() {
|
|
10
|
+
try {
|
|
11
|
+
const id = generateUUID();
|
|
12
|
+
const testKey = `${LOCAL_STORAGE_TEST_KEY}${id}`;
|
|
13
|
+
localStorage.setItem(testKey, id);
|
|
14
|
+
const retrievedId = localStorage.getItem(testKey);
|
|
15
|
+
localStorage.removeItem(testKey);
|
|
16
|
+
return id === retrievedId ? { type: SessionPersistence.LOCAL_STORAGE } : void 0;
|
|
17
|
+
} catch {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function initLocalStorageStrategy() {
|
|
22
|
+
const sessionObservable = new Observable((observable) => addEventListener(window, "storage", (event) => {
|
|
23
|
+
if (event.key === "_kubesense_s_v2" && event.storageArea === localStorage) observable.notify(toSessionState(event.newValue));
|
|
24
|
+
}).stop);
|
|
25
|
+
let isFirstCall = true;
|
|
26
|
+
return {
|
|
27
|
+
async setSessionState(fn, _operation) {
|
|
28
|
+
let currentState = toSessionState(localStorage.getItem(SESSION_STORE_KEY));
|
|
29
|
+
if (isFirstCall && isSessionInNotStartedState(currentState)) currentState = toSessionState(localStorage.getItem(LEGACY_SESSION_STORE_KEY));
|
|
30
|
+
isFirstCall = false;
|
|
31
|
+
const newState = fn(currentState);
|
|
32
|
+
localStorage.setItem(SESSION_STORE_KEY, toSessionString(newState));
|
|
33
|
+
await Promise.resolve();
|
|
34
|
+
sessionObservable.notify(newState);
|
|
35
|
+
},
|
|
36
|
+
sessionObservable
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { initLocalStorageStrategy, selectLocalStorageStrategy };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=sessionInLocalStorage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionInLocalStorage.mjs","names":[],"sources":["../../../../src/domain/session/storeStrategies/sessionInLocalStorage.ts"],"sourcesContent":["import { generateUUID } from '../../../tools/utils/stringUtils'\nimport { Observable } from '../../../tools/observable'\nimport { addEventListener } from '../../../browser/addEventListener'\nimport { SessionPersistence } from '../sessionConstants'\nimport type { SessionState } from '../sessionState'\nimport { isSessionInNotStartedState, toSessionString, toSessionState } from '../sessionState'\nimport type { SessionStateOperation, SessionStoreStrategy, SessionStoreStrategyType } from './sessionStoreStrategy'\nimport { SESSION_STORE_KEY, LEGACY_SESSION_STORE_KEY } from './sessionStoreStrategy'\n\nconst LOCAL_STORAGE_TEST_KEY = '_kubesense_test_'\n\nexport function selectLocalStorageStrategy(): SessionStoreStrategyType | undefined {\n try {\n const id = generateUUID()\n const testKey = `${LOCAL_STORAGE_TEST_KEY}${id}`\n localStorage.setItem(testKey, id)\n const retrievedId = localStorage.getItem(testKey)\n localStorage.removeItem(testKey)\n return id === retrievedId ? { type: SessionPersistence.LOCAL_STORAGE } : undefined\n } catch {\n return undefined\n }\n}\n\nexport function initLocalStorageStrategy(): SessionStoreStrategy {\n const sessionObservable = new Observable<SessionState>(\n (observable) =>\n addEventListener(window, 'storage', (event) => {\n if (event.key === SESSION_STORE_KEY && event.storageArea === localStorage) {\n observable.notify(toSessionState(event.newValue))\n }\n }).stop\n )\n\n let isFirstCall = true\n\n return {\n async setSessionState(\n fn: (sessionState: SessionState) => SessionState,\n _operation: SessionStateOperation\n ): Promise<void> {\n let currentState = toSessionState(localStorage.getItem(SESSION_STORE_KEY))\n\n if (isFirstCall && isSessionInNotStartedState(currentState)) {\n currentState = toSessionState(localStorage.getItem(LEGACY_SESSION_STORE_KEY))\n }\n isFirstCall = false\n\n const newState = fn(currentState)\n localStorage.setItem(SESSION_STORE_KEY, toSessionString(newState))\n await Promise.resolve()\n sessionObservable.notify(newState)\n },\n sessionObservable,\n }\n}\n"],"mappings":";;;;;;;AASA,MAAM,yBAAyB;AAE/B,SAAgB,6BAAmE;CACjF,IAAI;EACF,MAAM,KAAK,aAAa;EACxB,MAAM,UAAU,GAAG,yBAAyB;EAC5C,aAAa,QAAQ,SAAS,EAAE;EAChC,MAAM,cAAc,aAAa,QAAQ,OAAO;EAChD,aAAa,WAAW,OAAO;EAC/B,OAAO,OAAO,cAAc,EAAE,MAAM,mBAAmB,cAAc,IAAI,KAAA;CAC3E,QAAQ;EACN;CACF;AACF;AAEA,SAAgB,2BAAiD;CAC/D,MAAM,oBAAoB,IAAI,YAC3B,eACC,iBAAiB,QAAQ,YAAY,UAAU;EAC7C,IAAI,MAAM,QAAA,qBAA6B,MAAM,gBAAgB,cAC3D,WAAW,OAAO,eAAe,MAAM,QAAQ,CAAC;CAEpD,CAAC,CAAC,CAAC,IACP;CAEA,IAAI,cAAc;CAElB,OAAO;EACL,MAAM,gBACJ,IACA,YACe;GACf,IAAI,eAAe,eAAe,aAAa,QAAQ,iBAAiB,CAAC;GAEzE,IAAI,eAAe,2BAA2B,YAAY,GACxD,eAAe,eAAe,aAAa,QAAQ,wBAAwB,CAAC;GAE9E,cAAc;GAEd,MAAM,WAAW,GAAG,YAAY;GAChC,aAAa,QAAQ,mBAAmB,gBAAgB,QAAQ,CAAC;GACjE,MAAM,QAAQ,QAAQ;GACtB,kBAAkB,OAAO,QAAQ;EACnC;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Observable } from "../../../tools/observable.mjs";
|
|
2
|
+
import { shallowClone } from "../../../tools/utils/objectUtils.mjs";
|
|
3
|
+
import { SessionPersistence } from "../sessionConstants.mjs";
|
|
4
|
+
import { globalObject } from "@kubesense/kubesense-js-core/util";
|
|
5
|
+
//#region src/domain/session/storeStrategies/sessionInMemory.ts
|
|
6
|
+
const MEMORY_SESSION_STORE_KEY = "_KUBESENSE_SESSION";
|
|
7
|
+
function selectMemorySessionStoreStrategy() {
|
|
8
|
+
return { type: SessionPersistence.MEMORY };
|
|
9
|
+
}
|
|
10
|
+
function initMemorySessionStoreStrategy() {
|
|
11
|
+
const globalObjectWithSession = globalObject;
|
|
12
|
+
if (!globalObjectWithSession["_KUBESENSE_SESSION"]) globalObjectWithSession[MEMORY_SESSION_STORE_KEY] = {};
|
|
13
|
+
const memorySession = globalObjectWithSession[MEMORY_SESSION_STORE_KEY];
|
|
14
|
+
const sessionObservable = new Observable();
|
|
15
|
+
const previousOnChange = memorySession.onChange;
|
|
16
|
+
memorySession.onChange = (state) => {
|
|
17
|
+
previousOnChange?.(state);
|
|
18
|
+
sessionObservable.notify(state);
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
async setSessionState(fn, _operation) {
|
|
22
|
+
const currentState = memorySession.state ?? {};
|
|
23
|
+
const newState = shallowClone(fn(currentState));
|
|
24
|
+
memorySession.state = newState;
|
|
25
|
+
await Promise.resolve();
|
|
26
|
+
memorySession.onChange?.(newState);
|
|
27
|
+
},
|
|
28
|
+
sessionObservable
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { MEMORY_SESSION_STORE_KEY, initMemorySessionStoreStrategy, selectMemorySessionStoreStrategy };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=sessionInMemory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionInMemory.mjs","names":[],"sources":["../../../../src/domain/session/storeStrategies/sessionInMemory.ts"],"sourcesContent":["import { globalObject } from '@kubesense/kubesense-js-core/util'\nimport { Observable } from '../../../tools/observable'\nimport { shallowClone } from '../../../tools/utils/objectUtils'\nimport { SessionPersistence } from '../sessionConstants'\nimport type { SessionState } from '../sessionState'\nimport type { SessionStateOperation, SessionStoreStrategy, SessionStoreStrategyType } from './sessionStoreStrategy'\n\nexport const MEMORY_SESSION_STORE_KEY = '_KUBESENSE_SESSION'\n\nexport interface MemorySession {\n state?: SessionState\n onChange?: (state: SessionState) => void\n}\n\nexport interface GlobalObjectWithSession {\n [MEMORY_SESSION_STORE_KEY]?: MemorySession\n}\n\nexport function selectMemorySessionStoreStrategy(): SessionStoreStrategyType {\n return { type: SessionPersistence.MEMORY }\n}\n\nexport function initMemorySessionStoreStrategy(): SessionStoreStrategy {\n const globalObjectWithSession = globalObject as GlobalObjectWithSession\n\n // Share the observable across SDK instances (RUM + Logs)\n if (!globalObjectWithSession[MEMORY_SESSION_STORE_KEY]) {\n globalObjectWithSession[MEMORY_SESSION_STORE_KEY] = {}\n }\n const memorySession = globalObjectWithSession[MEMORY_SESSION_STORE_KEY]\n\n const sessionObservable = new Observable<SessionState>()\n\n // Wire the local observable to the shared onChange callback so that\n // multiple SDK instances (RUM + Logs) can observe each other's changes.\n const previousOnChange = memorySession.onChange\n memorySession.onChange = (state: SessionState) => {\n previousOnChange?.(state)\n sessionObservable.notify(state)\n }\n\n return {\n async setSessionState(\n fn: (sessionState: SessionState) => SessionState,\n _operation: SessionStateOperation\n ): Promise<void> {\n const currentState = memorySession.state ?? {}\n const newState = shallowClone(fn(currentState))\n memorySession.state = newState\n await Promise.resolve()\n memorySession.onChange?.(newState)\n },\n sessionObservable,\n }\n}\n"],"mappings":";;;;;AAOA,MAAa,2BAA2B;AAWxC,SAAgB,mCAA6D;CAC3E,OAAO,EAAE,MAAM,mBAAmB,OAAO;AAC3C;AAEA,SAAgB,iCAAuD;CACrE,MAAM,0BAA0B;CAGhC,IAAI,CAAC,wBAAA,uBACH,wBAAwB,4BAA4B,CAAC;CAEvD,MAAM,gBAAgB,wBAAwB;CAE9C,MAAM,oBAAoB,IAAI,WAAyB;CAIvD,MAAM,mBAAmB,cAAc;CACvC,cAAc,YAAY,UAAwB;EAChD,mBAAmB,KAAK;EACxB,kBAAkB,OAAO,KAAK;CAChC;CAEA,OAAO;EACL,MAAM,gBACJ,IACA,YACe;GACf,MAAM,eAAe,cAAc,SAAS,CAAC;GAC7C,MAAM,WAAW,aAAa,GAAG,YAAY,CAAC;GAC9C,cAAc,QAAQ;GACtB,MAAM,QAAQ,QAAQ;GACtB,cAAc,WAAW,QAAQ;EACnC;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region src/domain/session/storeStrategies/sessionStoreStrategy.ts
|
|
2
|
+
const SESSION_STORE_KEY = "_kubesense_s_v2";
|
|
3
|
+
const LEGACY_SESSION_STORE_KEY = "_kubesense_s";
|
|
4
|
+
//#endregion
|
|
5
|
+
export { LEGACY_SESSION_STORE_KEY, SESSION_STORE_KEY };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=sessionStoreStrategy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStoreStrategy.mjs","names":[],"sources":["../../../../src/domain/session/storeStrategies/sessionStoreStrategy.ts"],"sourcesContent":["import type { CookieOptions } from '../../../browser/cookie'\nimport type { SessionPersistence } from '../sessionConstants'\nimport type { SessionState } from '../sessionState'\nimport type { Observable } from '../../../tools/observable'\n\nexport const SESSION_STORE_KEY = '_kubesense_s_v2'\nexport const LEGACY_SESSION_STORE_KEY = '_kubesense_s'\n\nexport const enum CookieApi {\n DOCUMENT_COOKIE,\n COOKIE_STORE,\n}\n\nexport interface CookieSessionStoreStrategyType {\n type: typeof SessionPersistence.COOKIE\n cookieOptions: CookieOptions\n cookieApi: CookieApi\n}\n\nexport type SessionStoreStrategyType =\n | CookieSessionStoreStrategyType\n | { type: typeof SessionPersistence.LOCAL_STORAGE }\n | { type: typeof SessionPersistence.MEMORY }\n\nexport type SessionStateOperation =\n | 'initialize'\n | 'expandOrRenewOnActivity'\n | 'expandOrRenewOnConsent'\n | 'expandOnVisibility'\n | 'initializeOnResume'\n | 'expireOnTimeout'\n | 'expire'\n | 'updateState'\n\nexport interface SessionStoreStrategy {\n setSessionState(fn: (sessionState: SessionState) => SessionState, operation: SessionStateOperation): Promise<void>\n sessionObservable: Observable<SessionState>\n}\n"],"mappings":";AAKA,MAAa,oBAAoB;AACjC,MAAa,2BAA2B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { computeStackTrace } from "../tools/stackTrace/computeStackTrace.mjs";
|
|
2
|
+
import { addTelemetryUsage } from "./telemetry/telemetry.mjs";
|
|
3
|
+
import { globalObject } from "@kubesense/kubesense-js-core/util";
|
|
4
|
+
//#region src/domain/sourceCodeContext.ts
|
|
5
|
+
const contextByUrl = /* @__PURE__ */ new Map();
|
|
6
|
+
const processedStacks = /* @__PURE__ */ new Set();
|
|
7
|
+
let hasFiredTelemetry = false;
|
|
8
|
+
function syncSourceCodeContext() {
|
|
9
|
+
const sourceCodeContext = globalObject.window?.KUBESENSE_SOURCE_CODE_CONTEXT;
|
|
10
|
+
if (!sourceCodeContext) return;
|
|
11
|
+
let useDebugId = false;
|
|
12
|
+
let useService = false;
|
|
13
|
+
let useVersion = false;
|
|
14
|
+
for (const [stack, entry] of Object.entries(sourceCodeContext)) {
|
|
15
|
+
useDebugId = useDebugId || entry.ddDebugId !== void 0;
|
|
16
|
+
useService = useService || entry.service !== void 0;
|
|
17
|
+
useVersion = useVersion || entry.version !== void 0;
|
|
18
|
+
if (processedStacks.has(stack)) continue;
|
|
19
|
+
processedStacks.add(stack);
|
|
20
|
+
const url = computeStackTrace({ stack }).stack[0]?.url;
|
|
21
|
+
if (url && !contextByUrl.has(url)) contextByUrl.set(url, entry);
|
|
22
|
+
}
|
|
23
|
+
if (!hasFiredTelemetry) {
|
|
24
|
+
hasFiredTelemetry = true;
|
|
25
|
+
addTelemetryUsage({
|
|
26
|
+
feature: "source-code-context",
|
|
27
|
+
use_debug_id: useDebugId,
|
|
28
|
+
use_service: useService,
|
|
29
|
+
use_version: useVersion
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function buildDebugIdByUrl(urls) {
|
|
34
|
+
syncSourceCodeContext();
|
|
35
|
+
const seenUrls = /* @__PURE__ */ new Set();
|
|
36
|
+
const debugIds = [];
|
|
37
|
+
for (const url of urls) {
|
|
38
|
+
if (seenUrls.has(url)) continue;
|
|
39
|
+
seenUrls.add(url);
|
|
40
|
+
const debugId = contextByUrl.get(url)?.ddDebugId;
|
|
41
|
+
if (debugId !== void 0) debugIds.push({
|
|
42
|
+
url,
|
|
43
|
+
id: debugId
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return debugIds.length ? debugIds : void 0;
|
|
47
|
+
}
|
|
48
|
+
function getSourceCodeContext(url) {
|
|
49
|
+
syncSourceCodeContext();
|
|
50
|
+
return contextByUrl.get(url);
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { buildDebugIdByUrl, getSourceCodeContext };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=sourceCodeContext.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceCodeContext.mjs","names":[],"sources":["../../src/domain/sourceCodeContext.ts"],"sourcesContent":["import { globalObject } from '@kubesense/kubesense-js-core/util'\nimport { computeStackTrace } from '../tools/stackTrace/computeStackTrace'\nimport { addTelemetryUsage } from './telemetry'\n\n/**\n * Entry of the `KUBESENSE_SOURCE_CODE_CONTEXT` map injected at build time. Depending on the build plugin\n * configuration, an entry can hold:\n * - service/version only (source code attribution),\n * - a debug ID only (sourcemap resolution),\n * - or both.\n */\nexport interface SourceCodeContextEntry {\n service?: string\n version?: string\n ddDebugId?: string\n}\n\nexport interface BrowserWindow {\n KUBESENSE_SOURCE_CODE_CONTEXT?: Record<string, SourceCodeContextEntry>\n}\n\nconst contextByUrl = new Map<string, SourceCodeContextEntry>()\nconst processedStacks = new Set<string>()\nlet hasFiredTelemetry = false\n\nfunction syncSourceCodeContext() {\n // globalObject.window is undefined in service worker environments\n const sourceCodeContext = (globalObject.window as BrowserWindow | undefined)?.KUBESENSE_SOURCE_CODE_CONTEXT\n if (!sourceCodeContext) {\n return\n }\n\n let useDebugId = false\n let useService = false\n let useVersion = false\n\n for (const [stack, entry] of Object.entries(sourceCodeContext)) {\n useDebugId = useDebugId || entry.ddDebugId !== undefined\n useService = useService || entry.service !== undefined\n useVersion = useVersion || entry.version !== undefined\n\n if (processedStacks.has(stack)) {\n continue\n }\n\n processedStacks.add(stack)\n\n const url = computeStackTrace({ stack }).stack[0]?.url\n if (url && !contextByUrl.has(url)) {\n contextByUrl.set(url, entry)\n }\n }\n\n if (!hasFiredTelemetry) {\n hasFiredTelemetry = true\n addTelemetryUsage({\n feature: 'source-code-context',\n use_debug_id: useDebugId,\n use_service: useService,\n use_version: useVersion,\n })\n }\n}\n\nexport interface DebugIdEntry {\n url: string\n id: string\n}\n\nexport function buildDebugIdByUrl(urls: string[]): DebugIdEntry[] | undefined {\n syncSourceCodeContext()\n\n const seenUrls = new Set<string>()\n const debugIds: DebugIdEntry[] = []\n\n for (const url of urls) {\n if (seenUrls.has(url)) {\n continue\n }\n seenUrls.add(url)\n\n const debugId = contextByUrl.get(url)?.ddDebugId\n if (debugId !== undefined) {\n debugIds.push({ url, id: debugId })\n }\n }\n\n return debugIds.length ? debugIds : undefined\n}\n\nexport function getSourceCodeContext(url: string): SourceCodeContextEntry | undefined {\n syncSourceCodeContext()\n return contextByUrl.get(url)\n}\n\nexport function resetSourceCodeContext() {\n contextByUrl.clear()\n processedStacks.clear()\n hasFiredTelemetry = false\n}\n"],"mappings":";;;;AAqBA,MAAM,+BAAe,IAAI,IAAoC;AAC7D,MAAM,kCAAkB,IAAI,IAAY;AACxC,IAAI,oBAAoB;AAExB,SAAS,wBAAwB;CAE/B,MAAM,oBAAqB,aAAa,QAAsC;CAC9E,IAAI,CAAC,mBACH;CAGF,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,IAAI,aAAa;CAEjB,KAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,iBAAiB,GAAG;EAC9D,aAAa,cAAc,MAAM,cAAc,KAAA;EAC/C,aAAa,cAAc,MAAM,YAAY,KAAA;EAC7C,aAAa,cAAc,MAAM,YAAY,KAAA;EAE7C,IAAI,gBAAgB,IAAI,KAAK,GAC3B;EAGF,gBAAgB,IAAI,KAAK;EAEzB,MAAM,MAAM,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE;EACnD,IAAI,OAAO,CAAC,aAAa,IAAI,GAAG,GAC9B,aAAa,IAAI,KAAK,KAAK;CAE/B;CAEA,IAAI,CAAC,mBAAmB;EACtB,oBAAoB;EACpB,kBAAkB;GAChB,SAAS;GACT,cAAc;GACd,aAAa;GACb,aAAa;EACf,CAAC;CACH;AACF;AAOA,SAAgB,kBAAkB,MAA4C;CAC5E,sBAAsB;CAEtB,MAAM,2BAAW,IAAI,IAAY;CACjC,MAAM,WAA2B,CAAC;CAElC,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,SAAS,IAAI,GAAG,GAClB;EAEF,SAAS,IAAI,GAAG;EAEhB,MAAM,UAAU,aAAa,IAAI,GAAG,CAAC,EAAE;EACvC,IAAI,YAAY,KAAA,GACd,SAAS,KAAK;GAAE;GAAK,IAAI;EAAQ,CAAC;CAEtC;CAEA,OAAO,SAAS,SAAS,WAAW,KAAA;AACtC;AAEA,SAAgB,qBAAqB,KAAiD;CACpF,sBAAsB;CACtB,OAAO,aAAa,IAAI,GAAG;AAC7B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { getInitCookie } from "../../browser/cookie.mjs";
|
|
2
|
+
import { tryJsonParse } from "../../tools/utils/objectUtils.mjs";
|
|
3
|
+
import { globalObject, isWorkerEnvironment } from "@kubesense/kubesense-js-core/util";
|
|
4
|
+
//#region src/domain/synthetics/syntheticsWorkerValues.ts
|
|
5
|
+
const cookieNamePrefix = "kubesense-synthetics-";
|
|
6
|
+
const SYNTHETICS_TEST_ID_COOKIE_NAME = `${cookieNamePrefix}public-id`;
|
|
7
|
+
const SYNTHETICS_RESULT_ID_COOKIE_NAME = `${cookieNamePrefix}result-id`;
|
|
8
|
+
const SYNTHETICS_INJECTS_RUM_COOKIE_NAME = `${cookieNamePrefix}injects-rum`;
|
|
9
|
+
const SYNTHETICS_CONTEXT_COOKIE_NAME = `${cookieNamePrefix}rum-context`;
|
|
10
|
+
function willSyntheticsInjectRum() {
|
|
11
|
+
if (isWorkerEnvironment) return false;
|
|
12
|
+
return Boolean(globalObject._KUBESENSE_SYNTHETICS_INJECTS_RUM || getInitCookie(SYNTHETICS_INJECTS_RUM_COOKIE_NAME));
|
|
13
|
+
}
|
|
14
|
+
function getSyntheticsContext() {
|
|
15
|
+
const raw = getRawSyntheticsContext();
|
|
16
|
+
return isValidSyntheticsContext(raw) ? raw : void 0;
|
|
17
|
+
}
|
|
18
|
+
function isSyntheticsTest() {
|
|
19
|
+
return Boolean(getSyntheticsContext());
|
|
20
|
+
}
|
|
21
|
+
function getRawSyntheticsContext() {
|
|
22
|
+
const rawGlobal = globalObject._KUBESENSE_SYNTHETICS_RUM_CONTEXT;
|
|
23
|
+
if (rawGlobal) return rawGlobal;
|
|
24
|
+
const rawCookie = getInitCookie(SYNTHETICS_CONTEXT_COOKIE_NAME);
|
|
25
|
+
if (rawCookie) return tryJsonParse(decodeURIComponent(rawCookie));
|
|
26
|
+
return {
|
|
27
|
+
test_id: window._KUBESENSE_SYNTHETICS_PUBLIC_ID || getInitCookie(SYNTHETICS_TEST_ID_COOKIE_NAME),
|
|
28
|
+
result_id: window._KUBESENSE_SYNTHETICS_RESULT_ID || getInitCookie(SYNTHETICS_RESULT_ID_COOKIE_NAME)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function isValidSyntheticsContext(value) {
|
|
32
|
+
return typeof value === "object" && value !== null && typeof value.test_id === "string" && typeof value.result_id === "string";
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { SYNTHETICS_CONTEXT_COOKIE_NAME, SYNTHETICS_INJECTS_RUM_COOKIE_NAME, SYNTHETICS_RESULT_ID_COOKIE_NAME, SYNTHETICS_TEST_ID_COOKIE_NAME, getSyntheticsContext, isSyntheticsTest, willSyntheticsInjectRum };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=syntheticsWorkerValues.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntheticsWorkerValues.mjs","names":[],"sources":["../../../src/domain/synthetics/syntheticsWorkerValues.ts"],"sourcesContent":["import { globalObject, isWorkerEnvironment } from '@kubesense/kubesense-js-core/util'\nimport { getInitCookie } from '../../browser/cookie'\nimport { tryJsonParse } from '../../tools/utils/objectUtils'\n\nconst cookieNamePrefix = 'kubesense-synthetics-'\nexport const SYNTHETICS_TEST_ID_COOKIE_NAME = `${cookieNamePrefix}public-id`\nexport const SYNTHETICS_RESULT_ID_COOKIE_NAME = `${cookieNamePrefix}result-id`\nexport const SYNTHETICS_INJECTS_RUM_COOKIE_NAME = `${cookieNamePrefix}injects-rum`\nexport const SYNTHETICS_CONTEXT_COOKIE_NAME = `${cookieNamePrefix}rum-context`\n\nexport interface BrowserWindow {\n _KUBESENSE_SYNTHETICS_PUBLIC_ID?: unknown\n _KUBESENSE_SYNTHETICS_RESULT_ID?: unknown\n _KUBESENSE_SYNTHETICS_INJECTS_RUM?: unknown\n _KUBESENSE_SYNTHETICS_RUM_CONTEXT?: unknown\n}\n\nexport interface SyntheticsContext {\n test_id: string\n result_id: string\n [key: string]: unknown\n}\n\nexport function willSyntheticsInjectRum(): boolean {\n if (isWorkerEnvironment) {\n // We don't expect to run synthetics tests in a worker environment\n return false\n }\n\n return Boolean(\n (globalObject as BrowserWindow)._KUBESENSE_SYNTHETICS_INJECTS_RUM ||\n getInitCookie(SYNTHETICS_INJECTS_RUM_COOKIE_NAME)\n )\n}\n\nexport function getSyntheticsContext(): SyntheticsContext | undefined {\n const raw = getRawSyntheticsContext()\n return isValidSyntheticsContext(raw) ? raw : undefined\n}\n\nexport function isSyntheticsTest(): boolean {\n return Boolean(getSyntheticsContext())\n}\n\nfunction getRawSyntheticsContext(): unknown {\n const rawGlobal = (globalObject as BrowserWindow)._KUBESENSE_SYNTHETICS_RUM_CONTEXT\n if (rawGlobal) {\n return rawGlobal\n }\n\n const rawCookie = getInitCookie(SYNTHETICS_CONTEXT_COOKIE_NAME)\n if (rawCookie) {\n return tryJsonParse(decodeURIComponent(rawCookie))\n }\n\n return {\n test_id: (window as BrowserWindow)._KUBESENSE_SYNTHETICS_PUBLIC_ID || getInitCookie(SYNTHETICS_TEST_ID_COOKIE_NAME),\n result_id:\n (window as BrowserWindow)._KUBESENSE_SYNTHETICS_RESULT_ID || getInitCookie(SYNTHETICS_RESULT_ID_COOKIE_NAME),\n }\n}\n\nfunction isValidSyntheticsContext(value: unknown): value is SyntheticsContext {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Record<string, unknown>).test_id === 'string' &&\n typeof (value as Record<string, unknown>).result_id === 'string'\n )\n}\n"],"mappings":";;;;AAIA,MAAM,mBAAmB;AACzB,MAAa,iCAAiC,GAAG,iBAAiB;AAClE,MAAa,mCAAmC,GAAG,iBAAiB;AACpE,MAAa,qCAAqC,GAAG,iBAAiB;AACtE,MAAa,iCAAiC,GAAG,iBAAiB;AAelE,SAAgB,0BAAmC;CACjD,IAAI,qBAEF,OAAO;CAGT,OAAO,QACJ,aAA+B,qCAChC,cAAc,kCAAkC,CAClD;AACF;AAEA,SAAgB,uBAAsD;CACpE,MAAM,MAAM,wBAAwB;CACpC,OAAO,yBAAyB,GAAG,IAAI,MAAM,KAAA;AAC/C;AAEA,SAAgB,mBAA4B;CAC1C,OAAO,QAAQ,qBAAqB,CAAC;AACvC;AAEA,SAAS,0BAAmC;CAC1C,MAAM,YAAa,aAA+B;CAClD,IAAI,WACF,OAAO;CAGT,MAAM,YAAY,cAAc,8BAA8B;CAC9D,IAAI,WACF,OAAO,aAAa,mBAAmB,SAAS,CAAC;CAGnD,OAAO;EACL,SAAU,OAAyB,mCAAmC,cAAc,8BAA8B;EAClH,WACG,OAAyB,mCAAmC,cAAc,gCAAgC;CAC/G;AACF;AAEA,SAAS,yBAAyB,OAA4C;CAC5E,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAAkC,YAAY,YACtD,OAAQ,MAAkC,cAAc;AAE5D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { display } from "../tools/display.mjs";
|
|
2
|
+
import { DOCS_ORIGIN, MORE_DETAILS } from "@kubesense/kubesense-js-core/util";
|
|
3
|
+
//#region src/domain/tags.ts
|
|
4
|
+
const TAG_SIZE_LIMIT = 200;
|
|
5
|
+
function buildTags(configuration) {
|
|
6
|
+
const { env, service, version, datacenter, sdkVersion, variant } = configuration;
|
|
7
|
+
const tags = [buildTag("sdk_version", sdkVersion ?? "2.0.0")];
|
|
8
|
+
if (env) tags.push(buildTag("env", env));
|
|
9
|
+
if (service) tags.push(buildTag("service", service));
|
|
10
|
+
if (version) tags.push(buildTag("version", version));
|
|
11
|
+
if (datacenter) tags.push(buildTag("datacenter", datacenter));
|
|
12
|
+
if (variant) tags.push(buildTag("variant", variant));
|
|
13
|
+
return tags;
|
|
14
|
+
}
|
|
15
|
+
function buildTag(key, rawValue) {
|
|
16
|
+
const tag = rawValue ? `${key}:${rawValue}` : key;
|
|
17
|
+
if (tag.length > 200 || hasForbiddenCharacters(tag)) display.warn(`Tag ${tag} doesn't meet tag requirements and will be sanitized. ${MORE_DETAILS} ${DOCS_ORIGIN}/getting_started/tagging/#defining-tags`);
|
|
18
|
+
return sanitizeTag(tag);
|
|
19
|
+
}
|
|
20
|
+
function sanitizeTag(tag) {
|
|
21
|
+
return tag.replace(/,/g, "_");
|
|
22
|
+
}
|
|
23
|
+
function hasForbiddenCharacters(rawValue) {
|
|
24
|
+
return new RegExp("[^\\p{Ll}\\p{Lo}0-9_:./-]", "u").test(rawValue);
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { TAG_SIZE_LIMIT, buildTag, buildTags, sanitizeTag };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=tags.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.mjs","names":[],"sources":["../../src/domain/tags.ts"],"sourcesContent":["import { DOCS_ORIGIN, MORE_DETAILS } from '@kubesense/kubesense-js-core/util'\nimport { display } from '../tools/display'\nimport type { Configuration } from './configuration'\n\nexport const TAG_SIZE_LIMIT = 200\n\n// replaced at build time\ndeclare const __BUILD_ENV__SDK_VERSION__: string\n\nexport function buildTags(configuration: Configuration): string[] {\n const { env, service, version, datacenter, sdkVersion, variant } = configuration\n const tags = [buildTag('sdk_version', sdkVersion ?? __BUILD_ENV__SDK_VERSION__)]\n\n if (env) {\n tags.push(buildTag('env', env))\n }\n if (service) {\n tags.push(buildTag('service', service))\n }\n if (version) {\n tags.push(buildTag('version', version))\n }\n if (datacenter) {\n tags.push(buildTag('datacenter', datacenter))\n }\n\n if (variant) {\n tags.push(buildTag('variant', variant))\n }\n\n return tags\n}\n\nexport function buildTag(key: string, rawValue?: string) {\n // See https://docs.kubesense.ai/getting_started/tagging/#defining-tags for tags syntax. Note\n // that the backend may not follow the exact same rules, so we only want to display an informal\n // warning.\n const tag = rawValue ? `${key}:${rawValue}` : key\n\n if (tag.length > TAG_SIZE_LIMIT || hasForbiddenCharacters(tag)) {\n display.warn(\n `Tag ${tag} doesn't meet tag requirements and will be sanitized. ${MORE_DETAILS} ${DOCS_ORIGIN}/getting_started/tagging/#defining-tags`\n )\n }\n\n // Let the backend do most of the sanitization, but still make sure multiple tags can't be crafted\n // by forging a value containing commas.\n return sanitizeTag(tag)\n}\n\nexport function sanitizeTag(tag: string) {\n return tag.replace(/,/g, '_')\n}\n\nfunction hasForbiddenCharacters(rawValue: string) {\n // We use the Unicode property escapes to match any character that is a letter including other languages like Chinese, Japanese, etc.\n // p{Ll} matches a lowercase letter.\n // p{Lo} matches a letter that is neither uppercase nor lowercase (ex: Japanese characters).\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Unicode_character_class_escape#unicode_property_escapes_vs._character_classes\n return new RegExp('[^\\\\p{Ll}\\\\p{Lo}0-9_:./-]', 'u').test(rawValue)\n}\n"],"mappings":";;;AAIA,MAAa,iBAAiB;AAK9B,SAAgB,UAAU,eAAwC;CAChE,MAAM,EAAE,KAAK,SAAS,SAAS,YAAY,YAAY,YAAY;CACnE,MAAM,OAAO,CAAC,SAAS,eAAe,cAAA,OAAwC,CAAC;CAE/E,IAAI,KACF,KAAK,KAAK,SAAS,OAAO,GAAG,CAAC;CAEhC,IAAI,SACF,KAAK,KAAK,SAAS,WAAW,OAAO,CAAC;CAExC,IAAI,SACF,KAAK,KAAK,SAAS,WAAW,OAAO,CAAC;CAExC,IAAI,YACF,KAAK,KAAK,SAAS,cAAc,UAAU,CAAC;CAG9C,IAAI,SACF,KAAK,KAAK,SAAS,WAAW,OAAO,CAAC;CAGxC,OAAO;AACT;AAEA,SAAgB,SAAS,KAAa,UAAmB;CAIvD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,aAAa;CAE9C,IAAI,IAAI,SAAA,OAA2B,uBAAuB,GAAG,GAC3D,QAAQ,KACN,OAAO,IAAI,wDAAwD,aAAa,GAAG,YAAY,wCACjG;CAKF,OAAO,YAAY,GAAG;AACxB;AAEA,SAAgB,YAAY,KAAa;CACvC,OAAO,IAAI,QAAQ,MAAM,GAAG;AAC9B;AAEA,SAAS,uBAAuB,UAAkB;CAKhD,OAAO,IAAI,OAAO,6BAA6B,GAAG,CAAC,CAAC,KAAK,QAAQ;AACnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawTelemetryEvent.types.mjs","names":[],"sources":["../../../src/domain/telemetry/rawTelemetryEvent.types.ts"],"sourcesContent":["import type { TelemetryEvent, TelemetryConfigurationEvent, TelemetryUsageEvent } from './telemetryEvent.types'\n\nexport const TelemetryType = {\n LOG: 'log',\n CONFIGURATION: 'configuration',\n USAGE: 'usage',\n} as const\n\nexport const enum StatusType {\n debug = 'debug',\n error = 'error',\n}\n\nexport interface RuntimeEnvInfo {\n is_local_file: boolean\n is_worker: boolean\n}\n\nexport type RawTelemetryEvent = TelemetryEvent['telemetry']\nexport type RawTelemetryConfiguration = TelemetryConfigurationEvent['telemetry']['configuration']\nexport type RawTelemetryUsage = TelemetryUsageEvent['telemetry']['usage']\nexport type RawTelemetryUsageFeature = TelemetryUsageEvent['telemetry']['usage']['feature']\n"],"mappings":";AAEA,MAAa,gBAAgB;CAC3B,KAAK;CACL,eAAe;CACf,OAAO;AACT"}
|