@levi123/trackers 4.0.0-dev.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 (49) hide show
  1. package/README.md +220 -0
  2. package/dist/esm/index.js +402 -0
  3. package/dist/esm/index.mjs +402 -0
  4. package/dist/esm/tooling/tsconfig/dist/callback-worker.d.ts +1 -0
  5. package/dist/esm/tooling/tsconfig/dist/data/callbackStore.d.ts +20 -0
  6. package/dist/esm/tooling/tsconfig/dist/data/eventStore.d.ts +14 -0
  7. package/dist/esm/tooling/tsconfig/dist/data/index.d.ts +2 -0
  8. package/dist/esm/tooling/tsconfig/dist/debug/index.d.ts +9 -0
  9. package/dist/esm/tooling/tsconfig/dist/event-worker.d.ts +1 -0
  10. package/dist/esm/tooling/tsconfig/dist/handlers/event-worker/click-handler.d.ts +2 -0
  11. package/dist/esm/tooling/tsconfig/dist/handlers/event-worker/index.d.ts +5 -0
  12. package/dist/esm/tooling/tsconfig/dist/handlers/event-worker/page-view-handler.d.ts +2 -0
  13. package/dist/esm/tooling/tsconfig/dist/handlers/event-worker/performance-entry-handler.d.ts +2 -0
  14. package/dist/esm/tooling/tsconfig/dist/handlers/event-worker/performance-handler.d.ts +2 -0
  15. package/dist/esm/tooling/tsconfig/dist/handlers/event-worker/scroll-handler.d.ts +2 -0
  16. package/dist/esm/tooling/tsconfig/dist/handlers/index.d.ts +1 -0
  17. package/dist/esm/tooling/tsconfig/dist/index.d.ts +2 -0
  18. package/dist/esm/tooling/tsconfig/dist/tracking-sdk.d.ts +54 -0
  19. package/dist/esm/tooling/tsconfig/dist/types/callback.d.ts +43 -0
  20. package/dist/esm/tooling/tsconfig/dist/types/event.d.ts +91 -0
  21. package/dist/esm/tooling/tsconfig/dist/types/index.d.ts +4 -0
  22. package/dist/esm/tooling/tsconfig/dist/types/tracking.d.ts +16 -0
  23. package/dist/esm/tooling/tsconfig/dist/types/worker.d.ts +21 -0
  24. package/dist/esm/tooling/tsconfig/dist/utils/event-worker.d.ts +1 -0
  25. package/dist/esm/tooling/tsconfig/dist/utils/index.d.ts +1 -0
  26. package/dist/umd/index.js +1 -0
  27. package/dist/umd/tooling/tsconfig/dist/callback-worker.d.ts +1 -0
  28. package/dist/umd/tooling/tsconfig/dist/data/callbackStore.d.ts +20 -0
  29. package/dist/umd/tooling/tsconfig/dist/data/eventStore.d.ts +14 -0
  30. package/dist/umd/tooling/tsconfig/dist/data/index.d.ts +2 -0
  31. package/dist/umd/tooling/tsconfig/dist/debug/index.d.ts +9 -0
  32. package/dist/umd/tooling/tsconfig/dist/event-worker.d.ts +1 -0
  33. package/dist/umd/tooling/tsconfig/dist/handlers/event-worker/click-handler.d.ts +2 -0
  34. package/dist/umd/tooling/tsconfig/dist/handlers/event-worker/index.d.ts +5 -0
  35. package/dist/umd/tooling/tsconfig/dist/handlers/event-worker/page-view-handler.d.ts +2 -0
  36. package/dist/umd/tooling/tsconfig/dist/handlers/event-worker/performance-entry-handler.d.ts +2 -0
  37. package/dist/umd/tooling/tsconfig/dist/handlers/event-worker/performance-handler.d.ts +2 -0
  38. package/dist/umd/tooling/tsconfig/dist/handlers/event-worker/scroll-handler.d.ts +2 -0
  39. package/dist/umd/tooling/tsconfig/dist/handlers/index.d.ts +1 -0
  40. package/dist/umd/tooling/tsconfig/dist/index.d.ts +2 -0
  41. package/dist/umd/tooling/tsconfig/dist/tracking-sdk.d.ts +54 -0
  42. package/dist/umd/tooling/tsconfig/dist/types/callback.d.ts +43 -0
  43. package/dist/umd/tooling/tsconfig/dist/types/event.d.ts +91 -0
  44. package/dist/umd/tooling/tsconfig/dist/types/index.d.ts +4 -0
  45. package/dist/umd/tooling/tsconfig/dist/types/tracking.d.ts +16 -0
  46. package/dist/umd/tooling/tsconfig/dist/types/worker.d.ts +21 -0
  47. package/dist/umd/tooling/tsconfig/dist/utils/event-worker.d.ts +1 -0
  48. package/dist/umd/tooling/tsconfig/dist/utils/index.d.ts +1 -0
  49. package/package.json +45 -0
@@ -0,0 +1,91 @@
1
+ import type { ITrackingConfig } from './tracking';
2
+ import type { IWorkerMessage } from './worker';
3
+ export interface IEventData {
4
+ timestamp: number;
5
+ eventId?: string;
6
+ [key: string]: any;
7
+ }
8
+ export interface IProcessedEventData extends IEventData {
9
+ eventType: string;
10
+ processed: boolean;
11
+ [key: string]: any;
12
+ }
13
+ export interface IPerformanceMetrics {
14
+ manualTrigger?: boolean;
15
+ timestamp: number;
16
+ cpuUsage?: number;
17
+ memoryUsage?: number;
18
+ networkSpeed?: number;
19
+ processingTime: number;
20
+ entryCount?: number;
21
+ largestContentfulPaint?: number;
22
+ }
23
+ export interface ICallbackData {
24
+ type: string;
25
+ data: IProcessedEventData;
26
+ metrics?: IPerformanceMetrics;
27
+ timestamp: number;
28
+ processingTime: number;
29
+ workerId: string;
30
+ }
31
+ export interface IProcessingQueueItem {
32
+ eventName: string;
33
+ eventData: IEventData;
34
+ timestamp: number;
35
+ }
36
+ export interface IEventWorkerMessage extends IWorkerMessage {
37
+ type: 'init' | 'track' | 'healthCheck';
38
+ event?: string;
39
+ data?: IEventData;
40
+ config?: ITrackingConfig;
41
+ }
42
+ export interface IEventWorkerResponse {
43
+ type: 'ready' | 'health' | 'processed' | 'error';
44
+ message?: string;
45
+ status?: 'busy' | 'idle';
46
+ queueLength?: number;
47
+ data?: {
48
+ event: string;
49
+ processedData?: IProcessedEventData;
50
+ metrics?: IPerformanceMetrics;
51
+ processingTime?: number;
52
+ workerTimestamp?: number;
53
+ error?: {
54
+ message: string;
55
+ stack?: string;
56
+ timestamp: number;
57
+ };
58
+ };
59
+ }
60
+ export interface INavigationTiming {
61
+ navigationStart: number;
62
+ domContentLoaded: number;
63
+ loadEvent: number;
64
+ totalLoadTime: number;
65
+ }
66
+ export interface IProcessedClickData extends IProcessedEventData {
67
+ eventType: ITrackingEvent.CLICK;
68
+ sessionId: string;
69
+ }
70
+ export interface IProcessedPageViewData extends IProcessedEventData {
71
+ eventType: ITrackingEvent.PAGE_LOAD;
72
+ userAgent: string;
73
+ }
74
+ export interface IProcessedScrollData extends IProcessedEventData {
75
+ eventType: ITrackingEvent.SCROLL;
76
+ scrollPercentage: number;
77
+ }
78
+ export interface IProcessedPerformanceEntryData extends IProcessedEventData {
79
+ eventType: ITrackingEvent.PERFORMANCE_ENTRY;
80
+ category: string;
81
+ }
82
+ export type EventCallback = (data: ICallbackData) => void;
83
+ export type UnsubscribeFunction = () => void;
84
+ export declare enum ITrackingEvent {
85
+ PAGE_LOAD = "pageLoad",
86
+ CLICK = "click",
87
+ PERFORMANCE = "performance",
88
+ PERFORMANCE_ENTRY = "performanceEntry",
89
+ SCROLL = "scroll",
90
+ MANUAL_CLICK = "manualClick"
91
+ }
@@ -0,0 +1,4 @@
1
+ export * from './callback';
2
+ export * from './event';
3
+ export * from './tracking';
4
+ export * from './worker';
@@ -0,0 +1,16 @@
1
+ import type { ITrackingEvent } from './event';
2
+ import type { WorkerStatus } from './worker';
3
+ export interface ITrackingConfig {
4
+ events: ITrackingEvent[];
5
+ workerTimeout?: number;
6
+ }
7
+ export interface IWorkerStatus {
8
+ eventWorker: WorkerStatus;
9
+ callbackWorker: WorkerStatus;
10
+ }
11
+ export interface ITrackingSDKStatus {
12
+ isInitialized: boolean;
13
+ workerStatus: IWorkerStatus;
14
+ registeredCallbacks: string[];
15
+ totalCallbacks: number;
16
+ }
@@ -0,0 +1,21 @@
1
+ import type { IPerformanceMetrics, IProcessedEventData } from './event';
2
+ import type { ITrackingConfig } from './tracking';
3
+ export interface IWorkerMessage {
4
+ type: string;
5
+ data?: any;
6
+ event?: string;
7
+ processedData?: IProcessedEventData;
8
+ metrics?: IPerformanceMetrics;
9
+ config?: ITrackingConfig;
10
+ eventType?: string;
11
+ callbackCount?: number;
12
+ timestamp?: number;
13
+ error?: any;
14
+ callbacks?: string[];
15
+ requestId?: string;
16
+ payload?: any;
17
+ successCount?: number;
18
+ errorCount?: number;
19
+ executionTime?: number;
20
+ }
21
+ export type WorkerStatus = 'idle' | 'ready' | 'active' | 'error' | 'destroyed';
@@ -0,0 +1 @@
1
+ export declare function generateSessionId(): string;
@@ -0,0 +1 @@
1
+ export * from './event-worker';
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ReactFlow={})}(this,function(e){"use strict";var t="undefined"!=typeof document?document.currentScript:null;const r=new class{constructor(e){this.enableLog=!!e}log(e,...t){this.enableLog&&console.log(e,...t)}warn(e,...t){this.enableLog&&console.warn(e,...t)}error(e,...t){this.enableLog&&console.error(e,...t)}};var a;e.ITrackingEvent=void 0,(a=e.ITrackingEvent||(e.ITrackingEvent={})).PAGE_LOAD="pageLoad",a.CLICK="click",a.PERFORMANCE="performance",a.PERFORMANCE_ENTRY="performanceEntry",a.SCROLL="scroll",a.MANUAL_CLICK="manualClick";const n=new class{constructor(){this.config={events:[e.ITrackingEvent.PAGE_LOAD,e.ITrackingEvent.CLICK],workerTimeout:5e3},this.isInitialized=!1,this.eventWorker=null,this.callbackWorker=null,this.callbacks={},this.workerStatus={eventWorker:"idle",callbackWorker:"idle"},this.perEventCallbacks=new Map,this.handlePageLoad=()=>{this.trackEvent(e.ITrackingEvent.PAGE_LOAD,{timestamp:Date.now(),url:window.location.href})},this.handleClick=t=>{const r=t.target;"SCRIPT"!==r.tagName&&"STYLE"!==r.tagName||this.trackEvent(e.ITrackingEvent.CLICK,{target:r.tagName,targetId:r.id||"",targetClass:r.className||"",x:t.clientX,y:t.clientY,timestamp:Date.now()})},"undefined"==typeof window||window.Worker||r.warn("Web Worker not supported. Falling back to main thread.")}init(e={}){if(this.isInitialized)return void r.warn("SDK already initialized");Object.assign(this.config,e),r.log("🚀 GXTrackingSDK initialized with config:",this.config),this.initWorkers();const t=()=>{setTimeout(()=>{this.isInitialized=!0,this.startTracking(),r.log("✅ All workers are running")},0)};"complete"===document.readyState?t():window.addEventListener("load",t)}initWorkers(){this.initEventWorker(),this.initCallbackWorker()}initEventWorker(){try{this.eventWorker=new Worker(new URL("./event-worker.ts","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:t&&"SCRIPT"===t.tagName.toUpperCase()&&t.src||new URL("index.js",document.baseURI).href),{type:"module"}),this.eventWorker.onmessage=e=>{const{type:t,data:r}=e.data;switch(this.workerStatus.eventWorker="active",t){case"processed":this.sendToCallbackWorker({type:"processedResult",event:r.event,eventType:r.event,processedData:r.processedData,timestamp:Date.now()});break;case"error":this.handleError(r)}},this.eventWorker.onerror=e=>{this.workerStatus.eventWorker="error",this.handleError({message:"Event Worker crashed",error:e})},this.sendToEventWorker({type:"init",config:this.config}),this.workerStatus.eventWorker="ready"}catch(e){this.handleError({message:"Failed to create Event Worker",error:e})}}initCallbackWorker(){try{this.callbackWorker=new Worker(new URL("./callback-worker.ts","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:t&&"SCRIPT"===t.tagName.toUpperCase()&&t.src||new URL("index.js",document.baseURI).href),{type:"module"}),this.callbackWorker.onmessage=e=>{const{type:t,data:a}=e.data;switch(this.workerStatus.callbackWorker="active",t){case"executeCallbacks":{const{eventType:t,requestId:r,payload:a}=e.data||{},n=t&&this.callbacks[t]||[];let s=0,i=0;const o=Date.now(),c=a&&a.data&&a.data.eventId,l=c?this.perEventCallbacks.get(c):void 0;if(l)try{l(a),s++}catch(e){i++}finally{this.perEventCallbacks.delete(c)}n.length>0&&n.forEach(e=>{try{e(a),s++}catch(e){i++,this.callbacks.error&&this.callbacks.error.forEach(t=>{try{t({type:"error",data:{message:"Callback error",error:this.serializeError(e)},timestamp:Date.now(),processingTime:0,workerId:"tracking-sdk"})}catch(e){}})}});const k=Date.now()-o;this.sendToCallbackWorker({type:"executionResult",requestId:r,successCount:s,errorCount:i,executionTime:k});break}case"callbackReady":r.log("📨 Callback processed successfully");break;case"error":this.handleError(a)}},this.callbackWorker.onerror=e=>{this.workerStatus.callbackWorker="error",this.handleError({message:"Callback Worker crashed",error:e})},this.sendToCallbackWorker({type:"init",config:this.config,callbacks:Object.keys(this.callbacks)}),this.workerStatus.callbackWorker="ready"}catch(e){this.handleError({message:"Failed to create Callback Worker",error:e})}}startTracking(){if("undefined"!=typeof window){if(r.log("👁️ Starting event tracking...",this.config.events),this.config.events.includes(e.ITrackingEvent.PAGE_LOAD)&&this.handlePageLoad(),this.config.events.includes(e.ITrackingEvent.CLICK)&&document.addEventListener("click",this.handleClick),this.config.events.includes(e.ITrackingEvent.PERFORMANCE)&&"PerformanceObserver"in window){new PerformanceObserver(t=>{t.getEntries().forEach(t=>{this.trackEvent(e.ITrackingEvent.PERFORMANCE_ENTRY,{name:t.name,entryType:t.entryType,duration:Math.round(t.duration),startTime:Math.round(t.startTime),timestamp:Date.now()})})}).observe({entryTypes:["navigation","paint","resource","largest-contentful-paint"]})}r.log("✅ All event listeners attached")}}trackEvent(e,t,a){if(!this.isInitialized)return void r.warn("SDK not initialized. Call init() first.");const n=t.eventId||`ev_${Date.now()}_${Math.random().toString(36).slice(2)}`;a&&this.perEventCallbacks.set(n,a);const s={type:"track",event:e,data:Object.assign(Object.assign({},t),{timestamp:Date.now(),eventId:n})};r.log("📤 Sending event to Event Worker:",e,s.data),this.sendToEventWorker(s)}sendToEventWorker(e){this.eventWorker?this.eventWorker.postMessage(e):r.error("Event Worker not initialized")}sendToCallbackWorker(e){this.callbackWorker?this.callbackWorker.postMessage(e):r.error("Callback Worker not initialized")}on(e,t){return this.callbacks[e]||(this.callbacks[e]=[]),this.callbacks[e].push(t),r.log(`🔗 Registered callback for "${e}". Total: ${this.callbacks[e].length}`),this.sendToCallbackWorker({type:"registerCallback",eventType:e,callbackCount:this.callbacks[e].length}),()=>{if(!this.callbacks[e])return;const a=this.callbacks[e].indexOf(t);a>-1&&(this.callbacks[e].splice(a,1),r.log(`❌ Unregistered callback for "${e}"`))}}handleError(e){const t=this.serializeError(e);this.callbacks.error&&this.callbacks.error.forEach(e=>e(t)),this.sendToCallbackWorker({type:"error",data:t,timestamp:Date.now()})}serializeError(e){try{if(!e)return{message:"Unknown error"};if(e instanceof Error)return{message:e.message,name:e.name,stack:e.stack};if("string"==typeof e)return{message:e};if(e.message||e.error){const t=e.error,r={message:e.message||"Error",context:void 0};if(t instanceof Error)return Object.assign(Object.assign({},r),{error:{message:t.message,name:t.name,stack:t.stack}});try{return Object.assign(Object.assign({},r),{error:JSON.parse(JSON.stringify(t))})}catch(e){return Object.assign(Object.assign({},r),{error:String(t)})}}return JSON.parse(JSON.stringify(e))}catch(e){return{message:"Unserializable error"}}}getStatus(){return{isInitialized:this.isInitialized,workerStatus:this.workerStatus,registeredCallbacks:Object.keys(this.callbacks),totalCallbacks:Object.values(this.callbacks).reduce((e,t)=>e+t.length,0)}}destroy(){r.log("🧹 Destroying GXTrackingSDK..."),"undefined"!=typeof window&&(window.removeEventListener("load",this.handlePageLoad),document.removeEventListener("click",this.handleClick)),this.eventWorker&&(this.eventWorker.terminate(),this.eventWorker=null,r.log("🔌 Event Worker terminated")),this.callbackWorker&&(this.callbackWorker.terminate(),this.callbackWorker=null,r.log("🔌 Callback Worker terminated")),this.callbacks={},this.isInitialized=!1,this.workerStatus={eventWorker:"destroyed",callbackWorker:"destroyed"},r.log("✅ GXTrackingSDK destroyed successfully")}};"undefined"!=typeof window&&(window.GXTrackingSDK=n),e.gxTrackingSDK=n});
@@ -0,0 +1,20 @@
1
+ import type { ICallbackQueueItem, ICallbackStats, IPerformanceMetrics, IProcessedEventData, ITrackingConfig } from '../types';
2
+ interface CallbackStore {
3
+ getRegisteredCallbacks(): Record<string, number>;
4
+ getCallbackQueue(): ICallbackQueueItem[];
5
+ getIsProcessingCallbacks(): boolean;
6
+ getCallbackStats(): ICallbackStats;
7
+ getPendingExecutions(): Record<string, (result: {
8
+ successCount: number;
9
+ errorCount: number;
10
+ executionTime: number;
11
+ }) => void>;
12
+ setConfig(newConfig: ITrackingConfig): void;
13
+ setRegisteredCallbacks(newRegisteredCallbacks: Record<string, number>): void;
14
+ executeCallbacksForEvent(queueItem: ICallbackQueueItem): Promise<void>;
15
+ processCallbackQueue(): Promise<void>;
16
+ handleProcessedEvent(eventType: string, processedData: IProcessedEventData, metrics?: IPerformanceMetrics): void;
17
+ handleErrorEvent(eventType: string, errorData: IProcessedEventData): void;
18
+ }
19
+ export declare const callbackStore: CallbackStore;
20
+ export default callbackStore;
@@ -0,0 +1,14 @@
1
+ import type { IEventData, IProcessingQueueItem, ITrackingConfig } from '../types';
2
+ interface EventStore {
3
+ getConfig(): ITrackingConfig;
4
+ getProcessingQueue(): IProcessingQueueItem[];
5
+ getIsProcessing(): boolean;
6
+ setConfig(newConfig: ITrackingConfig): void;
7
+ setProcessingQueue(newProcessingQueue: IProcessingQueueItem[]): void;
8
+ setIsProcessing(newIsProcessing: boolean): void;
9
+ processSingleEvent(eventName: string, eventData: IEventData): Promise<void>;
10
+ processQueue(): Promise<void>;
11
+ processEvent(eventName: string, eventData: IEventData): void;
12
+ }
13
+ export declare const eventStore: EventStore;
14
+ export default eventStore;
@@ -0,0 +1,2 @@
1
+ export * from './callbackStore';
2
+ export * from './eventStore';
@@ -0,0 +1,9 @@
1
+ declare class DebugTrackers {
2
+ private enableLog;
3
+ constructor(enableLog?: boolean);
4
+ log(message: string, ...args: any[]): void;
5
+ warn(message: string, ...args: any[]): void;
6
+ error(message: string, ...args: any[]): void;
7
+ }
8
+ export declare const debugTrackers: DebugTrackers;
9
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { IEventData, IProcessedClickData } from '../../types';
2
+ export declare function processClick(data: IEventData): Promise<IProcessedClickData>;
@@ -0,0 +1,5 @@
1
+ export * from './click-handler';
2
+ export * from './page-view-handler';
3
+ export * from './performance-entry-handler';
4
+ export * from './performance-handler';
5
+ export * from './scroll-handler';
@@ -0,0 +1,2 @@
1
+ import type { IEventData, IProcessedPageViewData } from '../../types';
2
+ export declare function processPageView(data: IEventData): Promise<IProcessedPageViewData>;
@@ -0,0 +1,2 @@
1
+ import type { IEventData, IProcessedPerformanceEntryData } from '../../types';
2
+ export declare function processPerformanceEntry(data: IEventData): Promise<IProcessedPerformanceEntryData>;
@@ -0,0 +1,2 @@
1
+ import type { IEventData, IPerformanceMetrics } from '../../types';
2
+ export declare function processPerformance(data: IEventData): Promise<IPerformanceMetrics>;
@@ -0,0 +1,2 @@
1
+ import type { IEventData, IProcessedScrollData } from '../../types';
2
+ export declare function processScroll(data: IEventData): Promise<IProcessedScrollData>;
@@ -0,0 +1 @@
1
+ export * from './event-worker';
@@ -0,0 +1,2 @@
1
+ export * from './tracking-sdk';
2
+ export * from './types';
@@ -0,0 +1,54 @@
1
+ import type { EventCallback, IEventData, ITrackingConfig, ITrackingSDKStatus, IWorkerMessage, IWorkerStatus, UnsubscribeFunction } from './types';
2
+ import { ITrackingEvent } from './types';
3
+ declare global {
4
+ interface Window {
5
+ GXTrackingSDK: ITrackingSDKInterface;
6
+ }
7
+ }
8
+ export interface ITrackingSDKInterface {
9
+ config: ITrackingConfig;
10
+ isInitialized: boolean;
11
+ eventWorker: Worker | null;
12
+ callbackWorker: Worker | null;
13
+ callbacks: Record<string, EventCallback[]>;
14
+ workerStatus: IWorkerStatus;
15
+ init(userConfig?: Partial<ITrackingConfig>): void;
16
+ initWorkers(): void;
17
+ initEventWorker(): void;
18
+ initCallbackWorker(): void;
19
+ startTracking(): void;
20
+ trackEvent(eventName: ITrackingEvent, data: IEventData, callback?: EventCallback): void;
21
+ sendToEventWorker(message: IWorkerMessage): void;
22
+ sendToCallbackWorker(message: IWorkerMessage): void;
23
+ on(eventType: string, callback: EventCallback): UnsubscribeFunction;
24
+ handleError(errorData: any): void;
25
+ getStatus(): ITrackingSDKStatus;
26
+ destroy(): void;
27
+ }
28
+ declare class GXTrackingSDK implements ITrackingSDKInterface {
29
+ config: ITrackingConfig;
30
+ isInitialized: boolean;
31
+ eventWorker: Worker | null;
32
+ callbackWorker: Worker | null;
33
+ callbacks: Record<string, EventCallback[]>;
34
+ workerStatus: IWorkerStatus;
35
+ private perEventCallbacks;
36
+ constructor();
37
+ init(userConfig?: Partial<ITrackingConfig>): void;
38
+ initWorkers(): void;
39
+ initEventWorker(): void;
40
+ initCallbackWorker(): void;
41
+ startTracking(): void;
42
+ trackEvent(eventName: ITrackingEvent, data: IEventData, callback?: EventCallback): void;
43
+ sendToEventWorker(message: IWorkerMessage): void;
44
+ sendToCallbackWorker(message: IWorkerMessage): void;
45
+ on(eventType: string, callback: EventCallback): UnsubscribeFunction;
46
+ handleError(errorData: any): void;
47
+ private serializeError;
48
+ getStatus(): ITrackingSDKStatus;
49
+ destroy(): void;
50
+ private handlePageLoad;
51
+ private handleClick;
52
+ }
53
+ declare const gxTrackingSDK: GXTrackingSDK;
54
+ export { gxTrackingSDK };
@@ -0,0 +1,43 @@
1
+ import type { IPerformanceMetrics, IProcessedEventData } from './event';
2
+ import type { ITrackingConfig } from './tracking';
3
+ import type { IWorkerMessage } from './worker';
4
+ export interface ICallbackQueueItem {
5
+ eventType: string;
6
+ processedData: IProcessedEventData;
7
+ metrics?: IPerformanceMetrics;
8
+ timestamp: number;
9
+ attempt: number;
10
+ }
11
+ export interface ICallbackStats {
12
+ totalProcessed: number;
13
+ totalErrors: number;
14
+ lastProcessed: number | null;
15
+ }
16
+ export interface ICallbackWorkerMessage extends IWorkerMessage {
17
+ type: 'init' | 'registerCallback' | 'processedResult' | 'error' | 'healthCheck' | 'executionResult';
18
+ eventType?: string;
19
+ processedData?: IProcessedEventData;
20
+ metrics?: IPerformanceMetrics;
21
+ config?: ITrackingConfig;
22
+ callbackCount?: number;
23
+ requestId?: string;
24
+ successCount?: number;
25
+ errorCount?: number;
26
+ executionTime?: number;
27
+ }
28
+ export interface ICallbackWorkerResponse {
29
+ type: 'ready' | 'health' | 'callbackReady' | 'executionSummary' | 'callbackFailed' | 'heartbeat';
30
+ message?: string;
31
+ status?: 'busy' | 'idle';
32
+ queueLength?: number;
33
+ stats?: ICallbackStats;
34
+ eventType?: string;
35
+ successCount?: number;
36
+ errorCount?: number;
37
+ executionTime?: number;
38
+ dataSample?: IProcessedEventData;
39
+ error?: string;
40
+ finalAttempt?: boolean;
41
+ timestamp?: number;
42
+ processing?: boolean;
43
+ }
@@ -0,0 +1,91 @@
1
+ import type { ITrackingConfig } from './tracking';
2
+ import type { IWorkerMessage } from './worker';
3
+ export interface IEventData {
4
+ timestamp: number;
5
+ eventId?: string;
6
+ [key: string]: any;
7
+ }
8
+ export interface IProcessedEventData extends IEventData {
9
+ eventType: string;
10
+ processed: boolean;
11
+ [key: string]: any;
12
+ }
13
+ export interface IPerformanceMetrics {
14
+ manualTrigger?: boolean;
15
+ timestamp: number;
16
+ cpuUsage?: number;
17
+ memoryUsage?: number;
18
+ networkSpeed?: number;
19
+ processingTime: number;
20
+ entryCount?: number;
21
+ largestContentfulPaint?: number;
22
+ }
23
+ export interface ICallbackData {
24
+ type: string;
25
+ data: IProcessedEventData;
26
+ metrics?: IPerformanceMetrics;
27
+ timestamp: number;
28
+ processingTime: number;
29
+ workerId: string;
30
+ }
31
+ export interface IProcessingQueueItem {
32
+ eventName: string;
33
+ eventData: IEventData;
34
+ timestamp: number;
35
+ }
36
+ export interface IEventWorkerMessage extends IWorkerMessage {
37
+ type: 'init' | 'track' | 'healthCheck';
38
+ event?: string;
39
+ data?: IEventData;
40
+ config?: ITrackingConfig;
41
+ }
42
+ export interface IEventWorkerResponse {
43
+ type: 'ready' | 'health' | 'processed' | 'error';
44
+ message?: string;
45
+ status?: 'busy' | 'idle';
46
+ queueLength?: number;
47
+ data?: {
48
+ event: string;
49
+ processedData?: IProcessedEventData;
50
+ metrics?: IPerformanceMetrics;
51
+ processingTime?: number;
52
+ workerTimestamp?: number;
53
+ error?: {
54
+ message: string;
55
+ stack?: string;
56
+ timestamp: number;
57
+ };
58
+ };
59
+ }
60
+ export interface INavigationTiming {
61
+ navigationStart: number;
62
+ domContentLoaded: number;
63
+ loadEvent: number;
64
+ totalLoadTime: number;
65
+ }
66
+ export interface IProcessedClickData extends IProcessedEventData {
67
+ eventType: ITrackingEvent.CLICK;
68
+ sessionId: string;
69
+ }
70
+ export interface IProcessedPageViewData extends IProcessedEventData {
71
+ eventType: ITrackingEvent.PAGE_LOAD;
72
+ userAgent: string;
73
+ }
74
+ export interface IProcessedScrollData extends IProcessedEventData {
75
+ eventType: ITrackingEvent.SCROLL;
76
+ scrollPercentage: number;
77
+ }
78
+ export interface IProcessedPerformanceEntryData extends IProcessedEventData {
79
+ eventType: ITrackingEvent.PERFORMANCE_ENTRY;
80
+ category: string;
81
+ }
82
+ export type EventCallback = (data: ICallbackData) => void;
83
+ export type UnsubscribeFunction = () => void;
84
+ export declare enum ITrackingEvent {
85
+ PAGE_LOAD = "pageLoad",
86
+ CLICK = "click",
87
+ PERFORMANCE = "performance",
88
+ PERFORMANCE_ENTRY = "performanceEntry",
89
+ SCROLL = "scroll",
90
+ MANUAL_CLICK = "manualClick"
91
+ }
@@ -0,0 +1,4 @@
1
+ export * from './callback';
2
+ export * from './event';
3
+ export * from './tracking';
4
+ export * from './worker';
@@ -0,0 +1,16 @@
1
+ import type { ITrackingEvent } from './event';
2
+ import type { WorkerStatus } from './worker';
3
+ export interface ITrackingConfig {
4
+ events: ITrackingEvent[];
5
+ workerTimeout?: number;
6
+ }
7
+ export interface IWorkerStatus {
8
+ eventWorker: WorkerStatus;
9
+ callbackWorker: WorkerStatus;
10
+ }
11
+ export interface ITrackingSDKStatus {
12
+ isInitialized: boolean;
13
+ workerStatus: IWorkerStatus;
14
+ registeredCallbacks: string[];
15
+ totalCallbacks: number;
16
+ }
@@ -0,0 +1,21 @@
1
+ import type { IPerformanceMetrics, IProcessedEventData } from './event';
2
+ import type { ITrackingConfig } from './tracking';
3
+ export interface IWorkerMessage {
4
+ type: string;
5
+ data?: any;
6
+ event?: string;
7
+ processedData?: IProcessedEventData;
8
+ metrics?: IPerformanceMetrics;
9
+ config?: ITrackingConfig;
10
+ eventType?: string;
11
+ callbackCount?: number;
12
+ timestamp?: number;
13
+ error?: any;
14
+ callbacks?: string[];
15
+ requestId?: string;
16
+ payload?: any;
17
+ successCount?: number;
18
+ errorCount?: number;
19
+ executionTime?: number;
20
+ }
21
+ export type WorkerStatus = 'idle' | 'ready' | 'active' | 'error' | 'destroyed';
@@ -0,0 +1 @@
1
+ export declare function generateSessionId(): string;
@@ -0,0 +1 @@
1
+ export * from './event-worker';
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@levi123/trackers",
3
+ "version": "4.0.0-dev.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "source": "src/index.ts",
7
+ "scripts": {
8
+ "build": "rollup --config node:@levi123/rollup-config --environment NODE_ENV:production",
9
+ "clean": "rm -rf dist",
10
+ "dev": "echo 'Add dev script here'",
11
+ "format": "prettier --write \"**/*.{ts,tsx,md}\"",
12
+ "lint": "eslint \"src/**/*.{ts,tsx}\"",
13
+ "lint:all": "yarn lint && yarn lint:tsc",
14
+ "lint:tsc": "tsc --noEmit",
15
+ "post:publish": "node ../../scripts/convert-publish.js",
16
+ "pre:publish": "node ../../scripts/convert-publish.js -p",
17
+ "test": "jest --runInBand"
18
+ },
19
+ "devDependencies": {
20
+ "eslint": "9.36.0",
21
+ "rollup": "3.29.5"
22
+ },
23
+ "main": "dist/umd/index.js",
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "module": "dist/esm/index.js",
28
+ "types": "dist/esm/index.d.ts",
29
+ "exports": {
30
+ "./package.json": "./package.json",
31
+ ".": {
32
+ "node": {
33
+ "types": "./dist/esm/index.d.ts",
34
+ "module": "./dist/esm/index.js",
35
+ "require": "./dist/umd/index.js",
36
+ "import": "./dist/esm/index.mjs"
37
+ },
38
+ "browser": {
39
+ "import": "./dist/esm/index.js",
40
+ "require": "./dist/umd/index.js"
41
+ },
42
+ "default": "./dist/esm/index.js"
43
+ }
44
+ }
45
+ }