@scalebun/web 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 +21 -0
- package/README.md +59 -0
- package/dist/bootstrap/FeatureRegistry.d.ts +44 -0
- package/dist/bootstrap/FeatureRegistry.d.ts.map +1 -0
- package/dist/bootstrap/FeatureRegistry.js +85 -0
- package/dist/bootstrap/FeatureRegistry.js.map +1 -0
- package/dist/bootstrap/SDKBootstrapper.d.ts +37 -0
- package/dist/bootstrap/SDKBootstrapper.d.ts.map +1 -0
- package/dist/bootstrap/SDKBootstrapper.js +248 -0
- package/dist/bootstrap/SDKBootstrapper.js.map +1 -0
- package/dist/browser.d.ts +51 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +81 -0
- package/dist/browser.js.map +1 -0
- package/dist/config/schema.d.ts +108 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +95 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/breadcrumbs.d.ts +56 -0
- package/dist/core/breadcrumbs.d.ts.map +1 -0
- package/dist/core/breadcrumbs.js +141 -0
- package/dist/core/breadcrumbs.js.map +1 -0
- package/dist/core/capabilities.d.ts +38 -0
- package/dist/core/capabilities.d.ts.map +1 -0
- package/dist/core/capabilities.js +78 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/consent.d.ts +17 -0
- package/dist/core/consent.d.ts.map +1 -0
- package/dist/core/consent.js +38 -0
- package/dist/core/consent.js.map +1 -0
- package/dist/core/csp.d.ts +31 -0
- package/dist/core/csp.d.ts.map +1 -0
- package/dist/core/csp.js +74 -0
- package/dist/core/csp.js.map +1 -0
- package/dist/core/evalContext.d.ts +7 -0
- package/dist/core/evalContext.d.ts.map +1 -0
- package/dist/core/evalContext.js +22 -0
- package/dist/core/evalContext.js.map +1 -0
- package/dist/core/ids.d.ts +6 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +35 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +15 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lifecycle.d.ts +4 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +24 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/logger.d.ts +12 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +14 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/observe.d.ts +3 -0
- package/dist/core/observe.d.ts.map +1 -0
- package/dist/core/observe.js +22 -0
- package/dist/core/observe.js.map +1 -0
- package/dist/core/pageContext.d.ts +13 -0
- package/dist/core/pageContext.d.ts.map +1 -0
- package/dist/core/pageContext.js +73 -0
- package/dist/core/pageContext.js.map +1 -0
- package/dist/core/prune.d.ts +7 -0
- package/dist/core/prune.d.ts.map +1 -0
- package/dist/core/prune.js +31 -0
- package/dist/core/prune.js.map +1 -0
- package/dist/core/redact.d.ts +15 -0
- package/dist/core/redact.d.ts.map +1 -0
- package/dist/core/redact.js +50 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/replayCoord.d.ts +22 -0
- package/dist/core/replayCoord.d.ts.map +1 -0
- package/dist/core/replayCoord.js +20 -0
- package/dist/core/replayCoord.js.map +1 -0
- package/dist/core/retry.d.ts +25 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +44 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/runtime.d.ts +28 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +67 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/scrollDepth.d.ts +48 -0
- package/dist/core/scrollDepth.d.ts.map +1 -0
- package/dist/core/scrollDepth.js +63 -0
- package/dist/core/scrollDepth.js.map +1 -0
- package/dist/debug/index.d.ts +6 -0
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/index.js +2 -0
- package/dist/debug/index.js.map +1 -0
- package/dist/features/analytics/AnalyticsFeature.d.ts +122 -0
- package/dist/features/analytics/AnalyticsFeature.d.ts.map +1 -0
- package/dist/features/analytics/AnalyticsFeature.js +757 -0
- package/dist/features/analytics/AnalyticsFeature.js.map +1 -0
- package/dist/features/analytics/autocapture.d.ts +13 -0
- package/dist/features/analytics/autocapture.d.ts.map +1 -0
- package/dist/features/analytics/autocapture.js +398 -0
- package/dist/features/analytics/autocapture.js.map +1 -0
- package/dist/features/analytics/governance.d.ts +15 -0
- package/dist/features/analytics/governance.d.ts.map +1 -0
- package/dist/features/analytics/governance.js +30 -0
- package/dist/features/analytics/governance.js.map +1 -0
- package/dist/features/analytics/revenue.d.ts +38 -0
- package/dist/features/analytics/revenue.d.ts.map +1 -0
- package/dist/features/analytics/revenue.js +26 -0
- package/dist/features/analytics/revenue.js.map +1 -0
- package/dist/features/analytics/sampler.d.ts +2 -0
- package/dist/features/analytics/sampler.d.ts.map +1 -0
- package/dist/features/analytics/sampler.js +24 -0
- package/dist/features/analytics/sampler.js.map +1 -0
- package/dist/features/analytics/subscription.d.ts +25 -0
- package/dist/features/analytics/subscription.d.ts.map +1 -0
- package/dist/features/analytics/subscription.js +51 -0
- package/dist/features/analytics/subscription.js.map +1 -0
- package/dist/features/attention/index.d.ts +29 -0
- package/dist/features/attention/index.d.ts.map +1 -0
- package/dist/features/attention/index.js +128 -0
- package/dist/features/attention/index.js.map +1 -0
- package/dist/features/bugreport/BugReportFeature.d.ts +36 -0
- package/dist/features/bugreport/BugReportFeature.d.ts.map +1 -0
- package/dist/features/bugreport/BugReportFeature.js +55 -0
- package/dist/features/bugreport/BugReportFeature.js.map +1 -0
- package/dist/features/bugreport/collect.d.ts +21 -0
- package/dist/features/bugreport/collect.d.ts.map +1 -0
- package/dist/features/bugreport/collect.js +27 -0
- package/dist/features/bugreport/collect.js.map +1 -0
- package/dist/features/bugreport/widget.d.ts +21 -0
- package/dist/features/bugreport/widget.d.ts.map +1 -0
- package/dist/features/bugreport/widget.js +111 -0
- package/dist/features/bugreport/widget.js.map +1 -0
- package/dist/features/coach/CoachmarkFeature.d.ts +78 -0
- package/dist/features/coach/CoachmarkFeature.d.ts.map +1 -0
- package/dist/features/coach/CoachmarkFeature.js +161 -0
- package/dist/features/coach/CoachmarkFeature.js.map +1 -0
- package/dist/features/coach/anchor.d.ts +32 -0
- package/dist/features/coach/anchor.d.ts.map +1 -0
- package/dist/features/coach/anchor.js +128 -0
- package/dist/features/coach/anchor.js.map +1 -0
- package/dist/features/coach/observers.d.ts +17 -0
- package/dist/features/coach/observers.d.ts.map +1 -0
- package/dist/features/coach/observers.js +49 -0
- package/dist/features/coach/observers.js.map +1 -0
- package/dist/features/coach/overlay.d.ts +15 -0
- package/dist/features/coach/overlay.d.ts.map +1 -0
- package/dist/features/coach/overlay.js +183 -0
- package/dist/features/coach/overlay.js.map +1 -0
- package/dist/features/coach/position.d.ts +9 -0
- package/dist/features/coach/position.d.ts.map +1 -0
- package/dist/features/coach/position.js +83 -0
- package/dist/features/coach/position.js.map +1 -0
- package/dist/features/coach/predicate.d.ts +10 -0
- package/dist/features/coach/predicate.d.ts.map +1 -0
- package/dist/features/coach/predicate.js +36 -0
- package/dist/features/coach/predicate.js.map +1 -0
- package/dist/features/coach/tour.d.ts +55 -0
- package/dist/features/coach/tour.d.ts.map +1 -0
- package/dist/features/coach/tour.js +181 -0
- package/dist/features/coach/tour.js.map +1 -0
- package/dist/features/coach/types.d.ts +161 -0
- package/dist/features/coach/types.d.ts.map +1 -0
- package/dist/features/coach/types.js +2 -0
- package/dist/features/coach/types.js.map +1 -0
- package/dist/features/coach/wait.d.ts +34 -0
- package/dist/features/coach/wait.d.ts.map +1 -0
- package/dist/features/coach/wait.js +107 -0
- package/dist/features/coach/wait.js.map +1 -0
- package/dist/features/config/ConfigFeature.d.ts +117 -0
- package/dist/features/config/ConfigFeature.d.ts.map +1 -0
- package/dist/features/config/ConfigFeature.js +437 -0
- package/dist/features/config/ConfigFeature.js.map +1 -0
- package/dist/features/config/bucketing.d.ts +20 -0
- package/dist/features/config/bucketing.d.ts.map +1 -0
- package/dist/features/config/bucketing.js +37 -0
- package/dist/features/config/bucketing.js.map +1 -0
- package/dist/features/config/configStore.d.ts +11 -0
- package/dist/features/config/configStore.d.ts.map +1 -0
- package/dist/features/config/configStore.js +66 -0
- package/dist/features/config/configStore.js.map +1 -0
- package/dist/features/config/targeting.d.ts +11 -0
- package/dist/features/config/targeting.d.ts.map +1 -0
- package/dist/features/config/targeting.js +57 -0
- package/dist/features/config/targeting.js.map +1 -0
- package/dist/features/config/types.d.ts +100 -0
- package/dist/features/config/types.d.ts.map +1 -0
- package/dist/features/config/types.js +9 -0
- package/dist/features/config/types.js.map +1 -0
- package/dist/features/console/ConsoleFeature.d.ts +31 -0
- package/dist/features/console/ConsoleFeature.d.ts.map +1 -0
- package/dist/features/console/ConsoleFeature.js +98 -0
- package/dist/features/console/ConsoleFeature.js.map +1 -0
- package/dist/features/console/normalize.d.ts +18 -0
- package/dist/features/console/normalize.d.ts.map +1 -0
- package/dist/features/console/normalize.js +64 -0
- package/dist/features/console/normalize.js.map +1 -0
- package/dist/features/console/serialize.d.ts +24 -0
- package/dist/features/console/serialize.d.ts.map +1 -0
- package/dist/features/console/serialize.js +99 -0
- package/dist/features/console/serialize.js.map +1 -0
- package/dist/features/console/throttle.d.ts +27 -0
- package/dist/features/console/throttle.d.ts.map +1 -0
- package/dist/features/console/throttle.js +37 -0
- package/dist/features/console/throttle.js.map +1 -0
- package/dist/features/crash/CrashFeature.d.ts +46 -0
- package/dist/features/crash/CrashFeature.d.ts.map +1 -0
- package/dist/features/crash/CrashFeature.js +173 -0
- package/dist/features/crash/CrashFeature.js.map +1 -0
- package/dist/features/crash/liveness.d.ts +30 -0
- package/dist/features/crash/liveness.d.ts.map +1 -0
- package/dist/features/crash/liveness.js +131 -0
- package/dist/features/crash/liveness.js.map +1 -0
- package/dist/features/engage/EngageFeature.d.ts +61 -0
- package/dist/features/engage/EngageFeature.d.ts.map +1 -0
- package/dist/features/engage/EngageFeature.js +221 -0
- package/dist/features/engage/EngageFeature.js.map +1 -0
- package/dist/features/engage/attachments.d.ts +24 -0
- package/dist/features/engage/attachments.d.ts.map +1 -0
- package/dist/features/engage/attachments.js +209 -0
- package/dist/features/engage/attachments.js.map +1 -0
- package/dist/features/engage/gameLogic.d.ts +60 -0
- package/dist/features/engage/gameLogic.d.ts.map +1 -0
- package/dist/features/engage/gameLogic.js +213 -0
- package/dist/features/engage/gameLogic.js.map +1 -0
- package/dist/features/engage/gameResolver.d.ts +35 -0
- package/dist/features/engage/gameResolver.d.ts.map +1 -0
- package/dist/features/engage/gameResolver.js +81 -0
- package/dist/features/engage/gameResolver.js.map +1 -0
- package/dist/features/engage/gameTypes.d.ts +76 -0
- package/dist/features/engage/gameTypes.d.ts.map +1 -0
- package/dist/features/engage/gameTypes.js +17 -0
- package/dist/features/engage/gameTypes.js.map +1 -0
- package/dist/features/engage/inappSlots.d.ts +39 -0
- package/dist/features/engage/inappSlots.d.ts.map +1 -0
- package/dist/features/engage/inappSlots.js +50 -0
- package/dist/features/engage/inappSlots.js.map +1 -0
- package/dist/features/engage/normalize.d.ts +11 -0
- package/dist/features/engage/normalize.d.ts.map +1 -0
- package/dist/features/engage/normalize.js +203 -0
- package/dist/features/engage/normalize.js.map +1 -0
- package/dist/features/engage/richInApp.d.ts +64 -0
- package/dist/features/engage/richInApp.d.ts.map +1 -0
- package/dist/features/engage/richInApp.js +1082 -0
- package/dist/features/engage/richInApp.js.map +1 -0
- package/dist/features/engage/runtime.d.ts +78 -0
- package/dist/features/engage/runtime.d.ts.map +1 -0
- package/dist/features/engage/runtime.js +349 -0
- package/dist/features/engage/runtime.js.map +1 -0
- package/dist/features/engage/shakeDetector.d.ts +6 -0
- package/dist/features/engage/shakeDetector.d.ts.map +1 -0
- package/dist/features/engage/shakeDetector.js +105 -0
- package/dist/features/engage/shakeDetector.js.map +1 -0
- package/dist/features/engage/theme.d.ts +129 -0
- package/dist/features/engage/theme.d.ts.map +1 -0
- package/dist/features/engage/theme.js +270 -0
- package/dist/features/engage/theme.js.map +1 -0
- package/dist/features/engage/throttle.d.ts +31 -0
- package/dist/features/engage/throttle.d.ts.map +1 -0
- package/dist/features/engage/throttle.js +130 -0
- package/dist/features/engage/throttle.js.map +1 -0
- package/dist/features/engage/transport.d.ts +62 -0
- package/dist/features/engage/transport.d.ts.map +1 -0
- package/dist/features/engage/transport.js +185 -0
- package/dist/features/engage/transport.js.map +1 -0
- package/dist/features/engage/triggerEngine.d.ts +39 -0
- package/dist/features/engage/triggerEngine.d.ts.map +1 -0
- package/dist/features/engage/triggerEngine.js +105 -0
- package/dist/features/engage/triggerEngine.js.map +1 -0
- package/dist/features/engage/types.d.ts +265 -0
- package/dist/features/engage/types.d.ts.map +1 -0
- package/dist/features/engage/types.js +3 -0
- package/dist/features/engage/types.js.map +1 -0
- package/dist/features/engage/widget/InAppWidget.d.ts +10 -0
- package/dist/features/engage/widget/InAppWidget.d.ts.map +1 -0
- package/dist/features/engage/widget/InAppWidget.js +136 -0
- package/dist/features/engage/widget/InAppWidget.js.map +1 -0
- package/dist/features/engage/widget/SurveyWidget.d.ts +11 -0
- package/dist/features/engage/widget/SurveyWidget.d.ts.map +1 -0
- package/dist/features/engage/widget/SurveyWidget.js +546 -0
- package/dist/features/engage/widget/SurveyWidget.js.map +1 -0
- package/dist/features/errors/ErrorsFeature.d.ts +62 -0
- package/dist/features/errors/ErrorsFeature.d.ts.map +1 -0
- package/dist/features/errors/ErrorsFeature.js +209 -0
- package/dist/features/errors/ErrorsFeature.js.map +1 -0
- package/dist/features/errors/causes.d.ts +15 -0
- package/dist/features/errors/causes.d.ts.map +1 -0
- package/dist/features/errors/causes.js +29 -0
- package/dist/features/errors/causes.js.map +1 -0
- package/dist/features/errors/dedup.d.ts +28 -0
- package/dist/features/errors/dedup.d.ts.map +1 -0
- package/dist/features/errors/dedup.js +42 -0
- package/dist/features/errors/dedup.js.map +1 -0
- package/dist/features/errors/group/fingerprint.d.ts +13 -0
- package/dist/features/errors/group/fingerprint.d.ts.map +1 -0
- package/dist/features/errors/group/fingerprint.js +45 -0
- package/dist/features/errors/group/fingerprint.js.map +1 -0
- package/dist/features/errors/lazy.d.ts +8 -0
- package/dist/features/errors/lazy.d.ts.map +1 -0
- package/dist/features/errors/lazy.js +8 -0
- package/dist/features/errors/lazy.js.map +1 -0
- package/dist/features/errors/normalize.d.ts +26 -0
- package/dist/features/errors/normalize.d.ts.map +1 -0
- package/dist/features/errors/normalize.js +58 -0
- package/dist/features/errors/normalize.js.map +1 -0
- package/dist/features/errors/parse/stacktrace.d.ts +13 -0
- package/dist/features/errors/parse/stacktrace.d.ts.map +1 -0
- package/dist/features/errors/parse/stacktrace.js +85 -0
- package/dist/features/errors/parse/stacktrace.js.map +1 -0
- package/dist/features/errors/redact.d.ts +7 -0
- package/dist/features/errors/redact.d.ts.map +1 -0
- package/dist/features/errors/redact.js +39 -0
- package/dist/features/errors/redact.js.map +1 -0
- package/dist/features/errors/sampling.d.ts +2 -0
- package/dist/features/errors/sampling.d.ts.map +1 -0
- package/dist/features/errors/sampling.js +24 -0
- package/dist/features/errors/sampling.js.map +1 -0
- package/dist/features/errors/scope.d.ts +26 -0
- package/dist/features/errors/scope.d.ts.map +1 -0
- package/dist/features/errors/scope.js +30 -0
- package/dist/features/errors/scope.js.map +1 -0
- package/dist/features/exit-intent/ExitIntentFeature.d.ts +16 -0
- package/dist/features/exit-intent/ExitIntentFeature.d.ts.map +1 -0
- package/dist/features/exit-intent/ExitIntentFeature.js +25 -0
- package/dist/features/exit-intent/ExitIntentFeature.js.map +1 -0
- package/dist/features/exit-intent/engine.d.ts +127 -0
- package/dist/features/exit-intent/engine.d.ts.map +1 -0
- package/dist/features/exit-intent/engine.js +227 -0
- package/dist/features/exit-intent/engine.js.map +1 -0
- package/dist/features/forms/index.d.ts +83 -0
- package/dist/features/forms/index.d.ts.map +1 -0
- package/dist/features/forms/index.js +405 -0
- package/dist/features/forms/index.js.map +1 -0
- package/dist/features/inapp/InApp2Feature.d.ts +24 -0
- package/dist/features/inapp/InApp2Feature.d.ts.map +1 -0
- package/dist/features/inapp/InApp2Feature.js +43 -0
- package/dist/features/inapp/InApp2Feature.js.map +1 -0
- package/dist/features/inapp/a11y/focus.d.ts +24 -0
- package/dist/features/inapp/a11y/focus.d.ts.map +1 -0
- package/dist/features/inapp/a11y/focus.js +112 -0
- package/dist/features/inapp/a11y/focus.js.map +1 -0
- package/dist/features/inapp/anchor/controller.d.ts +64 -0
- package/dist/features/inapp/anchor/controller.d.ts.map +1 -0
- package/dist/features/inapp/anchor/controller.js +155 -0
- package/dist/features/inapp/anchor/controller.js.map +1 -0
- package/dist/features/inapp/api.d.ts +28 -0
- package/dist/features/inapp/api.d.ts.map +1 -0
- package/dist/features/inapp/api.js +41 -0
- package/dist/features/inapp/api.js.map +1 -0
- package/dist/features/inapp/blocks/blocks.d.ts +65 -0
- package/dist/features/inapp/blocks/blocks.d.ts.map +1 -0
- package/dist/features/inapp/blocks/blocks.js +196 -0
- package/dist/features/inapp/blocks/blocks.js.map +1 -0
- package/dist/features/inapp/blocks/feedback.d.ts +13 -0
- package/dist/features/inapp/blocks/feedback.d.ts.map +1 -0
- package/dist/features/inapp/blocks/feedback.js +154 -0
- package/dist/features/inapp/blocks/feedback.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/carousel.d.ts +8 -0
- package/dist/features/inapp/blocks/heavy/carousel.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/carousel.js +67 -0
- package/dist/features/inapp/blocks/heavy/carousel.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/chart.d.ts +9 -0
- package/dist/features/inapp/blocks/heavy/chart.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/chart.js +83 -0
- package/dist/features/inapp/blocks/heavy/chart.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/code.d.ts +8 -0
- package/dist/features/inapp/blocks/heavy/code.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/code.js +47 -0
- package/dist/features/inapp/blocks/heavy/code.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/confetti.d.ts +9 -0
- package/dist/features/inapp/blocks/heavy/confetti.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/confetti.js +76 -0
- package/dist/features/inapp/blocks/heavy/confetti.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/countdown.d.ts +9 -0
- package/dist/features/inapp/blocks/heavy/countdown.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/countdown.js +59 -0
- package/dist/features/inapp/blocks/heavy/countdown.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/index.d.ts +11 -0
- package/dist/features/inapp/blocks/heavy/index.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/index.js +45 -0
- package/dist/features/inapp/blocks/heavy/index.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/markdown.d.ts +9 -0
- package/dist/features/inapp/blocks/heavy/markdown.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/markdown.js +76 -0
- package/dist/features/inapp/blocks/heavy/markdown.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/productgrid.d.ts +8 -0
- package/dist/features/inapp/blocks/heavy/productgrid.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/productgrid.js +46 -0
- package/dist/features/inapp/blocks/heavy/productgrid.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/qr.d.ts +10 -0
- package/dist/features/inapp/blocks/heavy/qr.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/qr.js +69 -0
- package/dist/features/inapp/blocks/heavy/qr.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/scratch.d.ts +8 -0
- package/dist/features/inapp/blocks/heavy/scratch.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/scratch.js +141 -0
- package/dist/features/inapp/blocks/heavy/scratch.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/slot.d.ts +8 -0
- package/dist/features/inapp/blocks/heavy/slot.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/slot.js +96 -0
- package/dist/features/inapp/blocks/heavy/slot.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/spinwheel.d.ts +9 -0
- package/dist/features/inapp/blocks/heavy/spinwheel.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/spinwheel.js +127 -0
- package/dist/features/inapp/blocks/heavy/spinwheel.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/steps.d.ts +27 -0
- package/dist/features/inapp/blocks/heavy/steps.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/steps.js +127 -0
- package/dist/features/inapp/blocks/heavy/steps.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/streak.d.ts +18 -0
- package/dist/features/inapp/blocks/heavy/streak.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/streak.js +52 -0
- package/dist/features/inapp/blocks/heavy/streak.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/table.d.ts +7 -0
- package/dist/features/inapp/blocks/heavy/table.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/table.js +30 -0
- package/dist/features/inapp/blocks/heavy/table.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/unavailable.d.ts +28 -0
- package/dist/features/inapp/blocks/heavy/unavailable.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/unavailable.js +33 -0
- package/dist/features/inapp/blocks/heavy/unavailable.js.map +1 -0
- package/dist/features/inapp/blocks/heavy/video.d.ts +7 -0
- package/dist/features/inapp/blocks/heavy/video.d.ts.map +1 -0
- package/dist/features/inapp/blocks/heavy/video.js +38 -0
- package/dist/features/inapp/blocks/heavy/video.js.map +1 -0
- package/dist/features/inapp/blocks/styles.d.ts +7 -0
- package/dist/features/inapp/blocks/styles.d.ts.map +1 -0
- package/dist/features/inapp/blocks/styles.js +198 -0
- package/dist/features/inapp/blocks/styles.js.map +1 -0
- package/dist/features/inapp/center/bridge.d.ts +12 -0
- package/dist/features/inapp/center/bridge.d.ts.map +1 -0
- package/dist/features/inapp/center/bridge.js +59 -0
- package/dist/features/inapp/center/bridge.js.map +1 -0
- package/dist/features/inapp/center/panel.d.ts +20 -0
- package/dist/features/inapp/center/panel.d.ts.map +1 -0
- package/dist/features/inapp/center/panel.js +194 -0
- package/dist/features/inapp/center/panel.js.map +1 -0
- package/dist/features/inapp/center/store.d.ts +50 -0
- package/dist/features/inapp/center/store.d.ts.map +1 -0
- package/dist/features/inapp/center/store.js +188 -0
- package/dist/features/inapp/center/store.js.map +1 -0
- package/dist/features/inapp/center/sync.d.ts +32 -0
- package/dist/features/inapp/center/sync.d.ts.map +1 -0
- package/dist/features/inapp/center/sync.js +60 -0
- package/dist/features/inapp/center/sync.js.map +1 -0
- package/dist/features/inapp/center/types.d.ts +46 -0
- package/dist/features/inapp/center/types.d.ts.map +1 -0
- package/dist/features/inapp/center/types.js +5 -0
- package/dist/features/inapp/center/types.js.map +1 -0
- package/dist/features/inapp/core/analytics.d.ts +35 -0
- package/dist/features/inapp/core/analytics.d.ts.map +1 -0
- package/dist/features/inapp/core/analytics.js +70 -0
- package/dist/features/inapp/core/analytics.js.map +1 -0
- package/dist/features/inapp/core/compat.d.ts +28 -0
- package/dist/features/inapp/core/compat.d.ts.map +1 -0
- package/dist/features/inapp/core/compat.js +104 -0
- package/dist/features/inapp/core/compat.js.map +1 -0
- package/dist/features/inapp/core/debugOverlay.d.ts +5 -0
- package/dist/features/inapp/core/debugOverlay.d.ts.map +1 -0
- package/dist/features/inapp/core/debugOverlay.js +79 -0
- package/dist/features/inapp/core/debugOverlay.js.map +1 -0
- package/dist/features/inapp/core/engine.d.ts +70 -0
- package/dist/features/inapp/core/engine.d.ts.map +1 -0
- package/dist/features/inapp/core/engine.js +248 -0
- package/dist/features/inapp/core/engine.js.map +1 -0
- package/dist/features/inapp/core/environment.d.ts +21 -0
- package/dist/features/inapp/core/environment.d.ts.map +1 -0
- package/dist/features/inapp/core/environment.js +57 -0
- package/dist/features/inapp/core/environment.js.map +1 -0
- package/dist/features/inapp/core/host.d.ts +53 -0
- package/dist/features/inapp/core/host.d.ts.map +1 -0
- package/dist/features/inapp/core/host.js +239 -0
- package/dist/features/inapp/core/host.js.map +1 -0
- package/dist/features/inapp/core/keyboard.d.ts +27 -0
- package/dist/features/inapp/core/keyboard.d.ts.map +1 -0
- package/dist/features/inapp/core/keyboard.js +69 -0
- package/dist/features/inapp/core/keyboard.js.map +1 -0
- package/dist/features/inapp/core/metrics.d.ts +73 -0
- package/dist/features/inapp/core/metrics.d.ts.map +1 -0
- package/dist/features/inapp/core/metrics.js +125 -0
- package/dist/features/inapp/core/metrics.js.map +1 -0
- package/dist/features/inapp/core/migration.d.ts +32 -0
- package/dist/features/inapp/core/migration.d.ts.map +1 -0
- package/dist/features/inapp/core/migration.js +28 -0
- package/dist/features/inapp/core/migration.js.map +1 -0
- package/dist/features/inapp/core/orchestrator.d.ts +77 -0
- package/dist/features/inapp/core/orchestrator.d.ts.map +1 -0
- package/dist/features/inapp/core/orchestrator.js +144 -0
- package/dist/features/inapp/core/orchestrator.js.map +1 -0
- package/dist/features/inapp/core/respect.d.ts +51 -0
- package/dist/features/inapp/core/respect.d.ts.map +1 -0
- package/dist/features/inapp/core/respect.js +78 -0
- package/dist/features/inapp/core/respect.js.map +1 -0
- package/dist/features/inapp/core/slots.d.ts +19 -0
- package/dist/features/inapp/core/slots.d.ts.map +1 -0
- package/dist/features/inapp/core/slots.js +53 -0
- package/dist/features/inapp/core/slots.js.map +1 -0
- package/dist/features/inapp/core/targeting.d.ts +58 -0
- package/dist/features/inapp/core/targeting.d.ts.map +1 -0
- package/dist/features/inapp/core/targeting.js +181 -0
- package/dist/features/inapp/core/targeting.js.map +1 -0
- package/dist/features/inapp/core/transport.d.ts +66 -0
- package/dist/features/inapp/core/transport.d.ts.map +1 -0
- package/dist/features/inapp/core/transport.js +154 -0
- package/dist/features/inapp/core/transport.js.map +1 -0
- package/dist/features/inapp/core/triggers.d.ts +94 -0
- package/dist/features/inapp/core/triggers.d.ts.map +1 -0
- package/dist/features/inapp/core/triggers.js +368 -0
- package/dist/features/inapp/core/triggers.js.map +1 -0
- package/dist/features/inapp/inappContract.web.d.ts +47 -0
- package/dist/features/inapp/inappContract.web.d.ts.map +1 -0
- package/dist/features/inapp/inappContract.web.js +219 -0
- package/dist/features/inapp/inappContract.web.js.map +1 -0
- package/dist/features/inapp/index.d.ts +23 -0
- package/dist/features/inapp/index.d.ts.map +1 -0
- package/dist/features/inapp/index.js +23 -0
- package/dist/features/inapp/index.js.map +1 -0
- package/dist/features/inapp/registry.canonical.hash.d.ts +7 -0
- package/dist/features/inapp/registry.canonical.hash.d.ts.map +1 -0
- package/dist/features/inapp/registry.canonical.hash.js +7 -0
- package/dist/features/inapp/registry.canonical.hash.js.map +1 -0
- package/dist/features/inapp/registry.web.canonical.d.ts +21 -0
- package/dist/features/inapp/registry.web.canonical.d.ts.map +1 -0
- package/dist/features/inapp/registry.web.canonical.js +136 -0
- package/dist/features/inapp/registry.web.canonical.js.map +1 -0
- package/dist/features/inapp/registry.web.catalog.d.ts +12 -0
- package/dist/features/inapp/registry.web.catalog.d.ts.map +1 -0
- package/dist/features/inapp/registry.web.catalog.js +208 -0
- package/dist/features/inapp/registry.web.catalog.js.map +1 -0
- package/dist/features/inapp/surfaces/banner.d.ts +7 -0
- package/dist/features/inapp/surfaces/banner.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/banner.js +30 -0
- package/dist/features/inapp/surfaces/banner.js.map +1 -0
- package/dist/features/inapp/surfaces/checklist.d.ts +13 -0
- package/dist/features/inapp/surfaces/checklist.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/checklist.js +127 -0
- package/dist/features/inapp/surfaces/checklist.js.map +1 -0
- package/dist/features/inapp/surfaces/coachmark.d.ts +10 -0
- package/dist/features/inapp/surfaces/coachmark.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/coachmark.js +92 -0
- package/dist/features/inapp/surfaces/coachmark.js.map +1 -0
- package/dist/features/inapp/surfaces/hotspot.d.ts +8 -0
- package/dist/features/inapp/surfaces/hotspot.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/hotspot.js +88 -0
- package/dist/features/inapp/surfaces/hotspot.js.map +1 -0
- package/dist/features/inapp/surfaces/inline.d.ts +13 -0
- package/dist/features/inapp/surfaces/inline.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/inline.js +72 -0
- package/dist/features/inapp/surfaces/inline.js.map +1 -0
- package/dist/features/inapp/surfaces/launcher.d.ts +9 -0
- package/dist/features/inapp/surfaces/launcher.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/launcher.js +54 -0
- package/dist/features/inapp/surfaces/launcher.js.map +1 -0
- package/dist/features/inapp/surfaces/modal.d.ts +8 -0
- package/dist/features/inapp/surfaces/modal.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/modal.js +70 -0
- package/dist/features/inapp/surfaces/modal.js.map +1 -0
- package/dist/features/inapp/surfaces/mount.d.ts +19 -0
- package/dist/features/inapp/surfaces/mount.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/mount.js +29 -0
- package/dist/features/inapp/surfaces/mount.js.map +1 -0
- package/dist/features/inapp/surfaces/palette.d.ts +9 -0
- package/dist/features/inapp/surfaces/palette.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/palette.js +127 -0
- package/dist/features/inapp/surfaces/palette.js.map +1 -0
- package/dist/features/inapp/surfaces/panel.d.ts +14 -0
- package/dist/features/inapp/surfaces/panel.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/panel.js +91 -0
- package/dist/features/inapp/surfaces/panel.js.map +1 -0
- package/dist/features/inapp/surfaces/popover.d.ts +10 -0
- package/dist/features/inapp/surfaces/popover.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/popover.js +66 -0
- package/dist/features/inapp/surfaces/popover.js.map +1 -0
- package/dist/features/inapp/surfaces/render.d.ts +34 -0
- package/dist/features/inapp/surfaces/render.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/render.js +52 -0
- package/dist/features/inapp/surfaces/render.js.map +1 -0
- package/dist/features/inapp/surfaces/slideover.d.ts +9 -0
- package/dist/features/inapp/surfaces/slideover.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/slideover.js +144 -0
- package/dist/features/inapp/surfaces/slideover.js.map +1 -0
- package/dist/features/inapp/surfaces/styles.d.ts +7 -0
- package/dist/features/inapp/surfaces/styles.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/styles.js +186 -0
- package/dist/features/inapp/surfaces/styles.js.map +1 -0
- package/dist/features/inapp/surfaces/surface.d.ts +69 -0
- package/dist/features/inapp/surfaces/surface.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/surface.js +80 -0
- package/dist/features/inapp/surfaces/surface.js.map +1 -0
- package/dist/features/inapp/surfaces/takeover.d.ts +9 -0
- package/dist/features/inapp/surfaces/takeover.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/takeover.js +60 -0
- package/dist/features/inapp/surfaces/takeover.js.map +1 -0
- package/dist/features/inapp/surfaces/toast.d.ts +7 -0
- package/dist/features/inapp/surfaces/toast.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/toast.js +48 -0
- package/dist/features/inapp/surfaces/toast.js.map +1 -0
- package/dist/features/inapp/surfaces/toolbar.d.ts +8 -0
- package/dist/features/inapp/surfaces/toolbar.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/toolbar.js +62 -0
- package/dist/features/inapp/surfaces/toolbar.js.map +1 -0
- package/dist/features/inapp/surfaces/tour.d.ts +14 -0
- package/dist/features/inapp/surfaces/tour.d.ts.map +1 -0
- package/dist/features/inapp/surfaces/tour.js +199 -0
- package/dist/features/inapp/surfaces/tour.js.map +1 -0
- package/dist/features/inapp/types.d.ts +163 -0
- package/dist/features/inapp/types.d.ts.map +1 -0
- package/dist/features/inapp/types.js +12 -0
- package/dist/features/inapp/types.js.map +1 -0
- package/dist/features/inbox/InboxFeature.d.ts +57 -0
- package/dist/features/inbox/InboxFeature.d.ts.map +1 -0
- package/dist/features/inbox/InboxFeature.js +225 -0
- package/dist/features/inbox/InboxFeature.js.map +1 -0
- package/dist/features/inbox/runtime.d.ts +67 -0
- package/dist/features/inbox/runtime.d.ts.map +1 -0
- package/dist/features/inbox/runtime.js +376 -0
- package/dist/features/inbox/runtime.js.map +1 -0
- package/dist/features/inbox/store.d.ts +37 -0
- package/dist/features/inbox/store.d.ts.map +1 -0
- package/dist/features/inbox/store.js +149 -0
- package/dist/features/inbox/store.js.map +1 -0
- package/dist/features/inbox/sync.d.ts +49 -0
- package/dist/features/inbox/sync.d.ts.map +1 -0
- package/dist/features/inbox/sync.js +131 -0
- package/dist/features/inbox/sync.js.map +1 -0
- package/dist/features/inbox/types.d.ts +275 -0
- package/dist/features/inbox/types.d.ts.map +1 -0
- package/dist/features/inbox/types.js +42 -0
- package/dist/features/inbox/types.js.map +1 -0
- package/dist/features/inbox/widget/InboxWidget.d.ts +16 -0
- package/dist/features/inbox/widget/InboxWidget.d.ts.map +1 -0
- package/dist/features/inbox/widget/InboxWidget.js +608 -0
- package/dist/features/inbox/widget/InboxWidget.js.map +1 -0
- package/dist/features/index.d.ts +21 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +2 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/journey/InteractionTracker.d.ts +34 -0
- package/dist/features/journey/InteractionTracker.d.ts.map +1 -0
- package/dist/features/journey/InteractionTracker.js +125 -0
- package/dist/features/journey/InteractionTracker.js.map +1 -0
- package/dist/features/journey/JourneyFeature.d.ts +18 -0
- package/dist/features/journey/JourneyFeature.d.ts.map +1 -0
- package/dist/features/journey/JourneyFeature.js +57 -0
- package/dist/features/journey/JourneyFeature.js.map +1 -0
- package/dist/features/journey/NavigationTracker.d.ts +16 -0
- package/dist/features/journey/NavigationTracker.d.ts.map +1 -0
- package/dist/features/journey/NavigationTracker.js +92 -0
- package/dist/features/journey/NavigationTracker.js.map +1 -0
- package/dist/features/journey/friction.d.ts +29 -0
- package/dist/features/journey/friction.d.ts.map +1 -0
- package/dist/features/journey/friction.js +65 -0
- package/dist/features/journey/friction.js.map +1 -0
- package/dist/features/manifest.d.ts +20 -0
- package/dist/features/manifest.d.ts.map +1 -0
- package/dist/features/manifest.js +76 -0
- package/dist/features/manifest.js.map +1 -0
- package/dist/features/network/NetworkFeature.d.ts +56 -0
- package/dist/features/network/NetworkFeature.d.ts.map +1 -0
- package/dist/features/network/NetworkFeature.js +235 -0
- package/dist/features/network/NetworkFeature.js.map +1 -0
- package/dist/features/network/capture/body.d.ts +31 -0
- package/dist/features/network/capture/body.d.ts.map +1 -0
- package/dist/features/network/capture/body.js +81 -0
- package/dist/features/network/capture/body.js.map +1 -0
- package/dist/features/network/classify.d.ts +21 -0
- package/dist/features/network/classify.d.ts.map +1 -0
- package/dist/features/network/classify.js +50 -0
- package/dist/features/network/classify.js.map +1 -0
- package/dist/features/network/dedup.d.ts +36 -0
- package/dist/features/network/dedup.d.ts.map +1 -0
- package/dist/features/network/dedup.js +68 -0
- package/dist/features/network/dedup.js.map +1 -0
- package/dist/features/network/fetchInterceptor.d.ts +20 -0
- package/dist/features/network/fetchInterceptor.d.ts.map +1 -0
- package/dist/features/network/fetchInterceptor.js +158 -0
- package/dist/features/network/fetchInterceptor.js.map +1 -0
- package/dist/features/network/intercept/beacon.d.ts +14 -0
- package/dist/features/network/intercept/beacon.d.ts.map +1 -0
- package/dist/features/network/intercept/beacon.js +56 -0
- package/dist/features/network/intercept/beacon.js.map +1 -0
- package/dist/features/network/intercept/sse.d.ts +16 -0
- package/dist/features/network/intercept/sse.d.ts.map +1 -0
- package/dist/features/network/intercept/sse.js +74 -0
- package/dist/features/network/intercept/sse.js.map +1 -0
- package/dist/features/network/intercept/streams.d.ts +23 -0
- package/dist/features/network/intercept/streams.d.ts.map +1 -0
- package/dist/features/network/intercept/streams.js +25 -0
- package/dist/features/network/intercept/streams.js.map +1 -0
- package/dist/features/network/intercept/websocket.d.ts +14 -0
- package/dist/features/network/intercept/websocket.d.ts.map +1 -0
- package/dist/features/network/intercept/websocket.js +97 -0
- package/dist/features/network/intercept/websocket.js.map +1 -0
- package/dist/features/network/lazy.d.ts +23 -0
- package/dist/features/network/lazy.d.ts.map +1 -0
- package/dist/features/network/lazy.js +65 -0
- package/dist/features/network/lazy.js.map +1 -0
- package/dist/features/network/normalize.d.ts +9 -0
- package/dist/features/network/normalize.d.ts.map +1 -0
- package/dist/features/network/normalize.js +49 -0
- package/dist/features/network/normalize.js.map +1 -0
- package/dist/features/network/parse/graphql.d.ts +17 -0
- package/dist/features/network/parse/graphql.d.ts.map +1 -0
- package/dist/features/network/parse/graphql.js +106 -0
- package/dist/features/network/parse/graphql.js.map +1 -0
- package/dist/features/network/parse/url.d.ts +12 -0
- package/dist/features/network/parse/url.d.ts.map +1 -0
- package/dist/features/network/parse/url.js +52 -0
- package/dist/features/network/parse/url.js.map +1 -0
- package/dist/features/network/sampler.d.ts +21 -0
- package/dist/features/network/sampler.d.ts.map +1 -0
- package/dist/features/network/sampler.js +25 -0
- package/dist/features/network/sampler.js.map +1 -0
- package/dist/features/network/size.d.ts +21 -0
- package/dist/features/network/size.d.ts.map +1 -0
- package/dist/features/network/size.js +63 -0
- package/dist/features/network/size.js.map +1 -0
- package/dist/features/network/timing.d.ts +41 -0
- package/dist/features/network/timing.d.ts.map +1 -0
- package/dist/features/network/timing.js +134 -0
- package/dist/features/network/timing.js.map +1 -0
- package/dist/features/network/tracing.d.ts +18 -0
- package/dist/features/network/tracing.d.ts.map +1 -0
- package/dist/features/network/tracing.js +46 -0
- package/dist/features/network/tracing.js.map +1 -0
- package/dist/features/network/types.d.ts +75 -0
- package/dist/features/network/types.d.ts.map +1 -0
- package/dist/features/network/types.js +2 -0
- package/dist/features/network/types.js.map +1 -0
- package/dist/features/network/xhrInterceptor.d.ts +12 -0
- package/dist/features/network/xhrInterceptor.d.ts.map +1 -0
- package/dist/features/network/xhrInterceptor.js +108 -0
- package/dist/features/network/xhrInterceptor.js.map +1 -0
- package/dist/features/performance/PerformanceFeature.d.ts +76 -0
- package/dist/features/performance/PerformanceFeature.d.ts.map +1 -0
- package/dist/features/performance/PerformanceFeature.js +265 -0
- package/dist/features/performance/PerformanceFeature.js.map +1 -0
- package/dist/features/performance/jankTap.d.ts +23 -0
- package/dist/features/performance/jankTap.d.ts.map +1 -0
- package/dist/features/performance/jankTap.js +20 -0
- package/dist/features/performance/jankTap.js.map +1 -0
- package/dist/features/performance/longTasks.d.ts +14 -0
- package/dist/features/performance/longTasks.d.ts.map +1 -0
- package/dist/features/performance/longTasks.js +55 -0
- package/dist/features/performance/longTasks.js.map +1 -0
- package/dist/features/performance/normalize.d.ts +15 -0
- package/dist/features/performance/normalize.d.ts.map +1 -0
- package/dist/features/performance/normalize.js +30 -0
- package/dist/features/performance/normalize.js.map +1 -0
- package/dist/features/performance/resources.d.ts +19 -0
- package/dist/features/performance/resources.d.ts.map +1 -0
- package/dist/features/performance/resources.js +78 -0
- package/dist/features/performance/resources.js.map +1 -0
- package/dist/features/performance/sampler.d.ts +10 -0
- package/dist/features/performance/sampler.d.ts.map +1 -0
- package/dist/features/performance/sampler.js +23 -0
- package/dist/features/performance/sampler.js.map +1 -0
- package/dist/features/performance/spa.d.ts +2 -0
- package/dist/features/performance/spa.d.ts.map +1 -0
- package/dist/features/performance/spa.js +40 -0
- package/dist/features/performance/spa.js.map +1 -0
- package/dist/features/performance/throttle.d.ts +21 -0
- package/dist/features/performance/throttle.d.ts.map +1 -0
- package/dist/features/performance/throttle.js +26 -0
- package/dist/features/performance/throttle.js.map +1 -0
- package/dist/features/performance/trace/context.d.ts +17 -0
- package/dist/features/performance/trace/context.d.ts.map +1 -0
- package/dist/features/performance/trace/context.js +33 -0
- package/dist/features/performance/trace/context.js.map +1 -0
- package/dist/features/performance/trace/index.d.ts +7 -0
- package/dist/features/performance/trace/index.d.ts.map +1 -0
- package/dist/features/performance/trace/index.js +6 -0
- package/dist/features/performance/trace/index.js.map +1 -0
- package/dist/features/performance/trace/pageload.d.ts +3 -0
- package/dist/features/performance/trace/pageload.d.ts.map +1 -0
- package/dist/features/performance/trace/pageload.js +34 -0
- package/dist/features/performance/trace/pageload.js.map +1 -0
- package/dist/features/performance/trace/transaction.d.ts +61 -0
- package/dist/features/performance/trace/transaction.d.ts.map +1 -0
- package/dist/features/performance/trace/transaction.js +90 -0
- package/dist/features/performance/trace/transaction.js.map +1 -0
- package/dist/features/performance/trace/types.d.ts +23 -0
- package/dist/features/performance/trace/types.d.ts.map +1 -0
- package/dist/features/performance/trace/types.js +10 -0
- package/dist/features/performance/trace/types.js.map +1 -0
- package/dist/features/performance/traces.d.ts +36 -0
- package/dist/features/performance/traces.d.ts.map +1 -0
- package/dist/features/performance/traces.js +50 -0
- package/dist/features/performance/traces.js.map +1 -0
- package/dist/features/profiler/ProfilerFeature.d.ts +28 -0
- package/dist/features/profiler/ProfilerFeature.d.ts.map +1 -0
- package/dist/features/profiler/ProfilerFeature.js +82 -0
- package/dist/features/profiler/ProfilerFeature.js.map +1 -0
- package/dist/features/profiler/capture.d.ts +8 -0
- package/dist/features/profiler/capture.d.ts.map +1 -0
- package/dist/features/profiler/capture.js +21 -0
- package/dist/features/profiler/capture.js.map +1 -0
- package/dist/features/push/PushFeature.d.ts +120 -0
- package/dist/features/push/PushFeature.d.ts.map +1 -0
- package/dist/features/push/PushFeature.js +319 -0
- package/dist/features/push/PushFeature.js.map +1 -0
- package/dist/features/push/diagnostics.d.ts +55 -0
- package/dist/features/push/diagnostics.d.ts.map +1 -0
- package/dist/features/push/diagnostics.js +383 -0
- package/dist/features/push/diagnostics.js.map +1 -0
- package/dist/features/push/pushState.d.ts +58 -0
- package/dist/features/push/pushState.d.ts.map +1 -0
- package/dist/features/push/pushState.js +75 -0
- package/dist/features/push/pushState.js.map +1 -0
- package/dist/features/push/softAsk.d.ts +68 -0
- package/dist/features/push/softAsk.d.ts.map +1 -0
- package/dist/features/push/softAsk.js +141 -0
- package/dist/features/push/softAsk.js.map +1 -0
- package/dist/features/replay/ReplayFeature.d.ts +32 -0
- package/dist/features/replay/ReplayFeature.d.ts.map +1 -0
- package/dist/features/replay/ReplayFeature.js +132 -0
- package/dist/features/replay/ReplayFeature.js.map +1 -0
- package/dist/features/replay/engine/canvas.d.ts +45 -0
- package/dist/features/replay/engine/canvas.d.ts.map +1 -0
- package/dist/features/replay/engine/canvas.js +122 -0
- package/dist/features/replay/engine/canvas.js.map +1 -0
- package/dist/features/replay/engine/crossOrigin.d.ts +23 -0
- package/dist/features/replay/engine/crossOrigin.d.ts.map +1 -0
- package/dist/features/replay/engine/crossOrigin.js +108 -0
- package/dist/features/replay/engine/crossOrigin.js.map +1 -0
- package/dist/features/replay/engine/cssom.d.ts +31 -0
- package/dist/features/replay/engine/cssom.d.ts.map +1 -0
- package/dist/features/replay/engine/cssom.js +128 -0
- package/dist/features/replay/engine/cssom.js.map +1 -0
- package/dist/features/replay/engine/iframe.d.ts +65 -0
- package/dist/features/replay/engine/iframe.d.ts.map +1 -0
- package/dist/features/replay/engine/iframe.js +186 -0
- package/dist/features/replay/engine/iframe.js.map +1 -0
- package/dist/features/replay/engine/interactions.d.ts +142 -0
- package/dist/features/replay/engine/interactions.d.ts.map +1 -0
- package/dist/features/replay/engine/interactions.js +371 -0
- package/dist/features/replay/engine/interactions.js.map +1 -0
- package/dist/features/replay/engine/mutations.d.ts +49 -0
- package/dist/features/replay/engine/mutations.d.ts.map +1 -0
- package/dist/features/replay/engine/mutations.js +261 -0
- package/dist/features/replay/engine/mutations.js.map +1 -0
- package/dist/features/replay/engine/nodeRegistry.d.ts +23 -0
- package/dist/features/replay/engine/nodeRegistry.d.ts.map +1 -0
- package/dist/features/replay/engine/nodeRegistry.js +51 -0
- package/dist/features/replay/engine/nodeRegistry.js.map +1 -0
- package/dist/features/replay/engine/player.d.ts +11 -0
- package/dist/features/replay/engine/player.d.ts.map +1 -0
- package/dist/features/replay/engine/player.js +284 -0
- package/dist/features/replay/engine/player.js.map +1 -0
- package/dist/features/replay/engine/rebuild.d.ts +8 -0
- package/dist/features/replay/engine/rebuild.d.ts.map +1 -0
- package/dist/features/replay/engine/rebuild.js +46 -0
- package/dist/features/replay/engine/rebuild.js.map +1 -0
- package/dist/features/replay/engine/replayWorker.d.ts +33 -0
- package/dist/features/replay/engine/replayWorker.d.ts.map +1 -0
- package/dist/features/replay/engine/replayWorker.js +175 -0
- package/dist/features/replay/engine/replayWorker.js.map +1 -0
- package/dist/features/replay/engine/resources.d.ts +52 -0
- package/dist/features/replay/engine/resources.d.ts.map +1 -0
- package/dist/features/replay/engine/resources.js +132 -0
- package/dist/features/replay/engine/resources.js.map +1 -0
- package/dist/features/replay/engine/snapshot.d.ts +103 -0
- package/dist/features/replay/engine/snapshot.d.ts.map +1 -0
- package/dist/features/replay/engine/snapshot.js +409 -0
- package/dist/features/replay/engine/snapshot.js.map +1 -0
- package/dist/features/replay/engine/traverse.d.ts +19 -0
- package/dist/features/replay/engine/traverse.d.ts.map +1 -0
- package/dist/features/replay/engine/traverse.js +39 -0
- package/dist/features/replay/engine/traverse.js.map +1 -0
- package/dist/features/replay/engine/types.d.ts +137 -0
- package/dist/features/replay/engine/types.d.ts.map +1 -0
- package/dist/features/replay/engine/types.js +6 -0
- package/dist/features/replay/engine/types.js.map +1 -0
- package/dist/features/replay/engine/webglPatch.d.ts +26 -0
- package/dist/features/replay/engine/webglPatch.d.ts.map +1 -0
- package/dist/features/replay/engine/webglPatch.js +83 -0
- package/dist/features/replay/engine/webglPatch.js.map +1 -0
- package/dist/features/replay/lifecycle/adaptive.d.ts +38 -0
- package/dist/features/replay/lifecycle/adaptive.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/adaptive.js +90 -0
- package/dist/features/replay/lifecycle/adaptive.js.map +1 -0
- package/dist/features/replay/lifecycle/cadence.d.ts +20 -0
- package/dist/features/replay/lifecycle/cadence.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/cadence.js +62 -0
- package/dist/features/replay/lifecycle/cadence.js.map +1 -0
- package/dist/features/replay/lifecycle/deviceSignals.d.ts +35 -0
- package/dist/features/replay/lifecycle/deviceSignals.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/deviceSignals.js +61 -0
- package/dist/features/replay/lifecycle/deviceSignals.js.map +1 -0
- package/dist/features/replay/lifecycle/pii.d.ts +14 -0
- package/dist/features/replay/lifecycle/pii.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/pii.js +52 -0
- package/dist/features/replay/lifecycle/pii.js.map +1 -0
- package/dist/features/replay/lifecycle/recorder.d.ts +129 -0
- package/dist/features/replay/lifecycle/recorder.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/recorder.js +509 -0
- package/dist/features/replay/lifecycle/recorder.js.map +1 -0
- package/dist/features/replay/lifecycle/sampling.d.ts +28 -0
- package/dist/features/replay/lifecycle/sampling.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/sampling.js +31 -0
- package/dist/features/replay/lifecycle/sampling.js.map +1 -0
- package/dist/features/replay/lifecycle/segmentBuffer.d.ts +75 -0
- package/dist/features/replay/lifecycle/segmentBuffer.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/segmentBuffer.js +130 -0
- package/dist/features/replay/lifecycle/segmentBuffer.js.map +1 -0
- package/dist/features/replay/lifecycle/viewContext.d.ts +7 -0
- package/dist/features/replay/lifecycle/viewContext.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/viewContext.js +51 -0
- package/dist/features/replay/lifecycle/viewContext.js.map +1 -0
- package/dist/features/scroll/index.d.ts +31 -0
- package/dist/features/scroll/index.d.ts.map +1 -0
- package/dist/features/scroll/index.js +102 -0
- package/dist/features/scroll/index.js.map +1 -0
- package/dist/features/session/sessionManager.d.ts +25 -0
- package/dist/features/session/sessionManager.d.ts.map +1 -0
- package/dist/features/session/sessionManager.js +36 -0
- package/dist/features/session/sessionManager.js.map +1 -0
- package/dist/features/session/sessionStore.d.ts +106 -0
- package/dist/features/session/sessionStore.d.ts.map +1 -0
- package/dist/features/session/sessionStore.js +265 -0
- package/dist/features/session/sessionStore.js.map +1 -0
- package/dist/features/watchdog/WatchdogFeature.d.ts +23 -0
- package/dist/features/watchdog/WatchdogFeature.d.ts.map +1 -0
- package/dist/features/watchdog/WatchdogFeature.js +29 -0
- package/dist/features/watchdog/WatchdogFeature.js.map +1 -0
- package/dist/features/watchdog/collectors.d.ts +18 -0
- package/dist/features/watchdog/collectors.d.ts.map +1 -0
- package/dist/features/watchdog/collectors.js +107 -0
- package/dist/features/watchdog/collectors.js.map +1 -0
- package/dist/features/watchdog/config.d.ts +51 -0
- package/dist/features/watchdog/config.d.ts.map +1 -0
- package/dist/features/watchdog/config.js +28 -0
- package/dist/features/watchdog/config.js.map +1 -0
- package/dist/features/watchdog/engine.d.ts +22 -0
- package/dist/features/watchdog/engine.d.ts.map +1 -0
- package/dist/features/watchdog/engine.js +123 -0
- package/dist/features/watchdog/engine.js.map +1 -0
- package/dist/features/watchdog/incidents.d.ts +79 -0
- package/dist/features/watchdog/incidents.d.ts.map +1 -0
- package/dist/features/watchdog/incidents.js +204 -0
- package/dist/features/watchdog/incidents.js.map +1 -0
- package/dist/features/watchdog/rollup.d.ts +41 -0
- package/dist/features/watchdog/rollup.d.ts.map +1 -0
- package/dist/features/watchdog/rollup.js +76 -0
- package/dist/features/watchdog/rollup.js.map +1 -0
- package/dist/features/webVitals/WebVitalsFeature.d.ts +46 -0
- package/dist/features/webVitals/WebVitalsFeature.d.ts.map +1 -0
- package/dist/features/webVitals/WebVitalsFeature.js +252 -0
- package/dist/features/webVitals/WebVitalsFeature.js.map +1 -0
- package/dist/features/webVitals/attribution.d.ts +50 -0
- package/dist/features/webVitals/attribution.d.ts.map +1 -0
- package/dist/features/webVitals/attribution.js +186 -0
- package/dist/features/webVitals/attribution.js.map +1 -0
- package/dist/features/webVitals/observe.d.ts +6 -0
- package/dist/features/webVitals/observe.d.ts.map +1 -0
- package/dist/features/webVitals/observe.js +6 -0
- package/dist/features/webVitals/observe.js.map +1 -0
- package/dist/features/webVitals/vitals.d.ts +99 -0
- package/dist/features/webVitals/vitals.d.ts.map +1 -0
- package/dist/features/webVitals/vitals.js +166 -0
- package/dist/features/webVitals/vitals.js.map +1 -0
- package/dist/features/webperf/WebPerfFeature.d.ts +19 -0
- package/dist/features/webperf/WebPerfFeature.d.ts.map +1 -0
- package/dist/features/webperf/WebPerfFeature.js +48 -0
- package/dist/features/webperf/WebPerfFeature.js.map +1 -0
- package/dist/features/webperf/collectors.d.ts +3 -0
- package/dist/features/webperf/collectors.d.ts.map +1 -0
- package/dist/features/webperf/collectors.js +118 -0
- package/dist/features/webperf/collectors.js.map +1 -0
- package/dist/features/webperf/math.d.ts +12 -0
- package/dist/features/webperf/math.d.ts.map +1 -0
- package/dist/features/webperf/math.js +26 -0
- package/dist/features/webperf/math.js.map +1 -0
- package/dist/inapp.d.ts +6 -0
- package/dist/inapp.d.ts.map +1 -0
- package/dist/inapp.js +6 -0
- package/dist/inapp.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/index.d.ts +7 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +2 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/pipeline/index.d.ts +3 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +3 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/pipeline.d.ts +84 -0
- package/dist/pipeline/pipeline.d.ts.map +1 -0
- package/dist/pipeline/pipeline.js +284 -0
- package/dist/pipeline/pipeline.js.map +1 -0
- package/dist/public/ScaleBunFacade.d.ts +382 -0
- package/dist/public/ScaleBunFacade.d.ts.map +1 -0
- package/dist/public/ScaleBunFacade.js +787 -0
- package/dist/public/ScaleBunFacade.js.map +1 -0
- package/dist/public/index.d.ts +5 -0
- package/dist/public/index.d.ts.map +1 -0
- package/dist/public/index.js +4 -0
- package/dist/public/index.js.map +1 -0
- package/dist/public/typedTracker.d.ts +91 -0
- package/dist/public/typedTracker.d.ts.map +1 -0
- package/dist/public/typedTracker.js +60 -0
- package/dist/public/typedTracker.js.map +1 -0
- package/dist/scalebun-push-sw.js +236 -0
- package/dist/scalebun.min.js +635 -0
- package/dist/scalebun.min.js.map +7 -0
- package/dist/storage/idb.d.ts +16 -0
- package/dist/storage/idb.d.ts.map +1 -0
- package/dist/storage/idb.js +76 -0
- package/dist/storage/idb.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/transport/gzip.d.ts +2 -0
- package/dist/transport/gzip.d.ts.map +1 -0
- package/dist/transport/gzip.js +20 -0
- package/dist/transport/gzip.js.map +1 -0
- package/dist/transport/httpClient.d.ts +60 -0
- package/dist/transport/httpClient.d.ts.map +1 -0
- package/dist/transport/httpClient.js +154 -0
- package/dist/transport/httpClient.js.map +1 -0
- package/dist/transport/index.d.ts +3 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +3 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/sign.d.ts +25 -0
- package/dist/transport/sign.d.ts.map +1 -0
- package/dist/transport/sign.js +58 -0
- package/dist/transport/sign.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted web session identity.
|
|
3
|
+
*
|
|
4
|
+
* THE BUG THIS FIXES
|
|
5
|
+
* `SessionManager` minted `sess_${uuid()}` in its constructor and stored it nowhere, so EVERY
|
|
6
|
+
* document load started a new session. A refresh, a hard navigation, or opening the same app in a
|
|
7
|
+
* second tab each produced a separate "visit" — session replay showed a user's single journey as a
|
|
8
|
+
* pile of disconnected 10-second sessions, and every session-scoped metric (duration, events per
|
|
9
|
+
* session, rage-click grouping) was measured against the wrong denominator.
|
|
10
|
+
*
|
|
11
|
+
* WHAT A SESSION IS NOW
|
|
12
|
+
* One session continues across refreshes and navigations within a browsing context, and ends when
|
|
13
|
+
* that context goes away (the tab or browser is closed), after a period of inactivity (default 30
|
|
14
|
+
* minutes), or once it hits an absolute cap (default 24 hours, so a tab left open for days cannot
|
|
15
|
+
* produce an infinite session).
|
|
16
|
+
*
|
|
17
|
+
* WHY sessionStorage AND NOT localStorage
|
|
18
|
+
* This first shipped on localStorage, following the GA/analytics definition of a session: storage
|
|
19
|
+
* that outlives the browsing context, expired purely by a 30-minute idle timer. That is correct for
|
|
20
|
+
* analytics and WRONG here — it meant closing the site and returning a minute later resumed the old
|
|
21
|
+
* session, because "closed the browser" is not an end signal in that model. For session REPLAY a
|
|
22
|
+
* visit ends when the visit ends.
|
|
23
|
+
*
|
|
24
|
+
* sessionStorage is scoped to the browsing context: it survives refreshes and same-tab navigations
|
|
25
|
+
* (the actual bug this file exists to fix) and is dropped when the tab closes. The idle timeout is
|
|
26
|
+
* kept on top of it so a tab left open overnight still rolls over.
|
|
27
|
+
*
|
|
28
|
+
* The tradeoff, stated plainly: sessionStorage is per-TAB, so opening a link in a new tab starts a
|
|
29
|
+
* new session. For replay that is arguably the better shape anyway — frames are per-document, and
|
|
30
|
+
* two tabs sharing one session means two writers interleaving into a single `seq` space (see below).
|
|
31
|
+
* Caveat: browsers that restore tabs after a crash also restore sessionStorage, so crash → "restore
|
|
32
|
+
* tabs" can resume; crash → reopening manually starts fresh.
|
|
33
|
+
*
|
|
34
|
+
* THE SEQUENCE COUNTER LIVES HERE TOO, DELIBERATELY
|
|
35
|
+
* Replay frames carry a per-session `seq`, and the backend both orders frames by it
|
|
36
|
+
* (`orderBy: { sequenceNumber: 'asc' }`) and resolves a keyframe's deltas as the frames in
|
|
37
|
+
* `[seq, nextSeq)`. The recorder's counter is per-INSTANCE and restarts at 0 on every page load, so
|
|
38
|
+
* resuming a session without also resuming the counter would emit a second frame 0, 1, 2… that
|
|
39
|
+
* sorts *before* the first load's later frames and scrambles the replay. Persisting the id without
|
|
40
|
+
* the counter would have traded a visible bug for a subtler one.
|
|
41
|
+
*/
|
|
42
|
+
/** Inactivity that ends a session. 30 min is the de-facto standard (GA, and most RUM tools). */
|
|
43
|
+
export declare const DEFAULT_SESSION_TIMEOUT_MS: number;
|
|
44
|
+
/**
|
|
45
|
+
* Hard cap so a tab left open for days does not report one endless session.
|
|
46
|
+
*
|
|
47
|
+
* 4 HOURS, lowered from 24. A 24-hour cap describes a DEVICE, not a visit: measured on live Joint
|
|
48
|
+
* Clinic data, clinic workstations left open across a shift produced single sessions of 100, 98 and 79
|
|
49
|
+
* minutes, and the cap was the only thing bounding them. Four hours is longer than any genuine sitting
|
|
50
|
+
* while still splitting a shift into a handful of sessions instead of one.
|
|
51
|
+
*
|
|
52
|
+
* ⚠️ This moves SESSION COUNTS, and therefore every per-session metric (sessions/day, per-session
|
|
53
|
+
* averages, conversion-per-session). It is a deliberate product change, not a refactor — hosts who
|
|
54
|
+
* want the old behaviour set `sessionMaxDurationMs: 86_400_000`.
|
|
55
|
+
*/
|
|
56
|
+
export declare const DEFAULT_SESSION_MAX_MS: number;
|
|
57
|
+
export interface SessionRecord {
|
|
58
|
+
id: string;
|
|
59
|
+
/** When this session began — drives the absolute cap. */
|
|
60
|
+
startedAt: number;
|
|
61
|
+
/** Last activity we observed — drives the inactivity timeout. */
|
|
62
|
+
lastSeenAt: number;
|
|
63
|
+
/** Next replay frame sequence number for this session. */
|
|
64
|
+
seq: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resume the stored session when it is still live, otherwise start a fresh one.
|
|
68
|
+
*
|
|
69
|
+
* Clock note: `lastSeenAt` is wall-clock, so a large system-clock change can expire a session early
|
|
70
|
+
* or hold one open. Expiring early is the safe direction, and a negative delta (clock moved
|
|
71
|
+
* backwards) is treated as "no time passed" rather than as a huge idle gap.
|
|
72
|
+
*/
|
|
73
|
+
export declare function resolveSession(timeoutMs?: number, maxMs?: number): SessionRecord;
|
|
74
|
+
/** Test seam — drop the in-memory copy so a case can simulate a fresh document. */
|
|
75
|
+
export declare function __resetLiveSessionForTests(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Mark activity so the inactivity window slides forward.
|
|
78
|
+
*
|
|
79
|
+
* Called on the per-envelope path, so it is THROTTLED: without this a busy page would do a
|
|
80
|
+
* JSON parse + sessionStorage write per event, and sessionStorage is synchronous — that is main-thread
|
|
81
|
+
* work on the hot path. Once a minute is far finer than the 30-minute window it feeds.
|
|
82
|
+
*/
|
|
83
|
+
export declare function touchSession(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Reserve `count` sequence numbers and return the first.
|
|
86
|
+
*
|
|
87
|
+
* Read-modify-write against storage rather than a purely in-memory counter, so the counter SURVIVES
|
|
88
|
+
* a refresh: a resumed session must keep numbering upward instead of restarting at 0 and sorting its
|
|
89
|
+
* new frames before the old ones.
|
|
90
|
+
*
|
|
91
|
+
* Since the move to sessionStorage the store is per-tab, so the cross-tab contention this used to
|
|
92
|
+
* guard against cannot arise — two tabs now hold two different sessions, each with its own counter.
|
|
93
|
+
*/
|
|
94
|
+
export declare function reserveSeq(count?: number): number;
|
|
95
|
+
/**
|
|
96
|
+
* Raise the next-sequence floor, returning it.
|
|
97
|
+
*
|
|
98
|
+
* Crash recovery replays a pre-roll buffer whose frames ALREADY consumed sequence numbers, but those
|
|
99
|
+
* frames were written by a previous document and the store knows nothing about them. Without this the
|
|
100
|
+
* counter would hand the same numbers out again and the recovered frames would collide with the new
|
|
101
|
+
* session's — the exact ordering corruption the persisted counter exists to prevent.
|
|
102
|
+
*/
|
|
103
|
+
export declare function ensureSeqAtLeast(next: number): number;
|
|
104
|
+
/** Ends the current session; the next resolve() mints a new id. Used by `reset()` / logout. */
|
|
105
|
+
export declare function clearSession(): void;
|
|
106
|
+
//# sourceMappingURL=sessionStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.d.ts","sourceRoot":"","sources":["../../../src/features/session/sessionStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAMH,gGAAgG;AAChG,eAAO,MAAM,0BAA0B,QAAiB,CAAC;AACzD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,QAAqB,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;CACb;AAwDD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,GAAE,MAAmC,EAC9C,KAAK,GAAE,MAA+B,GACrC,aAAa,CAgBf;AAoBD,mFAAmF;AACnF,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAMD;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAgDnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,SAAI,GAAG,MAAM,CAe5C;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWrD;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,IAAI,IAAI,CAMnC"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted web session identity.
|
|
3
|
+
*
|
|
4
|
+
* THE BUG THIS FIXES
|
|
5
|
+
* `SessionManager` minted `sess_${uuid()}` in its constructor and stored it nowhere, so EVERY
|
|
6
|
+
* document load started a new session. A refresh, a hard navigation, or opening the same app in a
|
|
7
|
+
* second tab each produced a separate "visit" — session replay showed a user's single journey as a
|
|
8
|
+
* pile of disconnected 10-second sessions, and every session-scoped metric (duration, events per
|
|
9
|
+
* session, rage-click grouping) was measured against the wrong denominator.
|
|
10
|
+
*
|
|
11
|
+
* WHAT A SESSION IS NOW
|
|
12
|
+
* One session continues across refreshes and navigations within a browsing context, and ends when
|
|
13
|
+
* that context goes away (the tab or browser is closed), after a period of inactivity (default 30
|
|
14
|
+
* minutes), or once it hits an absolute cap (default 24 hours, so a tab left open for days cannot
|
|
15
|
+
* produce an infinite session).
|
|
16
|
+
*
|
|
17
|
+
* WHY sessionStorage AND NOT localStorage
|
|
18
|
+
* This first shipped on localStorage, following the GA/analytics definition of a session: storage
|
|
19
|
+
* that outlives the browsing context, expired purely by a 30-minute idle timer. That is correct for
|
|
20
|
+
* analytics and WRONG here — it meant closing the site and returning a minute later resumed the old
|
|
21
|
+
* session, because "closed the browser" is not an end signal in that model. For session REPLAY a
|
|
22
|
+
* visit ends when the visit ends.
|
|
23
|
+
*
|
|
24
|
+
* sessionStorage is scoped to the browsing context: it survives refreshes and same-tab navigations
|
|
25
|
+
* (the actual bug this file exists to fix) and is dropped when the tab closes. The idle timeout is
|
|
26
|
+
* kept on top of it so a tab left open overnight still rolls over.
|
|
27
|
+
*
|
|
28
|
+
* The tradeoff, stated plainly: sessionStorage is per-TAB, so opening a link in a new tab starts a
|
|
29
|
+
* new session. For replay that is arguably the better shape anyway — frames are per-document, and
|
|
30
|
+
* two tabs sharing one session means two writers interleaving into a single `seq` space (see below).
|
|
31
|
+
* Caveat: browsers that restore tabs after a crash also restore sessionStorage, so crash → "restore
|
|
32
|
+
* tabs" can resume; crash → reopening manually starts fresh.
|
|
33
|
+
*
|
|
34
|
+
* THE SEQUENCE COUNTER LIVES HERE TOO, DELIBERATELY
|
|
35
|
+
* Replay frames carry a per-session `seq`, and the backend both orders frames by it
|
|
36
|
+
* (`orderBy: { sequenceNumber: 'asc' }`) and resolves a keyframe's deltas as the frames in
|
|
37
|
+
* `[seq, nextSeq)`. The recorder's counter is per-INSTANCE and restarts at 0 on every page load, so
|
|
38
|
+
* resuming a session without also resuming the counter would emit a second frame 0, 1, 2… that
|
|
39
|
+
* sorts *before* the first load's later frames and scrambles the replay. Persisting the id without
|
|
40
|
+
* the counter would have traded a visible bug for a subtler one.
|
|
41
|
+
*/
|
|
42
|
+
import { uuid, now } from '../../core';
|
|
43
|
+
const SESSION_KEY = 'scalebun_session';
|
|
44
|
+
/** Inactivity that ends a session. 30 min is the de-facto standard (GA, and most RUM tools). */
|
|
45
|
+
export const DEFAULT_SESSION_TIMEOUT_MS = 30 * 60 * 1000;
|
|
46
|
+
/**
|
|
47
|
+
* Hard cap so a tab left open for days does not report one endless session.
|
|
48
|
+
*
|
|
49
|
+
* 4 HOURS, lowered from 24. A 24-hour cap describes a DEVICE, not a visit: measured on live Joint
|
|
50
|
+
* Clinic data, clinic workstations left open across a shift produced single sessions of 100, 98 and 79
|
|
51
|
+
* minutes, and the cap was the only thing bounding them. Four hours is longer than any genuine sitting
|
|
52
|
+
* while still splitting a shift into a handful of sessions instead of one.
|
|
53
|
+
*
|
|
54
|
+
* ⚠️ This moves SESSION COUNTS, and therefore every per-session metric (sessions/day, per-session
|
|
55
|
+
* averages, conversion-per-session). It is a deliberate product change, not a refactor — hosts who
|
|
56
|
+
* want the old behaviour set `sessionMaxDurationMs: 86_400_000`.
|
|
57
|
+
*/
|
|
58
|
+
export const DEFAULT_SESSION_MAX_MS = 4 * 60 * 60 * 1000;
|
|
59
|
+
function read() {
|
|
60
|
+
try {
|
|
61
|
+
const raw = typeof sessionStorage !== 'undefined' && sessionStorage.getItem(SESSION_KEY);
|
|
62
|
+
if (!raw)
|
|
63
|
+
return null;
|
|
64
|
+
const a = JSON.parse(raw);
|
|
65
|
+
// A truncated or hand-edited record must not resurrect a broken session.
|
|
66
|
+
if (!Array.isArray(a) || typeof a[0] !== 'string' || !a[0] || typeof a[2] !== 'number')
|
|
67
|
+
return null;
|
|
68
|
+
/**
|
|
69
|
+
* `startedAt` gets the SAME scrutiny as `lastSeenAt`, and falls back to `lastSeenAt` — never 0.
|
|
70
|
+
*
|
|
71
|
+
* It used to be `+a[1] || 0`, which was validated by nothing. A record whose startedAt did not
|
|
72
|
+
* parse therefore resolved to epoch 0, and `resolveSession`'s absolute-cap check
|
|
73
|
+
* (`t - startedAt <= maxMs`) then measured ~56 YEARS and killed the session on the very next load
|
|
74
|
+
* — silently, and forever, because each replacement was written by the same code path. The visible
|
|
75
|
+
* symptom is a brand-new session id seconds after a perfectly good one, which is indistinguishable
|
|
76
|
+
* from "the SDK does not persist sessions at all".
|
|
77
|
+
*
|
|
78
|
+
* Falling back to `lastSeenAt` keeps the session alive and merely under-measures its age, which is
|
|
79
|
+
* the safe direction: the worst case is one session that runs to the idle timeout instead of the
|
|
80
|
+
* cap, rather than a user's whole visit shattered into fragments.
|
|
81
|
+
*/
|
|
82
|
+
const started = typeof a[1] === 'number' && isFinite(a[1]) && a[1] > 0 ? a[1] : a[2];
|
|
83
|
+
return { id: a[0], startedAt: started, lastSeenAt: a[2], seq: a[3] > 0 ? a[3] : 0 };
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null; // storage blocked (private mode / partitioned) or unparsable
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function write(r) {
|
|
90
|
+
// Every persist keeps the in-memory copy current, so a restore can never write back a STALER record
|
|
91
|
+
// than the one in use. Doing this anywhere but here drifts: `reserveSeq` advances the frame counter
|
|
92
|
+
// far more often than the throttled `touchSession` runs, so a restore that had only seen the load-time
|
|
93
|
+
// record would reset `seq` to 0 — and frames numbered from 0 sort BEFORE the earlier ones, which is
|
|
94
|
+
// the exact replay scramble this file's header warns about.
|
|
95
|
+
live = r;
|
|
96
|
+
try {
|
|
97
|
+
if (typeof sessionStorage !== 'undefined') {
|
|
98
|
+
sessionStorage.setItem(SESSION_KEY, JSON.stringify([r.id, r.startedAt, r.lastSeenAt, r.seq]));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
/* quota or blocked storage → session stays in-memory for this document */
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resume the stored session when it is still live, otherwise start a fresh one.
|
|
107
|
+
*
|
|
108
|
+
* Clock note: `lastSeenAt` is wall-clock, so a large system-clock change can expire a session early
|
|
109
|
+
* or hold one open. Expiring early is the safe direction, and a negative delta (clock moved
|
|
110
|
+
* backwards) is treated as "no time passed" rather than as a huge idle gap.
|
|
111
|
+
*/
|
|
112
|
+
export function resolveSession(timeoutMs = DEFAULT_SESSION_TIMEOUT_MS, maxMs = DEFAULT_SESSION_MAX_MS) {
|
|
113
|
+
const t = now();
|
|
114
|
+
const prev = read();
|
|
115
|
+
// Math.max(0, …) so a backwards clock jump reads as "no time passed" rather than a huge idle gap.
|
|
116
|
+
if (prev && Math.max(0, t - prev.lastSeenAt) <= timeoutMs && Math.max(0, t - prev.startedAt) <= maxMs) {
|
|
117
|
+
prev.lastSeenAt = t;
|
|
118
|
+
write(prev);
|
|
119
|
+
live = prev;
|
|
120
|
+
return prev;
|
|
121
|
+
}
|
|
122
|
+
const fresh = { id: `sess_${uuid()}`, startedAt: t, lastSeenAt: t, seq: 0 };
|
|
123
|
+
write(fresh);
|
|
124
|
+
live = fresh;
|
|
125
|
+
return fresh;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The session this document is running, held in memory as well as in storage.
|
|
129
|
+
*
|
|
130
|
+
* WHY A SECOND COPY. `sessionStorage` belongs to the page, not to us, and hosts wipe it. Clearing
|
|
131
|
+
* storage on sign-out is the single most common auth pattern there is — `sessionStorage.clear()` in a
|
|
132
|
+
* logout handler is meant to drop the app's own auth state and takes `scalebun_session` with it as
|
|
133
|
+
* collateral. From the SDK's side the session then simply vanishes mid-visit, and the next resolve
|
|
134
|
+
* mints a new id: one continuous visit is reported as two sessions, which is exactly the "I logged out
|
|
135
|
+
* in the same tab and got a new session" report. The same thing happens on sign-IN for apps that clear
|
|
136
|
+
* storage before establishing the new identity.
|
|
137
|
+
*
|
|
138
|
+
* This copy lets `touchSession` notice the record has disappeared and put it back, so a host clearing
|
|
139
|
+
* storage no longer silently splits the visit. It is deliberately NOT a second source of truth: a real
|
|
140
|
+
* boundary (idle timeout, absolute cap, tab close) still ends the session, because those are decided in
|
|
141
|
+
* `resolveSession` at load time and this only ever restores the id the document is already using.
|
|
142
|
+
*/
|
|
143
|
+
let live = null;
|
|
144
|
+
/** Test seam — drop the in-memory copy so a case can simulate a fresh document. */
|
|
145
|
+
export function __resetLiveSessionForTests() {
|
|
146
|
+
live = null;
|
|
147
|
+
}
|
|
148
|
+
let lastTouch = 0;
|
|
149
|
+
/** Sequence counter used when no record can be persisted (see reserveSeq). */
|
|
150
|
+
let memSeq = 0;
|
|
151
|
+
/**
|
|
152
|
+
* Mark activity so the inactivity window slides forward.
|
|
153
|
+
*
|
|
154
|
+
* Called on the per-envelope path, so it is THROTTLED: without this a busy page would do a
|
|
155
|
+
* JSON parse + sessionStorage write per event, and sessionStorage is synchronous — that is main-thread
|
|
156
|
+
* work on the hot path. Once a minute is far finer than the 30-minute window it feeds.
|
|
157
|
+
*/
|
|
158
|
+
export function touchSession() {
|
|
159
|
+
/**
|
|
160
|
+
* D5 — a HIDDEN document does not slide the inactivity window.
|
|
161
|
+
*
|
|
162
|
+
* This runs on the per-envelope path, which means TELEMETRY kept the session alive, not the visitor:
|
|
163
|
+
* a parked background tab still flushes a queue and refreshes config, so `lastSeenAt` advanced every
|
|
164
|
+
* minute and the 30-minute timeout was never reached. That is why the only thing bounding a
|
|
165
|
+
* shift-long tab was the hard cap. Freezing `lastSeenAt` while hidden lets the timeout actually fire,
|
|
166
|
+
* so returning after 30+ minutes away resolves to a NEW session on the next load.
|
|
167
|
+
*
|
|
168
|
+
* A hidden tab playing media is the honest edge case here — it is genuinely doing something, and
|
|
169
|
+
* this will let its session expire. Treating "hidden" as "not present" is the right default for a
|
|
170
|
+
* clinic workstation, which is the case that prompted this; a host that needs otherwise can raise
|
|
171
|
+
* `sessionTimeoutMs`.
|
|
172
|
+
*/
|
|
173
|
+
if (typeof document !== 'undefined' && document.visibilityState === 'hidden')
|
|
174
|
+
return;
|
|
175
|
+
const t = now();
|
|
176
|
+
/**
|
|
177
|
+
* Self-heal, checked on EVERY call rather than behind the throttle.
|
|
178
|
+
*
|
|
179
|
+
* The throttle exists so a busy page does not do a parse + write per envelope — but the window it
|
|
180
|
+
* creates is the whole problem here: a host that clears storage in its logout handler usually
|
|
181
|
+
* navigates or reloads immediately afterwards, well inside 60 seconds, so a throttled restore would
|
|
182
|
+
* run only after the session had already been lost. This guard is a bare `getItem` with no parse —
|
|
183
|
+
* the cheapest read available — and it only does work in the case that is actually broken.
|
|
184
|
+
*/
|
|
185
|
+
if (live) {
|
|
186
|
+
try {
|
|
187
|
+
if (typeof sessionStorage !== 'undefined' && sessionStorage.getItem(SESSION_KEY) === null) {
|
|
188
|
+
live.lastSeenAt = t;
|
|
189
|
+
write(live);
|
|
190
|
+
lastTouch = t;
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
/* storage blocked — nothing to restore into */
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (t - lastTouch < 60000)
|
|
199
|
+
return;
|
|
200
|
+
lastTouch = t;
|
|
201
|
+
const rec = read();
|
|
202
|
+
if (!rec)
|
|
203
|
+
return;
|
|
204
|
+
rec.lastSeenAt = t;
|
|
205
|
+
write(rec);
|
|
206
|
+
live = rec;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Reserve `count` sequence numbers and return the first.
|
|
210
|
+
*
|
|
211
|
+
* Read-modify-write against storage rather than a purely in-memory counter, so the counter SURVIVES
|
|
212
|
+
* a refresh: a resumed session must keep numbering upward instead of restarting at 0 and sorting its
|
|
213
|
+
* new frames before the old ones.
|
|
214
|
+
*
|
|
215
|
+
* Since the move to sessionStorage the store is per-tab, so the cross-tab contention this used to
|
|
216
|
+
* guard against cannot arise — two tabs now hold two different sessions, each with its own counter.
|
|
217
|
+
*/
|
|
218
|
+
export function reserveSeq(count = 1) {
|
|
219
|
+
const rec = read();
|
|
220
|
+
// No usable record (storage blocked, private mode, or a session that could not be written): fall
|
|
221
|
+
// back to an in-memory counter. Returning a constant 0 here would stamp EVERY frame as seq 0 and
|
|
222
|
+
// destroy replay ordering outright — far worse than the per-document counter this replaced.
|
|
223
|
+
if (!rec) {
|
|
224
|
+
const s = memSeq;
|
|
225
|
+
memSeq += count;
|
|
226
|
+
return s;
|
|
227
|
+
}
|
|
228
|
+
const start = rec.seq;
|
|
229
|
+
rec.seq = start + count;
|
|
230
|
+
rec.lastSeenAt = now();
|
|
231
|
+
write(rec);
|
|
232
|
+
return start;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Raise the next-sequence floor, returning it.
|
|
236
|
+
*
|
|
237
|
+
* Crash recovery replays a pre-roll buffer whose frames ALREADY consumed sequence numbers, but those
|
|
238
|
+
* frames were written by a previous document and the store knows nothing about them. Without this the
|
|
239
|
+
* counter would hand the same numbers out again and the recovered frames would collide with the new
|
|
240
|
+
* session's — the exact ordering corruption the persisted counter exists to prevent.
|
|
241
|
+
*/
|
|
242
|
+
export function ensureSeqAtLeast(next) {
|
|
243
|
+
const rec = read();
|
|
244
|
+
if (!rec) {
|
|
245
|
+
if (memSeq < next)
|
|
246
|
+
memSeq = next;
|
|
247
|
+
return memSeq;
|
|
248
|
+
}
|
|
249
|
+
if (rec.seq < next) {
|
|
250
|
+
rec.seq = next;
|
|
251
|
+
write(rec);
|
|
252
|
+
}
|
|
253
|
+
return rec.seq;
|
|
254
|
+
}
|
|
255
|
+
/** Ends the current session; the next resolve() mints a new id. Used by `reset()` / logout. */
|
|
256
|
+
export function clearSession() {
|
|
257
|
+
try {
|
|
258
|
+
if (typeof sessionStorage !== 'undefined')
|
|
259
|
+
sessionStorage.removeItem(SESSION_KEY);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
/* nothing we can do */
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=sessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../../src/features/session/sessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F-WDOG (W5.2) — Resource Watchdog. Ultra-thin eager shell: feature-detect, then lazy-load the engine
|
|
3
|
+
* (sampling gate + collectors + incident detector + rollup + emit). A production watchdog — continuous
|
|
4
|
+
* low-cost resource sampling → local incident detection → only rollups + incidents egress, replay-
|
|
5
|
+
* correlated on the existing `kind:'performance'` lane (ZERO backend migration). Off by default.
|
|
6
|
+
*
|
|
7
|
+
* Distinct from `profiler` (JS Self-Profiling flame capture): mobile's profiler is desktop-only and
|
|
8
|
+
* never reaches the backend — this watchdog persists incidents. Everything but the detect+import lives
|
|
9
|
+
* in the lazy chunk to keep the core bundle gate.
|
|
10
|
+
*/
|
|
11
|
+
import type { IFeature, FeatureContext } from '@scalebun/sdk-contracts';
|
|
12
|
+
import type { WatchdogStats } from './engine';
|
|
13
|
+
export declare class WatchdogFeature implements IFeature {
|
|
14
|
+
readonly name = "watchdog";
|
|
15
|
+
private active;
|
|
16
|
+
private handle?;
|
|
17
|
+
get isActive(): boolean;
|
|
18
|
+
setup(ctx: FeatureContext): Promise<void>;
|
|
19
|
+
/** Self-observability (`scalebun.watchdog.stats()`), matching errorStats/perfStats. */
|
|
20
|
+
stats(): WatchdogStats;
|
|
21
|
+
teardown(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=WatchdogFeature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WatchdogFeature.d.ts","sourceRoot":"","sources":["../../../src/features/watchdog/WatchdogFeature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,UAAU,CAAC;AAI9D,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAC,CAAiB;IAEhC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAEK,KAAK,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,uFAAuF;IACvF,KAAK,IAAI,aAAa;IAItB,QAAQ,IAAI,IAAI;CAKjB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const EMPTY_STATS = { incidents: 0, droppedIncidents: 0, rollups: 0, tiers: { pressure: false, memory: false } };
|
|
2
|
+
export class WatchdogFeature {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.name = 'watchdog';
|
|
5
|
+
this.active = false;
|
|
6
|
+
}
|
|
7
|
+
get isActive() {
|
|
8
|
+
return this.active;
|
|
9
|
+
}
|
|
10
|
+
async setup(ctx) {
|
|
11
|
+
if (typeof window === 'undefined' || typeof performance === 'undefined')
|
|
12
|
+
return;
|
|
13
|
+
this.active = true;
|
|
14
|
+
const { startWatchdog } = await import('./engine');
|
|
15
|
+
if (!this.active)
|
|
16
|
+
return; // torn down while the chunk loaded
|
|
17
|
+
this.handle = startWatchdog(ctx);
|
|
18
|
+
}
|
|
19
|
+
/** Self-observability (`scalebun.watchdog.stats()`), matching errorStats/perfStats. */
|
|
20
|
+
stats() {
|
|
21
|
+
return this.handle?.stats() ?? EMPTY_STATS;
|
|
22
|
+
}
|
|
23
|
+
teardown() {
|
|
24
|
+
this.active = false;
|
|
25
|
+
this.handle?.stop();
|
|
26
|
+
this.handle = undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=WatchdogFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WatchdogFeature.js","sourceRoot":"","sources":["../../../src/features/watchdog/WatchdogFeature.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,GAAkB,EAAE,SAAS,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;AAEhI,MAAM,OAAO,eAAe;IAA5B;QACW,SAAI,GAAG,UAAU,CAAC;QACnB,WAAM,GAAG,KAAK,CAAC;IAyBzB,CAAC;IAtBC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAmB;QAC7B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,WAAW,KAAK,WAAW;YAAE,OAAO;QAChF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,mCAAmC;QAC7D,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,uFAAuF;IACvF,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,WAAW,CAAC;IAC7C,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PressureState } from './incidents';
|
|
2
|
+
export interface CollectorSinks {
|
|
3
|
+
onHeartbeat: (lagMs: number) => void;
|
|
4
|
+
onPressure: (state: PressureState) => void;
|
|
5
|
+
onMemory: (usedBytes: number, limitBytes: number) => void;
|
|
6
|
+
}
|
|
7
|
+
export interface CollectorHandle {
|
|
8
|
+
stop: () => void;
|
|
9
|
+
/** Whether Compute Pressure is present (decides the incident engine's cpu_spike model). */
|
|
10
|
+
pressureAvailable: boolean;
|
|
11
|
+
/** Whether performance.memory is present (Chromium) — drives the rollup's honest tier map. */
|
|
12
|
+
memoryAvailable: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function startCollectors(sinks: CollectorSinks, opts: {
|
|
15
|
+
heartbeatMs: number;
|
|
16
|
+
memorySampleMs: number;
|
|
17
|
+
}): CollectorHandle;
|
|
18
|
+
//# sourceMappingURL=collectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.d.ts","sourceRoot":"","sources":["../../../src/features/watchdog/collectors.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,2FAA2F;IAC3F,iBAAiB,EAAE,OAAO,CAAC;IAC3B,8FAA8F;IAC9F,eAAe,EAAE,OAAO,CAAC;CAC1B;AAwBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,CAmF7H"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W5.2 — Resource-Watchdog collectors (LAZY chunk; browser APIs only, zero third-party).
|
|
3
|
+
*
|
|
4
|
+
* Tier 0 (universal): event-loop-lag heartbeat — visibility-gated so background-tab timer throttling
|
|
5
|
+
* never masquerades as jank (research caveat). Tier 1 (Chromium): Compute Pressure + performance.memory.
|
|
6
|
+
* FPS + LoAF are NOT collected here — the watchdog taps PerformanceFeature's existing observer
|
|
7
|
+
* (jankTap) rather than opening a second one. Every collector is feature-detected and fail-soft.
|
|
8
|
+
*/
|
|
9
|
+
import { now } from '../../core';
|
|
10
|
+
function isVisible() {
|
|
11
|
+
try {
|
|
12
|
+
return typeof document === 'undefined' || document.visibilityState !== 'hidden';
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function startCollectors(sinks, opts) {
|
|
19
|
+
const cleanups = [];
|
|
20
|
+
// ── Tier 0: event-loop-lag heartbeat (visibility-gated) ───────────────────────
|
|
21
|
+
let last = now();
|
|
22
|
+
let hbTimer;
|
|
23
|
+
const tick = () => {
|
|
24
|
+
const t = now();
|
|
25
|
+
const drift = t - last - opts.heartbeatMs; // extra time beyond the scheduled interval = lag
|
|
26
|
+
last = t;
|
|
27
|
+
if (drift >= 0)
|
|
28
|
+
sinks.onHeartbeat(drift);
|
|
29
|
+
hbTimer = setTimeout(tick, opts.heartbeatMs);
|
|
30
|
+
};
|
|
31
|
+
const startHb = () => {
|
|
32
|
+
last = now(); // fresh baseline — never measure across a paused/hidden span
|
|
33
|
+
hbTimer = setTimeout(tick, opts.heartbeatMs);
|
|
34
|
+
};
|
|
35
|
+
const stopHb = () => {
|
|
36
|
+
if (hbTimer)
|
|
37
|
+
clearTimeout(hbTimer);
|
|
38
|
+
hbTimer = undefined;
|
|
39
|
+
};
|
|
40
|
+
const onVis = () => {
|
|
41
|
+
if (!isVisible())
|
|
42
|
+
stopHb();
|
|
43
|
+
else if (!hbTimer)
|
|
44
|
+
startHb();
|
|
45
|
+
};
|
|
46
|
+
if (typeof document !== 'undefined') {
|
|
47
|
+
document.addEventListener('visibilitychange', onVis);
|
|
48
|
+
cleanups.push(() => document.removeEventListener('visibilitychange', onVis));
|
|
49
|
+
}
|
|
50
|
+
if (isVisible())
|
|
51
|
+
startHb();
|
|
52
|
+
cleanups.push(stopHb);
|
|
53
|
+
// ── Tier 1: Compute Pressure (Chromium) ───────────────────────────────────────
|
|
54
|
+
let pressureAvailable = false;
|
|
55
|
+
try {
|
|
56
|
+
const PO = globalThis.PressureObserver;
|
|
57
|
+
if (typeof PO === 'function') {
|
|
58
|
+
pressureAvailable = true;
|
|
59
|
+
const po = new PO((records) => {
|
|
60
|
+
const rec = records[records.length - 1];
|
|
61
|
+
if (rec?.state)
|
|
62
|
+
sinks.onPressure(rec.state);
|
|
63
|
+
});
|
|
64
|
+
// observe() may reject under a restrictive permissions policy — then pressure simply never
|
|
65
|
+
// arrives (cpu_spike stays quiet this session); the lag-proxy is not retrofitted mid-flight.
|
|
66
|
+
po.observe('cpu', { sampleInterval: 2000 }).catch(() => { });
|
|
67
|
+
cleanups.push(() => {
|
|
68
|
+
try {
|
|
69
|
+
po.disconnect();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
/* ignore */
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
pressureAvailable = false;
|
|
79
|
+
}
|
|
80
|
+
// ── Tier 1: heap trend (Chromium performance.memory) ──────────────────────────
|
|
81
|
+
const memoryAvailable = typeof performance !== 'undefined' && typeof performance.memory?.usedJSHeapSize === 'number';
|
|
82
|
+
if (memoryAvailable) {
|
|
83
|
+
const sampleMem = () => {
|
|
84
|
+
const m = performance.memory;
|
|
85
|
+
if (m && typeof m.usedJSHeapSize === 'number')
|
|
86
|
+
sinks.onMemory(m.usedJSHeapSize, m.jsHeapSizeLimit ?? 0);
|
|
87
|
+
};
|
|
88
|
+
sampleMem(); // seed immediately so slope/leak windows start filling
|
|
89
|
+
const memTimer = setInterval(sampleMem, opts.memorySampleMs);
|
|
90
|
+
cleanups.push(() => clearInterval(memTimer));
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
stop: () => {
|
|
94
|
+
for (const c of cleanups) {
|
|
95
|
+
try {
|
|
96
|
+
c();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
/* ignore */
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
pressureAvailable,
|
|
104
|
+
memoryAvailable,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=collectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../../src/features/watchdog/collectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W5.2 — Resource Watchdog thresholds + options.
|
|
3
|
+
*
|
|
4
|
+
* These are WEB defaults, NOT mobile's: mobile's ProfilerIncidentThresholds were calibrated against a
|
|
5
|
+
* ~2 s native RSS sample cadence; web samples heap every 20–30 s through quantized `performance.memory`
|
|
6
|
+
* and reads CPU load as coarse Compute-Pressure states. Every value here is a starting point to be
|
|
7
|
+
* calibrated during dogfood — the `thresholds` init option exists so this needs no SDK release to tune.
|
|
8
|
+
*/
|
|
9
|
+
export interface WatchdogThresholds {
|
|
10
|
+
/** cpu_spike (Chromium): dwell time in `critical` compute-pressure before it's an incident. */
|
|
11
|
+
pressureSustainMs: number;
|
|
12
|
+
/** cpu_spike (universal fallback): event-loop-lag p95 over the trailing ring that counts as a spike. */
|
|
13
|
+
lagP95Ms: number;
|
|
14
|
+
/** main_thread_stall: a single heartbeat gap at/above this is a stall. */
|
|
15
|
+
mainThreadStallMs: number;
|
|
16
|
+
/** jank_burst: N LoAF/longtask readings within `jankWindowMs`. */
|
|
17
|
+
jankBurstCount: number;
|
|
18
|
+
jankWindowMs: number;
|
|
19
|
+
/** frozen_frame: a LoAF/task whose frame duration is at/above this. */
|
|
20
|
+
frozenFrameMs: number;
|
|
21
|
+
/** memory_surge: heap growth rate (bytes/sec) sustained for 2 consecutive trend intervals. */
|
|
22
|
+
memSurgeBytesPerSec: number;
|
|
23
|
+
/** memory_leak_suspicion: monotonic growth across this many trend samples AND ≥ leakMinBytes total. */
|
|
24
|
+
leakSamples: number;
|
|
25
|
+
leakMinBytes: number;
|
|
26
|
+
/** low_memory_pressure: usedJSHeapSize / jsHeapSizeLimit at/above this. */
|
|
27
|
+
heapUsedRatio: number;
|
|
28
|
+
/** Per-incident-type cooldown (fixes mobile's single global cooldown shadowing all types). */
|
|
29
|
+
cooldownMs: number;
|
|
30
|
+
}
|
|
31
|
+
export declare const DEFAULT_THRESHOLDS: WatchdogThresholds;
|
|
32
|
+
export interface WatchdogOptions {
|
|
33
|
+
/** Per-session deterministic keep rate (fnv1a32 over sessionId). Default 1 (all sessions). */
|
|
34
|
+
sampleRate?: number;
|
|
35
|
+
/** Event-loop-lag heartbeat cadence. Default 1000 ms, floored at 250. */
|
|
36
|
+
heartbeatMs?: number;
|
|
37
|
+
/** Health-rollup window — one `resource_health` item per window. Default 30 000 ms. */
|
|
38
|
+
rollupMs?: number;
|
|
39
|
+
/** performance.memory / measureUserAgentSpecificMemory sample cadence. Default 20 000 ms. */
|
|
40
|
+
memorySampleMs?: number;
|
|
41
|
+
/** Threshold overrides (merged over DEFAULT_THRESHOLDS). */
|
|
42
|
+
thresholds?: Partial<WatchdogThresholds>;
|
|
43
|
+
/** 5.3 — capture a JS Self-Profiling window when an incident fires (no-op until the header is set
|
|
44
|
+
* and phase 5.3 lands). Accepted now so config is forward-compatible. Default true. */
|
|
45
|
+
captureProfileOnIncident?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Global incident rate cap (a session-wide backstop above the per-type cooldowns). */
|
|
48
|
+
export declare const RATE_WINDOW_MS: number;
|
|
49
|
+
export declare const RATE_MAX = 10;
|
|
50
|
+
export declare function resolveThresholds(o?: Partial<WatchdogThresholds>): WatchdogThresholds;
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/features/watchdog/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,kBAAkB;IACjC,+FAA+F;IAC/F,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wGAAwG;IACxG,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uGAAuG;IACvG,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAYhC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzC;4FACwF;IACxF,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,uFAAuF;AACvF,eAAO,MAAM,cAAc,QAAc,CAAC;AAC1C,eAAO,MAAM,QAAQ,KAAK,CAAC;AAE3B,wBAAgB,iBAAiB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAErF"}
|