@pulsetrackme/sdk 0.1.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 (53) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +70 -0
  3. package/dist/core/SessionStorageService.d.ts +48 -0
  4. package/dist/core/SessionStorageService.d.ts.map +1 -0
  5. package/dist/core/bot.d.ts +29 -0
  6. package/dist/core/bot.d.ts.map +1 -0
  7. package/dist/core/config.d.ts +8 -0
  8. package/dist/core/config.d.ts.map +1 -0
  9. package/dist/core/errors.d.ts +15 -0
  10. package/dist/core/errors.d.ts.map +1 -0
  11. package/dist/core/index.d.ts +3 -0
  12. package/dist/core/index.d.ts.map +1 -0
  13. package/dist/core/interfaces.d.ts +108 -0
  14. package/dist/core/interfaces.d.ts.map +1 -0
  15. package/dist/core/rrweb/rrweborchestrator.d.ts +22 -0
  16. package/dist/core/rrweb/rrweborchestrator.d.ts.map +1 -0
  17. package/dist/core/rrweb/rrwebsender.d.ts +22 -0
  18. package/dist/core/rrweb/rrwebsender.d.ts.map +1 -0
  19. package/dist/core/rrweb/rrwebtracker.d.ts +21 -0
  20. package/dist/core/rrweb/rrwebtracker.d.ts.map +1 -0
  21. package/dist/core/rrweb/sessionmanager.d.ts +14 -0
  22. package/dist/core/rrweb/sessionmanager.d.ts.map +1 -0
  23. package/dist/core/sessions/sessionbsender.d.ts +22 -0
  24. package/dist/core/sessions/sessionbsender.d.ts.map +1 -0
  25. package/dist/core/sessions/sessionmanager.d.ts +14 -0
  26. package/dist/core/sessions/sessionmanager.d.ts.map +1 -0
  27. package/dist/core/sessions/sessionorchestrator.d.ts +22 -0
  28. package/dist/core/sessions/sessionorchestrator.d.ts.map +1 -0
  29. package/dist/core/sessions/sessiontracker.d.ts +21 -0
  30. package/dist/core/sessions/sessiontracker.d.ts.map +1 -0
  31. package/dist/core/tracker.d.ts +26 -0
  32. package/dist/core/tracker.d.ts.map +1 -0
  33. package/dist/index.d.ts +36 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/modules/system.d.ts +19 -0
  36. package/dist/modules/system.d.ts.map +1 -0
  37. package/dist/plugins/feedback.d.ts +40 -0
  38. package/dist/plugins/feedback.d.ts.map +1 -0
  39. package/dist/plugins/index.d.ts +2 -0
  40. package/dist/plugins/index.d.ts.map +1 -0
  41. package/dist/pulsetrack.cjs.js +35 -0
  42. package/dist/pulsetrack.esm.js +35 -0
  43. package/dist/pulsetrack.umd.js +35 -0
  44. package/dist/pulsetrack.umd.min.js +35 -0
  45. package/dist/sw/sw-tracking.d.ts +1 -0
  46. package/dist/sw/sw-tracking.d.ts.map +1 -0
  47. package/dist/types/events.d.ts +18 -0
  48. package/dist/types/events.d.ts.map +1 -0
  49. package/dist/utils/env.d.ts +1 -0
  50. package/dist/utils/env.d.ts.map +1 -0
  51. package/dist/utils/index.d.ts +1 -0
  52. package/dist/utils/index.d.ts.map +1 -0
  53. package/package.json +49 -0
package/LICENSE ADDED
@@ -0,0 +1 @@
1
+ Unauthorized use, copying, modification, or distribution is prohibited.
package/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # PulseTrack
2
+
3
+ [![npm version](https://img.shields.io/npm/v/pulsetrack.svg?style=flat-square)](https://www.npmjs.com/package/pulsetrack)
4
+ [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg?style=flat-square)](https://www.typescriptlang.org/)
5
+
6
+ PulseTrack is a lightweight analytics and feedback collection library designed for modern web applications. It provides developers with powerful tools to understand user behavior, collect feedback, and make data-driven decisions.
7
+
8
+ ## ✨ Features
9
+
10
+ - 📊 **Comprehensive Analytics**
11
+ - Page view and navigation tracking
12
+ - User interaction monitoring (clicks, form submissions, etc.)
13
+ - Custom event tracking
14
+ - Session management
15
+
16
+ - 💬 **User Feedback**
17
+ - Built-in feedback widgets
18
+ - Customizable feedback forms
19
+ - Screenshot capture for visual feedback
20
+ - User metadata collection
21
+
22
+ - 🚀 **Developer Friendly**
23
+ - TypeScript support
24
+ - Framework agnostic (works with React, Vue, Angular, etc.)
25
+ - Extensible plugin system
26
+ - Detailed documentation
27
+
28
+ ## 📦 Installation
29
+
30
+ Install PulseTrack using npm:
31
+
32
+ ```bash
33
+ npm install pulsetrack
34
+ ```
35
+ or
36
+ ```bash
37
+ yarn add pulsetrack
38
+ ```
39
+
40
+ ## 🚀 Quick Start
41
+
42
+ ```typescript
43
+ import { PulseTrack } from 'pulsetrack';
44
+
45
+ // Initialize with your configuration
46
+ const tracker = new PulseTrack({
47
+ businessId: 'your-business-id'
48
+ });
49
+
50
+ // Track a custom event
51
+ tracker.track('user_action', { action: 'button_click', buttonId: 'cta-button' });
52
+ ```
53
+
54
+ ## 📚 Documentation
55
+
56
+ For detailed documentation, please visit our [documentation website](https://docs.rojastudio.xyz/docs).
57
+
58
+ ### Available Plugins
59
+
60
+ - **Analytics**: Core tracking functionality
61
+ - **Feedback**: User feedback collection
62
+ - **Performance**: Page load and resource timing
63
+ - **Error Tracking**: JavaScript error monitoring
64
+
65
+ ## 🔧 Configuration
66
+
67
+ | Option | Type | Default | Description |
68
+ |--------|------|---------|-------------|
69
+ | `businessId` | string | - | Your business identifier (required) |
70
+
@@ -0,0 +1,48 @@
1
+ import { Session, EventData } from './interfaces';
2
+ export interface SessionStorageOptions {
3
+ storageKey?: string;
4
+ inactivityMs?: number;
5
+ businessId?: string;
6
+ credentials?: RequestCredentials;
7
+ useBeacon?: boolean;
8
+ }
9
+ export type FlushReason = 'pagehide' | 'visibility' | 'inactivity' | 'manual' | 'feedback' | 'navigation';
10
+ export declare class SessionStorageService {
11
+ private options;
12
+ private storageKey;
13
+ private metaKey;
14
+ private session;
15
+ private sessionStartMs;
16
+ private inactivityTimer;
17
+ private isSending;
18
+ private disabled;
19
+ private endpoint;
20
+ constructor(options?: SessionStorageOptions);
21
+ private isSPA;
22
+ private getUser;
23
+ createNewSession(): Session;
24
+ loadSession(): Session;
25
+ saveSession(): void;
26
+ restartSession(): Session;
27
+ startAutoFlush(): void;
28
+ stopAutoFlush(): void;
29
+ onPageChange(newPage: string): void;
30
+ addEvent(type: string, data?: EventData): void;
31
+ updateScrollPercentage(percent: number): void;
32
+ flushNow(reason?: FlushReason): Promise<boolean>;
33
+ private sendPayload;
34
+ private ensureCurrentPage;
35
+ private addDuration;
36
+ private getPage;
37
+ private pushPageHistory;
38
+ private resetInactivityTimer;
39
+ private readMeta;
40
+ private writeMeta;
41
+ private requireSession;
42
+ private handlePageHide;
43
+ private handleVisibilityChange;
44
+ private handleStorageEvent;
45
+ setFingerprint(fingerprint: string | null): void;
46
+ }
47
+ export default SessionStorageService;
48
+ //# sourceMappingURL=SessionStorageService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionStorageService.d.ts","sourceRoot":"","sources":["../../src/core/SessionStorageService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiC,SAAS,EAAiB,MAAM,cAAc,CAAC;AAEhG,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,YAAY,CAAC;AAUjB,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAyC;gBAE7C,OAAO,GAAE,qBAA0B;IAiB/C,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,OAAO;IAQf,gBAAgB,IAAI,OAAO;IAiD3B,WAAW,IAAI,OAAO;IA4BtB,WAAW,IAAI,IAAI;IAKnB,cAAc,IAAI,OAAO;IAWzB,cAAc,IAAI,IAAI;IAetB,aAAa,IAAI,IAAI;IAWrB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgCnC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,IAAI;IAkClD,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAavC,QAAQ,CAAC,MAAM,GAAE,WAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;YAoClD,WAAW;IAyBzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,sBAAsB,CAAqF;IACnH,OAAO,CAAC,kBAAkB,CAGxB;IAEF,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAKjD;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,29 @@
1
+ export declare class botTracker {
2
+ private botDetector;
3
+ private botInfo;
4
+ private endpoint;
5
+ events: any;
6
+ options: any;
7
+ constructor(events?: any, options?: any);
8
+ initBotDetection(): Promise<void>;
9
+ isBot(): boolean;
10
+ isBotAsync(): Promise<boolean>;
11
+ private sendBotStatus;
12
+ private showBotBlockMessage;
13
+ private handleBotView;
14
+ }
15
+ export interface BotDetectionResult {
16
+ isBot: boolean;
17
+ score: number;
18
+ reasons: string[];
19
+ incognito: boolean;
20
+ vpn: boolean | null;
21
+ }
22
+ export declare class BotDetector {
23
+ private vpnCheckUrl;
24
+ constructor(vpnCheckUrl?: string);
25
+ detect(): Promise<BotDetectionResult>;
26
+ private detectCanvasAnomaly;
27
+ private detectIncognito;
28
+ }
29
+ //# sourceMappingURL=bot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../src/core/bot.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IAEnB,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAyC;IACzD,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;gBAED,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG;IAO1B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvC,KAAK,IAAI,OAAO;IAIV,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;YAO7B,aAAa;IA0B3B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,aAAa;CAsBxB;AAKD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;CACrB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAInB,MAAM,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA+FlD,OAAO,CAAC,mBAAmB;YAuBb,eAAe;CAW9B"}
@@ -0,0 +1,8 @@
1
+ export interface PulseConfig {
2
+ businessId: string;
3
+ endpoint?: string;
4
+ environment?: 'dev' | 'prod';
5
+ }
6
+ export declare function initConfig(userConfig: PulseConfig): void;
7
+ export declare function getConfig(): PulseConfig;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC9B;AAID,wBAAgB,UAAU,CAAC,UAAU,EAAE,WAAW,QAWjD;AAED,wBAAgB,SAAS,IAAI,WAAW,CAKvC"}
@@ -0,0 +1,15 @@
1
+ import { TrackedError } from './interfaces';
2
+ type ErrorHandler = (error: TrackedError) => void;
3
+ export declare class ErrorsTracker {
4
+ private onError;
5
+ private pageUrl;
6
+ private seen;
7
+ constructor(onError: ErrorHandler);
8
+ init(): void;
9
+ private handleError;
10
+ private handleRejection;
11
+ private record;
12
+ private generateErrorHash;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;AAElD,qBAAa,aAAa;IAIZ,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,IAAI,CAAmC;gBAE3B,OAAO,EAAE,YAAY;IACjC,IAAI,IAAI,IAAI;IAKpB,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,eAAe,CAUrB;IAEF,OAAO,CAAC,MAAM;IA0Bd,OAAO,CAAC,iBAAiB;CAS1B"}
@@ -0,0 +1,3 @@
1
+ export * from './config';
2
+ export * from './tracker';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,108 @@
1
+ export interface PageNavigation {
2
+ page: string;
3
+ timestamp: number;
4
+ previousPage?: string;
5
+ duration?: number;
6
+ }
7
+ export interface Session {
8
+ id: string;
9
+ createdAt: string;
10
+ errors: TrackedError[];
11
+ userInfo: UserInfo;
12
+ pages: PageSession[];
13
+ pageHistory: PageNavigation[];
14
+ durationMs?: number;
15
+ userId?: string | undefined;
16
+ entryPage?: string;
17
+ exitPage?: string;
18
+ systemEvents: SystemEvent[];
19
+ totalClicks?: number;
20
+ totalInputs?: number;
21
+ totalPagesVisited?: number;
22
+ rrwebEvents: any[];
23
+ }
24
+ export interface PageSession {
25
+ page: string;
26
+ duration: number;
27
+ totalClicks: number;
28
+ totalInputs: number;
29
+ percentageScroll: number;
30
+ events: Event[];
31
+ }
32
+ export interface Event {
33
+ type: string;
34
+ data: EventData;
35
+ timestamp: number;
36
+ relativeTime: number;
37
+ page: string;
38
+ }
39
+ export interface TrackerConfig {
40
+ endpoint?: string;
41
+ environment?: string;
42
+ release?: string;
43
+ userId?: string;
44
+ enableRRWeb?: boolean;
45
+ excludePaths?: (string | RegExp)[];
46
+ }
47
+ export interface EventData {
48
+ [key: string]: any;
49
+ }
50
+ export interface SystemEvent {
51
+ type: string;
52
+ data: EventData;
53
+ page: string;
54
+ timestamp: number;
55
+ relativeTime: number;
56
+ }
57
+ export interface PageEvent {
58
+ type: string;
59
+ data: EventData;
60
+ timestamp: number;
61
+ relativeTime: number;
62
+ page: string;
63
+ }
64
+ export interface Page {
65
+ page: string;
66
+ duration: number;
67
+ totalClicks: number;
68
+ totalInputs: number;
69
+ percentageScroll: number;
70
+ events: PageEvent[];
71
+ }
72
+ export interface UserInfo {
73
+ browser: string;
74
+ platform: string;
75
+ language: string;
76
+ fingerprint: string | null;
77
+ isBot: boolean | null;
78
+ deviceType: 'mobile' | 'desktop';
79
+ screen: {
80
+ width: number;
81
+ height: number;
82
+ };
83
+ timezone: string | undefined;
84
+ }
85
+ export interface RecordedEvent {
86
+ type: string;
87
+ data: EventData;
88
+ timestamp: number;
89
+ relativeTime: number;
90
+ page: string;
91
+ }
92
+ export interface SystemTrackerOptions {
93
+ businessId: string;
94
+ userId?: string;
95
+ }
96
+ export interface TrackedError {
97
+ message: string;
98
+ source?: string;
99
+ lineno?: number;
100
+ colno?: number;
101
+ stack?: string;
102
+ timestamp: number;
103
+ page: string;
104
+ count?: number;
105
+ hash: string;
106
+ lastOccurred: number;
107
+ }
108
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/core/interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { RRWebTracker, RRWebEvent } from './rrwebtracker';
2
+ export interface RRWebChunk {
3
+ sessionId: string;
4
+ events: RRWebEvent[];
5
+ sentAt: number;
6
+ businessId?: string;
7
+ reason?: 'interval' | 'max-events' | 'visibility' | 'pagehide' | 'unload' | 'expired';
8
+ }
9
+ export declare class RRWebOrchestrator {
10
+ private tracker;
11
+ private sendFn;
12
+ private intervalId;
13
+ private flushing;
14
+ private readonly FLUSH_INTERVAL;
15
+ private readonly MAX_EVENTS;
16
+ constructor(tracker: RRWebTracker, sendFn: (chunk: RRWebChunk) => Promise<boolean>);
17
+ start(): void;
18
+ stop(): void;
19
+ onEventTick(): void;
20
+ flush(force?: boolean, reason?: RRWebChunk['reason']): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=rrweborchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrweborchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/rrweb/rrweborchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;CACvF;AAED,qBAAa,iBAAiB;IAQ1B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;gBAGvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC;IAGzD,KAAK;IAyBL,IAAI;IAMJ,WAAW;IAML,KAAK,CACT,KAAK,UAAQ,EACb,MAAM,GAAE,UAAU,CAAC,QAAQ,CAAc;CAqD5C"}
@@ -0,0 +1,22 @@
1
+ import type { RRWebChunk } from './rrweborchestrator';
2
+ export declare function sendToBackend(chunk: RRWebChunk): Promise<boolean>;
3
+ export declare function collectClientInfo(): {
4
+ browser: string;
5
+ language: string;
6
+ languages: readonly string[];
7
+ platform: string;
8
+ timezone: string;
9
+ deviceType: string;
10
+ isBot: boolean;
11
+ fingerprint: null;
12
+ screen: {
13
+ width: number;
14
+ height: number;
15
+ dpr: number;
16
+ };
17
+ hardware: {
18
+ memory: any;
19
+ cores: number;
20
+ };
21
+ };
22
+ //# sourceMappingURL=rrwebsender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrwebsender.d.ts","sourceRoot":"","sources":["../../../src/core/rrweb/rrwebsender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBvE;AAID,wBAAgB,iBAAiB;;;;;;;;;;;;;;;;;;EAqBhC"}
@@ -0,0 +1,21 @@
1
+ import type { eventWithTime } from '@rrweb/types';
2
+ import { TrackedError } from '../interfaces';
3
+ export type RRWebEvent = eventWithTime;
4
+ export declare class RRWebTracker {
5
+ private buffer;
6
+ private stopFn;
7
+ private recording;
8
+ private hasFullSnapshot;
9
+ start(): void;
10
+ addTag(type: string, data?: Record<string, any>): void;
11
+ addErrorTag(error: TrackedError): void;
12
+ addRageClickTag(count: number): void;
13
+ addConversionTag(step: string): void;
14
+ canFlush(): boolean;
15
+ getBufferSize(): number;
16
+ peek(): RRWebEvent[];
17
+ commit(): void;
18
+ stop(): void;
19
+ isRecording(): boolean;
20
+ }
21
+ //# sourceMappingURL=rrwebtracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrwebtracker.d.ts","sourceRoot":"","sources":["../../../src/core/rrweb/rrwebtracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAS;IAEhC,KAAK;IAgCL,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAWnD,WAAW,CAAC,KAAK,EAAE,YAAY;IAQ/B,eAAe,CAAC,KAAK,EAAE,MAAM;IAI7B,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAI7B,QAAQ;IAIR,aAAa;IAIb,IAAI,IAAI,UAAU,EAAE;IAIpB,MAAM;IAIN,IAAI;IAOJ,WAAW;CAGZ"}
@@ -0,0 +1,14 @@
1
+ export default class SessionManager {
2
+ private static KEY;
3
+ private static MAX_DURATION_MS;
4
+ static getSession(): any;
5
+ static getSessionId(): string;
6
+ static isExpired(): boolean;
7
+ static createSession(expired?: boolean): {
8
+ id: `${string}-${string}-${string}-${string}-${string}`;
9
+ startedAt: number;
10
+ expiredFromPrevious: boolean;
11
+ };
12
+ static reset(): void;
13
+ }
14
+ //# sourceMappingURL=sessionmanager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionmanager.d.ts","sourceRoot":"","sources":["../../../src/core/rrweb/sessionmanager.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAmB;IACrC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAkB;IAEhD,MAAM,CAAC,UAAU;IAmBjB,MAAM,CAAC,YAAY,IAAI,MAAM;IAI7B,MAAM,CAAC,SAAS,IAAI,OAAO;IAQ3B,MAAM,CAAC,aAAa,CAAC,OAAO,UAAQ;;;;;IAWpC,MAAM,CAAC,KAAK;CAGb"}
@@ -0,0 +1,22 @@
1
+ import type { RRWebChunk } from './sessionorchestrator';
2
+ export declare function sendToBackend(chunk: RRWebChunk): Promise<boolean>;
3
+ export declare function collectClientInfo(): {
4
+ browser: string;
5
+ language: string;
6
+ languages: readonly string[];
7
+ platform: string;
8
+ timezone: string;
9
+ deviceType: string;
10
+ isBot: boolean;
11
+ fingerprint: null;
12
+ screen: {
13
+ width: number;
14
+ height: number;
15
+ dpr: number;
16
+ };
17
+ hardware: {
18
+ memory: any;
19
+ cores: number;
20
+ };
21
+ };
22
+ //# sourceMappingURL=sessionbsender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionbsender.d.ts","sourceRoot":"","sources":["../../../src/core/sessions/sessionbsender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBvE;AAID,wBAAgB,iBAAiB;;;;;;;;;;;;;;;;;;EAqBhC"}
@@ -0,0 +1,14 @@
1
+ export default class SessionManager {
2
+ private static KEY;
3
+ private static MAX_DURATION_MS;
4
+ static getSession(): any;
5
+ static getSessionId(): string;
6
+ static isExpired(): boolean;
7
+ static createSession(expired?: boolean): {
8
+ id: `${string}-${string}-${string}-${string}-${string}`;
9
+ startedAt: number;
10
+ expiredFromPrevious: boolean;
11
+ };
12
+ static reset(): void;
13
+ }
14
+ //# sourceMappingURL=sessionmanager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionmanager.d.ts","sourceRoot":"","sources":["../../../src/core/sessions/sessionmanager.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAmB;IACrC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAkB;IAEhD,MAAM,CAAC,UAAU;IAmBjB,MAAM,CAAC,YAAY,IAAI,MAAM;IAI7B,MAAM,CAAC,SAAS,IAAI,OAAO;IAQ3B,MAAM,CAAC,aAAa,CAAC,OAAO,UAAQ;;;;;IAWpC,MAAM,CAAC,KAAK;CAGb"}
@@ -0,0 +1,22 @@
1
+ import { RRWebTracker, RRWebEvent } from './sessiontracker';
2
+ export interface RRWebChunk {
3
+ sessionId: string;
4
+ events: RRWebEvent[];
5
+ sentAt: number;
6
+ businessId?: string;
7
+ reason?: 'interval' | 'max-events' | 'visibility' | 'pagehide' | 'unload' | 'expired';
8
+ }
9
+ export declare class RRWebOrchestrator {
10
+ private tracker;
11
+ private sendFn;
12
+ private intervalId;
13
+ private flushing;
14
+ private readonly FLUSH_INTERVAL;
15
+ private readonly MAX_EVENTS;
16
+ constructor(tracker: RRWebTracker, sendFn: (chunk: RRWebChunk) => Promise<boolean>);
17
+ start(): void;
18
+ stop(): void;
19
+ onEventTick(): void;
20
+ flush(force?: boolean, reason?: RRWebChunk['reason']): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=sessionorchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionorchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/sessions/sessionorchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;CACvF;AAED,qBAAa,iBAAiB;IAQ1B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;gBAGvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC;IAGzD,KAAK;IAsBL,IAAI;IAMJ,WAAW;IAML,KAAK,CACT,KAAK,UAAQ,EACb,MAAM,GAAE,UAAU,CAAC,QAAQ,CAAc;CA4C5C"}
@@ -0,0 +1,21 @@
1
+ import type { eventWithTime } from '@rrweb/types';
2
+ import { TrackedError } from '../interfaces';
3
+ export type RRWebEvent = eventWithTime;
4
+ export declare class RRWebTracker {
5
+ private buffer;
6
+ private stopFn;
7
+ private recording;
8
+ private hasFullSnapshot;
9
+ start(): void;
10
+ addTag(type: string, data?: Record<string, any>): void;
11
+ addErrorTag(error: TrackedError): void;
12
+ addRageClickTag(count: number): void;
13
+ addConversionTag(step: string): void;
14
+ canFlush(): boolean;
15
+ getBufferSize(): number;
16
+ peek(): RRWebEvent[];
17
+ commit(): void;
18
+ stop(): void;
19
+ isRecording(): boolean;
20
+ }
21
+ //# sourceMappingURL=sessiontracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessiontracker.d.ts","sourceRoot":"","sources":["../../../src/core/sessions/sessiontracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAS;IAEhC,KAAK;IAoBL,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAQnD,WAAW,CAAC,KAAK,EAAE,YAAY;IAQ/B,eAAe,CAAC,KAAK,EAAE,MAAM;IAI7B,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAI7B,QAAQ;IAIR,aAAa;IAIb,IAAI,IAAI,UAAU,EAAE;IAIpB,MAAM;IAIN,IAAI;IAMJ,WAAW;CAGZ"}
@@ -0,0 +1,26 @@
1
+ import { TrackedError } from './interfaces';
2
+ export interface TrackerOptions {
3
+ businessId?: string;
4
+ }
5
+ export declare class SystemTracker {
6
+ private options;
7
+ private rrwebTracker;
8
+ private rrwebOrchestrator;
9
+ private errorsTracker;
10
+ private isPaused;
11
+ private errors;
12
+ constructor(options?: TrackerOptions);
13
+ init(): void;
14
+ start(): void;
15
+ pause(): void;
16
+ resume(): void;
17
+ stop(): void;
18
+ private handleError;
19
+ addTag(type: string, payload?: any): void;
20
+ getData(): {
21
+ errors: TrackedError[];
22
+ rrweb: import("@rrweb/types").eventWithTime[];
23
+ };
24
+ reset(): void;
25
+ }
26
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/core/tracker.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IAOZ,OAAO,CAAC,OAAO;IAN3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAsB;gBAEhB,OAAO,GAAE,cAAmB;IA2BzC,IAAI;IAIJ,KAAK;IAIL,KAAK;IAML,MAAM;IAMN,IAAI;IAIX,OAAO,CAAC,WAAW,CAEjB;IAEF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;IAIlC,OAAO;;;;IAOP,KAAK;CAIN"}
@@ -0,0 +1,36 @@
1
+ import { SystemTracker } from './core/tracker';
2
+ import { Feedback as FeedbackFactory } from './plugins/feedback';
3
+ export declare const PulseTrack: {
4
+ init(config: {
5
+ businessId: string;
6
+ }): void;
7
+ tracker(): SystemTracker;
8
+ Feedback(options?: Omit<Parameters<typeof FeedbackFactory>[0], "tracker">): {
9
+ tracker: SystemTracker;
10
+ config: Required<Omit<import("./plugins/feedback").FeedbackConfig, "tracker">> & {
11
+ tracker: SystemTracker;
12
+ };
13
+ container: HTMLElement;
14
+ feedbackWindow: HTMLElement;
15
+ isOpen: boolean;
16
+ currentScreenshot: string;
17
+ feedbackType: "" | "error" | "suggested";
18
+ isSubmitting: boolean;
19
+ init(): void;
20
+ getPositionClasses(): string;
21
+ toggleFeedbackWindow(): void;
22
+ setFeedbackType(type: "" | "error" | "suggested", selectedBtn?: HTMLElement): void;
23
+ toggleForm(enable: boolean): void;
24
+ captureScreenshot(): Promise<void>;
25
+ removeScreenshot(): void;
26
+ getFingerprint(): Promise<string | null>;
27
+ getUser(): string;
28
+ submitFeedback(): Promise<void>;
29
+ base64ToBlob(base64: string): Blob;
30
+ resetForm(): void;
31
+ createButton(): void;
32
+ createFeedbackWindow(): void;
33
+ addStyles(): void;
34
+ };
35
+ };
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIjE,eAAO,MAAM,UAAU;iBACR;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE;;uBAWhB,IAAI,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM1E,CAAC"}
@@ -0,0 +1,19 @@
1
+ interface SystemTrackerAPI {
2
+ /** Initialize the tracker */
3
+ init(): void;
4
+ /** Start or resume tracking */
5
+ start(): void;
6
+ /** Pause tracking */
7
+ pause(): void;
8
+ /** Stop tracking and flush events */
9
+ stop(): void;
10
+ /** Reset tracker to initial state */
11
+ reset(): void;
12
+ /** Get current tracking data */
13
+ getData(): void;
14
+ /** Track a custom event */
15
+ addTag(type: string, payload?: any): void;
16
+ }
17
+ export declare const systemTracker: SystemTrackerAPI;
18
+ export {};
19
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/modules/system.ts"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACxB,6BAA6B;IAC7B,IAAI,IAAI,IAAI,CAAC;IACb,+BAA+B;IAC/B,KAAK,IAAI,IAAI,CAAC;IACd,qBAAqB;IACrB,KAAK,IAAI,IAAI,CAAC;IACd,qCAAqC;IACrC,IAAI,IAAI,IAAI,CAAC;IACb,qCAAqC;IACrC,KAAK,IAAI,IAAI,CAAC;IACd,gCAAgC;IAChC,OAAO,IAAI,IAAI,CAAC;IAChB,2BAA2B;IAC3B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,aAAa,EAAE,gBAQ3B,CAAC"}