@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,141 @@
|
|
|
1
|
+
const STORE_KEY = 'scalebun.push.softAsk.snoozedUntil';
|
|
2
|
+
const DAY_MS = 86400000;
|
|
3
|
+
const DEFAULTS = {
|
|
4
|
+
title: 'Stay in the loop',
|
|
5
|
+
body: 'Get notified about important updates. You can turn this off any time.',
|
|
6
|
+
allowText: 'Allow notifications',
|
|
7
|
+
denyText: 'Not now',
|
|
8
|
+
remindAfterDays: 7,
|
|
9
|
+
accent: '#5B4FE0',
|
|
10
|
+
};
|
|
11
|
+
/** A dismissal is a real answer and is honoured across sessions. Storage failures never block. */
|
|
12
|
+
function snoozed() {
|
|
13
|
+
try {
|
|
14
|
+
const until = Number(localStorage.getItem(STORE_KEY) || 0);
|
|
15
|
+
return Number.isFinite(until) && until > Date.now();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function snooze(days) {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem(STORE_KEY, String(Date.now() + days * DAY_MS));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
/* private mode — the worst case is asking again next session */
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Render the dialog and resolve with what the visitor chose.
|
|
31
|
+
*
|
|
32
|
+
* Shadow DOM so the host's CSS cannot break it and ours cannot leak into the host — the same
|
|
33
|
+
* containment rule the in-app surfaces follow.
|
|
34
|
+
*/
|
|
35
|
+
function ask(o) {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
const host = document.createElement('div');
|
|
38
|
+
host.setAttribute('data-scalebun-softask', '');
|
|
39
|
+
// Above ordinary page chrome, below the browser's own prompt (which the OS draws anyway).
|
|
40
|
+
host.style.cssText = 'position:fixed;z-index:2147483000;inset:auto 16px 16px auto';
|
|
41
|
+
const root = host.attachShadow({ mode: 'open' });
|
|
42
|
+
root.innerHTML = `
|
|
43
|
+
<style>
|
|
44
|
+
:host{all:initial}
|
|
45
|
+
.c{width:min(340px,calc(100vw - 32px));box-sizing:border-box;padding:16px 18px;border-radius:14px;
|
|
46
|
+
background:#fff;color:#172033;box-shadow:0 18px 48px rgba(3,7,18,.28);
|
|
47
|
+
font:14px/1.45 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
|
|
48
|
+
animation:in .22s ease-out both}
|
|
49
|
+
@keyframes in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
|
|
50
|
+
.t{font-size:15px;font-weight:700;margin:0 0 4px}
|
|
51
|
+
.b{margin:0 0 14px;color:#5b6472}
|
|
52
|
+
.r{display:flex;gap:8px;justify-content:flex-end}
|
|
53
|
+
button{font:inherit;font-weight:600;border-radius:9px;padding:8px 14px;cursor:pointer;border:0}
|
|
54
|
+
.no{background:transparent;color:#5b6472}
|
|
55
|
+
.yes{background:var(--a);color:#fff}
|
|
56
|
+
@media (prefers-color-scheme:dark){
|
|
57
|
+
.c{background:#1a1e27;color:#f2f4f8}.b{color:#aab2c0}.no{color:#aab2c0}
|
|
58
|
+
}
|
|
59
|
+
@media (prefers-reduced-motion:reduce){.c{animation-duration:1ms}}
|
|
60
|
+
</style>
|
|
61
|
+
<div class="c" role="dialog" aria-modal="false" style="--a:${o.accent}">
|
|
62
|
+
<p class="t"></p>
|
|
63
|
+
<p class="b"></p>
|
|
64
|
+
<div class="r">
|
|
65
|
+
<button class="no" type="button"></button>
|
|
66
|
+
<button class="yes" type="button"></button>
|
|
67
|
+
</div>
|
|
68
|
+
</div>`;
|
|
69
|
+
// textContent, never innerHTML: these strings come from tenant config and must not be able to
|
|
70
|
+
// inject markup into a host page.
|
|
71
|
+
root.querySelector('.t').textContent = o.title;
|
|
72
|
+
root.querySelector('.b').textContent = o.body;
|
|
73
|
+
const no = root.querySelector('.no');
|
|
74
|
+
const yes = root.querySelector('.yes');
|
|
75
|
+
no.textContent = o.denyText;
|
|
76
|
+
yes.textContent = o.allowText;
|
|
77
|
+
const close = (accepted) => {
|
|
78
|
+
host.remove();
|
|
79
|
+
resolve(accepted);
|
|
80
|
+
};
|
|
81
|
+
no.addEventListener('click', () => close(false));
|
|
82
|
+
// ⚠️ This click IS the user activation the browser requires. `enable()` must be called from
|
|
83
|
+
// inside this handler's task — deferring it (setTimeout, await before the call) drops the
|
|
84
|
+
// activation and the real prompt silently never appears.
|
|
85
|
+
yes.addEventListener('click', () => close(true));
|
|
86
|
+
document.body.appendChild(host);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Arm the soft-ask. Resolves once a decision is made (or immediately when it should not run).
|
|
91
|
+
*
|
|
92
|
+
* Every early return is a case where asking would be wrong, not merely unnecessary:
|
|
93
|
+
* • already `granted` — they are subscribed; a dialog would be noise
|
|
94
|
+
* • already `denied` — the browser prompt is unavailable, so "Allow" could not work. Offering a
|
|
95
|
+
* button that cannot succeed is worse than offering nothing.
|
|
96
|
+
* • snoozed — they said not now, and meant it
|
|
97
|
+
*/
|
|
98
|
+
export async function armSoftAsk(opts, deps) {
|
|
99
|
+
if (typeof document === 'undefined' || typeof Notification === 'undefined')
|
|
100
|
+
return;
|
|
101
|
+
const perm = deps.permission();
|
|
102
|
+
if (perm !== 'default')
|
|
103
|
+
return;
|
|
104
|
+
if (snoozed())
|
|
105
|
+
return;
|
|
106
|
+
const o = { ...DEFAULTS, ...opts };
|
|
107
|
+
const run = async () => {
|
|
108
|
+
if (deps.permission() !== 'default' || snoozed())
|
|
109
|
+
return;
|
|
110
|
+
const accepted = await ask(o);
|
|
111
|
+
if (!accepted) {
|
|
112
|
+
snooze(o.remindAfterDays);
|
|
113
|
+
deps.log?.('soft-ask declined — snoozed');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const r = await deps.enable();
|
|
117
|
+
deps.log?.(`soft-ask accepted → enable() = ${r}`);
|
|
118
|
+
// A browser-level block is permanent, so there is nothing to snooze and nothing to retry.
|
|
119
|
+
if (r === 'denied')
|
|
120
|
+
deps.log?.('browser permission denied — the SDK cannot re-ask');
|
|
121
|
+
};
|
|
122
|
+
const t = opts.trigger ?? 'immediate';
|
|
123
|
+
if (t === 'immediate')
|
|
124
|
+
return void run();
|
|
125
|
+
if (typeof t === 'object' && 'afterMs' in t) {
|
|
126
|
+
setTimeout(() => void run(), Math.max(0, t.afterMs));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (typeof t === 'object' && 'onSelector' in t) {
|
|
130
|
+
// Delegated, so it still works for elements added after init (SPA routes, late hydration).
|
|
131
|
+
const onClick = (e) => {
|
|
132
|
+
const el = e.target;
|
|
133
|
+
if (el && el.closest && el.closest(t.onSelector)) {
|
|
134
|
+
document.removeEventListener('click', onClick, true);
|
|
135
|
+
void run();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
document.addEventListener('click', onClick, true);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=softAsk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"softAsk.js","sourceRoot":"","sources":["../../../src/features/push/softAsk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F-RPL — the thin eager shell. Registered in the manifest so the SDK knows replay exists, but it
|
|
3
|
+
* carries almost no code: it makes the deterministic SAMPLING decision (lazy `sampling.ts`) and, only
|
|
4
|
+
* for a sampled session, lazy-loads the full `RecorderController` (`lifecycle/recorder.ts`). All the
|
|
5
|
+
* recording lifecycle — snapshot, segments, checkpoints, cadence, engine wiring — lives in that lazy
|
|
6
|
+
* chunk, so it never weighs down the core bundle. A non-sampled session loads only `sampling.ts`.
|
|
7
|
+
*/
|
|
8
|
+
import type { IFeature, FeatureContext } from '@scalebun/sdk-contracts';
|
|
9
|
+
import type { ReplayStats } from './lifecycle/recorder';
|
|
10
|
+
export declare class ReplayFeature implements IFeature {
|
|
11
|
+
readonly name = "replay";
|
|
12
|
+
private controller?;
|
|
13
|
+
private uninstallWebGL?;
|
|
14
|
+
get isActive(): boolean;
|
|
15
|
+
setup(ctx: FeatureContext): Promise<void>;
|
|
16
|
+
/** Capture-on-signal flush (promote pre-roll → live). No-op until a recorder is active. */
|
|
17
|
+
flush(): void;
|
|
18
|
+
/** Live diagnostics (null when not recording — off, or a non-sampled session). */
|
|
19
|
+
stats(): ReplayStats | null;
|
|
20
|
+
/** Force a re-keyframe (e.g. before a risky flow), so the player gets a clean seek point. */
|
|
21
|
+
checkpoint(reason?: string): void;
|
|
22
|
+
/** Pause capture (keep the session + buffered pre-roll). No-op until a recorder is active. */
|
|
23
|
+
pause(): void;
|
|
24
|
+
/** Resume capture after pause() with a fresh keyframe. No-op unless paused. */
|
|
25
|
+
resume(): void;
|
|
26
|
+
/** Change replay text-masking at runtime (re-keyframes so it applies from here on). */
|
|
27
|
+
setPrivacy(policy: {
|
|
28
|
+
maskAllText?: boolean;
|
|
29
|
+
}): void;
|
|
30
|
+
teardown(): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ReplayFeature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReplayFeature.d.ts","sourceRoot":"","sources":["../../../src/features/replay/ReplayFeature.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAsB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAS5E,qBAAa,aAAc,YAAW,QAAQ;IAC5C,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,UAAU,CAAC,CAAqB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAa;IAEpC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAEK,KAAK,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA2F/C,2FAA2F;IAC3F,KAAK,IAAI,IAAI;IAIb,kFAAkF;IAClF,KAAK,IAAI,WAAW,GAAG,IAAI;IAI3B,6FAA6F;IAC7F,UAAU,CAAC,MAAM,SAAW,GAAG,IAAI;IAInC,8FAA8F;IAC9F,KAAK,IAAI,IAAI;IAIb,+EAA+E;IAC/E,MAAM,IAAI,IAAI;IAId,uFAAuF;IACvF,UAAU,CAAC,MAAM,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAInD,QAAQ,IAAI,IAAI;CAMjB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/** Gap before the single recorder-import retry (A3). Long enough to outlast a blip, short enough that a
|
|
2
|
+
* bouncing visitor is not what decides the outcome. */
|
|
3
|
+
const RECORDER_RETRY_MS = 400;
|
|
4
|
+
/** Extracted so the retry awaits the SAME specifier — two spellings would defeat the module cache. */
|
|
5
|
+
const loadRecorder = () => import('./lifecycle/recorder');
|
|
6
|
+
export class ReplayFeature {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.name = 'replay';
|
|
9
|
+
}
|
|
10
|
+
get isActive() {
|
|
11
|
+
return this.controller?.isActive ?? false;
|
|
12
|
+
}
|
|
13
|
+
async setup(ctx) {
|
|
14
|
+
if (typeof document === 'undefined' || typeof MutationObserver === 'undefined')
|
|
15
|
+
return;
|
|
16
|
+
// Deterministic sampling gate (server-reconcilable fnv1a) — decide BEFORE loading the recorder,
|
|
17
|
+
// so a non-sampled session installs nothing beyond this tiny decision.
|
|
18
|
+
const { decideSampling } = await import('./lifecycle/sampling');
|
|
19
|
+
const decision = decideSampling(ctx.replaySampling, ctx.sessionId ?? '');
|
|
20
|
+
ctx.log('[replay] sampling:', decision.reason, '(bucket', decision.bucket + ')');
|
|
21
|
+
if (!decision.record)
|
|
22
|
+
return;
|
|
23
|
+
// D3 — honor GPC / Do-Not-Track (opt-in via privacy.respectDnt). If the user signalled opt-out,
|
|
24
|
+
// don't record replay at all. Lazy-imported so it costs nothing unless the host opted in.
|
|
25
|
+
if (ctx.respectDnt) {
|
|
26
|
+
const { userOptedOutOfTracking } = await import('./lifecycle/deviceSignals');
|
|
27
|
+
if (userOptedOutOfTracking()) {
|
|
28
|
+
ctx.log('[replay] dnt: skip');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// P3/D1 cost-aware egress (Save-Data/slow/low-mem → buffer instead of stream) is applied inside the
|
|
33
|
+
// lazy recorder so it costs zero eager-core bytes.
|
|
34
|
+
// WebGL replay: force preserveDrawingBuffer as EARLY as possible (must precede the app creating its
|
|
35
|
+
// WebGL context) so the canvas recorder can snapshot 3D/WebGL canvases instead of capturing blank.
|
|
36
|
+
// Gated on canvas capture — we only pay the GPU cost for sampled sessions that record canvases.
|
|
37
|
+
if (ctx.replayCanvas) {
|
|
38
|
+
const { installWebGLPreserve } = await import('./engine/webglPatch');
|
|
39
|
+
this.uninstallWebGL = installWebGLPreserve();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* R3 — WARM the engine chunks concurrently instead of letting them waterfall.
|
|
43
|
+
*
|
|
44
|
+
* Time-to-first-keyframe was five SEQUENTIAL await points: sampling → recorder →
|
|
45
|
+
* worker+segmentBuffer → the engine modules → iframe → only then `takeSnapshot`. Each is a module
|
|
46
|
+
* fetch, so on a cold cache the first keyframe waits on a chain of round trips — which is why
|
|
47
|
+
* sessions under 1s reach only 12% replay coverage while sessions over 30s reach 88%. Nothing is
|
|
48
|
+
* broken; the recorder simply is not loaded yet when a bouncing visitor leaves.
|
|
49
|
+
*
|
|
50
|
+
* These are fire-and-forget: the module registry dedupes, so when `arm()` later awaits the same
|
|
51
|
+
* specifiers they are already resolved and the waterfall collapses to roughly one round trip.
|
|
52
|
+
* Deliberately placed AFTER the sampling gate, so a non-sampled session still fetches nothing —
|
|
53
|
+
* that guarantee is the reason the gate is first, and warming ahead of it would break it.
|
|
54
|
+
*
|
|
55
|
+
* `catch` per import: a warm that fails must stay silent. `arm()` awaits these same specifiers and
|
|
56
|
+
* will surface a genuine failure there; an unhandled rejection here would be noise on a page that
|
|
57
|
+
* is about to record perfectly well from a retried fetch.
|
|
58
|
+
*/
|
|
59
|
+
const warm = (p) => { void p.catch(() => { }); };
|
|
60
|
+
warm(import('../replay/engine/nodeRegistry'));
|
|
61
|
+
warm(import('../replay/engine/snapshot'));
|
|
62
|
+
warm(import('../replay/engine/mutations'));
|
|
63
|
+
warm(import('../replay/engine/interactions'));
|
|
64
|
+
warm(import('../replay/engine/cssom'));
|
|
65
|
+
warm(import('../replay/engine/iframe'));
|
|
66
|
+
warm(import('../replay/engine/replayWorker'));
|
|
67
|
+
warm(import('./lifecycle/segmentBuffer'));
|
|
68
|
+
/**
|
|
69
|
+
* A3 — retry the recorder import before giving up.
|
|
70
|
+
*
|
|
71
|
+
* This one import decides whether the session records at all: everything above it is warming, and
|
|
72
|
+
* `createRecorder` is what installs the observers. A single transient failure here loses the WHOLE
|
|
73
|
+
* session's replay while every other lane (events, perf, network — all eager core) keeps working
|
|
74
|
+
* normally, which is exactly the signature of the 43-of-47 unexplained sessions measured live
|
|
75
|
+
* (`npm run replay:diagnose`): SDK demonstrably ran, zero frames stored.
|
|
76
|
+
*
|
|
77
|
+
* Two attempts, ~400ms apart. Deliberately modest: a chunk that 404s (deploy skew, bad CDN path) will
|
|
78
|
+
* fail identically on retry, so this only buys back the transient cases — a dropped request, a
|
|
79
|
+
* network blip, a cold cache under contention. It costs nothing when the first attempt succeeds,
|
|
80
|
+
* which is the overwhelmingly common path.
|
|
81
|
+
*
|
|
82
|
+
* When the retry SUCCEEDS it says so. Without that event a retry is an unfalsifiable fix: coverage
|
|
83
|
+
* might improve and nobody could tell whether this was why. `sdk_replay_recovered` makes it
|
|
84
|
+
* measurable, and pairs with `sdk_feature_setup_failed` (which the throw below still produces via
|
|
85
|
+
* FeatureRegistry) so both outcomes are visible instead of neither.
|
|
86
|
+
*/
|
|
87
|
+
let createRecorder;
|
|
88
|
+
try {
|
|
89
|
+
({ createRecorder } = await loadRecorder());
|
|
90
|
+
}
|
|
91
|
+
catch (first) {
|
|
92
|
+
await new Promise((r) => setTimeout(r, RECORDER_RETRY_MS));
|
|
93
|
+
({ createRecorder } = await loadRecorder()); // a second failure propagates → reported by the registry
|
|
94
|
+
ctx.trackEvent('sdk_replay_recovered', {
|
|
95
|
+
stage: 'recorder-import',
|
|
96
|
+
message: String(first?.message ?? first).slice(0, 300),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
this.controller = await createRecorder(ctx, decision);
|
|
100
|
+
}
|
|
101
|
+
/** Capture-on-signal flush (promote pre-roll → live). No-op until a recorder is active. */
|
|
102
|
+
flush() {
|
|
103
|
+
this.controller?.flush();
|
|
104
|
+
}
|
|
105
|
+
/** Live diagnostics (null when not recording — off, or a non-sampled session). */
|
|
106
|
+
stats() {
|
|
107
|
+
return this.controller?.stats() ?? null;
|
|
108
|
+
}
|
|
109
|
+
/** Force a re-keyframe (e.g. before a risky flow), so the player gets a clean seek point. */
|
|
110
|
+
checkpoint(reason = 'manual') {
|
|
111
|
+
this.controller?.forceCheckpoint(reason);
|
|
112
|
+
}
|
|
113
|
+
/** Pause capture (keep the session + buffered pre-roll). No-op until a recorder is active. */
|
|
114
|
+
pause() {
|
|
115
|
+
this.controller?.pause();
|
|
116
|
+
}
|
|
117
|
+
/** Resume capture after pause() with a fresh keyframe. No-op unless paused. */
|
|
118
|
+
resume() {
|
|
119
|
+
this.controller?.resume();
|
|
120
|
+
}
|
|
121
|
+
/** Change replay text-masking at runtime (re-keyframes so it applies from here on). */
|
|
122
|
+
setPrivacy(policy) {
|
|
123
|
+
this.controller?.setPrivacy(policy);
|
|
124
|
+
}
|
|
125
|
+
teardown() {
|
|
126
|
+
this.controller?.teardown();
|
|
127
|
+
this.controller = undefined;
|
|
128
|
+
this.uninstallWebGL?.();
|
|
129
|
+
this.uninstallWebGL = undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=ReplayFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReplayFeature.js","sourceRoot":"","sources":["../../../src/features/replay/ReplayFeature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CanvasRecorder — opt-in <canvas> pixel capture. The DOM serializer captures a <canvas> element but
|
|
3
|
+
* not its pixels (they live in a 2D/WebGL context), so canvases replay blank. This throttled loop
|
|
4
|
+
* snapshots each canvas to a compact image and emits an `op:'canvas'` delta keyed by the node id; the
|
|
5
|
+
* player draws it back. Off by default (pixels can't be masked) + a per-canvas blocklist.
|
|
6
|
+
*
|
|
7
|
+
* Handles BOTH 2D and WebGL/3D canvases: a WebGL canvas would normally read back blank from this async
|
|
8
|
+
* loop (`preserveDrawingBuffer:false` clears the buffer after compositing), so `webglPatch.ts` forces
|
|
9
|
+
* `preserveDrawingBuffer:true` at context creation — the same `drawImage`/`toDataURL` path then captures
|
|
10
|
+
* WebGL pixels unchanged. A tainted (cross-origin texture) canvas still throws → skipped.
|
|
11
|
+
*
|
|
12
|
+
* v1 encodes on the main thread (`toDataURL`), bounded by the fps throttle + downscale. Moving the
|
|
13
|
+
* encode into the RPL-WORKER (OffscreenCanvas.convertToBlob) is a follow-up.
|
|
14
|
+
*/
|
|
15
|
+
import type { Mutation } from './types';
|
|
16
|
+
import { NodeRegistry } from './nodeRegistry';
|
|
17
|
+
export interface CanvasOptions {
|
|
18
|
+
fps?: number;
|
|
19
|
+
maxDim?: number;
|
|
20
|
+
quality?: number;
|
|
21
|
+
/** Documents to scan for canvases. Defaults to the top document; the ReplayFeature also passes the
|
|
22
|
+
* observed same-origin iframe sub-documents so in-iframe canvases are captured too (A7). */
|
|
23
|
+
getDocs?: () => Document[];
|
|
24
|
+
}
|
|
25
|
+
export declare class CanvasRecorder {
|
|
26
|
+
private readonly reg;
|
|
27
|
+
private readonly onMutations;
|
|
28
|
+
private readonly log;
|
|
29
|
+
private timer;
|
|
30
|
+
private readonly last;
|
|
31
|
+
private readonly tainted;
|
|
32
|
+
private readonly intervalMs;
|
|
33
|
+
private readonly maxDim;
|
|
34
|
+
private readonly quality;
|
|
35
|
+
private readonly getDocs?;
|
|
36
|
+
private scratch;
|
|
37
|
+
constructor(reg: NodeRegistry, onMutations: (m: Mutation[]) => void, log?: (...a: unknown[]) => void, opts?: CanvasOptions);
|
|
38
|
+
start(): void;
|
|
39
|
+
disconnect(): void;
|
|
40
|
+
private capture;
|
|
41
|
+
/** Encode to a (possibly downscaled) webp data URL. `w/h` stay the ORIGINAL dims so the player
|
|
42
|
+
* redraws at full size. Throws (SecurityError) on a tainted canvas → caller skips. */
|
|
43
|
+
private encode;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=canvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../../src/features/replay/engine/canvas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;iGAC6F;IAC7F,OAAO,CAAC,EAAE,MAAM,QAAQ,EAAE,CAAC;CAC5B;AAID,qBAAa,cAAc;IAWvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAZtB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAkC;gBAG9B,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EACpC,GAAG,GAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,IAAe,EAC1D,IAAI,GAAE,aAAkB;IAQ1B,KAAK,IAAI,IAAI;IAMb,UAAU,IAAI,IAAI;IAQlB,OAAO,CAAC,OAAO;IAkDf;2FACuF;IACvF,OAAO,CAAC,MAAM;CAcf"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CanvasRecorder — opt-in <canvas> pixel capture. The DOM serializer captures a <canvas> element but
|
|
3
|
+
* not its pixels (they live in a 2D/WebGL context), so canvases replay blank. This throttled loop
|
|
4
|
+
* snapshots each canvas to a compact image and emits an `op:'canvas'` delta keyed by the node id; the
|
|
5
|
+
* player draws it back. Off by default (pixels can't be masked) + a per-canvas blocklist.
|
|
6
|
+
*
|
|
7
|
+
* Handles BOTH 2D and WebGL/3D canvases: a WebGL canvas would normally read back blank from this async
|
|
8
|
+
* loop (`preserveDrawingBuffer:false` clears the buffer after compositing), so `webglPatch.ts` forces
|
|
9
|
+
* `preserveDrawingBuffer:true` at context creation — the same `drawImage`/`toDataURL` path then captures
|
|
10
|
+
* WebGL pixels unchanged. A tainted (cross-origin texture) canvas still throws → skipped.
|
|
11
|
+
*
|
|
12
|
+
* v1 encodes on the main thread (`toDataURL`), bounded by the fps throttle + downscale. Moving the
|
|
13
|
+
* encode into the RPL-WORKER (OffscreenCanvas.convertToBlob) is a follow-up.
|
|
14
|
+
*/
|
|
15
|
+
const BLOCK_ATTR = 'data-scalebun-block';
|
|
16
|
+
export class CanvasRecorder {
|
|
17
|
+
constructor(reg, onMutations, log = () => { }, opts = {}) {
|
|
18
|
+
this.reg = reg;
|
|
19
|
+
this.onMutations = onMutations;
|
|
20
|
+
this.log = log;
|
|
21
|
+
this.timer = null;
|
|
22
|
+
this.last = new Map(); // id → last encoded (skip unchanged)
|
|
23
|
+
this.tainted = new Set(); // ids already logged as un-capturable
|
|
24
|
+
this.scratch = null;
|
|
25
|
+
this.intervalMs = Math.max(50, Math.round(1000 / (opts.fps ?? 3)));
|
|
26
|
+
this.maxDim = opts.maxDim ?? 1024;
|
|
27
|
+
this.quality = opts.quality ?? 0.6;
|
|
28
|
+
this.getDocs = opts.getDocs;
|
|
29
|
+
}
|
|
30
|
+
start() {
|
|
31
|
+
if (typeof document === 'undefined')
|
|
32
|
+
return;
|
|
33
|
+
this.capture(); // initial paint so frame 0 has content
|
|
34
|
+
this.timer = setInterval(() => this.capture(), this.intervalMs);
|
|
35
|
+
}
|
|
36
|
+
disconnect() {
|
|
37
|
+
if (this.timer)
|
|
38
|
+
clearInterval(this.timer);
|
|
39
|
+
this.timer = null;
|
|
40
|
+
this.last.clear();
|
|
41
|
+
this.tainted.clear(); // allow re-attempt on restart (a tainted canvas may have been replaced)
|
|
42
|
+
this.scratch = null; // release the downscale buffer
|
|
43
|
+
}
|
|
44
|
+
capture() {
|
|
45
|
+
const docs = this.getDocs
|
|
46
|
+
? this.getDocs()
|
|
47
|
+
: typeof document !== 'undefined'
|
|
48
|
+
? [document]
|
|
49
|
+
: [];
|
|
50
|
+
const muts = [];
|
|
51
|
+
const live = new Set(); // ids seen this tick — anything else no longer exists
|
|
52
|
+
for (const d of docs) {
|
|
53
|
+
let canvases;
|
|
54
|
+
try {
|
|
55
|
+
canvases = d.querySelectorAll('canvas');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue; // sub-document became inaccessible — skip it, keep scanning the rest
|
|
59
|
+
}
|
|
60
|
+
canvases.forEach((c) => {
|
|
61
|
+
const id = this.reg.getId(c);
|
|
62
|
+
if (id == null)
|
|
63
|
+
return; // not in the captured subtree
|
|
64
|
+
live.add(id); // exists, even if we skip capturing it below
|
|
65
|
+
if (c.hasAttribute(BLOCK_ATTR))
|
|
66
|
+
return; // privacy blocklist
|
|
67
|
+
const w = c.width;
|
|
68
|
+
const h = c.height;
|
|
69
|
+
if (!w || !h)
|
|
70
|
+
return;
|
|
71
|
+
let data;
|
|
72
|
+
try {
|
|
73
|
+
data = this.encode(c, w, h);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
if (!this.tainted.has(id)) {
|
|
77
|
+
this.tainted.add(id);
|
|
78
|
+
this.log('[scalebun] canvas not capturable (tainted / cross-origin)');
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (this.last.get(id) === data)
|
|
83
|
+
return; // unchanged since last tick
|
|
84
|
+
this.last.set(id, data);
|
|
85
|
+
muts.push({ op: 'canvas', id, data, w, h });
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// Prune state for canvases that no longer exist. `last` holds an encoded webp DATA URL per canvas
|
|
89
|
+
// and was only cleared on stop(), so it grew for every canvas the session ever saw — the largest
|
|
90
|
+
// retained-bytes leak in the engine. Pruning is free: this tick already enumerated the live set.
|
|
91
|
+
if (this.last.size > live.size) {
|
|
92
|
+
for (const id of this.last.keys())
|
|
93
|
+
if (!live.has(id))
|
|
94
|
+
this.last.delete(id);
|
|
95
|
+
}
|
|
96
|
+
if (this.tainted.size) {
|
|
97
|
+
for (const id of this.tainted)
|
|
98
|
+
if (!live.has(id))
|
|
99
|
+
this.tainted.delete(id);
|
|
100
|
+
}
|
|
101
|
+
if (muts.length)
|
|
102
|
+
this.onMutations(muts);
|
|
103
|
+
}
|
|
104
|
+
/** Encode to a (possibly downscaled) webp data URL. `w/h` stay the ORIGINAL dims so the player
|
|
105
|
+
* redraws at full size. Throws (SecurityError) on a tainted canvas → caller skips. */
|
|
106
|
+
encode(c, w, h) {
|
|
107
|
+
const scale = Math.min(1, this.maxDim / Math.max(w, h));
|
|
108
|
+
if (scale < 1) {
|
|
109
|
+
const sc = (this.scratch ?? (this.scratch = document.createElement('canvas')));
|
|
110
|
+
sc.width = Math.max(1, Math.round(w * scale));
|
|
111
|
+
sc.height = Math.max(1, Math.round(h * scale));
|
|
112
|
+
const ctx = sc.getContext('2d');
|
|
113
|
+
if (!ctx)
|
|
114
|
+
throw new Error('no 2d context');
|
|
115
|
+
ctx.clearRect(0, 0, sc.width, sc.height);
|
|
116
|
+
ctx.drawImage(c, 0, 0, sc.width, sc.height); // taints sc if c is tainted → toDataURL throws
|
|
117
|
+
return sc.toDataURL('image/webp', this.quality);
|
|
118
|
+
}
|
|
119
|
+
return c.toDataURL('image/webp', this.quality);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../../src/features/replay/engine/canvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Mutation, SnapshotOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Run on the cross-origin CHILD page. Waits for a parent handshake from an allowed origin, then
|
|
4
|
+
* records this document (offset registry) and relays frames back. No-op when not framed. Returns a
|
|
5
|
+
* teardown. The child may still run its own SDK independently — this only adds the relay.
|
|
6
|
+
*/
|
|
7
|
+
export declare function installChildSatellite(allowedParentOrigins: string[], opts?: SnapshotOptions): () => void;
|
|
8
|
+
export interface ParentBridgeDeps {
|
|
9
|
+
/** Disjoint node-id base for this child (e.g. iframeNodeId * 1_000_000). */
|
|
10
|
+
nodeIdBase: number;
|
|
11
|
+
/** Origins the child is allowed to be served from (validates inbound frames). */
|
|
12
|
+
allowedChildOrigins: string[];
|
|
13
|
+
/** Forward stitched ops onto the replay stream (same callback the same-origin path uses). */
|
|
14
|
+
emit: (mutations: Mutation[]) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Bridge ONE cross-origin iframe: handshake the child, then forward its keyframe (as `op:'iframe'`
|
|
18
|
+
* referencing the iframe's node id) + its mutation deltas onto the replay stream. Returns teardown.
|
|
19
|
+
*/
|
|
20
|
+
export declare function bridgeCrossOriginFrame(iframe: HTMLIFrameElement, iframeNodeId: number, deps: ParentBridgeDeps): () => void;
|
|
21
|
+
/** A disjoint id base for a child frame, keyed off the iframe's own node id. */
|
|
22
|
+
export declare const nodeIdBaseFor: (iframeNodeId: number) => number;
|
|
23
|
+
//# sourceMappingURL=crossOrigin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crossOrigin.d.ts","sourceRoot":"","sources":["../../../../src/features/replay/engine/crossOrigin.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AASzD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,MAAM,IAAI,CA8B5G;AAGD,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,6FAA6F;IAC7F,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,gBAAgB,GACrB,MAAM,IAAI,CAsCZ;AAED,gFAAgF;AAChF,eAAO,MAAM,aAAa,GAAI,cAAc,MAAM,KAAG,MAAkC,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F-IFR Phase 2 — cross-origin iframe replay stitching. The parent can't read a cross-origin iframe's
|
|
3
|
+
* DOM, so the CHILD SDK (running on the other origin) volunteers its capture: it serializes its own
|
|
4
|
+
* document with an OFFSET node registry (disjoint id range → no collision with the parent) and relays
|
|
5
|
+
* frames to the parent via postMessage. The parent re-emits them through the SAME path as same-origin
|
|
6
|
+
* frames — `op:'iframe'` for the keyframe + the child's mutation ops as deltas — so the existing player
|
|
7
|
+
* stitches the sub-tree into the iframe placeholder with no new player code.
|
|
8
|
+
*
|
|
9
|
+
* Security: strict origin allowlists BOTH ways; the handshake carries no secrets (just a node-id base).
|
|
10
|
+
* Zero third-party deps. Mask-by-default still applies inside the child.
|
|
11
|
+
*/
|
|
12
|
+
import { NodeRegistry } from './nodeRegistry';
|
|
13
|
+
import { serializeNode, resolveSnapshotOpts } from './snapshot';
|
|
14
|
+
import { MutationRecorder } from './mutations';
|
|
15
|
+
const INIT = 'scalebun:frame-init'; // parent → child
|
|
16
|
+
const KEY = 'scalebun:frame-key'; // child → parent (serialized sub-document)
|
|
17
|
+
const MUT = 'scalebun:frame-mut'; // child → parent (mutation ops)
|
|
18
|
+
const originAllowed = (origin, allow) => allow.includes('*') || allow.includes(origin);
|
|
19
|
+
// ── Child side ───────────────────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Run on the cross-origin CHILD page. Waits for a parent handshake from an allowed origin, then
|
|
22
|
+
* records this document (offset registry) and relays frames back. No-op when not framed. Returns a
|
|
23
|
+
* teardown. The child may still run its own SDK independently — this only adds the relay.
|
|
24
|
+
*/
|
|
25
|
+
export function installChildSatellite(allowedParentOrigins, opts = {}) {
|
|
26
|
+
if (typeof window === 'undefined' || window.parent === window)
|
|
27
|
+
return () => { };
|
|
28
|
+
const o = resolveSnapshotOpts(opts);
|
|
29
|
+
let rec;
|
|
30
|
+
let started = false;
|
|
31
|
+
const onMsg = (e) => {
|
|
32
|
+
const d = e.data;
|
|
33
|
+
if (!d || d.scalebun !== INIT || started)
|
|
34
|
+
return;
|
|
35
|
+
if (!originAllowed(e.origin, allowedParentOrigins))
|
|
36
|
+
return;
|
|
37
|
+
started = true;
|
|
38
|
+
const reg = new NodeRegistry(typeof d.nodeIdBase === 'number' ? d.nodeIdBase : 1);
|
|
39
|
+
const post = (msg) => {
|
|
40
|
+
try {
|
|
41
|
+
e.source?.postMessage(msg, e.origin);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* parent gone */
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const doc = serializeNode(document, reg, o);
|
|
48
|
+
if (doc)
|
|
49
|
+
post({ scalebun: KEY, doc });
|
|
50
|
+
rec = new MutationRecorder(reg, (mutations) => post({ scalebun: MUT, mutations }), opts);
|
|
51
|
+
rec.observe(document.documentElement);
|
|
52
|
+
};
|
|
53
|
+
window.addEventListener('message', onMsg);
|
|
54
|
+
return () => {
|
|
55
|
+
window.removeEventListener('message', onMsg);
|
|
56
|
+
rec?.disconnect();
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Bridge ONE cross-origin iframe: handshake the child, then forward its keyframe (as `op:'iframe'`
|
|
61
|
+
* referencing the iframe's node id) + its mutation deltas onto the replay stream. Returns teardown.
|
|
62
|
+
*/
|
|
63
|
+
export function bridgeCrossOriginFrame(iframe, iframeNodeId, deps) {
|
|
64
|
+
const win = iframe.contentWindow;
|
|
65
|
+
if (!win)
|
|
66
|
+
return () => { };
|
|
67
|
+
const onMsg = (e) => {
|
|
68
|
+
if (e.source !== win)
|
|
69
|
+
return; // only this child's window
|
|
70
|
+
if (!originAllowed(e.origin, deps.allowedChildOrigins))
|
|
71
|
+
return;
|
|
72
|
+
const d = e.data;
|
|
73
|
+
if (!d)
|
|
74
|
+
return;
|
|
75
|
+
if (d.scalebun === KEY && d.doc) {
|
|
76
|
+
deps.emit([{ op: 'iframe', id: iframeNodeId, doc: d.doc }]);
|
|
77
|
+
}
|
|
78
|
+
else if (d.scalebun === MUT && Array.isArray(d.mutations)) {
|
|
79
|
+
deps.emit(d.mutations);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
window.addEventListener('message', onMsg);
|
|
83
|
+
// Target the child's specific origin (no secrets, but don't broadcast). Retry on (re)load.
|
|
84
|
+
let targetOrigin = '*';
|
|
85
|
+
try {
|
|
86
|
+
targetOrigin = new URL(iframe.src, location.href).origin;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* keep '*' */
|
|
90
|
+
}
|
|
91
|
+
const send = () => {
|
|
92
|
+
try {
|
|
93
|
+
win.postMessage({ scalebun: INIT, nodeIdBase: deps.nodeIdBase }, targetOrigin);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* child not ready */
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
send();
|
|
100
|
+
iframe.addEventListener('load', send);
|
|
101
|
+
return () => {
|
|
102
|
+
window.removeEventListener('message', onMsg);
|
|
103
|
+
iframe.removeEventListener('load', send);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** A disjoint id base for a child frame, keyed off the iframe's own node id. */
|
|
107
|
+
export const nodeIdBaseFor = (iframeNodeId) => iframeNodeId * 1000000;
|
|
108
|
+
//# sourceMappingURL=crossOrigin.js.map
|