@kubesense/kubesense-browser-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +3 -0
- package/cjs/boot/displayAlreadyInitializedError.d.ts +2 -0
- package/cjs/boot/displayAlreadyInitializedError.js +10 -0
- package/cjs/boot/displayAlreadyInitializedError.js.map +1 -0
- package/cjs/boot/init.d.ts +13 -0
- package/cjs/boot/init.js +39 -0
- package/cjs/boot/init.js.map +1 -0
- package/cjs/browser/addEventListener.d.ts +87 -0
- package/cjs/browser/addEventListener.js +55 -0
- package/cjs/browser/addEventListener.js.map +1 -0
- package/cjs/browser/browser.types.d.ts +51 -0
- package/cjs/browser/browser.types.js +6 -0
- package/cjs/browser/browser.types.js.map +1 -0
- package/cjs/browser/cookie.d.ts +26 -0
- package/cjs/browser/cookie.js +112 -0
- package/cjs/browser/cookie.js.map +1 -0
- package/cjs/browser/fetchObservable.d.ts +38 -0
- package/cjs/browser/fetchObservable.js +103 -0
- package/cjs/browser/fetchObservable.js.map +1 -0
- package/cjs/browser/pageMayExitObservable.d.ts +14 -0
- package/cjs/browser/pageMayExitObservable.js +45 -0
- package/cjs/browser/pageMayExitObservable.js.map +1 -0
- package/cjs/browser/runOnReadyState.d.ts +5 -0
- package/cjs/browser/runOnReadyState.js +20 -0
- package/cjs/browser/runOnReadyState.js.map +1 -0
- package/cjs/browser/xhrObservable.d.ts +24 -0
- package/cjs/browser/xhrObservable.js +86 -0
- package/cjs/browser/xhrObservable.js.map +1 -0
- package/cjs/domain/allowedTrackingOrigins.d.ts +4 -0
- package/cjs/domain/allowedTrackingOrigins.js +25 -0
- package/cjs/domain/allowedTrackingOrigins.js.map +1 -0
- package/cjs/domain/bufferedData.d.ts +14 -0
- package/cjs/domain/bufferedData.js +22 -0
- package/cjs/domain/bufferedData.js.map +1 -0
- package/cjs/domain/configuration/configuration.d.ts +284 -0
- package/cjs/domain/configuration/configuration.js +135 -0
- package/cjs/domain/configuration/configuration.js.map +1 -0
- package/cjs/domain/configuration/endpointBuilder.d.ts +12 -0
- package/cjs/domain/configuration/endpointBuilder.js +66 -0
- package/cjs/domain/configuration/endpointBuilder.js.map +1 -0
- package/cjs/domain/configuration/index.d.ts +6 -0
- package/cjs/domain/configuration/index.js +31 -0
- package/cjs/domain/configuration/index.js.map +1 -0
- package/cjs/domain/configuration/transportConfiguration.d.ts +21 -0
- package/cjs/domain/configuration/transportConfiguration.js +58 -0
- package/cjs/domain/configuration/transportConfiguration.js.map +1 -0
- package/cjs/domain/connectivity/connectivity.d.ts +14 -0
- package/cjs/domain/connectivity/connectivity.js +14 -0
- package/cjs/domain/connectivity/connectivity.js.map +1 -0
- package/cjs/domain/connectivity/index.d.ts +1 -0
- package/cjs/domain/connectivity/index.js +18 -0
- package/cjs/domain/connectivity/index.js.map +1 -0
- package/cjs/domain/console/consoleObservable.d.ts +21 -0
- package/cjs/domain/console/consoleObservable.js +84 -0
- package/cjs/domain/console/consoleObservable.js.map +1 -0
- package/cjs/domain/context/contextConstants.d.ts +21 -0
- package/cjs/domain/context/contextConstants.js +18 -0
- package/cjs/domain/context/contextConstants.js.map +1 -0
- package/cjs/domain/context/contextManager.d.ts +19 -0
- package/cjs/domain/context/contextManager.js +59 -0
- package/cjs/domain/context/contextManager.js.map +1 -0
- package/cjs/domain/context/contextUtils.d.ts +5 -0
- package/cjs/domain/context/contextUtils.js +16 -0
- package/cjs/domain/context/contextUtils.js.map +1 -0
- package/cjs/domain/context/defineContextMethod.d.ts +6 -0
- package/cjs/domain/context/defineContextMethod.js +21 -0
- package/cjs/domain/context/defineContextMethod.js.map +1 -0
- package/cjs/domain/context/storeContextManager.d.ts +6 -0
- package/cjs/domain/context/storeContextManager.js +40 -0
- package/cjs/domain/context/storeContextManager.js.map +1 -0
- package/cjs/domain/contexts/accountContext.d.ts +26 -0
- package/cjs/domain/contexts/accountContext.js +33 -0
- package/cjs/domain/contexts/accountContext.js.map +1 -0
- package/cjs/domain/contexts/globalContext.d.ts +18 -0
- package/cjs/domain/contexts/globalContext.js +21 -0
- package/cjs/domain/contexts/globalContext.js.map +1 -0
- package/cjs/domain/contexts/rumInternalContext.type.d.ts +14 -0
- package/cjs/domain/contexts/rumInternalContext.type.js +3 -0
- package/cjs/domain/contexts/rumInternalContext.type.js.map +1 -0
- package/cjs/domain/contexts/userContext.d.ts +31 -0
- package/cjs/domain/contexts/userContext.js +120 -0
- package/cjs/domain/contexts/userContext.js.map +1 -0
- package/cjs/domain/deflate/deflate.types.d.ts +40 -0
- package/cjs/domain/deflate/deflate.types.js +3 -0
- package/cjs/domain/deflate/deflate.types.js.map +1 -0
- package/cjs/domain/deflate/index.d.ts +1 -0
- package/cjs/domain/deflate/index.js +18 -0
- package/cjs/domain/deflate/index.js.map +1 -0
- package/cjs/domain/error/error.d.ts +23 -0
- package/cjs/domain/error/error.js +81 -0
- package/cjs/domain/error/error.js.map +1 -0
- package/cjs/domain/error/error.types.d.ts +47 -0
- package/cjs/domain/error/error.types.js +13 -0
- package/cjs/domain/error/error.types.js.map +1 -0
- package/cjs/domain/error/trackRuntimeError.d.ts +11 -0
- package/cjs/domain/error/trackRuntimeError.js +48 -0
- package/cjs/domain/error/trackRuntimeError.js.map +1 -0
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.d.ts +5 -0
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.js +41 -0
- package/cjs/domain/eventRateLimiter/createEventRateLimiter.js.map +1 -0
- package/cjs/domain/extension/extensionUtils.d.ts +10 -0
- package/cjs/domain/extension/extensionUtils.js +30 -0
- package/cjs/domain/extension/extensionUtils.js.map +1 -0
- package/cjs/domain/intakeSites.d.ts +4 -0
- package/cjs/domain/intakeSites.js +7 -0
- package/cjs/domain/intakeSites.js.map +1 -0
- package/cjs/domain/report/browser.types.d.ts +34 -0
- package/cjs/domain/report/browser.types.js +3 -0
- package/cjs/domain/report/browser.types.js.map +1 -0
- package/cjs/domain/report/reportObservable.d.ts +14 -0
- package/cjs/domain/report/reportObservable.js +99 -0
- package/cjs/domain/report/reportObservable.js.map +1 -0
- package/cjs/domain/resourceUtils.d.ts +18 -0
- package/cjs/domain/resourceUtils.js +20 -0
- package/cjs/domain/resourceUtils.js.map +1 -0
- package/cjs/domain/session/oldCookiesMigration.d.ts +11 -0
- package/cjs/domain/session/oldCookiesMigration.js +40 -0
- package/cjs/domain/session/oldCookiesMigration.js.map +1 -0
- package/cjs/domain/session/sessionConstants.d.ts +15 -0
- package/cjs/domain/session/sessionConstants.js +16 -0
- package/cjs/domain/session/sessionConstants.js.map +1 -0
- package/cjs/domain/session/sessionManager.d.ts +28 -0
- package/cjs/domain/session/sessionManager.js +201 -0
- package/cjs/domain/session/sessionManager.js.map +1 -0
- package/cjs/domain/session/sessionState.d.ts +16 -0
- package/cjs/domain/session/sessionState.js +70 -0
- package/cjs/domain/session/sessionState.js.map +1 -0
- package/cjs/domain/session/sessionStateValidation.d.ts +3 -0
- package/cjs/domain/session/sessionStateValidation.js +11 -0
- package/cjs/domain/session/sessionStateValidation.js.map +1 -0
- package/cjs/domain/session/sessionStore.d.ts +38 -0
- package/cjs/domain/session/sessionStore.js +186 -0
- package/cjs/domain/session/sessionStore.js.map +1 -0
- package/cjs/domain/session/sessionStoreOperations.d.ts +12 -0
- package/cjs/domain/session/sessionStoreOperations.js +119 -0
- package/cjs/domain/session/sessionStoreOperations.js.map +1 -0
- package/cjs/domain/session/storeStrategies/sessionInCookie.d.ts +12 -0
- package/cjs/domain/session/storeStrategies/sessionInCookie.js +104 -0
- package/cjs/domain/session/storeStrategies/sessionInCookie.js.map +1 -0
- package/cjs/domain/session/storeStrategies/sessionInLocalStorage.d.ts +6 -0
- package/cjs/domain/session/storeStrategies/sessionInLocalStorage.js +42 -0
- package/cjs/domain/session/storeStrategies/sessionInLocalStorage.js.map +1 -0
- package/cjs/domain/session/storeStrategies/sessionStoreStrategy.d.ts +16 -0
- package/cjs/domain/session/storeStrategies/sessionStoreStrategy.js +5 -0
- package/cjs/domain/session/storeStrategies/sessionStoreStrategy.js.map +1 -0
- package/cjs/domain/synthetics/syntheticsWorkerValues.d.ts +12 -0
- package/cjs/domain/synthetics/syntheticsWorkerValues.js +31 -0
- package/cjs/domain/synthetics/syntheticsWorkerValues.js.map +1 -0
- package/cjs/domain/tags.d.ts +6 -0
- package/cjs/domain/tags.js +66 -0
- package/cjs/domain/tags.js.map +1 -0
- package/cjs/domain/telemetry/index.d.ts +4 -0
- package/cjs/domain/telemetry/index.js +28 -0
- package/cjs/domain/telemetry/index.js.map +1 -0
- package/cjs/domain/telemetry/rawTelemetryEvent.types.d.ts +18 -0
- package/cjs/domain/telemetry/rawTelemetryEvent.types.js +9 -0
- package/cjs/domain/telemetry/rawTelemetryEvent.types.js.map +1 -0
- package/cjs/domain/telemetry/telemetry.d.ts +56 -0
- package/cjs/domain/telemetry/telemetry.js +245 -0
- package/cjs/domain/telemetry/telemetry.js.map +1 -0
- package/cjs/domain/telemetry/telemetryEvent.types.d.ts +866 -0
- package/cjs/domain/telemetry/telemetryEvent.types.js +7 -0
- package/cjs/domain/telemetry/telemetryEvent.types.js.map +1 -0
- package/cjs/domain/trackingConsent.d.ts +13 -0
- package/cjs/domain/trackingConsent.js +28 -0
- package/cjs/domain/trackingConsent.js.map +1 -0
- package/cjs/domain/userAgentData/index.d.ts +1 -0
- package/cjs/domain/userAgentData/index.js +18 -0
- package/cjs/domain/userAgentData/index.js.map +1 -0
- package/cjs/domain/userAgentData/userAgentData.d.ts +22 -0
- package/cjs/domain/userAgentData/userAgentData.js +109 -0
- package/cjs/domain/userAgentData/userAgentData.js.map +1 -0
- package/cjs/index.d.ts +101 -0
- package/cjs/index.js +199 -0
- package/cjs/index.js.map +1 -0
- package/cjs/tools/abstractHooks.d.ts +24 -0
- package/cjs/tools/abstractHooks.js +41 -0
- package/cjs/tools/abstractHooks.js.map +1 -0
- package/cjs/tools/abstractLifeCycle.d.ts +23 -0
- package/cjs/tools/abstractLifeCycle.js +28 -0
- package/cjs/tools/abstractLifeCycle.js.map +1 -0
- package/cjs/tools/boundedBuffer.d.ts +16 -0
- package/cjs/tools/boundedBuffer.js +32 -0
- package/cjs/tools/boundedBuffer.js.map +1 -0
- package/cjs/tools/catchUserErrors.d.ts +1 -0
- package/cjs/tools/catchUserErrors.js +15 -0
- package/cjs/tools/catchUserErrors.js.map +1 -0
- package/cjs/tools/display.d.ts +38 -0
- package/cjs/tools/display.js +44 -0
- package/cjs/tools/display.js.map +1 -0
- package/cjs/tools/encoder.d.ts +54 -0
- package/cjs/tools/encoder.js +40 -0
- package/cjs/tools/encoder.js.map +1 -0
- package/cjs/tools/experimentalFeatures.d.ts +21 -0
- package/cjs/tools/experimentalFeatures.js +50 -0
- package/cjs/tools/experimentalFeatures.js.map +1 -0
- package/cjs/tools/getZoneJsOriginalValue.d.ts +19 -0
- package/cjs/tools/getZoneJsOriginalValue.js +29 -0
- package/cjs/tools/getZoneJsOriginalValue.js.map +1 -0
- package/cjs/tools/globalObject.d.ts +19 -0
- package/cjs/tools/globalObject.js +44 -0
- package/cjs/tools/globalObject.js.map +1 -0
- package/cjs/tools/instrumentMethod.d.ts +75 -0
- package/cjs/tools/instrumentMethod.js +118 -0
- package/cjs/tools/instrumentMethod.js.map +1 -0
- package/cjs/tools/matchOption.d.ts +8 -0
- package/cjs/tools/matchOption.js +35 -0
- package/cjs/tools/matchOption.js.map +1 -0
- package/cjs/tools/mergeInto.d.ts +25 -0
- package/cjs/tools/mergeInto.js +98 -0
- package/cjs/tools/mergeInto.js.map +1 -0
- package/cjs/tools/monitor.d.ts +9 -0
- package/cjs/tools/monitor.js +61 -0
- package/cjs/tools/monitor.js.map +1 -0
- package/cjs/tools/observable.d.ts +30 -0
- package/cjs/tools/observable.js +89 -0
- package/cjs/tools/observable.js.map +1 -0
- package/cjs/tools/queueMicrotask.d.ts +1 -0
- package/cjs/tools/queueMicrotask.js +17 -0
- package/cjs/tools/queueMicrotask.js.map +1 -0
- package/cjs/tools/readBytesFromStream.d.ts +10 -0
- package/cjs/tools/readBytesFromStream.js +28 -0
- package/cjs/tools/readBytesFromStream.js.map +1 -0
- package/cjs/tools/requestIdleCallback.d.ts +12 -0
- package/cjs/tools/requestIdleCallback.js +35 -0
- package/cjs/tools/requestIdleCallback.js.map +1 -0
- package/cjs/tools/sendToExtension.d.ts +3 -0
- package/cjs/tools/sendToExtension.js +11 -0
- package/cjs/tools/sendToExtension.js.map +1 -0
- package/cjs/tools/serialisation/context.d.ts +9 -0
- package/cjs/tools/serialisation/context.js +3 -0
- package/cjs/tools/serialisation/context.js.map +1 -0
- package/cjs/tools/serialisation/jsonStringify.d.ts +13 -0
- package/cjs/tools/serialisation/jsonStringify.js +48 -0
- package/cjs/tools/serialisation/jsonStringify.js.map +1 -0
- package/cjs/tools/serialisation/sanitize.d.ts +18 -0
- package/cjs/tools/serialisation/sanitize.js +188 -0
- package/cjs/tools/serialisation/sanitize.js.map +1 -0
- package/cjs/tools/stackTrace/computeStackTrace.d.ts +25 -0
- package/cjs/tools/stackTrace/computeStackTrace.js +187 -0
- package/cjs/tools/stackTrace/computeStackTrace.js.map +1 -0
- package/cjs/tools/stackTrace/handlingStack.d.ts +10 -0
- package/cjs/tools/stackTrace/handlingStack.js +46 -0
- package/cjs/tools/stackTrace/handlingStack.js.map +1 -0
- package/cjs/tools/taskQueue.d.ts +15 -0
- package/cjs/tools/taskQueue.js +54 -0
- package/cjs/tools/taskQueue.js.map +1 -0
- package/cjs/tools/timer.d.ts +5 -0
- package/cjs/tools/timer.js +22 -0
- package/cjs/tools/timer.js.map +1 -0
- package/cjs/tools/utils/arrayUtils.d.ts +3 -0
- package/cjs/tools/utils/arrayUtils.js +20 -0
- package/cjs/tools/utils/arrayUtils.js.map +1 -0
- package/cjs/tools/utils/browserDetection.d.ts +8 -0
- package/cjs/tools/utils/browserDetection.js +33 -0
- package/cjs/tools/utils/browserDetection.js.map +1 -0
- package/cjs/tools/utils/byteUtils.d.ts +8 -0
- package/cjs/tools/utils/byteUtils.js +34 -0
- package/cjs/tools/utils/byteUtils.js.map +1 -0
- package/cjs/tools/utils/functionUtils.d.ts +8 -0
- package/cjs/tools/utils/functionUtils.js +43 -0
- package/cjs/tools/utils/functionUtils.js.map +1 -0
- package/cjs/tools/utils/numberUtils.d.ts +8 -0
- package/cjs/tools/utils/numberUtils.js +23 -0
- package/cjs/tools/utils/numberUtils.js.map +1 -0
- package/cjs/tools/utils/objectUtils.d.ts +10 -0
- package/cjs/tools/utils/objectUtils.js +23 -0
- package/cjs/tools/utils/objectUtils.js.map +1 -0
- package/cjs/tools/utils/polyfills.d.ts +7 -0
- package/cjs/tools/utils/polyfills.js +23 -0
- package/cjs/tools/utils/polyfills.js.map +1 -0
- package/cjs/tools/utils/responseUtils.d.ts +2 -0
- package/cjs/tools/utils/responseUtils.js +17 -0
- package/cjs/tools/utils/responseUtils.js.map +1 -0
- package/cjs/tools/utils/stringUtils.d.ts +23 -0
- package/cjs/tools/utils/stringUtils.js +91 -0
- package/cjs/tools/utils/stringUtils.js.map +1 -0
- package/cjs/tools/utils/timeUtils.d.ts +53 -0
- package/cjs/tools/utils/timeUtils.js +101 -0
- package/cjs/tools/utils/timeUtils.js.map +1 -0
- package/cjs/tools/utils/timezone.d.ts +1 -0
- package/cjs/tools/utils/timezone.js +13 -0
- package/cjs/tools/utils/timezone.js.map +1 -0
- package/cjs/tools/utils/typeUtils.d.ts +4 -0
- package/cjs/tools/utils/typeUtils.js +16 -0
- package/cjs/tools/utils/typeUtils.js.map +1 -0
- package/cjs/tools/utils/urlPolyfill.d.ts +5 -0
- package/cjs/tools/utils/urlPolyfill.js +59 -0
- package/cjs/tools/utils/urlPolyfill.js.map +1 -0
- package/cjs/tools/valueHistory.d.ts +27 -0
- package/cjs/tools/valueHistory.js +104 -0
- package/cjs/tools/valueHistory.js.map +1 -0
- package/cjs/transport/batch.d.ts +16 -0
- package/cjs/transport/batch.js +110 -0
- package/cjs/transport/batch.js.map +1 -0
- package/cjs/transport/eventBridge.d.ts +21 -0
- package/cjs/transport/eventBridge.js +46 -0
- package/cjs/transport/eventBridge.js.map +1 -0
- package/cjs/transport/flushController.d.ts +65 -0
- package/cjs/transport/flushController.js +123 -0
- package/cjs/transport/flushController.js.map +1 -0
- package/cjs/transport/httpRequest.d.ts +57 -0
- package/cjs/transport/httpRequest.js +107 -0
- package/cjs/transport/httpRequest.js.map +1 -0
- package/cjs/transport/index.d.ts +7 -0
- package/cjs/transport/index.js +15 -0
- package/cjs/transport/index.js.map +1 -0
- package/cjs/transport/sendWithRetryStrategy.d.ts +41 -0
- package/cjs/transport/sendWithRetryStrategy.js +163 -0
- package/cjs/transport/sendWithRetryStrategy.js.map +1 -0
- package/esm/boot/displayAlreadyInitializedError.d.ts +2 -0
- package/esm/boot/displayAlreadyInitializedError.js +7 -0
- package/esm/boot/displayAlreadyInitializedError.js.map +1 -0
- package/esm/boot/init.d.ts +13 -0
- package/esm/boot/init.js +35 -0
- package/esm/boot/init.js.map +1 -0
- package/esm/browser/addEventListener.d.ts +87 -0
- package/esm/browser/addEventListener.js +51 -0
- package/esm/browser/addEventListener.js.map +1 -0
- package/esm/browser/browser.types.d.ts +51 -0
- package/esm/browser/browser.types.js +5 -0
- package/esm/browser/browser.types.js.map +1 -0
- package/esm/browser/cookie.d.ts +26 -0
- package/esm/browser/cookie.js +101 -0
- package/esm/browser/cookie.js.map +1 -0
- package/esm/browser/fetchObservable.d.ts +38 -0
- package/esm/browser/fetchObservable.js +99 -0
- package/esm/browser/fetchObservable.js.map +1 -0
- package/esm/browser/pageMayExitObservable.d.ts +14 -0
- package/esm/browser/pageMayExitObservable.js +40 -0
- package/esm/browser/pageMayExitObservable.js.map +1 -0
- package/esm/browser/runOnReadyState.d.ts +5 -0
- package/esm/browser/runOnReadyState.js +16 -0
- package/esm/browser/runOnReadyState.js.map +1 -0
- package/esm/browser/xhrObservable.d.ts +24 -0
- package/esm/browser/xhrObservable.js +83 -0
- package/esm/browser/xhrObservable.js.map +1 -0
- package/esm/domain/allowedTrackingOrigins.d.ts +4 -0
- package/esm/domain/allowedTrackingOrigins.js +21 -0
- package/esm/domain/allowedTrackingOrigins.js.map +1 -0
- package/esm/domain/bufferedData.d.ts +14 -0
- package/esm/domain/bufferedData.js +19 -0
- package/esm/domain/bufferedData.js.map +1 -0
- package/esm/domain/configuration/configuration.d.ts +284 -0
- package/esm/domain/configuration/configuration.js +129 -0
- package/esm/domain/configuration/configuration.js.map +1 -0
- package/esm/domain/configuration/endpointBuilder.d.ts +12 -0
- package/esm/domain/configuration/endpointBuilder.js +62 -0
- package/esm/domain/configuration/endpointBuilder.js.map +1 -0
- package/esm/domain/configuration/index.d.ts +6 -0
- package/esm/domain/configuration/index.js +5 -0
- package/esm/domain/configuration/index.js.map +1 -0
- package/esm/domain/configuration/transportConfiguration.d.ts +21 -0
- package/esm/domain/configuration/transportConfiguration.js +54 -0
- package/esm/domain/configuration/transportConfiguration.js.map +1 -0
- package/esm/domain/connectivity/connectivity.d.ts +14 -0
- package/esm/domain/connectivity/connectivity.js +11 -0
- package/esm/domain/connectivity/connectivity.js.map +1 -0
- package/esm/domain/connectivity/index.d.ts +1 -0
- package/esm/domain/connectivity/index.js +2 -0
- package/esm/domain/connectivity/index.js.map +1 -0
- package/esm/domain/console/consoleObservable.d.ts +21 -0
- package/esm/domain/console/consoleObservable.js +80 -0
- package/esm/domain/console/consoleObservable.js.map +1 -0
- package/esm/domain/context/contextConstants.d.ts +21 -0
- package/esm/domain/context/contextConstants.js +15 -0
- package/esm/domain/context/contextConstants.js.map +1 -0
- package/esm/domain/context/contextManager.d.ts +19 -0
- package/esm/domain/context/contextManager.js +56 -0
- package/esm/domain/context/contextManager.js.map +1 -0
- package/esm/domain/context/contextUtils.d.ts +5 -0
- package/esm/domain/context/contextUtils.js +13 -0
- package/esm/domain/context/contextUtils.js.map +1 -0
- package/esm/domain/context/defineContextMethod.d.ts +6 -0
- package/esm/domain/context/defineContextMethod.js +17 -0
- package/esm/domain/context/defineContextMethod.js.map +1 -0
- package/esm/domain/context/storeContextManager.d.ts +6 -0
- package/esm/domain/context/storeContextManager.js +35 -0
- package/esm/domain/context/storeContextManager.js.map +1 -0
- package/esm/domain/contexts/accountContext.d.ts +26 -0
- package/esm/domain/contexts/accountContext.js +29 -0
- package/esm/domain/contexts/accountContext.js.map +1 -0
- package/esm/domain/contexts/globalContext.d.ts +18 -0
- package/esm/domain/contexts/globalContext.js +17 -0
- package/esm/domain/contexts/globalContext.js.map +1 -0
- package/esm/domain/contexts/rumInternalContext.type.d.ts +14 -0
- package/esm/domain/contexts/rumInternalContext.type.js +2 -0
- package/esm/domain/contexts/rumInternalContext.type.js.map +1 -0
- package/esm/domain/contexts/userContext.d.ts +31 -0
- package/esm/domain/contexts/userContext.js +116 -0
- package/esm/domain/contexts/userContext.js.map +1 -0
- package/esm/domain/deflate/deflate.types.d.ts +40 -0
- package/esm/domain/deflate/deflate.types.js +2 -0
- package/esm/domain/deflate/deflate.types.js.map +1 -0
- package/esm/domain/deflate/index.d.ts +1 -0
- package/esm/domain/deflate/index.js +2 -0
- package/esm/domain/deflate/index.js.map +1 -0
- package/esm/domain/error/error.d.ts +23 -0
- package/esm/domain/error/error.js +72 -0
- package/esm/domain/error/error.js.map +1 -0
- package/esm/domain/error/error.types.d.ts +47 -0
- package/esm/domain/error/error.types.js +10 -0
- package/esm/domain/error/error.types.js.map +1 -0
- package/esm/domain/error/trackRuntimeError.d.ts +11 -0
- package/esm/domain/error/trackRuntimeError.js +43 -0
- package/esm/domain/error/trackRuntimeError.js.map +1 -0
- package/esm/domain/eventRateLimiter/createEventRateLimiter.d.ts +5 -0
- package/esm/domain/eventRateLimiter/createEventRateLimiter.js +38 -0
- package/esm/domain/eventRateLimiter/createEventRateLimiter.js.map +1 -0
- package/esm/domain/extension/extensionUtils.d.ts +10 -0
- package/esm/domain/extension/extensionUtils.js +25 -0
- package/esm/domain/extension/extensionUtils.js.map +1 -0
- package/esm/domain/intakeSites.d.ts +4 -0
- package/esm/domain/intakeSites.js +4 -0
- package/esm/domain/intakeSites.js.map +1 -0
- package/esm/domain/report/browser.types.d.ts +34 -0
- package/esm/domain/report/browser.types.js +2 -0
- package/esm/domain/report/browser.types.js.map +1 -0
- package/esm/domain/report/reportObservable.d.ts +14 -0
- package/esm/domain/report/reportObservable.js +95 -0
- package/esm/domain/report/reportObservable.js.map +1 -0
- package/esm/domain/resourceUtils.d.ts +18 -0
- package/esm/domain/resourceUtils.js +17 -0
- package/esm/domain/resourceUtils.js.map +1 -0
- package/esm/domain/session/oldCookiesMigration.d.ts +11 -0
- package/esm/domain/session/oldCookiesMigration.js +36 -0
- package/esm/domain/session/oldCookiesMigration.js.map +1 -0
- package/esm/domain/session/sessionConstants.d.ts +15 -0
- package/esm/domain/session/sessionConstants.js +13 -0
- package/esm/domain/session/sessionConstants.js.map +1 -0
- package/esm/domain/session/sessionManager.d.ts +28 -0
- package/esm/domain/session/sessionManager.js +196 -0
- package/esm/domain/session/sessionManager.js.map +1 -0
- package/esm/domain/session/sessionState.d.ts +16 -0
- package/esm/domain/session/sessionState.js +60 -0
- package/esm/domain/session/sessionState.js.map +1 -0
- package/esm/domain/session/sessionStateValidation.d.ts +3 -0
- package/esm/domain/session/sessionStateValidation.js +7 -0
- package/esm/domain/session/sessionStateValidation.js.map +1 -0
- package/esm/domain/session/sessionStore.d.ts +38 -0
- package/esm/domain/session/sessionStore.js +180 -0
- package/esm/domain/session/sessionStore.js.map +1 -0
- package/esm/domain/session/sessionStoreOperations.d.ts +12 -0
- package/esm/domain/session/sessionStoreOperations.js +114 -0
- package/esm/domain/session/sessionStoreOperations.js.map +1 -0
- package/esm/domain/session/storeStrategies/sessionInCookie.d.ts +12 -0
- package/esm/domain/session/storeStrategies/sessionInCookie.js +98 -0
- package/esm/domain/session/storeStrategies/sessionInCookie.js.map +1 -0
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.d.ts +6 -0
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.js +37 -0
- package/esm/domain/session/storeStrategies/sessionInLocalStorage.js.map +1 -0
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.d.ts +16 -0
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.js +2 -0
- package/esm/domain/session/storeStrategies/sessionStoreStrategy.js.map +1 -0
- package/esm/domain/synthetics/syntheticsWorkerValues.d.ts +12 -0
- package/esm/domain/synthetics/syntheticsWorkerValues.js +24 -0
- package/esm/domain/synthetics/syntheticsWorkerValues.js.map +1 -0
- package/esm/domain/tags.d.ts +6 -0
- package/esm/domain/tags.js +59 -0
- package/esm/domain/tags.js.map +1 -0
- package/esm/domain/telemetry/index.d.ts +4 -0
- package/esm/domain/telemetry/index.js +3 -0
- package/esm/domain/telemetry/index.js.map +1 -0
- package/esm/domain/telemetry/rawTelemetryEvent.types.d.ts +18 -0
- package/esm/domain/telemetry/rawTelemetryEvent.types.js +6 -0
- package/esm/domain/telemetry/rawTelemetryEvent.types.js.map +1 -0
- package/esm/domain/telemetry/telemetry.d.ts +56 -0
- package/esm/domain/telemetry/telemetry.js +232 -0
- package/esm/domain/telemetry/telemetry.js.map +1 -0
- package/esm/domain/telemetry/telemetryEvent.types.d.ts +866 -0
- package/esm/domain/telemetry/telemetryEvent.types.js +6 -0
- package/esm/domain/telemetry/telemetryEvent.types.js.map +1 -0
- package/esm/domain/trackingConsent.d.ts +13 -0
- package/esm/domain/trackingConsent.js +24 -0
- package/esm/domain/trackingConsent.js.map +1 -0
- package/esm/domain/userAgentData/index.d.ts +1 -0
- package/esm/domain/userAgentData/index.js +2 -0
- package/esm/domain/userAgentData/index.js.map +1 -0
- package/esm/domain/userAgentData/userAgentData.d.ts +22 -0
- package/esm/domain/userAgentData/userAgentData.js +105 -0
- package/esm/domain/userAgentData/userAgentData.js.map +1 -0
- package/esm/index.d.ts +101 -0
- package/esm/index.js +77 -0
- package/esm/index.js.map +1 -0
- package/esm/tools/abstractHooks.d.ts +24 -0
- package/esm/tools/abstractHooks.js +37 -0
- package/esm/tools/abstractHooks.js.map +1 -0
- package/esm/tools/abstractLifeCycle.d.ts +23 -0
- package/esm/tools/abstractLifeCycle.js +24 -0
- package/esm/tools/abstractLifeCycle.js.map +1 -0
- package/esm/tools/boundedBuffer.d.ts +16 -0
- package/esm/tools/boundedBuffer.js +29 -0
- package/esm/tools/boundedBuffer.js.map +1 -0
- package/esm/tools/catchUserErrors.d.ts +1 -0
- package/esm/tools/catchUserErrors.js +12 -0
- package/esm/tools/catchUserErrors.js.map +1 -0
- package/esm/tools/display.d.ts +38 -0
- package/esm/tools/display.js +41 -0
- package/esm/tools/display.js.map +1 -0
- package/esm/tools/encoder.d.ts +54 -0
- package/esm/tools/encoder.js +37 -0
- package/esm/tools/encoder.js.map +1 -0
- package/esm/tools/experimentalFeatures.d.ts +21 -0
- package/esm/tools/experimentalFeatures.js +42 -0
- package/esm/tools/experimentalFeatures.js.map +1 -0
- package/esm/tools/getZoneJsOriginalValue.d.ts +19 -0
- package/esm/tools/getZoneJsOriginalValue.js +26 -0
- package/esm/tools/getZoneJsOriginalValue.js.map +1 -0
- package/esm/tools/globalObject.d.ts +19 -0
- package/esm/tools/globalObject.js +40 -0
- package/esm/tools/globalObject.js.map +1 -0
- package/esm/tools/instrumentMethod.d.ts +75 -0
- package/esm/tools/instrumentMethod.js +114 -0
- package/esm/tools/instrumentMethod.js.map +1 -0
- package/esm/tools/matchOption.d.ts +8 -0
- package/esm/tools/matchOption.js +31 -0
- package/esm/tools/matchOption.js.map +1 -0
- package/esm/tools/mergeInto.d.ts +25 -0
- package/esm/tools/mergeInto.js +93 -0
- package/esm/tools/mergeInto.js.map +1 -0
- package/esm/tools/monitor.d.ts +9 -0
- package/esm/tools/monitor.js +51 -0
- package/esm/tools/monitor.js.map +1 -0
- package/esm/tools/observable.d.ts +30 -0
- package/esm/tools/observable.js +83 -0
- package/esm/tools/observable.js.map +1 -0
- package/esm/tools/queueMicrotask.d.ts +1 -0
- package/esm/tools/queueMicrotask.js +14 -0
- package/esm/tools/queueMicrotask.js.map +1 -0
- package/esm/tools/readBytesFromStream.d.ts +10 -0
- package/esm/tools/readBytesFromStream.js +25 -0
- package/esm/tools/readBytesFromStream.js.map +1 -0
- package/esm/tools/requestIdleCallback.d.ts +12 -0
- package/esm/tools/requestIdleCallback.js +30 -0
- package/esm/tools/requestIdleCallback.js.map +1 -0
- package/esm/tools/sendToExtension.d.ts +3 -0
- package/esm/tools/sendToExtension.js +8 -0
- package/esm/tools/sendToExtension.js.map +1 -0
- package/esm/tools/serialisation/context.d.ts +9 -0
- package/esm/tools/serialisation/context.js +2 -0
- package/esm/tools/serialisation/context.js.map +1 -0
- package/esm/tools/serialisation/jsonStringify.d.ts +13 -0
- package/esm/tools/serialisation/jsonStringify.js +44 -0
- package/esm/tools/serialisation/jsonStringify.js.map +1 -0
- package/esm/tools/serialisation/sanitize.d.ts +18 -0
- package/esm/tools/serialisation/sanitize.js +185 -0
- package/esm/tools/serialisation/sanitize.js.map +1 -0
- package/esm/tools/stackTrace/computeStackTrace.d.ts +25 -0
- package/esm/tools/stackTrace/computeStackTrace.js +183 -0
- package/esm/tools/stackTrace/computeStackTrace.js.map +1 -0
- package/esm/tools/stackTrace/handlingStack.d.ts +10 -0
- package/esm/tools/stackTrace/handlingStack.js +41 -0
- package/esm/tools/stackTrace/handlingStack.js.map +1 -0
- package/esm/tools/taskQueue.d.ts +15 -0
- package/esm/tools/taskQueue.js +50 -0
- package/esm/tools/taskQueue.js.map +1 -0
- package/esm/tools/timer.d.ts +5 -0
- package/esm/tools/timer.js +16 -0
- package/esm/tools/timer.js.map +1 -0
- package/esm/tools/utils/arrayUtils.d.ts +3 -0
- package/esm/tools/utils/arrayUtils.js +15 -0
- package/esm/tools/utils/arrayUtils.js.map +1 -0
- package/esm/tools/utils/browserDetection.d.ts +8 -0
- package/esm/tools/utils/browserDetection.js +28 -0
- package/esm/tools/utils/browserDetection.js.map +1 -0
- package/esm/tools/utils/byteUtils.d.ts +8 -0
- package/esm/tools/utils/byteUtils.js +29 -0
- package/esm/tools/utils/byteUtils.js.map +1 -0
- package/esm/tools/utils/functionUtils.d.ts +8 -0
- package/esm/tools/utils/functionUtils.js +39 -0
- package/esm/tools/utils/functionUtils.js.map +1 -0
- package/esm/tools/utils/numberUtils.d.ts +8 -0
- package/esm/tools/utils/numberUtils.js +17 -0
- package/esm/tools/utils/numberUtils.js.map +1 -0
- package/esm/tools/utils/objectUtils.d.ts +10 -0
- package/esm/tools/utils/objectUtils.js +17 -0
- package/esm/tools/utils/objectUtils.js.map +1 -0
- package/esm/tools/utils/polyfills.d.ts +7 -0
- package/esm/tools/utils/polyfills.js +18 -0
- package/esm/tools/utils/polyfills.js.map +1 -0
- package/esm/tools/utils/responseUtils.d.ts +2 -0
- package/esm/tools/utils/responseUtils.js +13 -0
- package/esm/tools/utils/responseUtils.js.map +1 -0
- package/esm/tools/utils/stringUtils.d.ts +23 -0
- package/esm/tools/utils/stringUtils.js +84 -0
- package/esm/tools/utils/stringUtils.js.map +1 -0
- package/esm/tools/utils/timeUtils.d.ts +53 -0
- package/esm/tools/utils/timeUtils.js +84 -0
- package/esm/tools/utils/timeUtils.js.map +1 -0
- package/esm/tools/utils/timezone.d.ts +1 -0
- package/esm/tools/utils/timezone.js +10 -0
- package/esm/tools/utils/timezone.js.map +1 -0
- package/esm/tools/utils/typeUtils.d.ts +4 -0
- package/esm/tools/utils/typeUtils.js +13 -0
- package/esm/tools/utils/typeUtils.js.map +1 -0
- package/esm/tools/utils/urlPolyfill.d.ts +5 -0
- package/esm/tools/utils/urlPolyfill.js +52 -0
- package/esm/tools/utils/urlPolyfill.js.map +1 -0
- package/esm/tools/valueHistory.d.ts +27 -0
- package/esm/tools/valueHistory.js +100 -0
- package/esm/tools/valueHistory.js.map +1 -0
- package/esm/transport/batch.d.ts +16 -0
- package/esm/transport/batch.js +106 -0
- package/esm/transport/batch.js.map +1 -0
- package/esm/transport/eventBridge.d.ts +21 -0
- package/esm/transport/eventBridge.js +41 -0
- package/esm/transport/eventBridge.js.map +1 -0
- package/esm/transport/flushController.d.ts +65 -0
- package/esm/transport/flushController.js +119 -0
- package/esm/transport/flushController.js.map +1 -0
- package/esm/transport/httpRequest.d.ts +57 -0
- package/esm/transport/httpRequest.js +101 -0
- package/esm/transport/httpRequest.js.map +1 -0
- package/esm/transport/index.d.ts +7 -0
- package/esm/transport/index.js +5 -0
- package/esm/transport/index.js.map +1 -0
- package/esm/transport/sendWithRetryStrategy.d.ts +41 -0
- package/esm/transport/sendWithRetryStrategy.js +158 -0
- package/esm/transport/sendWithRetryStrategy.js.map +1 -0
- package/package.json +28 -0
- package/src/boot/displayAlreadyInitializedError.ts +8 -0
- package/src/boot/init.ts +54 -0
- package/src/browser/addEventListener.ts +145 -0
- package/src/browser/browser.types.ts +84 -0
- package/src/browser/cookie.ts +122 -0
- package/src/browser/fetchObservable.ts +167 -0
- package/src/browser/pageMayExitObservable.ts +56 -0
- package/src/browser/runOnReadyState.ts +25 -0
- package/src/browser/xhrObservable.ts +134 -0
- package/src/domain/allowedTrackingOrigins.ts +29 -0
- package/src/domain/bufferedData.ts +32 -0
- package/src/domain/configuration/configuration.ts +409 -0
- package/src/domain/configuration/endpointBuilder.ts +105 -0
- package/src/domain/configuration/index.ts +12 -0
- package/src/domain/configuration/transportConfiguration.ts +86 -0
- package/src/domain/connectivity/connectivity.ts +31 -0
- package/src/domain/connectivity/index.ts +1 -0
- package/src/domain/console/consoleObservable.ts +118 -0
- package/src/domain/context/contextConstants.ts +27 -0
- package/src/domain/context/contextManager.ts +81 -0
- package/src/domain/context/contextUtils.ts +14 -0
- package/src/domain/context/defineContextMethod.ts +31 -0
- package/src/domain/context/storeContextManager.ts +55 -0
- package/src/domain/contexts/accountContext.ts +47 -0
- package/src/domain/contexts/globalContext.ts +30 -0
- package/src/domain/contexts/rumInternalContext.type.ts +15 -0
- package/src/domain/contexts/userContext.ts +148 -0
- package/src/domain/deflate/deflate.types.ts +57 -0
- package/src/domain/deflate/index.ts +1 -0
- package/src/domain/error/error.ts +127 -0
- package/src/domain/error/error.types.ts +64 -0
- package/src/domain/error/trackRuntimeError.ts +50 -0
- package/src/domain/eventRateLimiter/createEventRateLimiter.ts +49 -0
- package/src/domain/extension/extensionUtils.ts +28 -0
- package/src/domain/intakeSites.ts +6 -0
- package/src/domain/report/browser.types.ts +38 -0
- package/src/domain/report/reportObservable.ts +133 -0
- package/src/domain/resourceUtils.ts +21 -0
- package/src/domain/session/README.md +193 -0
- package/src/domain/session/oldCookiesMigration.ts +42 -0
- package/src/domain/session/sessionConstants.ts +19 -0
- package/src/domain/session/sessionManager.ts +262 -0
- package/src/domain/session/sessionState.ts +83 -0
- package/src/domain/session/sessionStateValidation.ts +9 -0
- package/src/domain/session/sessionStore.ts +250 -0
- package/src/domain/session/sessionStoreOperations.ts +131 -0
- package/src/domain/session/storeStrategies/sessionInCookie.ts +146 -0
- package/src/domain/session/storeStrategies/sessionInLocalStorage.ts +44 -0
- package/src/domain/session/storeStrategies/sessionStoreStrategy.ts +16 -0
- package/src/domain/synthetics/syntheticsWorkerValues.ts +38 -0
- package/src/domain/tags.ts +75 -0
- package/src/domain/telemetry/index.ts +22 -0
- package/src/domain/telemetry/rawTelemetryEvent.types.ts +22 -0
- package/src/domain/telemetry/telemetry.ts +344 -0
- package/src/domain/telemetry/telemetryEvent.types.ts +907 -0
- package/src/domain/trackingConsent.ts +34 -0
- package/src/domain/userAgentData/index.ts +1 -0
- package/src/domain/userAgentData/userAgentData.ts +163 -0
- package/src/index.ts +169 -0
- package/src/tools/abstractHooks.ts +72 -0
- package/src/tools/abstractLifeCycle.ts +46 -0
- package/src/tools/boundedBuffer.ts +44 -0
- package/src/tools/catchUserErrors.ts +11 -0
- package/src/tools/display.ts +56 -0
- package/src/tools/encoder.ts +103 -0
- package/src/tools/experimentalFeatures.ts +52 -0
- package/src/tools/getZoneJsOriginalValue.ts +38 -0
- package/src/tools/globalObject.ts +51 -0
- package/src/tools/instrumentMethod.ts +170 -0
- package/src/tools/matchOption.ts +31 -0
- package/src/tools/mergeInto.ts +177 -0
- package/src/tools/monitor.ts +71 -0
- package/src/tools/observable.ts +103 -0
- package/src/tools/queueMicrotask.ts +13 -0
- package/src/tools/readBytesFromStream.ts +37 -0
- package/src/tools/requestIdleCallback.ts +40 -0
- package/src/tools/sendToExtension.ts +14 -0
- package/src/tools/serialisation/context.ts +11 -0
- package/src/tools/serialisation/jsonStringify.ts +53 -0
- package/src/tools/serialisation/sanitize.ts +273 -0
- package/src/tools/stackTrace/computeStackTrace.ts +251 -0
- package/src/tools/stackTrace/handlingStack.ts +48 -0
- package/src/tools/taskQueue.ts +63 -0
- package/src/tools/timer.ts +21 -0
- package/src/tools/utils/arrayUtils.ts +16 -0
- package/src/tools/utils/browserDetection.ts +39 -0
- package/src/tools/utils/byteUtils.ts +40 -0
- package/src/tools/utils/functionUtils.ts +45 -0
- package/src/tools/utils/numberUtils.ts +19 -0
- package/src/tools/utils/objectUtils.ts +19 -0
- package/src/tools/utils/polyfills.ts +23 -0
- package/src/tools/utils/responseUtils.ts +12 -0
- package/src/tools/utils/stringUtils.ts +86 -0
- package/src/tools/utils/timeUtils.ts +117 -0
- package/src/tools/utils/timezone.ts +9 -0
- package/src/tools/utils/typeUtils.ts +12 -0
- package/src/tools/utils/urlPolyfill.ts +55 -0
- package/src/tools/valueHistory.ts +151 -0
- package/src/transport/batch.ts +144 -0
- package/src/transport/eventBridge.ts +60 -0
- package/src/transport/flushController.ts +150 -0
- package/src/transport/httpRequest.ts +191 -0
- package/src/transport/index.ts +7 -0
- package/src/transport/sendWithRetryStrategy.ts +222 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { isNumber, round } from './numberUtils'
|
|
2
|
+
|
|
3
|
+
export const ONE_SECOND = 1000
|
|
4
|
+
export const ONE_MINUTE = 60 * ONE_SECOND
|
|
5
|
+
export const ONE_HOUR = 60 * ONE_MINUTE
|
|
6
|
+
export const ONE_DAY = 24 * ONE_HOUR
|
|
7
|
+
export const ONE_YEAR = 365 * ONE_DAY
|
|
8
|
+
|
|
9
|
+
export type Duration = number & { d: 'Duration in ms' }
|
|
10
|
+
export type ServerDuration = number & { s: 'Duration in ns' }
|
|
11
|
+
export type TimeStamp = number & { t: 'Epoch time' }
|
|
12
|
+
export type RelativeTime = number & { r: 'Time relative to navigation start' } & { d: 'Duration in ms' }
|
|
13
|
+
export interface ClocksState {
|
|
14
|
+
relative: RelativeTime
|
|
15
|
+
timeStamp: TimeStamp
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function relativeToClocks(relative: RelativeTime) {
|
|
19
|
+
return { relative, timeStamp: getCorrectedTimeStamp(relative) }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function timeStampToClocks(timeStamp: TimeStamp) {
|
|
23
|
+
return { relative: getRelativeTime(timeStamp), timeStamp }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function getCorrectedTimeStamp(relativeTime: RelativeTime) {
|
|
27
|
+
const correctedOrigin = (dateNow() - performance.now()) as TimeStamp
|
|
28
|
+
// apply correction only for positive drift
|
|
29
|
+
if (correctedOrigin > getNavigationStart()) {
|
|
30
|
+
return Math.round(addDuration(correctedOrigin, relativeTime)) as TimeStamp
|
|
31
|
+
}
|
|
32
|
+
return getTimeStamp(relativeTime)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function currentDrift() {
|
|
36
|
+
return Math.round(dateNow() - addDuration(getNavigationStart(), performance.now() as Duration))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function toServerDuration(duration: Duration): ServerDuration
|
|
40
|
+
export function toServerDuration(duration: Duration | undefined): ServerDuration | undefined
|
|
41
|
+
export function toServerDuration(duration: Duration | undefined) {
|
|
42
|
+
if (!isNumber(duration)) {
|
|
43
|
+
return duration
|
|
44
|
+
}
|
|
45
|
+
return round(duration * 1e6, 0) as ServerDuration
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function dateNow() {
|
|
49
|
+
// Do not use `Date.now` because sometimes websites are wrongly "polyfilling" it. For example, we
|
|
50
|
+
// had some users using a very old version of `datejs`, which patched `Date.now` to return a Date
|
|
51
|
+
// instance instead of a timestamp[1]. Those users are unlikely to fix this, so let's handle this
|
|
52
|
+
// case ourselves.
|
|
53
|
+
// [1]: https://github.com/datejs/Datejs/blob/97f5c7c58c5bc5accdab8aa7602b6ac56462d778/src/core-debug.js#L14-L16
|
|
54
|
+
return new Date().getTime()
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function timeStampNow() {
|
|
58
|
+
return dateNow() as TimeStamp
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function relativeNow() {
|
|
62
|
+
return performance.now() as RelativeTime
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function clocksNow() {
|
|
66
|
+
return { relative: relativeNow(), timeStamp: timeStampNow() }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function clocksOrigin() {
|
|
70
|
+
return { relative: 0 as RelativeTime, timeStamp: getNavigationStart() }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function elapsed(start: TimeStamp, end: TimeStamp): Duration
|
|
74
|
+
export function elapsed(start: RelativeTime, end: RelativeTime): Duration
|
|
75
|
+
export function elapsed(start: number, end: number) {
|
|
76
|
+
return (end - start) as Duration
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function addDuration(a: TimeStamp, b: Duration): TimeStamp
|
|
80
|
+
export function addDuration(a: RelativeTime, b: Duration): RelativeTime
|
|
81
|
+
export function addDuration(a: Duration, b: Duration): Duration
|
|
82
|
+
export function addDuration(a: number, b: number) {
|
|
83
|
+
return a + b
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Get the time since the navigation was started.
|
|
87
|
+
export function getRelativeTime(timestamp: TimeStamp) {
|
|
88
|
+
return (timestamp - getNavigationStart()) as RelativeTime
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function getTimeStamp(relativeTime: RelativeTime) {
|
|
92
|
+
return Math.round(addDuration(getNavigationStart(), relativeTime)) as TimeStamp
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function looksLikeRelativeTime(time: RelativeTime | TimeStamp): time is RelativeTime {
|
|
96
|
+
return time < ONE_YEAR
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Navigation start slightly change on some rare cases
|
|
101
|
+
*/
|
|
102
|
+
let navigationStart: TimeStamp | undefined
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Notes: this does not use `performance.timeOrigin` because:
|
|
106
|
+
* - It doesn't seem to reflect the actual time on which the navigation has started: it may be much farther in the past,
|
|
107
|
+
* at least in Firefox 71. (see: https://bugzilla.mozilla.org/show_bug.cgi?id=1429926)
|
|
108
|
+
* - It is not supported in Safari <15
|
|
109
|
+
*/
|
|
110
|
+
function getNavigationStart() {
|
|
111
|
+
if (navigationStart === undefined) {
|
|
112
|
+
// ServiceWorkers do not support navigationStart (it's deprecated), so we fallback to timeOrigin
|
|
113
|
+
navigationStart = (performance.timing?.navigationStart ?? performance.timeOrigin) as TimeStamp
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return navigationStart
|
|
117
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { globalObject } from '../globalObject'
|
|
2
|
+
|
|
3
|
+
export function normalizeUrl(url: string) {
|
|
4
|
+
return buildUrl(url, location.href).href
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function isValidUrl(url: string) {
|
|
8
|
+
try {
|
|
9
|
+
return !!buildUrl(url)
|
|
10
|
+
} catch {
|
|
11
|
+
return false
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getPathName(url: string) {
|
|
16
|
+
const pathname = buildUrl(url).pathname
|
|
17
|
+
return pathname[0] === '/' ? pathname : `/${pathname}`
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function buildUrl(url: string, base?: string) {
|
|
21
|
+
const { URL } = getPristineWindow()
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
return base !== undefined ? new URL(url, base) : new URL(url)
|
|
25
|
+
} catch (error) {
|
|
26
|
+
throw new Error(`Failed to construct URL: ${String(error)}`)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Get native URL constructor from a clean iframe
|
|
32
|
+
* This avoids polyfill issues by getting the native implementation from a fresh iframe context
|
|
33
|
+
* Falls back to the original URL constructor if iframe approach fails
|
|
34
|
+
*/
|
|
35
|
+
let getPristineGlobalObjectCache: Pick<typeof window, 'URL'> | undefined
|
|
36
|
+
|
|
37
|
+
export function getPristineWindow() {
|
|
38
|
+
if (!getPristineGlobalObjectCache) {
|
|
39
|
+
let iframe: HTMLIFrameElement | undefined
|
|
40
|
+
let pristineWindow: Window & typeof globalThis
|
|
41
|
+
try {
|
|
42
|
+
iframe = document.createElement('iframe')
|
|
43
|
+
iframe.style.display = 'none'
|
|
44
|
+
document.body.appendChild(iframe)
|
|
45
|
+
pristineWindow = iframe.contentWindow as Window & typeof globalThis
|
|
46
|
+
} catch {
|
|
47
|
+
pristineWindow = globalObject as unknown as Window & typeof globalThis
|
|
48
|
+
}
|
|
49
|
+
getPristineGlobalObjectCache = {
|
|
50
|
+
URL: pristineWindow.URL,
|
|
51
|
+
}
|
|
52
|
+
iframe?.remove()
|
|
53
|
+
}
|
|
54
|
+
return getPristineGlobalObjectCache
|
|
55
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { setInterval, clearInterval } from './timer'
|
|
2
|
+
import type { TimeoutId } from './timer'
|
|
3
|
+
import { removeItem } from './utils/arrayUtils'
|
|
4
|
+
import type { Duration, RelativeTime } from './utils/timeUtils'
|
|
5
|
+
import { addDuration, relativeNow, ONE_MINUTE } from './utils/timeUtils'
|
|
6
|
+
|
|
7
|
+
const END_OF_TIMES = Infinity as RelativeTime
|
|
8
|
+
|
|
9
|
+
export interface ValueHistoryEntry<T> {
|
|
10
|
+
startTime: RelativeTime
|
|
11
|
+
endTime: RelativeTime
|
|
12
|
+
value: T
|
|
13
|
+
remove(): void
|
|
14
|
+
close(endTime: RelativeTime): void
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const CLEAR_OLD_VALUES_INTERVAL = ONE_MINUTE
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Store and keep track of values spans. This whole cache assumes that values are added in
|
|
21
|
+
* chronological order (i.e. all entries have an increasing start time).
|
|
22
|
+
*/
|
|
23
|
+
export interface ValueHistory<Value> {
|
|
24
|
+
add: (value: Value, startTime: RelativeTime) => ValueHistoryEntry<Value>
|
|
25
|
+
find: (startTime?: RelativeTime, options?: { returnInactive: boolean }) => Value | undefined
|
|
26
|
+
|
|
27
|
+
closeActive: (endTime: RelativeTime) => void
|
|
28
|
+
findAll: (startTime?: RelativeTime, duration?: Duration) => Value[]
|
|
29
|
+
reset: () => void
|
|
30
|
+
stop: () => void
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let cleanupHistoriesInterval: TimeoutId | null = null
|
|
34
|
+
|
|
35
|
+
const cleanupTasks: Set<() => void> = new Set()
|
|
36
|
+
|
|
37
|
+
function cleanupHistories() {
|
|
38
|
+
cleanupTasks.forEach((task) => task())
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function createValueHistory<Value>({
|
|
42
|
+
expireDelay,
|
|
43
|
+
maxEntries,
|
|
44
|
+
}: {
|
|
45
|
+
expireDelay: number
|
|
46
|
+
maxEntries?: number
|
|
47
|
+
}): ValueHistory<Value> {
|
|
48
|
+
let entries: Array<ValueHistoryEntry<Value>> = []
|
|
49
|
+
|
|
50
|
+
if (!cleanupHistoriesInterval) {
|
|
51
|
+
cleanupHistoriesInterval = setInterval(() => cleanupHistories(), CLEAR_OLD_VALUES_INTERVAL)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const clearExpiredValues = () => {
|
|
55
|
+
const oldTimeThreshold = relativeNow() - expireDelay
|
|
56
|
+
while (entries.length > 0 && entries[entries.length - 1].endTime < oldTimeThreshold) {
|
|
57
|
+
entries.pop()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
cleanupTasks.add(clearExpiredValues)
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Add a value to the history associated with a start time. Returns a reference to this newly
|
|
65
|
+
* added entry that can be removed or closed.
|
|
66
|
+
*/
|
|
67
|
+
function add(value: Value, startTime: RelativeTime): ValueHistoryEntry<Value> {
|
|
68
|
+
const entry: ValueHistoryEntry<Value> = {
|
|
69
|
+
value,
|
|
70
|
+
startTime,
|
|
71
|
+
endTime: END_OF_TIMES,
|
|
72
|
+
remove: () => {
|
|
73
|
+
removeItem(entries, entry)
|
|
74
|
+
},
|
|
75
|
+
close: (endTime: RelativeTime) => {
|
|
76
|
+
entry.endTime = endTime
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (maxEntries && entries.length >= maxEntries) {
|
|
81
|
+
entries.pop()
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
entries.unshift(entry)
|
|
85
|
+
|
|
86
|
+
return entry
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Return the latest value that was active during `startTime`, or the currently active value
|
|
91
|
+
* if no `startTime` is provided. This method assumes that entries are not overlapping.
|
|
92
|
+
*
|
|
93
|
+
* If `option.returnInactive` is true, returns the value at `startTime` (active or not).
|
|
94
|
+
*/
|
|
95
|
+
function find(
|
|
96
|
+
startTime: RelativeTime = END_OF_TIMES,
|
|
97
|
+
options: { returnInactive: boolean } = { returnInactive: false }
|
|
98
|
+
): Value | undefined {
|
|
99
|
+
for (const entry of entries) {
|
|
100
|
+
if (entry.startTime <= startTime) {
|
|
101
|
+
if (options.returnInactive || startTime <= entry.endTime) {
|
|
102
|
+
return entry.value
|
|
103
|
+
}
|
|
104
|
+
break
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Helper function to close the currently active value, if any. This method assumes that entries
|
|
111
|
+
* are not overlapping.
|
|
112
|
+
*/
|
|
113
|
+
function closeActive(endTime: RelativeTime) {
|
|
114
|
+
const latestEntry = entries[0]
|
|
115
|
+
if (latestEntry && latestEntry.endTime === END_OF_TIMES) {
|
|
116
|
+
latestEntry.close(endTime)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Return all values with an active period overlapping with the duration,
|
|
122
|
+
* or all values that were active during `startTime` if no duration is provided,
|
|
123
|
+
* or all currently active values if no `startTime` is provided.
|
|
124
|
+
*/
|
|
125
|
+
function findAll(startTime: RelativeTime = END_OF_TIMES, duration = 0 as Duration): Value[] {
|
|
126
|
+
const endTime = addDuration(startTime, duration)
|
|
127
|
+
return entries
|
|
128
|
+
.filter((entry) => entry.startTime <= endTime && startTime <= entry.endTime)
|
|
129
|
+
.map((entry) => entry.value)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Remove all entries from this collection.
|
|
134
|
+
*/
|
|
135
|
+
function reset() {
|
|
136
|
+
entries = []
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Stop internal garbage collection of past entries.
|
|
141
|
+
*/
|
|
142
|
+
function stop() {
|
|
143
|
+
cleanupTasks.delete(clearExpiredValues)
|
|
144
|
+
if (cleanupTasks.size === 0 && cleanupHistoriesInterval) {
|
|
145
|
+
clearInterval(cleanupHistoriesInterval)
|
|
146
|
+
cleanupHistoriesInterval = null
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return { add, find, closeActive, findAll, reset, stop }
|
|
151
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { DOCS_TROUBLESHOOTING, MORE_DETAILS, display } from '../tools/display'
|
|
2
|
+
import type { Context } from '../tools/serialisation/context'
|
|
3
|
+
import { objectValues } from '../tools/utils/polyfills'
|
|
4
|
+
import { isPageExitReason } from '../browser/pageMayExitObservable'
|
|
5
|
+
import { jsonStringify } from '../tools/serialisation/jsonStringify'
|
|
6
|
+
import type { Encoder, EncoderResult } from '../tools/encoder'
|
|
7
|
+
import { computeBytesCount, ONE_KIBI_BYTE } from '../tools/utils/byteUtils'
|
|
8
|
+
import type { HttpRequest, Payload } from './httpRequest'
|
|
9
|
+
import type { FlushController, FlushEvent } from './flushController'
|
|
10
|
+
|
|
11
|
+
export const MESSAGE_BYTES_LIMIT = 256 * ONE_KIBI_BYTE
|
|
12
|
+
|
|
13
|
+
export interface Batch {
|
|
14
|
+
flushController: FlushController
|
|
15
|
+
add: (message: Context) => void
|
|
16
|
+
upsert: (message: Context, key: string) => void
|
|
17
|
+
stop: () => void
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function createBatch({
|
|
21
|
+
encoder,
|
|
22
|
+
request,
|
|
23
|
+
flushController,
|
|
24
|
+
}: {
|
|
25
|
+
encoder: Encoder
|
|
26
|
+
request: HttpRequest
|
|
27
|
+
flushController: FlushController
|
|
28
|
+
}): Batch {
|
|
29
|
+
let upsertBuffer: { [key: string]: string } = {}
|
|
30
|
+
const flushSubscription = flushController.flushObservable.subscribe((event) => flush(event))
|
|
31
|
+
|
|
32
|
+
function push(serializedMessage: string, estimatedMessageBytesCount: number, key?: string) {
|
|
33
|
+
flushController.notifyBeforeAddMessage(estimatedMessageBytesCount)
|
|
34
|
+
|
|
35
|
+
if (key !== undefined) {
|
|
36
|
+
upsertBuffer[key] = serializedMessage
|
|
37
|
+
flushController.notifyAfterAddMessage()
|
|
38
|
+
} else {
|
|
39
|
+
encoder.write(encoder.isEmpty ? serializedMessage : `\n${serializedMessage}`, (realMessageBytesCount) => {
|
|
40
|
+
flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount)
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function hasMessageFor(key?: string): key is string {
|
|
46
|
+
return key !== undefined && upsertBuffer[key] !== undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function remove(key: string) {
|
|
50
|
+
const removedMessage = upsertBuffer[key]
|
|
51
|
+
delete upsertBuffer[key]
|
|
52
|
+
const messageBytesCount = encoder.estimateEncodedBytesCount(removedMessage)
|
|
53
|
+
flushController.notifyAfterRemoveMessage(messageBytesCount)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function addOrUpdate(message: Context, key?: string) {
|
|
57
|
+
const serializedMessage = jsonStringify(message)!
|
|
58
|
+
|
|
59
|
+
const estimatedMessageBytesCount = encoder.estimateEncodedBytesCount(serializedMessage)
|
|
60
|
+
|
|
61
|
+
if (estimatedMessageBytesCount >= MESSAGE_BYTES_LIMIT) {
|
|
62
|
+
display.warn(
|
|
63
|
+
`Discarded a message whose size was bigger than the maximum allowed size ${MESSAGE_BYTES_LIMIT / ONE_KIBI_BYTE}KiB. ${MORE_DETAILS} ${DOCS_TROUBLESHOOTING}/#technical-limitations`
|
|
64
|
+
)
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (hasMessageFor(key)) {
|
|
69
|
+
remove(key)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
push(serializedMessage, estimatedMessageBytesCount, key)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function flush(event: FlushEvent) {
|
|
76
|
+
const upsertMessages = objectValues(upsertBuffer).join('\n')
|
|
77
|
+
upsertBuffer = {}
|
|
78
|
+
|
|
79
|
+
const pageMightExit = isPageExitReason(event.reason)
|
|
80
|
+
const send = pageMightExit ? request.sendOnExit : request.send
|
|
81
|
+
|
|
82
|
+
if (
|
|
83
|
+
pageMightExit &&
|
|
84
|
+
// Note: checking that the encoder is async is not strictly needed, but it's an optimization:
|
|
85
|
+
// if the encoder is async we need to send two requests in some cases (one for encoded data
|
|
86
|
+
// and the other for non-encoded data). But if it's not async, we don't have to worry about
|
|
87
|
+
// it and always send a single request.
|
|
88
|
+
encoder.isAsync
|
|
89
|
+
) {
|
|
90
|
+
const encoderResult = encoder.finishSync()
|
|
91
|
+
|
|
92
|
+
// Send encoded messages
|
|
93
|
+
if (encoderResult.outputBytesCount) {
|
|
94
|
+
send(formatPayloadFromEncoder(encoderResult))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Send messages that are not yet encoded at this point
|
|
98
|
+
const pendingMessages = [encoderResult.pendingData, upsertMessages].filter(Boolean).join('\n')
|
|
99
|
+
if (pendingMessages) {
|
|
100
|
+
send({
|
|
101
|
+
data: pendingMessages,
|
|
102
|
+
bytesCount: computeBytesCount(pendingMessages),
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
if (upsertMessages) {
|
|
107
|
+
encoder.write(encoder.isEmpty ? upsertMessages : `\n${upsertMessages}`)
|
|
108
|
+
}
|
|
109
|
+
encoder.finish((encoderResult) => {
|
|
110
|
+
send(formatPayloadFromEncoder(encoderResult))
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
flushController,
|
|
117
|
+
add: addOrUpdate,
|
|
118
|
+
upsert: addOrUpdate,
|
|
119
|
+
stop: flushSubscription.unsubscribe,
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function formatPayloadFromEncoder(encoderResult: EncoderResult): Payload {
|
|
124
|
+
let data: string | Blob
|
|
125
|
+
if (typeof encoderResult.output === 'string') {
|
|
126
|
+
data = encoderResult.output
|
|
127
|
+
} else {
|
|
128
|
+
data = new Blob([encoderResult.output], {
|
|
129
|
+
// This will set the 'Content-Type: text/plain' header. Reasoning:
|
|
130
|
+
// * The intake rejects the request if there is no content type.
|
|
131
|
+
// * The browser will issue CORS preflight requests if we set it to 'application/json', which
|
|
132
|
+
// could induce higher intake load (and maybe has other impacts).
|
|
133
|
+
// * Also it's not quite JSON, since we are concatenating multiple JSON objects separated by
|
|
134
|
+
// new lines.
|
|
135
|
+
type: 'text/plain',
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
data,
|
|
141
|
+
bytesCount: encoderResult.outputBytesCount,
|
|
142
|
+
encoding: encoderResult.encoding,
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getGlobalObject } from '../tools/globalObject'
|
|
2
|
+
import type { DefaultPrivacyLevel } from '../domain/configuration'
|
|
3
|
+
|
|
4
|
+
export interface BrowserWindowWithEventBridge extends Window {
|
|
5
|
+
KubsesenseEventBridge?: KubsesenseEventBridge
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface KubsesenseEventBridge {
|
|
9
|
+
getCapabilities?(): string
|
|
10
|
+
getPrivacyLevel?(): DefaultPrivacyLevel
|
|
11
|
+
getAllowedWebViewHosts(): string
|
|
12
|
+
send(msg: string): void
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const enum BridgeCapability {
|
|
16
|
+
RECORDS = 'records',
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function getEventBridge<T, E>() {
|
|
20
|
+
const eventBridgeGlobal = getEventBridgeGlobal()
|
|
21
|
+
|
|
22
|
+
if (!eventBridgeGlobal) {
|
|
23
|
+
return
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
getCapabilities() {
|
|
28
|
+
return JSON.parse(eventBridgeGlobal.getCapabilities?.() || '[]') as BridgeCapability[]
|
|
29
|
+
},
|
|
30
|
+
getPrivacyLevel() {
|
|
31
|
+
return eventBridgeGlobal.getPrivacyLevel?.()
|
|
32
|
+
},
|
|
33
|
+
getAllowedWebViewHosts() {
|
|
34
|
+
return JSON.parse(eventBridgeGlobal.getAllowedWebViewHosts()) as string[]
|
|
35
|
+
},
|
|
36
|
+
send(eventType: T, event: E, viewId?: string) {
|
|
37
|
+
const view = viewId ? { id: viewId } : undefined
|
|
38
|
+
eventBridgeGlobal.send(JSON.stringify({ eventType, event, view }))
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function bridgeSupports(capability: BridgeCapability): boolean {
|
|
44
|
+
const bridge = getEventBridge()
|
|
45
|
+
return !!bridge && bridge.getCapabilities().includes(capability)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function canUseEventBridge(currentHost = getGlobalObject<Window>().location?.hostname): boolean {
|
|
49
|
+
const bridge = getEventBridge()
|
|
50
|
+
return (
|
|
51
|
+
!!bridge &&
|
|
52
|
+
bridge
|
|
53
|
+
.getAllowedWebViewHosts()
|
|
54
|
+
.some((allowedHost) => currentHost === allowedHost || currentHost.endsWith(`.${allowedHost}`))
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function getEventBridgeGlobal() {
|
|
59
|
+
return getGlobalObject<BrowserWindowWithEventBridge>().KubsesenseEventBridge
|
|
60
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { PageMayExitEvent, PageExitReason } from '../browser/pageMayExitObservable'
|
|
2
|
+
import { isWorkerEnvironment } from '../tools/globalObject'
|
|
3
|
+
import { Observable } from '../tools/observable'
|
|
4
|
+
import type { TimeoutId } from '../tools/timer'
|
|
5
|
+
import { clearTimeout, setTimeout } from '../tools/timer'
|
|
6
|
+
import { ONE_SECOND } from '../tools/utils/timeUtils'
|
|
7
|
+
import type { Duration } from '../tools/utils/timeUtils'
|
|
8
|
+
import { RECOMMENDED_REQUEST_BYTES_LIMIT } from './httpRequest'
|
|
9
|
+
|
|
10
|
+
export type FlushReason = PageExitReason | 'duration_limit' | 'bytes_limit' | 'messages_limit' | 'session_expire'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* flush automatically, aim to be lower than ALB connection timeout
|
|
14
|
+
* to maximize connection reuse.
|
|
15
|
+
*/
|
|
16
|
+
export const FLUSH_DURATION_LIMIT = (30 * ONE_SECOND) as Duration
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* When using the SDK in a Worker Environment, we limit the batch size to 1 to ensure it can be sent
|
|
20
|
+
* in a single event.
|
|
21
|
+
*/
|
|
22
|
+
export const MESSAGES_LIMIT = isWorkerEnvironment ? 1 : 50
|
|
23
|
+
|
|
24
|
+
export type FlushController = ReturnType<typeof createFlushController>
|
|
25
|
+
export interface FlushEvent {
|
|
26
|
+
reason: FlushReason
|
|
27
|
+
bytesCount: number
|
|
28
|
+
messagesCount: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface FlushControllerOptions {
|
|
32
|
+
pageMayExitObservable: Observable<PageMayExitEvent>
|
|
33
|
+
sessionExpireObservable: Observable<void>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Returns a "flush controller", responsible of notifying when flushing a pool of pending data needs
|
|
38
|
+
* to happen. The implementation is designed to support both synchronous and asynchronous usages,
|
|
39
|
+
* but relies on invariants described in each method documentation to keep a coherent state.
|
|
40
|
+
*/
|
|
41
|
+
export function createFlushController({ pageMayExitObservable, sessionExpireObservable }: FlushControllerOptions) {
|
|
42
|
+
const pageMayExitSubscription = pageMayExitObservable.subscribe((event) => flush(event.reason))
|
|
43
|
+
const sessionExpireSubscription = sessionExpireObservable.subscribe(() => flush('session_expire'))
|
|
44
|
+
|
|
45
|
+
const flushObservable = new Observable<FlushEvent>(() => () => {
|
|
46
|
+
pageMayExitSubscription.unsubscribe()
|
|
47
|
+
sessionExpireSubscription.unsubscribe()
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
let currentBytesCount = 0
|
|
51
|
+
let currentMessagesCount = 0
|
|
52
|
+
|
|
53
|
+
function flush(flushReason: FlushReason) {
|
|
54
|
+
if (currentMessagesCount === 0) {
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const messagesCount = currentMessagesCount
|
|
59
|
+
const bytesCount = currentBytesCount
|
|
60
|
+
|
|
61
|
+
currentMessagesCount = 0
|
|
62
|
+
currentBytesCount = 0
|
|
63
|
+
cancelDurationLimitTimeout()
|
|
64
|
+
|
|
65
|
+
flushObservable.notify({
|
|
66
|
+
reason: flushReason,
|
|
67
|
+
messagesCount,
|
|
68
|
+
bytesCount,
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let durationLimitTimeoutId: TimeoutId | undefined
|
|
73
|
+
function scheduleDurationLimitTimeout() {
|
|
74
|
+
if (durationLimitTimeoutId === undefined) {
|
|
75
|
+
durationLimitTimeoutId = setTimeout(() => {
|
|
76
|
+
flush('duration_limit')
|
|
77
|
+
}, FLUSH_DURATION_LIMIT)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function cancelDurationLimitTimeout() {
|
|
82
|
+
clearTimeout(durationLimitTimeoutId)
|
|
83
|
+
durationLimitTimeoutId = undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
flushObservable,
|
|
88
|
+
get messagesCount() {
|
|
89
|
+
return currentMessagesCount
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Notifies that a message will be added to a pool of pending messages waiting to be flushed.
|
|
94
|
+
*
|
|
95
|
+
* This function needs to be called synchronously, right before adding the message, so no flush
|
|
96
|
+
* event can happen after `notifyBeforeAddMessage` and before adding the message.
|
|
97
|
+
*
|
|
98
|
+
* @param estimatedMessageBytesCount - an estimation of the message bytes count once it is
|
|
99
|
+
* actually added.
|
|
100
|
+
*/
|
|
101
|
+
notifyBeforeAddMessage(estimatedMessageBytesCount: number) {
|
|
102
|
+
if (currentBytesCount + estimatedMessageBytesCount >= RECOMMENDED_REQUEST_BYTES_LIMIT) {
|
|
103
|
+
flush('bytes_limit')
|
|
104
|
+
}
|
|
105
|
+
// Consider the message to be added now rather than in `notifyAfterAddMessage`, because if no
|
|
106
|
+
// message was added yet and `notifyAfterAddMessage` is called asynchronously, we still want
|
|
107
|
+
// to notify when a flush is needed (for example on page exit).
|
|
108
|
+
currentMessagesCount += 1
|
|
109
|
+
currentBytesCount += estimatedMessageBytesCount
|
|
110
|
+
scheduleDurationLimitTimeout()
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Notifies that a message *was* added to a pool of pending messages waiting to be flushed.
|
|
115
|
+
*
|
|
116
|
+
* This function can be called asynchronously after the message was added, but in this case it
|
|
117
|
+
* should not be called if a flush event occurred in between.
|
|
118
|
+
*
|
|
119
|
+
* @param messageBytesCountDiff - the difference between the estimated message bytes count and
|
|
120
|
+
* its actual bytes count once added to the pool.
|
|
121
|
+
*/
|
|
122
|
+
notifyAfterAddMessage(messageBytesCountDiff = 0) {
|
|
123
|
+
currentBytesCount += messageBytesCountDiff
|
|
124
|
+
|
|
125
|
+
if (currentMessagesCount >= MESSAGES_LIMIT) {
|
|
126
|
+
flush('messages_limit')
|
|
127
|
+
} else if (currentBytesCount >= RECOMMENDED_REQUEST_BYTES_LIMIT) {
|
|
128
|
+
flush('bytes_limit')
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Notifies that a message was removed from a pool of pending messages waiting to be flushed.
|
|
134
|
+
*
|
|
135
|
+
* This function needs to be called synchronously, right after removing the message, so no flush
|
|
136
|
+
* event can happen after removing the message and before `notifyAfterRemoveMessage`.
|
|
137
|
+
*
|
|
138
|
+
* @param messageBytesCount - the message bytes count that was added to the pool. Should
|
|
139
|
+
* correspond to the sum of bytes counts passed to `notifyBeforeAddMessage` and
|
|
140
|
+
* `notifyAfterAddMessage`.
|
|
141
|
+
*/
|
|
142
|
+
notifyAfterRemoveMessage(messageBytesCount: number) {
|
|
143
|
+
currentBytesCount -= messageBytesCount
|
|
144
|
+
currentMessagesCount -= 1
|
|
145
|
+
if (currentMessagesCount === 0) {
|
|
146
|
+
cancelDurationLimitTimeout()
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
}
|
|
150
|
+
}
|