@v-tilt/browser 1.1.4 → 1.2.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.
Files changed (62) hide show
  1. package/dist/array.js +1 -1
  2. package/dist/array.js.map +1 -1
  3. package/dist/array.no-external.js +1 -1
  4. package/dist/array.no-external.js.map +1 -1
  5. package/dist/entrypoints/array.d.ts +1 -0
  6. package/dist/entrypoints/external-scripts-loader.d.ts +24 -0
  7. package/dist/entrypoints/module.es.d.ts +1 -0
  8. package/dist/entrypoints/recorder.d.ts +23 -0
  9. package/dist/extensions/replay/index.d.ts +13 -0
  10. package/dist/extensions/replay/session-recording-utils.d.ts +92 -0
  11. package/dist/extensions/replay/session-recording-wrapper.d.ts +61 -0
  12. package/dist/extensions/replay/session-recording.d.ts +95 -0
  13. package/dist/extensions/replay/types.d.ts +211 -0
  14. package/dist/external-scripts-loader.js +2 -0
  15. package/dist/external-scripts-loader.js.map +1 -0
  16. package/dist/main.js +1 -1
  17. package/dist/main.js.map +1 -1
  18. package/dist/module.d.ts +271 -8
  19. package/dist/module.js +1 -1
  20. package/dist/module.js.map +1 -1
  21. package/dist/module.no-external.d.ts +271 -8
  22. package/dist/module.no-external.js +1 -1
  23. package/dist/module.no-external.js.map +1 -1
  24. package/dist/recorder.js +2 -0
  25. package/dist/recorder.js.map +1 -0
  26. package/dist/session.d.ts +4 -2
  27. package/dist/storage.d.ts +8 -3
  28. package/dist/types.d.ts +91 -7
  29. package/dist/user-manager.d.ts +2 -2
  30. package/dist/utils/globals.d.ts +42 -0
  31. package/dist/vtilt.d.ts +36 -0
  32. package/lib/config.js +2 -0
  33. package/lib/entrypoints/array.d.ts +1 -0
  34. package/lib/entrypoints/array.js +1 -0
  35. package/lib/entrypoints/external-scripts-loader.d.ts +24 -0
  36. package/lib/entrypoints/external-scripts-loader.js +107 -0
  37. package/lib/entrypoints/module.es.d.ts +1 -0
  38. package/lib/entrypoints/module.es.js +1 -0
  39. package/lib/entrypoints/recorder.d.ts +23 -0
  40. package/lib/entrypoints/recorder.js +42 -0
  41. package/lib/extensions/replay/index.d.ts +13 -0
  42. package/lib/extensions/replay/index.js +31 -0
  43. package/lib/extensions/replay/session-recording-utils.d.ts +92 -0
  44. package/lib/extensions/replay/session-recording-utils.js +212 -0
  45. package/lib/extensions/replay/session-recording-wrapper.d.ts +61 -0
  46. package/lib/extensions/replay/session-recording-wrapper.js +149 -0
  47. package/lib/extensions/replay/session-recording.d.ts +95 -0
  48. package/lib/extensions/replay/session-recording.js +700 -0
  49. package/lib/extensions/replay/types.d.ts +211 -0
  50. package/lib/extensions/replay/types.js +8 -0
  51. package/lib/session.d.ts +4 -2
  52. package/lib/session.js +7 -41
  53. package/lib/storage.d.ts +8 -3
  54. package/lib/storage.js +62 -9
  55. package/lib/types.d.ts +91 -7
  56. package/lib/user-manager.d.ts +2 -2
  57. package/lib/user-manager.js +4 -4
  58. package/lib/utils/globals.d.ts +42 -0
  59. package/lib/utils/globals.js +2 -0
  60. package/lib/vtilt.d.ts +36 -0
  61. package/lib/vtilt.js +110 -14
  62. package/package.json +4 -1
package/dist/module.d.ts CHANGED
@@ -20,6 +20,13 @@ interface VTiltConfig {
20
20
  api_host?: string;
21
21
  /** UI host for dashboard links */
22
22
  ui_host?: string | null;
23
+ /**
24
+ * Host for loading extension scripts (recorder.js, etc.)
25
+ * Defaults to unpkg CDN: https://unpkg.com/@v-tilt/browser@{version}/dist
26
+ * Can also use jsdelivr: https://cdn.jsdelivr.net/npm/@v-tilt/browser@{version}/dist
27
+ * Or self-hosted: https://your-domain.com/static
28
+ */
29
+ script_host?: string;
23
30
  /** Proxy domain for tracking requests */
24
31
  proxy?: string;
25
32
  /** Full proxy URL for tracking requests */
@@ -28,7 +35,7 @@ interface VTiltConfig {
28
35
  name?: string;
29
36
  /** Project ID (set via init() first argument) */
30
37
  projectId?: string;
31
- /** Domain to track (auto-detected if not provided) */
38
+ /** Domain to track (auto-detected if not provided) - used in event properties */
32
39
  domain?: string;
33
40
  /** Storage method for session data */
34
41
  storage?: PersistenceMethod;
@@ -36,7 +43,12 @@ interface VTiltConfig {
36
43
  persistence?: PersistenceMethod;
37
44
  /** Persistence name prefix */
38
45
  persistence_name?: string;
39
- /** Enable cross-subdomain cookies */
46
+ /**
47
+ * Enable cross-subdomain cookies.
48
+ * When true, cookies are shared across subdomains (e.g., app.example.com and www.example.com).
49
+ * Auto-detects false for platforms like herokuapp.com, vercel.app, netlify.app.
50
+ * @default true (except for excluded platforms)
51
+ */
40
52
  cross_subdomain_cookie?: boolean;
41
53
  /**
42
54
  * Person profiles mode:
@@ -67,6 +79,10 @@ interface VTiltConfig {
67
79
  respect_dnt?: boolean;
68
80
  /** Opt users out by default */
69
81
  opt_out_capturing_by_default?: boolean;
82
+ /** Session recording configuration */
83
+ session_recording?: SessionRecordingOptions;
84
+ /** Disable session recording (convenience flag) */
85
+ disable_session_recording?: boolean;
70
86
  /** Global attributes added to all events */
71
87
  globalAttributes?: Record<string, string>;
72
88
  /** Bootstrap data for initialization */
@@ -105,7 +121,6 @@ interface TrackingEvent {
105
121
  timestamp: string;
106
122
  event: string;
107
123
  project_id: string;
108
- domain: string;
109
124
  distinct_id: string;
110
125
  anonymous_id?: string;
111
126
  payload: EventPayload;
@@ -180,16 +195,85 @@ interface RequestOptions {
180
195
  timeout?: number;
181
196
  retry?: boolean;
182
197
  }
198
+ /** Mask options for input elements in session recording */
199
+ interface SessionRecordingMaskInputOptions {
200
+ color?: boolean;
201
+ date?: boolean;
202
+ "datetime-local"?: boolean;
203
+ email?: boolean;
204
+ month?: boolean;
205
+ number?: boolean;
206
+ range?: boolean;
207
+ search?: boolean;
208
+ tel?: boolean;
209
+ text?: boolean;
210
+ time?: boolean;
211
+ url?: boolean;
212
+ week?: boolean;
213
+ textarea?: boolean;
214
+ select?: boolean;
215
+ password?: boolean;
216
+ }
217
+ /** Session recording configuration */
218
+ interface SessionRecordingOptions {
219
+ /** Enable session recording */
220
+ enabled?: boolean;
221
+ /** Sample rate (0-1, where 1 = 100%) */
222
+ sampleRate?: number;
223
+ /** Minimum session duration in ms before sending */
224
+ minimumDurationMs?: number;
225
+ /** Session idle threshold in ms (default: 5 minutes) */
226
+ sessionIdleThresholdMs?: number;
227
+ /** Full snapshot interval in ms (default: 5 minutes) */
228
+ fullSnapshotIntervalMs?: number;
229
+ /** Enable console log capture */
230
+ captureConsole?: boolean;
231
+ /** Enable network request capture */
232
+ captureNetwork?: boolean;
233
+ /** Canvas recording settings */
234
+ captureCanvas?: {
235
+ recordCanvas?: boolean;
236
+ canvasFps?: number;
237
+ canvasQuality?: number;
238
+ };
239
+ /** Block class for elements to hide (default: 'vt-no-capture') */
240
+ blockClass?: string;
241
+ /** Block selector for elements to hide */
242
+ blockSelector?: string;
243
+ /** Ignore class for input masking (default: 'vt-ignore-input') */
244
+ ignoreClass?: string;
245
+ /** Mask text class (default: 'vt-mask') */
246
+ maskTextClass?: string;
247
+ /** Mask text selector */
248
+ maskTextSelector?: string;
249
+ /** Mask all inputs (default: true) */
250
+ maskAllInputs?: boolean;
251
+ /** Mask input options */
252
+ maskInputOptions?: SessionRecordingMaskInputOptions;
253
+ /** Masking configuration */
254
+ masking?: {
255
+ maskAllInputs?: boolean;
256
+ maskTextSelector?: string;
257
+ blockSelector?: string;
258
+ };
259
+ /** Record headers in network requests */
260
+ recordHeaders?: boolean;
261
+ /** Record body in network requests */
262
+ recordBody?: boolean;
263
+ /** Compress events before sending (default: true) */
264
+ compressEvents?: boolean;
265
+ /** Internal: Mutation throttler refill rate */
266
+ __mutationThrottlerRefillRate?: number;
267
+ /** Internal: Mutation throttler bucket size */
268
+ __mutationThrottlerBucketSize?: number;
269
+ }
183
270
  interface RemoteConfig {
184
271
  /** Default to identified_only mode */
185
272
  defaultIdentifiedOnly?: boolean;
186
273
  /** Feature flags */
187
274
  featureFlags?: FeatureFlagsConfig;
188
275
  /** Session recording config */
189
- sessionRecording?: {
190
- enabled?: boolean;
191
- sampleRate?: number;
192
- };
276
+ sessionRecording?: SessionRecordingOptions;
193
277
  }
194
278
 
195
279
  /**
@@ -209,6 +293,150 @@ declare class HistoryAutocapture {
209
293
  private _setupPopstateListener;
210
294
  }
211
295
 
296
+ /**
297
+ * Session Recording Types
298
+ *
299
+ * Type definitions for rrweb session recording.
300
+ * Based on PostHog's implementation.
301
+ */
302
+
303
+ /** Mask options for input elements */
304
+ type MaskInputOptions = Partial<{
305
+ color: boolean;
306
+ date: boolean;
307
+ "datetime-local": boolean;
308
+ email: boolean;
309
+ month: boolean;
310
+ number: boolean;
311
+ range: boolean;
312
+ search: boolean;
313
+ tel: boolean;
314
+ text: boolean;
315
+ time: boolean;
316
+ url: boolean;
317
+ week: boolean;
318
+ textarea: boolean;
319
+ select: boolean;
320
+ password: boolean;
321
+ }>;
322
+ /** Masking configuration */
323
+ interface MaskingConfig {
324
+ maskAllInputs?: boolean;
325
+ maskTextSelector?: string;
326
+ blockSelector?: string;
327
+ }
328
+ /** Session recording configuration */
329
+ interface SessionRecordingConfig {
330
+ /** Enable session recording */
331
+ enabled?: boolean;
332
+ /** Sample rate (0-1, where 1 = 100%) */
333
+ sampleRate?: number;
334
+ /** Minimum session duration in ms before sending */
335
+ minimumDurationMs?: number;
336
+ /** Session idle threshold in ms */
337
+ sessionIdleThresholdMs?: number;
338
+ /** Full snapshot interval in ms */
339
+ fullSnapshotIntervalMs?: number;
340
+ /** Enable console log capture */
341
+ captureConsole?: boolean;
342
+ /** Enable network request capture */
343
+ captureNetwork?: boolean;
344
+ /** Canvas recording settings */
345
+ captureCanvas?: {
346
+ recordCanvas?: boolean;
347
+ canvasFps?: number;
348
+ canvasQuality?: number;
349
+ };
350
+ /** Masking settings */
351
+ masking?: MaskingConfig;
352
+ /** Block class for elements to hide */
353
+ blockClass?: string;
354
+ /** Block selector for elements to hide */
355
+ blockSelector?: string;
356
+ /** Ignore class for input masking */
357
+ ignoreClass?: string;
358
+ /** Mask text class */
359
+ maskTextClass?: string;
360
+ /** Mask text selector */
361
+ maskTextSelector?: string;
362
+ /** Mask all inputs */
363
+ maskAllInputs?: boolean;
364
+ /** Mask input options */
365
+ maskInputOptions?: MaskInputOptions;
366
+ /** Record headers in network requests */
367
+ recordHeaders?: boolean;
368
+ /** Record body in network requests */
369
+ recordBody?: boolean;
370
+ /** Compress events before sending */
371
+ compressEvents?: boolean;
372
+ /** Internal: Mutation throttler refill rate */
373
+ __mutationThrottlerRefillRate?: number;
374
+ /** Internal: Mutation throttler bucket size */
375
+ __mutationThrottlerBucketSize?: number;
376
+ }
377
+ /** Recording start reason */
378
+ type SessionStartReason = "recording_initialized" | "session_id_changed" | "linked_flag_matched" | "linked_flag_overridden" | "sampling_overridden" | "url_trigger_matched" | "event_trigger_matched" | "sampled";
379
+
380
+ /**
381
+ * Session Recording Wrapper
382
+ *
383
+ * Lightweight wrapper that handles the decision of WHEN to load recording.
384
+ * The actual recording logic is in LazyLoadedSessionRecording which is
385
+ * loaded on demand.
386
+ *
387
+ * Based on PostHog's sessionrecording-wrapper.ts
388
+ */
389
+
390
+ /** Status when lazy loading is in progress */
391
+ declare const LAZY_LOADING: "lazy_loading";
392
+ /** Session recording status */
393
+ type SessionRecordingStatus = "disabled" | "buffering" | "active" | "paused" | "sampled" | "trigger_pending" | typeof LAZY_LOADING;
394
+
395
+ /**
396
+ * Session Recording Wrapper
397
+ *
398
+ * This is the lightweight class that lives in the main bundle.
399
+ * It handles:
400
+ * - Deciding if recording should be enabled
401
+ * - Lazy loading the actual recording code
402
+ * - Delegating to LazyLoadedSessionRecording
403
+ */
404
+ declare class SessionRecordingWrapper {
405
+ private readonly _instance;
406
+ private _lazyLoadedRecording;
407
+ private _config;
408
+ constructor(_instance: VTilt, config?: SessionRecordingConfig);
409
+ get started(): boolean;
410
+ get status(): SessionRecordingStatus;
411
+ get sessionId(): string;
412
+ /**
413
+ * Start recording if enabled, otherwise stop
414
+ */
415
+ startIfEnabledOrStop(startReason?: SessionStartReason): void;
416
+ /**
417
+ * Stop recording
418
+ */
419
+ stopRecording(): void;
420
+ /**
421
+ * Log a message to the recording
422
+ */
423
+ log(message: string, level?: "log" | "warn" | "error"): void;
424
+ /**
425
+ * Update configuration
426
+ */
427
+ updateConfig(config: Partial<SessionRecordingConfig>): void;
428
+ private get _isRecordingEnabled();
429
+ private get _scriptName();
430
+ /**
431
+ * Lazy load the recording script and start
432
+ */
433
+ private _lazyLoadAndStart;
434
+ /**
435
+ * Called after the recording script is loaded
436
+ */
437
+ private _onScriptLoaded;
438
+ }
439
+
212
440
  /**
213
441
  * Request Queue - Event Batching (PostHog-style)
214
442
  *
@@ -230,6 +458,7 @@ interface QueuedRequest {
230
458
  }
231
459
 
232
460
  declare class VTilt {
461
+ readonly version = "1.1.5";
233
462
  private configManager;
234
463
  private sessionManager;
235
464
  private userManager;
@@ -238,6 +467,7 @@ declare class VTilt {
238
467
  private retryQueue;
239
468
  private rateLimiter;
240
469
  historyAutocapture?: HistoryAutocapture;
470
+ sessionRecording?: SessionRecordingWrapper;
241
471
  __loaded: boolean;
242
472
  private _initial_pageview_captured;
243
473
  private _visibility_state_listener;
@@ -464,10 +694,43 @@ declare class VTilt {
464
694
  * Get current session ID
465
695
  */
466
696
  getSessionId(): string | null;
697
+ /**
698
+ * Get current distinct ID
699
+ */
700
+ getDistinctId(): string;
701
+ /**
702
+ * Get anonymous ID
703
+ */
704
+ getAnonymousId(): string;
467
705
  /**
468
706
  * Update configuration
469
707
  */
470
708
  updateConfig(config: Partial<VTiltConfig>): void;
709
+ /**
710
+ * Initialize session recording
711
+ */
712
+ private _initSessionRecording;
713
+ /**
714
+ * Build session recording config from VTiltConfig
715
+ */
716
+ private _buildSessionRecordingConfig;
717
+ /**
718
+ * Start session recording
719
+ * Call this to manually start recording if it wasn't enabled initially
720
+ */
721
+ startSessionRecording(): void;
722
+ /**
723
+ * Stop session recording
724
+ */
725
+ stopSessionRecording(): void;
726
+ /**
727
+ * Check if session recording is active
728
+ */
729
+ isSessionRecordingActive(): boolean;
730
+ /**
731
+ * Get session recording ID
732
+ */
733
+ getSessionRecordingId(): string | null;
471
734
  /**
472
735
  * _execute_array() deals with processing any vTilt function
473
736
  * calls that were called before the vTilt library was loaded
@@ -490,4 +753,4 @@ declare class VTilt {
490
753
  declare const vt: VTilt;
491
754
 
492
755
  export { VTilt, vt as default, vt };
493
- export type { AliasEvent, CaptureOptions, CaptureResult, EventPayload, FeatureFlagsConfig, GeolocationData, GroupsConfig, PersistenceMethod, Properties, Property, PropertyOperations, RemoteConfig, RequestOptions, SessionData, SessionIdChangedCallback, TrackingEvent, UserIdentity, UserProperties, VTiltConfig, WebVitalMetric };
756
+ export type { AliasEvent, CaptureOptions, CaptureResult, EventPayload, FeatureFlagsConfig, GeolocationData, GroupsConfig, PersistenceMethod, Properties, Property, PropertyOperations, RemoteConfig, RequestOptions, SessionData, SessionIdChangedCallback, SessionRecordingMaskInputOptions, SessionRecordingOptions, TrackingEvent, UserIdentity, UserProperties, VTiltConfig, WebVitalMetric };