@shellapps/experience 1.0.1 → 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.
package/dist/index.d.mts CHANGED
@@ -11,95 +11,583 @@ interface ExperienceConfig {
11
11
  maxBatchSize?: number;
12
12
  debug?: boolean;
13
13
  }
14
+ interface TrackEvent {
15
+ eventType: string;
16
+ sessionId: string;
17
+ timestamp: number;
18
+ metadata?: Record<string, string>;
19
+ pageContext?: PageContext;
20
+ elementContext?: ElementContext;
21
+ }
14
22
  interface PageContext {
15
- path: string;
23
+ url: string;
16
24
  title: string;
17
25
  referrer: string;
18
- viewportWidth: number;
19
- viewportHeight: number;
26
+ viewport: {
27
+ width: number;
28
+ height: number;
29
+ };
30
+ loadTime?: number;
20
31
  }
21
32
  interface ElementContext {
33
+ selector: string;
34
+ dataT?: string;
22
35
  tag: string;
23
- text: string;
36
+ position?: {
37
+ x: number;
38
+ y: number;
39
+ };
40
+ }
41
+ interface HeatmapEvent {
42
+ sessionId: string;
43
+ timestamp: number;
44
+ type: 'click' | 'move' | 'hover';
24
45
  x: number;
25
46
  y: number;
47
+ viewportWidth: number;
48
+ viewportHeight: number;
49
+ url: string;
26
50
  }
27
- interface ExperienceEvent {
28
- eventId: string;
29
- appId: string;
30
- profileId: string;
31
- sessionId: string;
32
- timestampMs: number;
33
- eventType: string;
34
- pageUrl: string;
35
- elementTid: string;
36
- metadata: Record<string, unknown>;
37
- pageContext: PageContext;
38
- elementContext: ElementContext | null;
39
- }
40
- interface ErrorReport {
41
- eventId: string;
42
- appId: string;
43
- profileId: string;
51
+ interface EventBatch {
52
+ events: TrackEvent[];
53
+ heatmapEvents: HeatmapEvent[];
54
+ }
55
+ interface IngestResponse {
56
+ success: boolean;
57
+ message?: string;
58
+ }
59
+ interface ErrorEvent {
44
60
  sessionId: string;
45
- timestampMs: number;
61
+ timestamp: number;
46
62
  message: string;
47
- stack: string;
48
- severity: string;
49
- extra: Record<string, unknown>;
50
- pageContext: PageContext;
63
+ filename?: string;
64
+ lineno?: number;
65
+ colno?: number;
66
+ stack?: string;
67
+ severity: Severity;
51
68
  breadcrumbs: Breadcrumb[];
69
+ browserContext: BrowserContext;
70
+ tags?: Record<string, string>;
71
+ extra?: Record<string, any>;
72
+ }
73
+ declare enum Severity {
74
+ INFO = 0,
75
+ WARNING = 1,
76
+ ERROR = 2,
77
+ FATAL = 3
52
78
  }
53
79
  interface Breadcrumb {
54
- type: string;
55
- category: string;
80
+ timestamp: number;
81
+ category: 'navigation' | 'click' | 'console' | 'fetch' | 'xhr' | 'ui';
56
82
  message: string;
57
- timestampMs: number;
58
- data?: Record<string, unknown>;
83
+ data?: Record<string, any>;
84
+ level?: 'info' | 'warning' | 'error';
59
85
  }
60
- interface HeatmapEntry {
61
- x: number;
62
- y: number;
63
- type: 'move' | 'click';
64
- timestampMs: number;
65
- viewportWidth: number;
66
- viewportHeight: number;
67
- pageUrl: string;
86
+ interface BrowserContext {
87
+ userAgent: string;
88
+ url: string;
89
+ timestamp: number;
90
+ viewport: {
91
+ width: number;
92
+ height: number;
93
+ };
94
+ }
95
+ interface ErrorBatch {
96
+ errors: ErrorEvent[];
97
+ }
98
+ interface Session {
99
+ id: string;
100
+ startTime: number;
101
+ getDuration(): number;
102
+ }
103
+ interface FeatureFlag {
104
+ key: string;
105
+ value: any;
106
+ type: 'boolean' | 'string' | 'number' | 'json';
107
+ }
108
+ interface FlagResponse {
109
+ flags: Record<string, any>;
110
+ }
111
+ interface TransportConfig {
112
+ endpoint: string;
113
+ apiKey: string;
114
+ debug: boolean;
115
+ }
116
+ type EventHandler = (event: Event) => void;
117
+ type UnsubscribeFn = () => void;
118
+ interface ResolvedExperienceConfig {
119
+ appId: string;
120
+ apiKey: string;
121
+ endpoint: string;
122
+ enableTracking: boolean;
123
+ enableErrorCapture: boolean;
124
+ enableHeatmaps: boolean;
125
+ enableBreadcrumbs: boolean;
126
+ sampleRate: number;
127
+ batchIntervalMs: number;
128
+ maxBatchSize: number;
129
+ debug: boolean;
68
130
  }
69
131
 
70
132
  declare class Experience {
133
+ private static instance;
71
134
  private config;
72
- private sessionId;
73
- private profileId;
74
- private eventQueue;
75
- private errorQueue;
76
- private batchTimer;
77
- private breadcrumbs;
78
- private flags;
79
- private flagsFetched;
80
- private teardownFns;
81
- private destroyed;
135
+ private sessionManager;
136
+ private transport;
137
+ private batcher;
138
+ private breadcrumbManager;
139
+ private heatmapTracker;
140
+ private errorCapture;
141
+ private autoTracker;
142
+ private dataTTracker;
143
+ private flagClient;
144
+ private offlineQueue;
145
+ private isShutdown;
146
+ private isInSample;
82
147
  private constructor();
83
- static init(config: ExperienceConfig): Experience;
84
- private log;
85
- private setup;
86
- track(eventName: string, metadata?: Record<string, unknown>): void;
148
+ private resolveConfig;
149
+ private setupFailureHandling;
150
+ private enableFeatures;
151
+ track(eventType: string, metadata?: Record<string, string>): void;
87
152
  trackPageView(): void;
88
- captureError(error: Error, extra?: Record<string, unknown>): void;
89
- captureMessage(msg: string, severity?: string): void;
90
- getFlag<T>(name: string, defaultValue: T): T;
153
+ captureError(error: Error, options?: {
154
+ tags?: Record<string, string>;
155
+ extra?: Record<string, any>;
156
+ severity?: Severity;
157
+ }): void;
158
+ captureMessage(message: string, severity?: string): void;
159
+ getFlag<T>(key: string, defaultValue: T): T;
91
160
  identify(profileId: string): void;
92
161
  shutdown(): Promise<void>;
93
- private enqueueEvent;
94
- private enqueueError;
95
- private flush;
96
- private flushSync;
97
- private sendOrQueue;
98
- private sendRequest;
99
- private fetchFlags;
100
- private setupErrorCapture;
101
- private setupAutoPageViews;
102
- private setupHeatmaps;
162
+ private getCurrentPageContext;
163
+ getSessionInfo(): {
164
+ sessionId: string;
165
+ duration: number;
166
+ isInSample: boolean;
167
+ };
168
+ getQueueStatus(): Promise<{
169
+ pendingEvents: number;
170
+ pendingErrors: number;
171
+ offlineQueue: {
172
+ events: number;
173
+ errors: number;
174
+ isOnline: boolean;
175
+ isInitialized: boolean;
176
+ };
177
+ }>;
178
+ getBreadcrumbs(): Breadcrumb[];
179
+ getFlagCacheInfo(): {
180
+ size: number;
181
+ keys: string[];
182
+ oldestEntry?: {
183
+ key: string;
184
+ age: number;
185
+ };
186
+ newestEntry?: {
187
+ key: string;
188
+ age: number;
189
+ };
190
+ };
191
+ flush(): Promise<void>;
192
+ static init(config: ExperienceConfig): Experience;
193
+ static getInstance(): Experience | null;
194
+ trackElement(element: Element, eventType: string): void;
195
+ private getElementSelector;
196
+ }
197
+
198
+ declare class SessionManager {
199
+ private session;
200
+ constructor();
201
+ private generateUUID;
202
+ private initializeSession;
203
+ private createNewSession;
204
+ getCurrentSession(): Session;
205
+ getSessionId(): string;
206
+ getSessionDuration(): number;
207
+ renewSession(): void;
208
+ }
209
+
210
+ declare class Transport {
211
+ private config;
212
+ private encoder;
213
+ constructor(config: TransportConfig);
214
+ private sendProtobuf;
215
+ private sendJSON;
216
+ sendEventBatch(batch: EventBatch): Promise<IngestResponse>;
217
+ sendErrorBatch(batch: ErrorBatch): Promise<IngestResponse>;
218
+ sendEventBatchBeacon(batch: EventBatch): Promise<void>;
219
+ sendErrorBatchBeacon(batch: ErrorBatch): Promise<void>;
220
+ fetchFlags(appId: string, profileId?: string): Promise<Record<string, any>>;
221
+ }
222
+
223
+ declare class EventBatcher {
224
+ private trackEvents;
225
+ private heatmapEvents;
226
+ private errorEvents;
227
+ private transport;
228
+ private batchIntervalMs;
229
+ private maxBatchSize;
230
+ private debug;
231
+ private flushTimer;
232
+ private unsubscribeFns;
233
+ constructor(transport: Transport, batchIntervalMs?: number, maxBatchSize?: number, debug?: boolean);
234
+ private setupAutoFlush;
235
+ private scheduleNextFlush;
236
+ private setupUnloadHandler;
237
+ addTrackEvent(event: TrackEvent): void;
238
+ addHeatmapEvent(event: HeatmapEvent): void;
239
+ addErrorEvent(error: ErrorEvent): void;
240
+ flush(): Promise<void>;
241
+ flushErrors(): Promise<void>;
242
+ flushBeacon(): void;
243
+ getPendingEventCount(): number;
244
+ getPendingErrorCount(): number;
245
+ shutdown(): Promise<void>;
246
+ forceFlush(): Promise<void>;
247
+ }
248
+
249
+ declare class BreadcrumbManager {
250
+ private breadcrumbs;
251
+ private unsubscribeFns;
252
+ private originalConsole;
253
+ private originalFetch;
254
+ private isEnabled;
255
+ constructor();
256
+ enable(): void;
257
+ disable(): void;
258
+ private addBreadcrumb;
259
+ private setupConsoleWrapping;
260
+ private restoreConsole;
261
+ private setupFetchWrapping;
262
+ private restoreFetch;
263
+ private setupXHRWrapping;
264
+ private setupNavigationListeners;
265
+ private setupClickListener;
266
+ private getElementSelector;
267
+ getBreadcrumbs(): Breadcrumb[];
268
+ clear(): void;
269
+ addCustomBreadcrumb(category: Breadcrumb['category'], message: string, data?: Record<string, any>): void;
270
+ }
271
+
272
+ declare class HeatmapTracker {
273
+ private batcher;
274
+ private sessionId;
275
+ private isEnabled;
276
+ private unsubscribeFns;
277
+ private lastMouseMoveTime;
278
+ private hoverTimer;
279
+ private lastHoverPosition;
280
+ constructor(batcher: EventBatcher, sessionId: string);
281
+ enable(): void;
282
+ disable(): void;
283
+ private setupMouseMoveTracking;
284
+ private setupClickTracking;
285
+ private setupHoverTracking;
286
+ private getViewportSize;
287
+ updateSessionId(sessionId: string): void;
288
+ trackClick(x: number, y: number): void;
289
+ trackHover(x: number, y: number): void;
290
+ }
291
+
292
+ declare class ErrorCapture {
293
+ private batcher;
294
+ private breadcrumbManager;
295
+ private sessionId;
296
+ private isEnabled;
297
+ private unsubscribeFns;
298
+ private originalWindowError;
299
+ private originalUnhandledRejection;
300
+ constructor(batcher: EventBatcher, breadcrumbManager: BreadcrumbManager, sessionId: string);
301
+ enable(): void;
302
+ disable(): void;
303
+ private setupGlobalErrorHandler;
304
+ private setupUnhandledRejectionHandler;
305
+ private restoreOriginalHandlers;
306
+ private getBrowserContext;
307
+ private captureError;
308
+ captureException(error: Error, options?: {
309
+ tags?: Record<string, string>;
310
+ extra?: Record<string, any>;
311
+ severity?: Severity;
312
+ }): void;
313
+ captureMessage(message: string, severity?: Severity, options?: {
314
+ tags?: Record<string, string>;
315
+ extra?: Record<string, any>;
316
+ }): void;
317
+ captureBreadcrumb(message: string, category?: 'navigation' | 'click' | 'console' | 'fetch' | 'xhr' | 'ui', data?: Record<string, any>): void;
318
+ updateSessionId(sessionId: string): void;
319
+ private extractErrorInfo;
320
+ static getSeverityFromString(severity: string): Severity;
321
+ triggerTestError(): void;
322
+ }
323
+
324
+ declare class AutoTracker {
325
+ private batcher;
326
+ private sessionId;
327
+ private isEnabled;
328
+ private unsubscribeFns;
329
+ private lastUrl;
330
+ private pageLoadTime;
331
+ constructor(batcher: EventBatcher, sessionId: string);
332
+ enable(): void;
333
+ disable(): void;
334
+ private trackInitialPageView;
335
+ private calculateLoadTime;
336
+ private setupSPATracking;
337
+ private getPageContext;
338
+ private trackPageView;
339
+ trackCurrentPage(): void;
340
+ trackNavigation(eventType: string, metadata?: Record<string, string>): void;
341
+ updateSessionId(sessionId: string): void;
342
+ getCurrentPageInfo(): PageContext;
343
+ }
344
+
345
+ declare class DataTTracker {
346
+ private batcher;
347
+ private sessionId;
348
+ private isEnabled;
349
+ private unsubscribeFns;
350
+ private mutationObserver;
351
+ private intersectionObserver;
352
+ private visibleElements;
353
+ private hoverTimers;
354
+ constructor(batcher: EventBatcher, sessionId: string);
355
+ enable(): void;
356
+ disable(): void;
357
+ private setupMutationObserver;
358
+ private setupEventDelegation;
359
+ private setupVisibilityTracking;
360
+ private setupHoverTracking;
361
+ private scanExistingElements;
362
+ private processNewElement;
363
+ private findDataTParent;
364
+ private getElementSelector;
365
+ private getElementContext;
366
+ private getPageContext;
367
+ private trackDataTEvent;
368
+ updateSessionId(sessionId: string): void;
369
+ }
370
+
371
+ declare class FeatureFlagClient {
372
+ private transport;
373
+ private appId;
374
+ private profileId;
375
+ private flagCache;
376
+ private cacheTimeoutMs;
377
+ private eventSource;
378
+ private debug;
379
+ constructor(transport: Transport, appId: string, debug?: boolean);
380
+ setProfileId(profileId: string): void;
381
+ fetchFlags(): Promise<void>;
382
+ getFlag<T>(key: string, defaultValue: T): T;
383
+ getFlagSync<T>(key: string, defaultValue: T): T;
384
+ private convertValue;
385
+ private fetchFlagsInBackground;
386
+ private _backgroundFetchInProgress;
387
+ initialize(): Promise<void>;
388
+ setupRealtimeUpdates(endpoint?: string): void;
389
+ closeRealtimeUpdates(): void;
390
+ clearCache(): void;
391
+ getCacheInfo(): {
392
+ size: number;
393
+ keys: string[];
394
+ oldestEntry?: {
395
+ key: string;
396
+ age: number;
397
+ };
398
+ newestEntry?: {
399
+ key: string;
400
+ age: number;
401
+ };
402
+ };
403
+ hasCachedFlag(key: string): boolean;
404
+ getAllCachedFlags(): Record<string, any>;
405
+ preloadFlags(keys: string[]): Promise<void>;
406
+ shutdown(): void;
407
+ }
408
+
409
+ declare class OfflineQueue {
410
+ private transport;
411
+ private db;
412
+ private debug;
413
+ private isInitialized;
414
+ private unsubscribeFns;
415
+ private isProcessing;
416
+ constructor(transport: Transport, debug?: boolean);
417
+ private initialize;
418
+ private openDatabase;
419
+ private setupOnlineListener;
420
+ private generateId;
421
+ storeEventBatch(batch: EventBatch): Promise<void>;
422
+ storeErrorBatch(batch: ErrorBatch): Promise<void>;
423
+ private storeItem;
424
+ private cleanupOldItems;
425
+ private getAllItems;
426
+ private removeItem;
427
+ processStoredItems(): Promise<void>;
428
+ private processStoreItems;
429
+ getQueueStatus(): Promise<{
430
+ events: number;
431
+ errors: number;
432
+ isOnline: boolean;
433
+ isInitialized: boolean;
434
+ }>;
435
+ clear(): Promise<void>;
436
+ shutdown(): void;
437
+ }
438
+
439
+ declare class ProtobufEncoder {
440
+ private buffer;
441
+ private encodeVarint;
442
+ private encodeTag;
443
+ private encodeString;
444
+ private encodeUint64;
445
+ private encodeUint32;
446
+ private encodeBool;
447
+ private encodeMessage;
448
+ private encodeMapEntry;
449
+ private encodeViewport;
450
+ private encodePosition;
451
+ private encodePageContext;
452
+ private encodeElementContext;
453
+ private encodeTrackEvent;
454
+ private encodeHeatmapEvent;
455
+ private encodeBreadcrumb;
456
+ private encodeBrowserContext;
457
+ private encodeErrorEvent;
458
+ encodeEventBatch(batch: EventBatch): Uint8Array;
459
+ encodeErrorBatch(batch: ErrorBatch): Uint8Array;
460
+ }
461
+
462
+ declare const TrackEventSchema: {
463
+ eventType: number;
464
+ sessionId: number;
465
+ timestamp: number;
466
+ metadata: number;
467
+ pageContext: number;
468
+ elementContext: number;
469
+ };
470
+ declare const PageContextSchema: {
471
+ url: number;
472
+ title: number;
473
+ referrer: number;
474
+ viewport: number;
475
+ loadTime: number;
476
+ };
477
+ declare const ViewportSchema: {
478
+ width: number;
479
+ height: number;
480
+ };
481
+ declare const ElementContextSchema: {
482
+ selector: number;
483
+ dataT: number;
484
+ tag: number;
485
+ position: number;
486
+ };
487
+ declare const PositionSchema: {
488
+ x: number;
489
+ y: number;
490
+ };
491
+ declare const HeatmapEventSchema: {
492
+ sessionId: number;
493
+ timestamp: number;
494
+ type: number;
495
+ x: number;
496
+ y: number;
497
+ viewportWidth: number;
498
+ viewportHeight: number;
499
+ url: number;
500
+ };
501
+ declare const EventBatchSchema: {
502
+ events: number;
503
+ heatmapEvents: number;
504
+ };
505
+ declare const IngestResponseSchema: {
506
+ success: number;
507
+ message: number;
508
+ };
509
+ declare const ErrorEventSchema: {
510
+ sessionId: number;
511
+ timestamp: number;
512
+ message: number;
513
+ filename: number;
514
+ lineno: number;
515
+ colno: number;
516
+ stack: number;
517
+ severity: number;
518
+ breadcrumbs: number;
519
+ browserContext: number;
520
+ tags: number;
521
+ extra: number;
522
+ };
523
+ declare const BreadcrumbSchema: {
524
+ timestamp: number;
525
+ category: number;
526
+ message: number;
527
+ data: number;
528
+ level: number;
529
+ };
530
+ declare const BrowserContextSchema: {
531
+ userAgent: number;
532
+ url: number;
533
+ timestamp: number;
534
+ viewport: number;
535
+ };
536
+ declare const ErrorBatchSchema: {
537
+ errors: number;
538
+ };
539
+ declare const WireType: {
540
+ VARINT: number;
541
+ FIXED64: number;
542
+ LENGTH_DELIMITED: number;
543
+ START_GROUP: number;
544
+ END_GROUP: number;
545
+ FIXED32: number;
546
+ };
547
+ declare const SeverityEnum: {
548
+ INFO: number;
549
+ WARNING: number;
550
+ ERROR: number;
551
+ FATAL: number;
552
+ };
553
+ declare const HeatmapTypeEnum: {
554
+ click: number;
555
+ move: number;
556
+ hover: number;
557
+ };
558
+ declare const BreadcrumbCategoryEnum: {
559
+ navigation: number;
560
+ click: number;
561
+ console: number;
562
+ fetch: number;
563
+ xhr: number;
564
+ ui: number;
565
+ };
566
+ declare const BreadcrumbLevelEnum: {
567
+ info: number;
568
+ warning: number;
569
+ error: number;
570
+ };
571
+
572
+ declare const schemas_BreadcrumbCategoryEnum: typeof BreadcrumbCategoryEnum;
573
+ declare const schemas_BreadcrumbLevelEnum: typeof BreadcrumbLevelEnum;
574
+ declare const schemas_BreadcrumbSchema: typeof BreadcrumbSchema;
575
+ declare const schemas_BrowserContextSchema: typeof BrowserContextSchema;
576
+ declare const schemas_ElementContextSchema: typeof ElementContextSchema;
577
+ declare const schemas_ErrorBatchSchema: typeof ErrorBatchSchema;
578
+ declare const schemas_ErrorEventSchema: typeof ErrorEventSchema;
579
+ declare const schemas_EventBatchSchema: typeof EventBatchSchema;
580
+ declare const schemas_HeatmapEventSchema: typeof HeatmapEventSchema;
581
+ declare const schemas_HeatmapTypeEnum: typeof HeatmapTypeEnum;
582
+ declare const schemas_IngestResponseSchema: typeof IngestResponseSchema;
583
+ declare const schemas_PageContextSchema: typeof PageContextSchema;
584
+ declare const schemas_PositionSchema: typeof PositionSchema;
585
+ declare const schemas_SeverityEnum: typeof SeverityEnum;
586
+ declare const schemas_TrackEventSchema: typeof TrackEventSchema;
587
+ declare const schemas_ViewportSchema: typeof ViewportSchema;
588
+ declare const schemas_WireType: typeof WireType;
589
+ declare namespace schemas {
590
+ export { schemas_BreadcrumbCategoryEnum as BreadcrumbCategoryEnum, schemas_BreadcrumbLevelEnum as BreadcrumbLevelEnum, schemas_BreadcrumbSchema as BreadcrumbSchema, schemas_BrowserContextSchema as BrowserContextSchema, schemas_ElementContextSchema as ElementContextSchema, schemas_ErrorBatchSchema as ErrorBatchSchema, schemas_ErrorEventSchema as ErrorEventSchema, schemas_EventBatchSchema as EventBatchSchema, schemas_HeatmapEventSchema as HeatmapEventSchema, schemas_HeatmapTypeEnum as HeatmapTypeEnum, schemas_IngestResponseSchema as IngestResponseSchema, schemas_PageContextSchema as PageContextSchema, schemas_PositionSchema as PositionSchema, schemas_SeverityEnum as SeverityEnum, schemas_TrackEventSchema as TrackEventSchema, schemas_ViewportSchema as ViewportSchema, schemas_WireType as WireType };
103
591
  }
104
592
 
105
- export { type Breadcrumb, type ElementContext, type ErrorReport, Experience, type ExperienceConfig, type ExperienceEvent, type HeatmapEntry, type PageContext };
593
+ export { AutoTracker, type Breadcrumb, BreadcrumbManager, type BrowserContext, DataTTracker, type ElementContext, type ErrorBatch, ErrorCapture, type ErrorEvent, type EventBatch, EventBatcher, type EventHandler, Experience, type ExperienceConfig, type FeatureFlag, FeatureFlagClient, type FlagResponse, type HeatmapEvent, HeatmapTracker, type IngestResponse, OfflineQueue, type PageContext, schemas as ProtoSchemas, ProtobufEncoder, type ResolvedExperienceConfig, type Session, SessionManager, Severity, type TrackEvent, Transport, type TransportConfig, type UnsubscribeFn };