@shellapps/experience 1.14.1 → 1.15.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 +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +12 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/session.ts","../src/proto/schemas.ts","../src/proto/encode.ts","../src/transport.ts","../src/batch.ts","../src/breadcrumbs.ts","../src/heatmap.ts","../src/errors.ts","../src/auto-track.ts","../src/data-t.ts","../src/flags.ts","../src/offline.ts","../src/experience.ts"],"sourcesContent":["// Main export\nexport { Experience } from './experience';\n\n// Type exports\nexport type {\n ExperienceConfig,\n ResolvedExperienceConfig,\n TrackEvent,\n PageContext,\n ElementContext,\n HeatmapEvent,\n EventBatch,\n IngestResponse,\n ErrorEvent,\n Breadcrumb,\n BrowserContext,\n ErrorBatch,\n Session,\n FeatureFlag,\n FlagResponse,\n TransportConfig,\n EventHandler,\n UnsubscribeFn\n} from './types';\n\nexport { Severity } from './types';\n\n// For advanced usage, export individual classes\nexport { SessionManager } from './session';\nexport { Transport } from './transport';\nexport { EventBatcher } from './batch';\nexport { BreadcrumbManager } from './breadcrumbs';\nexport { HeatmapTracker } from './heatmap';\nexport { ErrorCapture } from './errors';\nexport { AutoTracker } from './auto-track';\nexport { DataTTracker } from './data-t';\nexport { FeatureFlagClient } from './flags';\nexport { OfflineQueue } from './offline';\n\n// Protobuf exports for advanced usage\nexport { ProtobufEncoder } from './proto/encode';\nexport * as ProtoSchemas from './proto/schemas';","// Core configuration types\nexport interface ExperienceConfig {\n appId: string;\n apiKey: string;\n endpoint?: string;\n enableTracking?: boolean;\n enableErrorCapture?: boolean;\n enableHeatmaps?: boolean;\n enableBreadcrumbs?: boolean;\n sampleRate?: number;\n batchIntervalMs?: number;\n maxBatchSize?: number;\n debug?: boolean;\n}\n\n// Event types\nexport interface TrackEvent {\n eventType: string;\n sessionId: string;\n timestamp: number;\n metadata?: Record<string, string>;\n pageContext?: PageContext;\n elementContext?: ElementContext;\n}\n\nexport interface PageContext {\n url: string;\n title: string;\n referrer: string;\n viewport: {\n width: number;\n height: number;\n };\n loadTime?: number;\n}\n\nexport interface ElementContext {\n selector: string;\n dataT?: string;\n tag: string;\n position?: {\n x: number;\n y: number;\n };\n}\n\nexport interface HeatmapEvent {\n sessionId: string;\n timestamp: number;\n type: 'click' | 'move' | 'hover';\n x: number;\n y: number;\n viewportWidth: number;\n viewportHeight: number;\n url: string;\n}\n\nexport interface EventBatch {\n events: TrackEvent[];\n heatmapEvents: HeatmapEvent[];\n}\n\nexport interface IngestResponse {\n success: boolean;\n message?: string;\n}\n\n// Error types\nexport interface ErrorEvent {\n sessionId: string;\n timestamp: number;\n message: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n stack?: string;\n severity: Severity;\n breadcrumbs: Breadcrumb[];\n browserContext: BrowserContext;\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n}\n\nexport enum Severity {\n INFO = 0,\n WARNING = 1,\n ERROR = 2,\n FATAL = 3\n}\n\nexport interface Breadcrumb {\n timestamp: number;\n category: 'navigation' | 'click' | 'console' | 'fetch' | 'xhr' | 'ui';\n message: string;\n data?: Record<string, any>;\n level?: 'info' | 'warning' | 'error';\n}\n\nexport interface BrowserContext {\n userAgent: string;\n url: string;\n timestamp: number;\n viewport: {\n width: number;\n height: number;\n };\n}\n\nexport interface ErrorBatch {\n errors: ErrorEvent[];\n}\n\n// Session types\nexport interface Session {\n id: string;\n startTime: number;\n getDuration(): number;\n}\n\n// Flag types\nexport interface FeatureFlag {\n key: string;\n value: any;\n type: 'boolean' | 'string' | 'number' | 'json';\n}\n\nexport interface FlagResponse {\n flags: Record<string, any>;\n}\n\n// Transport types\nexport interface TransportConfig {\n endpoint: string;\n apiKey: string;\n debug: boolean;\n}\n\n// Utility types\nexport type EventHandler = (event: Event) => void;\nexport type UnsubscribeFn = () => void;\n\n// Configuration with defaults applied\nexport interface ResolvedExperienceConfig {\n appId: string;\n apiKey: string;\n endpoint: string;\n enableTracking: boolean;\n enableErrorCapture: boolean;\n enableHeatmaps: boolean;\n enableBreadcrumbs: boolean;\n sampleRate: number;\n batchIntervalMs: number;\n maxBatchSize: number;\n debug: boolean;\n}","import { Session } from './types';\n\nconst SESSION_STORAGE_KEY = 'shellapps_experience_session';\n\nexport class SessionManager {\n private session: Session | null = null;\n\n constructor() {\n this.initializeSession();\n }\n\n private generateUUID(): string {\n // Use crypto.randomUUID if available, fallback to Math.random\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n \n // Fallback UUID v4 generation using Math.random\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n private initializeSession(): void {\n // Try to restore session from sessionStorage\n if (typeof sessionStorage !== 'undefined') {\n try {\n const storedSession = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (storedSession) {\n const parsed = JSON.parse(storedSession);\n this.session = {\n id: parsed.id,\n startTime: parsed.startTime,\n getDuration: () => Date.now() - parsed.startTime\n };\n return;\n }\n } catch (error) {\n // Ignore parsing errors and create a new session\n }\n }\n\n // Create a new session\n this.createNewSession();\n }\n\n private createNewSession(): void {\n const startTime = Date.now();\n const sessionId = this.generateUUID();\n \n this.session = {\n id: sessionId,\n startTime,\n getDuration: () => Date.now() - startTime\n };\n\n // Store in sessionStorage if available\n if (typeof sessionStorage !== 'undefined') {\n try {\n sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify({\n id: sessionId,\n startTime\n }));\n } catch (error) {\n // Ignore storage errors\n }\n }\n }\n\n public getCurrentSession(): Session {\n if (!this.session) {\n this.createNewSession();\n }\n return this.session!;\n }\n\n public getSessionId(): string {\n return this.getCurrentSession().id;\n }\n\n public getSessionDuration(): number {\n return this.getCurrentSession().getDuration();\n }\n\n public renewSession(): void {\n this.createNewSession();\n }\n}","// Protobuf schema definitions matching the proto files\n\n// TrackEvent schema\nexport const TrackEventSchema = {\n eventType: 1,\n sessionId: 2,\n timestamp: 3,\n metadata: 4,\n pageContext: 5,\n elementContext: 6\n};\n\n// PageContext schema\nexport const PageContextSchema = {\n url: 1,\n title: 2,\n referrer: 3,\n viewport: 4,\n loadTime: 5\n};\n\n// Viewport schema\nexport const ViewportSchema = {\n width: 1,\n height: 2\n};\n\n// ElementContext schema\nexport const ElementContextSchema = {\n selector: 1,\n dataT: 2,\n tag: 3,\n position: 4\n};\n\n// Position schema\nexport const PositionSchema = {\n x: 1,\n y: 2\n};\n\n// HeatmapEvent schema\nexport const HeatmapEventSchema = {\n sessionId: 1,\n timestamp: 2,\n type: 3,\n x: 4,\n y: 5,\n viewportWidth: 6,\n viewportHeight: 7,\n url: 8\n};\n\n// EventBatch schema\nexport const EventBatchSchema = {\n events: 1,\n heatmapEvents: 2\n};\n\n// IngestResponse schema\nexport const IngestResponseSchema = {\n success: 1,\n message: 2\n};\n\n// ErrorEvent schema\nexport const ErrorEventSchema = {\n sessionId: 1,\n timestamp: 2,\n message: 3,\n filename: 4,\n lineno: 5,\n colno: 6,\n stack: 7,\n severity: 8,\n breadcrumbs: 9,\n browserContext: 10,\n tags: 11,\n extra: 12\n};\n\n// Breadcrumb schema\nexport const BreadcrumbSchema = {\n timestamp: 1,\n category: 2,\n message: 3,\n data: 4,\n level: 5\n};\n\n// BrowserContext schema\nexport const BrowserContextSchema = {\n userAgent: 1,\n url: 2,\n timestamp: 3,\n viewport: 4\n};\n\n// ErrorBatch schema\nexport const ErrorBatchSchema = {\n errors: 1\n};\n\n// Wire types for protobuf\nexport const WireType = {\n VARINT: 0,\n FIXED64: 1,\n LENGTH_DELIMITED: 2,\n START_GROUP: 3,\n END_GROUP: 4,\n FIXED32: 5\n};\n\n// Severity enum values\nexport const SeverityEnum = {\n INFO: 0,\n WARNING: 1,\n ERROR: 2,\n FATAL: 3\n};\n\n// HeatmapEvent type enum values\nexport const HeatmapTypeEnum = {\n click: 0,\n move: 1,\n hover: 2\n};\n\n// Breadcrumb category enum values\nexport const BreadcrumbCategoryEnum = {\n navigation: 0,\n click: 1,\n console: 2,\n fetch: 3,\n xhr: 4,\n ui: 5\n};\n\n// Breadcrumb level enum values\nexport const BreadcrumbLevelEnum = {\n info: 0,\n warning: 1,\n error: 2\n};","import {\n WireType,\n TrackEventSchema,\n PageContextSchema,\n ViewportSchema,\n ElementContextSchema,\n PositionSchema,\n HeatmapEventSchema,\n EventBatchSchema,\n ErrorEventSchema,\n BreadcrumbSchema,\n BrowserContextSchema,\n ErrorBatchSchema,\n SeverityEnum,\n HeatmapTypeEnum,\n BreadcrumbCategoryEnum,\n BreadcrumbLevelEnum\n} from './schemas';\nimport {\n TrackEvent,\n HeatmapEvent,\n EventBatch,\n ErrorEvent,\n ErrorBatch,\n Breadcrumb,\n BrowserContext,\n PageContext,\n ElementContext,\n Severity\n} from '../types';\n\nexport class ProtobufEncoder {\n private buffer: number[] = [];\n\n // Helper methods for encoding\n private encodeVarint(value: number): void {\n while (value >= 128) {\n this.buffer.push((value & 0x7F) | 0x80);\n value >>>= 7;\n }\n this.buffer.push(value & 0x7F);\n }\n\n private encodeTag(fieldNumber: number, wireType: number): void {\n this.encodeVarint((fieldNumber << 3) | wireType);\n }\n\n private encodeString(value: string): void {\n const utf8Bytes = new TextEncoder().encode(value);\n this.encodeVarint(utf8Bytes.length);\n this.buffer.push(...utf8Bytes);\n }\n\n private encodeUint64(value: number): void {\n // For JavaScript numbers, we'll encode as varint for simplicity\n this.encodeVarint(value);\n }\n\n private encodeUint32(value: number): void {\n this.encodeVarint(value);\n }\n\n private encodeBool(value: boolean): void {\n this.buffer.push(value ? 1 : 0);\n }\n\n private encodeMessage(encoder: () => void): Uint8Array {\n const startLength = this.buffer.length;\n encoder();\n const messageLength = this.buffer.length - startLength;\n \n // Create a new buffer with the length prefix\n const lengthBytes: number[] = [];\n let length = messageLength;\n while (length >= 128) {\n lengthBytes.push((length & 0x7F) | 0x80);\n length >>>= 7;\n }\n lengthBytes.push(length & 0x7F);\n \n // Insert length at the start\n this.buffer.splice(startLength, 0, ...lengthBytes);\n \n return new Uint8Array(this.buffer.slice(startLength + lengthBytes.length));\n }\n\n private encodeMapEntry(key: string, value: string): void {\n // Map entry is a nested message with key=1, value=2\n const entryEncoder = new ProtobufEncoder();\n entryEncoder.encodeTag(1, WireType.LENGTH_DELIMITED);\n entryEncoder.encodeString(key);\n entryEncoder.encodeTag(2, WireType.LENGTH_DELIMITED);\n entryEncoder.encodeString(value);\n \n this.encodeVarint(entryEncoder.buffer.length);\n this.buffer.push(...entryEncoder.buffer);\n }\n\n // Encode viewport\n private encodeViewport(viewport: { width: number; height: number }): void {\n if (viewport.width) {\n this.encodeTag(ViewportSchema.width, WireType.VARINT);\n this.encodeUint32(viewport.width);\n }\n if (viewport.height) {\n this.encodeTag(ViewportSchema.height, WireType.VARINT);\n this.encodeUint32(viewport.height);\n }\n }\n\n // Encode position\n private encodePosition(position: { x: number; y: number }): void {\n this.encodeTag(PositionSchema.x, WireType.VARINT);\n this.encodeUint32(position.x);\n this.encodeTag(PositionSchema.y, WireType.VARINT);\n this.encodeUint32(position.y);\n }\n\n // Encode PageContext\n private encodePageContext(pageContext: PageContext): void {\n this.encodeTag(PageContextSchema.url, WireType.LENGTH_DELIMITED);\n this.encodeString(pageContext.url);\n \n this.encodeTag(PageContextSchema.title, WireType.LENGTH_DELIMITED);\n this.encodeString(pageContext.title);\n \n this.encodeTag(PageContextSchema.referrer, WireType.LENGTH_DELIMITED);\n this.encodeString(pageContext.referrer);\n \n if (pageContext.viewport) {\n this.encodeTag(PageContextSchema.viewport, WireType.LENGTH_DELIMITED);\n const viewportEncoder = new ProtobufEncoder();\n viewportEncoder.encodeViewport(pageContext.viewport);\n this.encodeVarint(viewportEncoder.buffer.length);\n this.buffer.push(...viewportEncoder.buffer);\n }\n \n if (pageContext.loadTime) {\n this.encodeTag(PageContextSchema.loadTime, WireType.VARINT);\n this.encodeUint64(pageContext.loadTime);\n }\n }\n\n // Encode ElementContext\n private encodeElementContext(elementContext: ElementContext): void {\n this.encodeTag(ElementContextSchema.selector, WireType.LENGTH_DELIMITED);\n this.encodeString(elementContext.selector);\n \n if (elementContext.dataT) {\n this.encodeTag(ElementContextSchema.dataT, WireType.LENGTH_DELIMITED);\n this.encodeString(elementContext.dataT);\n }\n \n this.encodeTag(ElementContextSchema.tag, WireType.LENGTH_DELIMITED);\n this.encodeString(elementContext.tag);\n \n if (elementContext.position) {\n this.encodeTag(ElementContextSchema.position, WireType.LENGTH_DELIMITED);\n const positionEncoder = new ProtobufEncoder();\n positionEncoder.encodePosition(elementContext.position);\n this.encodeVarint(positionEncoder.buffer.length);\n this.buffer.push(...positionEncoder.buffer);\n }\n }\n\n // Encode TrackEvent\n private encodeTrackEvent(event: TrackEvent): void {\n this.encodeTag(TrackEventSchema.eventType, WireType.LENGTH_DELIMITED);\n this.encodeString(event.eventType);\n \n this.encodeTag(TrackEventSchema.sessionId, WireType.LENGTH_DELIMITED);\n this.encodeString(event.sessionId);\n \n this.encodeTag(TrackEventSchema.timestamp, WireType.VARINT);\n this.encodeUint64(event.timestamp);\n \n if (event.metadata) {\n for (const [key, value] of Object.entries(event.metadata)) {\n this.encodeTag(TrackEventSchema.metadata, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, value);\n }\n }\n \n if (event.pageContext) {\n this.encodeTag(TrackEventSchema.pageContext, WireType.LENGTH_DELIMITED);\n const pageContextEncoder = new ProtobufEncoder();\n pageContextEncoder.encodePageContext(event.pageContext);\n this.encodeVarint(pageContextEncoder.buffer.length);\n this.buffer.push(...pageContextEncoder.buffer);\n }\n \n if (event.elementContext) {\n this.encodeTag(TrackEventSchema.elementContext, WireType.LENGTH_DELIMITED);\n const elementContextEncoder = new ProtobufEncoder();\n elementContextEncoder.encodeElementContext(event.elementContext);\n this.encodeVarint(elementContextEncoder.buffer.length);\n this.buffer.push(...elementContextEncoder.buffer);\n }\n }\n\n // Encode HeatmapEvent\n private encodeHeatmapEvent(event: HeatmapEvent): void {\n this.encodeTag(HeatmapEventSchema.sessionId, WireType.LENGTH_DELIMITED);\n this.encodeString(event.sessionId);\n \n this.encodeTag(HeatmapEventSchema.timestamp, WireType.VARINT);\n this.encodeUint64(event.timestamp);\n \n this.encodeTag(HeatmapEventSchema.type, WireType.VARINT);\n this.encodeUint32(HeatmapTypeEnum[event.type]);\n \n this.encodeTag(HeatmapEventSchema.x, WireType.VARINT);\n this.encodeUint32(event.x);\n \n this.encodeTag(HeatmapEventSchema.y, WireType.VARINT);\n this.encodeUint32(event.y);\n \n this.encodeTag(HeatmapEventSchema.viewportWidth, WireType.VARINT);\n this.encodeUint32(event.viewportWidth);\n \n this.encodeTag(HeatmapEventSchema.viewportHeight, WireType.VARINT);\n this.encodeUint32(event.viewportHeight);\n \n this.encodeTag(HeatmapEventSchema.url, WireType.LENGTH_DELIMITED);\n this.encodeString(event.url);\n }\n\n // Encode Breadcrumb\n private encodeBreadcrumb(breadcrumb: Breadcrumb): void {\n this.encodeTag(BreadcrumbSchema.timestamp, WireType.VARINT);\n this.encodeUint64(breadcrumb.timestamp);\n \n this.encodeTag(BreadcrumbSchema.category, WireType.VARINT);\n this.encodeUint32(BreadcrumbCategoryEnum[breadcrumb.category]);\n \n this.encodeTag(BreadcrumbSchema.message, WireType.LENGTH_DELIMITED);\n this.encodeString(breadcrumb.message);\n \n if (breadcrumb.data) {\n for (const [key, value] of Object.entries(breadcrumb.data)) {\n this.encodeTag(BreadcrumbSchema.data, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, JSON.stringify(value));\n }\n }\n \n if (breadcrumb.level) {\n this.encodeTag(BreadcrumbSchema.level, WireType.VARINT);\n this.encodeUint32(BreadcrumbLevelEnum[breadcrumb.level]);\n }\n }\n\n // Encode BrowserContext\n private encodeBrowserContext(context: BrowserContext): void {\n this.encodeTag(BrowserContextSchema.userAgent, WireType.LENGTH_DELIMITED);\n this.encodeString(context.userAgent);\n \n this.encodeTag(BrowserContextSchema.url, WireType.LENGTH_DELIMITED);\n this.encodeString(context.url);\n \n this.encodeTag(BrowserContextSchema.timestamp, WireType.VARINT);\n this.encodeUint64(context.timestamp);\n \n this.encodeTag(BrowserContextSchema.viewport, WireType.LENGTH_DELIMITED);\n const viewportEncoder = new ProtobufEncoder();\n viewportEncoder.encodeViewport(context.viewport);\n this.encodeVarint(viewportEncoder.buffer.length);\n this.buffer.push(...viewportEncoder.buffer);\n }\n\n // Encode ErrorEvent\n private encodeErrorEvent(error: ErrorEvent): void {\n this.encodeTag(ErrorEventSchema.sessionId, WireType.LENGTH_DELIMITED);\n this.encodeString(error.sessionId);\n \n this.encodeTag(ErrorEventSchema.timestamp, WireType.VARINT);\n this.encodeUint64(error.timestamp);\n \n this.encodeTag(ErrorEventSchema.message, WireType.LENGTH_DELIMITED);\n this.encodeString(error.message);\n \n if (error.filename) {\n this.encodeTag(ErrorEventSchema.filename, WireType.LENGTH_DELIMITED);\n this.encodeString(error.filename);\n }\n \n if (error.lineno) {\n this.encodeTag(ErrorEventSchema.lineno, WireType.VARINT);\n this.encodeUint32(error.lineno);\n }\n \n if (error.colno) {\n this.encodeTag(ErrorEventSchema.colno, WireType.VARINT);\n this.encodeUint32(error.colno);\n }\n \n if (error.stack) {\n this.encodeTag(ErrorEventSchema.stack, WireType.LENGTH_DELIMITED);\n this.encodeString(error.stack);\n }\n \n this.encodeTag(ErrorEventSchema.severity, WireType.VARINT);\n this.encodeUint32(error.severity);\n \n // Encode breadcrumbs\n for (const breadcrumb of error.breadcrumbs) {\n this.encodeTag(ErrorEventSchema.breadcrumbs, WireType.LENGTH_DELIMITED);\n const breadcrumbEncoder = new ProtobufEncoder();\n breadcrumbEncoder.encodeBreadcrumb(breadcrumb);\n this.encodeVarint(breadcrumbEncoder.buffer.length);\n this.buffer.push(...breadcrumbEncoder.buffer);\n }\n \n // Encode browser context\n this.encodeTag(ErrorEventSchema.browserContext, WireType.LENGTH_DELIMITED);\n const browserContextEncoder = new ProtobufEncoder();\n browserContextEncoder.encodeBrowserContext(error.browserContext);\n this.encodeVarint(browserContextEncoder.buffer.length);\n this.buffer.push(...browserContextEncoder.buffer);\n \n if (error.tags) {\n for (const [key, value] of Object.entries(error.tags)) {\n this.encodeTag(ErrorEventSchema.tags, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, value);\n }\n }\n \n if (error.extra) {\n for (const [key, value] of Object.entries(error.extra)) {\n this.encodeTag(ErrorEventSchema.extra, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, JSON.stringify(value));\n }\n }\n }\n\n // Public encoding methods\n public encodeEventBatch(batch: EventBatch): Uint8Array {\n this.buffer = [];\n \n // Encode events\n for (const event of batch.events) {\n this.encodeTag(EventBatchSchema.events, WireType.LENGTH_DELIMITED);\n const eventEncoder = new ProtobufEncoder();\n eventEncoder.encodeTrackEvent(event);\n this.encodeVarint(eventEncoder.buffer.length);\n this.buffer.push(...eventEncoder.buffer);\n }\n \n // Encode heatmap events\n for (const event of batch.heatmapEvents) {\n this.encodeTag(EventBatchSchema.heatmapEvents, WireType.LENGTH_DELIMITED);\n const eventEncoder = new ProtobufEncoder();\n eventEncoder.encodeHeatmapEvent(event);\n this.encodeVarint(eventEncoder.buffer.length);\n this.buffer.push(...eventEncoder.buffer);\n }\n \n return new Uint8Array(this.buffer);\n }\n\n public encodeErrorBatch(batch: ErrorBatch): Uint8Array {\n this.buffer = [];\n \n for (const error of batch.errors) {\n this.encodeTag(ErrorBatchSchema.errors, WireType.LENGTH_DELIMITED);\n const errorEncoder = new ProtobufEncoder();\n errorEncoder.encodeErrorEvent(error);\n this.encodeVarint(errorEncoder.buffer.length);\n this.buffer.push(...errorEncoder.buffer);\n }\n \n return new Uint8Array(this.buffer);\n }\n}","import { TransportConfig, EventBatch, ErrorBatch, IngestResponse } from './types';\nimport { ProtobufEncoder } from './proto/encode';\n\nexport class Transport {\n private config: TransportConfig;\n private encoder: ProtobufEncoder;\n\n constructor(config: TransportConfig) {\n this.config = config;\n this.encoder = new ProtobufEncoder();\n }\n\n private async sendProtobuf(endpoint: string, data: Uint8Array): Promise<IngestResponse> {\n try {\n const response = await fetch(`${this.config.endpoint}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'X-API-Key': this.config.apiKey\n },\n body: data as BodyInit\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Assume success if we can't parse the response\n try {\n const result = await response.json();\n return result;\n } catch {\n return { success: true };\n }\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Protobuf transport error:', error);\n }\n throw error;\n }\n }\n\n private async sendJSON(endpoint: string, data: any): Promise<IngestResponse> {\n try {\n const response = await fetch(`${this.config.endpoint}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey\n },\n body: JSON.stringify(data)\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n try {\n const result = await response.json();\n return result;\n } catch {\n return { success: true };\n }\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] JSON transport error:', error);\n }\n throw error;\n }\n }\n\n public async sendEventBatch(batch: EventBatch): Promise<IngestResponse> {\n try {\n // Try protobuf first unless debug mode\n if (!this.config.debug) {\n const protobufData = this.encoder.encodeEventBatch(batch);\n return await this.sendProtobuf('/api/v1/events/ingest', protobufData);\n }\n } catch (error) {\n if (this.config.debug) {\n console.warn('[ExperienceSDK] Protobuf failed, falling back to JSON:', error);\n }\n }\n\n // Fallback to JSON\n return this.sendJSON('/api/v1/events/ingest/json', batch);\n }\n\n public async sendErrorBatch(batch: ErrorBatch): Promise<IngestResponse> {\n try {\n // Try protobuf first unless debug mode\n if (!this.config.debug) {\n const protobufData = this.encoder.encodeErrorBatch(batch);\n return await this.sendProtobuf('/api/v1/errors/ingest', protobufData);\n }\n } catch (error) {\n if (this.config.debug) {\n console.warn('[ExperienceSDK] Protobuf failed, falling back to JSON:', error);\n }\n }\n\n // Fallback to JSON\n return this.sendJSON('/api/v1/errors/ingest/json', batch);\n }\n\n public async sendEventBatchBeacon(batch: EventBatch): Promise<void> {\n // Use sendBeacon for unload scenarios\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n try {\n const protobufData = this.encoder.encodeEventBatch(batch);\n const blob = new Blob([protobufData as BlobPart], { type: 'application/x-protobuf' });\n \n // Note: sendBeacon doesn't support custom headers, so we include the API key in the URL\n const url = `${this.config.endpoint}/api/v1/events/ingest?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(url, blob);\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Beacon send error:', error);\n }\n // Fallback to JSON beacon\n try {\n const jsonBlob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n const jsonUrl = `${this.config.endpoint}/api/v1/events/ingest/json?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(jsonUrl, jsonBlob);\n } catch (fallbackError) {\n // Silent fail for beacon\n }\n }\n }\n }\n\n public async sendErrorBatchBeacon(batch: ErrorBatch): Promise<void> {\n // Use sendBeacon for unload scenarios\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n try {\n const protobufData = this.encoder.encodeErrorBatch(batch);\n const blob = new Blob([protobufData as BlobPart], { type: 'application/x-protobuf' });\n \n const url = `${this.config.endpoint}/api/v1/errors/ingest?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(url, blob);\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Error beacon send error:', error);\n }\n // Fallback to JSON beacon\n try {\n const jsonBlob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n const jsonUrl = `${this.config.endpoint}/api/v1/errors/ingest/json?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(jsonUrl, jsonBlob);\n } catch (fallbackError) {\n // Silent fail for beacon\n }\n }\n }\n }\n\n public async fetchFlags(appId: string, profileId?: string): Promise<Record<string, any>> {\n try {\n const queryParams = new URLSearchParams();\n if (profileId) {\n queryParams.set('profileId', profileId);\n }\n\n const url = `${this.config.endpoint}/api/v1/flags/${appId}/resolve${queryParams.toString() ? '?' + queryParams.toString() : ''}`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'X-API-Key': this.config.apiKey\n }\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result.flags || {};\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Flag fetch error:', error);\n }\n return {};\n }\n }\n}","import { TrackEvent, HeatmapEvent, EventBatch, ErrorEvent, ErrorBatch, UnsubscribeFn } from './types';\nimport { Transport } from './transport';\n\nexport class EventBatcher {\n private trackEvents: TrackEvent[] = [];\n private heatmapEvents: HeatmapEvent[] = [];\n private errorEvents: ErrorEvent[] = [];\n private transport: Transport;\n private batchIntervalMs: number;\n private maxBatchSize: number;\n private debug: boolean;\n private flushTimer: number | null = null;\n private unsubscribeFns: UnsubscribeFn[] = [];\n\n constructor(\n transport: Transport, \n batchIntervalMs: number = 2000, \n maxBatchSize: number = 50,\n debug: boolean = false\n ) {\n this.transport = transport;\n this.batchIntervalMs = batchIntervalMs;\n this.maxBatchSize = maxBatchSize;\n this.debug = debug;\n \n this.setupAutoFlush();\n this.setupUnloadHandler();\n }\n\n private setupAutoFlush(): void {\n this.scheduleNextFlush();\n }\n\n private scheduleNextFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n }\n\n this.flushTimer = window.setTimeout(() => {\n this.flush();\n this.scheduleNextFlush();\n }, this.batchIntervalMs);\n }\n\n private setupUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n\n const handleUnload = () => {\n // Use sendBeacon for unload scenarios\n this.flushBeacon();\n };\n\n // Try multiple unload events for better coverage\n window.addEventListener('beforeunload', handleUnload);\n window.addEventListener('unload', handleUnload);\n \n // Also try pagehide and visibilitychange for mobile\n window.addEventListener('pagehide', handleUnload);\n \n if (typeof document !== 'undefined') {\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this.flushBeacon();\n }\n };\n \n document.addEventListener('visibilitychange', handleVisibilityChange);\n \n this.unsubscribeFns.push(() => {\n window.removeEventListener('beforeunload', handleUnload);\n window.removeEventListener('unload', handleUnload);\n window.removeEventListener('pagehide', handleUnload);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n });\n } else {\n this.unsubscribeFns.push(() => {\n window.removeEventListener('beforeunload', handleUnload);\n window.removeEventListener('unload', handleUnload);\n window.removeEventListener('pagehide', handleUnload);\n });\n }\n }\n\n public addTrackEvent(event: TrackEvent): void {\n this.trackEvents.push(event);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Track event added:', event);\n }\n\n // Auto-flush if we hit the max batch size\n if (this.trackEvents.length + this.heatmapEvents.length >= this.maxBatchSize) {\n this.flush();\n }\n }\n\n public addHeatmapEvent(event: HeatmapEvent): void {\n this.heatmapEvents.push(event);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Heatmap event added:', event);\n }\n\n // Auto-flush if we hit the max batch size\n if (this.trackEvents.length + this.heatmapEvents.length >= this.maxBatchSize) {\n this.flush();\n }\n }\n\n public addErrorEvent(error: ErrorEvent): void {\n this.errorEvents.push(error);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Error event added:', error);\n }\n\n // Errors are batched separately and flush immediately if critical\n if (error.severity >= 2) { // ERROR or FATAL\n this.flushErrors();\n } else if (this.errorEvents.length >= this.maxBatchSize) {\n this.flushErrors();\n }\n }\n\n public async flush(): Promise<void> {\n if (this.trackEvents.length === 0 && this.heatmapEvents.length === 0) {\n return;\n }\n\n const batch: EventBatch = {\n events: [...this.trackEvents],\n heatmapEvents: [...this.heatmapEvents]\n };\n\n // Clear the events immediately to prevent double-sending\n this.trackEvents = [];\n this.heatmapEvents = [];\n\n try {\n const result = await this.transport.sendEventBatch(batch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Event batch sent successfully:', result);\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to send event batch:', error);\n }\n \n // Re-add events to the front of the queue for retry\n this.trackEvents.unshift(...batch.events);\n this.heatmapEvents.unshift(...batch.heatmapEvents);\n \n // Limit the retry queue size to prevent memory issues\n this.trackEvents = this.trackEvents.slice(0, this.maxBatchSize * 2);\n this.heatmapEvents = this.heatmapEvents.slice(0, this.maxBatchSize * 2);\n }\n }\n\n public async flushErrors(): Promise<void> {\n if (this.errorEvents.length === 0) {\n return;\n }\n\n const batch: ErrorBatch = {\n errors: [...this.errorEvents]\n };\n\n // Clear the errors immediately\n this.errorEvents = [];\n\n try {\n const result = await this.transport.sendErrorBatch(batch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Error batch sent successfully:', result);\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to send error batch:', error);\n }\n \n // Re-add errors for retry\n this.errorEvents.unshift(...batch.errors);\n \n // Limit retry queue\n this.errorEvents = this.errorEvents.slice(0, this.maxBatchSize * 2);\n }\n }\n\n public flushBeacon(): void {\n // Use sendBeacon for unload scenarios - fire and forget\n if (this.trackEvents.length > 0 || this.heatmapEvents.length > 0) {\n const eventBatch: EventBatch = {\n events: [...this.trackEvents],\n heatmapEvents: [...this.heatmapEvents]\n };\n \n this.transport.sendEventBatchBeacon(eventBatch);\n this.trackEvents = [];\n this.heatmapEvents = [];\n }\n\n if (this.errorEvents.length > 0) {\n const errorBatch: ErrorBatch = {\n errors: [...this.errorEvents]\n };\n \n this.transport.sendErrorBatchBeacon(errorBatch);\n this.errorEvents = [];\n }\n }\n\n public getPendingEventCount(): number {\n return this.trackEvents.length + this.heatmapEvents.length;\n }\n\n public getPendingErrorCount(): number {\n return this.errorEvents.length;\n }\n\n public async shutdown(): Promise<void> {\n // Clear the flush timer\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n // Final flush\n await Promise.all([\n this.flush(),\n this.flushErrors()\n ]);\n }\n\n // Force immediate flush for testing/debugging\n public async forceFlush(): Promise<void> {\n await Promise.all([\n this.flush(),\n this.flushErrors()\n ]);\n }\n}","import { Breadcrumb, UnsubscribeFn } from './types';\n\nconst MAX_BREADCRUMBS = 50;\n\nexport class BreadcrumbManager {\n private breadcrumbs: Breadcrumb[] = [];\n private unsubscribeFns: UnsubscribeFn[] = [];\n private originalConsole: {\n warn: typeof console.warn;\n error: typeof console.error;\n } | null = null;\n private originalFetch: typeof fetch | null = null;\n private isEnabled = false;\n\n constructor() {\n // Initialize with browser API guards\n }\n\n public enable(): void {\n if (this.isEnabled) return;\n this.isEnabled = true;\n\n this.setupConsoleWrapping();\n this.setupFetchWrapping();\n this.setupXHRWrapping();\n this.setupNavigationListeners();\n this.setupClickListener();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clean up all listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n // Restore original functions\n this.restoreConsole();\n this.restoreFetch();\n }\n\n private addBreadcrumb(breadcrumb: Omit<Breadcrumb, 'timestamp'>): void {\n const fullBreadcrumb: Breadcrumb = {\n ...breadcrumb,\n timestamp: Date.now()\n };\n\n this.breadcrumbs.push(fullBreadcrumb);\n\n // Keep only the last MAX_BREADCRUMBS items\n if (this.breadcrumbs.length > MAX_BREADCRUMBS) {\n this.breadcrumbs = this.breadcrumbs.slice(-MAX_BREADCRUMBS);\n }\n }\n\n private setupConsoleWrapping(): void {\n if (typeof console === 'undefined') return;\n\n this.originalConsole = {\n warn: console.warn,\n error: console.error\n };\n\n console.warn = (...args: any[]) => {\n this.addBreadcrumb({\n category: 'console',\n message: args.map(arg => String(arg)).join(' '),\n level: 'warning'\n });\n this.originalConsole!.warn.apply(console, args);\n };\n\n console.error = (...args: any[]) => {\n this.addBreadcrumb({\n category: 'console',\n message: args.map(arg => String(arg)).join(' '),\n level: 'error'\n });\n this.originalConsole!.error.apply(console, args);\n };\n }\n\n private restoreConsole(): void {\n if (this.originalConsole && typeof console !== 'undefined') {\n console.warn = this.originalConsole.warn;\n console.error = this.originalConsole.error;\n this.originalConsole = null;\n }\n }\n\n private setupFetchWrapping(): void {\n if (typeof fetch === 'undefined' || typeof window === 'undefined') return;\n\n // Bind fetch to window to preserve the native invocation context.\n // Calling an unbound native fetch can throw: \"Illegal invocation\".\n this.originalFetch = window.fetch.bind(window);\n\n window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const url = typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input instanceof Request\n ? input.url\n : String(input);\n const method = init?.method || (input instanceof Request ? input.method : 'GET');\n const startTime = Date.now();\n\n try {\n const response = await this.originalFetch!(input, init);\n const duration = Date.now() - startTime;\n\n this.addBreadcrumb({\n category: 'fetch',\n message: `${method} ${url}`,\n data: {\n url,\n method,\n status: response.status,\n duration: `${duration}ms`\n },\n level: response.ok ? 'info' : 'error'\n });\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n \n this.addBreadcrumb({\n category: 'fetch',\n message: `${method} ${url} (failed)`,\n data: {\n url,\n method,\n error: error instanceof Error ? error.message : String(error),\n duration: `${duration}ms`\n },\n level: 'error'\n });\n\n throw error;\n }\n };\n }\n\n private restoreFetch(): void {\n if (this.originalFetch && typeof window !== 'undefined') {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n }\n\n private setupXHRWrapping(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function(method: string, url: string | URL, async?: boolean, user?: string | null, password?: string | null) {\n (this as any).__method = method;\n (this as any).__url = url.toString();\n (this as any).__startTime = Date.now();\n \n return originalOpen.apply(this, arguments as any);\n };\n\n XMLHttpRequest.prototype.send = function(body?: any) {\n const xhr = this;\n const method = (xhr as any).__method || 'GET';\n const url = (xhr as any).__url || '';\n\n const originalOnReadyStateChange = xhr.onreadystatechange;\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n const startTime = (xhr as any).__startTime || Date.now();\n const duration = Date.now() - startTime;\n\n const breadcrumbManager = (globalThis as any).__experienceBreadcrumbs;\n if (breadcrumbManager) {\n breadcrumbManager.addBreadcrumb({\n category: 'xhr',\n message: `${method} ${url}`,\n data: {\n url,\n method,\n status: xhr.status,\n duration: `${duration}ms`\n },\n level: xhr.status >= 200 && xhr.status < 300 ? 'info' : 'error'\n });\n }\n }\n\n if (originalOnReadyStateChange) {\n originalOnReadyStateChange.apply(xhr, arguments as any);\n }\n };\n\n return originalSend.apply(this, arguments as any);\n };\n\n // Store reference to this breadcrumb manager for XHR callbacks\n (globalThis as any).__experienceBreadcrumbs = this;\n }\n\n private setupNavigationListeners(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n\n // Listen to popstate for back/forward navigation\n const handlePopState = () => {\n this.addBreadcrumb({\n category: 'navigation',\n message: 'Navigation (popstate)',\n data: {\n url: window.location.href,\n type: 'popstate'\n }\n });\n };\n\n window.addEventListener('popstate', handlePopState);\n this.unsubscribeFns.push(() => window.removeEventListener('popstate', handlePopState));\n\n // Wrap pushState and replaceState\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function(...args) {\n const breadcrumbManager = (globalThis as any).__experienceBreadcrumbs;\n if (breadcrumbManager) {\n breadcrumbManager.addBreadcrumb({\n category: 'navigation',\n message: 'Navigation (pushState)',\n data: {\n url: args[2] || window.location.href,\n type: 'pushState'\n }\n });\n }\n return originalPushState.apply(this, args);\n };\n\n history.replaceState = function(...args) {\n const breadcrumbManager = (globalThis as any).__experienceBreadcrumbs;\n if (breadcrumbManager) {\n breadcrumbManager.addBreadcrumb({\n category: 'navigation',\n message: 'Navigation (replaceState)',\n data: {\n url: args[2] || window.location.href,\n type: 'replaceState'\n }\n });\n }\n return originalReplaceState.apply(this, args);\n };\n\n // Restore on cleanup\n this.unsubscribeFns.push(() => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n });\n }\n\n private setupClickListener(): void {\n if (typeof document === 'undefined') return;\n\n const handleClick = (event: MouseEvent) => {\n const target = event.target as Element;\n if (!target) return;\n\n const tagName = target.tagName?.toLowerCase();\n const selector = this.getElementSelector(target);\n\n this.addBreadcrumb({\n category: 'click',\n message: `Click on ${tagName}`,\n data: {\n selector,\n tag: tagName,\n text: target.textContent?.slice(0, 100) || '',\n x: event.clientX,\n y: event.clientY\n }\n });\n };\n\n document.addEventListener('click', handleClick, true);\n this.unsubscribeFns.push(() => document.removeEventListener('click', handleClick, true));\n }\n\n private getElementSelector(element: Element): string {\n try {\n // Try to create a simple selector\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className && typeof element.className === 'string' \n ? `.${element.className.split(' ').filter(c => c.trim()).join('.')}` \n : '';\n \n return `${tag}${id}${className}`.slice(0, 100);\n } catch {\n return element.tagName?.toLowerCase() || 'unknown';\n }\n }\n\n public getBreadcrumbs(): Breadcrumb[] {\n return [...this.breadcrumbs];\n }\n\n public clear(): void {\n this.breadcrumbs = [];\n }\n\n public addCustomBreadcrumb(category: Breadcrumb['category'], message: string, data?: Record<string, any>): void {\n this.addBreadcrumb({\n category,\n message,\n data\n });\n }\n}","import { HeatmapEvent, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\n\nconst MOUSEMOVE_THROTTLE_MS = 100;\nconst HOVER_THRESHOLD_MS = 500;\n\nexport class HeatmapTracker {\n private batcher: EventBatcher;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private lastMouseMoveTime = 0;\n private hoverTimer: number | null = null;\n private lastHoverPosition: { x: number; y: number } | null = null;\n\n constructor(batcher: EventBatcher, sessionId: string) {\n this.batcher = batcher;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled || typeof document === 'undefined') return;\n this.isEnabled = true;\n\n this.setupMouseMoveTracking();\n this.setupClickTracking();\n this.setupHoverTracking();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clear hover timer\n if (this.hoverTimer !== null) {\n clearTimeout(this.hoverTimer);\n this.hoverTimer = null;\n }\n\n // Clean up all event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n }\n\n private setupMouseMoveTracking(): void {\n const handleMouseMove = (event: MouseEvent) => {\n const now = Date.now();\n \n // Throttle mousemove events\n if (now - this.lastMouseMoveTime < MOUSEMOVE_THROTTLE_MS) {\n return;\n }\n \n this.lastMouseMoveTime = now;\n \n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: now,\n type: 'move',\n x: event.clientX,\n y: event.clientY,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n };\n\n document.addEventListener('mousemove', handleMouseMove, { passive: true });\n this.unsubscribeFns.push(() => \n document.removeEventListener('mousemove', handleMouseMove)\n );\n }\n\n private setupClickTracking(): void {\n const handleClick = (event: MouseEvent) => {\n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'click',\n x: event.clientX,\n y: event.clientY,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n };\n\n document.addEventListener('click', handleClick, { passive: true });\n this.unsubscribeFns.push(() => \n document.removeEventListener('click', handleClick)\n );\n }\n\n private setupHoverTracking(): void {\n const handleMouseEnter = (event: MouseEvent) => {\n const x = event.clientX;\n const y = event.clientY;\n \n this.lastHoverPosition = { x, y };\n \n // Start hover timer\n this.hoverTimer = window.setTimeout(() => {\n // Check if mouse is still in approximately the same position\n if (this.lastHoverPosition && \n Math.abs(this.lastHoverPosition.x - x) < 50 && \n Math.abs(this.lastHoverPosition.y - y) < 50) {\n \n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'hover',\n x: this.lastHoverPosition.x,\n y: this.lastHoverPosition.y,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n }\n }, HOVER_THRESHOLD_MS);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n this.lastHoverPosition = { x: event.clientX, y: event.clientY };\n };\n\n const handleMouseLeave = () => {\n if (this.hoverTimer !== null) {\n clearTimeout(this.hoverTimer);\n this.hoverTimer = null;\n }\n this.lastHoverPosition = null;\n };\n\n // Use a separate throttled mousemove for hover tracking\n let lastHoverMoveTime = 0;\n const throttledMouseMove = (event: MouseEvent) => {\n const now = Date.now();\n if (now - lastHoverMoveTime >= 100) { // 100ms throttle\n lastHoverMoveTime = now;\n handleMouseMove(event);\n }\n };\n\n document.addEventListener('mouseenter', handleMouseEnter, { passive: true });\n document.addEventListener('mousemove', throttledMouseMove, { passive: true });\n document.addEventListener('mouseleave', handleMouseLeave, { passive: true });\n \n this.unsubscribeFns.push(() => {\n document.removeEventListener('mouseenter', handleMouseEnter);\n document.removeEventListener('mousemove', throttledMouseMove);\n document.removeEventListener('mouseleave', handleMouseLeave);\n });\n }\n\n private getViewportSize(): { width: number; height: number } {\n if (typeof window === 'undefined') {\n return { width: 1920, height: 1080 }; // Default fallback\n }\n\n return {\n width: window.innerWidth || document.documentElement.clientWidth || 1920,\n height: window.innerHeight || document.documentElement.clientHeight || 1080\n };\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n // Manual event tracking for programmatic use\n public trackClick(x: number, y: number): void {\n if (!this.isEnabled) return;\n\n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'click',\n x: Math.round(x),\n y: Math.round(y),\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n }\n\n public trackHover(x: number, y: number): void {\n if (!this.isEnabled) return;\n\n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'hover',\n x: Math.round(x),\n y: Math.round(y),\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n }\n}","import { ErrorEvent, Severity, BrowserContext, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\nimport { BreadcrumbManager } from './breadcrumbs';\n\nexport class ErrorCapture {\n private batcher: EventBatcher;\n private breadcrumbManager: BreadcrumbManager;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private originalWindowError: OnErrorEventHandler | null = null;\n private originalUnhandledRejection: ((event: PromiseRejectionEvent) => void) | null = null;\n\n constructor(batcher: EventBatcher, breadcrumbManager: BreadcrumbManager, sessionId: string) {\n this.batcher = batcher;\n this.breadcrumbManager = breadcrumbManager;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled || typeof window === 'undefined') return;\n this.isEnabled = true;\n\n this.setupGlobalErrorHandler();\n this.setupUnhandledRejectionHandler();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n this.restoreOriginalHandlers();\n \n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n }\n\n private setupGlobalErrorHandler(): void {\n // Store original handler\n this.originalWindowError = window.onerror;\n\n window.onerror = (message, filename, lineno, colno, error) => {\n this.captureError({\n message: typeof message === 'string' ? message : 'Unknown error',\n filename,\n lineno,\n colno,\n stack: error?.stack,\n severity: Severity.ERROR\n });\n\n // Call original handler if it exists\n if (this.originalWindowError) {\n return this.originalWindowError.call(window, message, filename, lineno, colno, error);\n }\n\n return false;\n };\n }\n\n private setupUnhandledRejectionHandler(): void {\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n let message = 'Unhandled Promise Rejection';\n let stack: string | undefined;\n\n if (event.reason) {\n if (event.reason instanceof Error) {\n message = event.reason.message || 'Unhandled Promise Rejection';\n stack = event.reason.stack;\n } else if (typeof event.reason === 'string') {\n message = event.reason;\n } else {\n try {\n message = JSON.stringify(event.reason);\n } catch {\n message = 'Unhandled Promise Rejection (non-serializable reason)';\n }\n }\n }\n\n this.captureError({\n message,\n stack,\n severity: Severity.ERROR\n });\n\n // Call original handler if it exists\n if (this.originalUnhandledRejection) {\n this.originalUnhandledRejection.call(window, event);\n }\n };\n\n // Store original handler\n this.originalUnhandledRejection = window.onunhandledrejection;\n\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n this.unsubscribeFns.push(() => {\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n });\n }\n\n private restoreOriginalHandlers(): void {\n if (typeof window !== 'undefined') {\n if (this.originalWindowError !== null) {\n window.onerror = this.originalWindowError;\n this.originalWindowError = null;\n }\n\n if (this.originalUnhandledRejection !== null) {\n window.onunhandledrejection = this.originalUnhandledRejection;\n this.originalUnhandledRejection = null;\n }\n }\n }\n\n private getBrowserContext(): BrowserContext {\n return {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Unknown',\n url: typeof window !== 'undefined' ? window.location.href : 'Unknown',\n timestamp: Date.now(),\n viewport: {\n width: typeof window !== 'undefined' ? window.innerWidth || 1920 : 1920,\n height: typeof window !== 'undefined' ? window.innerHeight || 1080 : 1080\n }\n };\n }\n\n private captureError(errorData: {\n message: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n stack?: string;\n severity: Severity;\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n }): void {\n const errorEvent: ErrorEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n message: errorData.message,\n filename: errorData.filename,\n lineno: errorData.lineno,\n colno: errorData.colno,\n stack: errorData.stack,\n severity: errorData.severity,\n breadcrumbs: this.breadcrumbManager.getBreadcrumbs(),\n browserContext: this.getBrowserContext(),\n tags: errorData.tags,\n extra: errorData.extra\n };\n\n this.batcher.addErrorEvent(errorEvent);\n\n // Add breadcrumb for this error\n this.breadcrumbManager.addCustomBreadcrumb('ui', `Error: ${errorData.message}`, {\n severity: Severity[errorData.severity].toLowerCase(),\n filename: errorData.filename,\n line: errorData.lineno\n });\n }\n\n // Public methods for manual error reporting\n public captureException(error: Error, options?: {\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n severity?: Severity;\n }): void {\n if (!this.isEnabled) return;\n\n const severity = options?.severity ?? Severity.ERROR;\n\n this.captureError({\n message: error.message || 'Unknown error',\n stack: error.stack,\n severity,\n tags: options?.tags,\n extra: options?.extra\n });\n }\n\n public captureMessage(message: string, severity: Severity = Severity.INFO, options?: {\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n }): void {\n if (!this.isEnabled) return;\n\n this.captureError({\n message,\n severity,\n tags: options?.tags,\n extra: options?.extra\n });\n }\n\n public captureBreadcrumb(message: string, category: 'navigation' | 'click' | 'console' | 'fetch' | 'xhr' | 'ui' = 'ui', data?: Record<string, any>): void {\n this.breadcrumbManager.addCustomBreadcrumb(category, message, data);\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n // Utility method to extract error info from various error types\n private extractErrorInfo(error: unknown): { message: string; stack?: string } {\n if (error instanceof Error) {\n return {\n message: error.message || 'Unknown error',\n stack: error.stack\n };\n }\n\n if (typeof error === 'string') {\n return { message: error };\n }\n\n if (error && typeof error === 'object') {\n try {\n return { message: JSON.stringify(error) };\n } catch {\n return { message: 'Non-serializable error object' };\n }\n }\n\n return { message: 'Unknown error type' };\n }\n\n // Helper method for severity string to enum conversion\n public static getSeverityFromString(severity: string): Severity {\n switch (severity.toLowerCase()) {\n case 'info':\n return Severity.INFO;\n case 'warning':\n case 'warn':\n return Severity.WARNING;\n case 'error':\n return Severity.ERROR;\n case 'fatal':\n return Severity.FATAL;\n default:\n return Severity.INFO;\n }\n }\n\n // Test method for manual error triggering (useful for debugging)\n public triggerTestError(): void {\n if (!this.isEnabled) return;\n \n try {\n throw new Error('Test error from ExperienceSDK');\n } catch (error) {\n this.captureException(error as Error, {\n tags: { test: 'true' },\n severity: Severity.WARNING\n });\n }\n }\n}","import { TrackEvent, PageContext, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\n\nexport class AutoTracker {\n private batcher: EventBatcher;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private lastUrl: string | null = null;\n private pageLoadTime: number = Date.now();\n\n constructor(batcher: EventBatcher, sessionId: string) {\n this.batcher = batcher;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled) return;\n this.isEnabled = true;\n\n // Track initial page load\n this.trackInitialPageView();\n \n // Set up SPA navigation tracking\n this.setupSPATracking();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n }\n\n private trackInitialPageView(): void {\n if (typeof window === 'undefined') return;\n\n const loadTime = this.calculateLoadTime();\n this.trackPageView(loadTime);\n this.lastUrl = window.location.href;\n }\n\n private calculateLoadTime(): number | undefined {\n if (typeof performance === 'undefined' || !performance.timing) {\n return undefined;\n }\n\n const timing = performance.timing;\n if (timing.loadEventEnd && timing.navigationStart) {\n return timing.loadEventEnd - timing.navigationStart;\n }\n\n // Fallback to DOMContentLoaded\n if (timing.domContentLoadedEventEnd && timing.navigationStart) {\n return timing.domContentLoadedEventEnd - timing.navigationStart;\n }\n\n return undefined;\n }\n\n private setupSPATracking(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n\n // Listen to popstate for back/forward navigation\n const handlePopState = () => {\n // Small delay to ensure URL has updated\n setTimeout(() => {\n if (window.location.href !== this.lastUrl) {\n this.trackPageView();\n this.lastUrl = window.location.href;\n }\n }, 0);\n };\n\n window.addEventListener('popstate', handlePopState);\n this.unsubscribeFns.push(() => window.removeEventListener('popstate', handlePopState));\n\n // Wrap history.pushState and history.replaceState\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n \n // Track navigation after state change\n setTimeout(() => {\n if (window.location.href !== this.lastUrl) {\n this.trackPageView();\n this.lastUrl = window.location.href;\n }\n }, 0);\n \n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n \n // Track navigation after state change\n setTimeout(() => {\n if (window.location.href !== this.lastUrl) {\n this.trackPageView();\n this.lastUrl = window.location.href;\n }\n }, 0);\n \n return result;\n };\n\n // Restore original methods on cleanup\n this.unsubscribeFns.push(() => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n });\n }\n\n private getPageContext(loadTime?: number): PageContext {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return {\n url: 'unknown',\n title: 'unknown',\n referrer: '',\n viewport: { width: 1920, height: 1080 }\n };\n }\n\n return {\n url: window.location.href,\n title: document.title || '',\n referrer: document.referrer || '',\n viewport: {\n width: window.innerWidth || document.documentElement.clientWidth || 1920,\n height: window.innerHeight || document.documentElement.clientHeight || 1080\n },\n loadTime\n };\n }\n\n private trackPageView(loadTime?: number): void {\n const pageContext = this.getPageContext(loadTime);\n \n const trackEvent: TrackEvent = {\n eventType: 'page_view',\n sessionId: this.sessionId,\n timestamp: Date.now(),\n pageContext\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n // Public method for manual page view tracking\n public trackCurrentPage(): void {\n if (!this.isEnabled) return;\n \n this.trackPageView();\n \n if (typeof window !== 'undefined') {\n this.lastUrl = window.location.href;\n }\n }\n\n // Track custom navigation events\n public trackNavigation(eventType: string, metadata?: Record<string, string>): void {\n if (!this.isEnabled) return;\n\n const pageContext = this.getPageContext();\n \n const trackEvent: TrackEvent = {\n eventType,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n pageContext,\n metadata\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n // Get current page info for debugging\n public getCurrentPageInfo(): PageContext {\n return this.getPageContext();\n }\n}","import { TrackEvent, ElementContext, PageContext, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\n\nconst HOVER_THRESHOLD_MS = 500;\n\nexport class DataTTracker {\n private batcher: EventBatcher;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private mutationObserver: MutationObserver | null = null;\n private intersectionObserver: IntersectionObserver | null = null;\n private visibleElements = new Set<Element>();\n private hoverTimers = new Map<Element, number>();\n\n constructor(batcher: EventBatcher, sessionId: string) {\n this.batcher = batcher;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled || typeof document === 'undefined') return;\n this.isEnabled = true;\n\n this.setupMutationObserver();\n this.setupEventDelegation();\n this.setupVisibilityTracking();\n this.setupHoverTracking();\n \n // Scan for existing data-t elements\n this.scanExistingElements();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clean up observers\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n\n // Clear hover timers\n this.hoverTimers.forEach(timer => clearTimeout(timer));\n this.hoverTimers.clear();\n\n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n this.visibleElements.clear();\n }\n\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined') return;\n\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check added nodes for data-t attributes\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n this.processNewElement(element);\n \n // Check descendants\n const descendants = element.querySelectorAll('[data-t]');\n descendants.forEach(desc => this.processNewElement(desc));\n }\n });\n } else if (mutation.type === 'attributes' && mutation.attributeName === 'data-t') {\n const target = mutation.target as Element;\n this.processNewElement(target);\n }\n }\n });\n\n this.mutationObserver.observe(document, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-t']\n });\n }\n\n private setupEventDelegation(): void {\n const handleClick = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const dataTElement = this.findDataTParent(target);\n if (dataTElement) {\n this.trackDataTEvent('click', dataTElement, {\n x: event.clientX,\n y: event.clientY\n });\n }\n };\n\n document.addEventListener('click', handleClick, true);\n this.unsubscribeFns.push(() => \n document.removeEventListener('click', handleClick, true)\n );\n }\n\n private setupVisibilityTracking(): void {\n if (typeof IntersectionObserver === 'undefined') return;\n\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const element = entry.target;\n const dataTValue = element.getAttribute('data-t');\n \n if (!dataTValue) return;\n\n if (entry.isIntersecting && !this.visibleElements.has(element)) {\n // Element became visible\n this.visibleElements.add(element);\n this.trackDataTEvent('view', element);\n } else if (!entry.isIntersecting && this.visibleElements.has(element)) {\n // Element became hidden\n this.visibleElements.delete(element);\n this.trackDataTEvent('hide', element);\n }\n });\n },\n {\n threshold: 0.1, // Trigger when at least 10% visible\n rootMargin: '50px' // Start observing 50px before entering viewport\n }\n );\n }\n\n private setupHoverTracking(): void {\n const handleMouseEnter = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const dataTElement = this.findDataTParent(target);\n \n if (!dataTElement) return;\n\n // Start hover timer\n const timer = window.setTimeout(() => {\n this.trackDataTEvent('hover', dataTElement);\n this.hoverTimers.delete(dataTElement);\n }, HOVER_THRESHOLD_MS);\n\n this.hoverTimers.set(dataTElement, timer);\n };\n\n const handleMouseLeave = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const dataTElement = this.findDataTParent(target);\n \n if (!dataTElement) return;\n\n // Clear hover timer\n const timer = this.hoverTimers.get(dataTElement);\n if (timer) {\n clearTimeout(timer);\n this.hoverTimers.delete(dataTElement);\n }\n };\n\n document.addEventListener('mouseenter', handleMouseEnter, true);\n document.addEventListener('mouseleave', handleMouseLeave, true);\n \n this.unsubscribeFns.push(() => {\n document.removeEventListener('mouseenter', handleMouseEnter, true);\n document.removeEventListener('mouseleave', handleMouseLeave, true);\n });\n }\n\n private scanExistingElements(): void {\n const existingElements = document.querySelectorAll('[data-t]');\n existingElements.forEach(element => this.processNewElement(element));\n }\n\n private processNewElement(element: Element): void {\n const dataTValue = element.getAttribute('data-t');\n if (!dataTValue) return;\n\n // Add to intersection observer for visibility tracking\n if (this.intersectionObserver) {\n this.intersectionObserver.observe(element);\n }\n\n // Track element discovery\n this.trackDataTEvent('discover', element);\n }\n\n private findDataTParent(element: Element): Element | null {\n let current: Element | null = element;\n\n while (current) {\n if (typeof (current as any).hasAttribute === 'function' && current.hasAttribute('data-t')) {\n return current;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n\n private getElementSelector(element: Element): string {\n try {\n // Build a simple selector\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const classes = element.className && typeof element.className === 'string'\n ? `.${element.className.split(' ').filter(c => c.trim()).join('.')}`\n : '';\n \n let selector = `${tag}${id}${classes}`;\n \n // Add nth-child if needed for uniqueness\n const parent = element.parentElement;\n if (parent && !id) {\n const siblings = Array.from(parent.children).filter(\n child => child.tagName === element.tagName\n );\n \n if (siblings.length > 1) {\n const index = siblings.indexOf(element) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n \n return selector.slice(0, 200); // Limit length\n } catch (error) {\n return element.tagName?.toLowerCase() || 'unknown';\n }\n }\n\n private getElementContext(element: Element, position?: { x: number; y: number }): ElementContext {\n return {\n selector: this.getElementSelector(element),\n dataT: element.getAttribute('data-t') || undefined,\n tag: element.tagName.toLowerCase(),\n position\n };\n }\n\n private getPageContext(): PageContext {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return {\n url: 'unknown',\n title: 'unknown',\n referrer: '',\n viewport: { width: 1920, height: 1080 }\n };\n }\n\n return {\n url: window.location.href,\n title: document.title || '',\n referrer: document.referrer || '',\n viewport: {\n width: window.innerWidth || 1920,\n height: window.innerHeight || 1080\n }\n };\n }\n\n private trackDataTEvent(\n eventType: string, \n element: Element, \n position?: { x: number; y: number }\n ): void {\n const dataTValue = element.getAttribute('data-t');\n if (!dataTValue) return;\n\n const elementContext = this.getElementContext(element, position);\n const pageContext = this.getPageContext();\n\n const trackEvent: TrackEvent = {\n eventType: `data_t_${eventType}`,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n pageContext,\n elementContext,\n metadata: {\n data_t: dataTValue,\n event_type: eventType\n }\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n}","import { Transport } from './transport';\n\ninterface FlagCacheEntry {\n value: any;\n fetchedAt: number;\n}\n\nexport class FeatureFlagClient {\n private transport: Transport;\n private appId: string;\n private profileId: string | null = null;\n private flagCache = new Map<string, FlagCacheEntry>();\n private cacheTimeoutMs = 5 * 60 * 1000; // 5 minutes\n private eventSource: EventSource | null = null;\n private debug: boolean;\n\n constructor(transport: Transport, appId: string, debug: boolean = false) {\n this.transport = transport;\n this.appId = appId;\n this.debug = debug;\n }\n\n public setProfileId(profileId: string): void {\n this.profileId = profileId;\n // Clear cache when profile changes\n this.flagCache.clear();\n }\n\n public async fetchFlags(): Promise<void> {\n try {\n const flags = await this.transport.fetchFlags(this.appId, this.profileId || undefined);\n const now = Date.now();\n\n // Update cache with all fetched flags\n for (const [key, value] of Object.entries(flags)) {\n this.flagCache.set(key, {\n value,\n fetchedAt: now\n });\n }\n\n if (this.debug) {\n console.log('[ExperienceSDK] Flags fetched:', flags);\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to fetch flags:', error);\n }\n // Don't throw - return cached values or defaults\n }\n }\n\n public getFlag<T>(key: string, defaultValue: T): T {\n const cached = this.flagCache.get(key);\n \n // Check if cached value is still valid\n if (cached && Date.now() - cached.fetchedAt < this.cacheTimeoutMs) {\n if (this.debug) {\n console.log(`[ExperienceSDK] Flag '${key}' from cache:`, cached.value);\n }\n return this.convertValue(cached.value, defaultValue, key);\n }\n\n // Cache miss or expired - fetch in background if possible\n this.fetchFlagsInBackground();\n\n if (this.debug) {\n console.log(`[ExperienceSDK] Flag '${key}' not in cache, returning default:`, defaultValue);\n }\n \n return defaultValue;\n }\n\n public getFlagSync<T>(key: string, defaultValue: T): T {\n const cached = this.flagCache.get(key);\n \n if (cached) {\n return this.convertValue(cached.value, defaultValue, key);\n }\n \n return defaultValue;\n }\n\n private convertValue<T>(value: any, defaultValue: T, key?: string): T {\n try {\n // If types match, return as-is\n if (typeof value === typeof defaultValue) {\n return value as T;\n }\n\n // Handle boolean conversion\n if (typeof defaultValue === 'boolean') {\n if (typeof value === 'string') {\n return (value.toLowerCase() === 'true' || value === '1') as T;\n }\n return Boolean(value) as T;\n }\n\n // Handle number conversion\n if (typeof defaultValue === 'number') {\n const num = Number(value);\n return (isNaN(num) ? defaultValue : num) as T;\n }\n\n // Handle string conversion\n if (typeof defaultValue === 'string') {\n return String(value) as T;\n }\n\n // Handle object/array - try to parse if string\n if (typeof defaultValue === 'object' && typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n }\n\n return value as T;\n } catch (error) {\n if (this.debug) {\n console.warn(`[ExperienceSDK] Failed to convert flag value for '${key}':`, error);\n }\n return defaultValue;\n }\n }\n\n private fetchFlagsInBackground(): void {\n // Avoid multiple concurrent fetches\n if (this._backgroundFetchInProgress) {\n return;\n }\n\n this._backgroundFetchInProgress = true;\n \n this.fetchFlags().finally(() => {\n this._backgroundFetchInProgress = false;\n });\n }\n\n private _backgroundFetchInProgress = false;\n\n // Initialize with immediate fetch\n public async initialize(): Promise<void> {\n await this.fetchFlags();\n }\n\n // Set up real-time flag updates via Server-Sent Events\n public setupRealtimeUpdates(endpoint?: string): void {\n if (typeof EventSource === 'undefined') {\n if (this.debug) {\n console.warn('[ExperienceSDK] EventSource not supported, real-time flag updates disabled');\n }\n return;\n }\n\n // Close existing connection\n this.closeRealtimeUpdates();\n\n const baseEndpoint = endpoint || this.transport['config'].endpoint;\n const streamUrl = `${baseEndpoint}/api/v1/flags/${this.appId}/resolve/stream`;\n \n const url = new URL(streamUrl);\n if (this.profileId) {\n url.searchParams.set('profileId', this.profileId);\n }\n\n try {\n this.eventSource = new EventSource(url.toString());\n\n this.eventSource.onopen = () => {\n if (this.debug) {\n console.log('[ExperienceSDK] Real-time flag updates connected');\n }\n };\n\n this.eventSource.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n \n if (data.flags) {\n const now = Date.now();\n \n // Update cache with new flag values\n for (const [key, value] of Object.entries(data.flags)) {\n this.flagCache.set(key, {\n value,\n fetchedAt: now\n });\n }\n\n if (this.debug) {\n console.log('[ExperienceSDK] Flag updates received:', data.flags);\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to parse flag update:', error);\n }\n }\n };\n\n this.eventSource.onerror = (error) => {\n if (this.debug) {\n console.error('[ExperienceSDK] Real-time flag updates error:', error);\n }\n \n // Auto-reconnect logic\n setTimeout(() => {\n if (this.eventSource?.readyState === EventSource.CLOSED) {\n this.setupRealtimeUpdates(endpoint);\n }\n }, 5000);\n };\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to setup real-time flag updates:', error);\n }\n }\n }\n\n public closeRealtimeUpdates(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n \n if (this.debug) {\n console.log('[ExperienceSDK] Real-time flag updates disconnected');\n }\n }\n }\n\n // Clear all cached flags\n public clearCache(): void {\n this.flagCache.clear();\n \n if (this.debug) {\n console.log('[ExperienceSDK] Flag cache cleared');\n }\n }\n\n // Get cache status for debugging\n public getCacheInfo(): {\n size: number;\n keys: string[];\n oldestEntry?: { key: string; age: number };\n newestEntry?: { key: string; age: number };\n } {\n const keys = Array.from(this.flagCache.keys());\n const now = Date.now();\n \n let oldestEntry: { key: string; age: number } | undefined;\n let newestEntry: { key: string; age: number } | undefined;\n\n for (const [cacheKey, entry] of this.flagCache.entries()) {\n const age = now - entry.fetchedAt;\n \n if (!oldestEntry || age > oldestEntry.age) {\n oldestEntry = { key: cacheKey, age };\n }\n \n if (!newestEntry || age < newestEntry.age) {\n newestEntry = { key: cacheKey, age };\n }\n }\n\n return {\n size: this.flagCache.size,\n keys,\n oldestEntry,\n newestEntry\n };\n }\n\n // Check if a flag exists in cache\n public hasCachedFlag(key: string): boolean {\n return this.flagCache.has(key);\n }\n\n // Get all cached flags (for debugging)\n public getAllCachedFlags(): Record<string, any> {\n const result: Record<string, any> = {};\n \n for (const [key, entry] of this.flagCache.entries()) {\n result[key] = entry.value;\n }\n \n return result;\n }\n\n // Preload specific flags\n public async preloadFlags(keys: string[]): Promise<void> {\n const missing = keys.filter(key => !this.hasCachedFlag(key));\n \n if (missing.length > 0) {\n await this.fetchFlags();\n }\n }\n\n public shutdown(): void {\n this.closeRealtimeUpdates();\n this.flagCache.clear();\n }\n}","import { EventBatch, ErrorBatch, UnsubscribeFn } from './types';\nimport { Transport } from './transport';\n\nconst DB_NAME = 'ExperienceSDKOffline';\nconst DB_VERSION = 1;\nconst EVENTS_STORE = 'events';\nconst ERRORS_STORE = 'errors';\nconst MAX_OFFLINE_ITEMS = 1000;\n\ninterface StoredBatch {\n id: string;\n timestamp: number;\n type: 'events' | 'errors';\n data: EventBatch | ErrorBatch;\n retryCount: number;\n}\n\nexport class OfflineQueue {\n private transport: Transport;\n private db: IDBDatabase | null = null;\n private debug: boolean;\n private isInitialized = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private isProcessing = false;\n\n constructor(transport: Transport, debug: boolean = false) {\n this.transport = transport;\n this.debug = debug;\n \n this.initialize();\n this.setupOnlineListener();\n }\n\n private async initialize(): Promise<void> {\n if (typeof indexedDB === 'undefined') {\n if (this.debug) {\n console.warn('[ExperienceSDK] IndexedDB not available, offline queue disabled');\n }\n return;\n }\n\n try {\n this.db = await this.openDatabase();\n this.isInitialized = true;\n \n if (this.debug) {\n console.log('[ExperienceSDK] Offline queue initialized');\n }\n \n // Process any stored items\n this.processStoredItems();\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to initialize offline queue:', error);\n }\n }\n }\n\n private openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n \n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n \n // Create events store\n if (!db.objectStoreNames.contains(EVENTS_STORE)) {\n const eventsStore = db.createObjectStore(EVENTS_STORE, { keyPath: 'id' });\n eventsStore.createIndex('timestamp', 'timestamp');\n eventsStore.createIndex('type', 'type');\n }\n \n // Create errors store \n if (!db.objectStoreNames.contains(ERRORS_STORE)) {\n const errorsStore = db.createObjectStore(ERRORS_STORE, { keyPath: 'id' });\n errorsStore.createIndex('timestamp', 'timestamp');\n errorsStore.createIndex('type', 'type');\n }\n };\n });\n }\n\n private setupOnlineListener(): void {\n if (typeof window === 'undefined') return;\n\n const handleOnline = () => {\n if (this.debug) {\n console.log('[ExperienceSDK] Network online, processing offline queue');\n }\n this.processStoredItems();\n };\n\n window.addEventListener('online', handleOnline);\n this.unsubscribeFns.push(() => \n window.removeEventListener('online', handleOnline)\n );\n }\n\n private generateId(): string {\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n public async storeEventBatch(batch: EventBatch): Promise<void> {\n if (!this.isInitialized || !this.db) return;\n\n const storedBatch: StoredBatch = {\n id: this.generateId(),\n timestamp: Date.now(),\n type: 'events',\n data: batch,\n retryCount: 0\n };\n\n try {\n await this.storeItem(EVENTS_STORE, storedBatch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Event batch stored offline:', storedBatch.id);\n }\n \n // Maintain max items limit\n this.cleanupOldItems(EVENTS_STORE);\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to store event batch offline:', error);\n }\n }\n }\n\n public async storeErrorBatch(batch: ErrorBatch): Promise<void> {\n if (!this.isInitialized || !this.db) return;\n\n const storedBatch: StoredBatch = {\n id: this.generateId(),\n timestamp: Date.now(),\n type: 'errors',\n data: batch,\n retryCount: 0\n };\n\n try {\n await this.storeItem(ERRORS_STORE, storedBatch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Error batch stored offline:', storedBatch.id);\n }\n \n // Maintain max items limit\n this.cleanupOldItems(ERRORS_STORE);\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to store error batch offline:', error);\n }\n }\n }\n\n private storeItem(storeName: string, item: StoredBatch): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n reject(new Error('Database not initialized'));\n return;\n }\n\n const transaction = this.db.transaction([storeName], 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.put(item);\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n\n private async cleanupOldItems(storeName: string): Promise<void> {\n if (!this.db) return;\n\n try {\n const items = await this.getAllItems(storeName);\n \n if (items.length > MAX_OFFLINE_ITEMS) {\n // Sort by timestamp and remove oldest items\n const itemsToRemove = items\n .sort((a, b) => a.timestamp - b.timestamp)\n .slice(0, items.length - MAX_OFFLINE_ITEMS);\n \n await Promise.all(\n itemsToRemove.map(item => this.removeItem(storeName, item.id))\n );\n \n if (this.debug) {\n console.log(`[ExperienceSDK] Cleaned up ${itemsToRemove.length} old offline items`);\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to cleanup old items:', error);\n }\n }\n }\n\n private getAllItems(storeName: string): Promise<StoredBatch[]> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n reject(new Error('Database not initialized'));\n return;\n }\n\n const transaction = this.db.transaction([storeName], 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n });\n }\n\n private removeItem(storeName: string, id: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n reject(new Error('Database not initialized'));\n return;\n }\n\n const transaction = this.db.transaction([storeName], 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.delete(id);\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n\n public async processStoredItems(): Promise<void> {\n if (!this.isInitialized || !this.db || this.isProcessing) return;\n \n // Check if we're online\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n if (this.debug) {\n console.log('[ExperienceSDK] Still offline, skipping queue processing');\n }\n return;\n }\n\n this.isProcessing = true;\n\n try {\n // Process events\n await this.processStoreItems(EVENTS_STORE);\n \n // Process errors\n await this.processStoreItems(ERRORS_STORE);\n } finally {\n this.isProcessing = false;\n }\n }\n\n private async processStoreItems(storeName: string): Promise<void> {\n try {\n const items = await this.getAllItems(storeName);\n \n if (items.length === 0) return;\n\n if (this.debug) {\n console.log(`[ExperienceSDK] Processing ${items.length} offline ${storeName}`);\n }\n\n // Sort by timestamp (oldest first)\n items.sort((a, b) => a.timestamp - b.timestamp);\n\n for (const item of items) {\n try {\n let success = false;\n\n if (storeName === EVENTS_STORE && item.type === 'events') {\n const result = await this.transport.sendEventBatch(item.data as EventBatch);\n success = result.success !== false;\n } else if (storeName === ERRORS_STORE && item.type === 'errors') {\n const result = await this.transport.sendErrorBatch(item.data as ErrorBatch);\n success = result.success !== false;\n }\n\n if (success) {\n // Remove successfully sent item\n await this.removeItem(storeName, item.id);\n \n if (this.debug) {\n console.log(`[ExperienceSDK] Offline ${item.type} sent successfully:`, item.id);\n }\n } else {\n throw new Error('Send failed');\n }\n } catch (error) {\n if (this.debug) {\n console.error(`[ExperienceSDK] Failed to send offline ${item.type}:`, error);\n }\n\n // Increment retry count\n item.retryCount++;\n \n // Remove after too many retries (to prevent infinite growth)\n if (item.retryCount >= 3) {\n await this.removeItem(storeName, item.id);\n \n if (this.debug) {\n console.log(`[ExperienceSDK] Removing ${item.type} after ${item.retryCount} retries:`, item.id);\n }\n } else {\n // Update retry count in storage\n await this.storeItem(storeName, item);\n }\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error(`[ExperienceSDK] Failed to process offline ${storeName}:`, error);\n }\n }\n }\n\n // Get queue status for debugging\n public async getQueueStatus(): Promise<{\n events: number;\n errors: number;\n isOnline: boolean;\n isInitialized: boolean;\n }> {\n let eventCount = 0;\n let errorCount = 0;\n\n if (this.isInitialized && this.db) {\n try {\n const events = await this.getAllItems(EVENTS_STORE);\n const errors = await this.getAllItems(ERRORS_STORE);\n \n eventCount = events.length;\n errorCount = errors.length;\n } catch (error) {\n // Ignore errors for status check\n }\n }\n\n return {\n events: eventCount,\n errors: errorCount,\n isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n isInitialized: this.isInitialized\n };\n }\n\n // Clear all offline data\n public async clear(): Promise<void> {\n if (!this.isInitialized || !this.db) return;\n\n try {\n const transaction = this.db.transaction([EVENTS_STORE, ERRORS_STORE], 'readwrite');\n \n await Promise.all([\n new Promise<void>((resolve, reject) => {\n const request = transaction.objectStore(EVENTS_STORE).clear();\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n }),\n new Promise<void>((resolve, reject) => {\n const request = transaction.objectStore(ERRORS_STORE).clear();\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n })\n ]);\n\n if (this.debug) {\n console.log('[ExperienceSDK] Offline queue cleared');\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to clear offline queue:', error);\n }\n }\n }\n\n public shutdown(): void {\n // Clean up listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n // Close database\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n\n this.isInitialized = false;\n }\n}","import {\n ExperienceConfig,\n ResolvedExperienceConfig,\n TrackEvent,\n PageContext,\n ElementContext,\n Severity\n} from './types';\nimport { SessionManager } from './session';\nimport { Transport } from './transport';\nimport { EventBatcher } from './batch';\nimport { BreadcrumbManager } from './breadcrumbs';\nimport { HeatmapTracker } from './heatmap';\nimport { ErrorCapture } from './errors';\nimport { AutoTracker } from './auto-track';\nimport { DataTTracker } from './data-t';\nimport { FeatureFlagClient } from './flags';\nimport { OfflineQueue } from './offline';\n\nexport class Experience {\n private static instance: Experience | null = null;\n \n private config: ResolvedExperienceConfig;\n private sessionManager: SessionManager;\n private transport: Transport;\n private batcher: EventBatcher;\n private breadcrumbManager: BreadcrumbManager;\n private heatmapTracker: HeatmapTracker;\n private errorCapture: ErrorCapture;\n private autoTracker: AutoTracker;\n private dataTTracker: DataTTracker;\n private flagClient: FeatureFlagClient;\n private offlineQueue: OfflineQueue;\n private isShutdown = false;\n private isInSample = true;\n\n private constructor(config: ExperienceConfig) {\n this.config = this.resolveConfig(config);\n \n // Check sample rate at session level\n this.isInSample = Math.random() < this.config.sampleRate;\n \n if (this.config.debug) {\n console.log('[ExperienceSDK] Initializing with config:', this.config);\n console.log('[ExperienceSDK] In sample:', this.isInSample);\n }\n\n // Initialize core components\n this.sessionManager = new SessionManager();\n this.transport = new Transport({\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n debug: this.config.debug\n });\n this.batcher = new EventBatcher(\n this.transport,\n this.config.batchIntervalMs,\n this.config.maxBatchSize,\n this.config.debug\n );\n \n // Initialize optional components\n this.breadcrumbManager = new BreadcrumbManager();\n this.heatmapTracker = new HeatmapTracker(this.batcher, this.sessionManager.getSessionId());\n this.errorCapture = new ErrorCapture(this.batcher, this.breadcrumbManager, this.sessionManager.getSessionId());\n this.autoTracker = new AutoTracker(this.batcher, this.sessionManager.getSessionId());\n this.dataTTracker = new DataTTracker(this.batcher, this.sessionManager.getSessionId());\n this.flagClient = new FeatureFlagClient(this.transport, this.config.appId, this.config.debug);\n this.offlineQueue = new OfflineQueue(this.transport, this.config.debug);\n\n this.setupFailureHandling();\n this.enableFeatures();\n }\n\n private resolveConfig(config: ExperienceConfig): ResolvedExperienceConfig {\n return {\n appId: config.appId,\n apiKey: config.apiKey,\n endpoint: config.endpoint || 'https://experience.shellapps.com',\n enableTracking: config.enableTracking ?? true,\n enableErrorCapture: config.enableErrorCapture ?? true,\n enableHeatmaps: config.enableHeatmaps ?? false,\n enableBreadcrumbs: config.enableBreadcrumbs ?? true,\n sampleRate: Math.max(0, Math.min(1, config.sampleRate ?? 1.0)),\n batchIntervalMs: config.batchIntervalMs ?? 2000,\n maxBatchSize: config.maxBatchSize ?? 50,\n debug: config.debug ?? false\n };\n }\n\n private setupFailureHandling(): void {\n // Hook into the batcher to handle failures with offline queue\n const originalSendEventBatch = this.transport.sendEventBatch.bind(this.transport);\n const originalSendErrorBatch = this.transport.sendErrorBatch.bind(this.transport);\n\n this.transport.sendEventBatch = async (batch) => {\n try {\n return await originalSendEventBatch(batch);\n } catch (error) {\n // Store in offline queue on failure\n await this.offlineQueue.storeEventBatch(batch);\n throw error;\n }\n };\n\n this.transport.sendErrorBatch = async (batch) => {\n try {\n return await originalSendErrorBatch(batch);\n } catch (error) {\n // Store in offline queue on failure\n await this.offlineQueue.storeErrorBatch(batch);\n throw error;\n }\n };\n }\n\n private enableFeatures(): void {\n if (!this.isInSample) {\n if (this.config.debug) {\n console.log('[ExperienceSDK] Not in sample, features disabled');\n }\n return;\n }\n\n if (this.config.enableBreadcrumbs) {\n this.breadcrumbManager.enable();\n }\n\n if (this.config.enableErrorCapture) {\n this.errorCapture.enable();\n }\n\n if (this.config.enableTracking) {\n this.autoTracker.enable();\n this.dataTTracker.enable();\n }\n\n if (this.config.enableHeatmaps) {\n this.heatmapTracker.enable();\n }\n\n // Initialize flags\n this.flagClient.initialize().catch(error => {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Failed to initialize flags:', error);\n }\n });\n }\n\n // Public API\n public track(eventType: string, metadata?: Record<string, string>): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableTracking) return;\n\n const pageContext = this.getCurrentPageContext();\n\n const trackEvent: TrackEvent = {\n eventType,\n sessionId: this.sessionManager.getSessionId(),\n timestamp: Date.now(),\n metadata,\n pageContext\n };\n\n this.batcher.addTrackEvent(trackEvent);\n\n if (this.config.debug) {\n console.log('[ExperienceSDK] Event tracked:', trackEvent);\n }\n }\n\n public trackPageView(): void {\n this.autoTracker.trackCurrentPage();\n }\n\n public captureError(error: Error, options?: {\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n severity?: Severity;\n }): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableErrorCapture) return;\n\n this.errorCapture.captureException(error, options);\n }\n\n public captureMessage(message: string, severity?: string): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableErrorCapture) return;\n\n const sev = severity ? ErrorCapture.getSeverityFromString(severity) : Severity.INFO;\n this.errorCapture.captureMessage(message, sev);\n }\n\n public getFlag<T>(key: string, defaultValue: T): T {\n if (this.isShutdown) return defaultValue;\n \n return this.flagClient.getFlag(key, defaultValue);\n }\n\n public identify(profileId: string): void {\n if (this.isShutdown) return;\n\n this.flagClient.setProfileId(profileId);\n \n if (this.config.debug) {\n console.log('[ExperienceSDK] Profile identified:', profileId);\n }\n }\n\n public async shutdown(): Promise<void> {\n if (this.isShutdown) return;\n this.isShutdown = true;\n\n if (this.config.debug) {\n console.log('[ExperienceSDK] Shutting down...');\n }\n\n // Disable all features\n this.breadcrumbManager.disable();\n this.errorCapture.disable();\n this.heatmapTracker.disable();\n this.autoTracker.disable();\n this.dataTTracker.disable();\n\n // Final flush and cleanup\n await Promise.all([\n this.batcher.shutdown(),\n this.flagClient.shutdown(),\n this.offlineQueue.shutdown()\n ]);\n\n if (this.config.debug) {\n console.log('[ExperienceSDK] Shutdown complete');\n }\n }\n\n // Utility methods\n private getCurrentPageContext(): PageContext {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return {\n url: 'unknown',\n title: 'unknown',\n referrer: '',\n viewport: { width: 1920, height: 1080 }\n };\n }\n\n return {\n url: window.location.href,\n title: document.title || '',\n referrer: document.referrer || '',\n viewport: {\n width: window.innerWidth || 1920,\n height: window.innerHeight || 1080\n }\n };\n }\n\n // Debug methods\n public getSessionInfo(): {\n sessionId: string;\n duration: number;\n isInSample: boolean;\n } {\n return {\n sessionId: this.sessionManager.getSessionId(),\n duration: this.sessionManager.getSessionDuration(),\n isInSample: this.isInSample\n };\n }\n\n public async getQueueStatus(): Promise<{\n pendingEvents: number;\n pendingErrors: number;\n offlineQueue: {\n events: number;\n errors: number;\n isOnline: boolean;\n isInitialized: boolean;\n };\n }> {\n const offlineStatus = await this.offlineQueue.getQueueStatus();\n \n return {\n pendingEvents: this.batcher.getPendingEventCount(),\n pendingErrors: this.batcher.getPendingErrorCount(),\n offlineQueue: offlineStatus\n };\n }\n\n public getBreadcrumbs() {\n return this.breadcrumbManager.getBreadcrumbs();\n }\n\n public getFlagCacheInfo() {\n return this.flagClient.getCacheInfo();\n }\n\n // Manual flush for testing\n public async flush(): Promise<void> {\n if (this.isShutdown) return;\n \n await this.batcher.forceFlush();\n await this.offlineQueue.processStoredItems();\n }\n\n // Static factory method (singleton pattern)\n public static init(config: ExperienceConfig): Experience {\n if (Experience.instance) {\n if (config.debug) {\n console.warn('[ExperienceSDK] Already initialized, returning existing instance');\n }\n return Experience.instance;\n }\n\n Experience.instance = new Experience(config);\n return Experience.instance;\n }\n\n public static getInstance(): Experience | null {\n return Experience.instance;\n }\n\n // Advanced tracking methods\n public trackElement(element: Element, eventType: string): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableTracking) return;\n\n const elementContext: ElementContext = {\n selector: this.getElementSelector(element),\n tag: element.tagName.toLowerCase(),\n dataT: element.getAttribute('data-t') || undefined\n };\n\n const trackEvent: TrackEvent = {\n eventType,\n sessionId: this.sessionManager.getSessionId(),\n timestamp: Date.now(),\n pageContext: this.getCurrentPageContext(),\n elementContext\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n private getElementSelector(element: Element): string {\n try {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className && typeof element.className === 'string'\n ? `.${element.className.split(' ').filter(c => c.trim()).join('.')}`\n : '';\n \n return `${tag}${id}${className}`.slice(0, 100);\n } catch {\n return element.tagName?.toLowerCase() || 'unknown';\n }\n }\n}"],"mappings":"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","names":["Severity","HOVER_THRESHOLD_MS"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/session.ts","../src/proto/schemas.ts","../src/proto/encode.ts","../src/transport.ts","../src/batch.ts","../src/breadcrumbs.ts","../src/heatmap.ts","../src/errors.ts","../src/auto-track.ts","../src/data-t.ts","../src/flags.ts","../src/offline.ts","../src/experience.ts"],"sourcesContent":["// Main export\nexport { Experience } from './experience';\n\n// Type exports\nexport type {\n ExperienceConfig,\n ResolvedExperienceConfig,\n TrackEvent,\n PageContext,\n ElementContext,\n HeatmapEvent,\n EventBatch,\n IngestResponse,\n ErrorEvent,\n Breadcrumb,\n BrowserContext,\n ErrorBatch,\n Session,\n FeatureFlag,\n FlagResponse,\n TransportConfig,\n EventHandler,\n UnsubscribeFn\n} from './types';\n\nexport { Severity } from './types';\n\n// For advanced usage, export individual classes\nexport { SessionManager } from './session';\nexport { Transport } from './transport';\nexport { EventBatcher } from './batch';\nexport { BreadcrumbManager } from './breadcrumbs';\nexport { HeatmapTracker } from './heatmap';\nexport { ErrorCapture } from './errors';\nexport { AutoTracker } from './auto-track';\nexport { DataTTracker } from './data-t';\nexport { FeatureFlagClient } from './flags';\nexport { OfflineQueue } from './offline';\n\n// Protobuf exports for advanced usage\nexport { ProtobufEncoder } from './proto/encode';\nexport * as ProtoSchemas from './proto/schemas';","// Core configuration types\nexport interface ExperienceConfig {\n appId: string;\n apiKey: string;\n endpoint?: string;\n enableTracking?: boolean;\n enableErrorCapture?: boolean;\n enableHeatmaps?: boolean;\n enableBreadcrumbs?: boolean;\n sampleRate?: number;\n batchIntervalMs?: number;\n maxBatchSize?: number;\n debug?: boolean;\n /** Force JSON transport instead of protobuf. Recommended until protobuf is stable. */\n transport?: 'protobuf' | 'json';\n}\n\n// Event types\nexport interface TrackEvent {\n eventType: string;\n sessionId: string;\n timestamp: number;\n metadata?: Record<string, string>;\n pageContext?: PageContext;\n elementContext?: ElementContext;\n}\n\nexport interface PageContext {\n url: string;\n title: string;\n referrer: string;\n viewport: {\n width: number;\n height: number;\n };\n loadTime?: number;\n}\n\nexport interface ElementContext {\n selector: string;\n dataT?: string;\n tag: string;\n position?: {\n x: number;\n y: number;\n };\n}\n\nexport interface HeatmapEvent {\n sessionId: string;\n timestamp: number;\n type: 'click' | 'move' | 'hover';\n x: number;\n y: number;\n viewportWidth: number;\n viewportHeight: number;\n url: string;\n}\n\nexport interface EventBatch {\n events: TrackEvent[];\n heatmapEvents: HeatmapEvent[];\n}\n\nexport interface IngestResponse {\n success: boolean;\n message?: string;\n}\n\n// Error types\nexport interface ErrorEvent {\n sessionId: string;\n timestamp: number;\n message: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n stack?: string;\n severity: Severity;\n breadcrumbs: Breadcrumb[];\n browserContext: BrowserContext;\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n}\n\nexport enum Severity {\n INFO = 0,\n WARNING = 1,\n ERROR = 2,\n FATAL = 3\n}\n\nexport interface Breadcrumb {\n timestamp: number;\n category: 'navigation' | 'click' | 'console' | 'fetch' | 'xhr' | 'ui';\n message: string;\n data?: Record<string, any>;\n level?: 'info' | 'warning' | 'error';\n}\n\nexport interface BrowserContext {\n userAgent: string;\n url: string;\n timestamp: number;\n viewport: {\n width: number;\n height: number;\n };\n}\n\nexport interface ErrorBatch {\n errors: ErrorEvent[];\n}\n\n// Session types\nexport interface Session {\n id: string;\n startTime: number;\n getDuration(): number;\n}\n\n// Flag types\nexport interface FeatureFlag {\n key: string;\n value: any;\n type: 'boolean' | 'string' | 'number' | 'json';\n}\n\nexport interface FlagResponse {\n flags: Record<string, any>;\n}\n\n// Transport types\nexport interface TransportConfig {\n endpoint: string;\n apiKey: string;\n debug: boolean;\n useJSON?: boolean;\n}\n\n// Utility types\nexport type EventHandler = (event: Event) => void;\nexport type UnsubscribeFn = () => void;\n\n// Configuration with defaults applied\nexport interface ResolvedExperienceConfig {\n appId: string;\n apiKey: string;\n endpoint: string;\n enableTracking: boolean;\n enableErrorCapture: boolean;\n enableHeatmaps: boolean;\n enableBreadcrumbs: boolean;\n sampleRate: number;\n batchIntervalMs: number;\n maxBatchSize: number;\n debug: boolean;\n transport: 'protobuf' | 'json';\n}","import { Session } from './types';\n\nconst SESSION_STORAGE_KEY = 'shellapps_experience_session';\n\nexport class SessionManager {\n private session: Session | null = null;\n\n constructor() {\n this.initializeSession();\n }\n\n private generateUUID(): string {\n // Use crypto.randomUUID if available, fallback to Math.random\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n \n // Fallback UUID v4 generation using Math.random\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n private initializeSession(): void {\n // Try to restore session from sessionStorage\n if (typeof sessionStorage !== 'undefined') {\n try {\n const storedSession = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (storedSession) {\n const parsed = JSON.parse(storedSession);\n this.session = {\n id: parsed.id,\n startTime: parsed.startTime,\n getDuration: () => Date.now() - parsed.startTime\n };\n return;\n }\n } catch (error) {\n // Ignore parsing errors and create a new session\n }\n }\n\n // Create a new session\n this.createNewSession();\n }\n\n private createNewSession(): void {\n const startTime = Date.now();\n const sessionId = this.generateUUID();\n \n this.session = {\n id: sessionId,\n startTime,\n getDuration: () => Date.now() - startTime\n };\n\n // Store in sessionStorage if available\n if (typeof sessionStorage !== 'undefined') {\n try {\n sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify({\n id: sessionId,\n startTime\n }));\n } catch (error) {\n // Ignore storage errors\n }\n }\n }\n\n public getCurrentSession(): Session {\n if (!this.session) {\n this.createNewSession();\n }\n return this.session!;\n }\n\n public getSessionId(): string {\n return this.getCurrentSession().id;\n }\n\n public getSessionDuration(): number {\n return this.getCurrentSession().getDuration();\n }\n\n public renewSession(): void {\n this.createNewSession();\n }\n}","// Protobuf schema definitions matching the proto files\n\n// TrackEvent schema\nexport const TrackEventSchema = {\n eventType: 1,\n sessionId: 2,\n timestamp: 3,\n metadata: 4,\n pageContext: 5,\n elementContext: 6\n};\n\n// PageContext schema\nexport const PageContextSchema = {\n url: 1,\n title: 2,\n referrer: 3,\n viewport: 4,\n loadTime: 5\n};\n\n// Viewport schema\nexport const ViewportSchema = {\n width: 1,\n height: 2\n};\n\n// ElementContext schema\nexport const ElementContextSchema = {\n selector: 1,\n dataT: 2,\n tag: 3,\n position: 4\n};\n\n// Position schema\nexport const PositionSchema = {\n x: 1,\n y: 2\n};\n\n// HeatmapEvent schema\nexport const HeatmapEventSchema = {\n sessionId: 1,\n timestamp: 2,\n type: 3,\n x: 4,\n y: 5,\n viewportWidth: 6,\n viewportHeight: 7,\n url: 8\n};\n\n// EventBatch schema\nexport const EventBatchSchema = {\n events: 1,\n heatmapEvents: 2\n};\n\n// IngestResponse schema\nexport const IngestResponseSchema = {\n success: 1,\n message: 2\n};\n\n// ErrorEvent schema\nexport const ErrorEventSchema = {\n sessionId: 1,\n timestamp: 2,\n message: 3,\n filename: 4,\n lineno: 5,\n colno: 6,\n stack: 7,\n severity: 8,\n breadcrumbs: 9,\n browserContext: 10,\n tags: 11,\n extra: 12\n};\n\n// Breadcrumb schema\nexport const BreadcrumbSchema = {\n timestamp: 1,\n category: 2,\n message: 3,\n data: 4,\n level: 5\n};\n\n// BrowserContext schema\nexport const BrowserContextSchema = {\n userAgent: 1,\n url: 2,\n timestamp: 3,\n viewport: 4\n};\n\n// ErrorBatch schema\nexport const ErrorBatchSchema = {\n errors: 1\n};\n\n// Wire types for protobuf\nexport const WireType = {\n VARINT: 0,\n FIXED64: 1,\n LENGTH_DELIMITED: 2,\n START_GROUP: 3,\n END_GROUP: 4,\n FIXED32: 5\n};\n\n// Severity enum values\nexport const SeverityEnum = {\n INFO: 0,\n WARNING: 1,\n ERROR: 2,\n FATAL: 3\n};\n\n// HeatmapEvent type enum values\nexport const HeatmapTypeEnum = {\n click: 0,\n move: 1,\n hover: 2\n};\n\n// Breadcrumb category enum values\nexport const BreadcrumbCategoryEnum = {\n navigation: 0,\n click: 1,\n console: 2,\n fetch: 3,\n xhr: 4,\n ui: 5\n};\n\n// Breadcrumb level enum values\nexport const BreadcrumbLevelEnum = {\n info: 0,\n warning: 1,\n error: 2\n};","import {\n WireType,\n TrackEventSchema,\n PageContextSchema,\n ViewportSchema,\n ElementContextSchema,\n PositionSchema,\n HeatmapEventSchema,\n EventBatchSchema,\n ErrorEventSchema,\n BreadcrumbSchema,\n BrowserContextSchema,\n ErrorBatchSchema,\n SeverityEnum,\n HeatmapTypeEnum,\n BreadcrumbCategoryEnum,\n BreadcrumbLevelEnum\n} from './schemas';\nimport {\n TrackEvent,\n HeatmapEvent,\n EventBatch,\n ErrorEvent,\n ErrorBatch,\n Breadcrumb,\n BrowserContext,\n PageContext,\n ElementContext,\n Severity\n} from '../types';\n\nexport class ProtobufEncoder {\n private buffer: number[] = [];\n\n // Helper methods for encoding\n private encodeVarint(value: number): void {\n while (value >= 128) {\n this.buffer.push((value & 0x7F) | 0x80);\n value >>>= 7;\n }\n this.buffer.push(value & 0x7F);\n }\n\n private encodeTag(fieldNumber: number, wireType: number): void {\n this.encodeVarint((fieldNumber << 3) | wireType);\n }\n\n private encodeString(value: string): void {\n const utf8Bytes = new TextEncoder().encode(value);\n this.encodeVarint(utf8Bytes.length);\n this.buffer.push(...utf8Bytes);\n }\n\n private encodeUint64(value: number): void {\n // For JavaScript numbers, we'll encode as varint for simplicity\n this.encodeVarint(value);\n }\n\n private encodeUint32(value: number): void {\n this.encodeVarint(value);\n }\n\n private encodeBool(value: boolean): void {\n this.buffer.push(value ? 1 : 0);\n }\n\n private encodeMessage(encoder: () => void): Uint8Array {\n const startLength = this.buffer.length;\n encoder();\n const messageLength = this.buffer.length - startLength;\n \n // Create a new buffer with the length prefix\n const lengthBytes: number[] = [];\n let length = messageLength;\n while (length >= 128) {\n lengthBytes.push((length & 0x7F) | 0x80);\n length >>>= 7;\n }\n lengthBytes.push(length & 0x7F);\n \n // Insert length at the start\n this.buffer.splice(startLength, 0, ...lengthBytes);\n \n return new Uint8Array(this.buffer.slice(startLength + lengthBytes.length));\n }\n\n private encodeMapEntry(key: string, value: string): void {\n // Map entry is a nested message with key=1, value=2\n const entryEncoder = new ProtobufEncoder();\n entryEncoder.encodeTag(1, WireType.LENGTH_DELIMITED);\n entryEncoder.encodeString(key);\n entryEncoder.encodeTag(2, WireType.LENGTH_DELIMITED);\n entryEncoder.encodeString(value);\n \n this.encodeVarint(entryEncoder.buffer.length);\n this.buffer.push(...entryEncoder.buffer);\n }\n\n // Encode viewport\n private encodeViewport(viewport: { width: number; height: number }): void {\n if (viewport.width) {\n this.encodeTag(ViewportSchema.width, WireType.VARINT);\n this.encodeUint32(viewport.width);\n }\n if (viewport.height) {\n this.encodeTag(ViewportSchema.height, WireType.VARINT);\n this.encodeUint32(viewport.height);\n }\n }\n\n // Encode position\n private encodePosition(position: { x: number; y: number }): void {\n this.encodeTag(PositionSchema.x, WireType.VARINT);\n this.encodeUint32(position.x);\n this.encodeTag(PositionSchema.y, WireType.VARINT);\n this.encodeUint32(position.y);\n }\n\n // Encode PageContext\n private encodePageContext(pageContext: PageContext): void {\n this.encodeTag(PageContextSchema.url, WireType.LENGTH_DELIMITED);\n this.encodeString(pageContext.url);\n \n this.encodeTag(PageContextSchema.title, WireType.LENGTH_DELIMITED);\n this.encodeString(pageContext.title);\n \n this.encodeTag(PageContextSchema.referrer, WireType.LENGTH_DELIMITED);\n this.encodeString(pageContext.referrer);\n \n if (pageContext.viewport) {\n this.encodeTag(PageContextSchema.viewport, WireType.LENGTH_DELIMITED);\n const viewportEncoder = new ProtobufEncoder();\n viewportEncoder.encodeViewport(pageContext.viewport);\n this.encodeVarint(viewportEncoder.buffer.length);\n this.buffer.push(...viewportEncoder.buffer);\n }\n \n if (pageContext.loadTime) {\n this.encodeTag(PageContextSchema.loadTime, WireType.VARINT);\n this.encodeUint64(pageContext.loadTime);\n }\n }\n\n // Encode ElementContext\n private encodeElementContext(elementContext: ElementContext): void {\n this.encodeTag(ElementContextSchema.selector, WireType.LENGTH_DELIMITED);\n this.encodeString(elementContext.selector);\n \n if (elementContext.dataT) {\n this.encodeTag(ElementContextSchema.dataT, WireType.LENGTH_DELIMITED);\n this.encodeString(elementContext.dataT);\n }\n \n this.encodeTag(ElementContextSchema.tag, WireType.LENGTH_DELIMITED);\n this.encodeString(elementContext.tag);\n \n if (elementContext.position) {\n this.encodeTag(ElementContextSchema.position, WireType.LENGTH_DELIMITED);\n const positionEncoder = new ProtobufEncoder();\n positionEncoder.encodePosition(elementContext.position);\n this.encodeVarint(positionEncoder.buffer.length);\n this.buffer.push(...positionEncoder.buffer);\n }\n }\n\n // Encode TrackEvent\n private encodeTrackEvent(event: TrackEvent): void {\n this.encodeTag(TrackEventSchema.eventType, WireType.LENGTH_DELIMITED);\n this.encodeString(event.eventType);\n \n this.encodeTag(TrackEventSchema.sessionId, WireType.LENGTH_DELIMITED);\n this.encodeString(event.sessionId);\n \n this.encodeTag(TrackEventSchema.timestamp, WireType.VARINT);\n this.encodeUint64(event.timestamp);\n \n if (event.metadata) {\n for (const [key, value] of Object.entries(event.metadata)) {\n this.encodeTag(TrackEventSchema.metadata, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, value);\n }\n }\n \n if (event.pageContext) {\n this.encodeTag(TrackEventSchema.pageContext, WireType.LENGTH_DELIMITED);\n const pageContextEncoder = new ProtobufEncoder();\n pageContextEncoder.encodePageContext(event.pageContext);\n this.encodeVarint(pageContextEncoder.buffer.length);\n this.buffer.push(...pageContextEncoder.buffer);\n }\n \n if (event.elementContext) {\n this.encodeTag(TrackEventSchema.elementContext, WireType.LENGTH_DELIMITED);\n const elementContextEncoder = new ProtobufEncoder();\n elementContextEncoder.encodeElementContext(event.elementContext);\n this.encodeVarint(elementContextEncoder.buffer.length);\n this.buffer.push(...elementContextEncoder.buffer);\n }\n }\n\n // Encode HeatmapEvent\n private encodeHeatmapEvent(event: HeatmapEvent): void {\n this.encodeTag(HeatmapEventSchema.sessionId, WireType.LENGTH_DELIMITED);\n this.encodeString(event.sessionId);\n \n this.encodeTag(HeatmapEventSchema.timestamp, WireType.VARINT);\n this.encodeUint64(event.timestamp);\n \n this.encodeTag(HeatmapEventSchema.type, WireType.VARINT);\n this.encodeUint32(HeatmapTypeEnum[event.type]);\n \n this.encodeTag(HeatmapEventSchema.x, WireType.VARINT);\n this.encodeUint32(event.x);\n \n this.encodeTag(HeatmapEventSchema.y, WireType.VARINT);\n this.encodeUint32(event.y);\n \n this.encodeTag(HeatmapEventSchema.viewportWidth, WireType.VARINT);\n this.encodeUint32(event.viewportWidth);\n \n this.encodeTag(HeatmapEventSchema.viewportHeight, WireType.VARINT);\n this.encodeUint32(event.viewportHeight);\n \n this.encodeTag(HeatmapEventSchema.url, WireType.LENGTH_DELIMITED);\n this.encodeString(event.url);\n }\n\n // Encode Breadcrumb\n private encodeBreadcrumb(breadcrumb: Breadcrumb): void {\n this.encodeTag(BreadcrumbSchema.timestamp, WireType.VARINT);\n this.encodeUint64(breadcrumb.timestamp);\n \n this.encodeTag(BreadcrumbSchema.category, WireType.VARINT);\n this.encodeUint32(BreadcrumbCategoryEnum[breadcrumb.category]);\n \n this.encodeTag(BreadcrumbSchema.message, WireType.LENGTH_DELIMITED);\n this.encodeString(breadcrumb.message);\n \n if (breadcrumb.data) {\n for (const [key, value] of Object.entries(breadcrumb.data)) {\n this.encodeTag(BreadcrumbSchema.data, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, JSON.stringify(value));\n }\n }\n \n if (breadcrumb.level) {\n this.encodeTag(BreadcrumbSchema.level, WireType.VARINT);\n this.encodeUint32(BreadcrumbLevelEnum[breadcrumb.level]);\n }\n }\n\n // Encode BrowserContext\n private encodeBrowserContext(context: BrowserContext): void {\n this.encodeTag(BrowserContextSchema.userAgent, WireType.LENGTH_DELIMITED);\n this.encodeString(context.userAgent);\n \n this.encodeTag(BrowserContextSchema.url, WireType.LENGTH_DELIMITED);\n this.encodeString(context.url);\n \n this.encodeTag(BrowserContextSchema.timestamp, WireType.VARINT);\n this.encodeUint64(context.timestamp);\n \n this.encodeTag(BrowserContextSchema.viewport, WireType.LENGTH_DELIMITED);\n const viewportEncoder = new ProtobufEncoder();\n viewportEncoder.encodeViewport(context.viewport);\n this.encodeVarint(viewportEncoder.buffer.length);\n this.buffer.push(...viewportEncoder.buffer);\n }\n\n // Encode ErrorEvent\n private encodeErrorEvent(error: ErrorEvent): void {\n this.encodeTag(ErrorEventSchema.sessionId, WireType.LENGTH_DELIMITED);\n this.encodeString(error.sessionId);\n \n this.encodeTag(ErrorEventSchema.timestamp, WireType.VARINT);\n this.encodeUint64(error.timestamp);\n \n this.encodeTag(ErrorEventSchema.message, WireType.LENGTH_DELIMITED);\n this.encodeString(error.message);\n \n if (error.filename) {\n this.encodeTag(ErrorEventSchema.filename, WireType.LENGTH_DELIMITED);\n this.encodeString(error.filename);\n }\n \n if (error.lineno) {\n this.encodeTag(ErrorEventSchema.lineno, WireType.VARINT);\n this.encodeUint32(error.lineno);\n }\n \n if (error.colno) {\n this.encodeTag(ErrorEventSchema.colno, WireType.VARINT);\n this.encodeUint32(error.colno);\n }\n \n if (error.stack) {\n this.encodeTag(ErrorEventSchema.stack, WireType.LENGTH_DELIMITED);\n this.encodeString(error.stack);\n }\n \n this.encodeTag(ErrorEventSchema.severity, WireType.VARINT);\n this.encodeUint32(error.severity);\n \n // Encode breadcrumbs\n for (const breadcrumb of error.breadcrumbs) {\n this.encodeTag(ErrorEventSchema.breadcrumbs, WireType.LENGTH_DELIMITED);\n const breadcrumbEncoder = new ProtobufEncoder();\n breadcrumbEncoder.encodeBreadcrumb(breadcrumb);\n this.encodeVarint(breadcrumbEncoder.buffer.length);\n this.buffer.push(...breadcrumbEncoder.buffer);\n }\n \n // Encode browser context\n this.encodeTag(ErrorEventSchema.browserContext, WireType.LENGTH_DELIMITED);\n const browserContextEncoder = new ProtobufEncoder();\n browserContextEncoder.encodeBrowserContext(error.browserContext);\n this.encodeVarint(browserContextEncoder.buffer.length);\n this.buffer.push(...browserContextEncoder.buffer);\n \n if (error.tags) {\n for (const [key, value] of Object.entries(error.tags)) {\n this.encodeTag(ErrorEventSchema.tags, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, value);\n }\n }\n \n if (error.extra) {\n for (const [key, value] of Object.entries(error.extra)) {\n this.encodeTag(ErrorEventSchema.extra, WireType.LENGTH_DELIMITED);\n this.encodeMapEntry(key, JSON.stringify(value));\n }\n }\n }\n\n // Public encoding methods\n public encodeEventBatch(batch: EventBatch): Uint8Array {\n this.buffer = [];\n \n // Encode events\n for (const event of batch.events) {\n this.encodeTag(EventBatchSchema.events, WireType.LENGTH_DELIMITED);\n const eventEncoder = new ProtobufEncoder();\n eventEncoder.encodeTrackEvent(event);\n this.encodeVarint(eventEncoder.buffer.length);\n this.buffer.push(...eventEncoder.buffer);\n }\n \n // Encode heatmap events\n for (const event of batch.heatmapEvents) {\n this.encodeTag(EventBatchSchema.heatmapEvents, WireType.LENGTH_DELIMITED);\n const eventEncoder = new ProtobufEncoder();\n eventEncoder.encodeHeatmapEvent(event);\n this.encodeVarint(eventEncoder.buffer.length);\n this.buffer.push(...eventEncoder.buffer);\n }\n \n return new Uint8Array(this.buffer);\n }\n\n public encodeErrorBatch(batch: ErrorBatch): Uint8Array {\n this.buffer = [];\n \n for (const error of batch.errors) {\n this.encodeTag(ErrorBatchSchema.errors, WireType.LENGTH_DELIMITED);\n const errorEncoder = new ProtobufEncoder();\n errorEncoder.encodeErrorEvent(error);\n this.encodeVarint(errorEncoder.buffer.length);\n this.buffer.push(...errorEncoder.buffer);\n }\n \n return new Uint8Array(this.buffer);\n }\n}","import { TransportConfig, EventBatch, ErrorBatch, IngestResponse } from './types';\nimport { ProtobufEncoder } from './proto/encode';\n\nexport class Transport {\n private config: TransportConfig;\n private encoder: ProtobufEncoder;\n\n constructor(config: TransportConfig) {\n this.config = config;\n this.encoder = new ProtobufEncoder();\n }\n\n private async sendProtobuf(endpoint: string, data: Uint8Array): Promise<IngestResponse> {\n try {\n const response = await fetch(`${this.config.endpoint}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'X-API-Key': this.config.apiKey\n },\n body: data as BodyInit\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Assume success if we can't parse the response\n try {\n const result = await response.json();\n return result;\n } catch {\n return { success: true };\n }\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Protobuf transport error:', error);\n }\n throw error;\n }\n }\n\n private async sendJSON(endpoint: string, data: any): Promise<IngestResponse> {\n try {\n const response = await fetch(`${this.config.endpoint}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey\n },\n body: JSON.stringify(data)\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n try {\n const result = await response.json();\n return result;\n } catch {\n return { success: true };\n }\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] JSON transport error:', error);\n }\n throw error;\n }\n }\n\n public async sendEventBatch(batch: EventBatch): Promise<IngestResponse> {\n // Use JSON if configured or in debug mode\n if (this.config.useJSON || this.config.debug) {\n return this.sendJSON('/api/v1/events/ingest/json', batch);\n }\n\n try {\n const protobufData = this.encoder.encodeEventBatch(batch);\n return await this.sendProtobuf('/api/v1/events/ingest', protobufData);\n } catch (error) {\n if (this.config.debug) {\n console.warn('[ExperienceSDK] Protobuf failed, falling back to JSON:', error);\n }\n }\n\n // Fallback to JSON\n return this.sendJSON('/api/v1/events/ingest/json', batch);\n }\n\n public async sendErrorBatch(batch: ErrorBatch): Promise<IngestResponse> {\n // Use JSON if configured or in debug mode\n if (this.config.useJSON || this.config.debug) {\n return this.sendJSON('/api/v1/errors/ingest/json', batch);\n }\n\n try {\n // Try protobuf first unless debug mode\n if (!this.config.debug) {\n const protobufData = this.encoder.encodeErrorBatch(batch);\n return await this.sendProtobuf('/api/v1/errors/ingest', protobufData);\n }\n } catch (error) {\n if (this.config.debug) {\n console.warn('[ExperienceSDK] Protobuf failed, falling back to JSON:', error);\n }\n }\n\n // Fallback to JSON\n return this.sendJSON('/api/v1/errors/ingest/json', batch);\n }\n\n public async sendEventBatchBeacon(batch: EventBatch): Promise<void> {\n // Use sendBeacon for unload scenarios\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n try {\n const protobufData = this.encoder.encodeEventBatch(batch);\n const blob = new Blob([protobufData as BlobPart], { type: 'application/x-protobuf' });\n \n // Note: sendBeacon doesn't support custom headers, so we include the API key in the URL\n const url = `${this.config.endpoint}/api/v1/events/ingest?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(url, blob);\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Beacon send error:', error);\n }\n // Fallback to JSON beacon\n try {\n const jsonBlob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n const jsonUrl = `${this.config.endpoint}/api/v1/events/ingest/json?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(jsonUrl, jsonBlob);\n } catch (fallbackError) {\n // Silent fail for beacon\n }\n }\n }\n }\n\n public async sendErrorBatchBeacon(batch: ErrorBatch): Promise<void> {\n // Use sendBeacon for unload scenarios\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n try {\n const protobufData = this.encoder.encodeErrorBatch(batch);\n const blob = new Blob([protobufData as BlobPart], { type: 'application/x-protobuf' });\n \n const url = `${this.config.endpoint}/api/v1/errors/ingest?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(url, blob);\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Error beacon send error:', error);\n }\n // Fallback to JSON beacon\n try {\n const jsonBlob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n const jsonUrl = `${this.config.endpoint}/api/v1/errors/ingest/json?api_key=${encodeURIComponent(this.config.apiKey)}`;\n navigator.sendBeacon(jsonUrl, jsonBlob);\n } catch (fallbackError) {\n // Silent fail for beacon\n }\n }\n }\n }\n\n public async fetchFlags(appId: string, profileId?: string): Promise<Record<string, any>> {\n try {\n const queryParams = new URLSearchParams();\n if (profileId) {\n queryParams.set('profileId', profileId);\n }\n\n const url = `${this.config.endpoint}/api/v1/flags/${appId}/resolve${queryParams.toString() ? '?' + queryParams.toString() : ''}`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'X-API-Key': this.config.apiKey\n }\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result.flags || {};\n } catch (error) {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Flag fetch error:', error);\n }\n return {};\n }\n }\n}","import { TrackEvent, HeatmapEvent, EventBatch, ErrorEvent, ErrorBatch, UnsubscribeFn } from './types';\nimport { Transport } from './transport';\n\nexport class EventBatcher {\n private trackEvents: TrackEvent[] = [];\n private heatmapEvents: HeatmapEvent[] = [];\n private errorEvents: ErrorEvent[] = [];\n private transport: Transport;\n private batchIntervalMs: number;\n private maxBatchSize: number;\n private debug: boolean;\n private flushTimer: number | null = null;\n private unsubscribeFns: UnsubscribeFn[] = [];\n\n constructor(\n transport: Transport, \n batchIntervalMs: number = 2000, \n maxBatchSize: number = 50,\n debug: boolean = false\n ) {\n this.transport = transport;\n this.batchIntervalMs = batchIntervalMs;\n this.maxBatchSize = maxBatchSize;\n this.debug = debug;\n \n this.setupAutoFlush();\n this.setupUnloadHandler();\n }\n\n private setupAutoFlush(): void {\n this.scheduleNextFlush();\n }\n\n private scheduleNextFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n }\n\n this.flushTimer = window.setTimeout(() => {\n this.flush();\n this.scheduleNextFlush();\n }, this.batchIntervalMs);\n }\n\n private setupUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n\n const handleUnload = () => {\n // Use sendBeacon for unload scenarios\n this.flushBeacon();\n };\n\n // Try multiple unload events for better coverage\n window.addEventListener('beforeunload', handleUnload);\n window.addEventListener('unload', handleUnload);\n \n // Also try pagehide and visibilitychange for mobile\n window.addEventListener('pagehide', handleUnload);\n \n if (typeof document !== 'undefined') {\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this.flushBeacon();\n }\n };\n \n document.addEventListener('visibilitychange', handleVisibilityChange);\n \n this.unsubscribeFns.push(() => {\n window.removeEventListener('beforeunload', handleUnload);\n window.removeEventListener('unload', handleUnload);\n window.removeEventListener('pagehide', handleUnload);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n });\n } else {\n this.unsubscribeFns.push(() => {\n window.removeEventListener('beforeunload', handleUnload);\n window.removeEventListener('unload', handleUnload);\n window.removeEventListener('pagehide', handleUnload);\n });\n }\n }\n\n public addTrackEvent(event: TrackEvent): void {\n this.trackEvents.push(event);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Track event added:', event);\n }\n\n // Auto-flush if we hit the max batch size\n if (this.trackEvents.length + this.heatmapEvents.length >= this.maxBatchSize) {\n this.flush();\n }\n }\n\n public addHeatmapEvent(event: HeatmapEvent): void {\n this.heatmapEvents.push(event);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Heatmap event added:', event);\n }\n\n // Auto-flush if we hit the max batch size\n if (this.trackEvents.length + this.heatmapEvents.length >= this.maxBatchSize) {\n this.flush();\n }\n }\n\n public addErrorEvent(error: ErrorEvent): void {\n this.errorEvents.push(error);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Error event added:', error);\n }\n\n // Errors are batched separately and flush immediately if critical\n if (error.severity >= 2) { // ERROR or FATAL\n this.flushErrors();\n } else if (this.errorEvents.length >= this.maxBatchSize) {\n this.flushErrors();\n }\n }\n\n public async flush(): Promise<void> {\n if (this.trackEvents.length === 0 && this.heatmapEvents.length === 0) {\n return;\n }\n\n const batch: EventBatch = {\n events: [...this.trackEvents],\n heatmapEvents: [...this.heatmapEvents]\n };\n\n // Clear the events immediately to prevent double-sending\n this.trackEvents = [];\n this.heatmapEvents = [];\n\n try {\n const result = await this.transport.sendEventBatch(batch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Event batch sent successfully:', result);\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to send event batch:', error);\n }\n \n // Re-add events to the front of the queue for retry\n this.trackEvents.unshift(...batch.events);\n this.heatmapEvents.unshift(...batch.heatmapEvents);\n \n // Limit the retry queue size to prevent memory issues\n this.trackEvents = this.trackEvents.slice(0, this.maxBatchSize * 2);\n this.heatmapEvents = this.heatmapEvents.slice(0, this.maxBatchSize * 2);\n }\n }\n\n public async flushErrors(): Promise<void> {\n if (this.errorEvents.length === 0) {\n return;\n }\n\n const batch: ErrorBatch = {\n errors: [...this.errorEvents]\n };\n\n // Clear the errors immediately\n this.errorEvents = [];\n\n try {\n const result = await this.transport.sendErrorBatch(batch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Error batch sent successfully:', result);\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to send error batch:', error);\n }\n \n // Re-add errors for retry\n this.errorEvents.unshift(...batch.errors);\n \n // Limit retry queue\n this.errorEvents = this.errorEvents.slice(0, this.maxBatchSize * 2);\n }\n }\n\n public flushBeacon(): void {\n // Use sendBeacon for unload scenarios - fire and forget\n if (this.trackEvents.length > 0 || this.heatmapEvents.length > 0) {\n const eventBatch: EventBatch = {\n events: [...this.trackEvents],\n heatmapEvents: [...this.heatmapEvents]\n };\n \n this.transport.sendEventBatchBeacon(eventBatch);\n this.trackEvents = [];\n this.heatmapEvents = [];\n }\n\n if (this.errorEvents.length > 0) {\n const errorBatch: ErrorBatch = {\n errors: [...this.errorEvents]\n };\n \n this.transport.sendErrorBatchBeacon(errorBatch);\n this.errorEvents = [];\n }\n }\n\n public getPendingEventCount(): number {\n return this.trackEvents.length + this.heatmapEvents.length;\n }\n\n public getPendingErrorCount(): number {\n return this.errorEvents.length;\n }\n\n public async shutdown(): Promise<void> {\n // Clear the flush timer\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n // Final flush\n await Promise.all([\n this.flush(),\n this.flushErrors()\n ]);\n }\n\n // Force immediate flush for testing/debugging\n public async forceFlush(): Promise<void> {\n await Promise.all([\n this.flush(),\n this.flushErrors()\n ]);\n }\n}","import { Breadcrumb, UnsubscribeFn } from './types';\n\nconst MAX_BREADCRUMBS = 50;\n\nexport class BreadcrumbManager {\n private breadcrumbs: Breadcrumb[] = [];\n private unsubscribeFns: UnsubscribeFn[] = [];\n private originalConsole: {\n warn: typeof console.warn;\n error: typeof console.error;\n } | null = null;\n private originalFetch: typeof fetch | null = null;\n private isEnabled = false;\n\n constructor() {\n // Initialize with browser API guards\n }\n\n public enable(): void {\n if (this.isEnabled) return;\n this.isEnabled = true;\n\n this.setupConsoleWrapping();\n this.setupFetchWrapping();\n this.setupXHRWrapping();\n this.setupNavigationListeners();\n this.setupClickListener();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clean up all listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n // Restore original functions\n this.restoreConsole();\n this.restoreFetch();\n }\n\n private addBreadcrumb(breadcrumb: Omit<Breadcrumb, 'timestamp'>): void {\n const fullBreadcrumb: Breadcrumb = {\n ...breadcrumb,\n timestamp: Date.now()\n };\n\n this.breadcrumbs.push(fullBreadcrumb);\n\n // Keep only the last MAX_BREADCRUMBS items\n if (this.breadcrumbs.length > MAX_BREADCRUMBS) {\n this.breadcrumbs = this.breadcrumbs.slice(-MAX_BREADCRUMBS);\n }\n }\n\n private setupConsoleWrapping(): void {\n if (typeof console === 'undefined') return;\n\n this.originalConsole = {\n warn: console.warn,\n error: console.error\n };\n\n console.warn = (...args: any[]) => {\n this.addBreadcrumb({\n category: 'console',\n message: args.map(arg => String(arg)).join(' '),\n level: 'warning'\n });\n this.originalConsole!.warn.apply(console, args);\n };\n\n console.error = (...args: any[]) => {\n this.addBreadcrumb({\n category: 'console',\n message: args.map(arg => String(arg)).join(' '),\n level: 'error'\n });\n this.originalConsole!.error.apply(console, args);\n };\n }\n\n private restoreConsole(): void {\n if (this.originalConsole && typeof console !== 'undefined') {\n console.warn = this.originalConsole.warn;\n console.error = this.originalConsole.error;\n this.originalConsole = null;\n }\n }\n\n private setupFetchWrapping(): void {\n if (typeof fetch === 'undefined' || typeof window === 'undefined') return;\n\n // Bind fetch to window to preserve the native invocation context.\n // Calling an unbound native fetch can throw: \"Illegal invocation\".\n this.originalFetch = window.fetch.bind(window);\n\n window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const url = typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input instanceof Request\n ? input.url\n : String(input);\n const method = init?.method || (input instanceof Request ? input.method : 'GET');\n const startTime = Date.now();\n\n try {\n const response = await this.originalFetch!(input, init);\n const duration = Date.now() - startTime;\n\n this.addBreadcrumb({\n category: 'fetch',\n message: `${method} ${url}`,\n data: {\n url,\n method,\n status: response.status,\n duration: `${duration}ms`\n },\n level: response.ok ? 'info' : 'error'\n });\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n \n this.addBreadcrumb({\n category: 'fetch',\n message: `${method} ${url} (failed)`,\n data: {\n url,\n method,\n error: error instanceof Error ? error.message : String(error),\n duration: `${duration}ms`\n },\n level: 'error'\n });\n\n throw error;\n }\n };\n }\n\n private restoreFetch(): void {\n if (this.originalFetch && typeof window !== 'undefined') {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n }\n\n private setupXHRWrapping(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function(method: string, url: string | URL, async?: boolean, user?: string | null, password?: string | null) {\n (this as any).__method = method;\n (this as any).__url = url.toString();\n (this as any).__startTime = Date.now();\n \n return originalOpen.apply(this, arguments as any);\n };\n\n XMLHttpRequest.prototype.send = function(body?: any) {\n const xhr = this;\n const method = (xhr as any).__method || 'GET';\n const url = (xhr as any).__url || '';\n\n const originalOnReadyStateChange = xhr.onreadystatechange;\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n const startTime = (xhr as any).__startTime || Date.now();\n const duration = Date.now() - startTime;\n\n const breadcrumbManager = (globalThis as any).__experienceBreadcrumbs;\n if (breadcrumbManager) {\n breadcrumbManager.addBreadcrumb({\n category: 'xhr',\n message: `${method} ${url}`,\n data: {\n url,\n method,\n status: xhr.status,\n duration: `${duration}ms`\n },\n level: xhr.status >= 200 && xhr.status < 300 ? 'info' : 'error'\n });\n }\n }\n\n if (originalOnReadyStateChange) {\n originalOnReadyStateChange.apply(xhr, arguments as any);\n }\n };\n\n return originalSend.apply(this, arguments as any);\n };\n\n // Store reference to this breadcrumb manager for XHR callbacks\n (globalThis as any).__experienceBreadcrumbs = this;\n }\n\n private setupNavigationListeners(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n\n // Listen to popstate for back/forward navigation\n const handlePopState = () => {\n this.addBreadcrumb({\n category: 'navigation',\n message: 'Navigation (popstate)',\n data: {\n url: window.location.href,\n type: 'popstate'\n }\n });\n };\n\n window.addEventListener('popstate', handlePopState);\n this.unsubscribeFns.push(() => window.removeEventListener('popstate', handlePopState));\n\n // Wrap pushState and replaceState\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function(...args) {\n const breadcrumbManager = (globalThis as any).__experienceBreadcrumbs;\n if (breadcrumbManager) {\n breadcrumbManager.addBreadcrumb({\n category: 'navigation',\n message: 'Navigation (pushState)',\n data: {\n url: args[2] || window.location.href,\n type: 'pushState'\n }\n });\n }\n return originalPushState.apply(this, args);\n };\n\n history.replaceState = function(...args) {\n const breadcrumbManager = (globalThis as any).__experienceBreadcrumbs;\n if (breadcrumbManager) {\n breadcrumbManager.addBreadcrumb({\n category: 'navigation',\n message: 'Navigation (replaceState)',\n data: {\n url: args[2] || window.location.href,\n type: 'replaceState'\n }\n });\n }\n return originalReplaceState.apply(this, args);\n };\n\n // Restore on cleanup\n this.unsubscribeFns.push(() => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n });\n }\n\n private setupClickListener(): void {\n if (typeof document === 'undefined') return;\n\n const handleClick = (event: MouseEvent) => {\n const target = event.target as Element;\n if (!target) return;\n\n const tagName = target.tagName?.toLowerCase();\n const selector = this.getElementSelector(target);\n\n this.addBreadcrumb({\n category: 'click',\n message: `Click on ${tagName}`,\n data: {\n selector,\n tag: tagName,\n text: target.textContent?.slice(0, 100) || '',\n x: event.clientX,\n y: event.clientY\n }\n });\n };\n\n document.addEventListener('click', handleClick, true);\n this.unsubscribeFns.push(() => document.removeEventListener('click', handleClick, true));\n }\n\n private getElementSelector(element: Element): string {\n try {\n // Try to create a simple selector\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className && typeof element.className === 'string' \n ? `.${element.className.split(' ').filter(c => c.trim()).join('.')}` \n : '';\n \n return `${tag}${id}${className}`.slice(0, 100);\n } catch {\n return element.tagName?.toLowerCase() || 'unknown';\n }\n }\n\n public getBreadcrumbs(): Breadcrumb[] {\n return [...this.breadcrumbs];\n }\n\n public clear(): void {\n this.breadcrumbs = [];\n }\n\n public addCustomBreadcrumb(category: Breadcrumb['category'], message: string, data?: Record<string, any>): void {\n this.addBreadcrumb({\n category,\n message,\n data\n });\n }\n}","import { HeatmapEvent, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\n\nconst MOUSEMOVE_THROTTLE_MS = 100;\nconst HOVER_THRESHOLD_MS = 500;\n\nexport class HeatmapTracker {\n private batcher: EventBatcher;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private lastMouseMoveTime = 0;\n private hoverTimer: number | null = null;\n private lastHoverPosition: { x: number; y: number } | null = null;\n\n constructor(batcher: EventBatcher, sessionId: string) {\n this.batcher = batcher;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled || typeof document === 'undefined') return;\n this.isEnabled = true;\n\n this.setupMouseMoveTracking();\n this.setupClickTracking();\n this.setupHoverTracking();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clear hover timer\n if (this.hoverTimer !== null) {\n clearTimeout(this.hoverTimer);\n this.hoverTimer = null;\n }\n\n // Clean up all event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n }\n\n private setupMouseMoveTracking(): void {\n const handleMouseMove = (event: MouseEvent) => {\n const now = Date.now();\n \n // Throttle mousemove events\n if (now - this.lastMouseMoveTime < MOUSEMOVE_THROTTLE_MS) {\n return;\n }\n \n this.lastMouseMoveTime = now;\n \n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: now,\n type: 'move',\n x: event.clientX,\n y: event.clientY,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n };\n\n document.addEventListener('mousemove', handleMouseMove, { passive: true });\n this.unsubscribeFns.push(() => \n document.removeEventListener('mousemove', handleMouseMove)\n );\n }\n\n private setupClickTracking(): void {\n const handleClick = (event: MouseEvent) => {\n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'click',\n x: event.clientX,\n y: event.clientY,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n };\n\n document.addEventListener('click', handleClick, { passive: true });\n this.unsubscribeFns.push(() => \n document.removeEventListener('click', handleClick)\n );\n }\n\n private setupHoverTracking(): void {\n const handleMouseEnter = (event: MouseEvent) => {\n const x = event.clientX;\n const y = event.clientY;\n \n this.lastHoverPosition = { x, y };\n \n // Start hover timer\n this.hoverTimer = window.setTimeout(() => {\n // Check if mouse is still in approximately the same position\n if (this.lastHoverPosition && \n Math.abs(this.lastHoverPosition.x - x) < 50 && \n Math.abs(this.lastHoverPosition.y - y) < 50) {\n \n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'hover',\n x: this.lastHoverPosition.x,\n y: this.lastHoverPosition.y,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n }\n }, HOVER_THRESHOLD_MS);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n this.lastHoverPosition = { x: event.clientX, y: event.clientY };\n };\n\n const handleMouseLeave = () => {\n if (this.hoverTimer !== null) {\n clearTimeout(this.hoverTimer);\n this.hoverTimer = null;\n }\n this.lastHoverPosition = null;\n };\n\n // Use a separate throttled mousemove for hover tracking\n let lastHoverMoveTime = 0;\n const throttledMouseMove = (event: MouseEvent) => {\n const now = Date.now();\n if (now - lastHoverMoveTime >= 100) { // 100ms throttle\n lastHoverMoveTime = now;\n handleMouseMove(event);\n }\n };\n\n document.addEventListener('mouseenter', handleMouseEnter, { passive: true });\n document.addEventListener('mousemove', throttledMouseMove, { passive: true });\n document.addEventListener('mouseleave', handleMouseLeave, { passive: true });\n \n this.unsubscribeFns.push(() => {\n document.removeEventListener('mouseenter', handleMouseEnter);\n document.removeEventListener('mousemove', throttledMouseMove);\n document.removeEventListener('mouseleave', handleMouseLeave);\n });\n }\n\n private getViewportSize(): { width: number; height: number } {\n if (typeof window === 'undefined') {\n return { width: 1920, height: 1080 }; // Default fallback\n }\n\n return {\n width: window.innerWidth || document.documentElement.clientWidth || 1920,\n height: window.innerHeight || document.documentElement.clientHeight || 1080\n };\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n // Manual event tracking for programmatic use\n public trackClick(x: number, y: number): void {\n if (!this.isEnabled) return;\n\n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'click',\n x: Math.round(x),\n y: Math.round(y),\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n }\n\n public trackHover(x: number, y: number): void {\n if (!this.isEnabled) return;\n\n const viewport = this.getViewportSize();\n \n const heatmapEvent: HeatmapEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n type: 'hover',\n x: Math.round(x),\n y: Math.round(y),\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n url: window.location.href\n };\n \n this.batcher.addHeatmapEvent(heatmapEvent);\n }\n}","import { ErrorEvent, Severity, BrowserContext, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\nimport { BreadcrumbManager } from './breadcrumbs';\n\nexport class ErrorCapture {\n private batcher: EventBatcher;\n private breadcrumbManager: BreadcrumbManager;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private originalWindowError: OnErrorEventHandler | null = null;\n private originalUnhandledRejection: ((event: PromiseRejectionEvent) => void) | null = null;\n\n constructor(batcher: EventBatcher, breadcrumbManager: BreadcrumbManager, sessionId: string) {\n this.batcher = batcher;\n this.breadcrumbManager = breadcrumbManager;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled || typeof window === 'undefined') return;\n this.isEnabled = true;\n\n this.setupGlobalErrorHandler();\n this.setupUnhandledRejectionHandler();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n this.restoreOriginalHandlers();\n \n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n }\n\n private setupGlobalErrorHandler(): void {\n // Store original handler\n this.originalWindowError = window.onerror;\n\n window.onerror = (message, filename, lineno, colno, error) => {\n this.captureError({\n message: typeof message === 'string' ? message : 'Unknown error',\n filename,\n lineno,\n colno,\n stack: error?.stack,\n severity: Severity.ERROR\n });\n\n // Call original handler if it exists\n if (this.originalWindowError) {\n return this.originalWindowError.call(window, message, filename, lineno, colno, error);\n }\n\n return false;\n };\n }\n\n private setupUnhandledRejectionHandler(): void {\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n let message = 'Unhandled Promise Rejection';\n let stack: string | undefined;\n\n if (event.reason) {\n if (event.reason instanceof Error) {\n message = event.reason.message || 'Unhandled Promise Rejection';\n stack = event.reason.stack;\n } else if (typeof event.reason === 'string') {\n message = event.reason;\n } else {\n try {\n message = JSON.stringify(event.reason);\n } catch {\n message = 'Unhandled Promise Rejection (non-serializable reason)';\n }\n }\n }\n\n this.captureError({\n message,\n stack,\n severity: Severity.ERROR\n });\n\n // Call original handler if it exists\n if (this.originalUnhandledRejection) {\n this.originalUnhandledRejection.call(window, event);\n }\n };\n\n // Store original handler\n this.originalUnhandledRejection = window.onunhandledrejection;\n\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n this.unsubscribeFns.push(() => {\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n });\n }\n\n private restoreOriginalHandlers(): void {\n if (typeof window !== 'undefined') {\n if (this.originalWindowError !== null) {\n window.onerror = this.originalWindowError;\n this.originalWindowError = null;\n }\n\n if (this.originalUnhandledRejection !== null) {\n window.onunhandledrejection = this.originalUnhandledRejection;\n this.originalUnhandledRejection = null;\n }\n }\n }\n\n private getBrowserContext(): BrowserContext {\n return {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Unknown',\n url: typeof window !== 'undefined' ? window.location.href : 'Unknown',\n timestamp: Date.now(),\n viewport: {\n width: typeof window !== 'undefined' ? window.innerWidth || 1920 : 1920,\n height: typeof window !== 'undefined' ? window.innerHeight || 1080 : 1080\n }\n };\n }\n\n private captureError(errorData: {\n message: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n stack?: string;\n severity: Severity;\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n }): void {\n const errorEvent: ErrorEvent = {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n message: errorData.message,\n filename: errorData.filename,\n lineno: errorData.lineno,\n colno: errorData.colno,\n stack: errorData.stack,\n severity: errorData.severity,\n breadcrumbs: this.breadcrumbManager.getBreadcrumbs(),\n browserContext: this.getBrowserContext(),\n tags: errorData.tags,\n extra: errorData.extra\n };\n\n this.batcher.addErrorEvent(errorEvent);\n\n // Add breadcrumb for this error\n this.breadcrumbManager.addCustomBreadcrumb('ui', `Error: ${errorData.message}`, {\n severity: Severity[errorData.severity].toLowerCase(),\n filename: errorData.filename,\n line: errorData.lineno\n });\n }\n\n // Public methods for manual error reporting\n public captureException(error: Error, options?: {\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n severity?: Severity;\n }): void {\n if (!this.isEnabled) return;\n\n const severity = options?.severity ?? Severity.ERROR;\n\n this.captureError({\n message: error.message || 'Unknown error',\n stack: error.stack,\n severity,\n tags: options?.tags,\n extra: options?.extra\n });\n }\n\n public captureMessage(message: string, severity: Severity = Severity.INFO, options?: {\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n }): void {\n if (!this.isEnabled) return;\n\n this.captureError({\n message,\n severity,\n tags: options?.tags,\n extra: options?.extra\n });\n }\n\n public captureBreadcrumb(message: string, category: 'navigation' | 'click' | 'console' | 'fetch' | 'xhr' | 'ui' = 'ui', data?: Record<string, any>): void {\n this.breadcrumbManager.addCustomBreadcrumb(category, message, data);\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n // Utility method to extract error info from various error types\n private extractErrorInfo(error: unknown): { message: string; stack?: string } {\n if (error instanceof Error) {\n return {\n message: error.message || 'Unknown error',\n stack: error.stack\n };\n }\n\n if (typeof error === 'string') {\n return { message: error };\n }\n\n if (error && typeof error === 'object') {\n try {\n return { message: JSON.stringify(error) };\n } catch {\n return { message: 'Non-serializable error object' };\n }\n }\n\n return { message: 'Unknown error type' };\n }\n\n // Helper method for severity string to enum conversion\n public static getSeverityFromString(severity: string): Severity {\n switch (severity.toLowerCase()) {\n case 'info':\n return Severity.INFO;\n case 'warning':\n case 'warn':\n return Severity.WARNING;\n case 'error':\n return Severity.ERROR;\n case 'fatal':\n return Severity.FATAL;\n default:\n return Severity.INFO;\n }\n }\n\n // Test method for manual error triggering (useful for debugging)\n public triggerTestError(): void {\n if (!this.isEnabled) return;\n \n try {\n throw new Error('Test error from ExperienceSDK');\n } catch (error) {\n this.captureException(error as Error, {\n tags: { test: 'true' },\n severity: Severity.WARNING\n });\n }\n }\n}","import { TrackEvent, PageContext, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\n\nexport class AutoTracker {\n private batcher: EventBatcher;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private lastUrl: string | null = null;\n private pageLoadTime: number = Date.now();\n\n constructor(batcher: EventBatcher, sessionId: string) {\n this.batcher = batcher;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled) return;\n this.isEnabled = true;\n\n // Track initial page load\n this.trackInitialPageView();\n \n // Set up SPA navigation tracking\n this.setupSPATracking();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n }\n\n private trackInitialPageView(): void {\n if (typeof window === 'undefined') return;\n\n const loadTime = this.calculateLoadTime();\n this.trackPageView(loadTime);\n this.lastUrl = window.location.href;\n }\n\n private calculateLoadTime(): number | undefined {\n if (typeof performance === 'undefined' || !performance.timing) {\n return undefined;\n }\n\n const timing = performance.timing;\n if (timing.loadEventEnd && timing.navigationStart) {\n return timing.loadEventEnd - timing.navigationStart;\n }\n\n // Fallback to DOMContentLoaded\n if (timing.domContentLoadedEventEnd && timing.navigationStart) {\n return timing.domContentLoadedEventEnd - timing.navigationStart;\n }\n\n return undefined;\n }\n\n private setupSPATracking(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n\n // Listen to popstate for back/forward navigation\n const handlePopState = () => {\n // Small delay to ensure URL has updated\n setTimeout(() => {\n if (window.location.href !== this.lastUrl) {\n this.trackPageView();\n this.lastUrl = window.location.href;\n }\n }, 0);\n };\n\n window.addEventListener('popstate', handlePopState);\n this.unsubscribeFns.push(() => window.removeEventListener('popstate', handlePopState));\n\n // Wrap history.pushState and history.replaceState\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n \n // Track navigation after state change\n setTimeout(() => {\n if (window.location.href !== this.lastUrl) {\n this.trackPageView();\n this.lastUrl = window.location.href;\n }\n }, 0);\n \n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n \n // Track navigation after state change\n setTimeout(() => {\n if (window.location.href !== this.lastUrl) {\n this.trackPageView();\n this.lastUrl = window.location.href;\n }\n }, 0);\n \n return result;\n };\n\n // Restore original methods on cleanup\n this.unsubscribeFns.push(() => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n });\n }\n\n private getPageContext(loadTime?: number): PageContext {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return {\n url: 'unknown',\n title: 'unknown',\n referrer: '',\n viewport: { width: 1920, height: 1080 }\n };\n }\n\n return {\n url: window.location.href,\n title: document.title || '',\n referrer: document.referrer || '',\n viewport: {\n width: window.innerWidth || document.documentElement.clientWidth || 1920,\n height: window.innerHeight || document.documentElement.clientHeight || 1080\n },\n loadTime\n };\n }\n\n private trackPageView(loadTime?: number): void {\n const pageContext = this.getPageContext(loadTime);\n \n const trackEvent: TrackEvent = {\n eventType: 'page_view',\n sessionId: this.sessionId,\n timestamp: Date.now(),\n pageContext\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n // Public method for manual page view tracking\n public trackCurrentPage(): void {\n if (!this.isEnabled) return;\n \n this.trackPageView();\n \n if (typeof window !== 'undefined') {\n this.lastUrl = window.location.href;\n }\n }\n\n // Track custom navigation events\n public trackNavigation(eventType: string, metadata?: Record<string, string>): void {\n if (!this.isEnabled) return;\n\n const pageContext = this.getPageContext();\n \n const trackEvent: TrackEvent = {\n eventType,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n pageContext,\n metadata\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n // Get current page info for debugging\n public getCurrentPageInfo(): PageContext {\n return this.getPageContext();\n }\n}","import { TrackEvent, ElementContext, PageContext, UnsubscribeFn } from './types';\nimport { EventBatcher } from './batch';\n\nconst HOVER_THRESHOLD_MS = 500;\n\nexport class DataTTracker {\n private batcher: EventBatcher;\n private sessionId: string;\n private isEnabled = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private mutationObserver: MutationObserver | null = null;\n private intersectionObserver: IntersectionObserver | null = null;\n private visibleElements = new Set<Element>();\n private hoverTimers = new Map<Element, number>();\n\n constructor(batcher: EventBatcher, sessionId: string) {\n this.batcher = batcher;\n this.sessionId = sessionId;\n }\n\n public enable(): void {\n if (this.isEnabled || typeof document === 'undefined') return;\n this.isEnabled = true;\n\n this.setupMutationObserver();\n this.setupEventDelegation();\n this.setupVisibilityTracking();\n this.setupHoverTracking();\n \n // Scan for existing data-t elements\n this.scanExistingElements();\n }\n\n public disable(): void {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n\n // Clean up observers\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n\n // Clear hover timers\n this.hoverTimers.forEach(timer => clearTimeout(timer));\n this.hoverTimers.clear();\n\n // Clean up event listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n this.visibleElements.clear();\n }\n\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined') return;\n\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check added nodes for data-t attributes\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n this.processNewElement(element);\n \n // Check descendants\n const descendants = element.querySelectorAll('[data-t]');\n descendants.forEach(desc => this.processNewElement(desc));\n }\n });\n } else if (mutation.type === 'attributes' && mutation.attributeName === 'data-t') {\n const target = mutation.target as Element;\n this.processNewElement(target);\n }\n }\n });\n\n this.mutationObserver.observe(document, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-t']\n });\n }\n\n private setupEventDelegation(): void {\n const handleClick = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const dataTElement = this.findDataTParent(target);\n if (dataTElement) {\n this.trackDataTEvent('click', dataTElement, {\n x: event.clientX,\n y: event.clientY\n });\n }\n };\n\n document.addEventListener('click', handleClick, true);\n this.unsubscribeFns.push(() => \n document.removeEventListener('click', handleClick, true)\n );\n }\n\n private setupVisibilityTracking(): void {\n if (typeof IntersectionObserver === 'undefined') return;\n\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const element = entry.target;\n const dataTValue = element.getAttribute('data-t');\n \n if (!dataTValue) return;\n\n if (entry.isIntersecting && !this.visibleElements.has(element)) {\n // Element became visible\n this.visibleElements.add(element);\n this.trackDataTEvent('view', element);\n } else if (!entry.isIntersecting && this.visibleElements.has(element)) {\n // Element became hidden\n this.visibleElements.delete(element);\n this.trackDataTEvent('hide', element);\n }\n });\n },\n {\n threshold: 0.1, // Trigger when at least 10% visible\n rootMargin: '50px' // Start observing 50px before entering viewport\n }\n );\n }\n\n private setupHoverTracking(): void {\n const handleMouseEnter = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const dataTElement = this.findDataTParent(target);\n \n if (!dataTElement) return;\n\n // Start hover timer\n const timer = window.setTimeout(() => {\n this.trackDataTEvent('hover', dataTElement);\n this.hoverTimers.delete(dataTElement);\n }, HOVER_THRESHOLD_MS);\n\n this.hoverTimers.set(dataTElement, timer);\n };\n\n const handleMouseLeave = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const dataTElement = this.findDataTParent(target);\n \n if (!dataTElement) return;\n\n // Clear hover timer\n const timer = this.hoverTimers.get(dataTElement);\n if (timer) {\n clearTimeout(timer);\n this.hoverTimers.delete(dataTElement);\n }\n };\n\n document.addEventListener('mouseenter', handleMouseEnter, true);\n document.addEventListener('mouseleave', handleMouseLeave, true);\n \n this.unsubscribeFns.push(() => {\n document.removeEventListener('mouseenter', handleMouseEnter, true);\n document.removeEventListener('mouseleave', handleMouseLeave, true);\n });\n }\n\n private scanExistingElements(): void {\n const existingElements = document.querySelectorAll('[data-t]');\n existingElements.forEach(element => this.processNewElement(element));\n }\n\n private processNewElement(element: Element): void {\n const dataTValue = element.getAttribute('data-t');\n if (!dataTValue) return;\n\n // Add to intersection observer for visibility tracking\n if (this.intersectionObserver) {\n this.intersectionObserver.observe(element);\n }\n\n // Track element discovery\n this.trackDataTEvent('discover', element);\n }\n\n private findDataTParent(element: Element): Element | null {\n let current: Element | null = element;\n\n while (current) {\n if (typeof (current as any).hasAttribute === 'function' && current.hasAttribute('data-t')) {\n return current;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n\n private getElementSelector(element: Element): string {\n try {\n // Build a simple selector\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const classes = element.className && typeof element.className === 'string'\n ? `.${element.className.split(' ').filter(c => c.trim()).join('.')}`\n : '';\n \n let selector = `${tag}${id}${classes}`;\n \n // Add nth-child if needed for uniqueness\n const parent = element.parentElement;\n if (parent && !id) {\n const siblings = Array.from(parent.children).filter(\n child => child.tagName === element.tagName\n );\n \n if (siblings.length > 1) {\n const index = siblings.indexOf(element) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n \n return selector.slice(0, 200); // Limit length\n } catch (error) {\n return element.tagName?.toLowerCase() || 'unknown';\n }\n }\n\n private getElementContext(element: Element, position?: { x: number; y: number }): ElementContext {\n return {\n selector: this.getElementSelector(element),\n dataT: element.getAttribute('data-t') || undefined,\n tag: element.tagName.toLowerCase(),\n position\n };\n }\n\n private getPageContext(): PageContext {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return {\n url: 'unknown',\n title: 'unknown',\n referrer: '',\n viewport: { width: 1920, height: 1080 }\n };\n }\n\n return {\n url: window.location.href,\n title: document.title || '',\n referrer: document.referrer || '',\n viewport: {\n width: window.innerWidth || 1920,\n height: window.innerHeight || 1080\n }\n };\n }\n\n private trackDataTEvent(\n eventType: string, \n element: Element, \n position?: { x: number; y: number }\n ): void {\n const dataTValue = element.getAttribute('data-t');\n if (!dataTValue) return;\n\n const elementContext = this.getElementContext(element, position);\n const pageContext = this.getPageContext();\n\n const trackEvent: TrackEvent = {\n eventType: `data_t_${eventType}`,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n pageContext,\n elementContext,\n metadata: {\n data_t: dataTValue,\n event_type: eventType\n }\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n public updateSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n}","import { Transport } from './transport';\n\ninterface FlagCacheEntry {\n value: any;\n fetchedAt: number;\n}\n\nexport class FeatureFlagClient {\n private transport: Transport;\n private appId: string;\n private profileId: string | null = null;\n private flagCache = new Map<string, FlagCacheEntry>();\n private cacheTimeoutMs = 5 * 60 * 1000; // 5 minutes\n private eventSource: EventSource | null = null;\n private debug: boolean;\n\n constructor(transport: Transport, appId: string, debug: boolean = false) {\n this.transport = transport;\n this.appId = appId;\n this.debug = debug;\n }\n\n public setProfileId(profileId: string): void {\n this.profileId = profileId;\n // Clear cache when profile changes\n this.flagCache.clear();\n }\n\n public async fetchFlags(): Promise<void> {\n try {\n const flags = await this.transport.fetchFlags(this.appId, this.profileId || undefined);\n const now = Date.now();\n\n // Update cache with all fetched flags\n for (const [key, value] of Object.entries(flags)) {\n this.flagCache.set(key, {\n value,\n fetchedAt: now\n });\n }\n\n if (this.debug) {\n console.log('[ExperienceSDK] Flags fetched:', flags);\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to fetch flags:', error);\n }\n // Don't throw - return cached values or defaults\n }\n }\n\n public getFlag<T>(key: string, defaultValue: T): T {\n const cached = this.flagCache.get(key);\n \n // Check if cached value is still valid\n if (cached && Date.now() - cached.fetchedAt < this.cacheTimeoutMs) {\n if (this.debug) {\n console.log(`[ExperienceSDK] Flag '${key}' from cache:`, cached.value);\n }\n return this.convertValue(cached.value, defaultValue, key);\n }\n\n // Cache miss or expired - fetch in background if possible\n this.fetchFlagsInBackground();\n\n if (this.debug) {\n console.log(`[ExperienceSDK] Flag '${key}' not in cache, returning default:`, defaultValue);\n }\n \n return defaultValue;\n }\n\n public getFlagSync<T>(key: string, defaultValue: T): T {\n const cached = this.flagCache.get(key);\n \n if (cached) {\n return this.convertValue(cached.value, defaultValue, key);\n }\n \n return defaultValue;\n }\n\n private convertValue<T>(value: any, defaultValue: T, key?: string): T {\n try {\n // If types match, return as-is\n if (typeof value === typeof defaultValue) {\n return value as T;\n }\n\n // Handle boolean conversion\n if (typeof defaultValue === 'boolean') {\n if (typeof value === 'string') {\n return (value.toLowerCase() === 'true' || value === '1') as T;\n }\n return Boolean(value) as T;\n }\n\n // Handle number conversion\n if (typeof defaultValue === 'number') {\n const num = Number(value);\n return (isNaN(num) ? defaultValue : num) as T;\n }\n\n // Handle string conversion\n if (typeof defaultValue === 'string') {\n return String(value) as T;\n }\n\n // Handle object/array - try to parse if string\n if (typeof defaultValue === 'object' && typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n }\n\n return value as T;\n } catch (error) {\n if (this.debug) {\n console.warn(`[ExperienceSDK] Failed to convert flag value for '${key}':`, error);\n }\n return defaultValue;\n }\n }\n\n private fetchFlagsInBackground(): void {\n // Avoid multiple concurrent fetches\n if (this._backgroundFetchInProgress) {\n return;\n }\n\n this._backgroundFetchInProgress = true;\n \n this.fetchFlags().finally(() => {\n this._backgroundFetchInProgress = false;\n });\n }\n\n private _backgroundFetchInProgress = false;\n\n // Initialize with immediate fetch\n public async initialize(): Promise<void> {\n await this.fetchFlags();\n }\n\n // Set up real-time flag updates via Server-Sent Events\n public setupRealtimeUpdates(endpoint?: string): void {\n if (typeof EventSource === 'undefined') {\n if (this.debug) {\n console.warn('[ExperienceSDK] EventSource not supported, real-time flag updates disabled');\n }\n return;\n }\n\n // Close existing connection\n this.closeRealtimeUpdates();\n\n const baseEndpoint = endpoint || this.transport['config'].endpoint;\n const streamUrl = `${baseEndpoint}/api/v1/flags/${this.appId}/resolve/stream`;\n \n const url = new URL(streamUrl);\n if (this.profileId) {\n url.searchParams.set('profileId', this.profileId);\n }\n\n try {\n this.eventSource = new EventSource(url.toString());\n\n this.eventSource.onopen = () => {\n if (this.debug) {\n console.log('[ExperienceSDK] Real-time flag updates connected');\n }\n };\n\n this.eventSource.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n \n if (data.flags) {\n const now = Date.now();\n \n // Update cache with new flag values\n for (const [key, value] of Object.entries(data.flags)) {\n this.flagCache.set(key, {\n value,\n fetchedAt: now\n });\n }\n\n if (this.debug) {\n console.log('[ExperienceSDK] Flag updates received:', data.flags);\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to parse flag update:', error);\n }\n }\n };\n\n this.eventSource.onerror = (error) => {\n if (this.debug) {\n console.error('[ExperienceSDK] Real-time flag updates error:', error);\n }\n \n // Auto-reconnect logic\n setTimeout(() => {\n if (this.eventSource?.readyState === EventSource.CLOSED) {\n this.setupRealtimeUpdates(endpoint);\n }\n }, 5000);\n };\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to setup real-time flag updates:', error);\n }\n }\n }\n\n public closeRealtimeUpdates(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n \n if (this.debug) {\n console.log('[ExperienceSDK] Real-time flag updates disconnected');\n }\n }\n }\n\n // Clear all cached flags\n public clearCache(): void {\n this.flagCache.clear();\n \n if (this.debug) {\n console.log('[ExperienceSDK] Flag cache cleared');\n }\n }\n\n // Get cache status for debugging\n public getCacheInfo(): {\n size: number;\n keys: string[];\n oldestEntry?: { key: string; age: number };\n newestEntry?: { key: string; age: number };\n } {\n const keys = Array.from(this.flagCache.keys());\n const now = Date.now();\n \n let oldestEntry: { key: string; age: number } | undefined;\n let newestEntry: { key: string; age: number } | undefined;\n\n for (const [cacheKey, entry] of this.flagCache.entries()) {\n const age = now - entry.fetchedAt;\n \n if (!oldestEntry || age > oldestEntry.age) {\n oldestEntry = { key: cacheKey, age };\n }\n \n if (!newestEntry || age < newestEntry.age) {\n newestEntry = { key: cacheKey, age };\n }\n }\n\n return {\n size: this.flagCache.size,\n keys,\n oldestEntry,\n newestEntry\n };\n }\n\n // Check if a flag exists in cache\n public hasCachedFlag(key: string): boolean {\n return this.flagCache.has(key);\n }\n\n // Get all cached flags (for debugging)\n public getAllCachedFlags(): Record<string, any> {\n const result: Record<string, any> = {};\n \n for (const [key, entry] of this.flagCache.entries()) {\n result[key] = entry.value;\n }\n \n return result;\n }\n\n // Preload specific flags\n public async preloadFlags(keys: string[]): Promise<void> {\n const missing = keys.filter(key => !this.hasCachedFlag(key));\n \n if (missing.length > 0) {\n await this.fetchFlags();\n }\n }\n\n public shutdown(): void {\n this.closeRealtimeUpdates();\n this.flagCache.clear();\n }\n}","import { EventBatch, ErrorBatch, UnsubscribeFn } from './types';\nimport { Transport } from './transport';\n\nconst DB_NAME = 'ExperienceSDKOffline';\nconst DB_VERSION = 1;\nconst EVENTS_STORE = 'events';\nconst ERRORS_STORE = 'errors';\nconst MAX_OFFLINE_ITEMS = 1000;\n\ninterface StoredBatch {\n id: string;\n timestamp: number;\n type: 'events' | 'errors';\n data: EventBatch | ErrorBatch;\n retryCount: number;\n}\n\nexport class OfflineQueue {\n private transport: Transport;\n private db: IDBDatabase | null = null;\n private debug: boolean;\n private isInitialized = false;\n private unsubscribeFns: UnsubscribeFn[] = [];\n private isProcessing = false;\n\n constructor(transport: Transport, debug: boolean = false) {\n this.transport = transport;\n this.debug = debug;\n \n this.initialize();\n this.setupOnlineListener();\n }\n\n private async initialize(): Promise<void> {\n if (typeof indexedDB === 'undefined') {\n if (this.debug) {\n console.warn('[ExperienceSDK] IndexedDB not available, offline queue disabled');\n }\n return;\n }\n\n try {\n this.db = await this.openDatabase();\n this.isInitialized = true;\n \n if (this.debug) {\n console.log('[ExperienceSDK] Offline queue initialized');\n }\n \n // Process any stored items\n this.processStoredItems();\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to initialize offline queue:', error);\n }\n }\n }\n\n private openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n \n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n \n // Create events store\n if (!db.objectStoreNames.contains(EVENTS_STORE)) {\n const eventsStore = db.createObjectStore(EVENTS_STORE, { keyPath: 'id' });\n eventsStore.createIndex('timestamp', 'timestamp');\n eventsStore.createIndex('type', 'type');\n }\n \n // Create errors store \n if (!db.objectStoreNames.contains(ERRORS_STORE)) {\n const errorsStore = db.createObjectStore(ERRORS_STORE, { keyPath: 'id' });\n errorsStore.createIndex('timestamp', 'timestamp');\n errorsStore.createIndex('type', 'type');\n }\n };\n });\n }\n\n private setupOnlineListener(): void {\n if (typeof window === 'undefined') return;\n\n const handleOnline = () => {\n if (this.debug) {\n console.log('[ExperienceSDK] Network online, processing offline queue');\n }\n this.processStoredItems();\n };\n\n window.addEventListener('online', handleOnline);\n this.unsubscribeFns.push(() => \n window.removeEventListener('online', handleOnline)\n );\n }\n\n private generateId(): string {\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n public async storeEventBatch(batch: EventBatch): Promise<void> {\n if (!this.isInitialized || !this.db) return;\n\n const storedBatch: StoredBatch = {\n id: this.generateId(),\n timestamp: Date.now(),\n type: 'events',\n data: batch,\n retryCount: 0\n };\n\n try {\n await this.storeItem(EVENTS_STORE, storedBatch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Event batch stored offline:', storedBatch.id);\n }\n \n // Maintain max items limit\n this.cleanupOldItems(EVENTS_STORE);\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to store event batch offline:', error);\n }\n }\n }\n\n public async storeErrorBatch(batch: ErrorBatch): Promise<void> {\n if (!this.isInitialized || !this.db) return;\n\n const storedBatch: StoredBatch = {\n id: this.generateId(),\n timestamp: Date.now(),\n type: 'errors',\n data: batch,\n retryCount: 0\n };\n\n try {\n await this.storeItem(ERRORS_STORE, storedBatch);\n \n if (this.debug) {\n console.log('[ExperienceSDK] Error batch stored offline:', storedBatch.id);\n }\n \n // Maintain max items limit\n this.cleanupOldItems(ERRORS_STORE);\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to store error batch offline:', error);\n }\n }\n }\n\n private storeItem(storeName: string, item: StoredBatch): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n reject(new Error('Database not initialized'));\n return;\n }\n\n const transaction = this.db.transaction([storeName], 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.put(item);\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n\n private async cleanupOldItems(storeName: string): Promise<void> {\n if (!this.db) return;\n\n try {\n const items = await this.getAllItems(storeName);\n \n if (items.length > MAX_OFFLINE_ITEMS) {\n // Sort by timestamp and remove oldest items\n const itemsToRemove = items\n .sort((a, b) => a.timestamp - b.timestamp)\n .slice(0, items.length - MAX_OFFLINE_ITEMS);\n \n await Promise.all(\n itemsToRemove.map(item => this.removeItem(storeName, item.id))\n );\n \n if (this.debug) {\n console.log(`[ExperienceSDK] Cleaned up ${itemsToRemove.length} old offline items`);\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to cleanup old items:', error);\n }\n }\n }\n\n private getAllItems(storeName: string): Promise<StoredBatch[]> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n reject(new Error('Database not initialized'));\n return;\n }\n\n const transaction = this.db.transaction([storeName], 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n });\n }\n\n private removeItem(storeName: string, id: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n reject(new Error('Database not initialized'));\n return;\n }\n\n const transaction = this.db.transaction([storeName], 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.delete(id);\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n\n public async processStoredItems(): Promise<void> {\n if (!this.isInitialized || !this.db || this.isProcessing) return;\n \n // Check if we're online\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n if (this.debug) {\n console.log('[ExperienceSDK] Still offline, skipping queue processing');\n }\n return;\n }\n\n this.isProcessing = true;\n\n try {\n // Process events\n await this.processStoreItems(EVENTS_STORE);\n \n // Process errors\n await this.processStoreItems(ERRORS_STORE);\n } finally {\n this.isProcessing = false;\n }\n }\n\n private async processStoreItems(storeName: string): Promise<void> {\n try {\n const items = await this.getAllItems(storeName);\n \n if (items.length === 0) return;\n\n if (this.debug) {\n console.log(`[ExperienceSDK] Processing ${items.length} offline ${storeName}`);\n }\n\n // Sort by timestamp (oldest first)\n items.sort((a, b) => a.timestamp - b.timestamp);\n\n for (const item of items) {\n try {\n let success = false;\n\n if (storeName === EVENTS_STORE && item.type === 'events') {\n const result = await this.transport.sendEventBatch(item.data as EventBatch);\n success = result.success !== false;\n } else if (storeName === ERRORS_STORE && item.type === 'errors') {\n const result = await this.transport.sendErrorBatch(item.data as ErrorBatch);\n success = result.success !== false;\n }\n\n if (success) {\n // Remove successfully sent item\n await this.removeItem(storeName, item.id);\n \n if (this.debug) {\n console.log(`[ExperienceSDK] Offline ${item.type} sent successfully:`, item.id);\n }\n } else {\n throw new Error('Send failed');\n }\n } catch (error) {\n if (this.debug) {\n console.error(`[ExperienceSDK] Failed to send offline ${item.type}:`, error);\n }\n\n // Increment retry count\n item.retryCount++;\n \n // Remove after too many retries (to prevent infinite growth)\n if (item.retryCount >= 3) {\n await this.removeItem(storeName, item.id);\n \n if (this.debug) {\n console.log(`[ExperienceSDK] Removing ${item.type} after ${item.retryCount} retries:`, item.id);\n }\n } else {\n // Update retry count in storage\n await this.storeItem(storeName, item);\n }\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error(`[ExperienceSDK] Failed to process offline ${storeName}:`, error);\n }\n }\n }\n\n // Get queue status for debugging\n public async getQueueStatus(): Promise<{\n events: number;\n errors: number;\n isOnline: boolean;\n isInitialized: boolean;\n }> {\n let eventCount = 0;\n let errorCount = 0;\n\n if (this.isInitialized && this.db) {\n try {\n const events = await this.getAllItems(EVENTS_STORE);\n const errors = await this.getAllItems(ERRORS_STORE);\n \n eventCount = events.length;\n errorCount = errors.length;\n } catch (error) {\n // Ignore errors for status check\n }\n }\n\n return {\n events: eventCount,\n errors: errorCount,\n isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n isInitialized: this.isInitialized\n };\n }\n\n // Clear all offline data\n public async clear(): Promise<void> {\n if (!this.isInitialized || !this.db) return;\n\n try {\n const transaction = this.db.transaction([EVENTS_STORE, ERRORS_STORE], 'readwrite');\n \n await Promise.all([\n new Promise<void>((resolve, reject) => {\n const request = transaction.objectStore(EVENTS_STORE).clear();\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n }),\n new Promise<void>((resolve, reject) => {\n const request = transaction.objectStore(ERRORS_STORE).clear();\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n })\n ]);\n\n if (this.debug) {\n console.log('[ExperienceSDK] Offline queue cleared');\n }\n } catch (error) {\n if (this.debug) {\n console.error('[ExperienceSDK] Failed to clear offline queue:', error);\n }\n }\n }\n\n public shutdown(): void {\n // Clean up listeners\n this.unsubscribeFns.forEach(fn => fn());\n this.unsubscribeFns = [];\n\n // Close database\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n\n this.isInitialized = false;\n }\n}","import {\n ExperienceConfig,\n ResolvedExperienceConfig,\n TrackEvent,\n PageContext,\n ElementContext,\n Severity\n} from './types';\nimport { SessionManager } from './session';\nimport { Transport } from './transport';\nimport { EventBatcher } from './batch';\nimport { BreadcrumbManager } from './breadcrumbs';\nimport { HeatmapTracker } from './heatmap';\nimport { ErrorCapture } from './errors';\nimport { AutoTracker } from './auto-track';\nimport { DataTTracker } from './data-t';\nimport { FeatureFlagClient } from './flags';\nimport { OfflineQueue } from './offline';\n\nexport class Experience {\n private static instance: Experience | null = null;\n \n private config: ResolvedExperienceConfig;\n private sessionManager: SessionManager;\n private transport: Transport;\n private batcher: EventBatcher;\n private breadcrumbManager: BreadcrumbManager;\n private heatmapTracker: HeatmapTracker;\n private errorCapture: ErrorCapture;\n private autoTracker: AutoTracker;\n private dataTTracker: DataTTracker;\n private flagClient: FeatureFlagClient;\n private offlineQueue: OfflineQueue;\n private isShutdown = false;\n private isInSample = true;\n\n private constructor(config: ExperienceConfig) {\n this.config = this.resolveConfig(config);\n \n // Check sample rate at session level\n this.isInSample = Math.random() < this.config.sampleRate;\n \n if (this.config.debug) {\n console.log('[ExperienceSDK] Initializing with config:', this.config);\n console.log('[ExperienceSDK] In sample:', this.isInSample);\n }\n\n // Initialize core components\n this.sessionManager = new SessionManager();\n this.transport = new Transport({\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n debug: this.config.debug,\n useJSON: this.config.transport === 'json',\n });\n this.batcher = new EventBatcher(\n this.transport,\n this.config.batchIntervalMs,\n this.config.maxBatchSize,\n this.config.debug\n );\n \n // Initialize optional components\n this.breadcrumbManager = new BreadcrumbManager();\n this.heatmapTracker = new HeatmapTracker(this.batcher, this.sessionManager.getSessionId());\n this.errorCapture = new ErrorCapture(this.batcher, this.breadcrumbManager, this.sessionManager.getSessionId());\n this.autoTracker = new AutoTracker(this.batcher, this.sessionManager.getSessionId());\n this.dataTTracker = new DataTTracker(this.batcher, this.sessionManager.getSessionId());\n this.flagClient = new FeatureFlagClient(this.transport, this.config.appId, this.config.debug);\n this.offlineQueue = new OfflineQueue(this.transport, this.config.debug);\n\n this.setupFailureHandling();\n this.enableFeatures();\n }\n\n private resolveConfig(config: ExperienceConfig): ResolvedExperienceConfig {\n return {\n appId: config.appId,\n apiKey: config.apiKey,\n endpoint: config.endpoint || 'https://experience.shellapps.com',\n enableTracking: config.enableTracking ?? true,\n enableErrorCapture: config.enableErrorCapture ?? true,\n enableHeatmaps: config.enableHeatmaps ?? false,\n enableBreadcrumbs: config.enableBreadcrumbs ?? true,\n sampleRate: Math.max(0, Math.min(1, config.sampleRate ?? 1.0)),\n batchIntervalMs: config.batchIntervalMs ?? 2000,\n maxBatchSize: config.maxBatchSize ?? 50,\n debug: config.debug ?? false,\n transport: config.transport ?? 'json',\n };\n }\n\n private setupFailureHandling(): void {\n // Hook into the batcher to handle failures with offline queue\n const originalSendEventBatch = this.transport.sendEventBatch.bind(this.transport);\n const originalSendErrorBatch = this.transport.sendErrorBatch.bind(this.transport);\n\n this.transport.sendEventBatch = async (batch) => {\n try {\n return await originalSendEventBatch(batch);\n } catch (error) {\n // Store in offline queue on failure\n await this.offlineQueue.storeEventBatch(batch);\n throw error;\n }\n };\n\n this.transport.sendErrorBatch = async (batch) => {\n try {\n return await originalSendErrorBatch(batch);\n } catch (error) {\n // Store in offline queue on failure\n await this.offlineQueue.storeErrorBatch(batch);\n throw error;\n }\n };\n }\n\n private enableFeatures(): void {\n if (!this.isInSample) {\n if (this.config.debug) {\n console.log('[ExperienceSDK] Not in sample, features disabled');\n }\n return;\n }\n\n if (this.config.enableBreadcrumbs) {\n this.breadcrumbManager.enable();\n }\n\n if (this.config.enableErrorCapture) {\n this.errorCapture.enable();\n }\n\n if (this.config.enableTracking) {\n this.autoTracker.enable();\n this.dataTTracker.enable();\n }\n\n if (this.config.enableHeatmaps) {\n this.heatmapTracker.enable();\n }\n\n // Initialize flags\n this.flagClient.initialize().catch(error => {\n if (this.config.debug) {\n console.error('[ExperienceSDK] Failed to initialize flags:', error);\n }\n });\n }\n\n // Public API\n public track(eventType: string, metadata?: Record<string, string>): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableTracking) return;\n\n const pageContext = this.getCurrentPageContext();\n\n const trackEvent: TrackEvent = {\n eventType,\n sessionId: this.sessionManager.getSessionId(),\n timestamp: Date.now(),\n metadata,\n pageContext\n };\n\n this.batcher.addTrackEvent(trackEvent);\n\n if (this.config.debug) {\n console.log('[ExperienceSDK] Event tracked:', trackEvent);\n }\n }\n\n public trackPageView(): void {\n this.autoTracker.trackCurrentPage();\n }\n\n public captureError(error: Error, options?: {\n tags?: Record<string, string>;\n extra?: Record<string, any>;\n severity?: Severity;\n }): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableErrorCapture) return;\n\n this.errorCapture.captureException(error, options);\n }\n\n public captureMessage(message: string, severity?: string): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableErrorCapture) return;\n\n const sev = severity ? ErrorCapture.getSeverityFromString(severity) : Severity.INFO;\n this.errorCapture.captureMessage(message, sev);\n }\n\n public getFlag<T>(key: string, defaultValue: T): T {\n if (this.isShutdown) return defaultValue;\n \n return this.flagClient.getFlag(key, defaultValue);\n }\n\n public identify(profileId: string): void {\n if (this.isShutdown) return;\n\n this.flagClient.setProfileId(profileId);\n \n if (this.config.debug) {\n console.log('[ExperienceSDK] Profile identified:', profileId);\n }\n }\n\n public async shutdown(): Promise<void> {\n if (this.isShutdown) return;\n this.isShutdown = true;\n\n if (this.config.debug) {\n console.log('[ExperienceSDK] Shutting down...');\n }\n\n // Disable all features\n this.breadcrumbManager.disable();\n this.errorCapture.disable();\n this.heatmapTracker.disable();\n this.autoTracker.disable();\n this.dataTTracker.disable();\n\n // Final flush and cleanup\n await Promise.all([\n this.batcher.shutdown(),\n this.flagClient.shutdown(),\n this.offlineQueue.shutdown()\n ]);\n\n if (this.config.debug) {\n console.log('[ExperienceSDK] Shutdown complete');\n }\n }\n\n // Utility methods\n private getCurrentPageContext(): PageContext {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return {\n url: 'unknown',\n title: 'unknown',\n referrer: '',\n viewport: { width: 1920, height: 1080 }\n };\n }\n\n return {\n url: window.location.href,\n title: document.title || '',\n referrer: document.referrer || '',\n viewport: {\n width: window.innerWidth || 1920,\n height: window.innerHeight || 1080\n }\n };\n }\n\n // Debug methods\n public getSessionInfo(): {\n sessionId: string;\n duration: number;\n isInSample: boolean;\n } {\n return {\n sessionId: this.sessionManager.getSessionId(),\n duration: this.sessionManager.getSessionDuration(),\n isInSample: this.isInSample\n };\n }\n\n public async getQueueStatus(): Promise<{\n pendingEvents: number;\n pendingErrors: number;\n offlineQueue: {\n events: number;\n errors: number;\n isOnline: boolean;\n isInitialized: boolean;\n };\n }> {\n const offlineStatus = await this.offlineQueue.getQueueStatus();\n \n return {\n pendingEvents: this.batcher.getPendingEventCount(),\n pendingErrors: this.batcher.getPendingErrorCount(),\n offlineQueue: offlineStatus\n };\n }\n\n public getBreadcrumbs() {\n return this.breadcrumbManager.getBreadcrumbs();\n }\n\n public getFlagCacheInfo() {\n return this.flagClient.getCacheInfo();\n }\n\n // Manual flush for testing\n public async flush(): Promise<void> {\n if (this.isShutdown) return;\n \n await this.batcher.forceFlush();\n await this.offlineQueue.processStoredItems();\n }\n\n // Static factory method (singleton pattern)\n public static init(config: ExperienceConfig): Experience {\n if (Experience.instance) {\n if (config.debug) {\n console.warn('[ExperienceSDK] Already initialized, returning existing instance');\n }\n return Experience.instance;\n }\n\n Experience.instance = new Experience(config);\n return Experience.instance;\n }\n\n public static getInstance(): Experience | null {\n return Experience.instance;\n }\n\n // Advanced tracking methods\n public trackElement(element: Element, eventType: string): void {\n if (!this.isInSample || this.isShutdown || !this.config.enableTracking) return;\n\n const elementContext: ElementContext = {\n selector: this.getElementSelector(element),\n tag: element.tagName.toLowerCase(),\n dataT: element.getAttribute('data-t') || undefined\n };\n\n const trackEvent: TrackEvent = {\n eventType,\n sessionId: this.sessionManager.getSessionId(),\n timestamp: Date.now(),\n pageContext: this.getCurrentPageContext(),\n elementContext\n };\n\n this.batcher.addTrackEvent(trackEvent);\n }\n\n private getElementSelector(element: Element): string {\n try {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className && typeof element.className === 'string'\n ? `.${element.className.split(' ').filter(c => c.trim()).join('.')}`\n : '';\n \n return `${tag}${id}${className}`.slice(0, 100);\n } catch {\n return element.tagName?.toLowerCase() || 'unknown';\n }\n }\n}"],"mappings":"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","names":["Severity","HOVER_THRESHOLD_MS"]}
|