@openobserve/browser-core 0.3.4 → 0.4.0-beta.2
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/README.md +1 -1
- package/cjs/boot/displayAlreadyInitializedError.js +6 -7
- package/cjs/boot/displayAlreadyInitializedError.js.map +1 -1
- package/cjs/boot/init.js +26 -34
- package/cjs/boot/init.js.map +1 -1
- package/cjs/browser/addEventListener.d.ts +10 -8
- package/cjs/browser/addEventListener.js +107 -50
- package/cjs/browser/addEventListener.js.map +1 -1
- package/cjs/browser/browser.types.d.ts +91 -4
- package/cjs/browser/cookie.d.ts +0 -1
- package/cjs/browser/cookie.js +65 -92
- package/cjs/browser/cookie.js.map +1 -1
- package/cjs/browser/cookieAccess.d.ts +16 -0
- package/cjs/browser/cookieAccess.js +114 -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 +80 -92
- package/cjs/browser/fetchObservable.js.map +1 -1
- package/cjs/browser/pageMayExitObservable.d.ts +1 -2
- package/cjs/browser/pageMayExitObservable.js +41 -40
- 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/xhrObservable.d.ts +8 -3
- package/cjs/browser/xhrObservable.js +65 -77
- package/cjs/browser/xhrObservable.js.map +1 -1
- package/cjs/domain/allowedTrackingOrigins.d.ts +1 -1
- package/cjs/domain/allowedTrackingOrigins.js +25 -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 +44 -43
- package/cjs/domain/configuration/configuration.js +122 -125
- package/cjs/domain/configuration/configuration.js.map +1 -1
- package/cjs/domain/configuration/endpointBuilder.d.ts +42 -7
- package/cjs/domain/configuration/endpointBuilder.js +67 -74
- package/cjs/domain/configuration/endpointBuilder.js.map +1 -1
- package/cjs/domain/configuration/index.d.ts +2 -3
- package/cjs/domain/connectivity/connectivity.d.ts +1 -7
- package/cjs/domain/connectivity/connectivity.js +11 -11
- package/cjs/domain/connectivity/connectivity.js.map +1 -1
- package/cjs/domain/console/consoleObservable.d.ts +1 -1
- package/cjs/domain/console/consoleObservable.js +59 -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 -54
- 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 +30 -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 +27 -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 +29 -41
- 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 +1 -1
- package/cjs/domain/error/error.js +62 -60
- package/cjs/domain/error/error.js.map +1 -1
- package/cjs/domain/error/error.types.d.ts +1 -1
- package/cjs/domain/error/error.types.js +24 -11
- package/cjs/domain/error/error.types.js.map +1 -1
- package/cjs/domain/error/trackRuntimeError.d.ts +3 -2
- package/cjs/domain/error/trackRuntimeError.js +41 -41
- package/cjs/domain/error/trackRuntimeError.js.map +1 -1
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.js +33 -38
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.js.map +1 -1
- package/cjs/domain/extension/extensionUtils.js +18 -25
- package/cjs/domain/extension/extensionUtils.js.map +1 -1
- package/cjs/domain/intakeSites.d.ts +3 -3
- package/cjs/domain/intakeSites.js +23 -10
- package/cjs/domain/intakeSites.js.map +1 -1
- package/cjs/domain/report/reportObservable.d.ts +1 -2
- package/cjs/domain/report/reportObservable.js +73 -85
- package/cjs/domain/report/reportObservable.js.map +1 -1
- package/cjs/domain/resourceUtils.js +19 -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 +13 -13
- package/cjs/domain/session/sessionManager.js +219 -193
- package/cjs/domain/session/sessionManager.js.map +1 -1
- package/cjs/domain/session/sessionState.d.ts +10 -1
- package/cjs/domain/session/sessionState.js +70 -55
- 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 +42 -180
- 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 +89 -95
- 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 +35 -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/synthetics/syntheticsWorkerValues.d.ts +9 -3
- package/cjs/domain/synthetics/syntheticsWorkerValues.js +33 -25
- package/cjs/domain/synthetics/syntheticsWorkerValues.js.map +1 -1
- package/cjs/domain/tags.d.ts +0 -1
- package/cjs/domain/tags.js +22 -58
- 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 +8 -8
- package/cjs/domain/telemetry/telemetry.js +196 -211
- package/cjs/domain/telemetry/telemetry.js.map +1 -1
- package/cjs/domain/telemetry/telemetryEvent.types.d.ts +97 -17
- 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/index.d.ts +25 -22
- package/cjs/index.js +281 -194
- 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 -35
- package/cjs/tools/display.js +11 -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/globalObject.d.ts +16 -15
- package/cjs/tools/globalObject.js +7 -43
- package/cjs/tools/globalObject.js.map +1 -1
- package/cjs/tools/instrumentMethod.d.ts +58 -1
- package/cjs/tools/instrumentMethod.js +174 -112
- package/cjs/tools/instrumentMethod.js.map +1 -1
- package/cjs/tools/matchOption.js +25 -29
- 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/monitor.d.ts +5 -7
- package/cjs/tools/monitor.js +13 -58
- package/cjs/tools/monitor.js.map +1 -1
- 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 +22 -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 +111 -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/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.js +15 -14
- 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.js +56 -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/utils/urlPolyfill.js +42 -46
- package/cjs/tools/utils/urlPolyfill.js.map +1 -1
- package/cjs/tools/valueHistory.d.ts +9 -1
- package/cjs/tools/valueHistory.js +110 -99
- package/cjs/tools/valueHistory.js.map +1 -1
- package/cjs/transport/batch.js +73 -106
- package/cjs/transport/batch.js.map +1 -1
- package/cjs/transport/eventBridge.d.ts +6 -2
- package/cjs/transport/eventBridge.js +53 -38
- package/cjs/transport/eventBridge.js.map +1 -1
- package/cjs/transport/flushController.d.ts +2 -12
- package/cjs/transport/flushController.js +98 -117
- package/cjs/transport/flushController.js.map +1 -1
- package/cjs/transport/httpRequest.d.ts +0 -1
- package/cjs/transport/httpRequest.js +51 -85
- package/cjs/transport/httpRequest.js.map +1 -1
- package/cjs/transport/index.d.ts +1 -0
- package/cjs/transport/sendWithRetryStrategy.js +133 -146
- 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 +81 -0
- package/esm/browser/cookie.mjs.map +1 -0
- package/esm/browser/cookieAccess.mjs +111 -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 +90 -0
- package/esm/browser/fetchObservable.mjs.map +1 -0
- package/esm/browser/pageMayExitObservable.mjs +44 -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/xhrObservable.mjs +74 -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 +131 -0
- package/esm/domain/configuration/configuration.mjs.map +1 -0
- package/esm/domain/configuration/endpointBuilder.mjs +72 -0
- package/esm/domain/configuration/endpointBuilder.mjs.map +1 -0
- package/esm/domain/connectivity/connectivity.mjs +14 -0
- package/esm/domain/connectivity/connectivity.mjs.map +1 -0
- package/esm/domain/console/consoleObservable.mjs +69 -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 +32 -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 +73 -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/trackRuntimeError.mjs +48 -0
- package/esm/domain/error/trackRuntimeError.mjs.map +1 -0
- package/esm/domain/eventRateLimiter/createEventRateLimiter.mjs +36 -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/intakeSites.mjs +18 -0
- package/esm/domain/intakeSites.mjs.map +1 -0
- package/esm/domain/report/reportObservable.mjs +86 -0
- package/esm/domain/report/reportObservable.mjs.map +1 -0
- package/esm/domain/resourceUtils.mjs +21 -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 +225 -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 +46 -0
- package/esm/domain/session/sessionStore.mjs.map +1 -0
- package/esm/domain/session/storeStrategies/sessionInCookie.mjs +97 -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 +33 -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/synthetics/syntheticsWorkerValues.mjs +37 -0
- package/esm/domain/synthetics/syntheticsWorkerValues.mjs.map +1 -0
- package/esm/domain/tags.mjs +28 -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 +219 -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/index.mjs +81 -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 +10 -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/globalObject.mjs +7 -0
- package/esm/tools/globalObject.mjs.map +1 -0
- package/esm/tools/instrumentMethod.mjs +178 -0
- package/esm/tools/instrumentMethod.mjs.map +1 -0
- package/esm/tools/matchOption.mjs +30 -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/monitor.mjs +13 -0
- package/esm/tools/monitor.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 +131 -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/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 +22 -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 +66 -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/utils/urlPolyfill.mjs +51 -0
- package/esm/tools/utils/urlPolyfill.mjs.map +1 -0
- package/esm/tools/valueHistory.mjs +114 -0
- package/esm/tools/valueHistory.mjs.map +1 -0
- package/esm/transport/batch.mjs +77 -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 +104 -0
- package/esm/transport/flushController.mjs.map +1 -0
- package/esm/transport/httpRequest.mjs +60 -0
- package/esm/transport/httpRequest.mjs.map +1 -0
- package/esm/transport/sendWithRetryStrategy.mjs +149 -0
- package/esm/transport/sendWithRetryStrategy.mjs.map +1 -0
- package/package.json +15 -4
- package/src/boot/init.ts +2 -2
- package/src/browser/addEventListener.ts +37 -5
- package/src/browser/browser.types.ts +127 -13
- package/src/browser/cookie.ts +21 -27
- package/src/browser/cookieAccess.ts +150 -0
- package/src/browser/fetch.ts +14 -0
- package/src/browser/fetchObservable.ts +22 -22
- package/src/browser/pageMayExitObservable.ts +7 -4
- package/src/browser/runOnReadyState.ts +3 -8
- package/src/browser/xhrObservable.ts +22 -12
- package/src/domain/allowedTrackingOrigins.ts +5 -5
- package/src/domain/bufferedData.ts +41 -14
- package/src/domain/configuration/configuration.ts +87 -72
- package/src/domain/configuration/endpointBuilder.ts +82 -52
- package/src/domain/configuration/index.ts +2 -2
- package/src/domain/connectivity/connectivity.ts +3 -15
- package/src/domain/console/consoleObservable.ts +3 -3
- package/src/domain/context/contextManager.ts +1 -1
- package/src/domain/context/contextUtils.ts +1 -1
- package/src/domain/context/defineContextMethod.ts +3 -3
- 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 +7 -11
- package/src/domain/error/error.ts +53 -23
- package/src/domain/error/error.types.ts +1 -1
- package/src/domain/error/trackRuntimeError.ts +11 -4
- package/src/domain/eventRateLimiter/createEventRateLimiter.ts +1 -1
- package/src/domain/intakeSites.ts +8 -3
- package/src/domain/report/reportObservable.ts +11 -7
- package/src/domain/sampler.ts +64 -0
- package/src/domain/session/sessionConstants.ts +2 -1
- package/src/domain/session/sessionManager.ts +281 -176
- package/src/domain/session/sessionState.ts +64 -8
- package/src/domain/session/sessionStore.ts +57 -223
- package/src/domain/session/storeStrategies/sessionInCookie.ts +121 -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/synthetics/syntheticsWorkerValues.ts +44 -13
- package/src/domain/tags.ts +0 -16
- package/src/domain/telemetry/telemetry.ts +38 -34
- package/src/domain/telemetry/telemetryEvent.types.ts +116 -20
- package/src/domain/trackingConsent.ts +18 -3
- package/src/index.ts +51 -31
- package/src/tools/display.ts +2 -50
- package/src/tools/experimentalFeatures.ts +1 -4
- package/src/tools/getZoneJsOriginalValue.ts +3 -3
- package/src/tools/globalObject.ts +27 -41
- package/src/tools/instrumentMethod.ts +230 -20
- package/src/tools/matchOption.ts +3 -1
- package/src/tools/mockable.ts +32 -0
- package/src/tools/monitor.ts +14 -62
- package/src/tools/observable.ts +9 -1
- package/src/tools/queueMicrotask.ts +6 -1
- package/src/tools/readBytesFromStream.ts +3 -12
- package/src/tools/requestIdleCallback.ts +1 -1
- package/src/tools/serialisation/sanitize.ts +67 -65
- package/src/tools/serialisation/stringify.ts +18 -0
- package/src/tools/stackTrace/computeStackTrace.ts +15 -13
- package/src/tools/stackTrace/handlingStack.ts +14 -1
- package/src/tools/taskQueue.ts +5 -3
- package/src/tools/timer.ts +7 -6
- package/src/tools/utils/arrayUtils.ts +7 -0
- package/src/tools/utils/browserDetection.ts +8 -0
- package/src/tools/utils/byteUtils.ts +1 -5
- package/src/tools/utils/functionUtils.ts +2 -2
- package/src/tools/utils/objectUtils.ts +20 -0
- package/src/tools/utils/stringUtils.ts +4 -1
- package/src/tools/utils/urlPolyfill.ts +5 -4
- package/src/tools/valueHistory.ts +39 -6
- package/src/transport/batch.ts +9 -18
- package/src/transport/eventBridge.ts +23 -10
- package/src/transport/flushController.ts +17 -24
- package/src/transport/httpRequest.ts +4 -36
- package/src/transport/index.ts +1 -0
- package/src/transport/sendWithRetryStrategy.ts +1 -1
- package/cjs/browser/browser.types.js +0 -6
- package/cjs/browser/browser.types.js.map +0 -1
- package/cjs/domain/configuration/index.js +0 -16
- package/cjs/domain/configuration/index.js.map +0 -1
- package/cjs/domain/configuration/transportConfiguration.d.ts +0 -20
- package/cjs/domain/configuration/transportConfiguration.js +0 -54
- 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/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/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/mergeInto.d.ts +0 -25
- package/cjs/tools/mergeInto.js +0 -98
- package/cjs/tools/mergeInto.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/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/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 -14
- 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 -28
- package/esm/browser/cookie.js +0 -103
- 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 -40
- 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 -312
- package/esm/domain/configuration/configuration.js +0 -132
- 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 -77
- package/esm/domain/configuration/endpointBuilder.js.map +0 -1
- package/esm/domain/configuration/index.d.ts +0 -5
- package/esm/domain/configuration/index.js +0 -4
- package/esm/domain/configuration/index.js.map +0 -1
- package/esm/domain/configuration/transportConfiguration.d.ts +0 -20
- package/esm/domain/configuration/transportConfiguration.js +0 -50
- package/esm/domain/configuration/transportConfiguration.js.map +0 -1
- package/esm/domain/connectivity/connectivity.d.ts +0 -14
- package/esm/domain/connectivity/connectivity.js +0 -11
- 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 -57
- 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 -29
- package/esm/domain/contexts/userContext.js +0 -41
- 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 -65
- 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 -8
- package/esm/domain/intakeSites.js +0 -8
- 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 -179
- 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 -60
- 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 -228
- 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/index.d.ts +0 -100
- package/esm/index.js +0 -76
- 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 -52
- 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/numberUtils.d.ts +0 -9
- package/esm/tools/utils/numberUtils.js +0 -18
- 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 -56
- package/esm/transport/httpRequest.js +0 -89
- 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/boot/displayAlreadyInitializedError.spec.ts +0 -18
- package/src/boot/init.spec.ts +0 -50
- package/src/browser/addEventListener.spec.ts +0 -141
- package/src/browser/cookie.spec.ts +0 -53
- package/src/browser/fetchObservable.spec.ts +0 -334
- package/src/browser/pageMayExitObservable.spec.ts +0 -56
- package/src/browser/xhrObservable.spec.ts +0 -405
- package/src/domain/allowedTrackingOrigins.spec.ts +0 -210
- package/src/domain/bufferedData.spec.ts +0 -34
- package/src/domain/configuration/configuration.spec.ts +0 -236
- package/src/domain/configuration/endpointBuilder.spec.ts +0 -173
- package/src/domain/configuration/transportConfiguration.spec.ts +0 -130
- package/src/domain/configuration/transportConfiguration.ts +0 -78
- package/src/domain/connectivity/connectivity.spec.ts +0 -50
- package/src/domain/console/consoleObservable.spec.ts +0 -151
- package/src/domain/context/contextManager.spec.ts +0 -152
- package/src/domain/context/contextUtils.spec.ts +0 -26
- package/src/domain/context/storeContextManager.spec.ts +0 -103
- package/src/domain/contexts/accountContext.spec.ts +0 -99
- package/src/domain/contexts/globalContext.spec.ts +0 -88
- package/src/domain/contexts/userContext.spec.ts +0 -156
- package/src/domain/error/error.spec.ts +0 -294
- package/src/domain/error/trackRuntimeError.spec.ts +0 -343
- package/src/domain/eventRateLimiter/createEventRateLimiter.spec.ts +0 -119
- package/src/domain/extension/extensionUtils.spec.ts +0 -47
- package/src/domain/report/reportObservable.spec.ts +0 -71
- package/src/domain/session/oldCookiesMigration.spec.ts +0 -76
- package/src/domain/session/oldCookiesMigration.ts +0 -42
- package/src/domain/session/sessionManager.spec.ts +0 -684
- package/src/domain/session/sessionState.spec.ts +0 -88
- package/src/domain/session/sessionStore.spec.ts +0 -647
- package/src/domain/session/sessionStoreOperations.spec.ts +0 -234
- package/src/domain/session/sessionStoreOperations.ts +0 -131
- package/src/domain/session/storeStrategies/sessionInCookie.spec.ts +0 -228
- package/src/domain/session/storeStrategies/sessionInLocalStorage.spec.ts +0 -75
- package/src/domain/synthetics/syntheticsWorkerValues.spec.ts +0 -82
- package/src/domain/tags.spec.ts +0 -74
- package/src/domain/telemetry/telemetry.spec.ts +0 -494
- package/src/domain/trackingConsent.spec.ts +0 -44
- package/src/tools/abstractHooks.spec.ts +0 -76
- package/src/tools/abstractHooks.ts +0 -72
- package/src/tools/abstractLifeCycle.spec.ts +0 -46
- package/src/tools/boundedBuffer.spec.ts +0 -40
- package/src/tools/boundedBuffer.ts +0 -45
- package/src/tools/catchUserErrors.spec.ts +0 -20
- package/src/tools/encoder.spec.ts +0 -112
- package/src/tools/experimentalFeatures.spec.ts +0 -60
- package/src/tools/getZoneJsOriginalValue.spec.ts +0 -36
- package/src/tools/instrumentMethod.spec.ts +0 -381
- package/src/tools/matchOption.spec.ts +0 -41
- package/src/tools/mergeInto.spec.ts +0 -198
- package/src/tools/mergeInto.ts +0 -177
- package/src/tools/monitor.spec.ts +0 -172
- package/src/tools/observable.spec.ts +0 -259
- package/src/tools/queueMicrotask.spec.ts +0 -24
- package/src/tools/readBytesFromStream.spec.ts +0 -62
- package/src/tools/requestIdleCallback.spec.ts +0 -65
- package/src/tools/serialisation/jsonStringify.spec.ts +0 -76
- package/src/tools/serialisation/sanitize.spec.ts +0 -284
- package/src/tools/stackTrace/capturedExceptions.specHelper.ts +0 -316
- package/src/tools/stackTrace/computeStackTrace.spec.ts +0 -1007
- package/src/tools/stackTrace/handlingStack.spec.ts +0 -20
- package/src/tools/taskQueue.spec.ts +0 -60
- package/src/tools/timer.spec.ts +0 -76
- package/src/tools/utils/browserDetection.spec.ts +0 -120
- package/src/tools/utils/byteUtils.spec.ts +0 -29
- package/src/tools/utils/functionUtils.spec.ts +0 -229
- package/src/tools/utils/numberUtils.spec.ts +0 -27
- package/src/tools/utils/stringUtils.spec.ts +0 -74
- package/src/tools/utils/timeUtils.ts +0 -117
- package/src/tools/utils/typeUtils.spec.ts +0 -25
- package/src/tools/utils/typeUtils.ts +0 -12
- package/src/tools/utils/urlPolyfill.spec.ts +0 -55
- package/src/tools/valueHistory.spec.ts +0 -180
- package/src/transport/batch.spec.ts +0 -261
- package/src/transport/eventBridge.spec.ts +0 -90
- package/src/transport/flushController.spec.ts +0 -267
- package/src/transport/httpRequest.spec.ts +0 -400
- package/src/transport/sendWithRetryStrategy.spec.ts +0 -393
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { display } from "../../tools/display.mjs";
|
|
2
|
+
import { generateUUID } from "../../tools/utils/stringUtils.mjs";
|
|
3
|
+
import { isWorkerEnvironment } from "../../tools/globalObject.mjs";
|
|
4
|
+
import { monitorError } from "../../tools/monitor.mjs";
|
|
5
|
+
import { Observable } from "../../tools/observable.mjs";
|
|
6
|
+
import { mockable } from "../../tools/mockable.mjs";
|
|
7
|
+
import { clearInterval, clearTimeout, setInterval, setTimeout } from "../../tools/timer.mjs";
|
|
8
|
+
import { noop, throttle } from "../../tools/utils/functionUtils.mjs";
|
|
9
|
+
import { addEventListener, addEventListeners } from "../../browser/addEventListener.mjs";
|
|
10
|
+
import { addTelemetryMetrics } from "../telemetry/telemetry.mjs";
|
|
11
|
+
import { createValueHistory } from "../../tools/valueHistory.mjs";
|
|
12
|
+
import { isSampled } from "../sampler.mjs";
|
|
13
|
+
import { SESSION_TIME_OUT_DELAY } from "./sessionConstants.mjs";
|
|
14
|
+
import { expandOnly, expandOrRenew, getCreatedDate, getExpireDate, getExpiredSessionState, initializeSession, isSessionInExpiredState } from "./sessionState.mjs";
|
|
15
|
+
import { getSessionStoreStrategy, selectSessionStoreStrategyType } from "./sessionStore.mjs";
|
|
16
|
+
import { ONE_HOUR, ONE_MINUTE, ONE_SECOND, clocksOrigin, dateNow, elapsed, relativeNow, timeStampNow } from "@openobserve/js-core/time";
|
|
17
|
+
//#region src/domain/session/sessionManager.ts
|
|
18
|
+
const VISIBILITY_CHECK_DELAY = ONE_MINUTE;
|
|
19
|
+
const SESSION_CONTEXT_TIMEOUT_DELAY = SESSION_TIME_OUT_DELAY;
|
|
20
|
+
const TRACKED_SESSION_MAX_AGE = ONE_HOUR * 12;
|
|
21
|
+
let stopCallbacks = [];
|
|
22
|
+
async function startSessionManager(configuration, trackingConsentState) {
|
|
23
|
+
const startTime = relativeNow();
|
|
24
|
+
const renewObservable = new Observable();
|
|
25
|
+
const expireObservable = new Observable();
|
|
26
|
+
const sessionStoreStrategyType = await mockable(selectSessionStoreStrategyType)(configuration);
|
|
27
|
+
if (!sessionStoreStrategyType) {
|
|
28
|
+
display.warn("No storage available for session. We will not send any data.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const strategy = mockable(getSessionStoreStrategy)(sessionStoreStrategyType, configuration);
|
|
32
|
+
const sessionContextHistory = createValueHistory({ expireDelay: SESSION_CONTEXT_TIMEOUT_DELAY });
|
|
33
|
+
stopCallbacks.push(() => sessionContextHistory.stop());
|
|
34
|
+
let sessionExpired = false;
|
|
35
|
+
const { throttled: throttledExpandOrRenew, cancel: cancelExpandOrRenew } = throttle(() => {
|
|
36
|
+
sessionExpired = false;
|
|
37
|
+
strategy.setSessionState((state) => expandOrRenew(state, configuration), "expandOrRenewOnActivity").catch(monitorError);
|
|
38
|
+
}, ONE_SECOND);
|
|
39
|
+
stopCallbacks.push(cancelExpandOrRenew);
|
|
40
|
+
let expirationTimeoutId;
|
|
41
|
+
stopCallbacks.push(() => clearTimeout(expirationTimeoutId));
|
|
42
|
+
let stopped = false;
|
|
43
|
+
stopCallbacks.push(() => {
|
|
44
|
+
stopped = true;
|
|
45
|
+
});
|
|
46
|
+
let initialState = await resolveInitialState().catch((error) => monitorError(/* @__PURE__ */ new Error(`Error while resolving initial session state: ${error}`)));
|
|
47
|
+
if (!initialState || stopped) return;
|
|
48
|
+
while (!trackingConsentState.isGranted()) {
|
|
49
|
+
expire();
|
|
50
|
+
await new Promise((resolve) => trackingConsentState.onGrantedOnce(resolve));
|
|
51
|
+
if (stopped) return;
|
|
52
|
+
initialState = await resolveInitialState().catch(monitorError);
|
|
53
|
+
if (!initialState || stopped) return;
|
|
54
|
+
}
|
|
55
|
+
sessionContextHistory.add(buildSessionContext(initialState), clocksOrigin().relative);
|
|
56
|
+
scheduleExpirationTimeout(initialState);
|
|
57
|
+
subscribeToSessionChanges();
|
|
58
|
+
setupSessionTracking();
|
|
59
|
+
addTelemetryMetrics("Session manager init metrics", { metrics: { duration: elapsed(startTime, relativeNow()) } });
|
|
60
|
+
return buildSessionManager();
|
|
61
|
+
async function resolveInitialState() {
|
|
62
|
+
let state = {};
|
|
63
|
+
await strategy.setSessionState((currentState) => {
|
|
64
|
+
state = expandOrRenew(initializeSession(currentState, configuration), configuration);
|
|
65
|
+
return state;
|
|
66
|
+
}, "initialize");
|
|
67
|
+
return state;
|
|
68
|
+
}
|
|
69
|
+
function subscribeToSessionChanges() {
|
|
70
|
+
const subscription = strategy.sessionObservable.subscribe((sessionState) => {
|
|
71
|
+
scheduleExpirationTimeout(sessionState);
|
|
72
|
+
handleStateChange(sessionState);
|
|
73
|
+
});
|
|
74
|
+
stopCallbacks.push(() => subscription.unsubscribe());
|
|
75
|
+
}
|
|
76
|
+
function scheduleExpirationTimeout(state) {
|
|
77
|
+
clearTimeout(expirationTimeoutId);
|
|
78
|
+
const expireDate = getExpireDate(state);
|
|
79
|
+
if (expireDate) expirationTimeoutId = setTimeout(() => {
|
|
80
|
+
strategy.setSessionState((state) => {
|
|
81
|
+
if (isSessionInExpiredState(state)) {
|
|
82
|
+
if (!trackingConsentState.isGranted()) delete state.anonymousId;
|
|
83
|
+
return getExpiredSessionState(state, configuration);
|
|
84
|
+
}
|
|
85
|
+
return state;
|
|
86
|
+
}, "expireOnTimeout").catch(monitorError);
|
|
87
|
+
}, expireDate - dateNow());
|
|
88
|
+
}
|
|
89
|
+
function setupSessionTracking() {
|
|
90
|
+
trackingConsentState.observable.subscribe(() => {
|
|
91
|
+
if (trackingConsentState.isGranted()) {
|
|
92
|
+
sessionExpired = false;
|
|
93
|
+
strategy.setSessionState((state) => expandOrRenew(state, configuration), "expandOrRenewOnConsent").catch(monitorError);
|
|
94
|
+
} else expire();
|
|
95
|
+
});
|
|
96
|
+
if (!isWorkerEnvironment) {
|
|
97
|
+
trackActivity(() => {
|
|
98
|
+
if (trackingConsentState.isGranted()) throttledExpandOrRenew();
|
|
99
|
+
});
|
|
100
|
+
trackVisibility(() => {
|
|
101
|
+
if (!sessionExpired) strategy.setSessionState((state) => expandOnly(state), "expandOnVisibility").catch(monitorError);
|
|
102
|
+
});
|
|
103
|
+
trackResume(() => {
|
|
104
|
+
strategy.setSessionState((state) => initializeSession(state, configuration), "initializeOnResume").catch(monitorError);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function buildSessionManager() {
|
|
109
|
+
return {
|
|
110
|
+
findSession: (startTime, options) => sessionContextHistory.find(startTime, options),
|
|
111
|
+
findTrackedSession: (startTime, options) => {
|
|
112
|
+
const session = sessionContextHistory.find(startTime, options);
|
|
113
|
+
if (!session || session.id === "invalid" || !isSampled(session.id, configuration.sessionSampleRate)) return;
|
|
114
|
+
if (dateNow() - session.createdAt > TRACKED_SESSION_MAX_AGE) return;
|
|
115
|
+
return session;
|
|
116
|
+
},
|
|
117
|
+
renewObservable,
|
|
118
|
+
expireObservable,
|
|
119
|
+
expire,
|
|
120
|
+
updateSessionState: (partialState) => {
|
|
121
|
+
strategy.setSessionState((state) => ({
|
|
122
|
+
...state,
|
|
123
|
+
...partialState
|
|
124
|
+
}), "updateState").catch(monitorError);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function handleStateChange(newState) {
|
|
129
|
+
const previousSession = sessionContextHistory.find();
|
|
130
|
+
const hadSession = previousSession?.id !== void 0;
|
|
131
|
+
const hasSession = newState.id !== void 0;
|
|
132
|
+
const sessionIdChanged = hadSession && hasSession && previousSession.id !== newState.id;
|
|
133
|
+
if (hadSession && (!hasSession || sessionIdChanged)) {
|
|
134
|
+
sessionExpired = true;
|
|
135
|
+
expireObservable.notify();
|
|
136
|
+
sessionContextHistory.closeActive(relativeNow());
|
|
137
|
+
}
|
|
138
|
+
if (hasSession && (!hadSession || sessionIdChanged)) {
|
|
139
|
+
if (sessionExpired) return;
|
|
140
|
+
sessionContextHistory.add(buildSessionContext(newState), relativeNow());
|
|
141
|
+
renewObservable.notify();
|
|
142
|
+
} else if (hadSession && hasSession && !sessionIdChanged) previousSession.isReplayForced = !!newState.forcedReplay;
|
|
143
|
+
}
|
|
144
|
+
function expire() {
|
|
145
|
+
cancelExpandOrRenew();
|
|
146
|
+
const expiredState = getExpiredSessionState(sessionContextHistory.find(), configuration);
|
|
147
|
+
if (!trackingConsentState.isGranted()) delete expiredState.anonymousId;
|
|
148
|
+
handleStateChange(expiredState);
|
|
149
|
+
strategy.setSessionState((state) => {
|
|
150
|
+
if (!trackingConsentState.isGranted()) delete state.anonymousId;
|
|
151
|
+
return getExpiredSessionState(state, configuration);
|
|
152
|
+
}, "expire").catch(monitorError);
|
|
153
|
+
}
|
|
154
|
+
function buildSessionContext(sessionState) {
|
|
155
|
+
const createdAt = getCreatedDate(sessionState) ?? timeStampNow();
|
|
156
|
+
if (!sessionState.id) return {
|
|
157
|
+
id: "invalid",
|
|
158
|
+
isReplayForced: false,
|
|
159
|
+
anonymousId: void 0,
|
|
160
|
+
createdAt
|
|
161
|
+
};
|
|
162
|
+
return {
|
|
163
|
+
id: sessionState.id,
|
|
164
|
+
isReplayForced: !!sessionState.forcedReplay,
|
|
165
|
+
anonymousId: sessionState.anonymousId,
|
|
166
|
+
createdAt
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function startSessionManagerStub() {
|
|
171
|
+
let sessionContext = {
|
|
172
|
+
id: generateUUID(),
|
|
173
|
+
isReplayForced: false,
|
|
174
|
+
anonymousId: void 0,
|
|
175
|
+
createdAt: timeStampNow()
|
|
176
|
+
};
|
|
177
|
+
return Promise.resolve({
|
|
178
|
+
findSession: () => sessionContext,
|
|
179
|
+
findTrackedSession: () => sessionContext,
|
|
180
|
+
renewObservable: new Observable(),
|
|
181
|
+
expireObservable: new Observable(),
|
|
182
|
+
expire: noop,
|
|
183
|
+
updateSessionState: (state) => {
|
|
184
|
+
sessionContext = {
|
|
185
|
+
...sessionContext,
|
|
186
|
+
...state
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function stopSessionManager() {
|
|
192
|
+
stopCallbacks.forEach((e) => e());
|
|
193
|
+
stopCallbacks = [];
|
|
194
|
+
}
|
|
195
|
+
function trackActivity(expandOrRenewSession) {
|
|
196
|
+
const { stop } = addEventListeners(window, [
|
|
197
|
+
"click",
|
|
198
|
+
"touchstart",
|
|
199
|
+
"keydown",
|
|
200
|
+
"scroll"
|
|
201
|
+
], expandOrRenewSession, {
|
|
202
|
+
capture: true,
|
|
203
|
+
passive: true
|
|
204
|
+
});
|
|
205
|
+
stopCallbacks.push(stop);
|
|
206
|
+
}
|
|
207
|
+
function trackVisibility(expandSession) {
|
|
208
|
+
const expandSessionWhenVisible = () => {
|
|
209
|
+
if (document.visibilityState === "visible") expandSession();
|
|
210
|
+
};
|
|
211
|
+
const { stop } = addEventListener(document, "visibilitychange", expandSessionWhenVisible);
|
|
212
|
+
stopCallbacks.push(stop);
|
|
213
|
+
const visibilityCheckInterval = setInterval(expandSessionWhenVisible, VISIBILITY_CHECK_DELAY);
|
|
214
|
+
stopCallbacks.push(() => {
|
|
215
|
+
clearInterval(visibilityCheckInterval);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
function trackResume(cb) {
|
|
219
|
+
const { stop } = addEventListener(window, "resume", cb, { capture: true });
|
|
220
|
+
stopCallbacks.push(stop);
|
|
221
|
+
}
|
|
222
|
+
//#endregion
|
|
223
|
+
export { startSessionManager, startSessionManagerStub, stopSessionManager };
|
|
224
|
+
|
|
225
|
+
//# sourceMappingURL=sessionManager.mjs.map
|
|
@@ -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} from '@openobserve/js-core/time'\nimport type { TimeStamp, RelativeTime } from '@openobserve/js-core/time'\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 { isWorkerEnvironment } from '../../tools/globalObject'\nimport { display } from '../../tools/display'\nimport { isSampled } from '../sampler'\nimport { TelemetryMetrics, addTelemetryMetrics } from '../telemetry'\nimport { monitorError } from '../../tools/monitor'\nimport { SESSION_TIME_OUT_DELAY } from './sessionConstants'\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'\n\nexport interface SessionManager {\n findSession: (startTime?: RelativeTime, options?: { returnInactive: boolean }) => SessionContext | undefined\n findTrackedSession: (startTime?: RelativeTime, options?: { returnInactive: boolean }) => 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\nconst SESSION_CONTEXT_TIMEOUT_DELAY = SESSION_TIME_OUT_DELAY\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 expireDelay: SESSION_CONTEXT_TIMEOUT_DELAY,\n })\n stopCallbacks.push(() => sessionContextHistory.stop())\n\n let sessionExpired = false\n\n const { throttled: throttledExpandOrRenew, cancel: cancelExpandOrRenew } = throttle(() => {\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 if (!trackingConsentState.isGranted()) {\n delete state.anonymousId\n }\n\n return getExpiredSessionState(state, configuration)\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, options) => {\n const session = sessionContextHistory.find(startTime, options)\n\n if (!session || session.id === 'invalid' || !isSampled(session.id, configuration.sessionSampleRate)) {\n return\n }\n\n if (dateNow() - session.createdAt > TRACKED_SESSION_MAX_AGE) {\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(relativeNow())\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 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 if (!trackingConsentState.isGranted()) {\n delete state.anonymousId\n }\n return getExpiredSessionState(state, configuration)\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\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":";;;;;;;;;;;;;;;;;AAsDA,MAAa,yBAAyB;AACtC,MAAM,gCAAgC;AAWtC,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,aAAa,8BACf,CAAC;CACD,cAAc,WAAW,sBAAsB,KAAK,CAAC;CAErD,IAAI,iBAAiB;CAErB,MAAM,EAAE,WAAW,wBAAwB,QAAQ,wBAAwB,eAAe;EACxF,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;GAE/C,QAAQ,cADa,kBAAkB,cAAc,aACpB,GAAG,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,YAEF,sBAAsB,iBAAiB;GACrC,SACG,iBAAiB,UAAU;IAC1B,IAAI,wBAAwB,KAAK,GAAG;KAClC,IAAI,CAAC,qBAAqB,UAAU,GAClC,OAAO,MAAM;KAGf,OAAO,uBAAuB,OAAO,aAAa;IACpD;IAEA,OAAO;GACT,GAAG,iBAAiB,CAAC,CACpB,MAAM,YAAY;EACvB,GAfc,aAAa,QAAQ,CAe3B;CAEZ;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,YAAY;IAC1C,MAAM,UAAU,sBAAsB,KAAK,WAAW,OAAO;IAE7D,IAAI,CAAC,WAAW,QAAQ,OAAO,aAAa,CAAC,UAAU,QAAQ,IAAI,cAAc,iBAAiB,GAChG;IAGF,IAAI,QAAQ,IAAI,QAAQ,YAAY,yBAClC;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,YAAY,CAAC;EACjD;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;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,IAAI,CAAC,qBAAqB,UAAU,GAClC,OAAO,MAAM;GAEf,OAAO,uBAAuB,OAAO,aAAa;EACpD,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;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 { isEmptyObject } from "../../tools/utils/objectUtils.mjs";
|
|
2
|
+
import { generateUUID } from "../../tools/utils/stringUtils.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 "@openobserve/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 && previousSessionState?.anonymousId) expiredSessionState.anonymousId = previousSessionState?.anonymousId;
|
|
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, 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 '@openobserve/js-core/time'\nimport type { TimeStamp } from '@openobserve/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 previousSessionState: { anonymousId?: string } | undefined,\n configuration: Configuration\n): SessionState {\n const expiredSessionState: SessionState = {\n isExpired: EXPIRED,\n }\n if (configuration.trackAnonymousUser && previousSessionState?.anonymousId) {\n expiredSessionState.anonymousId = previousSessionState?.anonymousId\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,uBACd,sBACA,eACc;CACd,MAAM,sBAAoC,EACxC,WAAA,IACF;CACA,IAAI,cAAc,sBAAsB,sBAAsB,aAC5D,oBAAoB,cAAc,sBAAsB;CAG1D,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,46 @@
|
|
|
1
|
+
import { display } from "../../tools/display.mjs";
|
|
2
|
+
import { isWorkerEnvironment } from "../../tools/globalObject.mjs";
|
|
3
|
+
import { SessionPersistence } from "./sessionConstants.mjs";
|
|
4
|
+
import { initCookieStrategy, selectCookieStrategy } from "./storeStrategies/sessionInCookie.mjs";
|
|
5
|
+
import { initLocalStorageStrategy, selectLocalStorageStrategy } from "./storeStrategies/sessionInLocalStorage.mjs";
|
|
6
|
+
import { initMemorySessionStoreStrategy, selectMemorySessionStoreStrategy } from "./storeStrategies/sessionInMemory.mjs";
|
|
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 (Array.isArray(sessionPersistence)) return sessionPersistence;
|
|
22
|
+
if (sessionPersistence !== void 0) return [sessionPersistence];
|
|
23
|
+
if (isWorkerEnvironment) return [SessionPersistence.MEMORY];
|
|
24
|
+
return [SessionPersistence.COOKIE];
|
|
25
|
+
}
|
|
26
|
+
function selectStrategyForPersistence(persistence, configuration) {
|
|
27
|
+
switch (persistence) {
|
|
28
|
+
case SessionPersistence.COOKIE: return selectCookieStrategy(configuration);
|
|
29
|
+
case SessionPersistence.LOCAL_STORAGE: return selectLocalStorageStrategy();
|
|
30
|
+
case SessionPersistence.MEMORY: return selectMemorySessionStoreStrategy();
|
|
31
|
+
default:
|
|
32
|
+
display.error(`Invalid session persistence '${String(persistence)}'`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function getSessionStoreStrategy(sessionStoreStrategyType, configuration) {
|
|
37
|
+
switch (sessionStoreStrategyType.type) {
|
|
38
|
+
case SessionPersistence.COOKIE: return initCookieStrategy(sessionStoreStrategyType, configuration);
|
|
39
|
+
case SessionPersistence.LOCAL_STORAGE: return initLocalStorageStrategy();
|
|
40
|
+
case SessionPersistence.MEMORY: return initMemorySessionStoreStrategy();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { getSessionStoreStrategy, selectSessionStoreStrategyType };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=sessionStore.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.mjs","names":[],"sources":["../../../src/domain/session/sessionStore.ts"],"sourcesContent":["import type { Configuration } from '../configuration'\nimport { isWorkerEnvironment } from '../../tools/globalObject'\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(\n sessionPersistence: SessionPersistence | SessionPersistence[] | undefined\n): SessionPersistence[] {\n if (Array.isArray(sessionPersistence)) {\n return sessionPersistence\n }\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,yBACP,oBACsB;CACtB,IAAI,MAAM,QAAQ,kBAAkB,GAClC,OAAO;CAET,IAAI,uBAAuB,KAAA,GACzB,OAAO,CAAC,kBAAkB;CAM5B,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,97 @@
|
|
|
1
|
+
import { isEmptyObject } from "../../../tools/utils/objectUtils.mjs";
|
|
2
|
+
import { getCookies } from "../../../browser/cookie.mjs";
|
|
3
|
+
import { monitorError } from "../../../tools/monitor.mjs";
|
|
4
|
+
import { Observable } from "../../../tools/observable.mjs";
|
|
5
|
+
import { mockable } from "../../../tools/mockable.mjs";
|
|
6
|
+
import { SESSION_COOKIE_EXPIRATION_DELAY, SESSION_TIME_OUT_DELAY, SessionPersistence } from "../sessionConstants.mjs";
|
|
7
|
+
import { toSessionState, toSessionString } from "../sessionState.mjs";
|
|
8
|
+
import { areCookiesAuthorized, createCookieStoreAccess, createDocumentCookieAccess, isCookieStoreSupported } from "../../../browser/cookieAccess.mjs";
|
|
9
|
+
import { LEGACY_SESSION_STORE_KEY, SESSION_STORE_KEY } from "./sessionStoreStrategy.mjs";
|
|
10
|
+
//#region src/domain/session/storeStrategies/sessionInCookie.ts
|
|
11
|
+
const SESSION_COOKIE_VERSION = 0;
|
|
12
|
+
async function selectCookieStrategy(configuration) {
|
|
13
|
+
const { cookieOptions } = configuration;
|
|
14
|
+
if (!cookieOptions) return;
|
|
15
|
+
if (isCookieStoreSupported() && await areCookiesAuthorized(createCookieStoreAccess, cookieOptions)) return {
|
|
16
|
+
type: SessionPersistence.COOKIE,
|
|
17
|
+
cookieOptions,
|
|
18
|
+
cookieApi: 1
|
|
19
|
+
};
|
|
20
|
+
if (await areCookiesAuthorized(createDocumentCookieAccess, cookieOptions)) return {
|
|
21
|
+
type: SessionPersistence.COOKIE,
|
|
22
|
+
cookieOptions,
|
|
23
|
+
cookieApi: 0
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
let pendingChain;
|
|
27
|
+
function initCookieStrategy(sessionStoreStrategyType, configuration) {
|
|
28
|
+
const { cookieOptions, cookieApi } = sessionStoreStrategyType;
|
|
29
|
+
const sessionObservable = new Observable();
|
|
30
|
+
const trackAnonymousUser = !!configuration.trackAnonymousUser;
|
|
31
|
+
const opts = encodeCookieOptions(cookieOptions);
|
|
32
|
+
const cookieAccess = mockable(createCookieAccess)(cookieApi, cookieOptions);
|
|
33
|
+
let isFirstCall = true;
|
|
34
|
+
cookieAccess.observable.subscribe(() => {
|
|
35
|
+
cookieAccess.getAll().then((cookieValues) => {
|
|
36
|
+
sessionObservable.notify(findMatchingSessionState(cookieValues, opts));
|
|
37
|
+
}).catch((error) => monitorError(/* @__PURE__ */ new Error(`Error while reading session cookies on change: ${error}`)));
|
|
38
|
+
});
|
|
39
|
+
function applyAndWrite(fn) {
|
|
40
|
+
return cookieAccess.getAllAndSet((cookieValues) => {
|
|
41
|
+
let currentState = findMatchingSessionState(cookieValues, opts);
|
|
42
|
+
if (isFirstCall && isEmptyObject(currentState)) currentState = findMatchingSessionState(getCookies(LEGACY_SESSION_STORE_KEY), opts);
|
|
43
|
+
isFirstCall = false;
|
|
44
|
+
return {
|
|
45
|
+
value: buildSessionString(fn(currentState), cookieOptions),
|
|
46
|
+
expireDelay: trackAnonymousUser ? SESSION_COOKIE_EXPIRATION_DELAY : SESSION_TIME_OUT_DELAY
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
async setSessionState(fn, _operation) {
|
|
52
|
+
if (typeof navigator !== "undefined" && navigator.locks) await navigator.locks.request(SESSION_STORE_KEY, () => applyAndWrite(fn)).catch((error) => {
|
|
53
|
+
if (isContextGoingAwayError(error)) return;
|
|
54
|
+
throw error;
|
|
55
|
+
});
|
|
56
|
+
else {
|
|
57
|
+
pendingChain = (pendingChain ?? Promise.resolve()).then(() => applyAndWrite(fn));
|
|
58
|
+
await pendingChain;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
sessionObservable
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function isContextGoingAwayError(error) {
|
|
65
|
+
if (!(error instanceof Error)) return false;
|
|
66
|
+
return error.name === "AbortError" || error.message.includes("no longer runnable");
|
|
67
|
+
}
|
|
68
|
+
function createCookieAccess(cookieApi, cookieOptions) {
|
|
69
|
+
return cookieApi === 1 ? createCookieStoreAccess(SESSION_STORE_KEY, cookieOptions) : createDocumentCookieAccess(SESSION_STORE_KEY, cookieOptions);
|
|
70
|
+
}
|
|
71
|
+
function findMatchingSessionState(items, opts) {
|
|
72
|
+
let sessionState;
|
|
73
|
+
for (const item of items.slice().reverse()) {
|
|
74
|
+
sessionState = toSessionState(item);
|
|
75
|
+
if (sessionState.c === opts) break;
|
|
76
|
+
}
|
|
77
|
+
delete sessionState?.c;
|
|
78
|
+
return sessionState ?? {};
|
|
79
|
+
}
|
|
80
|
+
function buildSessionString(sessionState, cookieOptions) {
|
|
81
|
+
return toSessionString(isEmptyObject(sessionState) ? sessionState : {
|
|
82
|
+
...sessionState,
|
|
83
|
+
c: encodeCookieOptions(cookieOptions)
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function encodeCookieOptions(cookieOptions) {
|
|
87
|
+
const domainCount = cookieOptions.domain ? cookieOptions.domain.split(".").length - 1 : 0;
|
|
88
|
+
let byte = 0;
|
|
89
|
+
byte |= SESSION_COOKIE_VERSION << 5;
|
|
90
|
+
byte |= domainCount << 1;
|
|
91
|
+
byte |= cookieOptions.crossSite ? 1 : 0;
|
|
92
|
+
return byte.toString(16);
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { initCookieStrategy, selectCookieStrategy };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=sessionInCookie.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionInCookie.mjs","names":[],"sources":["../../../../src/domain/session/storeStrategies/sessionInCookie.ts"],"sourcesContent":["import { isEmptyObject } from '../../../tools/utils/objectUtils'\nimport type { CookieOptions } from '../../../browser/cookie'\nimport { getCookies } from '../../../browser/cookie'\nimport type { Configuration } 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 { monitorError } from '../../../tools/monitor'\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 } = 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":";;;;;;;;;;AAyBA,MAAM,yBAAyB;AAE/B,eAAsB,qBACpB,eAC+C;CAC/C,MAAM,EAAE,kBAAkB;CAC1B,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,0BAA0B;CAClC,QAAQ,eAAe;CACvB,QAAQ,cAAc,YAAY,IAAI;CAGtC,OAAO,KAAK,SAAS,EAAE;AACzB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { generateUUID } from "../../../tools/utils/stringUtils.mjs";
|
|
2
|
+
import { Observable } from "../../../tools/observable.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 = "_oo_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 === "_oo_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 = '_oo_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,cAA6B,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,33 @@
|
|
|
1
|
+
import { shallowClone } from "../../../tools/utils/objectUtils.mjs";
|
|
2
|
+
import { globalObject } from "../../../tools/globalObject.mjs";
|
|
3
|
+
import { Observable } from "../../../tools/observable.mjs";
|
|
4
|
+
import { SessionPersistence } from "../sessionConstants.mjs";
|
|
5
|
+
//#region src/domain/session/storeStrategies/sessionInMemory.ts
|
|
6
|
+
const MEMORY_SESSION_STORE_KEY = "_DD_SESSION";
|
|
7
|
+
function selectMemorySessionStoreStrategy() {
|
|
8
|
+
return { type: SessionPersistence.MEMORY };
|
|
9
|
+
}
|
|
10
|
+
function initMemorySessionStoreStrategy() {
|
|
11
|
+
const globalObjectWithSession = globalObject;
|
|
12
|
+
if (!globalObjectWithSession["_DD_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 newState = shallowClone(fn(memorySession.state ?? {}));
|
|
23
|
+
memorySession.state = newState;
|
|
24
|
+
await Promise.resolve();
|
|
25
|
+
memorySession.onChange?.(newState);
|
|
26
|
+
},
|
|
27
|
+
sessionObservable
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { MEMORY_SESSION_STORE_KEY, initMemorySessionStoreStrategy, selectMemorySessionStoreStrategy };
|
|
32
|
+
|
|
33
|
+
//# 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 '../../../tools/globalObject'\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 = '_DD_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,gBACH,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;GAEf,MAAM,WAAW,aAAa,GADT,cAAc,SAAS,CAAC,CACA,CAAC;GAC9C,cAAc,QAAQ;GACtB,MAAM,QAAQ,QAAQ;GACtB,cAAc,WAAW,QAAQ;EACnC;EACA;CACF;AACF"}
|