@product-intelligence-hub/sdk-web 0.4.0 → 0.4.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../sdk-core/src/errors.ts","../../sdk-core/src/utils.ts","../../sdk-core/src/identity.ts","../../sdk-core/src/queue.ts","../../sdk-core/src/session.ts","../../sdk-core/src/transport.ts","../../sdk-core/src/client.ts","../src/autocapture.ts","../src/beacon.ts","../src/bounce-back.ts","../src/context.ts","../src/engagement.ts","../src/error-tracker.ts","../src/performance.ts","../src/recording.ts","../src/storage.ts","../src/hooks.ts","../src/index.ts"],"names":["PIHError","_PIHError","message","code","details","__publicField","error","generateUUID","bytes","hex","b","c","r","getTimestamp","dateToTimestamp","date","getBackoffDelay","attempt","baseDelay","maxDelay","delay","STORAGE_PREFIX","STORAGE_KEYS","DEFAULTS","IdentityManager","storage","debug","storedAnonymousId","storedUserId","storedTraits","userId","traits","enabled","args","EventQueue","config","event","dropped","queuedEvent","options","batch","events","q","response","rejection","pihError","item","nextAttempt","backoff","stored","parsed","SessionManager","timeout","callbacks","storedSessionId","storedLastActivity","lastActivity","now","duration","endedSessionId","DEFAULT_SDK_META","Transport","url","apiEvents","e","body","data","payload","context","tenantId","meta","headers","blob","PIHClient","sessionId","err","refreshInterval","eventName","properties","key","defaultValue","newFlags","timestamp","storedSessionNumber","storedEventIndex","currentSessionId","UTM_STORAGE_KEY","UTM_PARAMS","DEFAULT_ATTRIBUTE_PREFIX","Autocapture","client","utmParams","originalPush","originalReplace","onNavigate","element","props","attrs","i","attr","target","actionAttr","el","actionElement","actionName","actionProps","elementTag","elementText","elementId","elementClasses","href","form","params","value","currentParams","BeaconManager","STORAGE_KEY","BounceBackDetector","anchor","pihAttributes","record","timeAway","detectDeviceType","ua","screenWidth","getConnectionType","getWebContext","getTimezone","connectionType","v","SCROLL_THRESHOLDS","EngagementTracker","scrollPercent","threshold","docHeight","viewportHeight","scrollTop","scrollableHeight","ErrorTracker","reason","stack","PerformanceTracker","webVitals","reportMetric","metric","RecordingManager","apiUrl","apiKey","matchedRule","rules","currentUrl","rule","rrweb","maskingConfig","maxDuration","currentSequence","x","y","click","recentClicks","firstClick","MemoryStorage","isLocalStorageAvailable","testKey","LocalStorageAdapter","createWebStorage","listeners","subscribe","listener","notifyFlagListeners","useFeatureFlag","getSnapshot","useCallback","getInstance","useSyncExternalStore","useFeatureFlags","WebPIHClient","T","webConfig","instance","init","resetInstance","PIH","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error codes for PIH SDK errors\n */\nexport type PIHErrorCode =\n | \"NETWORK_ERROR\"\n | \"INVALID_CONFIG\"\n | \"QUEUE_FULL\"\n | \"RATE_LIMITED\"\n | \"INVALID_PAYLOAD\"\n | \"STORAGE_ERROR\"\n | \"SESSION_ERROR\"\n | \"UNKNOWN_ERROR\";\n\n/**\n * Custom error class for PIH SDK\n */\nexport class PIHError extends Error {\n /** Error code for programmatic handling */\n public readonly code: PIHErrorCode;\n /** Additional error details */\n public readonly details?: unknown;\n\n constructor(message: string, code: PIHErrorCode, details?: unknown) {\n super(message);\n this.name = \"PIHError\";\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where error was thrown (V8 only)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PIHError);\n }\n }\n\n /**\n * Create a network error\n */\n static networkError(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"NETWORK_ERROR\", details);\n }\n\n /**\n * Create an invalid config error\n */\n static invalidConfig(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"INVALID_CONFIG\", details);\n }\n\n /**\n * Create a queue full error\n */\n static queueFull(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"QUEUE_FULL\", details);\n }\n\n /**\n * Create a rate limited error\n */\n static rateLimited(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"RATE_LIMITED\", details);\n }\n\n /**\n * Create an invalid payload error\n */\n static invalidPayload(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"INVALID_PAYLOAD\", details);\n }\n\n /**\n * Create a storage error\n */\n static storageError(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"STORAGE_ERROR\", details);\n }\n\n /**\n * Create a session error\n */\n static sessionError(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"SESSION_ERROR\", details);\n }\n\n /**\n * Convert unknown error to PIHError\n */\n static fromUnknown(error: unknown): PIHError {\n if (error instanceof PIHError) {\n return error;\n }\n if (error instanceof Error) {\n return new PIHError(error.message, \"UNKNOWN_ERROR\", error);\n }\n return new PIHError(String(error), \"UNKNOWN_ERROR\", error);\n }\n}\n","/**\n * Generate a UUID v4\n * Uses crypto.randomUUID if available, otherwise falls back to manual generation\n */\nexport function generateUUID(): string {\n // Use native crypto.randomUUID if available (modern browsers, Node.js 19+)\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n\n // Fallback implementation using crypto.getRandomValues\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.getRandomValues === \"function\"\n ) {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n\n // Set version (4) and variant (8, 9, A, or B)\n bytes[6] = (bytes[6]! & 0x0f) | 0x40;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n // Last resort fallback using Math.random (less secure but works everywhere)\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/**\n * Get current timestamp in ISO 8601 UTC format\n */\nexport function getTimestamp(): string {\n return new Date().toISOString();\n}\n\n/**\n * Get timestamp from Date in ISO 8601 UTC format\n */\nexport function dateToTimestamp(date: Date): string {\n return date.toISOString();\n}\n\n/**\n * Calculate exponential backoff delay\n * @param attempt - Current attempt number (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param maxDelay - Maximum delay in milliseconds (default: 16000)\n */\nexport function getBackoffDelay(\n attempt: number,\n baseDelay = 1000,\n maxDelay = 16000\n): number {\n const delay = baseDelay * Math.pow(2, attempt);\n return Math.min(delay, maxDelay);\n}\n\n/**\n * Check if a value is a plain object\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Deep clone a value using JSON serialization\n * Note: Does not preserve functions, undefined, or special objects\n */\nexport function deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * Merge two objects, with the second object's values taking precedence\n */\nexport function mergeObjects<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>\n): T {\n return { ...target, ...source };\n}\n\n/**\n * Create a debounced function\n */\nexport function debounce<T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): T {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return ((...args: unknown[]) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, delay);\n }) as T;\n}\n\n/**\n * Storage key prefix for all PIH SDK data\n */\nexport const STORAGE_PREFIX = \"pih_\";\n\n/**\n * Storage keys used by the SDK\n */\nexport const STORAGE_KEYS = {\n QUEUE: `${STORAGE_PREFIX}queue`,\n ANONYMOUS_ID: `${STORAGE_PREFIX}anonymous_id`,\n USER_ID: `${STORAGE_PREFIX}user_id`,\n USER_TRAITS: `${STORAGE_PREFIX}user_traits`,\n SESSION_ID: `${STORAGE_PREFIX}session_id`,\n SESSION_LAST_ACTIVITY: `${STORAGE_PREFIX}session_last_activity`,\n SESSION_NUMBER: `${STORAGE_PREFIX}session_number`,\n EVENT_INDEX: `${STORAGE_PREFIX}event_index`,\n FLAGS: `${STORAGE_PREFIX}flags`,\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULTS = {\n API_URL: \"https://repoingest-production.up.railway.app\",\n FLUSH_INTERVAL: 10000, // 10 seconds\n FLUSH_AT: 25, // events\n MAX_QUEUE_SIZE: 5000, // events\n SESSION_TIMEOUT: 1800000, // 30 minutes\n MAX_BATCH_SIZE: 100, // events per request\n MAX_RETRIES: 5,\n BASE_BACKOFF_DELAY: 1000, // 1 second\n MAX_BACKOFF_DELAY: 16000, // 16 seconds\n} as const;\n","import type { StorageAdapter } from \"./types.js\";\nimport { generateUUID, STORAGE_KEYS } from \"./utils.js\";\n\n/**\n * Identity manager for handling anonymous and user IDs\n */\nexport class IdentityManager {\n private anonymousId: string;\n private userId: string | null = null;\n private userTraits: Record<string, unknown> = {};\n private storage: StorageAdapter | null;\n private debug: boolean;\n\n constructor(storage: StorageAdapter | null, debug = false) {\n this.storage = storage;\n this.debug = debug;\n this.anonymousId = generateUUID();\n }\n\n /**\n * Initialize identity from storage\n */\n async initialize(): Promise<void> {\n if (!this.storage) {\n this.log(\"No storage adapter, using in-memory identity only\");\n return;\n }\n\n try {\n // Load anonymous ID\n const storedAnonymousId = await this.storage.get(\n STORAGE_KEYS.ANONYMOUS_ID\n );\n if (storedAnonymousId) {\n this.anonymousId = storedAnonymousId;\n this.log(\"Loaded anonymous ID from storage:\", this.anonymousId);\n } else {\n // Persist the generated anonymous ID\n await this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, this.anonymousId);\n this.log(\"Generated new anonymous ID:\", this.anonymousId);\n }\n\n // Load user ID\n const storedUserId = await this.storage.get(STORAGE_KEYS.USER_ID);\n if (storedUserId) {\n this.userId = storedUserId;\n this.log(\"Loaded user ID from storage:\", this.userId);\n }\n\n // Load user traits\n const storedTraits = await this.storage.get(STORAGE_KEYS.USER_TRAITS);\n if (storedTraits) {\n try {\n this.userTraits = JSON.parse(storedTraits);\n this.log(\"Loaded user traits from storage:\", this.userTraits);\n } catch {\n this.log(\"Failed to parse stored user traits\");\n }\n }\n } catch (error) {\n this.log(\"Error loading identity from storage:\", error);\n }\n }\n\n /**\n * Get the anonymous ID\n */\n getAnonymousId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get the user ID\n */\n getUserId(): string | null {\n return this.userId;\n }\n\n /**\n * Get user traits\n */\n getUserTraits(): Record<string, unknown> {\n return { ...this.userTraits };\n }\n\n /**\n * Set the user ID (identify the user)\n */\n async setUserId(userId: string): Promise<void> {\n this.userId = userId;\n this.log(\"Set user ID:\", userId);\n\n if (this.storage) {\n try {\n await this.storage.set(STORAGE_KEYS.USER_ID, userId);\n } catch (error) {\n this.log(\"Error persisting user ID:\", error);\n }\n }\n }\n\n /**\n * Set user traits\n */\n async setUserTraits(traits: Record<string, unknown>): Promise<void> {\n this.userTraits = { ...this.userTraits, ...traits };\n this.log(\"Set user traits:\", this.userTraits);\n\n if (this.storage) {\n try {\n await this.storage.set(\n STORAGE_KEYS.USER_TRAITS,\n JSON.stringify(this.userTraits)\n );\n } catch (error) {\n this.log(\"Error persisting user traits:\", error);\n }\n }\n }\n\n /**\n * Reset identity (logout)\n * Generates a new anonymous ID and clears user data\n */\n async reset(): Promise<void> {\n this.anonymousId = generateUUID();\n this.userId = null;\n this.userTraits = {};\n this.log(\"Identity reset, new anonymous ID:\", this.anonymousId);\n\n if (this.storage) {\n try {\n await Promise.all([\n this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, this.anonymousId),\n this.storage.remove(STORAGE_KEYS.USER_ID),\n this.storage.remove(STORAGE_KEYS.USER_TRAITS),\n ]);\n } catch (error) {\n this.log(\"Error resetting identity in storage:\", error);\n }\n }\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.debug = enabled;\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Identity]\", ...args);\n }\n }\n}\n","import { PIHError } from \"./errors.js\";\nimport type { Transport } from \"./transport.js\";\nimport type {\n TrackEvent,\n QueuedEvent,\n StorageAdapter,\n TransportOptions,\n} from \"./types.js\";\nimport { STORAGE_KEYS, DEFAULTS, getBackoffDelay } from \"./utils.js\";\n\n/**\n * Event queue configuration\n */\nexport interface EventQueueConfig {\n /** Events before auto-flush (default: 25) */\n flushAt: number;\n /** Milliseconds between auto-flushes (default: 10000) */\n flushInterval: number;\n /** Max queued events (default: 5000) */\n maxQueueSize: number;\n /** Storage adapter for persistence */\n storage: StorageAdapter | null;\n /** Transport for sending events */\n transport: Transport;\n /** Error callback */\n onError?: (error: PIHError, events: TrackEvent[]) => void;\n /** Debug mode */\n debug?: boolean;\n}\n\n/**\n * Event queue with persistence and retry logic\n */\nexport class EventQueue {\n private queue: QueuedEvent[] = [];\n private isFlushing = false;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n private config: EventQueueConfig;\n private initialized = false;\n\n constructor(config: EventQueueConfig) {\n this.config = {\n flushAt: config.flushAt ?? DEFAULTS.FLUSH_AT,\n flushInterval: config.flushInterval ?? DEFAULTS.FLUSH_INTERVAL,\n maxQueueSize: config.maxQueueSize ?? DEFAULTS.MAX_QUEUE_SIZE,\n storage: config.storage,\n transport: config.transport,\n onError: config.onError,\n debug: config.debug ?? false,\n };\n }\n\n /**\n * Initialize the queue (load persisted events)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await this.loadPersistedQueue();\n this.startFlushTimer();\n this.initialized = true;\n\n this.log(\"Queue initialized with\", this.queue.length, \"persisted events\");\n }\n\n /**\n * Add an event to the queue\n */\n async enqueue(event: TrackEvent): Promise<void> {\n // Enforce max queue size (drop oldest when full)\n while (this.queue.length >= this.config.maxQueueSize) {\n const dropped = this.queue.shift();\n if (dropped) {\n this.log(\"Queue full, dropping oldest event:\", dropped.event.event_id);\n this.config.onError?.(\n PIHError.queueFull(\"Queue full, dropped oldest event\", {\n dropped_event_id: dropped.event.event_id,\n }),\n [dropped.event]\n );\n }\n }\n\n // Add event to queue\n const queuedEvent: QueuedEvent = {\n event,\n attempts: 0,\n firstAttempt: Date.now(),\n };\n this.queue.push(queuedEvent);\n\n this.log(\"Enqueued event:\", event.event_id, \"Queue size:\", this.queue.length);\n\n // Persist queue\n await this.persistQueue();\n\n // Check if we should flush\n if (this.queue.length >= this.config.flushAt) {\n this.log(\"Queue reached flushAt threshold, flushing\");\n this.flush();\n }\n }\n\n /**\n * Flush the queue (send all events)\n */\n async flush(options?: TransportOptions): Promise<void> {\n if (this.isFlushing || this.queue.length === 0) {\n return;\n }\n\n this.isFlushing = true;\n this.log(\"Flushing\", this.queue.length, \"events\");\n\n try {\n // Take batch from queue (max 100 per request)\n const batch = this.queue.splice(0, DEFAULTS.MAX_BATCH_SIZE);\n const events = batch.map((q) => q.event);\n\n try {\n const response = await this.config.transport.sendEvents(events, options);\n\n // Handle rejections\n for (const rejection of response.rejected) {\n if (rejection.reason === \"rate_limited\") {\n // Re-queue rate limited events\n const queuedEvent = batch.find(\n (q) => q.event.event_id === rejection.event_id\n );\n if (queuedEvent && queuedEvent.attempts < DEFAULTS.MAX_RETRIES) {\n queuedEvent.attempts++;\n this.queue.unshift(queuedEvent);\n this.log(\n \"Rate limited event re-queued:\",\n rejection.event_id,\n \"attempt:\",\n queuedEvent.attempts\n );\n }\n } else {\n // Other rejections are permanent failures\n this.log(\n \"Event permanently rejected:\",\n rejection.event_id,\n rejection.reason,\n rejection.details\n );\n }\n }\n\n this.log(\n \"Flush complete. Accepted:\",\n response.stats.accepted,\n \"Rejected:\",\n response.stats.rejected\n );\n } catch (error) {\n const pihError = PIHError.fromUnknown(error);\n\n // Network error - re-queue all with backoff\n for (const item of batch) {\n if (item.attempts < DEFAULTS.MAX_RETRIES) {\n item.attempts++;\n this.queue.unshift(item);\n } else {\n this.log(\n \"Event dropped after max retries:\",\n item.event.event_id\n );\n }\n }\n\n // Schedule retry with backoff\n const nextAttempt = batch[0]?.attempts ?? 1;\n const backoff = getBackoffDelay(nextAttempt);\n this.log(\"Network error, scheduling retry in\", backoff, \"ms\");\n\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n this.flush(options);\n }, backoff);\n\n this.config.onError?.(pihError, events);\n }\n\n // Persist updated queue\n await this.persistQueue();\n\n // Continue flushing if there are more events\n if (this.queue.length >= this.config.flushAt) {\n // Use setImmediate/setTimeout to avoid blocking\n setTimeout(() => this.flush(options), 0);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Get the current queue length\n */\n getQueueLength(): number {\n return this.queue.length;\n }\n\n /**\n * Check if the queue is empty\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * Check if queue is currently flushing\n */\n isBusy(): boolean {\n return this.isFlushing;\n }\n\n /**\n * Clear the queue\n */\n async clear(): Promise<void> {\n this.queue = [];\n await this.persistQueue();\n this.log(\"Queue cleared\");\n }\n\n /**\n * Stop the queue (cancel timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n this.log(\"Queue destroyed\");\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.config.debug = enabled;\n }\n\n private async persistQueue(): Promise<void> {\n if (!this.config.storage) return;\n\n try {\n await this.config.storage.set(\n STORAGE_KEYS.QUEUE,\n JSON.stringify(this.queue)\n );\n } catch (error) {\n this.log(\"Error persisting queue:\", error);\n }\n }\n\n private async loadPersistedQueue(): Promise<void> {\n if (!this.config.storage) return;\n\n try {\n const stored = await this.config.storage.get(STORAGE_KEYS.QUEUE);\n if (stored) {\n const parsed = JSON.parse(stored) as QueuedEvent[];\n // Validate parsed data\n if (Array.isArray(parsed)) {\n this.queue = parsed.filter(\n (item) =>\n item &&\n typeof item === \"object\" &&\n \"event\" in item &&\n \"attempts\" in item\n );\n }\n }\n } catch (error) {\n this.log(\"Error loading persisted queue:\", error);\n this.queue = [];\n }\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) return;\n\n this.flushTimer = setInterval(() => {\n if (this.queue.length > 0) {\n this.log(\"Flush timer triggered\");\n this.flush();\n }\n }, this.config.flushInterval);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[PIH Queue]\", ...args);\n }\n }\n}\n","import type { StorageAdapter } from \"./types.js\";\nimport { generateUUID, STORAGE_KEYS, DEFAULTS } from \"./utils.js\";\n\n/**\n * Callback for session events\n */\nexport interface SessionCallbacks {\n onSessionStart?: (sessionId: string) => void;\n onSessionEnd?: (sessionId: string, duration: number) => void;\n}\n\n/**\n * Session manager for handling session tracking\n */\nexport class SessionManager {\n private sessionId: string | null = null;\n private sessionStartTime: number = 0;\n private lastActivity: number = 0;\n private timeout: number;\n private storage: StorageAdapter | null;\n private callbacks: SessionCallbacks;\n private debug: boolean;\n\n constructor(\n storage: StorageAdapter | null,\n timeout: number = DEFAULTS.SESSION_TIMEOUT,\n callbacks: SessionCallbacks = {},\n debug = false\n ) {\n this.storage = storage;\n this.timeout = timeout;\n this.callbacks = callbacks;\n this.debug = debug;\n }\n\n /**\n * Initialize session from storage\n */\n async initialize(): Promise<void> {\n if (!this.storage) {\n this.log(\"No storage adapter, using in-memory session only\");\n return;\n }\n\n try {\n const storedSessionId = await this.storage.get(STORAGE_KEYS.SESSION_ID);\n const storedLastActivity = await this.storage.get(\n STORAGE_KEYS.SESSION_LAST_ACTIVITY\n );\n\n if (storedSessionId && storedLastActivity) {\n const lastActivity = parseInt(storedLastActivity, 10);\n const now = Date.now();\n\n // Check if session is still valid\n if (now - lastActivity < this.timeout) {\n this.sessionId = storedSessionId;\n this.lastActivity = lastActivity;\n this.sessionStartTime = lastActivity; // Approximate\n this.log(\"Restored session from storage:\", this.sessionId);\n } else {\n // Session expired, clear it\n this.log(\"Stored session expired, will start new session\");\n await this.clearStoredSession();\n }\n }\n } catch (error) {\n this.log(\"Error loading session from storage:\", error);\n }\n }\n\n /**\n * Get the current session ID\n * Creates a new session if needed or if the current one expired\n */\n getSessionId(): string {\n const now = Date.now();\n\n // Check if session expired\n if (this.sessionId && now - this.lastActivity > this.timeout) {\n this.endSession();\n }\n\n // Start new session if needed\n if (!this.sessionId) {\n this.startSession();\n }\n\n // Update last activity\n this.lastActivity = now;\n this.persistLastActivity();\n\n return this.sessionId!;\n }\n\n /**\n * Touch the session to update last activity\n * Call this on each track event\n */\n touch(): void {\n if (this.sessionId) {\n this.lastActivity = Date.now();\n this.persistLastActivity();\n }\n }\n\n /**\n * Check if there's an active session\n */\n hasActiveSession(): boolean {\n if (!this.sessionId) return false;\n return Date.now() - this.lastActivity < this.timeout;\n }\n\n /**\n * Get the current session ID without creating a new one\n */\n getCurrentSessionId(): string | null {\n return this.sessionId;\n }\n\n /**\n * Get session duration in milliseconds\n */\n getSessionDuration(): number {\n if (!this.sessionId) return 0;\n return Date.now() - this.sessionStartTime;\n }\n\n /**\n * Start a new session\n */\n startSession(): void {\n const now = Date.now();\n this.sessionId = generateUUID();\n this.sessionStartTime = now;\n this.lastActivity = now;\n\n this.log(\"Started new session:\", this.sessionId);\n this.persistSession();\n\n // Notify callback\n this.callbacks.onSessionStart?.(this.sessionId);\n }\n\n /**\n * End the current session\n */\n endSession(): void {\n if (!this.sessionId) return;\n\n const duration = this.getSessionDuration();\n const endedSessionId = this.sessionId;\n\n this.log(\"Ended session:\", endedSessionId, \"duration:\", duration);\n\n // Clear session\n this.sessionId = null;\n this.sessionStartTime = 0;\n this.lastActivity = 0;\n this.clearStoredSession();\n\n // Notify callback\n this.callbacks.onSessionEnd?.(endedSessionId, duration);\n }\n\n /**\n * Force end the session (for app background, page hide, etc.)\n */\n forceEndSession(): void {\n if (this.sessionId) {\n this.endSession();\n }\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.debug = enabled;\n }\n\n /**\n * Set session timeout\n */\n setTimeout(timeout: number): void {\n this.timeout = timeout;\n }\n\n private async persistSession(): Promise<void> {\n if (!this.storage || !this.sessionId) return;\n\n try {\n await Promise.all([\n this.storage.set(STORAGE_KEYS.SESSION_ID, this.sessionId),\n this.storage.set(\n STORAGE_KEYS.SESSION_LAST_ACTIVITY,\n String(this.lastActivity)\n ),\n ]);\n } catch (error) {\n this.log(\"Error persisting session:\", error);\n }\n }\n\n private async persistLastActivity(): Promise<void> {\n if (!this.storage) return;\n\n try {\n await this.storage.set(\n STORAGE_KEYS.SESSION_LAST_ACTIVITY,\n String(this.lastActivity)\n );\n } catch (error) {\n this.log(\"Error persisting last activity:\", error);\n }\n }\n\n private async clearStoredSession(): Promise<void> {\n if (!this.storage) return;\n\n try {\n await Promise.all([\n this.storage.remove(STORAGE_KEYS.SESSION_ID),\n this.storage.remove(STORAGE_KEYS.SESSION_LAST_ACTIVITY),\n ]);\n } catch (error) {\n this.log(\"Error clearing stored session:\", error);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Session]\", ...args);\n }\n }\n}\n","import { PIHError } from \"./errors.js\";\nimport type {\n TrackEvent,\n TrackResponse,\n IdentifyPayload,\n IdentifyResponse,\n TransportOptions,\n SDKMeta,\n FeatureFlags,\n} from \"./types.js\";\n\n/**\n * Transport configuration\n */\nexport interface TransportConfig {\n /** API base URL */\n apiUrl: string;\n /** API key for authentication */\n apiKey: string;\n /** Tenant ID for multi-tenancy */\n tenantId?: string;\n /** Debug mode */\n debug?: boolean;\n /** SDK metadata for headers */\n sdkMeta?: SDKMeta;\n}\n\n/**\n * HTTP transport for sending events to the ingest API\n */\n/**\n * Default SDK metadata\n */\nconst DEFAULT_SDK_META: SDKMeta = {\n name: \"pih-sdk-core\",\n version: \"0.3.0\",\n};\n\nexport class Transport {\n private apiUrl: string;\n private apiKey: string;\n private tenantId?: string;\n private debug: boolean;\n private sdkMeta: SDKMeta;\n\n constructor(config: TransportConfig) {\n this.apiUrl = config.apiUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n this.apiKey = config.apiKey;\n this.tenantId = config.tenantId;\n this.debug = config.debug ?? false;\n this.sdkMeta = config.sdkMeta ?? DEFAULT_SDK_META;\n }\n\n /**\n * Send a batch of events to the track endpoint\n */\n async sendEvents(\n events: TrackEvent[],\n options?: TransportOptions\n ): Promise<TrackResponse> {\n const url = `${this.apiUrl}/v1/track`;\n const apiEvents = events.map((e) => this.toTrackApiPayload(e));\n const body = JSON.stringify({ events: apiEvents });\n\n this.log(\"Sending\", events.length, \"events to\", url);\n\n // Try sendBeacon first if requested (for page hide scenarios)\n if (options?.useBeacon && typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\") {\n const sent = this.sendViaBeacon(url, body);\n if (sent) {\n this.log(\"Events sent via sendBeacon\");\n // sendBeacon doesn't return response, assume success\n return {\n accepted: events.map((e) => ({\n event_id: e.event_id,\n timestamp: e.timestamp,\n })),\n rejected: [],\n stats: {\n received: events.length,\n accepted: events.length,\n rejected: 0,\n processing_time_ms: 0,\n },\n };\n }\n }\n\n // Standard fetch request\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: this.getHeaders(),\n body,\n keepalive: options?.useBeacon, // Keep connection alive for page hide\n });\n\n if (!response.ok) {\n if (response.status === 429) {\n throw PIHError.rateLimited(\n `Rate limited: ${response.statusText}`,\n { status: response.status }\n );\n }\n throw PIHError.networkError(\n `HTTP ${response.status}: ${response.statusText}`,\n { status: response.status }\n );\n }\n\n const data = (await response.json()) as TrackResponse;\n this.log(\"Track response:\", data);\n return data;\n } catch (error) {\n if (error instanceof PIHError) {\n throw error;\n }\n throw PIHError.networkError(\n `Failed to send events: ${error instanceof Error ? error.message : String(error)}`,\n error\n );\n }\n }\n\n /**\n * Send an identify call\n */\n async sendIdentify(payload: IdentifyPayload): Promise<IdentifyResponse> {\n const url = `${this.apiUrl}/v1/identify`;\n const body = JSON.stringify(this.toIdentifyApiPayload(payload));\n\n this.log(\"Sending identify to\", url, payload);\n\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: this.getHeaders(),\n body,\n });\n\n if (!response.ok) {\n if (response.status === 429) {\n throw PIHError.rateLimited(\n `Rate limited: ${response.statusText}`,\n { status: response.status }\n );\n }\n throw PIHError.networkError(\n `HTTP ${response.status}: ${response.statusText}`,\n { status: response.status }\n );\n }\n\n const data = (await response.json()) as IdentifyResponse;\n this.log(\"Identify response:\", data);\n return data;\n } catch (error) {\n if (error instanceof PIHError) {\n throw error;\n }\n throw PIHError.networkError(\n `Failed to send identify: ${error instanceof Error ? error.message : String(error)}`,\n error\n );\n }\n }\n\n /**\n * Fetch all flags for the authenticated project/environment\n */\n async fetchFlags(): Promise<FeatureFlags> {\n const url = `${this.apiUrl}/v1/flags`;\n this.log(\"Fetching flags from\", url);\n\n try {\n const response = await this.fetch(url, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw PIHError.networkError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { flags: FeatureFlags };\n this.log(\"Flags response:\", data);\n return data.flags;\n } catch (error) {\n if (error instanceof PIHError) throw error;\n throw PIHError.networkError(\n `Failed to fetch flags: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Evaluate flags for a user context\n */\n async evaluateFlags(context: {\n userId?: string | null;\n anonymousId?: string;\n userTraits?: Record<string, unknown>;\n }): Promise<FeatureFlags> {\n const url = `${this.apiUrl}/v1/flags/evaluate`;\n const body = JSON.stringify({\n userId: context.userId ?? undefined,\n anonymousId: context.anonymousId,\n userTraits: context.userTraits,\n });\n\n this.log(\"Evaluating flags at\", url);\n\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: this.getHeaders(),\n body,\n });\n\n if (!response.ok) {\n throw PIHError.networkError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { flags: FeatureFlags };\n this.log(\"Evaluate flags response:\", data);\n return data.flags;\n } catch (error) {\n if (error instanceof PIHError) throw error;\n throw PIHError.networkError(\n `Failed to evaluate flags: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Set tenant ID\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.debug = enabled;\n }\n\n /**\n * Set SDK metadata (used by platform-specific SDKs)\n */\n setSDKMeta(meta: SDKMeta): void {\n this.sdkMeta = meta;\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-SDK-Name\": this.sdkMeta.name,\n \"X-SDK-Version\": this.sdkMeta.version,\n };\n\n if (this.tenantId) {\n headers[\"X-Tenant-Id\"] = this.tenantId;\n }\n\n return headers;\n }\n\n /**\n * Map internal TrackEvent (snake_case) to API payload (camelCase)\n */\n private toTrackApiPayload(event: TrackEvent): Record<string, unknown> {\n return {\n eventId: event.event_id,\n eventName: event.event_name,\n timestamp: event.timestamp,\n anonymousId: event.anonymous_id,\n userId: event.user_id ?? undefined,\n sessionId: event.session_id ?? undefined,\n properties: event.properties,\n userTraits: event.user_traits,\n context: {\n platform: event.platform,\n appVersion: event.app_version ?? undefined,\n ...(event.context ?? {}),\n },\n };\n }\n\n /**\n * Map internal IdentifyPayload (snake_case) to API payload (camelCase)\n */\n private toIdentifyApiPayload(payload: IdentifyPayload): Record<string, unknown> {\n return {\n userId: payload.user_id,\n anonymousId: payload.anonymous_id,\n traits: payload.traits,\n timestamp: payload.timestamp,\n };\n }\n\n private sendViaBeacon(url: string, body: string): boolean {\n try {\n // Create blob with proper content type\n const blob = new Blob([body], { type: \"application/json\" });\n return navigator.sendBeacon(url, blob);\n } catch (error) {\n this.log(\"sendBeacon failed:\", error);\n return false;\n }\n }\n\n private async fetch(\n url: string,\n options: RequestInit\n ): Promise<Response> {\n // Use native fetch\n if (typeof fetch !== \"undefined\") {\n return fetch(url, options);\n }\n\n // This shouldn't happen in modern environments, but throw a clear error\n throw PIHError.networkError(\n \"fetch is not available in this environment\"\n );\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Transport]\", ...args);\n }\n }\n}\n","import { PIHError } from \"./errors.js\";\nimport { IdentityManager } from \"./identity.js\";\nimport { EventQueue } from \"./queue.js\";\nimport { SessionManager } from \"./session.js\";\nimport { Transport } from \"./transport.js\";\nimport type {\n PIHConfig,\n TrackEvent,\n TrackOptions,\n StorageAdapter,\n TransportOptions,\n FeatureFlags,\n} from \"./types.js\";\nimport { generateUUID, getTimestamp, dateToTimestamp, DEFAULTS, STORAGE_KEYS } from \"./utils.js\";\n\n/**\n * Base PIH client class\n * Platform-specific SDKs extend this class\n */\nexport class PIHClient {\n protected config: PIHConfig;\n protected storage: StorageAdapter | null = null;\n protected identity: IdentityManager;\n protected session: SessionManager;\n protected transport: Transport;\n protected queue: EventQueue;\n protected initialized = false;\n protected tenantId: string;\n protected sessionNumber = 0;\n protected eventIndex = 0;\n private lastSessionId: string | null = null;\n private flags: FeatureFlags = {};\n private flagRefreshTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: PIHConfig, storage: StorageAdapter | null = null) {\n this.validateConfig(config);\n\n this.config = {\n apiUrl: DEFAULTS.API_URL,\n debug: false,\n flushInterval: DEFAULTS.FLUSH_INTERVAL,\n flushAt: DEFAULTS.FLUSH_AT,\n maxQueueSize: DEFAULTS.MAX_QUEUE_SIZE,\n sessionTimeout: DEFAULTS.SESSION_TIMEOUT,\n ...config,\n };\n\n this.storage = storage;\n this.tenantId = config.tenantId ?? \"\";\n\n // Initialize identity manager\n this.identity = new IdentityManager(storage, this.config.debug);\n\n // Initialize session manager\n this.session = new SessionManager(\n storage,\n this.config.sessionTimeout,\n {\n onSessionStart: (sessionId) => {\n this.log(\"Session started:\", sessionId);\n // Track session_started event\n this.trackInternal(\"session_started\", { session_id: sessionId });\n },\n onSessionEnd: (sessionId, duration) => {\n this.log(\"Session ended:\", sessionId, \"duration:\", duration);\n // Track session_ended event\n this.trackInternal(\"session_ended\", {\n session_id: sessionId,\n duration_ms: duration,\n });\n },\n },\n this.config.debug\n );\n\n // Initialize transport\n this.transport = new Transport({\n apiUrl: this.config.apiUrl!,\n apiKey: this.config.apiKey,\n tenantId: this.tenantId,\n debug: this.config.debug,\n });\n\n // Initialize queue\n this.queue = new EventQueue({\n flushAt: this.config.flushAt!,\n flushInterval: this.config.flushInterval!,\n maxQueueSize: this.config.maxQueueSize!,\n storage,\n transport: this.transport,\n onError: (error, events) => {\n this.config.onError?.(error);\n this.log(\"Queue error:\", error.message, \"events:\", events.length);\n },\n debug: this.config.debug,\n });\n }\n\n /**\n * Initialize the client (load persisted state)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await Promise.all([\n this.identity.initialize(),\n this.session.initialize(),\n this.queue.initialize(),\n ]);\n\n // Load persisted session number and event index\n await this.loadSessionEnrichment();\n\n // Load cached flags from storage\n await this.loadCachedFlags();\n\n this.initialized = true;\n this.log(\"Client initialized\");\n\n // Auto-fetch flags (non-blocking)\n if (this.config.featureFlags?.autoFetch !== false) {\n this.refreshFlags().catch((err) => {\n this.log(\"Auto-fetch flags error:\", err);\n });\n\n // Set up periodic refresh\n const refreshInterval = this.config.featureFlags?.refreshInterval ?? 300000; // 5 min\n if (refreshInterval > 0) {\n this.flagRefreshTimer = setInterval(() => {\n this.refreshFlags().catch((err) => {\n this.log(\"Flag refresh error:\", err);\n });\n }, refreshInterval);\n }\n }\n }\n\n /**\n * Set the tenant ID\n */\n setTenant(tenantId: string): void {\n this.tenantId = tenantId;\n this.transport.setTenantId(tenantId);\n this.log(\"Tenant set:\", tenantId);\n }\n\n /**\n * Identify the user\n */\n async identify(\n userId: string,\n traits?: Record<string, unknown>\n ): Promise<void> {\n await this.ensureInitialized();\n\n await this.identity.setUserId(userId);\n if (traits) {\n await this.identity.setUserTraits(traits);\n }\n\n // Send identify call to server\n try {\n await this.transport.sendIdentify({\n project_id: this.config.projectId,\n environment: this.config.environment,\n tenant_id: this.tenantId,\n anonymous_id: this.identity.getAnonymousId(),\n user_id: userId,\n traits,\n timestamp: getTimestamp(),\n });\n } catch (error) {\n const pihError = PIHError.fromUnknown(error);\n this.config.onError?.(pihError);\n this.log(\"Identify error:\", pihError.message);\n }\n\n // Refresh flags after identify (user context changed)\n if (this.config.featureFlags?.autoFetch !== false) {\n this.refreshFlags().catch((err) => {\n this.log(\"Post-identify flag refresh error:\", err);\n });\n }\n }\n\n /**\n * Set user traits without identifying\n */\n async setUserTraits(traits: Record<string, unknown>): Promise<void> {\n await this.ensureInitialized();\n await this.identity.setUserTraits(traits);\n }\n\n /**\n * Track an event\n */\n async track(\n eventName: string,\n properties?: Record<string, unknown>,\n options?: TrackOptions\n ): Promise<void> {\n await this.ensureInitialized();\n\n const event = this.createEvent(eventName, properties, options);\n\n // Touch session to update last activity\n this.session.touch();\n\n if (options?.immediate) {\n // Send immediately, bypassing queue\n try {\n await this.transport.sendEvents([event]);\n } catch (error) {\n const pihError = PIHError.fromUnknown(error);\n this.config.onError?.(pihError);\n this.log(\"Immediate track error:\", pihError.message);\n }\n } else {\n // Add to queue\n await this.queue.enqueue(event);\n }\n }\n\n /**\n * Flush the event queue\n */\n async flush(options?: TransportOptions): Promise<void> {\n await this.ensureInitialized();\n await this.queue.flush(options);\n }\n\n /**\n * Reset identity (logout)\n */\n async reset(): Promise<void> {\n await this.ensureInitialized();\n\n // End current session\n this.session.forceEndSession();\n\n // Reset identity\n await this.identity.reset();\n\n this.log(\"Client reset\");\n }\n\n /**\n * Enable/disable debug mode\n */\n setDebug(enabled: boolean): void {\n this.config.debug = enabled;\n this.identity.setDebug(enabled);\n this.session.setDebug(enabled);\n this.transport.setDebug(enabled);\n this.queue.setDebug(enabled);\n }\n\n /**\n * Get the anonymous ID\n */\n getAnonymousId(): string {\n return this.identity.getAnonymousId();\n }\n\n /**\n * Get the user ID\n */\n getUserId(): string | null {\n return this.identity.getUserId();\n }\n\n /**\n * Get the session ID\n */\n getSessionId(): string | null {\n return this.session.getCurrentSessionId();\n }\n\n /**\n * Get the queue length\n */\n getQueueLength(): number {\n return this.queue.getQueueLength();\n }\n\n /**\n * Check if a feature flag is enabled\n */\n isFeatureEnabled(key: string, defaultValue = false): boolean {\n return this.flags[key] ?? defaultValue;\n }\n\n /**\n * Get a feature flag value\n */\n getFeatureFlag(key: string, defaultValue = false): boolean {\n return this.flags[key] ?? defaultValue;\n }\n\n /**\n * Get all feature flags\n */\n getFeatureFlags(): FeatureFlags {\n return { ...this.flags };\n }\n\n /**\n * Refresh flags from the server\n */\n async refreshFlags(): Promise<void> {\n try {\n const newFlags = await this.transport.evaluateFlags({\n userId: this.identity.getUserId(),\n anonymousId: this.identity.getAnonymousId(),\n userTraits: this.identity.getUserTraits(),\n });\n\n this.flags = newFlags;\n this.persistFlags();\n this.config.featureFlags?.onFlagsUpdated?.(newFlags);\n this.log(\"Flags refreshed:\", Object.keys(newFlags).length, \"flags\");\n } catch (error) {\n this.log(\"Flag refresh error:\", error);\n }\n }\n\n /**\n * Destroy the client (cleanup)\n */\n destroy(): void {\n if (this.flagRefreshTimer) {\n clearInterval(this.flagRefreshTimer);\n this.flagRefreshTimer = null;\n }\n this.queue.destroy();\n this.log(\"Client destroyed\");\n }\n\n /**\n * Internal track method that doesn't require initialization\n * Used for session events during initialization\n */\n protected trackInternal(\n eventName: string,\n properties?: Record<string, unknown>\n ): void {\n const event = this.createEvent(eventName, properties);\n // Fire and forget - don't await\n this.queue.enqueue(event).catch((error) => {\n this.log(\"Internal track error:\", error);\n });\n }\n\n /**\n * Get additional context to include with every event.\n * Override in platform-specific subclasses to add browser/device context.\n */\n protected getContext(): Record<string, unknown> {\n return {};\n }\n\n /**\n * Create a track event\n */\n protected createEvent(\n eventName: string,\n properties?: Record<string, unknown>,\n options?: TrackOptions\n ): TrackEvent {\n const timestamp = options?.timestamp\n ? dateToTimestamp(options.timestamp)\n : getTimestamp();\n\n // Get session ID first (may create a new session)\n const sessionId = this.session.getSessionId();\n\n // Update session enrichment counters (must happen after getSessionId)\n this.updateSessionEnrichment();\n\n // Build context from subclass + session enrichment\n const context: Record<string, unknown> = {\n ...this.getContext(),\n sessionNumber: this.sessionNumber,\n eventIndex: this.eventIndex,\n };\n\n return {\n event_id: generateUUID(),\n timestamp,\n project_id: this.config.projectId,\n environment: this.config.environment,\n tenant_id: this.tenantId,\n event_name: eventName,\n anonymous_id: this.identity.getAnonymousId(),\n user_id: this.identity.getUserId(),\n session_id: sessionId,\n platform: this.config.platform,\n app_version: this.config.appVersion ?? null,\n properties: properties ?? {},\n user_traits: this.identity.getUserTraits(),\n context,\n };\n }\n\n /**\n * Ensure client is initialized\n */\n protected async ensureInitialized(): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n }\n\n /**\n * Validate configuration\n */\n protected validateConfig(config: PIHConfig): void {\n if (!config.apiKey) {\n throw PIHError.invalidConfig(\"apiKey is required\");\n }\n if (!config.projectId) {\n throw PIHError.invalidConfig(\"projectId is required\");\n }\n if (!config.environment) {\n throw PIHError.invalidConfig(\"environment is required\");\n }\n if (!config.platform) {\n throw PIHError.invalidConfig(\"platform is required\");\n }\n }\n\n /**\n * Load persisted session enrichment data (sessionNumber, eventIndex)\n */\n private async loadSessionEnrichment(): Promise<void> {\n if (!this.storage) return;\n\n try {\n const storedSessionNumber = await this.storage.get(STORAGE_KEYS.SESSION_NUMBER);\n const storedEventIndex = await this.storage.get(STORAGE_KEYS.EVENT_INDEX);\n\n if (storedSessionNumber) {\n this.sessionNumber = parseInt(storedSessionNumber, 10) || 0;\n }\n if (storedEventIndex) {\n this.eventIndex = parseInt(storedEventIndex, 10) || 0;\n }\n } catch (error) {\n this.log(\"Error loading session enrichment:\", error);\n }\n }\n\n /**\n * Update session enrichment counters.\n * Increments sessionNumber when a new session starts, resets eventIndex.\n * Increments eventIndex for every event.\n */\n private updateSessionEnrichment(): void {\n const currentSessionId = this.session.getCurrentSessionId();\n\n if (currentSessionId && currentSessionId !== this.lastSessionId) {\n // New session detected\n this.sessionNumber++;\n this.eventIndex = 0;\n this.lastSessionId = currentSessionId;\n this.persistSessionEnrichment();\n }\n\n this.eventIndex++;\n this.persistEventIndex();\n }\n\n private persistSessionEnrichment(): void {\n if (!this.storage) return;\n this.storage.set(STORAGE_KEYS.SESSION_NUMBER, String(this.sessionNumber)).catch((error) => {\n this.log(\"Error persisting session number:\", error);\n });\n }\n\n private persistEventIndex(): void {\n if (!this.storage) return;\n this.storage.set(STORAGE_KEYS.EVENT_INDEX, String(this.eventIndex)).catch((error) => {\n this.log(\"Error persisting event index:\", error);\n });\n }\n\n /**\n * Load cached flags from storage\n */\n private async loadCachedFlags(): Promise<void> {\n if (!this.storage) return;\n try {\n const stored = await this.storage.get(STORAGE_KEYS.FLAGS);\n if (stored) {\n this.flags = JSON.parse(stored);\n }\n } catch (error) {\n this.log(\"Error loading cached flags:\", error);\n }\n }\n\n /**\n * Persist current flags to storage\n */\n private persistFlags(): void {\n if (!this.storage) return;\n this.storage.set(STORAGE_KEYS.FLAGS, JSON.stringify(this.flags)).catch((error) => {\n this.log(\"Error persisting flags:\", error);\n });\n }\n\n protected log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[PIH Client]\", ...args);\n }\n }\n}\n","import type { PIHClient, AutocaptureConfig } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * UTM parameter storage key\n */\nconst UTM_STORAGE_KEY = \"pih_utm_params\";\n\n/**\n * UTM parameter names\n */\nconst UTM_PARAMS = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n] as const;\n\n/**\n * Default attribute prefix for action detection\n */\nconst DEFAULT_ATTRIBUTE_PREFIX = \"data-pih-\";\n\n/**\n * Autocapture manager for web SDK\n */\nexport class Autocapture {\n private client: PIHClient;\n private config: AutocaptureConfig;\n private attributePrefix: string;\n private cachedUtmParams: Record<string, string> | null = null;\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private boundHandleClick: (e: MouseEvent) => void;\n private boundHandlePopState: () => void;\n private boundHandleSubmit: (e: SubmitEvent) => void;\n\n constructor(client: PIHClient, config: AutocaptureConfig = {}) {\n this.client = client;\n this.config = {\n pageViews: config.pageViews !== false, // default: true\n clicks: config.clicks ?? false, // default: false\n clickSelector: config.clickSelector ?? \"[data-track]\",\n forms: config.forms ?? false, // default: false\n };\n this.attributePrefix = config.attributePrefix ?? DEFAULT_ATTRIBUTE_PREFIX;\n\n this.boundHandleClick = this.handleClick.bind(this);\n this.boundHandlePopState = this.handlePopState.bind(this);\n this.boundHandleSubmit = this.handleSubmit.bind(this);\n }\n\n /**\n * Start autocapture\n */\n start(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n // Load cached UTM params\n this.loadCachedUtmParams();\n\n // Setup page view tracking\n if (this.config.pageViews) {\n this.setupPageViews();\n // Track initial page view\n this.trackPageView();\n }\n\n // Always setup click tracking for data-pih-action detection\n this.setupClickTracking();\n\n // Setup form tracking\n if (this.config.forms) {\n this.setupFormTracking();\n }\n }\n\n /**\n * Stop autocapture\n */\n stop(): void {\n // Restore original history methods\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n this.originalPushState = null;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n this.originalReplaceState = null;\n }\n\n // Remove event listeners\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"popstate\", this.boundHandlePopState);\n }\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"click\", this.boundHandleClick, true);\n document.removeEventListener(\"submit\", this.boundHandleSubmit, true);\n }\n }\n\n /**\n * Manually track a page view\n */\n trackPageView(): void {\n const url = new URL(window.location.href);\n const utmParams = this.extractUtmParams(url);\n\n // Cache UTM params on first page view with UTM\n if (Object.keys(utmParams).length > 0 && !this.cachedUtmParams) {\n this.cachedUtmParams = utmParams;\n this.persistUtmParams(utmParams);\n }\n\n this.client.track(\"page_viewed\", {\n path: url.pathname,\n search: url.search,\n hash: url.hash,\n referrer: document.referrer || null,\n title: document.title,\n url: window.location.href,\n // Include UTM params (from current URL or cached)\n ...this.getUtmParams(url),\n });\n }\n\n /**\n * Setup page view tracking\n */\n private setupPageViews(): void {\n // Monkey-patch History API for SPA navigation\n this.originalPushState = history.pushState;\n this.originalReplaceState = history.replaceState;\n\n const originalPush = this.originalPushState!;\n const originalReplace = this.originalReplaceState!;\n const onNavigate = () => this.trackPageView();\n\n history.pushState = function (...args) {\n originalPush.apply(history, args);\n // Use setTimeout to ensure URL has been updated\n setTimeout(onNavigate, 0);\n };\n\n history.replaceState = function (...args) {\n originalReplace.apply(history, args);\n // Use setTimeout to ensure URL has been updated\n setTimeout(onNavigate, 0);\n };\n\n // Listen for popstate (back/forward navigation)\n window.addEventListener(\"popstate\", this.boundHandlePopState);\n }\n\n /**\n * Handle popstate event\n */\n private handlePopState(): void {\n this.trackPageView();\n }\n\n /**\n * Setup click tracking\n */\n private setupClickTracking(): void {\n document.addEventListener(\"click\", this.boundHandleClick, true);\n }\n\n /**\n * Collect all data-pih-* attributes from an element as properties.\n * Strips the prefix and converts hyphens to underscores for snake_case keys.\n */\n private collectActionAttributes(element: Element): Record<string, string> {\n const props: Record<string, string> = {};\n const attrs = element.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i]!;\n if (attr.name.startsWith(this.attributePrefix) && attr.name !== `${this.attributePrefix}action`) {\n const key = attr.name.slice(this.attributePrefix.length).replace(/-/g, \"_\");\n props[key] = attr.value;\n }\n }\n return props;\n }\n\n /**\n * Walk up the DOM from the target looking for an element with the action attribute.\n */\n private findActionElement(target: Element): Element | null {\n const actionAttr = `${this.attributePrefix}action`;\n let el: Element | null = target;\n while (el) {\n if (el.hasAttribute(actionAttr)) {\n return el;\n }\n el = el.parentElement;\n }\n return null;\n }\n\n /**\n * Handle click event\n */\n private handleClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n if (!target) return;\n\n // Check for deprecated data-track attribute\n const dataTrackElement = target.closest(\"[data-track]\");\n if (dataTrackElement) {\n console.warn(\"[PIH] data-track is deprecated. Use data-pih-action instead.\");\n }\n\n // Walk up DOM looking for data-pih-action\n const actionElement = this.findActionElement(target);\n\n if (actionElement) {\n const actionName = actionElement.getAttribute(`${this.attributePrefix}action`)!;\n const actionProps = this.collectActionAttributes(actionElement);\n\n this.client.track(\"$action\", {\n action_name: actionName,\n ...actionProps,\n path: window.location.pathname,\n });\n return;\n }\n\n // Fallback: emit $click if clicks config is enabled\n if (!this.config.clicks) return;\n\n // Get element properties for generic click tracking\n const elementTag = target.tagName.toLowerCase();\n const elementText = (target.textContent || \"\").trim().slice(0, 100);\n const elementId = target.id || null;\n const elementClasses = target.className || null;\n const href =\n target instanceof HTMLAnchorElement ? target.href : null;\n\n this.client.track(\"$click\", {\n element_tag: elementTag,\n element_text: elementText,\n element_id: elementId,\n element_classes: elementClasses,\n href,\n path: window.location.pathname,\n });\n }\n\n /**\n * Setup form submission tracking\n */\n private setupFormTracking(): void {\n document.addEventListener(\"submit\", this.boundHandleSubmit, true);\n }\n\n /**\n * Handle form submit event\n */\n private handleSubmit(event: SubmitEvent): void {\n const form = event.target as HTMLFormElement | null;\n if (!form || !(form instanceof HTMLFormElement)) return;\n\n this.client.track(\"form_submitted\", {\n form_id: form.id || undefined,\n form_action: form.action || undefined,\n form_method: (form.method || \"get\").toUpperCase(),\n field_count: form.elements.length,\n });\n }\n\n /**\n * Extract UTM parameters from URL\n */\n private extractUtmParams(url: URL): Record<string, string> {\n const params: Record<string, string> = {};\n for (const key of UTM_PARAMS) {\n const value = url.searchParams.get(key);\n if (value) {\n params[key] = value;\n }\n }\n return params;\n }\n\n /**\n * Get UTM parameters (current URL or cached)\n */\n private getUtmParams(url: URL): Record<string, string> {\n // First check current URL\n const currentParams = this.extractUtmParams(url);\n if (Object.keys(currentParams).length > 0) {\n return currentParams;\n }\n\n // Fall back to cached params\n return this.cachedUtmParams ?? {};\n }\n\n /**\n * Load cached UTM params from storage\n */\n private loadCachedUtmParams(): void {\n try {\n const stored = localStorage.getItem(UTM_STORAGE_KEY);\n if (stored) {\n this.cachedUtmParams = JSON.parse(stored);\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n /**\n * Persist UTM params to storage\n */\n private persistUtmParams(params: Record<string, string>): void {\n try {\n localStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(params));\n } catch {\n // Ignore storage errors\n }\n }\n}\n","import type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Beacon manager for flushing events on page hide\n */\nexport class BeaconManager {\n private client: PIHClient;\n private boundHandleVisibilityChange: () => void;\n private boundHandleBeforeUnload: () => void;\n\n constructor(client: PIHClient) {\n this.client = client;\n this.boundHandleVisibilityChange = this.handleVisibilityChange.bind(this);\n this.boundHandleBeforeUnload = this.handleBeforeUnload.bind(this);\n }\n\n /**\n * Start listening for visibility and unload events\n */\n start(): void {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", this.boundHandleBeforeUnload);\n // Also listen for pagehide which is more reliable on mobile\n window.addEventListener(\"pagehide\", this.boundHandleBeforeUnload);\n }\n }\n\n /**\n * Stop listening for events\n */\n stop(): void {\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", this.boundHandleBeforeUnload);\n window.removeEventListener(\"pagehide\", this.boundHandleBeforeUnload);\n }\n }\n\n /**\n * Handle visibility change\n */\n private handleVisibilityChange(): void {\n if (document.visibilityState === \"hidden\") {\n this.flushWithBeacon();\n }\n }\n\n /**\n * Handle before unload\n */\n private handleBeforeUnload(): void {\n this.flushWithBeacon();\n }\n\n /**\n * Flush events using sendBeacon\n */\n private flushWithBeacon(): void {\n // Use sendBeacon for reliability when page is closing\n this.client.flush({ useBeacon: true }).catch(() => {\n // Ignore errors during page unload\n });\n }\n}\n\n/**\n * Check if sendBeacon is available\n */\nexport function isSendBeaconAvailable(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n typeof navigator.sendBeacon === \"function\"\n );\n}\n","import type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\nexport interface BounceBackConfig {\n enabled?: boolean;\n thresholdSeconds?: number;\n}\n\nconst STORAGE_KEY = \"pih_outbound\";\n\ninterface OutboundRecord {\n url: string;\n timestamp: number;\n pihAttributes: Record<string, string>;\n}\n\nexport class BounceBackDetector {\n private client: PIHClient;\n private thresholdMs: number;\n private boundHandleClick: (e: MouseEvent) => void;\n\n constructor(client: PIHClient, config: BounceBackConfig = {}) {\n this.client = client;\n this.thresholdMs = (config.thresholdSeconds ?? 30) * 1000;\n this.boundHandleClick = this.handleClick.bind(this);\n }\n\n start(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n // Check for bounce-back on page load\n this.checkBounceBack();\n\n // Listen for outbound link clicks\n document.addEventListener(\"click\", this.boundHandleClick, true);\n }\n\n stop(): void {\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"click\", this.boundHandleClick, true);\n }\n }\n\n private handleClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n if (!target) return;\n\n const anchor = target.closest(\"a\");\n if (!anchor || !anchor.href) return;\n\n // Check if external link\n try {\n const linkUrl = new URL(anchor.href);\n if (linkUrl.origin === window.location.origin) return;\n\n // Collect data-pih-* attributes from the anchor\n const pihAttributes: Record<string, string> = {};\n for (const attr of Array.from(anchor.attributes)) {\n if (attr.name.startsWith(\"data-pih-\")) {\n const key = attr.name.slice(\"data-pih-\".length).replace(/-/g, \"_\");\n pihAttributes[key] = attr.value;\n }\n }\n\n // Store outbound record in sessionStorage\n const record: OutboundRecord = {\n url: anchor.href,\n timestamp: Date.now(),\n pihAttributes,\n };\n\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(record));\n } catch {\n // Ignore storage errors\n }\n } catch {\n // Invalid URL, ignore\n }\n }\n\n private checkBounceBack(): void {\n try {\n const stored = sessionStorage.getItem(STORAGE_KEY);\n if (!stored) return;\n\n // Clean up immediately\n sessionStorage.removeItem(STORAGE_KEY);\n\n const record: OutboundRecord = JSON.parse(stored);\n const timeAway = Date.now() - record.timestamp;\n\n if (timeAway <= this.thresholdMs) {\n this.client.track(\"$bounce_back\", {\n original_click_url: record.url,\n time_away_seconds: Math.round(timeAway / 1000),\n page_returned_to: window.location.href,\n ...record.pihAttributes,\n });\n }\n } catch {\n // Ignore parse/storage errors\n }\n }\n}\n","/**\n * Browser context auto-detection\n * Collects screen, viewport, locale, timezone, connection, device, and page info\n */\n\n/**\n * Detect device type from user agent and screen dimensions\n */\nfunction detectDeviceType(): string {\n if (typeof navigator === \"undefined\" || typeof window === \"undefined\") {\n return \"unknown\";\n }\n\n const ua = navigator.userAgent.toLowerCase();\n\n // Check for tablets first (they can match mobile patterns)\n if (/ipad|tablet|playbook|silk/.test(ua)) {\n return \"tablet\";\n }\n\n // Check for mobile devices\n if (\n /mobile|iphone|ipod|android.*mobile|windows phone|blackberry|opera mini|opera mobi/.test(\n ua\n )\n ) {\n return \"mobile\";\n }\n\n // Fallback: use screen width heuristic\n const screenWidth = window.screen?.width ?? 0;\n if (screenWidth > 0 && screenWidth < 768) {\n return \"mobile\";\n }\n if (screenWidth >= 768 && screenWidth < 1024) {\n return \"tablet\";\n }\n\n return \"desktop\";\n}\n\n/**\n * Get the effective connection type if available\n */\nfunction getConnectionType(): string | undefined {\n if (typeof navigator === \"undefined\") return undefined;\n\n // navigator.connection is experimental and not in all browsers\n const nav = navigator as unknown as Record<string, unknown>;\n const conn = nav[\"connection\"] as\n | { effectiveType?: string }\n | undefined;\n\n return conn?.effectiveType ?? undefined;\n}\n\n/**\n * Collect browser context data.\n * Returns a Record matching EventContextSchema field names.\n */\nexport function getWebContext(): Record<string, unknown> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return {};\n }\n\n const context: Record<string, unknown> = {\n // Screen dimensions\n screenWidth: window.screen?.width ?? undefined,\n screenHeight: window.screen?.height ?? undefined,\n\n // Viewport dimensions\n viewportWidth: window.innerWidth ?? undefined,\n viewportHeight: window.innerHeight ?? undefined,\n\n // Locale and timezone\n locale: navigator?.language ?? undefined,\n timezone: getTimezone(),\n\n // Device type\n deviceType: detectDeviceType(),\n\n // Page info\n pageUrl: window.location.href,\n pagePath: window.location.pathname,\n pageTitle: document.title || undefined,\n referrer: document.referrer || undefined,\n };\n\n // Connection type (optional API)\n const connectionType = getConnectionType();\n if (connectionType) {\n context[\"connectionType\"] = connectionType;\n }\n\n // Remove undefined values to keep payload clean\n return Object.fromEntries(\n Object.entries(context).filter(([, v]) => v !== undefined)\n );\n}\n\n/**\n * Safely get timezone from Intl API\n */\nfunction getTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n}\n","/**\n * Engagement tracking for time-on-page and scroll depth.\n * Only activates when `autocapture.engagement: true`.\n */\n\nimport type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Scroll depth thresholds to track (percentage)\n */\nconst SCROLL_THRESHOLDS = [25, 50, 75, 100] as const;\n\n/**\n * EngagementTracker tracks visible time-on-page and scroll depth.\n */\nexport class EngagementTracker {\n private client: PIHClient | null = null;\n private started = false;\n\n // Time-on-page tracking\n private visibleStartTime = 0;\n private totalVisibleTime = 0;\n\n // Scroll depth tracking\n private reachedThresholds = new Set<number>();\n\n // Bound event handlers for cleanup\n private boundHandleVisibilityChange: () => void;\n private boundHandleScroll: () => void;\n\n constructor() {\n this.boundHandleVisibilityChange = this.handleVisibilityChange.bind(this);\n this.boundHandleScroll = this.handleScroll.bind(this);\n }\n\n /**\n * Start tracking engagement metrics.\n */\n start(client: PIHClient): void {\n if (this.started) return;\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n this.client = client;\n this.started = true;\n\n // Reset state\n this.visibleStartTime = Date.now();\n this.totalVisibleTime = 0;\n this.reachedThresholds.clear();\n\n // Start as visible if page is currently visible\n if (document.visibilityState === \"visible\") {\n this.visibleStartTime = Date.now();\n }\n\n // Listen for visibility changes (time-on-page)\n document.addEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n\n // Listen for scroll events (scroll depth)\n window.addEventListener(\"scroll\", this.boundHandleScroll, { passive: true });\n }\n\n /**\n * Stop tracking engagement metrics.\n */\n stop(): void {\n if (!this.started) return;\n\n // Send final page_engaged event if there was visible time\n this.accumulateVisibleTime();\n if (this.totalVisibleTime > 0 && this.client) {\n this.client.track(\"page_engaged\", {\n visible_duration_ms: this.totalVisibleTime,\n page_path: typeof window !== \"undefined\" ? window.location.pathname : undefined,\n });\n }\n\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n }\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"scroll\", this.boundHandleScroll);\n }\n\n this.started = false;\n this.client = null;\n }\n\n /**\n * Handle visibility change events\n */\n private handleVisibilityChange(): void {\n if (!this.started || !this.client) return;\n\n if (document.visibilityState === \"hidden\") {\n // Page hidden - accumulate visible time and send event\n this.accumulateVisibleTime();\n\n if (this.totalVisibleTime > 0) {\n this.client.track(\"page_engaged\", {\n visible_duration_ms: this.totalVisibleTime,\n page_path: window.location.pathname,\n });\n\n // Reset for next visible period\n this.totalVisibleTime = 0;\n }\n } else {\n // Page became visible again - restart timer\n this.visibleStartTime = Date.now();\n }\n }\n\n /**\n * Add elapsed visible time to total\n */\n private accumulateVisibleTime(): void {\n if (this.visibleStartTime > 0) {\n this.totalVisibleTime += Date.now() - this.visibleStartTime;\n this.visibleStartTime = Date.now();\n }\n }\n\n /**\n * Handle scroll events for depth tracking\n */\n private handleScroll(): void {\n if (!this.started || !this.client) return;\n\n const scrollPercent = this.getScrollPercent();\n\n for (const threshold of SCROLL_THRESHOLDS) {\n if (scrollPercent >= threshold && !this.reachedThresholds.has(threshold)) {\n this.reachedThresholds.add(threshold);\n this.client.track(\"scroll_depth_reached\", {\n depth_percent: threshold,\n page_path: window.location.pathname,\n });\n }\n }\n }\n\n /**\n * Calculate current scroll depth as a percentage (0-100)\n */\n private getScrollPercent(): number {\n const docHeight = Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight\n );\n const viewportHeight = window.innerHeight;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n const scrollableHeight = docHeight - viewportHeight;\n if (scrollableHeight <= 0) return 100; // No scrolling needed\n\n return Math.min(100, Math.round((scrollTop / scrollableHeight) * 100));\n }\n}\n","/**\n * Error tracking for uncaught errors and unhandled promise rejections.\n * Only activates when `autocapture.errorTracking: true`.\n * Caps at 10 errors per page load to prevent flooding.\n */\n\nimport type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Maximum number of errors to report per page load\n */\nconst MAX_ERRORS_PER_PAGE = 10;\n\n/**\n * ErrorTracker captures uncaught errors and unhandled rejections.\n */\nexport class ErrorTracker {\n private client: PIHClient | null = null;\n private started = false;\n private errorCount = 0;\n\n // Bound event handlers for cleanup\n private boundHandleError: (event: ErrorEvent) => void;\n private boundHandleRejection: (event: PromiseRejectionEvent) => void;\n\n constructor() {\n this.boundHandleError = this.handleError.bind(this);\n this.boundHandleRejection = this.handleRejection.bind(this);\n }\n\n /**\n * Start tracking errors.\n */\n start(client: PIHClient): void {\n if (this.started) return;\n if (typeof window === \"undefined\") return;\n\n this.client = client;\n this.started = true;\n this.errorCount = 0;\n\n window.addEventListener(\"error\", this.boundHandleError);\n window.addEventListener(\n \"unhandledrejection\",\n this.boundHandleRejection\n );\n }\n\n /**\n * Stop tracking errors.\n */\n stop(): void {\n if (!this.started) return;\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"error\", this.boundHandleError);\n window.removeEventListener(\n \"unhandledrejection\",\n this.boundHandleRejection\n );\n }\n\n this.started = false;\n this.client = null;\n }\n\n /**\n * Handle uncaught errors\n */\n private handleError(event: ErrorEvent): void {\n if (!this.started || !this.client) return;\n if (!this.canReport()) return;\n\n this.errorCount++;\n\n this.client.track(\"js_error\", {\n message: event.message || \"Unknown error\",\n filename: event.filename || undefined,\n lineno: event.lineno || undefined,\n colno: event.colno || undefined,\n stack: event.error?.stack || undefined,\n });\n }\n\n /**\n * Handle unhandled promise rejections\n */\n private handleRejection(event: PromiseRejectionEvent): void {\n if (!this.started || !this.client) return;\n if (!this.canReport()) return;\n\n this.errorCount++;\n\n const reason = event.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : typeof reason === \"string\"\n ? reason\n : \"Unhandled promise rejection\";\n const stack = reason instanceof Error ? reason.stack : undefined;\n\n this.client.track(\"js_error\", {\n message,\n filename: undefined,\n lineno: undefined,\n colno: undefined,\n stack,\n });\n }\n\n /**\n * Check if we can still report errors (under the cap)\n */\n private canReport(): boolean {\n return this.errorCount < MAX_ERRORS_PER_PAGE;\n }\n}\n","/**\n * Performance tracking using web-vitals library.\n * Tracks LCP, FID, CLS, INP, TTFB as `web_vital` events.\n * Only activates when `autocapture.performance: true`.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Web Vital metric shape (matches web-vitals library output)\n */\ninterface WebVitalMetric {\n name: string;\n value: number;\n rating: \"good\" | \"needs-improvement\" | \"poor\";\n}\n\n/**\n * Minimal type for the web-vitals module (optional peer dependency)\n */\ninterface WebVitalsModule {\n onLCP?: (cb: (metric: WebVitalMetric) => void) => void;\n onFID?: (cb: (metric: WebVitalMetric) => void) => void;\n onCLS?: (cb: (metric: WebVitalMetric) => void) => void;\n onINP?: (cb: (metric: WebVitalMetric) => void) => void;\n onTTFB?: (cb: (metric: WebVitalMetric) => void) => void;\n}\n\n/**\n * PerformanceTracker captures Web Vitals and sends them as events.\n */\nexport class PerformanceTracker {\n private client: PIHClient | null = null;\n private started = false;\n\n /**\n * Start tracking performance metrics.\n * Attempts to dynamically import web-vitals; silently no-ops if unavailable.\n */\n start(client: PIHClient): void {\n if (this.started) return;\n this.client = client;\n this.started = true;\n\n this.initWebVitals();\n }\n\n /**\n * Stop tracking performance metrics.\n */\n stop(): void {\n this.started = false;\n this.client = null;\n }\n\n private async initWebVitals(): Promise<void> {\n try {\n // Dynamic import so web-vitals is optional.\n // Use variable to prevent TypeScript from resolving the module statically.\n const moduleName = \"web-vitals\";\n const webVitals: WebVitalsModule = await import(/* webpackIgnore: true */ moduleName) as any;\n\n const reportMetric = (metric: WebVitalMetric) => {\n if (!this.started || !this.client) return;\n this.client.track(\"web_vital\", {\n name: metric.name,\n value: metric.value,\n rating: metric.rating,\n });\n };\n\n if (webVitals.onLCP) webVitals.onLCP(reportMetric);\n if (webVitals.onFID) webVitals.onFID(reportMetric);\n if (webVitals.onCLS) webVitals.onCLS(reportMetric);\n if (webVitals.onINP) webVitals.onINP(reportMetric);\n if (webVitals.onTTFB) webVitals.onTTFB(reportMetric);\n } catch {\n // web-vitals not installed - silently skip\n if (typeof console !== \"undefined\") {\n console.debug(\n \"[PIH] web-vitals package not found. Install it to enable performance tracking.\"\n );\n }\n }\n }\n}\n","import type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\nimport type { RecordingRule, MaskingConfig } from \"./recording-types.js\";\n\n/**\n * Recording config returned from the ingest API\n */\ninterface RecordingConfig {\n enabled: boolean;\n rules: RecordingRule[];\n maxDurationSeconds: number;\n maskingConfig: MaskingConfig;\n}\n\n/**\n * rrweb event type (loosely typed to avoid hard dependency)\n */\ntype RRWebEvent = Record<string, unknown>;\n\n/**\n * Stop function returned by rrweb record\n */\ntype RRWebStopFn = () => void;\n\n/**\n * Rage click state tracker\n */\ninterface RageClickState {\n clicks: Array<{ x: number; y: number; timestamp: number }>;\n}\n\nconst BUFFER_MAX_EVENTS = 50;\nconst BUFFER_FLUSH_INTERVAL_MS = 5_000;\nconst RAGE_CLICK_THRESHOLD = 3;\nconst RAGE_CLICK_WINDOW_MS = 500;\nconst RAGE_CLICK_RADIUS_PX = 30;\n\n/**\n * RecordingManager handles session recording via rrweb.\n * - Fetches recording config from the ingest API\n * - Evaluates rules client-side\n * - Dynamically imports rrweb and starts recording\n * - Buffers events and flushes to the ingest API\n * - Enforces duration cap\n * - Detects rage clicks\n */\nexport class RecordingManager {\n private client: PIHClient;\n private apiUrl: string;\n private apiKey: string;\n private config: RecordingConfig | null = null;\n private buffer: RRWebEvent[] = [];\n private sequence = 0;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private durationTimer: ReturnType<typeof setTimeout> | null = null;\n private rrwebStop: RRWebStopFn | null = null;\n private sessionId: string | null = null;\n private recording = false;\n private rageClickState: RageClickState = { clicks: [] };\n private debug: boolean;\n private matchedRule: string | null = null;\n\n constructor(client: PIHClient, apiUrl: string, apiKey: string, debug = false) {\n this.client = client;\n this.apiUrl = apiUrl.replace(/\\/$/, \"\");\n this.apiKey = apiKey;\n this.debug = debug;\n }\n\n /**\n * Start the recording manager: fetch config, evaluate rules, begin recording if matched\n */\n async start(): Promise<void> {\n try {\n await this.fetchConfig();\n\n if (!this.config || !this.config.enabled) {\n this.log(\"Recording not enabled\");\n return;\n }\n\n const matchedRule = this.evaluateRules(this.config.rules);\n if (!matchedRule) {\n this.log(\"No recording rule matched\");\n return;\n }\n\n this.matchedRule = matchedRule.type;\n\n // Check sample rate\n if (Math.random() > matchedRule.sampleRate) {\n this.log(\"Sampled out by rule\", matchedRule.type);\n return;\n }\n\n await this.startRecording();\n } catch (error) {\n this.log(\"Failed to start recording:\", error);\n }\n }\n\n /**\n * Stop recording and flush remaining events\n */\n stop(): void {\n if (this.rrwebStop) {\n this.rrwebStop();\n this.rrwebStop = null;\n }\n\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.durationTimer) {\n clearTimeout(this.durationTimer);\n this.durationTimer = null;\n }\n\n // Flush remaining events\n if (this.buffer.length > 0) {\n this.flush().catch((err) => this.log(\"Final flush error:\", err));\n }\n\n this.recording = false;\n this.removeRageClickListener();\n this.log(\"Recording stopped\");\n }\n\n /**\n * Check if currently recording\n */\n isRecording(): boolean {\n return this.recording;\n }\n\n // ===============================\n // Private methods\n // ===============================\n\n private async fetchConfig(): Promise<void> {\n const url = `${this.apiUrl}/v1/recording-config`;\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch recording config: ${response.status}`);\n }\n\n const data = (await response.json()) as { config: RecordingConfig };\n this.config = data.config;\n this.log(\"Fetched recording config:\", this.config);\n }\n\n private evaluateRules(rules: RecordingRule[]): RecordingRule | null {\n const currentUrl = window.location.href;\n\n for (const rule of rules) {\n switch (rule.type) {\n case \"all_sessions\":\n return rule;\n\n case \"url_match\":\n if (rule.pattern) {\n try {\n const regex = new RegExp(rule.pattern);\n if (regex.test(currentUrl)) {\n return rule;\n }\n } catch {\n this.log(\"Invalid URL regex pattern:\", rule.pattern);\n }\n }\n break;\n\n case \"event_match\":\n // Event match rules are evaluated reactively when events are tracked.\n // For initial evaluation, skip — the SDK will check when events fire.\n break;\n\n case \"rage_click\":\n // Rage click detection is passive; always enable if rule exists.\n return rule;\n }\n }\n\n return null;\n }\n\n private async startRecording(): Promise<void> {\n if (this.recording) return;\n\n this.sessionId = this.client.getSessionId();\n if (!this.sessionId) {\n this.log(\"No session ID available, skipping recording\");\n return;\n }\n\n try {\n // Dynamically import rrweb\n // @ts-expect-error rrweb is a peer dependency, installed separately\n const rrweb = await import(\"rrweb\");\n\n const maskingConfig = this.config?.maskingConfig ?? {\n maskAllInputs: true,\n maskAllText: false,\n maskSelectors: [],\n unmaskSelectors: [],\n blockSelectors: [],\n };\n\n this.rrwebStop = rrweb.record({\n emit: (event: RRWebEvent) => {\n this.onEvent(event);\n },\n maskAllInputs: maskingConfig.maskAllInputs,\n maskTextSelector: maskingConfig.maskAllText ? \"*\" : undefined,\n maskInputOptions: {\n password: true,\n email: maskingConfig.maskAllInputs,\n },\n blockSelector: maskingConfig.blockSelectors.length > 0\n ? maskingConfig.blockSelectors.join(\", \")\n : undefined,\n });\n\n this.recording = true;\n\n // Set up buffer flush interval\n this.flushTimer = setInterval(() => {\n if (this.buffer.length > 0) {\n this.flush().catch((err) => this.log(\"Flush error:\", err));\n }\n }, BUFFER_FLUSH_INTERVAL_MS);\n\n // Set up duration cap\n const maxDuration = (this.config?.maxDurationSeconds ?? 600) * 1000;\n this.durationTimer = setTimeout(() => {\n this.log(\"Duration cap reached, stopping recording\");\n this.stop();\n }, maxDuration);\n\n // Set up rage click detection\n this.setupRageClickDetection();\n\n this.log(\"Recording started for session:\", this.sessionId);\n } catch (error) {\n this.log(\"Failed to import rrweb or start recording:\", error);\n }\n }\n\n private onEvent(event: RRWebEvent): void {\n this.buffer.push(event);\n\n if (this.buffer.length >= BUFFER_MAX_EVENTS) {\n this.flush().catch((err) => this.log(\"Buffer flush error:\", err));\n }\n }\n\n private async flush(): Promise<void> {\n if (this.buffer.length === 0 || !this.sessionId) return;\n\n const events = [...this.buffer];\n this.buffer = [];\n const currentSequence = this.sequence++;\n\n try {\n const url = `${this.apiUrl}/v1/recordings`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n sessionId: this.sessionId,\n sequence: currentSequence,\n events,\n pageUrl: window.location.href,\n triggerRule: this.matchedRule ?? undefined,\n }),\n });\n\n if (!response.ok) {\n this.log(\"Failed to upload recording chunk:\", response.status);\n // Re-add events to buffer on failure\n this.buffer.unshift(...events);\n } else {\n this.log(\"Uploaded chunk\", currentSequence, \"with\", events.length, \"events\");\n }\n } catch (error) {\n this.log(\"Failed to upload recording chunk:\", error);\n // Re-add events to buffer on failure\n this.buffer.unshift(...events);\n }\n }\n\n // ===============================\n // Rage click detection\n // ===============================\n\n private boundHandleClick: ((e: MouseEvent) => void) | null = null;\n\n private setupRageClickDetection(): void {\n this.boundHandleClick = this.handleClickForRageDetection.bind(this);\n document.addEventListener(\"click\", this.boundHandleClick, true);\n }\n\n private removeRageClickListener(): void {\n if (this.boundHandleClick) {\n document.removeEventListener(\"click\", this.boundHandleClick, true);\n this.boundHandleClick = null;\n }\n }\n\n private handleClickForRageDetection(event: MouseEvent): void {\n const now = Date.now();\n const { clientX: x, clientY: y } = event;\n\n // Remove old clicks outside the time window\n this.rageClickState.clicks = this.rageClickState.clicks.filter(\n (click) => now - click.timestamp < RAGE_CLICK_WINDOW_MS\n );\n\n this.rageClickState.clicks.push({ x, y, timestamp: now });\n\n // Check if we have enough clicks in the same area\n if (this.rageClickState.clicks.length >= RAGE_CLICK_THRESHOLD) {\n const recentClicks = this.rageClickState.clicks;\n const firstClick = recentClicks[0]!;\n\n const allNearby = recentClicks.every(\n (click) =>\n Math.abs(click.x - firstClick.x) <= RAGE_CLICK_RADIUS_PX &&\n Math.abs(click.y - firstClick.y) <= RAGE_CLICK_RADIUS_PX\n );\n\n if (allNearby) {\n this.client.track(\"rage_click\", {\n x: firstClick.x,\n y: firstClick.y,\n click_count: recentClicks.length,\n page_url: window.location.href,\n });\n\n // Reset to avoid repeated triggers\n this.rageClickState.clicks = [];\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Recording]\", ...args);\n }\n }\n}\n","import type { StorageAdapter } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * In-memory storage fallback when localStorage is unavailable\n */\nclass MemoryStorage implements StorageAdapter {\n private data = new Map<string, string>();\n\n async get(key: string): Promise<string | null> {\n return this.data.get(key) ?? null;\n }\n\n async set(key: string, value: string): Promise<void> {\n this.data.set(key, value);\n }\n\n async remove(key: string): Promise<void> {\n this.data.delete(key);\n }\n}\n\n/**\n * Check if localStorage is available\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = \"__pih_test__\";\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * localStorage adapter with fallback to in-memory storage\n */\nclass LocalStorageAdapter implements StorageAdapter {\n private fallback: MemoryStorage | null = null;\n private useLocalStorage: boolean;\n\n constructor() {\n this.useLocalStorage = isLocalStorageAvailable();\n if (!this.useLocalStorage) {\n this.fallback = new MemoryStorage();\n console.warn(\n \"[PIH] localStorage unavailable, using in-memory storage. Data will not persist across page loads.\"\n );\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (this.fallback) {\n return this.fallback.get(key);\n }\n\n try {\n return localStorage.getItem(key);\n } catch {\n // localStorage access might fail in some contexts\n if (!this.fallback) {\n this.fallback = new MemoryStorage();\n }\n return this.fallback.get(key);\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (this.fallback) {\n return this.fallback.set(key, value);\n }\n\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n // Handle quota exceeded or other errors\n if (!this.fallback) {\n this.fallback = new MemoryStorage();\n console.warn(\n \"[PIH] localStorage write failed, falling back to in-memory storage:\",\n error\n );\n }\n return this.fallback.set(key, value);\n }\n }\n\n async remove(key: string): Promise<void> {\n if (this.fallback) {\n return this.fallback.remove(key);\n }\n\n try {\n localStorage.removeItem(key);\n } catch {\n // Ignore removal errors\n }\n }\n}\n\n/**\n * Create the web storage adapter\n */\nexport function createWebStorage(): StorageAdapter {\n return new LocalStorageAdapter();\n}\n\n/**\n * Export the storage adapter singleton\n */\nexport const webStorage = createWebStorage();\n","import { useSyncExternalStore, useCallback } from \"react\";\n\nimport { getInstance } from \"./index.js\";\n\ntype Listener = () => void;\n\n// Simple pub/sub for flag changes\nconst listeners = new Set<Listener>();\n\nfunction subscribe(listener: Listener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/**\n * Notify all subscribers of flag changes.\n * Call this after refreshFlags() completes.\n */\nexport function notifyFlagListeners(): void {\n for (const listener of listeners) {\n listener();\n }\n}\n\n/**\n * React hook to check if a feature flag is enabled.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const isEnabled = useFeatureFlag(\"enable_ai_chat\");\n * if (!isEnabled) return null;\n * return <AIChatWidget />;\n * }\n * ```\n */\nexport function useFeatureFlag(key: string, defaultValue = false): boolean {\n const getSnapshot = useCallback(() => {\n const client = getInstance();\n return client?.isFeatureEnabled(key, defaultValue) ?? defaultValue;\n }, [key, defaultValue]);\n\n return useSyncExternalStore(subscribe, getSnapshot, () => defaultValue);\n}\n\n/**\n * React hook to get all feature flags.\n *\n * @example\n * ```tsx\n * function FlagDebugPanel() {\n * const flags = useFeatureFlags();\n * return <pre>{JSON.stringify(flags, null, 2)}</pre>;\n * }\n * ```\n */\nexport function useFeatureFlags(): Record<string, boolean> {\n const getSnapshot = useCallback(() => {\n const client = getInstance();\n return client?.getFeatureFlags() ?? {};\n }, []);\n\n // Return stable reference via JSON comparison\n return useSyncExternalStore(\n subscribe,\n getSnapshot,\n () => ({})\n );\n}\n","import {\n PIHClient,\n type PIHConfig,\n type StorageAdapter,\n} from \"@product-intelligence-hub/sdk-core\";\n\nimport { Autocapture } from \"./autocapture.js\";\nimport { BeaconManager } from \"./beacon.js\";\nimport { BounceBackDetector } from \"./bounce-back.js\";\nimport { getWebContext } from \"./context.js\";\nimport { EngagementTracker } from \"./engagement.js\";\nimport { ErrorTracker } from \"./error-tracker.js\";\nimport { PerformanceTracker } from \"./performance.js\";\nimport { RecordingManager } from \"./recording.js\";\nimport { createWebStorage } from \"./storage.js\";\n\n/**\n * Web-specific PIH configuration\n */\nexport interface WebPIHConfig extends Omit<PIHConfig, \"platform\"> {\n /** Platform is always \"web\" for web SDK */\n platform?: \"web\";\n}\n\n/**\n * Web PIH Client\n * Extends the base client with web-specific features\n */\nexport class WebPIHClient extends PIHClient {\n private autocapture: Autocapture | null = null;\n private beacon: BeaconManager;\n private performanceTracker: PerformanceTracker | null = null;\n private engagementTracker: EngagementTracker | null = null;\n private errorTracker: ErrorTracker | null = null;\n private bounceBackDetector: BounceBackDetector | null = null;\n private recordingManager: RecordingManager | null = null;\n\n constructor(config: WebPIHConfig, storage?: StorageAdapter) {\n // Ensure platform is set to \"web\"\n const webConfig: PIHConfig = {\n ...config,\n platform: \"web\",\n };\n\n // Use provided storage or create web storage\n super(webConfig, storage ?? createWebStorage());\n\n // Set SDK metadata for transport headers\n this.transport.setSDKMeta({\n name: \"pih-sdk-web\",\n version: \"0.4.0\",\n });\n\n // Setup beacon manager for flush on page hide\n this.beacon = new BeaconManager(this);\n }\n\n /**\n * Return browser context for every event\n */\n protected override getContext(): Record<string, unknown> {\n return getWebContext();\n }\n\n /**\n * Initialize the web client\n */\n override async initialize(): Promise<void> {\n await super.initialize();\n\n // Start beacon manager\n this.beacon.start();\n\n // Setup autocapture if configured\n if (this.config.autocapture) {\n this.autocapture = new Autocapture(this, this.config.autocapture);\n this.autocapture.start();\n\n // Setup performance tracking (opt-in)\n if (this.config.autocapture.performance) {\n this.performanceTracker = new PerformanceTracker();\n this.performanceTracker.start(this);\n }\n\n // Setup engagement tracking (opt-in)\n if (this.config.autocapture.engagement) {\n this.engagementTracker = new EngagementTracker();\n this.engagementTracker.start(this);\n }\n\n // Setup error tracking (opt-in)\n if (this.config.autocapture.errorTracking) {\n this.errorTracker = new ErrorTracker();\n this.errorTracker.start(this);\n }\n }\n\n // Setup bounce-back detection (opt-in)\n if (this.config.bounceBack?.enabled) {\n this.bounceBackDetector = new BounceBackDetector(this, this.config.bounceBack);\n this.bounceBackDetector.start();\n }\n\n // Setup session recording (opt-in)\n if (this.config.recording?.enabled) {\n this.recordingManager = new RecordingManager(\n this,\n this.config.apiUrl ?? \"https://repoingest-production.up.railway.app\",\n this.config.apiKey,\n this.config.debug\n );\n this.recordingManager.start().catch((error) => {\n this.log(\"Failed to start recording:\", error);\n });\n }\n\n this.log(\"Web client initialized\");\n }\n\n /**\n * Enable autocapture after initialization\n */\n enableAutocapture(config?: PIHConfig[\"autocapture\"]): void {\n if (this.autocapture) {\n this.autocapture.stop();\n }\n this.autocapture = new Autocapture(this, config);\n this.autocapture.start();\n }\n\n /**\n * Disable autocapture\n */\n disableAutocapture(): void {\n if (this.autocapture) {\n this.autocapture.stop();\n this.autocapture = null;\n }\n }\n\n /**\n * Manually track a page view\n */\n trackPageView(): void {\n if (this.autocapture) {\n this.autocapture.trackPageView();\n } else {\n // Track page view without autocapture\n const url = new URL(window.location.href);\n this.track(\"page_viewed\", {\n path: url.pathname,\n search: url.search,\n hash: url.hash,\n referrer: document.referrer || null,\n title: document.title,\n url: window.location.href,\n });\n }\n }\n\n /**\n * Destroy the client\n */\n override destroy(): void {\n this.beacon.stop();\n\n if (this.autocapture) {\n this.autocapture.stop();\n }\n if (this.performanceTracker) {\n this.performanceTracker.stop();\n this.performanceTracker = null;\n }\n if (this.engagementTracker) {\n this.engagementTracker.stop();\n this.engagementTracker = null;\n }\n if (this.errorTracker) {\n this.errorTracker.stop();\n this.errorTracker = null;\n }\n if (this.bounceBackDetector) {\n this.bounceBackDetector.stop();\n this.bounceBackDetector = null;\n }\n if (this.recordingManager) {\n this.recordingManager.stop();\n this.recordingManager = null;\n }\n\n super.destroy();\n }\n\n protected override log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[PIH Web]\", ...args);\n }\n }\n}\n\n/**\n * Singleton instance\n */\nlet instance: WebPIHClient | null = null;\n\n/**\n * Initialize the PIH Web SDK\n */\nfunction init(config: WebPIHConfig): WebPIHClient {\n if (instance) {\n console.warn(\"[PIH] SDK already initialized. Returning existing instance.\");\n return instance;\n }\n\n instance = new WebPIHClient(config);\n\n // Auto-initialize\n instance.initialize().catch((error) => {\n console.error(\"[PIH] Failed to initialize:\", error);\n });\n\n return instance;\n}\n\n/**\n * Get the current instance\n */\nfunction getInstance(): WebPIHClient | null {\n return instance;\n}\n\n/**\n * Reset the singleton (for testing)\n */\nfunction resetInstance(): void {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n}\n\n// Default export for UMD/IIFE\nconst PIH = {\n init,\n getInstance,\n resetInstance,\n WebPIHClient,\n};\n\nexport default PIH;\nexport { init, getInstance, resetInstance };\n\n// React hooks for feature flags\nexport { useFeatureFlag, useFeatureFlags, notifyFlagListeners } from \"./hooks.js\";\n\n// Re-export types from core\nexport type {\n PIHConfig,\n TrackEvent,\n TrackOptions,\n TransportOptions,\n AutocaptureConfig,\n FeatureFlags,\n FeatureFlagConfig,\n PIHError,\n PIHErrorCode,\n} from \"@product-intelligence-hub/sdk-core\";\n"]}
1
+ {"version":3,"sources":["../../sdk-core/src/errors.ts","../../sdk-core/src/utils.ts","../../sdk-core/src/identity.ts","../../sdk-core/src/queue.ts","../../sdk-core/src/session.ts","../../sdk-core/src/transport.ts","../../sdk-core/src/client.ts","../src/autocapture.ts","../src/beacon.ts","../src/bounce-back.ts","../src/context.ts","../src/engagement.ts","../src/error-tracker.ts","../src/performance.ts","../src/recording.ts","../src/storage.ts","../src/hooks.ts","../src/index.ts"],"names":["PIHError","_PIHError","message","code","details","__publicField","error","generateUUID","bytes","hex","b","c","r","getTimestamp","dateToTimestamp","date","getBackoffDelay","attempt","baseDelay","maxDelay","delay","STORAGE_PREFIX","STORAGE_KEYS","DEFAULTS","IdentityManager","storage","debug","storedAnonymousId","storedUserId","storedTraits","userId","traits","enabled","args","EventQueue","config","event","dropped","queuedEvent","options","batch","events","q","response","rejection","pihError","item","nextAttempt","backoff","stored","parsed","SessionManager","timeout","callbacks","storedSessionId","storedLastActivity","lastActivity","now","duration","endedSessionId","DEFAULT_SDK_META","Transport","url","apiEvents","e","body","data","payload","context","tenantId","meta","headers","PIHClient","defined","v","sessionId","err","refreshInterval","eventName","properties","key","defaultValue","newFlags","timestamp","storedSessionNumber","storedEventIndex","currentSessionId","UTM_STORAGE_KEY","UTM_PARAMS","DEFAULT_ATTRIBUTE_PREFIX","Autocapture","client","utmParams","originalPush","originalReplace","onNavigate","element","props","attrs","i","attr","target","actionAttr","el","actionElement","actionName","actionProps","elementTag","elementText","elementId","elementClasses","href","form","params","value","currentParams","BeaconManager","STORAGE_KEY","BounceBackDetector","anchor","pihAttributes","record","timeAway","detectDeviceType","ua","screenWidth","getConnectionType","getWebContext","getTimezone","connectionType","SCROLL_THRESHOLDS","EngagementTracker","scrollPercent","threshold","docHeight","viewportHeight","scrollTop","scrollableHeight","ErrorTracker","reason","stack","PerformanceTracker","webVitals","reportMetric","metric","RecordingManager","apiUrl","apiKey","matchedRule","rules","currentUrl","rule","rrweb","maskingConfig","maxDuration","currentSequence","x","y","click","recentClicks","firstClick","MemoryStorage","isLocalStorageAvailable","testKey","LocalStorageAdapter","createWebStorage","listeners","subscribe","listener","notifyFlagListeners","useFeatureFlag","getSnapshot","useCallback","getInstance","useSyncExternalStore","useFeatureFlags","WebPIHClient","T","webConfig","instance","init","resetInstance","PIH","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error codes for PIH SDK errors\n */\nexport type PIHErrorCode =\n | \"NETWORK_ERROR\"\n | \"INVALID_CONFIG\"\n | \"QUEUE_FULL\"\n | \"RATE_LIMITED\"\n | \"INVALID_PAYLOAD\"\n | \"STORAGE_ERROR\"\n | \"SESSION_ERROR\"\n | \"UNKNOWN_ERROR\";\n\n/**\n * Custom error class for PIH SDK\n */\nexport class PIHError extends Error {\n /** Error code for programmatic handling */\n public readonly code: PIHErrorCode;\n /** Additional error details */\n public readonly details?: unknown;\n\n constructor(message: string, code: PIHErrorCode, details?: unknown) {\n super(message);\n this.name = \"PIHError\";\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where error was thrown (V8 only)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PIHError);\n }\n }\n\n /**\n * Create a network error\n */\n static networkError(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"NETWORK_ERROR\", details);\n }\n\n /**\n * Create an invalid config error\n */\n static invalidConfig(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"INVALID_CONFIG\", details);\n }\n\n /**\n * Create a queue full error\n */\n static queueFull(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"QUEUE_FULL\", details);\n }\n\n /**\n * Create a rate limited error\n */\n static rateLimited(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"RATE_LIMITED\", details);\n }\n\n /**\n * Create an invalid payload error\n */\n static invalidPayload(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"INVALID_PAYLOAD\", details);\n }\n\n /**\n * Create a storage error\n */\n static storageError(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"STORAGE_ERROR\", details);\n }\n\n /**\n * Create a session error\n */\n static sessionError(message: string, details?: unknown): PIHError {\n return new PIHError(message, \"SESSION_ERROR\", details);\n }\n\n /**\n * Convert unknown error to PIHError\n */\n static fromUnknown(error: unknown): PIHError {\n if (error instanceof PIHError) {\n return error;\n }\n if (error instanceof Error) {\n return new PIHError(error.message, \"UNKNOWN_ERROR\", error);\n }\n return new PIHError(String(error), \"UNKNOWN_ERROR\", error);\n }\n}\n","/**\n * Generate a UUID v4\n * Uses crypto.randomUUID if available, otherwise falls back to manual generation\n */\nexport function generateUUID(): string {\n // Use native crypto.randomUUID if available (modern browsers, Node.js 19+)\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n\n // Fallback implementation using crypto.getRandomValues\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.getRandomValues === \"function\"\n ) {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n\n // Set version (4) and variant (8, 9, A, or B)\n bytes[6] = (bytes[6]! & 0x0f) | 0x40;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n // Last resort fallback using Math.random (less secure but works everywhere)\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/**\n * Get current timestamp in ISO 8601 UTC format\n */\nexport function getTimestamp(): string {\n return new Date().toISOString();\n}\n\n/**\n * Get timestamp from Date in ISO 8601 UTC format\n */\nexport function dateToTimestamp(date: Date): string {\n return date.toISOString();\n}\n\n/**\n * Calculate exponential backoff delay\n * @param attempt - Current attempt number (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param maxDelay - Maximum delay in milliseconds (default: 16000)\n */\nexport function getBackoffDelay(\n attempt: number,\n baseDelay = 1000,\n maxDelay = 16000\n): number {\n const delay = baseDelay * Math.pow(2, attempt);\n return Math.min(delay, maxDelay);\n}\n\n/**\n * Check if a value is a plain object\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Deep clone a value using JSON serialization\n * Note: Does not preserve functions, undefined, or special objects\n */\nexport function deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * Merge two objects, with the second object's values taking precedence\n */\nexport function mergeObjects<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>\n): T {\n return { ...target, ...source };\n}\n\n/**\n * Create a debounced function\n */\nexport function debounce<T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): T {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return ((...args: unknown[]) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, delay);\n }) as T;\n}\n\n/**\n * Storage key prefix for all PIH SDK data\n */\nexport const STORAGE_PREFIX = \"pih_\";\n\n/**\n * Storage keys used by the SDK\n */\nexport const STORAGE_KEYS = {\n QUEUE: `${STORAGE_PREFIX}queue`,\n ANONYMOUS_ID: `${STORAGE_PREFIX}anonymous_id`,\n USER_ID: `${STORAGE_PREFIX}user_id`,\n USER_TRAITS: `${STORAGE_PREFIX}user_traits`,\n SESSION_ID: `${STORAGE_PREFIX}session_id`,\n SESSION_LAST_ACTIVITY: `${STORAGE_PREFIX}session_last_activity`,\n SESSION_NUMBER: `${STORAGE_PREFIX}session_number`,\n EVENT_INDEX: `${STORAGE_PREFIX}event_index`,\n FLAGS: `${STORAGE_PREFIX}flags`,\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULTS = {\n API_URL: \"https://repoingest-production.up.railway.app\",\n FLUSH_INTERVAL: 10000, // 10 seconds\n FLUSH_AT: 25, // events\n MAX_QUEUE_SIZE: 5000, // events\n SESSION_TIMEOUT: 1800000, // 30 minutes\n MAX_BATCH_SIZE: 100, // events per request\n MAX_RETRIES: 5,\n BASE_BACKOFF_DELAY: 1000, // 1 second\n MAX_BACKOFF_DELAY: 16000, // 16 seconds\n} as const;\n","import type { StorageAdapter } from \"./types.js\";\nimport { generateUUID, STORAGE_KEYS } from \"./utils.js\";\n\n/**\n * Identity manager for handling anonymous and user IDs\n */\nexport class IdentityManager {\n private anonymousId: string;\n private userId: string | null = null;\n private userTraits: Record<string, unknown> = {};\n private storage: StorageAdapter | null;\n private debug: boolean;\n\n constructor(storage: StorageAdapter | null, debug = false) {\n this.storage = storage;\n this.debug = debug;\n this.anonymousId = generateUUID();\n }\n\n /**\n * Initialize identity from storage\n */\n async initialize(): Promise<void> {\n if (!this.storage) {\n this.log(\"No storage adapter, using in-memory identity only\");\n return;\n }\n\n try {\n // Load anonymous ID\n const storedAnonymousId = await this.storage.get(\n STORAGE_KEYS.ANONYMOUS_ID\n );\n if (storedAnonymousId) {\n this.anonymousId = storedAnonymousId;\n this.log(\"Loaded anonymous ID from storage:\", this.anonymousId);\n } else {\n // Persist the generated anonymous ID\n await this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, this.anonymousId);\n this.log(\"Generated new anonymous ID:\", this.anonymousId);\n }\n\n // Load user ID\n const storedUserId = await this.storage.get(STORAGE_KEYS.USER_ID);\n if (storedUserId) {\n this.userId = storedUserId;\n this.log(\"Loaded user ID from storage:\", this.userId);\n }\n\n // Load user traits\n const storedTraits = await this.storage.get(STORAGE_KEYS.USER_TRAITS);\n if (storedTraits) {\n try {\n this.userTraits = JSON.parse(storedTraits);\n this.log(\"Loaded user traits from storage:\", this.userTraits);\n } catch {\n this.log(\"Failed to parse stored user traits\");\n }\n }\n } catch (error) {\n this.log(\"Error loading identity from storage:\", error);\n }\n }\n\n /**\n * Get the anonymous ID\n */\n getAnonymousId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get the user ID\n */\n getUserId(): string | null {\n return this.userId;\n }\n\n /**\n * Get user traits\n */\n getUserTraits(): Record<string, unknown> {\n return { ...this.userTraits };\n }\n\n /**\n * Set the user ID (identify the user)\n */\n async setUserId(userId: string): Promise<void> {\n this.userId = userId;\n this.log(\"Set user ID:\", userId);\n\n if (this.storage) {\n try {\n await this.storage.set(STORAGE_KEYS.USER_ID, userId);\n } catch (error) {\n this.log(\"Error persisting user ID:\", error);\n }\n }\n }\n\n /**\n * Set user traits\n */\n async setUserTraits(traits: Record<string, unknown>): Promise<void> {\n this.userTraits = { ...this.userTraits, ...traits };\n this.log(\"Set user traits:\", this.userTraits);\n\n if (this.storage) {\n try {\n await this.storage.set(\n STORAGE_KEYS.USER_TRAITS,\n JSON.stringify(this.userTraits)\n );\n } catch (error) {\n this.log(\"Error persisting user traits:\", error);\n }\n }\n }\n\n /**\n * Reset identity (logout)\n * Generates a new anonymous ID and clears user data\n */\n async reset(): Promise<void> {\n this.anonymousId = generateUUID();\n this.userId = null;\n this.userTraits = {};\n this.log(\"Identity reset, new anonymous ID:\", this.anonymousId);\n\n if (this.storage) {\n try {\n await Promise.all([\n this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, this.anonymousId),\n this.storage.remove(STORAGE_KEYS.USER_ID),\n this.storage.remove(STORAGE_KEYS.USER_TRAITS),\n ]);\n } catch (error) {\n this.log(\"Error resetting identity in storage:\", error);\n }\n }\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.debug = enabled;\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Identity]\", ...args);\n }\n }\n}\n","import { PIHError } from \"./errors.js\";\nimport type { Transport } from \"./transport.js\";\nimport type {\n TrackEvent,\n QueuedEvent,\n StorageAdapter,\n TransportOptions,\n} from \"./types.js\";\nimport { STORAGE_KEYS, DEFAULTS, getBackoffDelay } from \"./utils.js\";\n\n/**\n * Event queue configuration\n */\nexport interface EventQueueConfig {\n /** Events before auto-flush (default: 25) */\n flushAt: number;\n /** Milliseconds between auto-flushes (default: 10000) */\n flushInterval: number;\n /** Max queued events (default: 5000) */\n maxQueueSize: number;\n /** Storage adapter for persistence */\n storage: StorageAdapter | null;\n /** Transport for sending events */\n transport: Transport;\n /** Error callback */\n onError?: (error: PIHError, events: TrackEvent[]) => void;\n /** Debug mode */\n debug?: boolean;\n}\n\n/**\n * Event queue with persistence and retry logic\n */\nexport class EventQueue {\n private queue: QueuedEvent[] = [];\n private isFlushing = false;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n private config: EventQueueConfig;\n private initialized = false;\n\n constructor(config: EventQueueConfig) {\n this.config = {\n flushAt: config.flushAt ?? DEFAULTS.FLUSH_AT,\n flushInterval: config.flushInterval ?? DEFAULTS.FLUSH_INTERVAL,\n maxQueueSize: config.maxQueueSize ?? DEFAULTS.MAX_QUEUE_SIZE,\n storage: config.storage,\n transport: config.transport,\n onError: config.onError,\n debug: config.debug ?? false,\n };\n }\n\n /**\n * Initialize the queue (load persisted events)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await this.loadPersistedQueue();\n this.startFlushTimer();\n this.initialized = true;\n\n this.log(\"Queue initialized with\", this.queue.length, \"persisted events\");\n }\n\n /**\n * Add an event to the queue\n */\n async enqueue(event: TrackEvent): Promise<void> {\n // Enforce max queue size (drop oldest when full)\n while (this.queue.length >= this.config.maxQueueSize) {\n const dropped = this.queue.shift();\n if (dropped) {\n this.log(\"Queue full, dropping oldest event:\", dropped.event.event_id);\n this.config.onError?.(\n PIHError.queueFull(\"Queue full, dropped oldest event\", {\n dropped_event_id: dropped.event.event_id,\n }),\n [dropped.event]\n );\n }\n }\n\n // Add event to queue\n const queuedEvent: QueuedEvent = {\n event,\n attempts: 0,\n firstAttempt: Date.now(),\n };\n this.queue.push(queuedEvent);\n\n this.log(\"Enqueued event:\", event.event_id, \"Queue size:\", this.queue.length);\n\n // Persist queue\n await this.persistQueue();\n\n // Check if we should flush\n if (this.queue.length >= this.config.flushAt) {\n this.log(\"Queue reached flushAt threshold, flushing\");\n this.flush();\n }\n }\n\n /**\n * Flush the queue (send all events)\n */\n async flush(options?: TransportOptions): Promise<void> {\n if (this.isFlushing || this.queue.length === 0) {\n return;\n }\n\n this.isFlushing = true;\n this.log(\"Flushing\", this.queue.length, \"events\");\n\n try {\n // Take batch from queue (max 100 per request)\n const batch = this.queue.splice(0, DEFAULTS.MAX_BATCH_SIZE);\n const events = batch.map((q) => q.event);\n\n try {\n const response = await this.config.transport.sendEvents(events, options);\n\n // Handle rejections\n for (const rejection of response.rejected) {\n if (rejection.reason === \"rate_limited\") {\n // Re-queue rate limited events\n const queuedEvent = batch.find(\n (q) => q.event.event_id === rejection.event_id\n );\n if (queuedEvent && queuedEvent.attempts < DEFAULTS.MAX_RETRIES) {\n queuedEvent.attempts++;\n this.queue.unshift(queuedEvent);\n this.log(\n \"Rate limited event re-queued:\",\n rejection.event_id,\n \"attempt:\",\n queuedEvent.attempts\n );\n }\n } else {\n // Other rejections are permanent failures\n this.log(\n \"Event permanently rejected:\",\n rejection.event_id,\n rejection.reason,\n rejection.details\n );\n }\n }\n\n this.log(\n \"Flush complete. Accepted:\",\n response.stats.accepted,\n \"Rejected:\",\n response.stats.rejected\n );\n } catch (error) {\n const pihError = PIHError.fromUnknown(error);\n\n // Network error - re-queue all with backoff\n for (const item of batch) {\n if (item.attempts < DEFAULTS.MAX_RETRIES) {\n item.attempts++;\n this.queue.unshift(item);\n } else {\n this.log(\n \"Event dropped after max retries:\",\n item.event.event_id\n );\n }\n }\n\n // Schedule retry with backoff\n const nextAttempt = batch[0]?.attempts ?? 1;\n const backoff = getBackoffDelay(nextAttempt);\n this.log(\"Network error, scheduling retry in\", backoff, \"ms\");\n\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n this.flush(options);\n }, backoff);\n\n this.config.onError?.(pihError, events);\n }\n\n // Persist updated queue\n await this.persistQueue();\n\n // Continue flushing if there are more events\n if (this.queue.length >= this.config.flushAt) {\n // Use setImmediate/setTimeout to avoid blocking\n setTimeout(() => this.flush(options), 0);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Get the current queue length\n */\n getQueueLength(): number {\n return this.queue.length;\n }\n\n /**\n * Check if the queue is empty\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * Check if queue is currently flushing\n */\n isBusy(): boolean {\n return this.isFlushing;\n }\n\n /**\n * Clear the queue\n */\n async clear(): Promise<void> {\n this.queue = [];\n await this.persistQueue();\n this.log(\"Queue cleared\");\n }\n\n /**\n * Stop the queue (cancel timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n this.log(\"Queue destroyed\");\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.config.debug = enabled;\n }\n\n private async persistQueue(): Promise<void> {\n if (!this.config.storage) return;\n\n try {\n await this.config.storage.set(\n STORAGE_KEYS.QUEUE,\n JSON.stringify(this.queue)\n );\n } catch (error) {\n this.log(\"Error persisting queue:\", error);\n }\n }\n\n private async loadPersistedQueue(): Promise<void> {\n if (!this.config.storage) return;\n\n try {\n const stored = await this.config.storage.get(STORAGE_KEYS.QUEUE);\n if (stored) {\n const parsed = JSON.parse(stored) as QueuedEvent[];\n // Validate parsed data\n if (Array.isArray(parsed)) {\n this.queue = parsed.filter(\n (item) =>\n item &&\n typeof item === \"object\" &&\n \"event\" in item &&\n \"attempts\" in item\n );\n }\n }\n } catch (error) {\n this.log(\"Error loading persisted queue:\", error);\n this.queue = [];\n }\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) return;\n\n this.flushTimer = setInterval(() => {\n if (this.queue.length > 0) {\n this.log(\"Flush timer triggered\");\n this.flush();\n }\n }, this.config.flushInterval);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[PIH Queue]\", ...args);\n }\n }\n}\n","import type { StorageAdapter } from \"./types.js\";\nimport { generateUUID, STORAGE_KEYS, DEFAULTS } from \"./utils.js\";\n\n/**\n * Callback for session events\n */\nexport interface SessionCallbacks {\n onSessionStart?: (sessionId: string) => void;\n onSessionEnd?: (sessionId: string, duration: number) => void;\n}\n\n/**\n * Session manager for handling session tracking\n */\nexport class SessionManager {\n private sessionId: string | null = null;\n private sessionStartTime: number = 0;\n private lastActivity: number = 0;\n private timeout: number;\n private storage: StorageAdapter | null;\n private callbacks: SessionCallbacks;\n private debug: boolean;\n\n constructor(\n storage: StorageAdapter | null,\n timeout: number = DEFAULTS.SESSION_TIMEOUT,\n callbacks: SessionCallbacks = {},\n debug = false\n ) {\n this.storage = storage;\n this.timeout = timeout;\n this.callbacks = callbacks;\n this.debug = debug;\n }\n\n /**\n * Initialize session from storage\n */\n async initialize(): Promise<void> {\n if (!this.storage) {\n this.log(\"No storage adapter, using in-memory session only\");\n return;\n }\n\n try {\n const storedSessionId = await this.storage.get(STORAGE_KEYS.SESSION_ID);\n const storedLastActivity = await this.storage.get(\n STORAGE_KEYS.SESSION_LAST_ACTIVITY\n );\n\n if (storedSessionId && storedLastActivity) {\n const lastActivity = parseInt(storedLastActivity, 10);\n const now = Date.now();\n\n // Check if session is still valid\n if (now - lastActivity < this.timeout) {\n this.sessionId = storedSessionId;\n this.lastActivity = lastActivity;\n this.sessionStartTime = lastActivity; // Approximate\n this.log(\"Restored session from storage:\", this.sessionId);\n } else {\n // Session expired, clear it\n this.log(\"Stored session expired, will start new session\");\n await this.clearStoredSession();\n }\n }\n } catch (error) {\n this.log(\"Error loading session from storage:\", error);\n }\n }\n\n /**\n * Get the current session ID\n * Creates a new session if needed or if the current one expired\n */\n getSessionId(): string {\n const now = Date.now();\n\n // Check if session expired\n if (this.sessionId && now - this.lastActivity > this.timeout) {\n this.endSession();\n }\n\n // Start new session if needed\n if (!this.sessionId) {\n this.startSession();\n }\n\n // Update last activity\n this.lastActivity = now;\n this.persistLastActivity();\n\n return this.sessionId!;\n }\n\n /**\n * Touch the session to update last activity\n * Call this on each track event\n */\n touch(): void {\n if (this.sessionId) {\n this.lastActivity = Date.now();\n this.persistLastActivity();\n }\n }\n\n /**\n * Check if there's an active session\n */\n hasActiveSession(): boolean {\n if (!this.sessionId) return false;\n return Date.now() - this.lastActivity < this.timeout;\n }\n\n /**\n * Get the current session ID without creating a new one\n */\n getCurrentSessionId(): string | null {\n return this.sessionId;\n }\n\n /**\n * Get session duration in milliseconds\n */\n getSessionDuration(): number {\n if (!this.sessionId) return 0;\n return Date.now() - this.sessionStartTime;\n }\n\n /**\n * Start a new session\n */\n startSession(): void {\n const now = Date.now();\n this.sessionId = generateUUID();\n this.sessionStartTime = now;\n this.lastActivity = now;\n\n this.log(\"Started new session:\", this.sessionId);\n this.persistSession();\n\n // Notify callback\n this.callbacks.onSessionStart?.(this.sessionId);\n }\n\n /**\n * End the current session\n */\n endSession(): void {\n if (!this.sessionId) return;\n\n const duration = this.getSessionDuration();\n const endedSessionId = this.sessionId;\n\n this.log(\"Ended session:\", endedSessionId, \"duration:\", duration);\n\n // Clear session\n this.sessionId = null;\n this.sessionStartTime = 0;\n this.lastActivity = 0;\n this.clearStoredSession();\n\n // Notify callback\n this.callbacks.onSessionEnd?.(endedSessionId, duration);\n }\n\n /**\n * Force end the session (for app background, page hide, etc.)\n */\n forceEndSession(): void {\n if (this.sessionId) {\n this.endSession();\n }\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.debug = enabled;\n }\n\n /**\n * Set session timeout\n */\n setTimeout(timeout: number): void {\n this.timeout = timeout;\n }\n\n private async persistSession(): Promise<void> {\n if (!this.storage || !this.sessionId) return;\n\n try {\n await Promise.all([\n this.storage.set(STORAGE_KEYS.SESSION_ID, this.sessionId),\n this.storage.set(\n STORAGE_KEYS.SESSION_LAST_ACTIVITY,\n String(this.lastActivity)\n ),\n ]);\n } catch (error) {\n this.log(\"Error persisting session:\", error);\n }\n }\n\n private async persistLastActivity(): Promise<void> {\n if (!this.storage) return;\n\n try {\n await this.storage.set(\n STORAGE_KEYS.SESSION_LAST_ACTIVITY,\n String(this.lastActivity)\n );\n } catch (error) {\n this.log(\"Error persisting last activity:\", error);\n }\n }\n\n private async clearStoredSession(): Promise<void> {\n if (!this.storage) return;\n\n try {\n await Promise.all([\n this.storage.remove(STORAGE_KEYS.SESSION_ID),\n this.storage.remove(STORAGE_KEYS.SESSION_LAST_ACTIVITY),\n ]);\n } catch (error) {\n this.log(\"Error clearing stored session:\", error);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Session]\", ...args);\n }\n }\n}\n","import { PIHError } from \"./errors.js\";\nimport type {\n TrackEvent,\n TrackResponse,\n IdentifyPayload,\n IdentifyResponse,\n TransportOptions,\n SDKMeta,\n FeatureFlags,\n} from \"./types.js\";\n\n/**\n * Transport configuration\n */\nexport interface TransportConfig {\n /** API base URL */\n apiUrl: string;\n /** API key for authentication */\n apiKey: string;\n /** Tenant ID for multi-tenancy */\n tenantId?: string;\n /** Debug mode */\n debug?: boolean;\n /** SDK metadata for headers */\n sdkMeta?: SDKMeta;\n}\n\n/**\n * HTTP transport for sending events to the ingest API\n */\n/**\n * Default SDK metadata\n */\nconst DEFAULT_SDK_META: SDKMeta = {\n name: \"pih-sdk-core\",\n version: \"0.4.1\",\n};\n\nexport class Transport {\n private apiUrl: string;\n private apiKey: string;\n private tenantId?: string;\n private debug: boolean;\n private sdkMeta: SDKMeta;\n\n constructor(config: TransportConfig) {\n this.apiUrl = config.apiUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n this.apiKey = config.apiKey;\n this.tenantId = config.tenantId;\n this.debug = config.debug ?? false;\n this.sdkMeta = config.sdkMeta ?? DEFAULT_SDK_META;\n }\n\n /**\n * Send a batch of events to the track endpoint\n */\n async sendEvents(\n events: TrackEvent[],\n options?: TransportOptions\n ): Promise<TrackResponse> {\n const url = `${this.apiUrl}/v1/track`;\n const apiEvents = events.map((e) => this.toTrackApiPayload(e));\n const body = JSON.stringify({ events: apiEvents });\n\n this.log(\"Sending\", events.length, \"events to\", url);\n\n // Use fetch with keepalive for page hide scenarios (preserves auth headers\n // unlike sendBeacon which cannot set custom headers)\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: this.getHeaders(),\n body,\n keepalive: options?.useBeacon, // Keep connection alive for page hide\n });\n\n if (!response.ok) {\n if (response.status === 429) {\n throw PIHError.rateLimited(\n `Rate limited: ${response.statusText}`,\n { status: response.status }\n );\n }\n throw PIHError.networkError(\n `HTTP ${response.status}: ${response.statusText}`,\n { status: response.status }\n );\n }\n\n const data = (await response.json()) as TrackResponse;\n this.log(\"Track response:\", data);\n return data;\n } catch (error) {\n if (error instanceof PIHError) {\n throw error;\n }\n throw PIHError.networkError(\n `Failed to send events: ${error instanceof Error ? error.message : String(error)}`,\n error\n );\n }\n }\n\n /**\n * Send an identify call\n */\n async sendIdentify(payload: IdentifyPayload): Promise<IdentifyResponse> {\n const url = `${this.apiUrl}/v1/identify`;\n const body = JSON.stringify(this.toIdentifyApiPayload(payload));\n\n this.log(\"Sending identify to\", url, payload);\n\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: this.getHeaders(),\n body,\n });\n\n if (!response.ok) {\n if (response.status === 429) {\n throw PIHError.rateLimited(\n `Rate limited: ${response.statusText}`,\n { status: response.status }\n );\n }\n throw PIHError.networkError(\n `HTTP ${response.status}: ${response.statusText}`,\n { status: response.status }\n );\n }\n\n const data = (await response.json()) as IdentifyResponse;\n this.log(\"Identify response:\", data);\n return data;\n } catch (error) {\n if (error instanceof PIHError) {\n throw error;\n }\n throw PIHError.networkError(\n `Failed to send identify: ${error instanceof Error ? error.message : String(error)}`,\n error\n );\n }\n }\n\n /**\n * Fetch all flags for the authenticated project/environment\n */\n async fetchFlags(): Promise<FeatureFlags> {\n const url = `${this.apiUrl}/v1/flags`;\n this.log(\"Fetching flags from\", url);\n\n try {\n const response = await this.fetch(url, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw PIHError.networkError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { flags: FeatureFlags };\n this.log(\"Flags response:\", data);\n return data.flags;\n } catch (error) {\n if (error instanceof PIHError) throw error;\n throw PIHError.networkError(\n `Failed to fetch flags: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Evaluate flags for a user context\n */\n async evaluateFlags(context: {\n userId?: string | null;\n anonymousId?: string;\n userTraits?: Record<string, unknown>;\n }): Promise<FeatureFlags> {\n const url = `${this.apiUrl}/v1/flags/evaluate`;\n const body = JSON.stringify({\n userId: context.userId ?? undefined,\n anonymousId: context.anonymousId,\n userTraits: context.userTraits,\n });\n\n this.log(\"Evaluating flags at\", url);\n\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: this.getHeaders(),\n body,\n });\n\n if (!response.ok) {\n throw PIHError.networkError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { flags: FeatureFlags };\n this.log(\"Evaluate flags response:\", data);\n return data.flags;\n } catch (error) {\n if (error instanceof PIHError) throw error;\n throw PIHError.networkError(\n `Failed to evaluate flags: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Set tenant ID\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean): void {\n this.debug = enabled;\n }\n\n /**\n * Set SDK metadata (used by platform-specific SDKs)\n */\n setSDKMeta(meta: SDKMeta): void {\n this.sdkMeta = meta;\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-SDK-Name\": this.sdkMeta.name,\n \"X-SDK-Version\": this.sdkMeta.version,\n };\n\n if (this.tenantId) {\n headers[\"X-Tenant-Id\"] = this.tenantId;\n }\n\n return headers;\n }\n\n /**\n * Map internal TrackEvent (snake_case) to API payload (camelCase)\n */\n private toTrackApiPayload(event: TrackEvent): Record<string, unknown> {\n return {\n eventId: event.event_id,\n eventName: event.event_name,\n timestamp: event.timestamp,\n anonymousId: event.anonymous_id,\n userId: event.user_id ?? undefined,\n sessionId: event.session_id ?? undefined,\n properties: event.properties,\n userTraits: event.user_traits,\n context: {\n platform: event.platform,\n appVersion: event.app_version ?? undefined,\n ...(event.context ?? {}),\n },\n };\n }\n\n /**\n * Map internal IdentifyPayload (snake_case) to API payload (camelCase)\n */\n private toIdentifyApiPayload(payload: IdentifyPayload): Record<string, unknown> {\n return {\n userId: payload.user_id,\n anonymousId: payload.anonymous_id,\n traits: payload.traits,\n timestamp: payload.timestamp,\n };\n }\n\n private async fetch(\n url: string,\n options: RequestInit\n ): Promise<Response> {\n // Use native fetch\n if (typeof fetch !== \"undefined\") {\n return fetch(url, options);\n }\n\n // This shouldn't happen in modern environments, but throw a clear error\n throw PIHError.networkError(\n \"fetch is not available in this environment\"\n );\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Transport]\", ...args);\n }\n }\n}\n","import { PIHError } from \"./errors.js\";\nimport { IdentityManager } from \"./identity.js\";\nimport { EventQueue } from \"./queue.js\";\nimport { SessionManager } from \"./session.js\";\nimport { Transport } from \"./transport.js\";\nimport type {\n PIHConfig,\n TrackEvent,\n TrackOptions,\n StorageAdapter,\n TransportOptions,\n FeatureFlags,\n} from \"./types.js\";\nimport { generateUUID, getTimestamp, dateToTimestamp, DEFAULTS, STORAGE_KEYS } from \"./utils.js\";\n\n/**\n * Base PIH client class\n * Platform-specific SDKs extend this class\n */\nexport class PIHClient {\n protected config: PIHConfig;\n protected storage: StorageAdapter | null = null;\n protected identity: IdentityManager;\n protected session: SessionManager;\n protected transport: Transport;\n protected queue: EventQueue;\n protected initialized = false;\n protected tenantId: string;\n protected sessionNumber = 0;\n protected eventIndex = 0;\n private lastSessionId: string | null = null;\n private flags: FeatureFlags = {};\n private flagRefreshTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: PIHConfig, storage: StorageAdapter | null = null) {\n this.validateConfig(config);\n\n // Filter out undefined values so they don't overwrite defaults\n const defined = Object.fromEntries(\n Object.entries(config).filter(([, v]) => v !== undefined)\n );\n this.config = {\n apiUrl: DEFAULTS.API_URL,\n debug: false,\n flushInterval: DEFAULTS.FLUSH_INTERVAL,\n flushAt: DEFAULTS.FLUSH_AT,\n maxQueueSize: DEFAULTS.MAX_QUEUE_SIZE,\n sessionTimeout: DEFAULTS.SESSION_TIMEOUT,\n ...defined,\n } as PIHConfig;\n\n this.storage = storage;\n this.tenantId = config.tenantId ?? \"\";\n\n // Initialize identity manager\n this.identity = new IdentityManager(storage, this.config.debug);\n\n // Initialize session manager\n this.session = new SessionManager(\n storage,\n this.config.sessionTimeout,\n {\n onSessionStart: (sessionId) => {\n this.log(\"Session started:\", sessionId);\n // Track session_started event\n this.trackInternal(\"session_started\", { session_id: sessionId });\n },\n onSessionEnd: (sessionId, duration) => {\n this.log(\"Session ended:\", sessionId, \"duration:\", duration);\n // Track session_ended event\n this.trackInternal(\"session_ended\", {\n session_id: sessionId,\n duration_ms: duration,\n });\n },\n },\n this.config.debug\n );\n\n // Initialize transport\n this.transport = new Transport({\n apiUrl: this.config.apiUrl!,\n apiKey: this.config.apiKey,\n tenantId: this.tenantId,\n debug: this.config.debug,\n });\n\n // Initialize queue\n this.queue = new EventQueue({\n flushAt: this.config.flushAt!,\n flushInterval: this.config.flushInterval!,\n maxQueueSize: this.config.maxQueueSize!,\n storage,\n transport: this.transport,\n onError: (error, events) => {\n this.config.onError?.(error);\n this.log(\"Queue error:\", error.message, \"events:\", events.length);\n },\n debug: this.config.debug,\n });\n }\n\n /**\n * Initialize the client (load persisted state)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await Promise.all([\n this.identity.initialize(),\n this.session.initialize(),\n this.queue.initialize(),\n ]);\n\n // Load persisted session number and event index\n await this.loadSessionEnrichment();\n\n // Load cached flags from storage\n await this.loadCachedFlags();\n\n this.initialized = true;\n this.log(\"Client initialized\");\n\n // Auto-fetch flags (non-blocking)\n if (this.config.featureFlags?.autoFetch !== false) {\n this.refreshFlags().catch((err) => {\n this.log(\"Auto-fetch flags error:\", err);\n });\n\n // Set up periodic refresh\n const refreshInterval = this.config.featureFlags?.refreshInterval ?? 300000; // 5 min\n if (refreshInterval > 0) {\n this.flagRefreshTimer = setInterval(() => {\n this.refreshFlags().catch((err) => {\n this.log(\"Flag refresh error:\", err);\n });\n }, refreshInterval);\n }\n }\n }\n\n /**\n * Set the tenant ID\n */\n setTenant(tenantId: string): void {\n this.tenantId = tenantId;\n this.transport.setTenantId(tenantId);\n this.log(\"Tenant set:\", tenantId);\n }\n\n /**\n * Identify the user\n */\n async identify(\n userId: string,\n traits?: Record<string, unknown>\n ): Promise<void> {\n await this.ensureInitialized();\n\n await this.identity.setUserId(userId);\n if (traits) {\n await this.identity.setUserTraits(traits);\n }\n\n // Send identify call to server\n try {\n await this.transport.sendIdentify({\n project_id: this.config.projectId,\n environment: this.config.environment,\n tenant_id: this.tenantId,\n anonymous_id: this.identity.getAnonymousId(),\n user_id: userId,\n traits,\n timestamp: getTimestamp(),\n });\n } catch (error) {\n const pihError = PIHError.fromUnknown(error);\n this.config.onError?.(pihError);\n this.log(\"Identify error:\", pihError.message);\n }\n\n // Refresh flags after identify (user context changed)\n if (this.config.featureFlags?.autoFetch !== false) {\n this.refreshFlags().catch((err) => {\n this.log(\"Post-identify flag refresh error:\", err);\n });\n }\n }\n\n /**\n * Set user traits without identifying\n */\n async setUserTraits(traits: Record<string, unknown>): Promise<void> {\n await this.ensureInitialized();\n await this.identity.setUserTraits(traits);\n }\n\n /**\n * Track an event\n */\n async track(\n eventName: string,\n properties?: Record<string, unknown>,\n options?: TrackOptions\n ): Promise<void> {\n await this.ensureInitialized();\n\n const event = this.createEvent(eventName, properties, options);\n\n // Touch session to update last activity\n this.session.touch();\n\n if (options?.immediate) {\n // Send immediately, bypassing queue\n try {\n await this.transport.sendEvents([event]);\n } catch (error) {\n const pihError = PIHError.fromUnknown(error);\n this.config.onError?.(pihError);\n this.log(\"Immediate track error:\", pihError.message);\n }\n } else {\n // Add to queue\n await this.queue.enqueue(event);\n }\n }\n\n /**\n * Flush the event queue\n */\n async flush(options?: TransportOptions): Promise<void> {\n await this.ensureInitialized();\n await this.queue.flush(options);\n }\n\n /**\n * Reset identity (logout)\n */\n async reset(): Promise<void> {\n await this.ensureInitialized();\n\n // End current session\n this.session.forceEndSession();\n\n // Reset identity\n await this.identity.reset();\n\n this.log(\"Client reset\");\n }\n\n /**\n * Enable/disable debug mode\n */\n setDebug(enabled: boolean): void {\n this.config.debug = enabled;\n this.identity.setDebug(enabled);\n this.session.setDebug(enabled);\n this.transport.setDebug(enabled);\n this.queue.setDebug(enabled);\n }\n\n /**\n * Get the anonymous ID\n */\n getAnonymousId(): string {\n return this.identity.getAnonymousId();\n }\n\n /**\n * Get the user ID\n */\n getUserId(): string | null {\n return this.identity.getUserId();\n }\n\n /**\n * Get the session ID\n */\n getSessionId(): string | null {\n return this.session.getCurrentSessionId();\n }\n\n /**\n * Get the queue length\n */\n getQueueLength(): number {\n return this.queue.getQueueLength();\n }\n\n /**\n * Check if a feature flag is enabled\n */\n isFeatureEnabled(key: string, defaultValue = false): boolean {\n return this.flags[key] ?? defaultValue;\n }\n\n /**\n * Get a feature flag value\n */\n getFeatureFlag(key: string, defaultValue = false): boolean {\n return this.flags[key] ?? defaultValue;\n }\n\n /**\n * Get all feature flags\n */\n getFeatureFlags(): FeatureFlags {\n return { ...this.flags };\n }\n\n /**\n * Refresh flags from the server\n */\n async refreshFlags(): Promise<void> {\n try {\n const newFlags = await this.transport.evaluateFlags({\n userId: this.identity.getUserId(),\n anonymousId: this.identity.getAnonymousId(),\n userTraits: this.identity.getUserTraits(),\n });\n\n this.flags = newFlags;\n this.persistFlags();\n this.config.featureFlags?.onFlagsUpdated?.(newFlags);\n this.log(\"Flags refreshed:\", Object.keys(newFlags).length, \"flags\");\n } catch (error) {\n this.log(\"Flag refresh error:\", error);\n }\n }\n\n /**\n * Destroy the client (cleanup)\n */\n destroy(): void {\n if (this.flagRefreshTimer) {\n clearInterval(this.flagRefreshTimer);\n this.flagRefreshTimer = null;\n }\n this.queue.destroy();\n this.log(\"Client destroyed\");\n }\n\n /**\n * Internal track method that doesn't require initialization\n * Used for session events during initialization\n */\n protected trackInternal(\n eventName: string,\n properties?: Record<string, unknown>\n ): void {\n const event = this.createEvent(eventName, properties);\n // Fire and forget - don't await\n this.queue.enqueue(event).catch((error) => {\n this.log(\"Internal track error:\", error);\n });\n }\n\n /**\n * Get additional context to include with every event.\n * Override in platform-specific subclasses to add browser/device context.\n */\n protected getContext(): Record<string, unknown> {\n return {};\n }\n\n /**\n * Create a track event\n */\n protected createEvent(\n eventName: string,\n properties?: Record<string, unknown>,\n options?: TrackOptions\n ): TrackEvent {\n const timestamp = options?.timestamp\n ? dateToTimestamp(options.timestamp)\n : getTimestamp();\n\n // Get session ID first (may create a new session)\n const sessionId = this.session.getSessionId();\n\n // Update session enrichment counters (must happen after getSessionId)\n this.updateSessionEnrichment();\n\n // Build context from subclass + session enrichment\n const context: Record<string, unknown> = {\n ...this.getContext(),\n sessionNumber: this.sessionNumber,\n eventIndex: this.eventIndex,\n };\n\n return {\n event_id: generateUUID(),\n timestamp,\n project_id: this.config.projectId,\n environment: this.config.environment,\n tenant_id: this.tenantId,\n event_name: eventName,\n anonymous_id: this.identity.getAnonymousId(),\n user_id: this.identity.getUserId(),\n session_id: sessionId,\n platform: this.config.platform,\n app_version: this.config.appVersion ?? null,\n properties: properties ?? {},\n user_traits: this.identity.getUserTraits(),\n context,\n };\n }\n\n /**\n * Ensure client is initialized\n */\n protected async ensureInitialized(): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n }\n\n /**\n * Validate configuration\n */\n protected validateConfig(config: PIHConfig): void {\n if (!config.apiKey) {\n throw PIHError.invalidConfig(\"apiKey is required\");\n }\n if (!config.projectId) {\n throw PIHError.invalidConfig(\"projectId is required\");\n }\n if (!config.environment) {\n throw PIHError.invalidConfig(\"environment is required\");\n }\n if (!config.platform) {\n throw PIHError.invalidConfig(\"platform is required\");\n }\n }\n\n /**\n * Load persisted session enrichment data (sessionNumber, eventIndex)\n */\n private async loadSessionEnrichment(): Promise<void> {\n if (!this.storage) return;\n\n try {\n const storedSessionNumber = await this.storage.get(STORAGE_KEYS.SESSION_NUMBER);\n const storedEventIndex = await this.storage.get(STORAGE_KEYS.EVENT_INDEX);\n\n if (storedSessionNumber) {\n this.sessionNumber = parseInt(storedSessionNumber, 10) || 0;\n }\n if (storedEventIndex) {\n this.eventIndex = parseInt(storedEventIndex, 10) || 0;\n }\n } catch (error) {\n this.log(\"Error loading session enrichment:\", error);\n }\n }\n\n /**\n * Update session enrichment counters.\n * Increments sessionNumber when a new session starts, resets eventIndex.\n * Increments eventIndex for every event.\n */\n private updateSessionEnrichment(): void {\n const currentSessionId = this.session.getCurrentSessionId();\n\n if (currentSessionId && currentSessionId !== this.lastSessionId) {\n // New session detected\n this.sessionNumber++;\n this.eventIndex = 0;\n this.lastSessionId = currentSessionId;\n this.persistSessionEnrichment();\n }\n\n this.eventIndex++;\n this.persistEventIndex();\n }\n\n private persistSessionEnrichment(): void {\n if (!this.storage) return;\n this.storage.set(STORAGE_KEYS.SESSION_NUMBER, String(this.sessionNumber)).catch((error) => {\n this.log(\"Error persisting session number:\", error);\n });\n }\n\n private persistEventIndex(): void {\n if (!this.storage) return;\n this.storage.set(STORAGE_KEYS.EVENT_INDEX, String(this.eventIndex)).catch((error) => {\n this.log(\"Error persisting event index:\", error);\n });\n }\n\n /**\n * Load cached flags from storage\n */\n private async loadCachedFlags(): Promise<void> {\n if (!this.storage) return;\n try {\n const stored = await this.storage.get(STORAGE_KEYS.FLAGS);\n if (stored) {\n this.flags = JSON.parse(stored);\n }\n } catch (error) {\n this.log(\"Error loading cached flags:\", error);\n }\n }\n\n /**\n * Persist current flags to storage\n */\n private persistFlags(): void {\n if (!this.storage) return;\n this.storage.set(STORAGE_KEYS.FLAGS, JSON.stringify(this.flags)).catch((error) => {\n this.log(\"Error persisting flags:\", error);\n });\n }\n\n protected log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[PIH Client]\", ...args);\n }\n }\n}\n","import type { PIHClient, AutocaptureConfig } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * UTM parameter storage key\n */\nconst UTM_STORAGE_KEY = \"pih_utm_params\";\n\n/**\n * UTM parameter names\n */\nconst UTM_PARAMS = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n] as const;\n\n/**\n * Default attribute prefix for action detection\n */\nconst DEFAULT_ATTRIBUTE_PREFIX = \"data-pih-\";\n\n/**\n * Autocapture manager for web SDK\n */\nexport class Autocapture {\n private client: PIHClient;\n private config: AutocaptureConfig;\n private attributePrefix: string;\n private cachedUtmParams: Record<string, string> | null = null;\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private boundHandleClick: (e: MouseEvent) => void;\n private boundHandlePopState: () => void;\n private boundHandleSubmit: (e: SubmitEvent) => void;\n\n constructor(client: PIHClient, config: AutocaptureConfig = {}) {\n this.client = client;\n this.config = {\n pageViews: config.pageViews !== false, // default: true\n clicks: config.clicks ?? false, // default: false\n clickSelector: config.clickSelector ?? \"[data-track]\",\n forms: config.forms ?? false, // default: false\n };\n this.attributePrefix = config.attributePrefix ?? DEFAULT_ATTRIBUTE_PREFIX;\n\n this.boundHandleClick = this.handleClick.bind(this);\n this.boundHandlePopState = this.handlePopState.bind(this);\n this.boundHandleSubmit = this.handleSubmit.bind(this);\n }\n\n /**\n * Start autocapture\n */\n start(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n // Load cached UTM params\n this.loadCachedUtmParams();\n\n // Setup page view tracking\n if (this.config.pageViews) {\n this.setupPageViews();\n // Track initial page view\n this.trackPageView();\n }\n\n // Always setup click tracking for data-pih-action detection\n this.setupClickTracking();\n\n // Setup form tracking\n if (this.config.forms) {\n this.setupFormTracking();\n }\n }\n\n /**\n * Stop autocapture\n */\n stop(): void {\n // Restore original history methods\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n this.originalPushState = null;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n this.originalReplaceState = null;\n }\n\n // Remove event listeners\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"popstate\", this.boundHandlePopState);\n }\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"click\", this.boundHandleClick, true);\n document.removeEventListener(\"submit\", this.boundHandleSubmit, true);\n }\n }\n\n /**\n * Manually track a page view\n */\n trackPageView(): void {\n const url = new URL(window.location.href);\n const utmParams = this.extractUtmParams(url);\n\n // Cache UTM params on first page view with UTM\n if (Object.keys(utmParams).length > 0 && !this.cachedUtmParams) {\n this.cachedUtmParams = utmParams;\n this.persistUtmParams(utmParams);\n }\n\n this.client.track(\"page_viewed\", {\n path: url.pathname,\n search: url.search,\n hash: url.hash,\n referrer: document.referrer || null,\n title: document.title,\n url: window.location.href,\n // Include UTM params (from current URL or cached)\n ...this.getUtmParams(url),\n });\n }\n\n /**\n * Setup page view tracking\n */\n private setupPageViews(): void {\n // Monkey-patch History API for SPA navigation\n this.originalPushState = history.pushState;\n this.originalReplaceState = history.replaceState;\n\n const originalPush = this.originalPushState!;\n const originalReplace = this.originalReplaceState!;\n const onNavigate = () => this.trackPageView();\n\n history.pushState = function (...args) {\n originalPush.apply(history, args);\n // Use setTimeout to ensure URL has been updated\n setTimeout(onNavigate, 0);\n };\n\n history.replaceState = function (...args) {\n originalReplace.apply(history, args);\n // Use setTimeout to ensure URL has been updated\n setTimeout(onNavigate, 0);\n };\n\n // Listen for popstate (back/forward navigation)\n window.addEventListener(\"popstate\", this.boundHandlePopState);\n }\n\n /**\n * Handle popstate event\n */\n private handlePopState(): void {\n this.trackPageView();\n }\n\n /**\n * Setup click tracking\n */\n private setupClickTracking(): void {\n document.addEventListener(\"click\", this.boundHandleClick, true);\n }\n\n /**\n * Collect all data-pih-* attributes from an element as properties.\n * Strips the prefix and converts hyphens to underscores for snake_case keys.\n */\n private collectActionAttributes(element: Element): Record<string, string> {\n const props: Record<string, string> = {};\n const attrs = element.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i]!;\n if (attr.name.startsWith(this.attributePrefix) && attr.name !== `${this.attributePrefix}action`) {\n const key = attr.name.slice(this.attributePrefix.length).replace(/-/g, \"_\");\n props[key] = attr.value;\n }\n }\n return props;\n }\n\n /**\n * Walk up the DOM from the target looking for an element with the action attribute.\n */\n private findActionElement(target: Element): Element | null {\n const actionAttr = `${this.attributePrefix}action`;\n let el: Element | null = target;\n while (el) {\n if (el.hasAttribute(actionAttr)) {\n return el;\n }\n el = el.parentElement;\n }\n return null;\n }\n\n /**\n * Handle click event\n */\n private handleClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n if (!target) return;\n\n // Check for deprecated data-track attribute\n const dataTrackElement = target.closest(\"[data-track]\");\n if (dataTrackElement) {\n console.warn(\"[PIH] data-track is deprecated. Use data-pih-action instead.\");\n }\n\n // Walk up DOM looking for data-pih-action\n const actionElement = this.findActionElement(target);\n\n if (actionElement) {\n const actionName = actionElement.getAttribute(`${this.attributePrefix}action`)!;\n const actionProps = this.collectActionAttributes(actionElement);\n\n this.client.track(\"$action\", {\n action_name: actionName,\n ...actionProps,\n path: window.location.pathname,\n });\n return;\n }\n\n // Fallback: emit $click if clicks config is enabled\n if (!this.config.clicks) return;\n\n // Get element properties for generic click tracking\n const elementTag = target.tagName.toLowerCase();\n const elementText = (target.textContent || \"\").trim().slice(0, 100);\n const elementId = target.id || null;\n const elementClasses = target.className || null;\n const href =\n target instanceof HTMLAnchorElement ? target.href : null;\n\n this.client.track(\"$click\", {\n element_tag: elementTag,\n element_text: elementText,\n element_id: elementId,\n element_classes: elementClasses,\n href,\n path: window.location.pathname,\n });\n }\n\n /**\n * Setup form submission tracking\n */\n private setupFormTracking(): void {\n document.addEventListener(\"submit\", this.boundHandleSubmit, true);\n }\n\n /**\n * Handle form submit event\n */\n private handleSubmit(event: SubmitEvent): void {\n const form = event.target as HTMLFormElement | null;\n if (!form || !(form instanceof HTMLFormElement)) return;\n\n this.client.track(\"form_submitted\", {\n form_id: form.id || undefined,\n form_action: form.action || undefined,\n form_method: (form.method || \"get\").toUpperCase(),\n field_count: form.elements.length,\n });\n }\n\n /**\n * Extract UTM parameters from URL\n */\n private extractUtmParams(url: URL): Record<string, string> {\n const params: Record<string, string> = {};\n for (const key of UTM_PARAMS) {\n const value = url.searchParams.get(key);\n if (value) {\n params[key] = value;\n }\n }\n return params;\n }\n\n /**\n * Get UTM parameters (current URL or cached)\n */\n private getUtmParams(url: URL): Record<string, string> {\n // First check current URL\n const currentParams = this.extractUtmParams(url);\n if (Object.keys(currentParams).length > 0) {\n return currentParams;\n }\n\n // Fall back to cached params\n return this.cachedUtmParams ?? {};\n }\n\n /**\n * Load cached UTM params from storage\n */\n private loadCachedUtmParams(): void {\n try {\n const stored = localStorage.getItem(UTM_STORAGE_KEY);\n if (stored) {\n this.cachedUtmParams = JSON.parse(stored);\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n /**\n * Persist UTM params to storage\n */\n private persistUtmParams(params: Record<string, string>): void {\n try {\n localStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(params));\n } catch {\n // Ignore storage errors\n }\n }\n}\n","import type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Beacon manager for flushing events on page hide\n */\nexport class BeaconManager {\n private client: PIHClient;\n private boundHandleVisibilityChange: () => void;\n private boundHandleBeforeUnload: () => void;\n\n constructor(client: PIHClient) {\n this.client = client;\n this.boundHandleVisibilityChange = this.handleVisibilityChange.bind(this);\n this.boundHandleBeforeUnload = this.handleBeforeUnload.bind(this);\n }\n\n /**\n * Start listening for visibility and unload events\n */\n start(): void {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", this.boundHandleBeforeUnload);\n // Also listen for pagehide which is more reliable on mobile\n window.addEventListener(\"pagehide\", this.boundHandleBeforeUnload);\n }\n }\n\n /**\n * Stop listening for events\n */\n stop(): void {\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", this.boundHandleBeforeUnload);\n window.removeEventListener(\"pagehide\", this.boundHandleBeforeUnload);\n }\n }\n\n /**\n * Handle visibility change\n */\n private handleVisibilityChange(): void {\n if (document.visibilityState === \"hidden\") {\n this.flushWithBeacon();\n }\n }\n\n /**\n * Handle before unload\n */\n private handleBeforeUnload(): void {\n this.flushWithBeacon();\n }\n\n /**\n * Flush events using sendBeacon\n */\n private flushWithBeacon(): void {\n // Use sendBeacon for reliability when page is closing\n this.client.flush({ useBeacon: true }).catch(() => {\n // Ignore errors during page unload\n });\n }\n}\n\n/**\n * Check if sendBeacon is available\n */\nexport function isSendBeaconAvailable(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n typeof navigator.sendBeacon === \"function\"\n );\n}\n","import type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\nexport interface BounceBackConfig {\n enabled?: boolean;\n thresholdSeconds?: number;\n}\n\nconst STORAGE_KEY = \"pih_outbound\";\n\ninterface OutboundRecord {\n url: string;\n timestamp: number;\n pihAttributes: Record<string, string>;\n}\n\nexport class BounceBackDetector {\n private client: PIHClient;\n private thresholdMs: number;\n private boundHandleClick: (e: MouseEvent) => void;\n\n constructor(client: PIHClient, config: BounceBackConfig = {}) {\n this.client = client;\n this.thresholdMs = (config.thresholdSeconds ?? 30) * 1000;\n this.boundHandleClick = this.handleClick.bind(this);\n }\n\n start(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n // Check for bounce-back on page load\n this.checkBounceBack();\n\n // Listen for outbound link clicks\n document.addEventListener(\"click\", this.boundHandleClick, true);\n }\n\n stop(): void {\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"click\", this.boundHandleClick, true);\n }\n }\n\n private handleClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n if (!target) return;\n\n const anchor = target.closest(\"a\");\n if (!anchor || !anchor.href) return;\n\n // Check if external link\n try {\n const linkUrl = new URL(anchor.href);\n if (linkUrl.origin === window.location.origin) return;\n\n // Collect data-pih-* attributes from the anchor\n const pihAttributes: Record<string, string> = {};\n for (const attr of Array.from(anchor.attributes)) {\n if (attr.name.startsWith(\"data-pih-\")) {\n const key = attr.name.slice(\"data-pih-\".length).replace(/-/g, \"_\");\n pihAttributes[key] = attr.value;\n }\n }\n\n // Store outbound record in sessionStorage\n const record: OutboundRecord = {\n url: anchor.href,\n timestamp: Date.now(),\n pihAttributes,\n };\n\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(record));\n } catch {\n // Ignore storage errors\n }\n } catch {\n // Invalid URL, ignore\n }\n }\n\n private checkBounceBack(): void {\n try {\n const stored = sessionStorage.getItem(STORAGE_KEY);\n if (!stored) return;\n\n // Clean up immediately\n sessionStorage.removeItem(STORAGE_KEY);\n\n const record: OutboundRecord = JSON.parse(stored);\n const timeAway = Date.now() - record.timestamp;\n\n if (timeAway <= this.thresholdMs) {\n this.client.track(\"$bounce_back\", {\n original_click_url: record.url,\n time_away_seconds: Math.round(timeAway / 1000),\n page_returned_to: window.location.href,\n ...record.pihAttributes,\n });\n }\n } catch {\n // Ignore parse/storage errors\n }\n }\n}\n","/**\n * Browser context auto-detection\n * Collects screen, viewport, locale, timezone, connection, device, and page info\n */\n\n/**\n * Detect device type from user agent and screen dimensions\n */\nfunction detectDeviceType(): string {\n if (typeof navigator === \"undefined\" || typeof window === \"undefined\") {\n return \"unknown\";\n }\n\n const ua = navigator.userAgent.toLowerCase();\n\n // Check for tablets first (they can match mobile patterns)\n if (/ipad|tablet|playbook|silk/.test(ua)) {\n return \"tablet\";\n }\n\n // Check for mobile devices\n if (\n /mobile|iphone|ipod|android.*mobile|windows phone|blackberry|opera mini|opera mobi/.test(\n ua\n )\n ) {\n return \"mobile\";\n }\n\n // Fallback: use screen width heuristic\n const screenWidth = window.screen?.width ?? 0;\n if (screenWidth > 0 && screenWidth < 768) {\n return \"mobile\";\n }\n if (screenWidth >= 768 && screenWidth < 1024) {\n return \"tablet\";\n }\n\n return \"desktop\";\n}\n\n/**\n * Get the effective connection type if available\n */\nfunction getConnectionType(): string | undefined {\n if (typeof navigator === \"undefined\") return undefined;\n\n // navigator.connection is experimental and not in all browsers\n const nav = navigator as unknown as Record<string, unknown>;\n const conn = nav[\"connection\"] as\n | { effectiveType?: string }\n | undefined;\n\n return conn?.effectiveType ?? undefined;\n}\n\n/**\n * Collect browser context data.\n * Returns a Record matching EventContextSchema field names.\n */\nexport function getWebContext(): Record<string, unknown> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return {};\n }\n\n const context: Record<string, unknown> = {\n // Screen dimensions\n screenWidth: window.screen?.width ?? undefined,\n screenHeight: window.screen?.height ?? undefined,\n\n // Viewport dimensions\n viewportWidth: window.innerWidth ?? undefined,\n viewportHeight: window.innerHeight ?? undefined,\n\n // Locale and timezone\n locale: navigator?.language ?? undefined,\n timezone: getTimezone(),\n\n // Device type\n deviceType: detectDeviceType(),\n\n // Page info\n pageUrl: window.location.href,\n pagePath: window.location.pathname,\n pageTitle: document.title || undefined,\n referrer: document.referrer || undefined,\n };\n\n // Connection type (optional API)\n const connectionType = getConnectionType();\n if (connectionType) {\n context[\"connectionType\"] = connectionType;\n }\n\n // Remove undefined values to keep payload clean\n return Object.fromEntries(\n Object.entries(context).filter(([, v]) => v !== undefined)\n );\n}\n\n/**\n * Safely get timezone from Intl API\n */\nfunction getTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n}\n","/**\n * Engagement tracking for time-on-page and scroll depth.\n * Only activates when `autocapture.engagement: true`.\n */\n\nimport type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Scroll depth thresholds to track (percentage)\n */\nconst SCROLL_THRESHOLDS = [25, 50, 75, 100] as const;\n\n/**\n * EngagementTracker tracks visible time-on-page and scroll depth.\n */\nexport class EngagementTracker {\n private client: PIHClient | null = null;\n private started = false;\n\n // Time-on-page tracking\n private visibleStartTime = 0;\n private totalVisibleTime = 0;\n\n // Scroll depth tracking\n private reachedThresholds = new Set<number>();\n\n // Bound event handlers for cleanup\n private boundHandleVisibilityChange: () => void;\n private boundHandleScroll: () => void;\n\n constructor() {\n this.boundHandleVisibilityChange = this.handleVisibilityChange.bind(this);\n this.boundHandleScroll = this.handleScroll.bind(this);\n }\n\n /**\n * Start tracking engagement metrics.\n */\n start(client: PIHClient): void {\n if (this.started) return;\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n this.client = client;\n this.started = true;\n\n // Reset state\n this.visibleStartTime = Date.now();\n this.totalVisibleTime = 0;\n this.reachedThresholds.clear();\n\n // Start as visible if page is currently visible\n if (document.visibilityState === \"visible\") {\n this.visibleStartTime = Date.now();\n }\n\n // Listen for visibility changes (time-on-page)\n document.addEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n\n // Listen for scroll events (scroll depth)\n window.addEventListener(\"scroll\", this.boundHandleScroll, { passive: true });\n }\n\n /**\n * Stop tracking engagement metrics.\n */\n stop(): void {\n if (!this.started) return;\n\n // Send final page_engaged event if there was visible time\n this.accumulateVisibleTime();\n if (this.totalVisibleTime > 0 && this.client) {\n this.client.track(\"page_engaged\", {\n visible_duration_ms: this.totalVisibleTime,\n page_path: typeof window !== \"undefined\" ? window.location.pathname : undefined,\n });\n }\n\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\n \"visibilitychange\",\n this.boundHandleVisibilityChange\n );\n }\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"scroll\", this.boundHandleScroll);\n }\n\n this.started = false;\n this.client = null;\n }\n\n /**\n * Handle visibility change events\n */\n private handleVisibilityChange(): void {\n if (!this.started || !this.client) return;\n\n if (document.visibilityState === \"hidden\") {\n // Page hidden - accumulate visible time and send event\n this.accumulateVisibleTime();\n\n if (this.totalVisibleTime > 0) {\n this.client.track(\"page_engaged\", {\n visible_duration_ms: this.totalVisibleTime,\n page_path: window.location.pathname,\n });\n\n // Reset for next visible period\n this.totalVisibleTime = 0;\n }\n } else {\n // Page became visible again - restart timer\n this.visibleStartTime = Date.now();\n }\n }\n\n /**\n * Add elapsed visible time to total\n */\n private accumulateVisibleTime(): void {\n if (this.visibleStartTime > 0) {\n this.totalVisibleTime += Date.now() - this.visibleStartTime;\n this.visibleStartTime = Date.now();\n }\n }\n\n /**\n * Handle scroll events for depth tracking\n */\n private handleScroll(): void {\n if (!this.started || !this.client) return;\n\n const scrollPercent = this.getScrollPercent();\n\n for (const threshold of SCROLL_THRESHOLDS) {\n if (scrollPercent >= threshold && !this.reachedThresholds.has(threshold)) {\n this.reachedThresholds.add(threshold);\n this.client.track(\"scroll_depth_reached\", {\n depth_percent: threshold,\n page_path: window.location.pathname,\n });\n }\n }\n }\n\n /**\n * Calculate current scroll depth as a percentage (0-100)\n */\n private getScrollPercent(): number {\n const docHeight = Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight\n );\n const viewportHeight = window.innerHeight;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n const scrollableHeight = docHeight - viewportHeight;\n if (scrollableHeight <= 0) return 100; // No scrolling needed\n\n return Math.min(100, Math.round((scrollTop / scrollableHeight) * 100));\n }\n}\n","/**\n * Error tracking for uncaught errors and unhandled promise rejections.\n * Only activates when `autocapture.errorTracking: true`.\n * Caps at 10 errors per page load to prevent flooding.\n */\n\nimport type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Maximum number of errors to report per page load\n */\nconst MAX_ERRORS_PER_PAGE = 10;\n\n/**\n * ErrorTracker captures uncaught errors and unhandled rejections.\n */\nexport class ErrorTracker {\n private client: PIHClient | null = null;\n private started = false;\n private errorCount = 0;\n\n // Bound event handlers for cleanup\n private boundHandleError: (event: ErrorEvent) => void;\n private boundHandleRejection: (event: PromiseRejectionEvent) => void;\n\n constructor() {\n this.boundHandleError = this.handleError.bind(this);\n this.boundHandleRejection = this.handleRejection.bind(this);\n }\n\n /**\n * Start tracking errors.\n */\n start(client: PIHClient): void {\n if (this.started) return;\n if (typeof window === \"undefined\") return;\n\n this.client = client;\n this.started = true;\n this.errorCount = 0;\n\n window.addEventListener(\"error\", this.boundHandleError);\n window.addEventListener(\n \"unhandledrejection\",\n this.boundHandleRejection\n );\n }\n\n /**\n * Stop tracking errors.\n */\n stop(): void {\n if (!this.started) return;\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"error\", this.boundHandleError);\n window.removeEventListener(\n \"unhandledrejection\",\n this.boundHandleRejection\n );\n }\n\n this.started = false;\n this.client = null;\n }\n\n /**\n * Handle uncaught errors\n */\n private handleError(event: ErrorEvent): void {\n if (!this.started || !this.client) return;\n if (!this.canReport()) return;\n\n this.errorCount++;\n\n this.client.track(\"js_error\", {\n message: event.message || \"Unknown error\",\n filename: event.filename || undefined,\n lineno: event.lineno || undefined,\n colno: event.colno || undefined,\n stack: event.error?.stack || undefined,\n });\n }\n\n /**\n * Handle unhandled promise rejections\n */\n private handleRejection(event: PromiseRejectionEvent): void {\n if (!this.started || !this.client) return;\n if (!this.canReport()) return;\n\n this.errorCount++;\n\n const reason = event.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : typeof reason === \"string\"\n ? reason\n : \"Unhandled promise rejection\";\n const stack = reason instanceof Error ? reason.stack : undefined;\n\n this.client.track(\"js_error\", {\n message,\n filename: undefined,\n lineno: undefined,\n colno: undefined,\n stack,\n });\n }\n\n /**\n * Check if we can still report errors (under the cap)\n */\n private canReport(): boolean {\n return this.errorCount < MAX_ERRORS_PER_PAGE;\n }\n}\n","/**\n * Performance tracking using web-vitals library.\n * Tracks LCP, FID, CLS, INP, TTFB as `web_vital` events.\n * Only activates when `autocapture.performance: true`.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * Web Vital metric shape (matches web-vitals library output)\n */\ninterface WebVitalMetric {\n name: string;\n value: number;\n rating: \"good\" | \"needs-improvement\" | \"poor\";\n}\n\n/**\n * Minimal type for the web-vitals module (optional peer dependency)\n */\ninterface WebVitalsModule {\n onLCP?: (cb: (metric: WebVitalMetric) => void) => void;\n onFID?: (cb: (metric: WebVitalMetric) => void) => void;\n onCLS?: (cb: (metric: WebVitalMetric) => void) => void;\n onINP?: (cb: (metric: WebVitalMetric) => void) => void;\n onTTFB?: (cb: (metric: WebVitalMetric) => void) => void;\n}\n\n/**\n * PerformanceTracker captures Web Vitals and sends them as events.\n */\nexport class PerformanceTracker {\n private client: PIHClient | null = null;\n private started = false;\n\n /**\n * Start tracking performance metrics.\n * Attempts to dynamically import web-vitals; silently no-ops if unavailable.\n */\n start(client: PIHClient): void {\n if (this.started) return;\n this.client = client;\n this.started = true;\n\n this.initWebVitals();\n }\n\n /**\n * Stop tracking performance metrics.\n */\n stop(): void {\n this.started = false;\n this.client = null;\n }\n\n private async initWebVitals(): Promise<void> {\n try {\n // Dynamic import so web-vitals is optional.\n // Use variable to prevent TypeScript from resolving the module statically.\n const moduleName = \"web-vitals\";\n const webVitals: WebVitalsModule = await import(/* webpackIgnore: true */ moduleName) as any;\n\n const reportMetric = (metric: WebVitalMetric) => {\n if (!this.started || !this.client) return;\n this.client.track(\"web_vital\", {\n name: metric.name,\n value: metric.value,\n rating: metric.rating,\n });\n };\n\n if (webVitals.onLCP) webVitals.onLCP(reportMetric);\n if (webVitals.onFID) webVitals.onFID(reportMetric);\n if (webVitals.onCLS) webVitals.onCLS(reportMetric);\n if (webVitals.onINP) webVitals.onINP(reportMetric);\n if (webVitals.onTTFB) webVitals.onTTFB(reportMetric);\n } catch {\n // web-vitals not installed - silently skip\n if (typeof console !== \"undefined\") {\n console.debug(\n \"[PIH] web-vitals package not found. Install it to enable performance tracking.\"\n );\n }\n }\n }\n}\n","import type { PIHClient } from \"@product-intelligence-hub/sdk-core\";\n\nimport type { RecordingRule, MaskingConfig } from \"./recording-types.js\";\n\n/**\n * Recording config returned from the ingest API\n */\ninterface RecordingConfig {\n enabled: boolean;\n rules: RecordingRule[];\n maxDurationSeconds: number;\n maskingConfig: MaskingConfig;\n}\n\n/**\n * rrweb event type (loosely typed to avoid hard dependency)\n */\ntype RRWebEvent = Record<string, unknown>;\n\n/**\n * Stop function returned by rrweb record\n */\ntype RRWebStopFn = () => void;\n\n/**\n * Rage click state tracker\n */\ninterface RageClickState {\n clicks: Array<{ x: number; y: number; timestamp: number }>;\n}\n\nconst BUFFER_MAX_EVENTS = 50;\nconst BUFFER_FLUSH_INTERVAL_MS = 5_000;\nconst RAGE_CLICK_THRESHOLD = 3;\nconst RAGE_CLICK_WINDOW_MS = 500;\nconst RAGE_CLICK_RADIUS_PX = 30;\n\n/**\n * RecordingManager handles session recording via rrweb.\n * - Fetches recording config from the ingest API\n * - Evaluates rules client-side\n * - Dynamically imports rrweb and starts recording\n * - Buffers events and flushes to the ingest API\n * - Enforces duration cap\n * - Detects rage clicks\n */\nexport class RecordingManager {\n private client: PIHClient;\n private apiUrl: string;\n private apiKey: string;\n private config: RecordingConfig | null = null;\n private buffer: RRWebEvent[] = [];\n private sequence = 0;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private durationTimer: ReturnType<typeof setTimeout> | null = null;\n private rrwebStop: RRWebStopFn | null = null;\n private sessionId: string | null = null;\n private recording = false;\n private rageClickState: RageClickState = { clicks: [] };\n private debug: boolean;\n private matchedRule: string | null = null;\n\n constructor(client: PIHClient, apiUrl: string, apiKey: string, debug = false) {\n this.client = client;\n this.apiUrl = apiUrl.replace(/\\/$/, \"\");\n this.apiKey = apiKey;\n this.debug = debug;\n }\n\n /**\n * Start the recording manager: fetch config, evaluate rules, begin recording if matched\n */\n async start(): Promise<void> {\n try {\n await this.fetchConfig();\n\n if (!this.config || !this.config.enabled) {\n this.log(\"Recording not enabled\");\n return;\n }\n\n const matchedRule = this.evaluateRules(this.config.rules);\n if (!matchedRule) {\n this.log(\"No recording rule matched\");\n return;\n }\n\n this.matchedRule = matchedRule.type;\n\n // Check sample rate\n if (Math.random() > matchedRule.sampleRate) {\n this.log(\"Sampled out by rule\", matchedRule.type);\n return;\n }\n\n await this.startRecording();\n } catch (error) {\n this.log(\"Failed to start recording:\", error);\n }\n }\n\n /**\n * Stop recording and flush remaining events\n */\n stop(): void {\n if (this.rrwebStop) {\n this.rrwebStop();\n this.rrwebStop = null;\n }\n\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.durationTimer) {\n clearTimeout(this.durationTimer);\n this.durationTimer = null;\n }\n\n // Flush remaining events\n if (this.buffer.length > 0) {\n this.flush().catch((err) => this.log(\"Final flush error:\", err));\n }\n\n this.recording = false;\n this.removeRageClickListener();\n this.log(\"Recording stopped\");\n }\n\n /**\n * Check if currently recording\n */\n isRecording(): boolean {\n return this.recording;\n }\n\n // ===============================\n // Private methods\n // ===============================\n\n private async fetchConfig(): Promise<void> {\n const url = `${this.apiUrl}/v1/recording-config`;\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch recording config: ${response.status}`);\n }\n\n const data = (await response.json()) as { config: RecordingConfig };\n this.config = data.config;\n this.log(\"Fetched recording config:\", this.config);\n }\n\n private evaluateRules(rules: RecordingRule[]): RecordingRule | null {\n const currentUrl = window.location.href;\n\n for (const rule of rules) {\n switch (rule.type) {\n case \"all_sessions\":\n return rule;\n\n case \"url_match\":\n if (rule.pattern) {\n try {\n const regex = new RegExp(rule.pattern);\n if (regex.test(currentUrl)) {\n return rule;\n }\n } catch {\n this.log(\"Invalid URL regex pattern:\", rule.pattern);\n }\n }\n break;\n\n case \"event_match\":\n // Event match rules are evaluated reactively when events are tracked.\n // For initial evaluation, skip — the SDK will check when events fire.\n break;\n\n case \"rage_click\":\n // Rage click detection is passive; always enable if rule exists.\n return rule;\n }\n }\n\n return null;\n }\n\n private async startRecording(): Promise<void> {\n if (this.recording) return;\n\n this.sessionId = this.client.getSessionId();\n if (!this.sessionId) {\n this.log(\"No session ID available, skipping recording\");\n return;\n }\n\n try {\n // Dynamically import rrweb\n // @ts-expect-error rrweb is a peer dependency, installed separately\n const rrweb = await import(\"rrweb\");\n\n const maskingConfig = this.config?.maskingConfig ?? {\n maskAllInputs: true,\n maskAllText: false,\n maskSelectors: [],\n unmaskSelectors: [],\n blockSelectors: [],\n };\n\n this.rrwebStop = rrweb.record({\n emit: (event: RRWebEvent) => {\n this.onEvent(event);\n },\n maskAllInputs: maskingConfig.maskAllInputs,\n maskTextSelector: maskingConfig.maskAllText ? \"*\" : undefined,\n maskInputOptions: {\n password: true,\n email: maskingConfig.maskAllInputs,\n },\n blockSelector: maskingConfig.blockSelectors.length > 0\n ? maskingConfig.blockSelectors.join(\", \")\n : undefined,\n });\n\n this.recording = true;\n\n // Set up buffer flush interval\n this.flushTimer = setInterval(() => {\n if (this.buffer.length > 0) {\n this.flush().catch((err) => this.log(\"Flush error:\", err));\n }\n }, BUFFER_FLUSH_INTERVAL_MS);\n\n // Set up duration cap\n const maxDuration = (this.config?.maxDurationSeconds ?? 600) * 1000;\n this.durationTimer = setTimeout(() => {\n this.log(\"Duration cap reached, stopping recording\");\n this.stop();\n }, maxDuration);\n\n // Set up rage click detection\n this.setupRageClickDetection();\n\n this.log(\"Recording started for session:\", this.sessionId);\n } catch (error) {\n this.log(\"Failed to import rrweb or start recording:\", error);\n }\n }\n\n private onEvent(event: RRWebEvent): void {\n this.buffer.push(event);\n\n if (this.buffer.length >= BUFFER_MAX_EVENTS) {\n this.flush().catch((err) => this.log(\"Buffer flush error:\", err));\n }\n }\n\n private async flush(): Promise<void> {\n if (this.buffer.length === 0 || !this.sessionId) return;\n\n const events = [...this.buffer];\n this.buffer = [];\n const currentSequence = this.sequence++;\n\n try {\n const url = `${this.apiUrl}/v1/recordings`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n sessionId: this.sessionId,\n sequence: currentSequence,\n events,\n pageUrl: window.location.href,\n triggerRule: this.matchedRule ?? undefined,\n }),\n });\n\n if (!response.ok) {\n this.log(\"Failed to upload recording chunk:\", response.status);\n // Re-add events to buffer on failure\n this.buffer.unshift(...events);\n } else {\n this.log(\"Uploaded chunk\", currentSequence, \"with\", events.length, \"events\");\n }\n } catch (error) {\n this.log(\"Failed to upload recording chunk:\", error);\n // Re-add events to buffer on failure\n this.buffer.unshift(...events);\n }\n }\n\n // ===============================\n // Rage click detection\n // ===============================\n\n private boundHandleClick: ((e: MouseEvent) => void) | null = null;\n\n private setupRageClickDetection(): void {\n this.boundHandleClick = this.handleClickForRageDetection.bind(this);\n document.addEventListener(\"click\", this.boundHandleClick, true);\n }\n\n private removeRageClickListener(): void {\n if (this.boundHandleClick) {\n document.removeEventListener(\"click\", this.boundHandleClick, true);\n this.boundHandleClick = null;\n }\n }\n\n private handleClickForRageDetection(event: MouseEvent): void {\n const now = Date.now();\n const { clientX: x, clientY: y } = event;\n\n // Remove old clicks outside the time window\n this.rageClickState.clicks = this.rageClickState.clicks.filter(\n (click) => now - click.timestamp < RAGE_CLICK_WINDOW_MS\n );\n\n this.rageClickState.clicks.push({ x, y, timestamp: now });\n\n // Check if we have enough clicks in the same area\n if (this.rageClickState.clicks.length >= RAGE_CLICK_THRESHOLD) {\n const recentClicks = this.rageClickState.clicks;\n const firstClick = recentClicks[0]!;\n\n const allNearby = recentClicks.every(\n (click) =>\n Math.abs(click.x - firstClick.x) <= RAGE_CLICK_RADIUS_PX &&\n Math.abs(click.y - firstClick.y) <= RAGE_CLICK_RADIUS_PX\n );\n\n if (allNearby) {\n this.client.track(\"rage_click\", {\n x: firstClick.x,\n y: firstClick.y,\n click_count: recentClicks.length,\n page_url: window.location.href,\n });\n\n // Reset to avoid repeated triggers\n this.rageClickState.clicks = [];\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PIH Recording]\", ...args);\n }\n }\n}\n","import type { StorageAdapter } from \"@product-intelligence-hub/sdk-core\";\n\n/**\n * In-memory storage fallback when localStorage is unavailable\n */\nclass MemoryStorage implements StorageAdapter {\n private data = new Map<string, string>();\n\n async get(key: string): Promise<string | null> {\n return this.data.get(key) ?? null;\n }\n\n async set(key: string, value: string): Promise<void> {\n this.data.set(key, value);\n }\n\n async remove(key: string): Promise<void> {\n this.data.delete(key);\n }\n}\n\n/**\n * Check if localStorage is available\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = \"__pih_test__\";\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * localStorage adapter with fallback to in-memory storage\n */\nclass LocalStorageAdapter implements StorageAdapter {\n private fallback: MemoryStorage | null = null;\n private useLocalStorage: boolean;\n\n constructor() {\n this.useLocalStorage = isLocalStorageAvailable();\n if (!this.useLocalStorage) {\n this.fallback = new MemoryStorage();\n console.warn(\n \"[PIH] localStorage unavailable, using in-memory storage. Data will not persist across page loads.\"\n );\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (this.fallback) {\n return this.fallback.get(key);\n }\n\n try {\n return localStorage.getItem(key);\n } catch {\n // localStorage access might fail in some contexts\n if (!this.fallback) {\n this.fallback = new MemoryStorage();\n }\n return this.fallback.get(key);\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (this.fallback) {\n return this.fallback.set(key, value);\n }\n\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n // Handle quota exceeded or other errors\n if (!this.fallback) {\n this.fallback = new MemoryStorage();\n console.warn(\n \"[PIH] localStorage write failed, falling back to in-memory storage:\",\n error\n );\n }\n return this.fallback.set(key, value);\n }\n }\n\n async remove(key: string): Promise<void> {\n if (this.fallback) {\n return this.fallback.remove(key);\n }\n\n try {\n localStorage.removeItem(key);\n } catch {\n // Ignore removal errors\n }\n }\n}\n\n/**\n * Create the web storage adapter\n */\nexport function createWebStorage(): StorageAdapter {\n return new LocalStorageAdapter();\n}\n\n/**\n * Export the storage adapter singleton\n */\nexport const webStorage = createWebStorage();\n","import { useSyncExternalStore, useCallback } from \"react\";\n\nimport { getInstance } from \"./index.js\";\n\ntype Listener = () => void;\n\n// Simple pub/sub for flag changes\nconst listeners = new Set<Listener>();\n\nfunction subscribe(listener: Listener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/**\n * Notify all subscribers of flag changes.\n * Call this after refreshFlags() completes.\n */\nexport function notifyFlagListeners(): void {\n for (const listener of listeners) {\n listener();\n }\n}\n\n/**\n * React hook to check if a feature flag is enabled.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const isEnabled = useFeatureFlag(\"enable_ai_chat\");\n * if (!isEnabled) return null;\n * return <AIChatWidget />;\n * }\n * ```\n */\nexport function useFeatureFlag(key: string, defaultValue = false): boolean {\n const getSnapshot = useCallback(() => {\n const client = getInstance();\n return client?.isFeatureEnabled(key, defaultValue) ?? defaultValue;\n }, [key, defaultValue]);\n\n return useSyncExternalStore(subscribe, getSnapshot, () => defaultValue);\n}\n\n/**\n * React hook to get all feature flags.\n *\n * @example\n * ```tsx\n * function FlagDebugPanel() {\n * const flags = useFeatureFlags();\n * return <pre>{JSON.stringify(flags, null, 2)}</pre>;\n * }\n * ```\n */\nexport function useFeatureFlags(): Record<string, boolean> {\n const getSnapshot = useCallback(() => {\n const client = getInstance();\n return client?.getFeatureFlags() ?? {};\n }, []);\n\n // Return stable reference via JSON comparison\n return useSyncExternalStore(\n subscribe,\n getSnapshot,\n () => ({})\n );\n}\n","import {\n PIHClient,\n type PIHConfig,\n type StorageAdapter,\n} from \"@product-intelligence-hub/sdk-core\";\n\nimport { Autocapture } from \"./autocapture.js\";\nimport { BeaconManager } from \"./beacon.js\";\nimport { BounceBackDetector } from \"./bounce-back.js\";\nimport { getWebContext } from \"./context.js\";\nimport { EngagementTracker } from \"./engagement.js\";\nimport { ErrorTracker } from \"./error-tracker.js\";\nimport { PerformanceTracker } from \"./performance.js\";\nimport { RecordingManager } from \"./recording.js\";\nimport { createWebStorage } from \"./storage.js\";\n\n/**\n * Web-specific PIH configuration\n */\nexport interface WebPIHConfig extends Omit<PIHConfig, \"platform\"> {\n /** Platform is always \"web\" for web SDK */\n platform?: \"web\";\n}\n\n/**\n * Web PIH Client\n * Extends the base client with web-specific features\n */\nexport class WebPIHClient extends PIHClient {\n private autocapture: Autocapture | null = null;\n private beacon: BeaconManager;\n private performanceTracker: PerformanceTracker | null = null;\n private engagementTracker: EngagementTracker | null = null;\n private errorTracker: ErrorTracker | null = null;\n private bounceBackDetector: BounceBackDetector | null = null;\n private recordingManager: RecordingManager | null = null;\n\n constructor(config: WebPIHConfig, storage?: StorageAdapter) {\n // Ensure platform is set to \"web\"\n const webConfig: PIHConfig = {\n ...config,\n platform: \"web\",\n };\n\n // Use provided storage or create web storage\n super(webConfig, storage ?? createWebStorage());\n\n // Set SDK metadata for transport headers\n this.transport.setSDKMeta({\n name: \"pih-sdk-web\",\n version: \"0.4.0\",\n });\n\n // Setup beacon manager for flush on page hide\n this.beacon = new BeaconManager(this);\n }\n\n /**\n * Return browser context for every event\n */\n protected override getContext(): Record<string, unknown> {\n return getWebContext();\n }\n\n /**\n * Initialize the web client\n */\n override async initialize(): Promise<void> {\n await super.initialize();\n\n // Start beacon manager\n this.beacon.start();\n\n // Setup autocapture if configured\n if (this.config.autocapture) {\n this.autocapture = new Autocapture(this, this.config.autocapture);\n this.autocapture.start();\n\n // Setup performance tracking (opt-in)\n if (this.config.autocapture.performance) {\n this.performanceTracker = new PerformanceTracker();\n this.performanceTracker.start(this);\n }\n\n // Setup engagement tracking (opt-in)\n if (this.config.autocapture.engagement) {\n this.engagementTracker = new EngagementTracker();\n this.engagementTracker.start(this);\n }\n\n // Setup error tracking (opt-in)\n if (this.config.autocapture.errorTracking) {\n this.errorTracker = new ErrorTracker();\n this.errorTracker.start(this);\n }\n }\n\n // Setup bounce-back detection (opt-in)\n if (this.config.bounceBack?.enabled) {\n this.bounceBackDetector = new BounceBackDetector(this, this.config.bounceBack);\n this.bounceBackDetector.start();\n }\n\n // Setup session recording (opt-in)\n if (this.config.recording?.enabled) {\n this.recordingManager = new RecordingManager(\n this,\n this.config.apiUrl ?? \"https://repoingest-production.up.railway.app\",\n this.config.apiKey,\n this.config.debug\n );\n this.recordingManager.start().catch((error) => {\n this.log(\"Failed to start recording:\", error);\n });\n }\n\n this.log(\"Web client initialized\");\n }\n\n /**\n * Enable autocapture after initialization\n */\n enableAutocapture(config?: PIHConfig[\"autocapture\"]): void {\n if (this.autocapture) {\n this.autocapture.stop();\n }\n this.autocapture = new Autocapture(this, config);\n this.autocapture.start();\n }\n\n /**\n * Disable autocapture\n */\n disableAutocapture(): void {\n if (this.autocapture) {\n this.autocapture.stop();\n this.autocapture = null;\n }\n }\n\n /**\n * Manually track a page view\n */\n trackPageView(): void {\n if (this.autocapture) {\n this.autocapture.trackPageView();\n } else {\n // Track page view without autocapture\n const url = new URL(window.location.href);\n this.track(\"page_viewed\", {\n path: url.pathname,\n search: url.search,\n hash: url.hash,\n referrer: document.referrer || null,\n title: document.title,\n url: window.location.href,\n });\n }\n }\n\n /**\n * Destroy the client\n */\n override destroy(): void {\n this.beacon.stop();\n\n if (this.autocapture) {\n this.autocapture.stop();\n }\n if (this.performanceTracker) {\n this.performanceTracker.stop();\n this.performanceTracker = null;\n }\n if (this.engagementTracker) {\n this.engagementTracker.stop();\n this.engagementTracker = null;\n }\n if (this.errorTracker) {\n this.errorTracker.stop();\n this.errorTracker = null;\n }\n if (this.bounceBackDetector) {\n this.bounceBackDetector.stop();\n this.bounceBackDetector = null;\n }\n if (this.recordingManager) {\n this.recordingManager.stop();\n this.recordingManager = null;\n }\n\n super.destroy();\n }\n\n protected override log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[PIH Web]\", ...args);\n }\n }\n}\n\n/**\n * Singleton instance\n */\nlet instance: WebPIHClient | null = null;\n\n/**\n * Initialize the PIH Web SDK\n */\nfunction init(config: WebPIHConfig): WebPIHClient {\n if (instance) {\n console.warn(\"[PIH] SDK already initialized. Returning existing instance.\");\n return instance;\n }\n\n instance = new WebPIHClient(config);\n\n // Auto-initialize\n instance.initialize().catch((error) => {\n console.error(\"[PIH] Failed to initialize:\", error);\n });\n\n return instance;\n}\n\n/**\n * Get the current instance\n */\nfunction getInstance(): WebPIHClient | null {\n return instance;\n}\n\n/**\n * Reset the singleton (for testing)\n */\nfunction resetInstance(): void {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n}\n\n// Default export for UMD/IIFE\nconst PIH = {\n init,\n getInstance,\n resetInstance,\n WebPIHClient,\n};\n\nexport default PIH;\nexport { init, getInstance, resetInstance };\n\n// React hooks for feature flags\nexport { useFeatureFlag, useFeatureFlags, notifyFlagListeners } from \"./hooks.js\";\n\n// Re-export types from core\nexport type {\n PIHConfig,\n TrackEvent,\n TrackOptions,\n TransportOptions,\n AutocaptureConfig,\n FeatureFlags,\n FeatureFlagConfig,\n PIHError,\n PIHErrorCode,\n} from \"@product-intelligence-hub/sdk-core\";\n"]}