@v-tilt/browser 1.11.0 → 1.13.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/dist/all-external-dependencies.js +1 -1
- package/dist/all-external-dependencies.js.map +1 -1
- package/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/array.no-external.js +1 -1
- package/dist/array.no-external.js.map +1 -1
- package/dist/autocapture-types.d.ts +17 -0
- package/dist/autocapture-utils.d.ts +24 -1
- package/dist/autocapture.d.ts +94 -5
- package/dist/chat.js +1 -1
- package/dist/chat.js.map +1 -1
- package/dist/config.d.ts +8 -1
- package/dist/constants.d.ts +19 -13
- package/dist/core/capture.d.ts +15 -5
- package/dist/core/config-utils.d.ts +15 -0
- package/dist/core/consent.d.ts +62 -0
- package/dist/core/event-buffer.d.ts +60 -0
- package/dist/core/fb-cookies.d.ts +32 -0
- package/dist/core/feature-manager.d.ts +61 -69
- package/dist/core/fifo-queue.d.ts +23 -0
- package/dist/core/identity.d.ts +23 -33
- package/dist/core/index.d.ts +7 -1
- package/dist/core/page-lifecycle.d.ts +41 -0
- package/dist/core/remote-config.d.ts +14 -17
- package/dist/extensions/chat/bubble-drag.d.ts +30 -0
- package/dist/extensions/chat/chat-api.d.ts +15 -0
- package/dist/extensions/chat/chat-styles.d.ts +27 -0
- package/dist/extensions/chat/chat-wrapper.d.ts +20 -145
- package/dist/extensions/chat/chat.d.ts +261 -14
- package/dist/extensions/chat/message-content-styles.d.ts +1 -0
- package/dist/extensions/chat/message-html.d.ts +6 -0
- package/dist/extensions/chat/message-markdown.d.ts +8 -0
- package/dist/extensions/chat/normalize-send-content.d.ts +24 -0
- package/dist/extensions/chat/types.d.ts +19 -57
- package/dist/extensions/chat/widget-registry.d.ts +53 -0
- package/dist/extensions/chat/widgets/collect-email.d.ts +6 -0
- package/dist/extensions/chat/widgets/escalate-to-human.d.ts +6 -0
- package/dist/extensions/ga4-proxy.d.ts +59 -0
- package/dist/extensions/google-tag-gateway/consent-bridge.d.ts +27 -0
- package/dist/extensions/google-tag-gateway/enhanced-conversions.d.ts +35 -0
- package/dist/extensions/google-tag-gateway/event-bridge.d.ts +74 -0
- package/dist/extensions/google-tag-gateway/google-tag-gateway.d.ts +95 -0
- package/dist/extensions/google-tag-gateway/gtag-loader.d.ts +85 -0
- package/dist/extensions/google-tag-gateway/index.d.ts +7 -0
- package/dist/extensions/google-tag-gateway/normalize.d.ts +28 -0
- package/dist/extensions/google-tag-gateway/public-api.d.ts +23 -0
- package/dist/extensions/history-autocapture.d.ts +2 -2
- package/dist/extensions/replay/index.d.ts +1 -1
- package/dist/extensions/replay/session-recording-utils.d.ts +13 -43
- package/dist/extensions/replay/session-recording-wrapper.d.ts +10 -66
- package/dist/extensions/replay/session-recording.d.ts +53 -1
- package/dist/extensions/replay/types.d.ts +6 -1
- package/dist/extensions/web-vitals/web-vitals-manager.d.ts +14 -43
- package/dist/external-scripts-loader.js +1 -1
- package/dist/external-scripts-loader.js.map +1 -1
- package/dist/feature.d.ts +54 -172
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/module.d.ts +728 -753
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/module.no-external.d.ts +728 -753
- package/dist/module.no-external.js +1 -1
- package/dist/module.no-external.js.map +1 -1
- package/dist/rate-limiter.d.ts +0 -1
- package/dist/recorder.js +1 -1
- package/dist/recorder.js.map +1 -1
- package/dist/request.d.ts +34 -20
- package/dist/scroll-depth-tracker.d.ts +42 -0
- package/dist/server.d.ts +114 -0
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +12 -0
- package/dist/types.d.ts +204 -9
- package/dist/user-manager.d.ts +26 -52
- package/dist/utils/base64.d.ts +30 -0
- package/dist/utils/bot-detection.d.ts +28 -0
- package/dist/utils/endpoint-url.d.ts +36 -0
- package/dist/utils/event-emitter.d.ts +1 -0
- package/dist/utils/globals.d.ts +71 -2
- package/dist/utils/index.d.ts +20 -5
- package/dist/utils/logger.d.ts +66 -0
- package/dist/utils/request-utils.d.ts +5 -0
- package/dist/utils/safewrap.d.ts +6 -1
- package/dist/utils/transport-health.d.ts +55 -0
- package/dist/vtilt.d.ts +85 -25
- package/dist/web-vitals.js.map +1 -1
- package/package.json +71 -66
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web Vitals Manager
|
|
3
3
|
*
|
|
4
|
+
* Extends LazyFeature to handle lazy-loading the web-vitals script.
|
|
4
5
|
* Captures Core Web Vitals (LCP, CLS, FCP, INP, TTFB) and sends them
|
|
5
|
-
* as batched $web_vitals events.
|
|
6
|
-
* consistent lifecycle management.
|
|
7
|
-
*
|
|
8
|
-
* Follows PostHog's approach with:
|
|
9
|
-
* 1. Extension pattern - checks for callbacks registered on __VTiltExtensions__
|
|
10
|
-
* 2. Lazy loading - loads web-vitals.js on demand if not bundled
|
|
11
|
-
* 3. Configurable metrics - choose which metrics to capture
|
|
12
|
-
* 4. Smart buffering - collects metrics per page, flushes on navigation or timeout
|
|
13
|
-
* 5. Session context - includes session_id and window_id for correlation
|
|
6
|
+
* as batched $web_vitals events.
|
|
14
7
|
*
|
|
15
8
|
* Event structure:
|
|
16
9
|
* - event: "$web_vitals"
|
|
@@ -19,57 +12,35 @@
|
|
|
19
12
|
* - $web_vitals_LCP_event: { name, value, delta, rating, ... }
|
|
20
13
|
* - $pathname: string
|
|
21
14
|
* - $current_url: string
|
|
15
|
+
*
|
|
16
|
+
* @see docs/patterns/tracker-feature-lifecycle.md
|
|
22
17
|
*/
|
|
23
18
|
import { VTiltConfig, CapturePerformanceConfig, SupportedWebVitalsMetric } from "../../types";
|
|
24
|
-
import
|
|
25
|
-
import { VTilt } from "../../vtilt";
|
|
26
|
-
|
|
19
|
+
import { LazyFeature } from "../../feature";
|
|
20
|
+
import type { VTilt } from "../../vtilt";
|
|
21
|
+
import { WebVitalsCallbacks } from "../../utils/globals";
|
|
22
|
+
export declare class WebVitalsManager extends LazyFeature<CapturePerformanceConfig, WebVitalsCallbacks> {
|
|
27
23
|
readonly name = "WebVitals";
|
|
28
|
-
|
|
24
|
+
readonly scriptName = "web-vitals";
|
|
29
25
|
private _buffer;
|
|
30
26
|
private _flushTimer;
|
|
31
|
-
private _isStarted;
|
|
32
|
-
private _config;
|
|
33
|
-
/**
|
|
34
|
-
* Extract web vitals config from VTiltConfig (self-contained)
|
|
35
|
-
*/
|
|
36
27
|
static extractConfig(config: VTiltConfig): CapturePerformanceConfig;
|
|
37
|
-
constructor(instance: VTilt);
|
|
38
|
-
/**
|
|
39
|
-
* Check if web vitals capture is enabled
|
|
40
|
-
*/
|
|
28
|
+
constructor(instance: VTilt, config?: CapturePerformanceConfig);
|
|
41
29
|
get isEnabled(): boolean;
|
|
42
30
|
/**
|
|
43
|
-
*
|
|
44
|
-
|
|
45
|
-
get isStarted(): boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Start capturing if enabled
|
|
31
|
+
* Web Vitals checks if callbacks are already registered (from full bundle)
|
|
32
|
+
* before trying to lazy-load the script.
|
|
48
33
|
*/
|
|
49
34
|
startIfEnabled(): void;
|
|
50
|
-
/**
|
|
51
|
-
* Stop capturing (flushes any pending metrics)
|
|
52
|
-
*/
|
|
53
35
|
stop(): void;
|
|
54
|
-
/**
|
|
55
|
-
* Handle config update
|
|
56
|
-
*/
|
|
57
36
|
onConfigUpdate(config: VTiltConfig): void;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
*/
|
|
37
|
+
protected _createLoaded(): WebVitalsCallbacks;
|
|
38
|
+
protected _onLoaded(loaded: WebVitalsCallbacks): void;
|
|
61
39
|
get allowedMetrics(): SupportedWebVitalsMetric[];
|
|
62
|
-
/**
|
|
63
|
-
* Get flush timeout in ms
|
|
64
|
-
*/
|
|
65
40
|
get flushTimeoutMs(): number;
|
|
66
|
-
/**
|
|
67
|
-
* Get maximum allowed metric value
|
|
68
|
-
*/
|
|
69
41
|
get maxAllowedValue(): number;
|
|
70
42
|
private _createEmptyBuffer;
|
|
71
43
|
private _getWebVitalsCallbacks;
|
|
72
|
-
private _loadWebVitals;
|
|
73
44
|
private _startCapturing;
|
|
74
45
|
private _getCurrentUrl;
|
|
75
46
|
private _getCurrentPathname;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(
|
|
1
|
+
!function(r){"use strict";var n="undefined"!=typeof window?window:void 0,e="undefined"!=typeof globalThis?globalThis:n,o=null==e?void 0:e.navigator,i=null==e?void 0:e.document;null==e||e.location,null==e||e.fetch,n&&i&&i.createElement,null==e||e.XMLHttpRequest,null==e||e.AbortController,null==o||o.userAgent;var t=null!=n?n:{},l={none:0,error:1,warn:2,info:3,debug:4},a="[vTilt]",u=new Set(["none","error","warn","info","debug"]);function d(){return"undefined"!=typeof console}function s(r){var n=r.length>0&&"string"==typeof r[0]?r[0]:"",e=n?r.slice(1):r;return[n?a+":"+n:a,...e]}var v="warn",f=!1;var c=null;function w(){return c||(c={setLevel(r,n){void 0===n&&(n=!1),v=r,n&&(f=!0)},setLevelFromRemote(r){f||r&&u.has(r)&&(v=r)},getLevel:()=>v,isLockedByInit:()=>f,debug(){if(!(l[v]<l.debug)&&d()){for(var r=arguments.length,n=new Array(r),e=0;e<r;e++)n[e]=arguments[e];console.log(...s(n))}},info(){if(!(l[v]<l.info)&&d()){for(var r=arguments.length,n=new Array(r),e=0;e<r;e++)n[e]=arguments[e];console.log(...s(n))}},warn(){if(!(l[v]<l.warn)&&d()){for(var r=arguments.length,n=new Array(r),e=0;e<r;e++)n[e]=arguments[e];console.warn(...s(n))}},error(){if(!(l[v]<l.error)&&d()){for(var r=arguments.length,n=new Array(r),e=0;e<r;e++)n[e]=arguments[e];console.error(...s(n))}}}),c}var p="external-scripts",g=(r,n,e)=>{if(r.getConfig().disable_external_dependency_loading)return w().warn(p,n+" was requested but loading of external scripts is disabled."),e("Loading of external scripts is disabled");var o=null==i?void 0:i.querySelectorAll("script");if(o)for(var t,l=function(){if(o[a].src===n){var r=o[a];return r.__vtilt_loading_callback_fired?{v:e()}:(r.addEventListener("load",n=>{r.__vtilt_loading_callback_fired=!0,e(void 0,n)}),r.onerror=r=>e(r),{v:void 0})}},a=0;a<o.length;a++)if(t=l())return t.v;var u=()=>{var r;if(!i)return e("document not found");var o=i.createElement("script");o.type="text/javascript",o.crossOrigin="anonymous",o.src=n,o.onload=r=>{o.__vtilt_loading_callback_fired=!0,e(void 0,r)},o.onerror=r=>e(r);var t=i.querySelectorAll("body > script");t.length>0?null===(r=t[0].parentNode)||void 0===r||r.insertBefore(o,t[0]):i.body.appendChild(o)};(null==i?void 0:i.body)?u():null==i||i.addEventListener("DOMContentLoaded",u)},y=(r,n)=>{var e=r.getConfig();return e.script_host?e.script_host.replace(/\/+$/gm,"")+"/"+n+".js":e.api_host?e.api_host.replace(/\/+$/gm,"")+"/dist/"+n+".js":(w().error(p,"cannot load "+n+".js: api_host is required"),"")};t.__VTiltExtensions__=t.__VTiltExtensions__||{},t.__VTiltExtensions__.loadExternalDependency=(r,n,e)=>{var o=y(r,n);g(r,o,e)},r.getExtensionUrl=y,r.loadScript=g}({});
|
|
2
2
|
//# sourceMappingURL=external-scripts-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-scripts-loader.js","sources":["../src/utils/globals.ts","../src/entrypoints/external-scripts-loader.ts"],"sourcesContent":[null,null],"names":["win","window","undefined","global","globalThis","navigator","document","location","fetch","createElement","XMLHttpRequest","AbortController","userAgent","assignableWindow","
|
|
1
|
+
{"version":3,"file":"external-scripts-loader.js","sources":["../src/utils/globals.ts","../src/utils/logger.ts","../src/entrypoints/external-scripts-loader.ts"],"sourcesContent":[null,null,null],"names":["win","window","undefined","global","globalThis","navigator","document","location","fetch","createElement","XMLHttpRequest","AbortController","userAgent","assignableWindow","LEVEL_PRIORITY","none","error","warn","info","debug","PREFIX","VALID_LEVELS","Set","hasConsole","console","formatArgs","args","scope","length","rest","slice","currentLevel","lockedByInit","singleton","getLogger","setLevel","level","lockFromInit","setLevelFromRemote","has","getLevel","isLockedByInit","_len","arguments","Array","_key","log","_len2","_key2","_len3","_key3","_len4","_key4","LOG_SCOPE","loadScript","vtilt","url","callback","getConfig","disable_external_dependency_loading","existingScripts","querySelectorAll","_ret","_loop","i","src","alreadyExistingScriptTag","__vtilt_loading_callback_fired","v","addEventListener","event","onerror","addScript","scriptTag","type","crossOrigin","onload","scripts","_a","parentNode","insertBefore","body","appendChild","getExtensionUrl","kind","config","script_host","replace","api_host","__VTiltExtensions__","loadExternalDependency"],"mappings":"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"}
|
package/dist/feature.d.ts
CHANGED
|
@@ -1,231 +1,113 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Feature Interface & Base
|
|
2
|
+
* Feature Interface & Base Classes
|
|
3
3
|
*
|
|
4
|
-
* Standard
|
|
5
|
-
* Provides consistent lifecycle management and self-contained configuration.
|
|
4
|
+
* Standard interfaces and abstract base classes for vTilt SDK features.
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
6
|
+
* Hierarchy:
|
|
7
|
+
* Feature (interface) — eager features (Autocapture, HistoryAutocapture)
|
|
8
|
+
* ToggleableFeature (interface)— features that actively stop when disabled
|
|
9
|
+
* LazyFeature (abstract) — lazy-loaded features (WebVitals, Chat)
|
|
10
|
+
* ToggleableLazyFeature — lazy-loaded + toggle (SessionRecording)
|
|
12
11
|
*
|
|
13
|
-
*
|
|
12
|
+
* @see docs/patterns/tracker-feature-lifecycle.md
|
|
14
13
|
*/
|
|
15
|
-
import type { VTiltConfig
|
|
14
|
+
import type { VTiltConfig } from "./types";
|
|
16
15
|
/**
|
|
17
16
|
* Feature interface that all vTilt features should implement.
|
|
18
17
|
* Provides a consistent lifecycle for feature initialization and management.
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```typescript
|
|
22
|
-
* class MyFeature implements Feature {
|
|
23
|
-
* static extractConfig(config: VTiltConfig): MyFeatureConfig {
|
|
24
|
-
* return { enabled: !!config.myFeature };
|
|
25
|
-
* }
|
|
26
|
-
*
|
|
27
|
-
* get isEnabled(): boolean { return this._config.enabled; }
|
|
28
|
-
* get isStarted(): boolean { return this._started; }
|
|
29
|
-
*
|
|
30
|
-
* startIfEnabled(): void {
|
|
31
|
-
* if (this.isEnabled && !this._started) {
|
|
32
|
-
* this._start();
|
|
33
|
-
* }
|
|
34
|
-
* }
|
|
35
|
-
*
|
|
36
|
-
* stop(): void {
|
|
37
|
-
* if (this._started) {
|
|
38
|
-
* this._cleanup();
|
|
39
|
-
* this._started = false;
|
|
40
|
-
* }
|
|
41
|
-
* }
|
|
42
|
-
* }
|
|
43
|
-
* ```
|
|
44
18
|
*/
|
|
45
19
|
export interface Feature {
|
|
46
|
-
/**
|
|
47
|
-
* Feature name for logging and debugging.
|
|
48
|
-
*/
|
|
49
20
|
readonly name: string;
|
|
50
|
-
/**
|
|
51
|
-
* Check if the feature is enabled based on current configuration.
|
|
52
|
-
* Features should check both local config and remote config.
|
|
53
|
-
*/
|
|
54
21
|
readonly isEnabled: boolean;
|
|
55
|
-
/**
|
|
56
|
-
* Check if the feature is currently started/active.
|
|
57
|
-
*/
|
|
58
22
|
readonly isStarted: boolean;
|
|
59
|
-
/**
|
|
60
|
-
* Start the feature if it's enabled, otherwise do nothing.
|
|
61
|
-
* This is the primary lifecycle method called during initialization.
|
|
62
|
-
*
|
|
63
|
-
* Safe to call multiple times - should be idempotent.
|
|
64
|
-
*/
|
|
65
23
|
startIfEnabled(): void;
|
|
66
|
-
/**
|
|
67
|
-
* Stop the feature and clean up any resources (event listeners, timers, etc.).
|
|
68
|
-
* Safe to call multiple times - should be idempotent.
|
|
69
|
-
*/
|
|
70
24
|
stop(): void;
|
|
71
25
|
/**
|
|
72
26
|
* Handle VTilt configuration updates.
|
|
73
27
|
* Called when the main VTilt config is updated via updateConfig().
|
|
74
|
-
*
|
|
75
28
|
* Features should re-evaluate their enabled state and start/stop accordingly.
|
|
76
|
-
*
|
|
77
|
-
* @param config - The new VTilt configuration
|
|
78
29
|
*/
|
|
79
30
|
onConfigUpdate?(config: VTiltConfig): void;
|
|
80
|
-
/**
|
|
81
|
-
* Handle remote configuration updates from /decide endpoint.
|
|
82
|
-
* Called when new remote config is received from the server.
|
|
83
|
-
*
|
|
84
|
-
* Features can use this to enable/disable themselves based on server settings.
|
|
85
|
-
*
|
|
86
|
-
* @param remoteConfig - The remote configuration response
|
|
87
|
-
*/
|
|
88
|
-
onRemoteConfig?(remoteConfig: RemoteConfig): void;
|
|
89
31
|
}
|
|
90
32
|
/**
|
|
91
33
|
* Feature with the startIfEnabledOrStop pattern.
|
|
92
|
-
* Used for features that should stop when disabled
|
|
93
|
-
*
|
|
94
|
-
* Example: Session recording should stop if disabled mid-session.
|
|
34
|
+
* Used for features that should actively stop when disabled mid-session
|
|
35
|
+
* (e.g. session recording stops if server disables it).
|
|
95
36
|
*/
|
|
96
37
|
export interface ToggleableFeature extends Feature {
|
|
97
|
-
/**
|
|
98
|
-
* Start the feature if enabled, or stop it if disabled.
|
|
99
|
-
* More aggressive than startIfEnabled - actively stops if conditions change.
|
|
100
|
-
*
|
|
101
|
-
* @param trigger - Optional trigger name for debugging
|
|
102
|
-
*/
|
|
103
38
|
startIfEnabledOrStop(trigger?: string): void;
|
|
104
39
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Base configuration that all features receive.
|
|
107
|
-
* Features extend this for their specific config needs.
|
|
108
|
-
*/
|
|
109
40
|
export interface FeatureConfig {
|
|
110
|
-
/** Whether the feature is enabled */
|
|
111
41
|
enabled?: boolean;
|
|
112
42
|
}
|
|
113
43
|
/**
|
|
114
44
|
* Static interface for feature classes.
|
|
115
|
-
*
|
|
45
|
+
* Every feature class must provide extractConfig for self-contained config extraction.
|
|
116
46
|
*/
|
|
117
47
|
export interface FeatureStatic<TConfig extends FeatureConfig = FeatureConfig> {
|
|
118
|
-
/**
|
|
119
|
-
* Extract feature-specific config from VTiltConfig.
|
|
120
|
-
* This allows features to be self-contained - vtilt.ts doesn't need
|
|
121
|
-
* to know about feature-specific config transformations.
|
|
122
|
-
*
|
|
123
|
-
* @param config - The main VTilt configuration
|
|
124
|
-
* @returns Feature-specific configuration
|
|
125
|
-
*/
|
|
126
48
|
extractConfig(config: VTiltConfig): TConfig;
|
|
127
49
|
}
|
|
128
|
-
/**
|
|
129
|
-
* VTilt instance interface (minimal - avoids circular imports)
|
|
130
|
-
*/
|
|
131
50
|
export interface VTiltInstance {
|
|
132
51
|
getConfig(): VTiltConfig;
|
|
133
52
|
capture(event: string, properties?: Record<string, unknown>): void;
|
|
134
53
|
}
|
|
135
54
|
/**
|
|
136
|
-
* Abstract base class for features.
|
|
137
|
-
* Provides common functionality and enforces the Feature interface.
|
|
138
|
-
*
|
|
139
|
-
* Features can extend this class or implement the Feature interface directly.
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* ```typescript
|
|
143
|
-
* class MyFeature extends BaseFeature<MyFeatureConfig> {
|
|
144
|
-
* readonly name = 'MyFeature';
|
|
55
|
+
* Abstract base class for features that require lazy-loaded external scripts.
|
|
145
56
|
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
57
|
+
* Handles the common pattern of:
|
|
58
|
+
* 1. Checking if extension is already on window.__VTiltExtensions__
|
|
59
|
+
* 2. Loading the script via loadExternalDependency if not
|
|
60
|
+
* 3. Creating the heavy instance via _createLoaded()
|
|
61
|
+
* 4. Calling _onLoaded() for feature-specific start logic
|
|
62
|
+
* 5. Guarding against duplicate loads
|
|
149
63
|
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* }
|
|
64
|
+
* Subclasses must implement: name, scriptName, _createLoaded()
|
|
65
|
+
* Subclasses may override: _onLoaded(), isEnabled, startIfEnabled(), stop()
|
|
153
66
|
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* protected _stop(): void {
|
|
159
|
-
* // Cleanup logic
|
|
160
|
-
* }
|
|
161
|
-
* }
|
|
162
|
-
* ```
|
|
67
|
+
* Deferral: Subclasses with public API methods (e.g. Chat) use _deferCall()
|
|
68
|
+
* to queue calls until async initialization completes, then _markApiReady()
|
|
69
|
+
* to flush the queue. This is the standard pattern for features whose
|
|
70
|
+
* public API must wait for an async start step.
|
|
163
71
|
*/
|
|
164
|
-
export declare abstract class
|
|
165
|
-
/** Feature name for logging */
|
|
166
|
-
abstract readonly name: string;
|
|
167
|
-
/** VTilt instance reference */
|
|
72
|
+
export declare abstract class LazyFeature<TConfig extends object, TLoaded> implements Feature {
|
|
168
73
|
protected _instance: VTiltInstance;
|
|
169
|
-
/** Feature-specific configuration */
|
|
170
74
|
protected _config: TConfig;
|
|
171
|
-
|
|
75
|
+
protected _loaded: TLoaded | undefined;
|
|
172
76
|
protected _isStarted: boolean;
|
|
173
|
-
|
|
174
|
-
|
|
77
|
+
protected _isLoading: boolean;
|
|
78
|
+
private _apiReady;
|
|
79
|
+
private _deferredCalls;
|
|
80
|
+
abstract readonly name: string;
|
|
81
|
+
/** Script name passed to loadExternalDependency (e.g. "recorder", "chat", "web-vitals") */
|
|
82
|
+
abstract readonly scriptName: string;
|
|
175
83
|
constructor(instance: VTiltInstance, config: TConfig);
|
|
176
|
-
/**
|
|
177
|
-
* Check if feature is enabled. Override in subclass for custom logic.
|
|
178
|
-
*/
|
|
179
84
|
get isEnabled(): boolean;
|
|
180
|
-
/**
|
|
181
|
-
* Check if feature is started.
|
|
182
|
-
*/
|
|
183
85
|
get isStarted(): boolean;
|
|
86
|
+
get isLoaded(): boolean;
|
|
87
|
+
/** Create the heavy instance after the external script has loaded. */
|
|
88
|
+
protected abstract _createLoaded(): TLoaded;
|
|
184
89
|
/**
|
|
185
|
-
*
|
|
186
|
-
*
|
|
90
|
+
* Load external script (if needed) then invoke callback with the loaded instance.
|
|
91
|
+
* Safe to call multiple times — guards against duplicate loads.
|
|
187
92
|
*/
|
|
93
|
+
protected _ensureLoaded(callback: (loaded: TLoaded) => void): void;
|
|
188
94
|
startIfEnabled(): void;
|
|
189
|
-
/**
|
|
190
|
-
|
|
191
|
-
*/
|
|
95
|
+
/** Called after the script loads and the loaded instance is created. Override for custom start logic. */
|
|
96
|
+
protected _onLoaded(_loaded: TLoaded): void;
|
|
192
97
|
stop(): void;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Internal start logic. Called when feature should start.
|
|
203
|
-
* Override in subclass to setup event listeners, observers, etc.
|
|
204
|
-
*/
|
|
205
|
-
protected abstract _start(): void;
|
|
206
|
-
/**
|
|
207
|
-
* Internal stop logic. Called when feature should stop.
|
|
208
|
-
* Override in subclass to cleanup event listeners, observers, etc.
|
|
209
|
-
*/
|
|
210
|
-
protected abstract _stop(): void;
|
|
211
|
-
/**
|
|
212
|
-
* Update the feature's configuration.
|
|
213
|
-
*/
|
|
214
|
-
protected updateConfig(config: Partial<TConfig>): void;
|
|
215
|
-
/**
|
|
216
|
-
* Capture an event through the VTilt instance.
|
|
217
|
-
*/
|
|
218
|
-
protected capture(event: string, properties?: Record<string, unknown>): void;
|
|
219
|
-
/**
|
|
220
|
-
* Get the current VTilt config.
|
|
221
|
-
*/
|
|
222
|
-
protected getVTiltConfig(): VTiltConfig;
|
|
98
|
+
onConfigUpdate?(config: VTiltConfig): void;
|
|
99
|
+
updateConfig(config: Partial<TConfig>): void;
|
|
100
|
+
/** Queue fn until _markApiReady(). If already ready, execute immediately. */
|
|
101
|
+
protected _deferCall(fn: () => void): void;
|
|
102
|
+
/** Flush all deferred calls. Idempotent — subsequent calls are no-ops. */
|
|
103
|
+
protected _markApiReady(): void;
|
|
104
|
+
/** Reset deferral state (for destroy/cleanup). */
|
|
105
|
+
protected _resetDeferral(): void;
|
|
223
106
|
}
|
|
224
107
|
/**
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
* @param FeatureClass - The feature class (must have static extractConfig)
|
|
228
|
-
* @param instance - The VTilt instance
|
|
229
|
-
* @returns Feature instance with extracted config
|
|
108
|
+
* Lazy-loaded feature that can be toggled on/off at runtime.
|
|
109
|
+
* Adds startIfEnabledOrStop() which actively stops the feature when disabled.
|
|
230
110
|
*/
|
|
231
|
-
export declare
|
|
111
|
+
export declare abstract class ToggleableLazyFeature<TConfig extends object, TLoaded> extends LazyFeature<TConfig, TLoaded> implements ToggleableFeature {
|
|
112
|
+
startIfEnabledOrStop(trigger?: string): void;
|
|
113
|
+
}
|