sitepong 0.0.1 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +613 -61
- package/dist/index.d.mts +596 -3
- package/dist/index.d.ts +596 -3
- package/dist/index.js +4507 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4455 -10
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +409 -0
- package/dist/react/index.d.ts +409 -0
- package/dist/react/index.js +5922 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +5839 -0
- package/dist/react/index.mjs.map +1 -0
- package/package.json +66 -54
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/dsn.ts","../../src/core/breadcrumbs.ts","../../src/utils/platform.ts","../../src/utils/stacktrace.ts","../../src/transport/fetch.ts","../../src/core/client.ts","../../src/react/provider.tsx","../../src/react/error-boundary.tsx","../../src/flags/anonymous-id.ts","../../src/flags/context.ts","../../src/flags/evaluator.ts","../../src/flags/manager.ts","../../src/analytics/session.ts","../../src/analytics/autocapture.ts","../../src/analytics/manager.ts","../../src/fingerprint/tampering.ts","../../src/fingerprint/signals.ts","../../src/fingerprint/behavior.ts","../../src/fingerprint/vpn-detection.ts","../../src/fingerprint/manager.ts","../../src/replay/serializer.ts","../../src/replay/network.ts","../../src/replay/console.ts","../../src/replay/manager.ts","../../src/performance/manager.ts","../../src/performance/tracing.ts","../../src/crons.ts","../../src/metrics.ts","../../src/database.ts","../../src/profiling.ts","../../src/index.ts","../../src/react/hooks.ts"],"names":["jsx","DEFAULT_ENDPOINT","STORAGE_KEY","getConnectionType","init","DEFAULT_FLUSH_INTERVAL","DEFAULT_BATCH_SIZE","SitePongClient","captureMessage","setContext","setUser","setTags","flush","getVariantPayload","useContext","useRef","fetch","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ParsedDSN, SitePongConfig } from \"./types\";\n\n/**\n * Parse a DSN string into its components\n * Format: https://<public_key>@<host>/<project_id>\n * Example: https://abc123@ingest.sitepong.com/1\n */\nexport function parseDSN(dsn: string): ParsedDSN {\n const match = dsn.match(\n /^(https?):\\/\\/([^@]+)@([^/]+)\\/(.+)$/\n );\n\n if (!match) {\n throw new Error(\n `Invalid DSN: ${dsn}. Expected format: https://<public_key>@<host>/<project_id>`\n );\n }\n\n const [, protocol, publicKey, host, projectId] = match;\n\n return {\n protocol,\n publicKey,\n host,\n projectId,\n };\n}\n\n/**\n * Parse an API key and extract environment\n * Format: sp_live_xxx or sp_test_xxx\n */\nexport function parseApiKey(apiKey: string): {\n key: string;\n environment: \"production\" | \"test\";\n} {\n if (!apiKey.startsWith(\"sp_\")) {\n throw new Error(\n `Invalid API key format. Expected: sp_live_xxx or sp_test_xxx`\n );\n }\n\n const isTest = apiKey.startsWith(\"sp_test_\");\n const isLive = apiKey.startsWith(\"sp_live_\");\n\n if (!isTest && !isLive) {\n throw new Error(\n `Invalid API key prefix. Expected: sp_live_ or sp_test_`\n );\n }\n\n return {\n key: apiKey,\n environment: isLive ? \"production\" : \"test\",\n };\n}\n\n/**\n * Get the API endpoint URL from config\n */\nexport function getApiEndpoint(config: SitePongConfig): string {\n // Custom endpoint takes precedence\n if (config.apiEndpoint) {\n return config.apiEndpoint;\n }\n\n // Parse from DSN\n if (config.dsn) {\n const parsed = parseDSN(config.dsn);\n return `${parsed.protocol}://${parsed.host}`;\n }\n\n // Default endpoint for API key auth\n return \"https://api.sitepong.com\";\n}\n\n/**\n * Get authentication headers for API requests\n */\nexport function getAuthHeaders(config: SitePongConfig): Record<string, string> {\n if (config.dsn) {\n const parsed = parseDSN(config.dsn);\n return {\n \"X-SitePong-Key\": parsed.publicKey,\n \"X-SitePong-Project\": parsed.projectId,\n };\n }\n\n if (config.apiKey) {\n return {\n Authorization: `Bearer ${config.apiKey}`,\n };\n }\n\n return {};\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: SitePongConfig): void {\n if (!config.dsn && !config.apiKey) {\n throw new Error(\n \"SitePong: You must provide either a DSN or an API key\"\n );\n }\n\n if (config.dsn && config.apiKey) {\n console.warn(\n \"SitePong: Both DSN and API key provided. DSN will be used.\"\n );\n }\n\n if (config.sampleRate !== undefined) {\n if (config.sampleRate < 0 || config.sampleRate > 1) {\n throw new Error(\n \"SitePong: sampleRate must be between 0 and 1\"\n );\n }\n }\n}\n","import type { Breadcrumb } from \"./types\";\n\nconst MAX_BREADCRUMBS = 100;\n\nclass BreadcrumbManager {\n private breadcrumbs: Breadcrumb[] = [];\n private maxBreadcrumbs: number = MAX_BREADCRUMBS;\n\n setMaxBreadcrumbs(max: number): void {\n this.maxBreadcrumbs = max;\n this.trim();\n }\n\n add(breadcrumb: Omit<Breadcrumb, \"timestamp\">): void {\n const entry: Breadcrumb = {\n ...breadcrumb,\n timestamp: Date.now(),\n };\n\n this.breadcrumbs.push(entry);\n this.trim();\n }\n\n getAll(): Breadcrumb[] {\n return [...this.breadcrumbs];\n }\n\n clear(): void {\n this.breadcrumbs = [];\n }\n\n private trim(): void {\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\n this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);\n }\n }\n}\n\nexport const breadcrumbs = new BreadcrumbManager();\n\n/**\n * Add a breadcrumb to the trail\n */\nexport function addBreadcrumb(\n breadcrumb: Omit<Breadcrumb, \"timestamp\">\n): void {\n breadcrumbs.add(breadcrumb);\n}\n\n/**\n * Get all breadcrumbs\n */\nexport function getBreadcrumbs(): Breadcrumb[] {\n return breadcrumbs.getAll();\n}\n\n/**\n * Clear all breadcrumbs\n */\nexport function clearBreadcrumbs(): void {\n breadcrumbs.clear();\n}\n","/**\n * Platform detection and adapters for cross-platform support\n * Supports: Browser, React Native/Expo, Node.js\n */\n\nexport type Platform = \"browser\" | \"react-native\" | \"node\" | \"unknown\";\n\n/**\n * Detect the current platform\n */\nexport function detectPlatform(): Platform {\n // React Native detection\n if (\n typeof navigator !== \"undefined\" &&\n navigator.product === \"ReactNative\"\n ) {\n return \"react-native\";\n }\n\n // Node.js detection\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n // Browser detection\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n return \"browser\";\n }\n\n return \"unknown\";\n}\n\nexport const currentPlatform = detectPlatform();\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return currentPlatform === \"browser\";\n}\n\n/**\n * Check if running in React Native\n */\nexport function isReactNative(): boolean {\n return currentPlatform === \"react-native\";\n}\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return currentPlatform === \"node\";\n}\n\n/**\n * Get device info based on platform\n */\nexport function getDeviceInfo(): {\n platform: Platform;\n userAgent?: string;\n deviceName?: string;\n osName?: string;\n osVersion?: string;\n appVersion?: string;\n} {\n const info: ReturnType<typeof getDeviceInfo> = {\n platform: currentPlatform,\n };\n\n if (isBrowser() && typeof navigator !== \"undefined\") {\n info.userAgent = navigator.userAgent;\n }\n\n // React Native device info would be injected via configuration\n // since we can't directly access native modules from here\n\n return info;\n}\n\n/**\n * Platform-agnostic storage interface\n */\nexport interface StorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * Get storage adapter for current platform\n */\nexport function getStorageAdapter(): StorageAdapter | null {\n if (isBrowser() && typeof localStorage !== \"undefined\") {\n return {\n getItem: async (key) => localStorage.getItem(key),\n setItem: async (key, value) => localStorage.setItem(key, value),\n removeItem: async (key) => localStorage.removeItem(key),\n };\n }\n\n // React Native AsyncStorage would be passed in via config\n // Node.js could use file-based storage\n\n return null;\n}\n\n/**\n * Platform-agnostic network request\n */\nexport async function platformFetch(\n url: string,\n options: RequestInit\n): Promise<Response> {\n // Use native fetch if available (browser, React Native with polyfill, Node 18+)\n if (typeof fetch !== \"undefined\") {\n return fetch(url, options);\n }\n\n throw new Error(\"No fetch implementation available\");\n}\n\n/**\n * Get current URL (browser only)\n */\nexport function getCurrentUrl(): string | null {\n if (isBrowser() && typeof window !== \"undefined\") {\n return window.location.href;\n }\n return null;\n}\n\n/**\n * Get referrer (browser only)\n */\nexport function getReferrer(): string | null {\n if (isBrowser() && typeof document !== \"undefined\") {\n return document.referrer || null;\n }\n return null;\n}\n","import type { StackFrame } from \"../core/types\";\nimport { isBrowser, isReactNative } from \"./platform\";\n\n/**\n * Parse an Error stack trace into structured frames\n * Works across Browser, React Native, and Node.js\n */\nexport function parseStackTrace(error: Error): StackFrame[] {\n if (!error.stack) {\n return [];\n }\n\n const lines = error.stack.split(\"\\n\");\n const frames: StackFrame[] = [];\n\n for (const line of lines) {\n const frame = parseStackLine(line);\n if (frame) {\n frames.push(frame);\n }\n }\n\n return frames;\n}\n\n/**\n * Parse a single line of a stack trace\n */\nfunction parseStackLine(line: string): StackFrame | null {\n // Chrome/Edge/Node format: \" at functionName (filename:line:col)\"\n const chromeMatch = line.match(\n /^\\s*at\\s+(?:(.+?)\\s+\\()?(?:(.+?):(\\d+):(\\d+))\\)?$/\n );\n\n if (chromeMatch) {\n return {\n function: chromeMatch[1] || \"anonymous\",\n filename: chromeMatch[2],\n lineno: parseInt(chromeMatch[3], 10),\n colno: parseInt(chromeMatch[4], 10),\n in_app: !chromeMatch[2]?.includes(\"node_modules\"),\n };\n }\n\n // Firefox/Safari format: \"functionName@filename:line:col\"\n const firefoxMatch = line.match(/^(.+?)@(.+?):(\\d+):(\\d+)$/);\n\n if (firefoxMatch) {\n return {\n function: firefoxMatch[1] || \"anonymous\",\n filename: firefoxMatch[2],\n lineno: parseInt(firefoxMatch[3], 10),\n colno: parseInt(firefoxMatch[4], 10),\n in_app: !firefoxMatch[2]?.includes(\"node_modules\"),\n };\n }\n\n return null;\n}\n\n/**\n * Generate a unique event ID\n */\nexport function generateEventId(): string {\n // Generate a UUID v4-like ID\n const hex = \"0123456789abcdef\";\n let id = \"\";\n\n for (let i = 0; i < 32; i++) {\n id += hex[Math.floor(Math.random() * 16)];\n }\n\n return id;\n}\n\n/**\n * Get device/browser context information\n * Works across Browser, React Native, and Node.js\n */\nexport function getBrowserContext(): {\n browser: { name: string; version: string };\n os: { name: string; version: string };\n runtime?: { name: string; version: string };\n} {\n // React Native\n if (isReactNative()) {\n return {\n browser: { name: \"React Native\", version: \"unknown\" },\n os: { name: \"unknown\", version: \"unknown\" },\n runtime: { name: \"React Native\", version: \"unknown\" },\n };\n }\n\n // Node.js\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return {\n browser: { name: \"Node.js\", version: process.versions.node },\n os: {\n name: process.platform || \"unknown\",\n version: process.version || \"unknown\"\n },\n runtime: { name: \"Node.js\", version: process.versions.node },\n };\n }\n\n // Browser\n if (typeof navigator === \"undefined\") {\n return {\n browser: { name: \"unknown\", version: \"unknown\" },\n os: { name: \"unknown\", version: \"unknown\" },\n };\n }\n\n const ua = navigator.userAgent;\n\n // Simple browser detection\n let browserName = \"unknown\";\n let browserVersion = \"unknown\";\n\n if (ua.includes(\"Firefox/\")) {\n browserName = \"Firefox\";\n browserVersion = ua.match(/Firefox\\/(\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Edg/\")) {\n browserName = \"Edge\";\n browserVersion = ua.match(/Edg\\/(\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Chrome/\")) {\n browserName = \"Chrome\";\n browserVersion = ua.match(/Chrome\\/(\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Safari/\") && !ua.includes(\"Chrome\")) {\n browserName = \"Safari\";\n browserVersion = ua.match(/Version\\/(\\d+)/)?.[1] || \"unknown\";\n }\n\n // Simple OS detection\n let osName = \"unknown\";\n let osVersion = \"unknown\";\n\n if (ua.includes(\"Windows\")) {\n osName = \"Windows\";\n osVersion = ua.match(/Windows NT (\\d+\\.\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Mac OS X\")) {\n osName = \"macOS\";\n osVersion =\n ua.match(/Mac OS X (\\d+[._]\\d+)/)?.[1]?.replace(\"_\", \".\") || \"unknown\";\n } else if (ua.includes(\"Linux\")) {\n osName = \"Linux\";\n } else if (ua.includes(\"Android\")) {\n osName = \"Android\";\n osVersion = ua.match(/Android (\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"iOS\") || ua.includes(\"iPhone\") || ua.includes(\"iPad\")) {\n osName = \"iOS\";\n osVersion = ua.match(/OS (\\d+)/)?.[1] || \"unknown\";\n }\n\n return {\n browser: { name: browserName, version: browserVersion },\n os: { name: osName, version: osVersion },\n };\n}\n\n/**\n * Get current URL and request info\n * Platform-aware - works in browser, returns empty in RN/Node\n */\nexport function getRequestContext(): {\n url: string;\n referrer: string;\n} {\n if (isBrowser() && typeof window !== \"undefined\") {\n return {\n url: window.location.href,\n referrer: document.referrer || \"\",\n };\n }\n\n // React Native and Node.js don't have a \"current URL\" concept\n // This would be set manually via navigation tracking\n return { url: \"\", referrer: \"\" };\n}\n","import type { ErrorEvent, SitePongConfig } from \"../core/types\";\nimport { getApiEndpoint, getAuthHeaders } from \"../core/dsn\";\n\nexport interface TransportResponse {\n success: boolean;\n eventId?: string;\n error?: string;\n}\n\n/**\n * Send an error event to the SitePong API\n */\nexport async function sendErrorEvent(\n event: ErrorEvent,\n config: SitePongConfig\n): Promise<TransportResponse> {\n const endpoint = getApiEndpoint(config);\n const headers = getAuthHeaders(config);\n\n try {\n const response = await fetch(`${endpoint}/api/errors`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n title: event.exception?.type || \"Error\",\n message: event.message,\n stack: event.exception?.stacktrace\n ?.map(\n (frame) =>\n ` at ${frame.function || \"anonymous\"} (${frame.filename}:${frame.lineno}:${frame.colno})`\n )\n .join(\"\\n\"),\n level: event.level,\n timestamp: event.timestamp,\n environment: event.environment,\n release: event.release,\n tags: event.tags,\n extra: event.extra,\n user: event.user,\n breadcrumbs: event.breadcrumbs,\n context: event.context,\n request: event.request,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n return {\n success: false,\n error: `HTTP ${response.status}: ${text}`,\n };\n }\n\n const data = await response.json();\n return {\n success: true,\n eventId: data.id || event.event_id,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Send event using sendBeacon (for page unload)\n */\nexport function sendBeacon(\n event: ErrorEvent,\n config: SitePongConfig\n): boolean {\n if (typeof navigator === \"undefined\" || !navigator.sendBeacon) {\n return false;\n }\n\n const endpoint = getApiEndpoint(config);\n const headers = getAuthHeaders(config);\n\n const blob = new Blob(\n [\n JSON.stringify({\n ...event,\n _auth: headers,\n }),\n ],\n { type: \"application/json\" }\n );\n\n return navigator.sendBeacon(`${endpoint}/api/errors`, blob);\n}\n","import type {\n SitePongConfig,\n ErrorEvent,\n User,\n CaptureContext,\n LogLevel,\n} from \"./types\";\nimport { validateConfig, parseApiKey } from \"./dsn\";\nimport { getBreadcrumbs, addBreadcrumb, breadcrumbs } from \"./breadcrumbs\";\nimport {\n parseStackTrace,\n generateEventId,\n getBrowserContext,\n getRequestContext,\n} from \"../utils/stacktrace\";\nimport { isBrowser, isReactNative, isNode } from \"../utils/platform\";\nimport { sendErrorEvent } from \"../transport/fetch\";\n\n/**\n * SitePong Client - Main SDK class\n */\nclass SitePongClient {\n private config: SitePongConfig | null = null;\n private user: User | null = null;\n private tags: Record<string, string> = {};\n private context: Record<string, unknown> = {};\n private initialized = false;\n private originalOnError: OnErrorEventHandler | null = null;\n private originalOnUnhandledRejection: ((event: PromiseRejectionEvent) => void) | null = null;\n\n /**\n * Initialize the SitePong SDK\n */\n init(config: SitePongConfig): void {\n if (this.initialized) {\n console.warn(\"SitePong: SDK already initialized\");\n return;\n }\n\n // Validate configuration\n validateConfig(config);\n\n // Set defaults\n this.config = {\n enabled: true,\n debug: false,\n sampleRate: 1.0,\n maxBreadcrumbs: 100,\n autoCapture: {\n errors: true,\n unhandledRejections: true,\n console: false,\n },\n ...config,\n };\n\n // Auto-detect environment from API key if not provided\n if (!this.config.environment && this.config.apiKey) {\n const { environment } = parseApiKey(this.config.apiKey);\n this.config.environment = environment;\n }\n\n // Set max breadcrumbs\n if (this.config.maxBreadcrumbs) {\n breadcrumbs.setMaxBreadcrumbs(this.config.maxBreadcrumbs);\n }\n\n // Set up auto capture\n if (this.config.autoCapture?.errors) {\n this.setupErrorCapture();\n }\n\n if (this.config.autoCapture?.unhandledRejections) {\n this.setupUnhandledRejectionCapture();\n }\n\n this.initialized = true;\n this.log(\"SitePong SDK initialized\", config);\n }\n\n /**\n * Check if SDK is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Capture an exception and send it to SitePong\n *\n * @param error - The error to capture (Error object or any value)\n * @param context - Optional context to attach to the error\n * @returns The event ID if captured, null if not sent\n *\n * @example Basic usage\n * ```ts\n * try {\n * riskyOperation();\n * } catch (error) {\n * captureException(error);\n * }\n * ```\n *\n * @example With context\n * ```ts\n * captureException(error, {\n * tags: { feature: 'checkout' },\n * extra: { orderId: '12345' },\n * level: 'error',\n * });\n * ```\n */\n captureException(\n error: Error | unknown,\n context?: CaptureContext\n ): string | null {\n if (!this.shouldCapture()) {\n return null;\n }\n\n const err = error instanceof Error ? error : new Error(String(error));\n const event = this.createErrorEvent(err, context);\n\n this.sendEvent(event);\n return event.event_id;\n }\n\n /**\n * Capture a message and send it to SitePong\n *\n * @param message - The message to capture\n * @param level - The severity level (default: 'info')\n * @param context - Optional context to attach to the message\n * @returns The event ID if captured, null if not sent\n *\n * @example Basic usage\n * ```ts\n * captureMessage('User completed onboarding');\n * ```\n *\n * @example With level\n * ```ts\n * captureMessage('Payment failed', 'warning');\n * ```\n *\n * @example With context\n * ```ts\n * captureMessage('Order placed', 'info', {\n * tags: { feature: 'checkout' },\n * extra: { orderId: '12345', total: 99.99 },\n * });\n * ```\n */\n captureMessage(\n message: string,\n level: LogLevel = \"info\",\n context?: CaptureContext\n ): string | null {\n if (!this.shouldCapture()) {\n return null;\n }\n\n const event = this.createMessageEvent(message, level, context);\n this.sendEvent(event);\n return event.event_id;\n }\n\n /**\n * Set user information for error context\n *\n * All subsequent errors will include this user information.\n * Supports custom properties beyond the standard fields.\n *\n * @param user - User object with id, email, username, and any custom properties\n *\n * @example Basic usage\n * ```ts\n * setUser({\n * id: 'user-123',\n * email: 'user@example.com',\n * username: 'johndoe',\n * });\n * ```\n *\n * @example With custom properties\n * ```ts\n * setUser({\n * id: 'user-123',\n * email: 'user@example.com',\n * username: 'johndoe',\n * plan: 'pro',\n * company: 'Acme Inc',\n * });\n * ```\n */\n setUser(user: User | null): void {\n this.user = user;\n this.log(\"User set\", user);\n }\n\n /**\n * Clear user information\n *\n * Call this on logout to remove user context from future errors.\n *\n * @example\n * ```ts\n * // On logout\n * clearUser();\n * ```\n */\n clearUser(): void {\n this.user = null;\n this.log(\"User cleared\");\n }\n\n /**\n * Set a single tag\n *\n * Tags are indexed and searchable in the SitePong dashboard.\n *\n * @param key - Tag key\n * @param value - Tag value\n *\n * @example\n * ```ts\n * setTag('feature', 'checkout');\n * setTag('region', 'us-east');\n * ```\n */\n setTag(key: string, value: string): void {\n this.tags[key] = value;\n }\n\n /**\n * Set multiple tags at once\n *\n * Tags are indexed and searchable in the SitePong dashboard.\n *\n * @param tags - Object containing key-value pairs\n *\n * @example\n * ```ts\n * setTags({\n * region: 'us-east',\n * version: '2.0',\n * feature: 'checkout',\n * });\n * ```\n */\n setTags(tags: Record<string, string>): void {\n this.tags = { ...this.tags, ...tags };\n }\n\n /**\n * Set a named context\n *\n * Contexts are arbitrary data attached to errors for debugging.\n * Unlike tags, context values are not indexed but can contain complex objects.\n *\n * @param name - Context name (e.g., 'order', 'cart', 'session')\n * @param context - Object containing context data\n *\n * @example\n * ```ts\n * setContext('order', {\n * id: '12345',\n * items: 3,\n * total: 99.99,\n * });\n *\n * setContext('cart', {\n * items: ['SKU-001', 'SKU-002'],\n * coupon: 'SAVE10',\n * });\n * ```\n */\n setContext(name: string, context: Record<string, unknown>): void {\n this.context[name] = context;\n }\n\n /**\n * Add a breadcrumb\n */\n addBreadcrumb(breadcrumb: Parameters<typeof addBreadcrumb>[0]): void {\n addBreadcrumb(breadcrumb);\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): SitePongConfig | null {\n return this.config;\n }\n\n /**\n * Flush pending events (for page unload)\n */\n async flush(): Promise<void> {\n // In a real implementation, this would flush any queued events\n this.log(\"Flushing events\");\n }\n\n /**\n * Close the SDK and clean up\n */\n close(): void {\n this.teardownErrorCapture();\n this.teardownUnhandledRejectionCapture();\n this.initialized = false;\n this.config = null;\n this.log(\"SitePong SDK closed\");\n }\n\n // Private methods\n\n private shouldCapture(): boolean {\n if (!this.initialized || !this.config?.enabled) {\n return false;\n }\n\n // Sample rate check\n if (this.config.sampleRate !== undefined && this.config.sampleRate < 1) {\n if (Math.random() > this.config.sampleRate) {\n return false;\n }\n }\n\n return true;\n }\n\n private createErrorEvent(\n error: Error,\n context?: CaptureContext\n ): ErrorEvent {\n const browserContext = getBrowserContext();\n const requestContext = getRequestContext();\n\n return {\n event_id: generateEventId(),\n timestamp: new Date().toISOString(),\n level: context?.level || \"error\",\n message: error.message,\n exception: {\n type: error.name,\n value: error.message,\n stacktrace: parseStackTrace(error),\n },\n tags: { ...this.tags, ...context?.tags },\n extra: { ...context?.extra },\n user: context?.user || this.user || undefined,\n breadcrumbs: getBreadcrumbs(),\n context: {\n ...this.context,\n browser: browserContext.browser,\n os: browserContext.os,\n },\n environment: this.config?.environment,\n release: this.config?.release,\n request: {\n url: requestContext.url,\n headers: {\n Referer: requestContext.referrer,\n },\n },\n };\n }\n\n private createMessageEvent(\n message: string,\n level: LogLevel,\n context?: CaptureContext\n ): ErrorEvent {\n const browserContext = getBrowserContext();\n const requestContext = getRequestContext();\n\n return {\n event_id: generateEventId(),\n timestamp: new Date().toISOString(),\n level,\n message,\n tags: { ...this.tags, ...context?.tags },\n extra: { ...context?.extra },\n user: context?.user || this.user || undefined,\n breadcrumbs: getBreadcrumbs(),\n context: {\n ...this.context,\n browser: browserContext.browser,\n os: browserContext.os,\n },\n environment: this.config?.environment,\n release: this.config?.release,\n request: {\n url: requestContext.url,\n headers: {\n Referer: requestContext.referrer,\n },\n },\n };\n }\n\n private async sendEvent(event: ErrorEvent): Promise<void> {\n if (!this.config) return;\n\n // Apply beforeSend hook\n let processedEvent: ErrorEvent | null = event;\n if (this.config.beforeSend) {\n processedEvent = this.config.beforeSend(event);\n if (!processedEvent) {\n this.log(\"Event dropped by beforeSend\");\n return;\n }\n }\n\n this.log(\"Sending event\", processedEvent.event_id);\n\n const result = await sendErrorEvent(processedEvent, this.config);\n\n if (result.success) {\n this.log(\"Event sent successfully\", result.eventId);\n } else {\n this.log(\"Failed to send event\", result.error);\n }\n }\n\n private setupErrorCapture(): void {\n // Browser error capture\n if (isBrowser() && typeof window !== \"undefined\") {\n this.originalOnError = window.onerror;\n\n window.onerror = (\n message,\n source,\n lineno,\n colno,\n error\n ): boolean => {\n // Add breadcrumb\n addBreadcrumb({\n type: \"error\",\n category: \"error\",\n message: String(message),\n level: \"error\",\n data: { source, lineno, colno },\n });\n\n // Capture the error\n if (error) {\n this.captureException(error);\n } else {\n this.captureMessage(String(message), \"error\");\n }\n\n // Call original handler\n if (this.originalOnError) {\n return this.originalOnError(message, source, lineno, colno, error);\n }\n\n return false;\n };\n\n this.log(\"Browser error capture set up\");\n }\n\n // React Native error capture\n if (isReactNative()) {\n // React Native uses ErrorUtils for global error handling\n const globalErrorHandler = (error: Error, isFatal?: boolean): void => {\n addBreadcrumb({\n type: \"error\",\n category: \"react-native\",\n message: error.message,\n level: isFatal ? \"fatal\" : \"error\",\n });\n\n this.captureException(error, {\n level: isFatal ? \"fatal\" : \"error\",\n tags: { fatal: String(isFatal) },\n });\n };\n\n // Store reference for cleanup\n // @ts-expect-error - ErrorUtils is a React Native global\n if (typeof ErrorUtils !== \"undefined\") {\n // @ts-expect-error - ErrorUtils is a React Native global\n const originalHandler = ErrorUtils.getGlobalHandler();\n // @ts-expect-error - ErrorUtils is a React Native global\n ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n globalErrorHandler(error, isFatal);\n if (originalHandler) {\n originalHandler(error, isFatal);\n }\n });\n this.log(\"React Native error capture set up\");\n }\n }\n\n // Node.js error capture\n if (isNode() && typeof process !== \"undefined\") {\n process.on(\"uncaughtException\", (error: Error) => {\n addBreadcrumb({\n type: \"error\",\n category: \"node\",\n message: error.message,\n level: \"fatal\",\n });\n this.captureException(error, { level: \"fatal\" });\n });\n this.log(\"Node.js error capture set up\");\n }\n }\n\n private teardownErrorCapture(): void {\n if (isBrowser() && typeof window !== \"undefined\") {\n if (this.originalOnError !== null) {\n window.onerror = this.originalOnError;\n this.originalOnError = null;\n }\n }\n // Note: React Native and Node.js handlers are harder to cleanly remove\n }\n\n private setupUnhandledRejectionCapture(): void {\n // Browser\n if (isBrowser() && typeof window !== \"undefined\") {\n const handler = (event: PromiseRejectionEvent): void => {\n addBreadcrumb({\n type: \"error\",\n category: \"promise\",\n message: \"Unhandled Promise Rejection\",\n level: \"error\",\n data: { reason: String(event.reason) },\n });\n\n if (event.reason instanceof Error) {\n this.captureException(event.reason);\n } else {\n this.captureMessage(\n `Unhandled Promise Rejection: ${String(event.reason)}`,\n \"error\"\n );\n }\n };\n\n this.originalOnUnhandledRejection = handler;\n window.addEventListener(\"unhandledrejection\", handler);\n this.log(\"Browser unhandled rejection capture set up\");\n }\n\n // Node.js\n if (isNode() && typeof process !== \"undefined\") {\n process.on(\"unhandledRejection\", (reason: unknown) => {\n addBreadcrumb({\n type: \"error\",\n category: \"promise\",\n message: \"Unhandled Promise Rejection\",\n level: \"error\",\n data: { reason: String(reason) },\n });\n\n if (reason instanceof Error) {\n this.captureException(reason);\n } else {\n this.captureMessage(\n `Unhandled Promise Rejection: ${String(reason)}`,\n \"error\"\n );\n }\n });\n this.log(\"Node.js unhandled rejection capture set up\");\n }\n\n // React Native handles this via ErrorUtils already\n }\n\n private teardownUnhandledRejectionCapture(): void {\n if (isBrowser() && typeof window !== \"undefined\") {\n if (this.originalOnUnhandledRejection) {\n window.removeEventListener(\n \"unhandledrejection\",\n this.originalOnUnhandledRejection\n );\n this.originalOnUnhandledRejection = null;\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) {\n console.log(\"[SitePong]\", ...args);\n }\n }\n}\n\n// Export singleton instance\nexport const client = new SitePongClient();\n\n// Export convenience functions\nexport const init = client.init.bind(client);\nexport const captureException = client.captureException.bind(client);\nexport const captureMessage = client.captureMessage.bind(client);\nexport const setUser = client.setUser.bind(client);\nexport const clearUser = client.clearUser.bind(client);\nexport const setTag = client.setTag.bind(client);\nexport const setTags = client.setTags.bind(client);\nexport const setContext = client.setContext.bind(client);\nexport const flush = client.flush.bind(client);\nexport const close = client.close.bind(client);\n\n// Re-export breadcrumb functions for convenience\nexport { addBreadcrumb } from \"./breadcrumbs\";\n","import React, { createContext, useContext, useEffect, useRef } from \"react\";\nimport type { SitePongConfig } from \"../core/types\";\nimport { init, client } from \"../core/client\";\n\ninterface SitePongContextValue {\n isInitialized: boolean;\n}\n\nexport const SitePongContext = createContext<SitePongContextValue>({\n isInitialized: false,\n});\n\nexport interface SitePongProviderProps {\n /**\n * DSN in format: https://<public_key>@ingest.sitepong.com/<project_id>\n */\n dsn?: string;\n /**\n * API key in format: sp_live_xxx or sp_test_xxx\n */\n apiKey?: string;\n /**\n * Additional configuration options\n */\n config?: Omit<SitePongConfig, \"dsn\" | \"apiKey\">;\n /**\n * Children to render\n */\n children: React.ReactNode;\n}\n\n/**\n * SitePong Provider Component\n *\n * Initializes the SitePong SDK and provides context to child components.\n *\n * @example\n * ```tsx\n * import { SitePongProvider } from '@sitepong/react';\n *\n * function App() {\n * return (\n * <SitePongProvider dsn={process.env.NEXT_PUBLIC_SITEPONG_DSN}>\n * <MyApp />\n * </SitePongProvider>\n * );\n * }\n * ```\n */\nexport function SitePongProvider({\n dsn,\n apiKey,\n config = {},\n children,\n}: SitePongProviderProps): React.ReactElement {\n const initialized = useRef(false);\n\n useEffect(() => {\n if (initialized.current) return;\n\n // Only initialize if we have credentials\n if (dsn || apiKey) {\n init({\n dsn,\n apiKey,\n ...config,\n });\n initialized.current = true;\n }\n\n return () => {\n // Cleanup on unmount (optional, usually not needed)\n // close();\n };\n }, [dsn, apiKey]);\n\n const value: SitePongContextValue = {\n isInitialized: client.isInitialized(),\n };\n\n return (\n <SitePongContext.Provider value={value}>\n {children}\n </SitePongContext.Provider>\n );\n}\n\n/**\n * Hook to access SitePong context\n */\nexport function useSitePongContext(): SitePongContextValue {\n return useContext(SitePongContext);\n}\n","import React, { Component, ErrorInfo, ReactNode } from \"react\";\nimport { captureException, addBreadcrumb } from \"../core/client\";\n\nexport interface SitePongErrorBoundaryProps {\n /**\n * Fallback UI to render when an error occurs\n */\n fallback?: ReactNode | ((error: Error, resetError: () => void) => ReactNode);\n /**\n * Callback when an error is caught\n */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /**\n * Callback before the error is sent to SitePong\n */\n beforeCapture?: (error: Error) => void;\n /**\n * Whether to show a dialog to the user (future feature)\n */\n showDialog?: boolean;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * SitePong Error Boundary\n *\n * Catches React component errors and reports them to SitePong.\n *\n * @example\n * ```tsx\n * import { SitePongErrorBoundary } from '@sitepong/react';\n *\n * function App() {\n * return (\n * <SitePongErrorBoundary fallback={<ErrorPage />}>\n * <MyApp />\n * </SitePongErrorBoundary>\n * );\n * }\n * ```\n *\n * @example With reset functionality\n * ```tsx\n * <SitePongErrorBoundary\n * fallback={(error, resetError) => (\n * <div>\n * <p>Something went wrong: {error.message}</p>\n * <button onClick={resetError}>Try again</button>\n * </div>\n * )}\n * >\n * <MyApp />\n * </SitePongErrorBoundary>\n * ```\n */\nexport class SitePongErrorBoundary extends Component<\n SitePongErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: SitePongErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n // Add breadcrumb with component stack\n addBreadcrumb({\n type: \"error\",\n category: \"react.error-boundary\",\n message: error.message,\n level: \"error\",\n data: {\n componentStack: errorInfo.componentStack,\n },\n });\n\n // Call beforeCapture hook if provided\n if (this.props.beforeCapture) {\n this.props.beforeCapture(error);\n }\n\n // Capture the exception\n captureException(error, {\n extra: {\n componentStack: errorInfo.componentStack,\n },\n tags: {\n mechanism: \"react-error-boundary\",\n },\n });\n\n // Call onError callback if provided\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n resetError = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError && this.state.error) {\n // Render fallback UI\n if (typeof this.props.fallback === \"function\") {\n return this.props.fallback(this.state.error, this.resetError);\n }\n\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n // Default fallback\n return (\n <div\n style={{\n padding: \"20px\",\n textAlign: \"center\",\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n <h2>Something went wrong</h2>\n <p style={{ color: \"#666\" }}>\n An error has been reported and we're looking into it.\n </p>\n <button\n onClick={this.resetError}\n style={{\n marginTop: \"10px\",\n padding: \"8px 16px\",\n cursor: \"pointer\",\n }}\n >\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","/**\n * Anonymous ID Management\n * Generates and persists a unique ID for consistent flag evaluation\n */\n\nconst STORAGE_KEY = 'sitepong_anonymous_id';\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n // Use crypto.randomUUID if available (modern browsers and Node.js 19+)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\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 or create an anonymous ID\n * ID is persisted in localStorage (browser) or memory (Node.js)\n */\nlet memoryId: string | null = null;\n\nexport function getAnonymousId(): string {\n // Browser environment with localStorage\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n let id = localStorage.getItem(STORAGE_KEY);\n if (!id) {\n id = generateUUID();\n localStorage.setItem(STORAGE_KEY, id);\n }\n return id;\n } catch {\n // localStorage might be disabled or quota exceeded\n if (!memoryId) {\n memoryId = generateUUID();\n }\n return memoryId;\n }\n }\n\n // Node.js or environments without localStorage\n if (!memoryId) {\n memoryId = generateUUID();\n }\n return memoryId;\n}\n\n/**\n * Clear the anonymous ID\n * Useful for testing or when user wants to reset their identity\n */\nexport function clearAnonymousId(): void {\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore errors\n }\n }\n memoryId = null;\n}\n\n/**\n * Set a custom anonymous ID\n * Useful when you want to use your own user identifier\n */\nexport function setAnonymousId(id: string): void {\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, id);\n } catch {\n memoryId = id;\n }\n } else {\n memoryId = id;\n }\n}\n","/**\n * Context Detection\n * Detects device type, browser, and OS from user agent\n */\n\nimport type { DeviceType, BrowserType, OSType, FlagEvaluationContext } from '@sitepong/types';\nimport { getAnonymousId } from './anonymous-id';\n\n/**\n * Detect device type from user agent\n */\nexport function detectDeviceType(userAgent: string): DeviceType {\n const ua = userAgent.toLowerCase();\n\n // Check for tablets first (before mobile, as some tablets have \"mobile\" in UA)\n if (\n /ipad/.test(ua) ||\n (/android/.test(ua) && !/mobile/.test(ua)) ||\n /tablet/.test(ua)\n ) {\n return 'tablet';\n }\n\n // Check for mobile devices\n if (\n /mobile/.test(ua) ||\n /iphone/.test(ua) ||\n /ipod/.test(ua) ||\n /android/.test(ua) ||\n /blackberry/.test(ua) ||\n /windows phone/.test(ua)\n ) {\n return 'mobile';\n }\n\n // Default to desktop\n return 'desktop';\n}\n\n/**\n * Detect browser from user agent\n */\nexport function detectBrowser(userAgent: string): BrowserType {\n const ua = userAgent.toLowerCase();\n\n // Order matters - check more specific browsers first\n if (/edg/.test(ua)) return 'edge';\n if (/opr|opera/.test(ua)) return 'opera';\n if (/samsungbrowser/.test(ua)) return 'samsung';\n if (/chrome|chromium|crios/.test(ua)) return 'chrome';\n if (/safari/.test(ua) && !/chrome/.test(ua)) return 'safari';\n if (/firefox|fxios/.test(ua)) return 'firefox';\n if (/msie|trident/.test(ua)) return 'ie';\n\n return 'other';\n}\n\n/**\n * Detect OS from user agent\n */\nexport function detectOS(userAgent: string): OSType {\n const ua = userAgent.toLowerCase();\n\n if (/iphone|ipad|ipod/.test(ua)) return 'ios';\n if (/android/.test(ua)) return 'android';\n if (/mac os|macos|macintosh/.test(ua)) return 'macos';\n if (/windows/.test(ua)) return 'windows';\n if (/linux/.test(ua)) return 'linux';\n\n return 'other';\n}\n\n/**\n * Get full evaluation context\n */\nexport function getEvaluationContext(): FlagEvaluationContext {\n const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n return {\n anonymous_id: getAnonymousId(),\n device_type: userAgent ? detectDeviceType(userAgent) : undefined,\n browser: userAgent ? detectBrowser(userAgent) : undefined,\n os: userAgent ? detectOS(userAgent) : undefined,\n user_agent: userAgent || undefined,\n timestamp: new Date(),\n };\n}\n\n/**\n * Create context with custom overrides\n */\nexport function createContext(\n overrides?: Partial<FlagEvaluationContext>\n): FlagEvaluationContext {\n const baseContext = getEvaluationContext();\n return {\n ...baseContext,\n ...overrides,\n };\n}\n","/**\n * Flag Evaluator\n * Evaluates flag rules using AND logic\n */\n\nimport type {\n FlagDefinition,\n FlagEvaluationContext,\n FlagRuleType,\n PercentageRolloutConfig,\n UserbasePercentageConfig,\n TimeBasedConfig,\n DeviceTypeConfig,\n BrowserConfig,\n OSConfig,\n} from '@sitepong/types';\n\n/**\n * DJB2 hash function for consistent percentage-based evaluation\n */\nfunction djb2Hash(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n }\n return hash >>> 0; // Convert to unsigned 32-bit integer\n}\n\n/**\n * Evaluate a percentage rollout rule\n * Random evaluation based on percentage\n */\nfunction evaluatePercentageRollout(config: PercentageRolloutConfig): boolean {\n return Math.random() * 100 < config.percentage;\n}\n\n/**\n * Evaluate a userbase percentage rule\n * Consistent evaluation based on anonymous_id + flag_key\n */\nfunction evaluateUserbasePercentage(\n config: UserbasePercentageConfig,\n context: FlagEvaluationContext,\n flagKey: string\n): boolean {\n const hashInput = `${context.anonymous_id}:${flagKey}`;\n const hash = djb2Hash(hashInput);\n const bucket = hash % 100;\n return bucket < config.percentage;\n}\n\n/**\n * Parse time string (HH:mm) to minutes since midnight\n */\nfunction parseTime(timeStr: string): number {\n const [hours, minutes] = timeStr.split(':').map(Number);\n return hours * 60 + minutes;\n}\n\n/**\n * Evaluate a time-based rule\n */\nfunction evaluateTimeBased(\n config: TimeBasedConfig,\n context: FlagEvaluationContext\n): boolean {\n const now = context.timestamp || new Date();\n\n // Get current time in the specified timezone\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: config.timezone,\n weekday: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n\n const parts = formatter.formatToParts(now);\n const dayOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].indexOf(\n parts.find((p) => p.type === 'weekday')?.value || ''\n );\n const hour = parseInt(parts.find((p) => p.type === 'hour')?.value || '0', 10);\n const minute = parseInt(parts.find((p) => p.type === 'minute')?.value || '0', 10);\n const currentMinutes = hour * 60 + minute;\n\n // Check day of week\n if (config.days_of_week && config.days_of_week.length > 0) {\n if (!config.days_of_week.includes(dayOfWeek)) {\n return false;\n }\n }\n\n // Check time range\n if (config.start_time && config.end_time) {\n const startMinutes = parseTime(config.start_time);\n const endMinutes = parseTime(config.end_time);\n\n // Handle overnight ranges (e.g., 22:00 - 06:00)\n if (startMinutes > endMinutes) {\n // Overnight range\n if (currentMinutes < startMinutes && currentMinutes >= endMinutes) {\n return false;\n }\n } else {\n // Normal range\n if (currentMinutes < startMinutes || currentMinutes >= endMinutes) {\n return false;\n }\n }\n } else if (config.start_time) {\n const startMinutes = parseTime(config.start_time);\n if (currentMinutes < startMinutes) {\n return false;\n }\n } else if (config.end_time) {\n const endMinutes = parseTime(config.end_time);\n if (currentMinutes >= endMinutes) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a device type rule\n */\nfunction evaluateDeviceType(\n config: DeviceTypeConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.device_type) {\n return false;\n }\n return config.types.includes(context.device_type);\n}\n\n/**\n * Evaluate a browser rule\n */\nfunction evaluateBrowser(\n config: BrowserConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.browser) {\n return false;\n }\n return config.browsers.includes(context.browser);\n}\n\n/**\n * Evaluate an OS rule\n */\nfunction evaluateOS(\n config: OSConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.os) {\n return false;\n }\n return config.operating_systems.includes(context.os);\n}\n\n/**\n * Evaluate a single rule\n */\nfunction evaluateRule(\n ruleType: FlagRuleType,\n config: unknown,\n context: FlagEvaluationContext,\n flagKey: string\n): boolean {\n switch (ruleType) {\n case 'percentage_rollout':\n return evaluatePercentageRollout(config as PercentageRolloutConfig);\n\n case 'userbase_percentage':\n return evaluateUserbasePercentage(\n config as UserbasePercentageConfig,\n context,\n flagKey\n );\n\n case 'time_based':\n return evaluateTimeBased(config as TimeBasedConfig, context);\n\n case 'device_type':\n return evaluateDeviceType(config as DeviceTypeConfig, context);\n\n case 'browser':\n return evaluateBrowser(config as BrowserConfig, context);\n\n case 'os':\n return evaluateOS(config as OSConfig, context);\n\n default:\n // Unknown rule type - fail closed\n return false;\n }\n}\n\n/**\n * Evaluate a flag definition against context\n */\nexport function evaluateFlag(\n flag: FlagDefinition,\n context: FlagEvaluationContext\n): boolean {\n // 1. Check override first\n if (flag.override === 'force_on') {\n return true;\n }\n if (flag.override === 'force_off') {\n return false;\n }\n\n // 2. Check if enabled\n if (!flag.enabled) {\n return false;\n }\n\n // 3. If no rules, flag is enabled\n if (!flag.rules || flag.rules.length === 0) {\n return true;\n }\n\n // 4. Evaluate all rules with AND logic\n for (const rule of flag.rules) {\n const result = evaluateRule(rule.rule_type, rule.config, context, flag.key);\n if (!result) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a multivariate flag and return the variant key\n * Uses consistent hashing based on anonymous_id + flag_key\n */\nexport function evaluateVariant(\n flag: FlagDefinition,\n context: FlagEvaluationContext\n): string | null {\n // Check basic eligibility first\n if (!evaluateFlag(flag, context)) {\n return null;\n }\n\n // If not multivariate or no variants, return null (treated as boolean)\n if (flag.flag_type !== 'multivariate' || !flag.variants || flag.variants.length === 0) {\n return null;\n }\n\n // Use consistent hashing to assign variant\n const hashInput = `${context.anonymous_id}:${flag.key}:variant`;\n const hash = djb2Hash(hashInput);\n const totalWeight = flag.variants.reduce((sum, v) => sum + v.weight, 0);\n const bucket = hash % totalWeight;\n\n let cumulative = 0;\n for (const variant of flag.variants) {\n cumulative += variant.weight;\n if (bucket < cumulative) {\n return variant.key;\n }\n }\n\n // Fallback to first variant\n return flag.variants[0].key;\n}\n\n/**\n * Get payload for a specific variant\n */\nexport function getVariantPayload(\n flag: FlagDefinition,\n variantKey: string\n): unknown | null {\n if (flag.variant_payloads && flag.variant_payloads[variantKey] !== undefined) {\n return flag.variant_payloads[variantKey];\n }\n\n // Check variant-level payload\n const variant = flag.variants?.find(v => v.key === variantKey);\n return variant?.payload || null;\n}\n\n/**\n * Evaluate multiple flags\n */\nexport function evaluateFlags(\n flags: FlagDefinition[],\n context: FlagEvaluationContext\n): Map<string, boolean> {\n const results = new Map<string, boolean>();\n for (const flag of flags) {\n results.set(flag.key, evaluateFlag(flag, context));\n }\n return results;\n}\n","/**\n * Flag Manager\n * Manages flag fetching, caching, and evaluation\n */\n\nimport type { FlagDefinition, SDKFlagsResponse, FlagEvaluationContext } from '@sitepong/types';\nimport { getEvaluationContext } from './context';\nimport { evaluateFlag, evaluateVariant, getVariantPayload } from './evaluator';\n\nexport interface FlagManagerConfig {\n apiKey: string;\n endpoint?: string;\n debug?: boolean;\n}\n\nconst DEFAULT_ENDPOINT = 'https://api.sitepong.com';\n\nexport class FlagManager {\n private config: FlagManagerConfig;\n private flags: Map<string, FlagDefinition> = new Map();\n private evaluatedFlags: Map<string, boolean> = new Map();\n private evaluatedVariants: Map<string, string | null> = new Map();\n private context: FlagEvaluationContext | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: FlagManagerConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n debug: false,\n ...config,\n };\n }\n\n /**\n * Initialize the flag manager by fetching flags\n * Flags are evaluated once on init and cached\n */\n async init(): Promise<void> {\n // If already initialized, return immediately\n if (this.initialized) {\n return;\n }\n\n // If initialization is in progress, wait for it\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // Start initialization\n this.initPromise = this.fetchAndEvaluateFlags();\n\n try {\n await this.initPromise;\n this.initialized = true;\n } catch (err) {\n this.log('Failed to initialize flags:', err);\n // Even on error, mark as initialized to prevent retries\n this.initialized = true;\n } finally {\n this.initPromise = null;\n }\n }\n\n /**\n * Fetch flags from the API and evaluate them\n */\n private async fetchAndEvaluateFlags(): Promise<void> {\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/flags`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data: SDKFlagsResponse = await response.json();\n this.log('Fetched flags:', data.flags.length);\n\n // Get evaluation context once\n this.context = getEvaluationContext();\n this.log('Evaluation context:', this.context);\n\n // Store flags and evaluate them\n this.flags.clear();\n this.evaluatedFlags.clear();\n this.evaluatedVariants.clear();\n\n for (const flag of data.flags) {\n this.flags.set(flag.key, flag);\n const result = evaluateFlag(flag, this.context);\n this.evaluatedFlags.set(flag.key, result);\n\n // Evaluate variant for multivariate flags\n if (flag.flag_type === 'multivariate' && flag.variants) {\n const variant = evaluateVariant(flag, this.context);\n this.evaluatedVariants.set(flag.key, variant);\n this.log(`Flag \"${flag.key}\": ${result}, variant: ${variant}`);\n } else {\n this.log(`Flag \"${flag.key}\": ${result}`);\n }\n }\n } catch (err) {\n this.log('Error fetching flags:', err);\n throw err;\n }\n }\n\n /**\n * Get a flag value\n * Returns the cached evaluated result or default value\n */\n getFlag(key: string, defaultValue = false): boolean {\n if (!this.initialized) {\n this.log(`Flag \"${key}\" requested before init, returning default:`, defaultValue);\n return defaultValue;\n }\n\n const value = this.evaluatedFlags.get(key);\n if (value === undefined) {\n this.log(`Flag \"${key}\" not found, returning default:`, defaultValue);\n return defaultValue;\n }\n\n return value;\n }\n\n /**\n * Get a multivariate flag variant\n * Returns the assigned variant key or the default value\n */\n getVariant(key: string, defaultValue: string | null = null): string | null {\n if (!this.initialized) {\n this.log(`Variant \"${key}\" requested before init, returning default:`, defaultValue);\n return defaultValue;\n }\n\n const variant = this.evaluatedVariants.get(key);\n if (variant === undefined) {\n this.log(`Variant \"${key}\" not found, returning default:`, defaultValue);\n return defaultValue;\n }\n\n return variant;\n }\n\n /**\n * Get the payload for a multivariate flag's assigned variant\n */\n getVariantPayload<T = unknown>(key: string, defaultValue: T | null = null): T | null {\n const variant = this.getVariant(key);\n if (!variant) return defaultValue;\n\n const flag = this.flags.get(key);\n if (!flag) return defaultValue;\n\n const payload = getVariantPayload(flag, variant);\n return (payload as T) ?? defaultValue;\n }\n\n /**\n * Get all flag values\n */\n getAllFlags(): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n for (const [key, value] of this.evaluatedFlags) {\n result[key] = value;\n }\n return result;\n }\n\n /**\n * Check if a flag exists\n */\n hasFlag(key: string): boolean {\n return this.flags.has(key);\n }\n\n /**\n * Check if flags are initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Wait for initialization to complete\n */\n async waitForInit(): Promise<void> {\n if (this.initialized) {\n return;\n }\n await this.init();\n }\n\n /**\n * Force re-fetch and re-evaluate flags\n * Call this if you need to refresh flags (e.g., on explicit user action)\n */\n async refresh(): Promise<void> {\n this.initialized = false;\n await this.init();\n }\n\n /**\n * Get the current evaluation context\n */\n getContext(): FlagEvaluationContext | null {\n return this.context;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Flags]', ...args);\n }\n }\n}\n\n// Singleton instance for convenience\nlet defaultManager: FlagManager | null = null;\n\nexport function initFlagManager(config: FlagManagerConfig): FlagManager {\n defaultManager = new FlagManager(config);\n return defaultManager;\n}\n\nexport function getFlagManager(): FlagManager | null {\n return defaultManager;\n}\n","/**\n * Session Management\n * Manages session IDs with sessionStorage and 30-min inactivity timeout\n */\n\nconst SESSION_KEY = 'sitepong_session_id';\nconst SESSION_TIMESTAMP_KEY = 'sitepong_session_ts';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nlet memorySessionId: string | null = null;\nlet memorySessionTs: number | null = null;\n\nfunction generateSessionId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\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\nfunction isSessionExpired(lastActivity: number): boolean {\n return Date.now() - lastActivity > SESSION_TIMEOUT_MS;\n}\n\nexport function getSessionId(): string {\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n try {\n const existingId = sessionStorage.getItem(SESSION_KEY);\n const lastTs = sessionStorage.getItem(SESSION_TIMESTAMP_KEY);\n\n if (existingId && lastTs && !isSessionExpired(parseInt(lastTs, 10))) {\n // Update timestamp on activity\n sessionStorage.setItem(SESSION_TIMESTAMP_KEY, String(Date.now()));\n return existingId;\n }\n\n // Create new session\n const newId = generateSessionId();\n sessionStorage.setItem(SESSION_KEY, newId);\n sessionStorage.setItem(SESSION_TIMESTAMP_KEY, String(Date.now()));\n return newId;\n } catch {\n // sessionStorage might be disabled\n return getMemorySession();\n }\n }\n\n return getMemorySession();\n}\n\nfunction getMemorySession(): string {\n if (memorySessionId && memorySessionTs && !isSessionExpired(memorySessionTs)) {\n memorySessionTs = Date.now();\n return memorySessionId;\n }\n\n memorySessionId = generateSessionId();\n memorySessionTs = Date.now();\n return memorySessionId;\n}\n\nexport function clearSession(): void {\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n try {\n sessionStorage.removeItem(SESSION_KEY);\n sessionStorage.removeItem(SESSION_TIMESTAMP_KEY);\n } catch {\n // Ignore errors\n }\n }\n memorySessionId = null;\n memorySessionTs = null;\n}\n","/**\n * Autocapture Module\n * Automatically captures click events, form submissions, and page views\n * without requiring manual instrumentation.\n */\n\nexport interface AutocaptureConfig {\n /** Enable autocapture of click events */\n clicks: boolean;\n /** Enable autocapture of form submissions */\n forms: boolean;\n /** Enable autocapture of page views (SPA-aware) */\n pageviews: boolean;\n /** CSS selectors to exclude from autocapture */\n blockSelectors?: string[];\n /** Only capture clicks on elements matching these selectors (if set) */\n allowSelectors?: string[];\n /** Maximum text content length to capture */\n maxTextLength?: number;\n /** Debug logging */\n debug?: boolean;\n}\n\nexport interface AutocaptureEvent {\n type: 'click' | 'form_submit' | 'page_view';\n timestamp: string;\n properties: Record<string, unknown>;\n}\n\ntype EventCallback = (event: AutocaptureEvent) => void;\n\nconst DEFAULT_BLOCK_SELECTORS = [\n '[data-sp-no-capture]',\n '.sp-no-capture',\n];\n\nconst MAX_TEXT_LENGTH = 255;\n\nexport class AutocaptureModule {\n private config: AutocaptureConfig;\n private callback: EventCallback;\n private clickHandler: ((e: MouseEvent) => void) | null = null;\n private submitHandler: ((e: SubmitEvent) => void) | null = null;\n private active = false;\n\n constructor(config: Partial<AutocaptureConfig>, callback: EventCallback) {\n this.config = {\n clicks: true,\n forms: true,\n pageviews: true,\n blockSelectors: DEFAULT_BLOCK_SELECTORS,\n maxTextLength: MAX_TEXT_LENGTH,\n debug: false,\n ...config,\n };\n this.callback = callback;\n }\n\n start(): void {\n if (this.active || typeof window === 'undefined') return;\n this.active = true;\n\n if (this.config.clicks) {\n this.setupClickCapture();\n }\n\n if (this.config.forms) {\n this.setupFormCapture();\n }\n\n this.log('Autocapture started');\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n if (this.clickHandler) {\n document.removeEventListener('click', this.clickHandler, true);\n this.clickHandler = null;\n }\n\n if (this.submitHandler) {\n document.removeEventListener('submit', this.submitHandler, true);\n this.submitHandler = null;\n }\n\n this.log('Autocapture stopped');\n }\n\n private setupClickCapture(): void {\n this.clickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (!target || !this.shouldCapture(target)) return;\n\n const properties = this.getElementProperties(target);\n properties.$event_type = 'click';\n properties.$x = e.clientX;\n properties.$y = e.clientY;\n\n this.callback({\n type: 'click',\n timestamp: new Date().toISOString(),\n properties,\n });\n };\n\n document.addEventListener('click', this.clickHandler, true);\n }\n\n private setupFormCapture(): void {\n this.submitHandler = (e: SubmitEvent) => {\n const form = e.target as HTMLFormElement;\n if (!form || !this.shouldCapture(form)) return;\n\n const properties: Record<string, unknown> = {\n $event_type: 'form_submit',\n $form_action: form.action || undefined,\n $form_method: form.method || 'get',\n $form_name: form.name || form.id || undefined,\n $field_names: this.getFormFieldNames(form),\n $field_count: form.elements.length,\n };\n\n // Add element properties\n const elemProps = this.getElementProperties(form);\n Object.assign(properties, elemProps);\n\n this.callback({\n type: 'form_submit',\n timestamp: new Date().toISOString(),\n properties,\n });\n };\n\n document.addEventListener('submit', this.submitHandler, true);\n }\n\n private shouldCapture(element: HTMLElement): boolean {\n // Check block selectors\n const blockSelectors = this.config.blockSelectors || DEFAULT_BLOCK_SELECTORS;\n for (const selector of blockSelectors) {\n if (element.matches(selector) || element.closest(selector)) {\n return false;\n }\n }\n\n // Check allow selectors (if specified, element must match)\n if (this.config.allowSelectors && this.config.allowSelectors.length > 0) {\n const matches = this.config.allowSelectors.some(\n (sel) => element.matches(sel) || element.closest(sel) !== null\n );\n if (!matches) return false;\n }\n\n // Skip invisible elements\n if (element.offsetParent === null && element.tagName !== 'BODY') {\n return false;\n }\n\n return true;\n }\n\n private getElementProperties(element: HTMLElement): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n\n // Tag info\n properties.$tag_name = element.tagName.toLowerCase();\n properties.$el_id = element.id || undefined;\n\n // Classes (limit to first 5)\n if (element.classList.length > 0) {\n properties.$el_classes = Array.from(element.classList).slice(0, 5);\n }\n\n // Text content (truncated)\n const text = this.getElementText(element);\n if (text) {\n properties.$el_text = text;\n }\n\n // Href for links\n if (element instanceof HTMLAnchorElement) {\n properties.$href = element.href || undefined;\n properties.$target = element.target || undefined;\n }\n\n // Type for inputs/buttons\n if (element instanceof HTMLInputElement || element instanceof HTMLButtonElement) {\n properties.$el_type = element.type || undefined;\n properties.$el_name = element.name || undefined;\n }\n\n // ARIA attributes\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) {\n properties.$aria_label = this.truncate(ariaLabel);\n }\n\n // Role\n const role = element.getAttribute('role');\n if (role) {\n properties.$el_role = role;\n }\n\n // CSS selector path (simplified)\n properties.$selector = this.getSelector(element);\n\n // Page context\n properties.$current_url = window.location.href;\n properties.$pathname = window.location.pathname;\n\n return properties;\n }\n\n private getElementText(element: HTMLElement): string | undefined {\n // Don't capture text from inputs (could be sensitive)\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n return undefined;\n }\n\n // For buttons and links, get direct text\n let text = '';\n if (element instanceof HTMLButtonElement || element instanceof HTMLAnchorElement) {\n text = element.innerText || element.textContent || '';\n } else {\n // Get direct text content (not from children)\n for (const node of Array.from(element.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || '';\n }\n }\n }\n\n text = text.trim().replace(/\\s+/g, ' ');\n return text ? this.truncate(text) : undefined;\n }\n\n private getFormFieldNames(form: HTMLFormElement): string[] {\n const names: string[] = [];\n for (const element of Array.from(form.elements)) {\n const input = element as HTMLInputElement;\n if (input.name && input.type !== 'password' && input.type !== 'hidden') {\n names.push(input.name);\n }\n }\n return names.slice(0, 20); // Limit to 20 field names\n }\n\n private getSelector(element: HTMLElement): string {\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && current !== document.body && depth < 5) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector = `#${current.id}`;\n parts.unshift(selector);\n break;\n }\n\n if (current.classList.length > 0) {\n selector += `.${Array.from(current.classList).slice(0, 2).join('.')}`;\n }\n\n // Add nth-child for disambiguation\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === current!.tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-of-type(${index})`;\n }\n }\n\n parts.unshift(selector);\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n }\n\n private truncate(text: string): string {\n const max = this.config.maxTextLength || MAX_TEXT_LENGTH;\n return text.length > max ? text.slice(0, max) + '...' : text;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Autocapture]', ...args);\n }\n }\n}\n","/**\n * Analytics Manager\n * Manages event queue, batch flushing, identify/group state, and SPA page view tracking\n */\n\nimport type { AnalyticsConfig, AnalyticsEvent, TrackProperties, UserTraits, GroupTraits } from './types';\nimport { getSessionId, clearSession } from './session';\nimport { getAnonymousId } from '../flags/anonymous-id';\nimport { AutocaptureModule } from './autocapture';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BATCH_SIZE = 20;\nconst DEFAULT_FLUSH_INTERVAL = 10000;\n\nexport class AnalyticsManager {\n private config: Required<Omit<AnalyticsConfig, 'apiKey' | 'eventsEndpoint' | 'autocaptureClicks' | 'autocaptureForms' | 'autocapture'>> & {\n apiKey: string;\n eventsEndpoint?: string;\n autocaptureClicks?: boolean;\n autocaptureForms?: boolean;\n autocapture?: AnalyticsConfig['autocapture'];\n };\n private eventQueue: AnalyticsEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private userId: string | null = null;\n private groupId: string | null = null;\n private userTraits: UserTraits | null = null;\n private groupTraits: GroupTraits | null = null;\n private lastUrl: string | null = null;\n private popstateHandler: (() => void) | null = null;\n private autocaptureModule: AutocaptureModule | null = null;\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n autocapturePageviews: false,\n maxBatchSize: DEFAULT_BATCH_SIZE,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n debug: false,\n ...config,\n };\n }\n\n init(): void {\n if (!this.config.enabled) {\n return;\n }\n\n this.startFlushTimer();\n this.setupPageHideListener();\n\n if (this.config.autocapturePageviews) {\n this.setupSPATracking();\n }\n\n this.setupAutocapture();\n this.log('Analytics initialized');\n }\n\n private setupAutocapture(): void {\n const ac = this.config.autocapture;\n const clicksEnabled = this.config.autocaptureClicks;\n const formsEnabled = this.config.autocaptureForms;\n\n // Determine autocapture configuration\n let captureClicks = clicksEnabled || false;\n let captureForms = formsEnabled || false;\n let blockSelectors: string[] | undefined;\n let allowSelectors: string[] | undefined;\n\n if (ac === true) {\n captureClicks = true;\n captureForms = true;\n } else if (ac && typeof ac === 'object') {\n captureClicks = ac.clicks !== false;\n captureForms = ac.forms !== false;\n blockSelectors = ac.blockSelectors;\n allowSelectors = ac.allowSelectors;\n if (ac.pageviews !== false && !this.config.autocapturePageviews) {\n this.setupSPATracking();\n }\n }\n\n if (!captureClicks && !captureForms) return;\n\n this.autocaptureModule = new AutocaptureModule(\n {\n clicks: captureClicks,\n forms: captureForms,\n pageviews: false, // Handled by SPA tracking above\n blockSelectors,\n allowSelectors,\n debug: this.config.debug,\n },\n (event) => {\n // Convert autocapture event to analytics event\n const name = event.type === 'click'\n ? '$autocapture_click'\n : event.type === 'form_submit'\n ? '$autocapture_form_submit'\n : '$autocapture';\n\n this.track(name, event.properties);\n }\n );\n\n this.autocaptureModule.start();\n }\n\n track(eventName: string, properties?: TrackProperties): void {\n if (!this.config.enabled) return;\n\n const event = this.createEvent('track', { name: eventName, properties });\n this.enqueue(event);\n this.log('Track:', eventName, properties);\n }\n\n trackPageView(url?: string, properties?: TrackProperties): void {\n if (!this.config.enabled) return;\n\n const pageUrl = url || (typeof window !== 'undefined' ? window.location.href : undefined);\n const event = this.createEvent('page', {\n properties: {\n url: pageUrl,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n title: typeof document !== 'undefined' ? document.title : undefined,\n ...properties,\n },\n });\n this.enqueue(event);\n this.log('Page view:', pageUrl);\n }\n\n identify(userId: string, traits?: UserTraits): void {\n if (!this.config.enabled) return;\n\n this.userId = userId;\n if (traits) {\n this.userTraits = { ...this.userTraits, ...traits };\n }\n\n const event = this.createEvent('identify', { traits: this.userTraits || undefined });\n this.enqueue(event);\n this.log('Identify:', userId, traits);\n }\n\n group(groupId: string, traits?: GroupTraits): void {\n if (!this.config.enabled) return;\n\n this.groupId = groupId;\n if (traits) {\n this.groupTraits = { ...this.groupTraits, ...traits };\n }\n\n const event = this.createEvent('group', { traits: this.groupTraits || undefined });\n this.enqueue(event);\n this.log('Group:', groupId, traits);\n }\n\n reset(): void {\n this.userId = null;\n this.groupId = null;\n this.userTraits = null;\n this.groupTraits = null;\n clearSession();\n this.log('Analytics state reset');\n }\n\n async flush(): Promise<void> {\n if (this.eventQueue.length === 0) return;\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n const endpoint = this.config.eventsEndpoint || `${this.config.endpoint}/api/events`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ events }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${events.length} events`);\n } catch (err) {\n // Re-queue on failure\n this.eventQueue.unshift(...events);\n this.log('Failed to flush events:', err);\n }\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.popstateHandler && typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.popstateHandler);\n this.popstateHandler = null;\n }\n\n if (this.autocaptureModule) {\n this.autocaptureModule.stop();\n this.autocaptureModule = null;\n }\n\n // Final flush\n this.flushWithBeacon();\n }\n\n private createEvent(\n type: AnalyticsEvent['type'],\n options: { name?: string; properties?: TrackProperties; traits?: Record<string, unknown> }\n ): AnalyticsEvent {\n return {\n type,\n name: options.name,\n properties: options.properties,\n userId: this.userId || undefined,\n anonymousId: getAnonymousId(),\n groupId: this.groupId || undefined,\n traits: options.traits,\n sessionId: getSessionId(),\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n };\n }\n\n private enqueue(event: AnalyticsEvent): void {\n this.eventQueue.push(event);\n\n if (this.eventQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n private setupPageHideListener(): void {\n if (typeof window === 'undefined') return;\n\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flushWithBeacon();\n }\n });\n }\n\n private flushWithBeacon(): void {\n if (this.eventQueue.length === 0 || typeof navigator?.sendBeacon !== 'function') {\n return;\n }\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n const endpoint = this.config.eventsEndpoint || `${this.config.endpoint}/api/events`;\n const blob = new Blob(\n [JSON.stringify({ events, apiKey: this.config.apiKey })],\n { type: 'application/json' }\n );\n\n navigator.sendBeacon(endpoint, blob);\n this.log(`Flushed ${events.length} events via beacon`);\n }\n\n private setupSPATracking(): void {\n if (typeof window === 'undefined') return;\n\n this.lastUrl = window.location.href;\n\n // Track initial page view\n this.trackPageView();\n\n // Listen for popstate (back/forward navigation)\n this.popstateHandler = () => {\n const currentUrl = window.location.href;\n if (currentUrl !== this.lastUrl) {\n this.lastUrl = currentUrl;\n this.trackPageView(currentUrl);\n }\n };\n window.addEventListener('popstate', this.popstateHandler);\n\n // Monkey-patch pushState and replaceState for SPA navigation\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n originalPushState(...args);\n this.handleUrlChange();\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n originalReplaceState(...args);\n this.handleUrlChange();\n };\n }\n\n private handleUrlChange(): void {\n if (typeof window === 'undefined') return;\n\n const currentUrl = window.location.href;\n if (currentUrl !== this.lastUrl) {\n this.lastUrl = currentUrl;\n this.trackPageView(currentUrl);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Analytics]', ...args);\n }\n }\n}\n","/**\n * Tampering Detection Module\n * Detects browser, canvas, WebGL spoofing, VM usage, and request tampering.\n */\n\nexport interface TamperingResult {\n browserTampered: boolean;\n canvasTampered: boolean;\n webglTampered: boolean;\n vmDetected: boolean;\n geolocationSpoofed: boolean;\n mitmDetected: boolean;\n confidence: number;\n signals: TamperingSignals;\n}\n\nexport interface TamperingSignals {\n uaSpoofed: boolean;\n antiDetectBrowser: boolean;\n canvasNoise: boolean;\n canvasBlocked: boolean;\n webglSpoofed: boolean;\n webglBlocked: boolean;\n vmIndicators: string[];\n platformMismatch: boolean;\n pluginAnomaly: boolean;\n featureAnomaly: boolean;\n geolocationSpoofed: boolean;\n mitmIndicators: string[];\n}\n\n/**\n * Run all tampering detection checks\n */\nexport function detectTampering(): TamperingResult {\n const signals: TamperingSignals = {\n uaSpoofed: false,\n antiDetectBrowser: false,\n canvasNoise: false,\n canvasBlocked: false,\n webglSpoofed: false,\n webglBlocked: false,\n vmIndicators: [],\n platformMismatch: false,\n pluginAnomaly: false,\n featureAnomaly: false,\n geolocationSpoofed: false,\n mitmIndicators: [],\n };\n\n let confidence = 0;\n\n // Browser tampering\n const browserResult = detectBrowserTampering(signals);\n confidence += browserResult;\n\n // Canvas tampering\n const canvasResult = detectCanvasTampering(signals);\n confidence += canvasResult;\n\n // WebGL tampering\n const webglResult = detectWebGLTampering(signals);\n confidence += webglResult;\n\n // VM detection\n const vmResult = detectVM(signals);\n confidence += vmResult;\n\n // Geolocation spoofing\n const geoResult = detectGeolocationSpoofing(signals);\n confidence += geoResult;\n\n // MitM detection\n const mitmResult = detectMitM(signals);\n confidence += mitmResult;\n\n confidence = Math.min(confidence, 1);\n\n return {\n browserTampered: signals.uaSpoofed || signals.antiDetectBrowser || signals.platformMismatch,\n canvasTampered: signals.canvasNoise || signals.canvasBlocked,\n webglTampered: signals.webglSpoofed || signals.webglBlocked,\n vmDetected: signals.vmIndicators.length >= 2,\n geolocationSpoofed: signals.geolocationSpoofed,\n mitmDetected: signals.mitmIndicators.length >= 1,\n confidence,\n signals,\n };\n}\n\n/**\n * Detect user agent / browser fingerprint spoofing\n */\nfunction detectBrowserTampering(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') return 0;\n\n let score = 0;\n const ua = navigator.userAgent;\n const platform = (navigator as { platform?: string }).platform || '';\n\n // Check 1: Platform vs UA mismatch\n const isWindowsUA = /Windows/.test(ua);\n const isMacUA = /Mac/.test(ua);\n const isLinuxUA = /Linux/.test(ua) && !/Android/.test(ua);\n const isWindowsPlatform = /Win/.test(platform);\n const isMacPlatform = /Mac/.test(platform);\n const isLinuxPlatform = /Linux/.test(platform);\n\n if ((isWindowsUA && !isWindowsPlatform) ||\n (isMacUA && !isMacPlatform) ||\n (isLinuxUA && !isLinuxPlatform)) {\n signals.platformMismatch = true;\n signals.uaSpoofed = true;\n score += 0.3;\n }\n\n // Check 2: Chrome-specific feature detection vs UA claim\n const claimsChrome = /Chrome\\/\\d+/.test(ua) && !/Edge|OPR|Brave/.test(ua);\n if (claimsChrome) {\n // Chrome should have these properties\n const hasChromiumFeatures = 'chrome' in window ||\n 'CSS' in window && 'paintWorklet' in (window as { CSS?: { paintWorklet?: unknown } }).CSS!;\n if (!hasChromiumFeatures && !('brave' in navigator)) {\n signals.uaSpoofed = true;\n score += 0.2;\n }\n }\n\n // Check 3: Firefox feature detection vs UA claim\n const claimsFirefox = /Firefox\\/\\d+/.test(ua) && !/Seamonkey/.test(ua);\n if (claimsFirefox) {\n // Firefox has InstallTrigger\n const hasFirefoxFeatures = 'InstallTrigger' in window ||\n CSS.supports('-moz-appearance', 'none');\n if (!hasFirefoxFeatures) {\n signals.uaSpoofed = true;\n score += 0.2;\n }\n }\n\n // Check 4: Anti-detect browser patterns (Multilogin, GoLogin, Dolphin)\n // These often have inconsistencies in navigator properties\n const nav = navigator as Navigator & {\n userAgentData?: { brands?: Array<{ brand: string }> };\n getBattery?: () => Promise<unknown>;\n };\n\n if (nav.userAgentData?.brands) {\n const brands = nav.userAgentData.brands.map(b => b.brand);\n // Anti-detect browsers sometimes have empty or unusual brand lists\n if (brands.length === 0 || brands.every(b => b === '' || b === 'Not A;Brand')) {\n signals.antiDetectBrowser = true;\n score += 0.25;\n }\n }\n\n // Check 5: Plugin anomalies\n // Real browsers on desktop typically have at least some plugins\n if (!(/mobile|android|iphone|ipad/i.test(ua))) {\n const pluginCount = navigator.plugins?.length || 0;\n if (pluginCount === 0 && claimsChrome) {\n signals.pluginAnomaly = true;\n score += 0.1;\n }\n }\n\n // Check 6: Feature detection anomalies\n // Check if reported hardware matches expected capabilities\n const cores = navigator.hardwareConcurrency || 0;\n const memory = (navigator as { deviceMemory?: number }).deviceMemory || 0;\n if (cores > 0 && memory > 0) {\n // Extremely unusual: high core count with very low memory\n if (cores >= 16 && memory <= 1) {\n signals.featureAnomaly = true;\n score += 0.15;\n }\n }\n\n return Math.min(score, 0.5);\n}\n\n/**\n * Detect canvas fingerprint spoofing/noise injection\n */\nfunction detectCanvasTampering(signals: TamperingSignals): number {\n if (typeof document === 'undefined') return 0;\n\n let score = 0;\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 100;\n canvas.height = 20;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n signals.canvasBlocked = true;\n return 0.1;\n }\n\n // Method 1: Draw the same thing twice and compare\n // Noise injectors add random noise, so two identical draws will differ\n ctx.fillStyle = '#ff0000';\n ctx.fillRect(0, 0, 100, 20);\n ctx.fillStyle = '#00ff00';\n ctx.font = '12px Arial';\n ctx.fillText('SitePong', 5, 14);\n const draw1 = canvas.toDataURL();\n\n // Clear and redraw exactly the same\n ctx.clearRect(0, 0, 100, 20);\n ctx.fillStyle = '#ff0000';\n ctx.fillRect(0, 0, 100, 20);\n ctx.fillStyle = '#00ff00';\n ctx.font = '12px Arial';\n ctx.fillText('SitePong', 5, 14);\n const draw2 = canvas.toDataURL();\n\n if (draw1 !== draw2) {\n signals.canvasNoise = true;\n score += 0.35;\n }\n\n // Method 2: Check for known canvas blocker behavior\n // Some blockers return a blank canvas or fixed hash\n const imageData = ctx.getImageData(0, 0, 100, 20);\n const pixels = imageData.data;\n let allZero = true;\n let allSame = true;\n const firstPixel = pixels[0];\n for (let i = 0; i < pixels.length; i += 4) {\n if (pixels[i] !== 0 || pixels[i + 1] !== 0 || pixels[i + 2] !== 0) {\n allZero = false;\n }\n if (pixels[i] !== firstPixel) {\n allSame = false;\n }\n }\n\n if (allZero || allSame) {\n signals.canvasBlocked = true;\n score += 0.2;\n }\n\n // Method 3: Check if toDataURL is overridden\n const toDataURLDesc = Object.getOwnPropertyDescriptor(\n HTMLCanvasElement.prototype, 'toDataURL'\n );\n if (toDataURLDesc && toDataURLDesc.value !== HTMLCanvasElement.prototype.toDataURL) {\n signals.canvasNoise = true;\n score += 0.3;\n }\n } catch {\n signals.canvasBlocked = true;\n score += 0.1;\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect WebGL fingerprint spoofing\n */\nfunction detectWebGLTampering(signals: TamperingSignals): number {\n if (typeof document === 'undefined') return 0;\n\n let score = 0;\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n if (!gl || !(gl instanceof WebGLRenderingContext)) {\n signals.webglBlocked = true;\n return 0.1;\n }\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) {\n signals.webglBlocked = true;\n return 0.1;\n }\n\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string;\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string;\n\n // Check 1: Known spoofed/generic values\n const spoofedVendors = ['Brian Paul', 'Mesa', 'VMware'];\n const spoofedRenderers = ['llvmpipe', 'softpipe', 'Mesa', 'SwiftShader'];\n\n // Note: SwiftShader is legitimate in some contexts but often indicates spoofing\n if (spoofedRenderers.some(s => renderer.includes(s)) &&\n !spoofedVendors.some(v => vendor.includes(v))) {\n signals.webglSpoofed = true;\n score += 0.25;\n }\n\n // Check 2: Renderer vs platform mismatch\n const ua = navigator.userAgent;\n const isMobile = /mobile|android|iphone|ipad/i.test(ua);\n const isDesktopGPU = /GeForce|Radeon|Intel.*HD|GTX|RTX|Vega/i.test(renderer);\n\n if (isMobile && isDesktopGPU) {\n signals.webglSpoofed = true;\n score += 0.3;\n }\n\n // Check 3: Check if getParameter is overridden\n const getParamDesc = Object.getOwnPropertyDescriptor(\n WebGLRenderingContext.prototype, 'getParameter'\n );\n if (getParamDesc && typeof getParamDesc.value === 'function') {\n // Check if it's a native function\n const fnStr = getParamDesc.value.toString();\n if (!fnStr.includes('[native code]')) {\n signals.webglSpoofed = true;\n score += 0.35;\n }\n }\n\n // Check 4: Extensions consistency\n const extensions = gl.getSupportedExtensions() || [];\n // Desktop GPUs should support many extensions; very few suggests blocking\n if (extensions.length < 5 && isDesktopGPU) {\n signals.webglSpoofed = true;\n score += 0.1;\n }\n } catch {\n signals.webglBlocked = true;\n score += 0.1;\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect virtual machine environment\n */\nfunction detectVM(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') return 0;\n\n const indicators: string[] = [];\n const ua = navigator.userAgent;\n\n // Check 1: WebGL renderer often reveals VM\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (gl && gl instanceof WebGLRenderingContext) {\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n const renderer = (gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string).toLowerCase();\n const vendor = (gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string).toLowerCase();\n\n const vmRenderers = ['vmware', 'virtualbox', 'hyper-v', 'parallels', 'qemu', 'llvmpipe', 'mesa'];\n const vmVendors = ['vmware', 'innotek', 'microsoft basic', 'parallels'];\n\n for (const vm of vmRenderers) {\n if (renderer.includes(vm)) {\n indicators.push(`webgl_renderer:${vm}`);\n }\n }\n for (const vm of vmVendors) {\n if (vendor.includes(vm)) {\n indicators.push(`webgl_vendor:${vm}`);\n }\n }\n }\n }\n } catch {\n // WebGL not available\n }\n\n // Check 2: Screen resolution commonly used by VMs\n if (typeof screen !== 'undefined') {\n const w = screen.width;\n const h = screen.height;\n const vmResolutions = [\n [800, 600], [1024, 768], [1280, 800],\n ];\n if (vmResolutions.some(([vw, vh]) => w === vw && h === vh) &&\n screen.colorDepth === 24 &&\n navigator.hardwareConcurrency <= 2) {\n indicators.push('vm_resolution');\n }\n }\n\n // Check 3: Low hardware specs suggesting VM\n const cores = navigator.hardwareConcurrency || 0;\n const memory = (navigator as { deviceMemory?: number }).deviceMemory || 0;\n if (cores > 0 && cores <= 2 && memory > 0 && memory <= 2) {\n // Very low specs with desktop UA suggests VM\n if (!(/mobile|android|iphone/i.test(ua))) {\n indicators.push('low_hw_specs');\n }\n }\n\n // Check 4: Battery API - VMs often report no battery\n if ('getBattery' in navigator) {\n // Presence of battery API but no battery (desktop without battery = likely VM)\n // We can't async here, so just note the capability\n }\n\n // Check 5: Timing-based detection\n // VMs often have less precise timing\n if (typeof performance !== 'undefined') {\n const times: number[] = [];\n for (let i = 0; i < 10; i++) {\n times.push(performance.now());\n }\n // Check if timing precision is suspiciously low (coarsened by VM)\n const uniqueTimes = new Set(times.map(t => Math.floor(t * 1000)));\n if (uniqueTimes.size <= 3 && times.length === 10) {\n indicators.push('coarse_timing');\n }\n }\n\n // Check 6: Cloud VM detection via connection characteristics\n if (typeof navigator !== 'undefined') {\n const connection = (navigator as Navigator & { connection?: { downlink?: number; rtt?: number } }).connection;\n if (connection) {\n // Cloud VMs often have very high bandwidth and very low RTT\n if (connection.downlink && connection.downlink >= 10 &&\n connection.rtt && connection.rtt <= 5) {\n indicators.push('cloud_vm_network');\n }\n }\n }\n\n signals.vmIndicators = indicators;\n\n // Score based on number of indicators\n const vmScore = Math.min(indicators.length * 0.15, 0.5);\n return vmScore;\n}\n\n/**\n * Detect geolocation spoofing (fake GPS apps, location overrides)\n */\nfunction detectGeolocationSpoofing(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined') return 0;\n\n let score = 0;\n\n // Check 1: Geolocation API override detection\n if ('geolocation' in navigator) {\n const geoDesc = Object.getOwnPropertyDescriptor(navigator, 'geolocation');\n if (geoDesc && geoDesc.configurable === false && geoDesc.get) {\n // If geolocation getter has been overridden\n const fnStr = geoDesc.get.toString();\n if (!fnStr.includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.3;\n }\n }\n\n // Check if getCurrentPosition is overridden\n try {\n const getCurrentPositionDesc = Object.getOwnPropertyDescriptor(\n Geolocation.prototype, 'getCurrentPosition'\n );\n if (getCurrentPositionDesc?.value) {\n const fnStr = getCurrentPositionDesc.value.toString();\n if (!fnStr.includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.3;\n }\n }\n } catch {\n // Can't check\n }\n }\n\n // Check 2: Check for mock location indicators in DevTools override\n // Chrome's sensor emulation sets a specific flag we can detect indirectly\n if (typeof window !== 'undefined') {\n try {\n // DevTools override often leaves __defineGetter__ traces\n const navProto = Object.getPrototypeOf(navigator);\n const geoGetter = Object.getOwnPropertyDescriptor(navProto, 'geolocation');\n if (geoGetter && geoGetter.get && !geoGetter.get.toString().includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.2;\n }\n } catch {\n // Can't access\n }\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect Man-in-the-Middle attacks (request interception, SSL anomalies)\n */\nfunction detectMitM(signals: TamperingSignals): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 0;\n\n const indicators: string[] = [];\n\n // Check 1: Mixed content detection\n // If we're on HTTPS but resources load over HTTP, something is intercepting\n if (window.location?.protocol === 'https:') {\n // Check if any injected scripts are loading over HTTP\n const scripts = document.querySelectorAll('script[src]');\n for (let i = 0; i < scripts.length; i++) {\n const src = scripts[i].getAttribute('src') || '';\n if (src.startsWith('http://') && !src.includes('localhost')) {\n indicators.push('mixed_content_script');\n break;\n }\n }\n }\n\n // Check 2: Unexpected iframes (common in proxy/MitM injections)\n const iframes = document.querySelectorAll('iframe');\n for (let i = 0; i < iframes.length; i++) {\n const src = iframes[i].getAttribute('src') || '';\n if (src && !src.startsWith(window.location?.origin || '') && !src.startsWith('about:') && !src.startsWith('javascript:')) {\n // Check if it's invisible (hidden injection)\n const style = window.getComputedStyle(iframes[i]);\n if (style.display === 'none' || style.visibility === 'hidden' ||\n parseInt(style.width) <= 1 || parseInt(style.height) <= 1) {\n indicators.push('hidden_iframe');\n }\n }\n }\n\n // Check 3: Service Worker hijacking\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.getRegistrations().then(registrations => {\n for (const reg of registrations) {\n const swUrl = reg.active?.scriptURL || '';\n if (swUrl && !swUrl.startsWith(window.location?.origin || '')) {\n indicators.push('foreign_service_worker');\n }\n }\n }).catch(() => { /* Can't check */ });\n }\n\n // Check 4: Proxy detection via performance timing\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\n if (nav) {\n // Extremely high connect time can indicate proxy\n const connectTime = nav.connectEnd - nav.connectStart;\n const tlsTime = nav.requestStart - nav.secureConnectionStart;\n if (connectTime > 1000 && tlsTime > 500) {\n indicators.push('slow_tls_handshake');\n }\n }\n } catch {\n // Performance API not available\n }\n }\n\n // Check 5: Certificate transparency check (indirect)\n // If the page loaded successfully over HTTPS but connection info shows anomalies\n if (window.location?.protocol === 'https:' && typeof performance !== 'undefined') {\n try {\n const resources = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n for (const resource of resources.slice(0, 20)) {\n // Resources with 0 transfer size but positive encoded size indicate interception\n if (resource.transferSize === 0 && resource.encodedBodySize > 0 && !resource.name.includes('cache')) {\n indicators.push('intercepted_resource');\n break;\n }\n }\n } catch {\n // Can't check\n }\n }\n\n signals.mitmIndicators = indicators;\n\n return Math.min(indicators.length * 0.2, 0.5);\n}\n","/**\n * Signal Collection\n * Collects device signals for fingerprinting and fraud detection\n */\n\nimport type { CoreSignals, ExtendedSignals, DeviceSignals, SmartSignals } from './types';\nimport { detectTampering } from './tampering';\n\nexport function collectCoreSignals(): CoreSignals {\n return {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n language: typeof navigator !== 'undefined' ? navigator.language : '',\n languages: typeof navigator !== 'undefined' ? Array.from(navigator.languages || []) : [],\n platform: typeof navigator !== 'undefined' ? (navigator as { platform?: string }).platform || '' : '',\n screenWidth: typeof screen !== 'undefined' ? screen.width : 0,\n screenHeight: typeof screen !== 'undefined' ? screen.height : 0,\n screenColorDepth: typeof screen !== 'undefined' ? screen.colorDepth : 0,\n devicePixelRatio: typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1,\n timezoneOffset: new Date().getTimezoneOffset(),\n timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone || '',\n sessionStorage: hasSessionStorage(),\n localStorage: hasLocalStorage(),\n indexedDB: typeof indexedDB !== 'undefined',\n cookieEnabled: typeof navigator !== 'undefined' ? navigator.cookieEnabled : false,\n hardwareConcurrency: typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 0 : 0,\n maxTouchPoints: typeof navigator !== 'undefined' ? navigator.maxTouchPoints || 0 : 0,\n deviceMemory: typeof navigator !== 'undefined' ? (navigator as { deviceMemory?: number }).deviceMemory : undefined,\n };\n}\n\nexport function collectExtendedSignals(): ExtendedSignals {\n const signals: ExtendedSignals = {};\n\n signals.canvasFingerprint = getCanvasFingerprint();\n const webgl = getWebGLInfo();\n signals.webglVendor = webgl.vendor;\n signals.webglRenderer = webgl.renderer;\n signals.audioFingerprint = getAudioFingerprint();\n\n return signals;\n}\n\nexport function collectDeviceSignals(includeExtended: boolean): DeviceSignals {\n const core = collectCoreSignals();\n const signals: DeviceSignals = { ...core };\n\n if (includeExtended) {\n signals.extended = collectExtendedSignals();\n }\n\n const smart = collectSmartSignals();\n signals.smart = smart;\n // Keep deprecated fields for backward compat\n signals.incognito = smart.incognito;\n signals.bot = smart.bot;\n\n return signals;\n}\n\nexport function collectSmartSignals(): SmartSignals {\n const signals: SmartSignals = {};\n\n signals.incognito = detectIncognito();\n signals.bot = detectBot();\n signals.privacyBrowser = detectPrivacyBrowser();\n signals.devToolsOpen = detectDevTools();\n signals.connectionType = getConnectionType();\n signals.doNotTrack = getDoNotTrack();\n signals.notificationsEnabled = getNotificationsPermission();\n\n // Device age tracking\n const deviceAge = getDeviceAge();\n signals.deviceFirstSeen = deviceAge.firstSeen;\n signals.deviceVisitCount = deviceAge.visitCount;\n\n // Tampering detection\n const tampering = detectTampering();\n signals.browserTampered = tampering.browserTampered;\n signals.canvasTampered = tampering.canvasTampered;\n signals.webglTampered = tampering.webglTampered;\n signals.vmDetected = tampering.vmDetected;\n signals.vmIndicators = tampering.signals.vmIndicators;\n\n return signals;\n}\n\nfunction hasSessionStorage(): boolean {\n try {\n const key = '__sp_test__';\n sessionStorage.setItem(key, '1');\n sessionStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasLocalStorage(): boolean {\n try {\n const key = '__sp_test__';\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getCanvasFingerprint(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n\n canvas.width = 200;\n canvas.height = 50;\n\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(0, 0, 200, 50);\n ctx.fillStyle = '#069';\n ctx.fillText('SitePong fingerprint', 2, 15);\n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';\n ctx.fillText('SitePong fingerprint', 4, 17);\n\n return hashString(canvas.toDataURL());\n } catch {\n return undefined;\n }\n}\n\nfunction getWebGLInfo(): { vendor?: string; renderer?: string } {\n if (typeof document === 'undefined') return {};\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (!gl || !(gl instanceof WebGLRenderingContext)) return {};\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return {};\n\n return {\n vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string,\n renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string,\n };\n } catch {\n return {};\n }\n}\n\nfunction getAudioFingerprint(): string | undefined {\n if (typeof window === 'undefined' || typeof OfflineAudioContext === 'undefined') {\n return undefined;\n }\n\n try {\n const context = new OfflineAudioContext(1, 44100, 44100);\n const oscillator = context.createOscillator();\n oscillator.type = 'triangle';\n oscillator.frequency.setValueAtTime(10000, context.currentTime);\n\n const compressor = context.createDynamicsCompressor();\n compressor.threshold.setValueAtTime(-50, context.currentTime);\n compressor.knee.setValueAtTime(40, context.currentTime);\n compressor.ratio.setValueAtTime(12, context.currentTime);\n compressor.attack.setValueAtTime(0, context.currentTime);\n compressor.release.setValueAtTime(0.25, context.currentTime);\n\n oscillator.connect(compressor);\n compressor.connect(context.destination);\n oscillator.start(0);\n\n // Return a hash of the context configuration as a sync approximation\n return hashString(`audio:${context.sampleRate}:${context.length}`);\n } catch {\n return undefined;\n }\n}\n\nfunction detectIncognito(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // Method 1: Safari incognito - localStorage quota is restricted\n const testKey = '__sp_incognito_test__';\n try {\n localStorage.setItem(testKey, new Array(100).join('x'));\n localStorage.removeItem(testKey);\n } catch {\n return true;\n }\n\n // Method 2: Firefox - IndexedDB not available in private mode\n if (typeof indexedDB !== 'undefined') {\n try {\n const db = indexedDB.open('__sp_test__');\n db.onerror = () => { /* detected */ };\n } catch {\n return true;\n }\n }\n\n // Method 3: Check if FileSystem API is restricted (Chrome < 76)\n if ('webkitRequestFileSystem' in window) {\n let detected = false;\n try {\n (window as Window & { webkitRequestFileSystem: (type: number, size: number, success: () => void, error: () => void) => void }).webkitRequestFileSystem(\n 0, 1,\n () => { detected = false; },\n () => { detected = true; }\n );\n } catch {\n // Not available\n }\n if (detected) return true;\n }\n\n // Method 4: Check performance.memory (Chrome) - reduced in incognito\n const perf = performance as Performance & { memory?: { jsHeapSizeLimit?: number } };\n if (perf.memory) {\n // Incognito Chrome often has lower heap limits\n const heapLimit = perf.memory.jsHeapSizeLimit || 0;\n if (heapLimit > 0 && heapLimit < 1073741824) { // < 1GB\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\nfunction detectBot(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent.toLowerCase();\n const botPatterns = [\n 'bot', 'crawler', 'spider', 'headless', 'phantom',\n 'puppeteer', 'selenium', 'webdriver', 'playwright',\n ];\n\n if (botPatterns.some(pattern => ua.includes(pattern))) {\n return true;\n }\n\n // Check for webdriver property\n if ('webdriver' in navigator && (navigator as { webdriver?: boolean }).webdriver) {\n return true;\n }\n\n // Check for zero plugins (common in headless)\n if (navigator.plugins && navigator.plugins.length === 0 && !/mobile|android|iphone/i.test(ua)) {\n return true;\n }\n\n return false;\n}\n\nfunction detectPrivacyBrowser(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent.toLowerCase();\n\n // Brave browser\n if ('brave' in navigator) return true;\n\n // Firefox Focus / Firefox private\n if (ua.includes('focus') && ua.includes('firefox')) return true;\n\n // DuckDuckGo browser\n if (ua.includes('duckduckgo')) return true;\n\n // Tor browser (modified Firefox with specific characteristics)\n if (typeof window !== 'undefined') {\n // Tor browser reports specific screen dimensions\n if (screen.width === 1000 && screen.height === 1000) return true;\n // Tor browser spoofs timezone to UTC\n if (new Date().getTimezoneOffset() === 0 && navigator.language !== 'en') return true;\n }\n\n return false;\n}\n\nfunction detectDevTools(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // Method 1: Check window size difference (devtools takes space)\n const widthThreshold = window.outerWidth - window.innerWidth > 160;\n const heightThreshold = window.outerHeight - window.innerHeight > 160;\n if (widthThreshold || heightThreshold) return true;\n } catch {\n // Ignore\n }\n\n return false;\n}\n\nfunction getConnectionType(): string | undefined {\n if (typeof navigator === 'undefined') return undefined;\n const connection = (navigator as Navigator & { connection?: { effectiveType?: string; type?: string } }).connection;\n if (!connection) return undefined;\n return connection.effectiveType || connection.type || undefined;\n}\n\nfunction getDoNotTrack(): boolean {\n if (typeof navigator === 'undefined') return false;\n const dnt = (navigator as Navigator & { doNotTrack?: string }).doNotTrack;\n return dnt === '1' || dnt === 'yes';\n}\n\nfunction getNotificationsPermission(): boolean {\n if (typeof Notification === 'undefined') return false;\n return Notification.permission === 'granted';\n}\n\nfunction getDeviceAge(): { firstSeen?: string; visitCount: number } {\n const STORAGE_KEY = 'sitepong_device_age';\n const result: { firstSeen?: string; visitCount: number } = { visitCount: 1 };\n\n if (typeof localStorage === 'undefined') return result;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n result.firstSeen = parsed.firstSeen;\n result.visitCount = (parsed.visitCount || 0) + 1;\n } else {\n result.firstSeen = new Date().toISOString();\n }\n\n // Update stored value\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n firstSeen: result.firstSeen,\n visitCount: result.visitCount,\n }));\n } catch {\n // Storage not available\n }\n\n return result;\n}\n\nfunction hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n}\n","/**\n * Behavior Analysis Module\n * Captures mouse movement, keystroke, scroll, and click patterns\n * for bot/automation detection scoring.\n */\n\nexport interface BehaviorMetrics {\n mouse: MouseMetrics;\n keyboard: KeyboardMetrics;\n scroll: ScrollMetrics;\n clicks: ClickMetrics;\n score: number; // 0.0 (bot-like) to 1.0 (human-like)\n}\n\ninterface MouseMetrics {\n totalMovements: number;\n averageSpeed: number;\n maxSpeed: number;\n averageAcceleration: number;\n straightLineRatio: number; // Proportion of straight-line movements\n jitter: number; // Small random movements (humans have jitter)\n hasMovement: boolean;\n}\n\ninterface KeyboardMetrics {\n totalKeystrokes: number;\n averageInterval: number;\n intervalVariance: number; // Humans have high variance\n holdTimeAverage: number;\n holdTimeVariance: number;\n hasKeystrokes: boolean;\n}\n\ninterface ScrollMetrics {\n totalScrolls: number;\n averageSpeed: number;\n smoothness: number; // Humans have smoother scrolling\n hasScroll: boolean;\n}\n\ninterface ClickMetrics {\n totalClicks: number;\n averageInterval: number;\n intervalVariance: number;\n doubleClickCount: number;\n hasClicks: boolean;\n}\n\ninterface Point {\n x: number;\n y: number;\n t: number;\n}\n\nexport class BehaviorAnalyzer {\n private mousePoints: Point[] = [];\n private keyDownTimes: Map<string, number> = new Map();\n private keyIntervals: number[] = [];\n private keyHoldTimes: number[] = [];\n private lastKeyTime = 0;\n private scrollEvents: Array<{ deltaY: number; t: number }> = [];\n private clickTimes: number[] = [];\n private running = false;\n\n private readonly maxSamples = 500;\n\n private handleMouseMove = (e: MouseEvent) => {\n if (this.mousePoints.length >= this.maxSamples) return;\n this.mousePoints.push({ x: e.clientX, y: e.clientY, t: Date.now() });\n };\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (this.keyIntervals.length >= this.maxSamples) return;\n const now = Date.now();\n this.keyDownTimes.set(e.key, now);\n if (this.lastKeyTime > 0) {\n this.keyIntervals.push(now - this.lastKeyTime);\n }\n this.lastKeyTime = now;\n };\n\n private handleKeyUp = (e: KeyboardEvent) => {\n const downTime = this.keyDownTimes.get(e.key);\n if (downTime) {\n this.keyHoldTimes.push(Date.now() - downTime);\n this.keyDownTimes.delete(e.key);\n }\n };\n\n private handleScroll = () => {\n if (this.scrollEvents.length >= this.maxSamples) return;\n this.scrollEvents.push({ deltaY: window.scrollY, t: Date.now() });\n };\n\n private handleClick = () => {\n if (this.clickTimes.length >= this.maxSamples) return;\n this.clickTimes.push(Date.now());\n };\n\n start(): void {\n if (this.running || typeof window === 'undefined') return;\n this.running = true;\n window.addEventListener('mousemove', this.handleMouseMove, { passive: true });\n window.addEventListener('keydown', this.handleKeyDown, { passive: true });\n window.addEventListener('keyup', this.handleKeyUp, { passive: true });\n window.addEventListener('scroll', this.handleScroll, { passive: true });\n window.addEventListener('click', this.handleClick, { passive: true });\n }\n\n stop(): void {\n if (!this.running || typeof window === 'undefined') return;\n this.running = false;\n window.removeEventListener('mousemove', this.handleMouseMove);\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n window.removeEventListener('scroll', this.handleScroll);\n window.removeEventListener('click', this.handleClick);\n }\n\n getMetrics(): BehaviorMetrics {\n const mouse = this.analyzeMouseMovement();\n const keyboard = this.analyzeKeyboard();\n const scroll = this.analyzeScroll();\n const clicks = this.analyzeClicks();\n const score = this.calculateHumanScore(mouse, keyboard, scroll, clicks);\n\n return { mouse, keyboard, scroll, clicks, score };\n }\n\n reset(): void {\n this.mousePoints = [];\n this.keyDownTimes.clear();\n this.keyIntervals = [];\n this.keyHoldTimes = [];\n this.lastKeyTime = 0;\n this.scrollEvents = [];\n this.clickTimes = [];\n }\n\n private analyzeMouseMovement(): MouseMetrics {\n if (this.mousePoints.length < 3) {\n return {\n totalMovements: this.mousePoints.length,\n averageSpeed: 0,\n maxSpeed: 0,\n averageAcceleration: 0,\n straightLineRatio: 0,\n jitter: 0,\n hasMovement: false,\n };\n }\n\n const speeds: number[] = [];\n const accelerations: number[] = [];\n let straightSegments = 0;\n let totalSegments = 0;\n let jitterSum = 0;\n\n for (let i = 1; i < this.mousePoints.length; i++) {\n const prev = this.mousePoints[i - 1];\n const curr = this.mousePoints[i];\n const dt = (curr.t - prev.t) || 1;\n const dx = curr.x - prev.x;\n const dy = curr.y - prev.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const speed = distance / dt;\n speeds.push(speed);\n\n // Jitter: small movements\n if (distance < 3 && distance > 0) {\n jitterSum++;\n }\n\n // Straightness: check if 3 consecutive points are collinear\n if (i >= 2) {\n const pp = this.mousePoints[i - 2];\n const expectedX = pp.x + (curr.x - pp.x) * ((prev.t - pp.t) / (curr.t - pp.t));\n const expectedY = pp.y + (curr.y - pp.y) * ((prev.t - pp.t) / (curr.t - pp.t));\n const deviation = Math.sqrt((prev.x - expectedX) ** 2 + (prev.y - expectedY) ** 2);\n totalSegments++;\n if (deviation < 2) straightSegments++;\n }\n\n if (i >= 2) {\n const prevSpeed = speeds[speeds.length - 2] || 0;\n accelerations.push(Math.abs(speed - prevSpeed) / dt);\n }\n }\n\n const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.length;\n const maxSpeed = Math.max(...speeds);\n const avgAccel = accelerations.length > 0\n ? accelerations.reduce((a, b) => a + b, 0) / accelerations.length\n : 0;\n\n return {\n totalMovements: this.mousePoints.length,\n averageSpeed: Math.round(avgSpeed * 1000) / 1000,\n maxSpeed: Math.round(maxSpeed * 1000) / 1000,\n averageAcceleration: Math.round(avgAccel * 1000) / 1000,\n straightLineRatio: totalSegments > 0 ? straightSegments / totalSegments : 0,\n jitter: this.mousePoints.length > 0 ? jitterSum / this.mousePoints.length : 0,\n hasMovement: true,\n };\n }\n\n private analyzeKeyboard(): KeyboardMetrics {\n if (this.keyIntervals.length < 2) {\n return {\n totalKeystrokes: this.keyIntervals.length,\n averageInterval: 0,\n intervalVariance: 0,\n holdTimeAverage: 0,\n holdTimeVariance: 0,\n hasKeystrokes: false,\n };\n }\n\n const avgInterval = this.keyIntervals.reduce((a, b) => a + b, 0) / this.keyIntervals.length;\n const intervalVar = this.variance(this.keyIntervals);\n\n const avgHold = this.keyHoldTimes.length > 0\n ? this.keyHoldTimes.reduce((a, b) => a + b, 0) / this.keyHoldTimes.length\n : 0;\n const holdVar = this.keyHoldTimes.length > 0\n ? this.variance(this.keyHoldTimes)\n : 0;\n\n return {\n totalKeystrokes: this.keyIntervals.length + 1,\n averageInterval: Math.round(avgInterval),\n intervalVariance: Math.round(intervalVar),\n holdTimeAverage: Math.round(avgHold),\n holdTimeVariance: Math.round(holdVar),\n hasKeystrokes: true,\n };\n }\n\n private analyzeScroll(): ScrollMetrics {\n if (this.scrollEvents.length < 2) {\n return { totalScrolls: this.scrollEvents.length, averageSpeed: 0, smoothness: 0, hasScroll: false };\n }\n\n const speeds: number[] = [];\n const deltas: number[] = [];\n\n for (let i = 1; i < this.scrollEvents.length; i++) {\n const dt = (this.scrollEvents[i].t - this.scrollEvents[i - 1].t) || 1;\n const dy = Math.abs(this.scrollEvents[i].deltaY - this.scrollEvents[i - 1].deltaY);\n speeds.push(dy / dt);\n deltas.push(dy);\n }\n\n const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.length;\n // Smoothness: inverse of speed variance (normalized)\n const speedVar = this.variance(speeds);\n const smoothness = avgSpeed > 0 ? Math.min(1, avgSpeed / (speedVar + avgSpeed)) : 0;\n\n return {\n totalScrolls: this.scrollEvents.length,\n averageSpeed: Math.round(avgSpeed * 100) / 100,\n smoothness: Math.round(smoothness * 100) / 100,\n hasScroll: true,\n };\n }\n\n private analyzeClicks(): ClickMetrics {\n if (this.clickTimes.length < 2) {\n return {\n totalClicks: this.clickTimes.length,\n averageInterval: 0,\n intervalVariance: 0,\n doubleClickCount: 0,\n hasClicks: this.clickTimes.length > 0,\n };\n }\n\n const intervals: number[] = [];\n let doubleClicks = 0;\n\n for (let i = 1; i < this.clickTimes.length; i++) {\n const interval = this.clickTimes[i] - this.clickTimes[i - 1];\n intervals.push(interval);\n if (interval < 500) doubleClicks++;\n }\n\n const avgInterval = intervals.reduce((a, b) => a + b, 0) / intervals.length;\n const intervalVar = this.variance(intervals);\n\n return {\n totalClicks: this.clickTimes.length,\n averageInterval: Math.round(avgInterval),\n intervalVariance: Math.round(intervalVar),\n doubleClickCount: doubleClicks,\n hasClicks: true,\n };\n }\n\n private calculateHumanScore(\n mouse: MouseMetrics,\n keyboard: KeyboardMetrics,\n scroll: ScrollMetrics,\n clicks: ClickMetrics\n ): number {\n let score = 0.5; // Start neutral\n let factors = 0;\n\n // Mouse analysis\n if (mouse.hasMovement) {\n factors++;\n let mouseScore = 0.5;\n\n // Humans have jitter (small involuntary movements)\n if (mouse.jitter > 0.05) mouseScore += 0.15;\n\n // Bots tend to have very straight movements\n if (mouse.straightLineRatio < 0.5) mouseScore += 0.15;\n else if (mouse.straightLineRatio > 0.9) mouseScore -= 0.2;\n\n // Humans have variable speed\n if (mouse.averageSpeed > 0 && mouse.maxSpeed / mouse.averageSpeed > 3) {\n mouseScore += 0.1;\n }\n\n // Very consistent speed is bot-like\n if (mouse.averageAcceleration > 0) mouseScore += 0.1;\n\n score += Math.max(0, Math.min(1, mouseScore)) - 0.5;\n }\n\n // Keyboard analysis\n if (keyboard.hasKeystrokes) {\n factors++;\n let keyScore = 0.5;\n\n // Humans have high interval variance\n if (keyboard.intervalVariance > 1000) keyScore += 0.2;\n else if (keyboard.intervalVariance < 100) keyScore -= 0.2;\n\n // Very uniform typing is bot-like\n const cv = keyboard.averageInterval > 0\n ? Math.sqrt(keyboard.intervalVariance) / keyboard.averageInterval\n : 0;\n if (cv > 0.3) keyScore += 0.15;\n\n // Hold time variance\n if (keyboard.holdTimeVariance > 500) keyScore += 0.1;\n\n score += Math.max(0, Math.min(1, keyScore)) - 0.5;\n }\n\n // Scroll analysis\n if (scroll.hasScroll) {\n factors++;\n let scrollScore = 0.5;\n\n // Humans have smooth scrolling (not perfectly uniform)\n if (scroll.smoothness > 0.3 && scroll.smoothness < 0.9) {\n scrollScore += 0.2;\n }\n\n score += Math.max(0, Math.min(1, scrollScore)) - 0.5;\n }\n\n // Click analysis\n if (clicks.hasClicks) {\n factors++;\n let clickScore = 0.5;\n\n // Humans have variable click intervals\n if (clicks.intervalVariance > 50000) clickScore += 0.15;\n else if (clicks.intervalVariance < 100) clickScore -= 0.2;\n\n score += Math.max(0, Math.min(1, clickScore)) - 0.5;\n }\n\n // No interaction at all is suspicious\n if (factors === 0) return 0.3;\n\n return Math.max(0, Math.min(1, score));\n }\n\n private variance(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / (values.length - 1);\n }\n}\n","/**\n * VPN/Proxy Detection Module\n * Client-side heuristics for detecting VPN, proxy, and Tor usage.\n * For full accuracy, combine with server-side IP intelligence.\n */\n\nexport interface VPNDetectionResult {\n vpnDetected: boolean;\n proxyDetected: boolean;\n torDetected: boolean;\n confidence: number;\n signals: VPNSignals;\n}\n\ninterface VPNSignals {\n webrtcLeak: boolean | null;\n timezoneIPMismatch: boolean;\n dnsLeak: boolean | null;\n connectionType: string | null;\n multipleIPs: boolean;\n torBrowser: boolean;\n knownVPNExtension: boolean;\n}\n\nexport async function detectVPN(): Promise<VPNDetectionResult> {\n const signals: VPNSignals = {\n webrtcLeak: null,\n timezoneIPMismatch: false,\n dnsLeak: null,\n connectionType: null,\n multipleIPs: false,\n torBrowser: false,\n knownVPNExtension: false,\n };\n\n let confidence = 0;\n let vpnDetected = false;\n let proxyDetected = false;\n let torDetected = false;\n\n // 1. Tor Browser Detection\n signals.torBrowser = detectTorBrowser();\n if (signals.torBrowser) {\n torDetected = true;\n confidence += 0.9;\n }\n\n // 2. WebRTC IP Leak Detection\n try {\n signals.webrtcLeak = await detectWebRTCLeak();\n if (signals.webrtcLeak) {\n vpnDetected = true;\n confidence += 0.3;\n }\n } catch {\n // WebRTC not available or blocked\n signals.webrtcLeak = null;\n }\n\n // 3. Connection type analysis\n signals.connectionType = getConnectionType();\n if (signals.connectionType === 'unknown' || signals.connectionType === null) {\n // Datacenter connections often have no Network Information API\n confidence += 0.05;\n }\n\n // 4. VPN Extension Detection\n signals.knownVPNExtension = detectVPNExtensions();\n if (signals.knownVPNExtension) {\n vpnDetected = true;\n confidence += 0.4;\n }\n\n // 5. Timezone vs IP heuristic\n // This needs server-side geo data, but we can detect if timezone is unusual\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const lang = navigator.language;\n // If timezone doesn't match language locale, it's a weak signal\n if (tz && lang) {\n const tzCountry = getTimezoneCountry(tz);\n const langCountry = lang.split('-')[1]?.toUpperCase();\n if (tzCountry && langCountry && tzCountry !== langCountry) {\n signals.timezoneIPMismatch = true;\n confidence += 0.1;\n }\n }\n\n // Normalize confidence\n confidence = Math.min(confidence, 1);\n\n // If no strong signals, mark as not detected\n if (confidence < 0.3) {\n vpnDetected = false;\n proxyDetected = false;\n }\n\n return {\n vpnDetected,\n proxyDetected,\n torDetected,\n confidence,\n signals,\n };\n}\n\nfunction detectTorBrowser(): boolean {\n if (typeof window === 'undefined') return false;\n\n // Tor browser characteristics\n const checks: boolean[] = [];\n\n // 1. Screen dimensions are typically 1000x1000 in Tor\n checks.push(window.screen.width === 1000 && window.screen.height === 1000);\n\n // 2. Tor disables many APIs\n checks.push(!window.MediaDevices);\n checks.push(navigator.plugins.length === 0);\n\n // 3. Timezone offset is 0 (UTC) in Tor\n checks.push(new Date().getTimezoneOffset() === 0);\n\n // 4. Hardcoded user agent patterns\n const ua = navigator.userAgent;\n checks.push(ua.includes('Firefox') && !ua.includes('Chrome'));\n\n // If 3+ checks pass, likely Tor\n const score = checks.filter(Boolean).length;\n return score >= 3;\n}\n\nasync function detectWebRTCLeak(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.RTCPeerConnection) {\n return false;\n }\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => resolve(false), 3000);\n const localIPs: Set<string> = new Set();\n\n try {\n const pc = new RTCPeerConnection({\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],\n });\n\n pc.createDataChannel('');\n\n pc.onicecandidate = (event) => {\n if (!event.candidate) {\n clearTimeout(timeout);\n pc.close();\n // If we got local IPs through WebRTC, there might be a VPN leak\n // (VPN should prevent local IP exposure)\n resolve(localIPs.size > 1);\n return;\n }\n\n const candidate = event.candidate.candidate;\n const ipMatch = candidate.match(/(\\d{1,3}\\.){3}\\d{1,3}/);\n if (ipMatch) {\n localIPs.add(ipMatch[0]);\n }\n };\n\n pc.createOffer()\n .then(offer => pc.setLocalDescription(offer))\n .catch(() => {\n clearTimeout(timeout);\n resolve(false);\n });\n } catch {\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\nfunction getConnectionType(): string | null {\n if (typeof navigator === 'undefined') return null;\n const nav = navigator as Navigator & { connection?: { type?: string; effectiveType?: string } };\n if (nav.connection) {\n return nav.connection.type || nav.connection.effectiveType || null;\n }\n return null;\n}\n\nfunction detectVPNExtensions(): boolean {\n if (typeof document === 'undefined') return false;\n\n // Check for known VPN extension injected elements or attributes\n const body = document.body;\n if (!body) return false;\n\n // Some VPN extensions add specific classes or data attributes\n const vpnIndicators = [\n '[data-windscribe]',\n '[data-nord]',\n '.surfshark-extension',\n '#vpn-indicator',\n '[data-expressvpn]',\n ];\n\n for (const selector of vpnIndicators) {\n try {\n if (document.querySelector(selector)) return true;\n } catch {\n // Invalid selector, skip\n }\n }\n\n return false;\n}\n\nfunction getTimezoneCountry(tz: string): string | null {\n // Simple timezone to country mapping for common timezones\n const tzMap: Record<string, string> = {\n 'America/New_York': 'US',\n 'America/Chicago': 'US',\n 'America/Denver': 'US',\n 'America/Los_Angeles': 'US',\n 'Europe/London': 'GB',\n 'Europe/Paris': 'FR',\n 'Europe/Berlin': 'DE',\n 'Europe/Madrid': 'ES',\n 'Europe/Rome': 'IT',\n 'Asia/Tokyo': 'JP',\n 'Asia/Shanghai': 'CN',\n 'Asia/Kolkata': 'IN',\n 'Asia/Seoul': 'KR',\n 'Australia/Sydney': 'AU',\n 'America/Toronto': 'CA',\n 'America/Sao_Paulo': 'BR',\n 'America/Mexico_City': 'MX',\n };\n\n return tzMap[tz] || null;\n}\n","/**\n * Fingerprint Manager\n * Manages visitor ID generation, signal caching, and localStorage persistence\n */\n\nimport type { FingerprintConfig, DeviceSignals, VisitorIdResult, FraudCheckResult, CachedVisitor } from './types';\nimport { collectDeviceSignals } from './signals';\nimport { BehaviorAnalyzer } from './behavior';\nimport { detectVPN } from './vpn-detection';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst CACHE_KEY = 'sitepong_visitor';\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\nexport class FingerprintManager {\n private config: Required<Omit<FingerprintConfig, 'apiKey' | 'visitorEndpoint' | 'extendedSignals'>> & {\n apiKey: string;\n visitorEndpoint?: string;\n extendedSignals?: boolean;\n };\n private cachedVisitor: CachedVisitor | null = null;\n private pendingRequest: Promise<VisitorIdResult> | null = null;\n private behaviorAnalyzer: BehaviorAnalyzer;\n\n constructor(config: FingerprintConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n debug: false,\n ...config,\n };\n\n this.behaviorAnalyzer = new BehaviorAnalyzer();\n if (this.config.enabled && typeof window !== 'undefined') {\n this.behaviorAnalyzer.start();\n }\n\n this.loadFromStorage();\n }\n\n async getVisitorId(): Promise<VisitorIdResult> {\n if (!this.config.enabled) {\n throw new Error('Fingerprint is not enabled');\n }\n\n // Return cached result if valid\n if (this.cachedVisitor && !this.isCacheExpired()) {\n this.log('Returning cached visitor ID:', this.cachedVisitor.result.visitorId);\n return this.cachedVisitor.result;\n }\n\n // Deduplicate concurrent requests\n if (this.pendingRequest) {\n return this.pendingRequest;\n }\n\n this.pendingRequest = this.fetchVisitorId();\n\n try {\n const result = await this.pendingRequest;\n return result;\n } finally {\n this.pendingRequest = null;\n }\n }\n\n async getDeviceSignals(): Promise<DeviceSignals> {\n return collectDeviceSignals(this.config.extendedSignals ?? false);\n }\n\n async getFraudCheck(): Promise<FraudCheckResult> {\n const [visitorResult, signals, vpnResult] = await Promise.all([\n this.getVisitorId(),\n this.getDeviceSignals(),\n detectVPN().catch(() => null),\n ]);\n\n // Include behavior analysis metrics\n const behaviorMetrics = this.behaviorAnalyzer.getMetrics();\n signals.behavior = {\n score: behaviorMetrics.score,\n mouseMovements: behaviorMetrics.mouse.totalMovements,\n keystrokes: behaviorMetrics.keyboard.totalKeystrokes,\n scrolls: behaviorMetrics.scroll.totalScrolls,\n clicks: behaviorMetrics.clicks.totalClicks,\n isHuman: behaviorMetrics.score > 0.6,\n };\n\n const vpnDetected = vpnResult?.vpnDetected || vpnResult?.torDetected || false;\n\n return {\n visitorId: visitorResult.visitorId,\n riskScore: this.calculateRiskScore(signals, vpnDetected),\n signals,\n flags: {\n incognito: signals.smart?.incognito || signals.incognito,\n bot: signals.smart?.bot || signals.bot || !signals.behavior.isHuman,\n vpn: vpnDetected || signals.smart?.timezoneMismatch,\n tampered: signals.smart?.privacyBrowser,\n },\n };\n }\n\n stopBehaviorTracking(): void {\n this.behaviorAnalyzer.stop();\n }\n\n private async fetchVisitorId(): Promise<VisitorIdResult> {\n const signals = await this.getDeviceSignals();\n const endpoint = this.config.visitorEndpoint || `${this.config.endpoint}/api/visitors`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ signals }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const result: VisitorIdResult = await response.json();\n\n // Cache the result\n this.cachedVisitor = {\n result,\n signals,\n cachedAt: Date.now(),\n };\n this.saveToStorage();\n\n this.log('Visitor ID fetched:', result.visitorId);\n return result;\n } catch (err) {\n this.log('Failed to fetch visitor ID:', err);\n throw err;\n }\n }\n\n private calculateRiskScore(signals: DeviceSignals, vpnDetected = false): number {\n let score = 0;\n const smart = signals.smart;\n\n // High-risk signals\n if (smart?.bot || signals.bot) score += 0.8;\n\n // Behavior analysis (strong signal)\n if (signals.behavior) {\n if (signals.behavior.score < 0.3) score += 0.4;\n else if (signals.behavior.score < 0.5) score += 0.2;\n }\n\n // VPN/Proxy detection\n if (vpnDetected) score += 0.25;\n\n // Medium-risk signals\n if (smart?.incognito || signals.incognito) score += 0.2;\n if (smart?.devToolsOpen) score += 0.1;\n if (smart?.privacyBrowser) score += 0.1;\n\n // Low-risk signals\n if (signals.hardwareConcurrency === 0) score += 0.1;\n if (signals.maxTouchPoints === 0 && /mobile|android|iphone/i.test(signals.userAgent)) {\n score += 0.15;\n }\n if (!signals.cookieEnabled) score += 0.1;\n if (smart?.doNotTrack) score += 0.05;\n\n // Device age: brand new devices are slightly more suspicious\n if (smart?.deviceVisitCount === 1) score += 0.05;\n\n return Math.round(Math.min(score, 1) * 100) / 100;\n }\n\n private isCacheExpired(): boolean {\n if (!this.cachedVisitor) return true;\n return Date.now() - this.cachedVisitor.cachedAt > CACHE_TTL_MS;\n }\n\n private loadFromStorage(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(CACHE_KEY);\n if (!stored) return;\n\n const parsed: CachedVisitor = JSON.parse(stored);\n if (!this.isCacheExpiredAt(parsed.cachedAt)) {\n this.cachedVisitor = parsed;\n this.log('Loaded cached visitor from storage');\n } else {\n localStorage.removeItem(CACHE_KEY);\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n private saveToStorage(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n if (!this.cachedVisitor) return;\n\n try {\n localStorage.setItem(CACHE_KEY, JSON.stringify(this.cachedVisitor));\n } catch {\n // Ignore storage errors\n }\n }\n\n private isCacheExpiredAt(cachedAt: number): boolean {\n return Date.now() - cachedAt > CACHE_TTL_MS;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Fingerprint]', ...args);\n }\n }\n}\n","import type { SerializedNode, DOMSnapshot } from './types';\n\nlet nodeIdCounter = 0;\nconst nodeIdMap = new WeakMap<Node, number>();\n\nexport function resetNodeIds(): void {\n nodeIdCounter = 0;\n}\n\nexport function getNodeId(node: Node): number {\n let id = nodeIdMap.get(node);\n if (id === undefined) {\n id = ++nodeIdCounter;\n nodeIdMap.set(node, id);\n }\n return id;\n}\n\nexport function getNodeById(id: number, root: Node): Node | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ALL);\n let node: Node | null = walker.currentNode;\n while (node) {\n if (nodeIdMap.get(node) === id) return node;\n node = walker.nextNode();\n }\n return null;\n}\n\ninterface SerializeOptions {\n maskInputs: boolean;\n blockSelector?: string;\n maskSelector?: string;\n}\n\nexport function serializeNode(node: Node, options: SerializeOptions): SerializedNode | null {\n const id = getNodeId(node);\n\n if (node.nodeType === Node.TEXT_NODE) {\n const parent = node.parentElement;\n let textContent = node.textContent || '';\n\n // Mask text content if parent matches maskSelector\n if (parent && options.maskSelector && parent.matches(options.maskSelector)) {\n textContent = textContent.replace(/\\S/g, '*');\n }\n\n return {\n id,\n type: 'text',\n textContent,\n };\n }\n\n if (node.nodeType === Node.COMMENT_NODE) {\n return { id, type: 'comment', textContent: '' };\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n\n // Block this element entirely if it matches blockSelector\n if (options.blockSelector && el.matches(options.blockSelector)) {\n return {\n id,\n type: 'element',\n tagName: 'div',\n attributes: {\n 'data-blocked': 'true',\n style: `width:${(el as HTMLElement).offsetWidth}px;height:${(el as HTMLElement).offsetHeight}px;background:#f0f0f0;`,\n },\n };\n }\n\n const tagName = el.tagName.toLowerCase();\n const attributes: Record<string, string> = {};\n\n // Skip script and style content\n if (tagName === 'script' || tagName === 'noscript') {\n return { id, type: 'element', tagName, attributes: {} };\n }\n\n // Serialize attributes\n for (const attr of Array.from(el.attributes)) {\n // Skip event handlers and potentially sensitive attributes\n if (attr.name.startsWith('on')) continue;\n if (attr.name === 'value' && options.maskInputs && isInputElement(el)) {\n attributes[attr.name] = '***';\n continue;\n }\n attributes[attr.name] = attr.value;\n }\n\n // Handle input values\n if (options.maskInputs && isInputElement(el)) {\n const input = el as HTMLInputElement;\n if (input.type !== 'checkbox' && input.type !== 'radio' && input.type !== 'submit' && input.type !== 'button') {\n attributes['value'] = '***';\n }\n }\n\n // Serialize children\n const children: SerializedNode[] = [];\n if (tagName !== 'style') {\n for (const child of Array.from(el.childNodes)) {\n const serialized = serializeNode(child, options);\n if (serialized) {\n children.push(serialized);\n }\n }\n } else {\n // Inline style content\n const textContent = el.textContent || '';\n if (textContent) {\n children.push({\n id: getNodeId(el.firstChild || el),\n type: 'text',\n textContent,\n });\n }\n }\n\n return {\n id,\n type: 'element',\n tagName,\n attributes,\n children,\n isSVG: el instanceof SVGElement,\n };\n }\n\n return null;\n}\n\nexport function takeSnapshot(options: SerializeOptions): DOMSnapshot | null {\n if (typeof document === 'undefined') return null;\n\n resetNodeIds();\n\n const html = serializeNode(document.documentElement, options);\n if (!html) return null;\n\n return {\n doctype: document.doctype\n ? `<!DOCTYPE ${document.doctype.name}>`\n : undefined,\n html,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nfunction isInputElement(el: Element): boolean {\n const tag = el.tagName.toLowerCase();\n return tag === 'input' || tag === 'textarea' || tag === 'select';\n}\n","/**\n * Network Request Recording for Session Replay\n * Intercepts XHR and fetch requests to record them in the replay timeline.\n */\n\nexport interface NetworkEvent {\n type: 'network';\n timestamp: number;\n data: NetworkRequestData;\n}\n\nexport interface NetworkRequestData {\n method: string;\n url: string;\n status?: number;\n statusText?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n duration?: number;\n requestSize?: number;\n responseSize?: number;\n error?: string;\n initiator: 'fetch' | 'xhr';\n}\n\ntype NetworkCallback = (event: NetworkEvent) => void;\n\n/** Headers that should never be captured for privacy */\nconst REDACTED_HEADERS = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n];\n\nexport class NetworkRecorder {\n private callback: NetworkCallback;\n private originalFetch: typeof window.fetch | null = null;\n private originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n private originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n private active = false;\n private captureHeaders: boolean;\n private urlFilter?: (url: string) => boolean;\n\n constructor(\n callback: NetworkCallback,\n options?: {\n captureHeaders?: boolean;\n urlFilter?: (url: string) => boolean;\n }\n ) {\n this.callback = callback;\n this.captureHeaders = options?.captureHeaders ?? false;\n this.urlFilter = options?.urlFilter;\n }\n\n start(): void {\n if (this.active || typeof window === 'undefined') return;\n this.active = true;\n\n this.interceptFetch();\n this.interceptXHR();\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n // Restore fetch\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n\n // Restore XHR\n if (this.originalXhrOpen) {\n XMLHttpRequest.prototype.open = this.originalXhrOpen;\n this.originalXhrOpen = null;\n }\n if (this.originalXhrSend) {\n XMLHttpRequest.prototype.send = this.originalXhrSend;\n this.originalXhrSend = null;\n }\n }\n\n private interceptFetch(): void {\n if (typeof window.fetch !== 'function') return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = async function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : (input as Request).url;\n\n if (self.urlFilter && !self.urlFilter(url)) {\n return self.originalFetch!.call(window, input, init);\n }\n\n const startTime = Date.now();\n const method = init?.method || (input instanceof Request ? input.method : 'GET');\n\n let requestSize: number | undefined;\n if (init?.body) {\n if (typeof init.body === 'string') {\n requestSize = init.body.length;\n } else if (init.body instanceof Blob) {\n requestSize = init.body.size;\n }\n }\n\n try {\n const response = await self.originalFetch!.call(window, input, init);\n const duration = Date.now() - startTime;\n\n const data: NetworkRequestData = {\n method: method.toUpperCase(),\n url: self.truncateUrl(url),\n status: response.status,\n statusText: response.statusText,\n duration,\n requestSize,\n initiator: 'fetch',\n };\n\n if (self.captureHeaders) {\n data.requestHeaders = self.safeHeaders(init?.headers);\n data.responseHeaders = self.headersToObject(response.headers);\n }\n\n self.emit(data);\n return response;\n } catch (err) {\n const duration = Date.now() - startTime;\n\n self.emit({\n method: method.toUpperCase(),\n url: self.truncateUrl(url),\n duration,\n requestSize,\n error: err instanceof Error ? err.message : 'Network error',\n initiator: 'fetch',\n });\n\n throw err;\n }\n };\n }\n\n private interceptXHR(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n this.originalXhrOpen = XMLHttpRequest.prototype.open;\n this.originalXhrSend = XMLHttpRequest.prototype.send;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n ...args: unknown[]\n ) {\n (this as XMLHttpRequest & { _spMethod: string; _spUrl: string })._spMethod = method;\n (this as XMLHttpRequest & { _spUrl: string })._spUrl = typeof url === 'string' ? url : url.toString();\n return self.originalXhrOpen!.apply(this, [method, url, ...args] as Parameters<typeof XMLHttpRequest.prototype.open>);\n };\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const xhr = this as XMLHttpRequest & { _spMethod: string; _spUrl: string };\n const url = xhr._spUrl;\n\n if (self.urlFilter && !self.urlFilter(url)) {\n return self.originalXhrSend!.call(this, body);\n }\n\n const startTime = Date.now();\n let requestSize: number | undefined;\n if (typeof body === 'string') {\n requestSize = body.length;\n }\n\n const onLoadEnd = () => {\n const duration = Date.now() - startTime;\n const data: NetworkRequestData = {\n method: (xhr._spMethod || 'GET').toUpperCase(),\n url: self.truncateUrl(url),\n status: xhr.status,\n statusText: xhr.statusText,\n duration,\n requestSize,\n responseSize: xhr.responseText?.length,\n initiator: 'xhr',\n };\n\n if (xhr.status === 0) {\n data.error = 'Network error';\n }\n\n self.emit(data);\n xhr.removeEventListener('loadend', onLoadEnd);\n };\n\n xhr.addEventListener('loadend', onLoadEnd);\n return self.originalXhrSend!.call(this, body);\n };\n }\n\n private emit(data: NetworkRequestData): void {\n if (!this.active) return;\n this.callback({\n type: 'network',\n timestamp: Date.now(),\n data,\n });\n }\n\n private truncateUrl(url: string): string {\n // Remove query params with sensitive data patterns\n try {\n const parsed = new URL(url, window.location.origin);\n // Keep path, truncate if too long\n const path = parsed.pathname + parsed.search;\n return path.length > 500 ? path.slice(0, 500) + '...' : parsed.origin + path;\n } catch {\n return url.length > 500 ? url.slice(0, 500) + '...' : url;\n }\n }\n\n private safeHeaders(headers?: HeadersInit): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n const result: Record<string, string> = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n });\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n }\n } else {\n for (const [key, value] of Object.entries(headers)) {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n }\n }\n return result;\n }\n\n private headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n });\n return result;\n }\n}\n","/**\n * Console Log Recording for Session Replay\n * Intercepts console.log/warn/error/info/debug to record them in the replay timeline.\n */\n\nexport type ConsoleLevel = 'log' | 'info' | 'warn' | 'error' | 'debug';\n\nexport interface ConsoleEvent {\n type: 'console';\n timestamp: number;\n data: ConsoleEventData;\n}\n\nexport interface ConsoleEventData {\n level: ConsoleLevel;\n args: string[];\n trace?: string;\n}\n\ntype ConsoleCallback = (event: ConsoleEvent) => void;\n\nconst MAX_ARG_LENGTH = 1000;\nconst MAX_ARGS = 10;\nconst MAX_TRACE_LENGTH = 2000;\n\nexport class ConsoleRecorder {\n private callback: ConsoleCallback;\n private originals: Record<ConsoleLevel, (...args: unknown[]) => void> = {} as Record<ConsoleLevel, (...args: unknown[]) => void>;\n private active = false;\n private levels: ConsoleLevel[];\n\n constructor(\n callback: ConsoleCallback,\n options?: {\n levels?: ConsoleLevel[];\n }\n ) {\n this.callback = callback;\n this.levels = options?.levels || ['log', 'info', 'warn', 'error', 'debug'];\n }\n\n start(): void {\n if (this.active || typeof console === 'undefined') return;\n this.active = true;\n\n for (const level of this.levels) {\n this.originals[level] = console[level].bind(console);\n console[level] = (...args: unknown[]) => {\n // Always call original\n this.originals[level](...args);\n // Record the event\n this.record(level, args);\n };\n }\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n for (const level of this.levels) {\n if (this.originals[level]) {\n console[level] = this.originals[level];\n }\n }\n this.originals = {} as Record<ConsoleLevel, (...args: unknown[]) => void>;\n }\n\n private record(level: ConsoleLevel, args: unknown[]): void {\n if (!this.active) return;\n\n // Skip SDK's own debug logs to prevent feedback loops\n if (args.length > 0 && typeof args[0] === 'string' && args[0].startsWith('[SitePong')) {\n return;\n }\n\n const serializedArgs = args.slice(0, MAX_ARGS).map((arg) => this.serialize(arg));\n\n const data: ConsoleEventData = {\n level,\n args: serializedArgs,\n };\n\n // Capture stack trace for errors\n if (level === 'error') {\n const trace = this.getStackTrace();\n if (trace) {\n data.trace = trace.slice(0, MAX_TRACE_LENGTH);\n }\n }\n\n this.callback({\n type: 'console',\n timestamp: Date.now(),\n data,\n });\n }\n\n private serialize(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n\n if (value instanceof Error) {\n return `Error: ${value.message}${value.stack ? '\\n' + value.stack : ''}`.slice(0, MAX_ARG_LENGTH);\n }\n\n if (typeof value === 'string') {\n return value.slice(0, MAX_ARG_LENGTH);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n if (value instanceof HTMLElement) {\n return `<${value.tagName.toLowerCase()}${value.id ? '#' + value.id : ''}${value.className ? '.' + value.className.split(' ').join('.') : ''}>`;\n }\n\n try {\n const str = JSON.stringify(value, this.getReplacer(), 0);\n return str ? str.slice(0, MAX_ARG_LENGTH) : String(value);\n } catch {\n return String(value).slice(0, MAX_ARG_LENGTH);\n }\n }\n\n private getReplacer(): (key: string, value: unknown) => unknown {\n const seen = new WeakSet();\n return (_key: string, value: unknown) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n }\n if (typeof value === 'function') return '[Function]';\n if (value instanceof RegExp) return value.toString();\n return value;\n };\n }\n\n private getStackTrace(): string | undefined {\n try {\n const err = new Error();\n if (!err.stack) return undefined;\n // Remove the first few frames (this function, record, console wrapper)\n const lines = err.stack.split('\\n');\n return lines.slice(4).join('\\n') || undefined;\n } catch {\n return undefined;\n }\n }\n}\n","import type {\n ReplayConfig,\n ReplayEvent,\n MutationData,\n MouseMoveData,\n InputData,\n ScrollData,\n} from './types';\nimport { takeSnapshot, getNodeId, serializeNode } from './serializer';\nimport { NetworkRecorder } from './network';\nimport { ConsoleRecorder } from './console';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_FLUSH_INTERVAL = 5000;\nconst DEFAULT_MAX_BATCH_SIZE = 100;\nconst DEFAULT_MAX_SESSION_DURATION = 60 * 60 * 1000; // 60 minutes\n\nexport class ReplayManager {\n private config: Required<Omit<ReplayConfig, 'apiKey' | 'replayEndpoint' | 'blockSelector' | 'maskSelector' | 'recordNetwork' | 'captureNetworkHeaders' | 'recordConsole' | 'consoleLevels'>> & {\n apiKey: string;\n replayEndpoint?: string;\n blockSelector?: string;\n maskSelector?: string;\n recordNetwork?: boolean;\n captureNetworkHeaders?: boolean;\n recordConsole?: boolean;\n consoleLevels?: ReplayConfig['consoleLevels'];\n };\n private recording = false;\n private sessionId: string | null = null;\n private events: ReplayEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private sessionStartTime: number = 0;\n private observer: MutationObserver | null = null;\n private mouseMoveBuffer: { x: number; y: number; t: number }[] = [];\n private mouseMoveFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private cleanupFns: Array<() => void> = [];\n private networkRecorder: NetworkRecorder | null = null;\n private consoleRecorder: ConsoleRecorder | null = null;\n private lastSnapshotTime: number = 0;\n private snapshotCooldown: number = 500; // min ms between interaction snapshots\n private userContext: { id?: string } | null = null;\n\n constructor(config: ReplayConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n maskInputs: true,\n maxSessionDuration: DEFAULT_MAX_SESSION_DURATION,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n maxBatchSize: DEFAULT_MAX_BATCH_SIZE,\n sampleRate: 1.0,\n debug: false,\n ...config,\n };\n }\n\n start(): boolean {\n if (typeof window === 'undefined') return false;\n if (this.recording) return true;\n if (!this.config.enabled) return false;\n\n // Apply sample rate\n if (Math.random() > this.config.sampleRate) {\n this.log('Session not sampled');\n return false;\n }\n\n this.sessionId = this.getOrCreateSessionId();\n this.sessionStartTime = this.getOrCreateStartTime();\n this.recording = true;\n this.events = [];\n\n // Take initial DOM snapshot\n const snapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n\n if (snapshot) {\n this.addEvent('snapshot', snapshot);\n }\n\n // Start recording\n this.setupMutationObserver();\n this.setupEventListeners();\n this.setupNetworkRecording();\n this.setupConsoleRecording();\n this.startFlushTimer();\n\n this.log('Recording started:', this.sessionId);\n return true;\n }\n\n stop(): void {\n if (!this.recording) return;\n\n this.recording = false;\n this.flush();\n\n // Cleanup\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.mouseMoveFlushTimer) {\n clearTimeout(this.mouseMoveFlushTimer);\n this.mouseMoveFlushTimer = null;\n }\n\n if (this.networkRecorder) {\n this.networkRecorder.stop();\n this.networkRecorder = null;\n }\n\n if (this.consoleRecorder) {\n this.consoleRecorder.stop();\n this.consoleRecorder = null;\n }\n\n for (const cleanup of this.cleanupFns) {\n cleanup();\n }\n this.cleanupFns = [];\n\n this.log('Recording stopped:', this.sessionId);\n this.sessionId = null;\n }\n\n isRecording(): boolean {\n return this.recording;\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n setUser(user: { id?: string } | null): void {\n this.userContext = user;\n }\n\n private addEvent(type: ReplayEvent['type'], data: unknown): void {\n if (!this.recording) return;\n\n // Check session duration\n if (Date.now() - this.sessionStartTime > this.config.maxSessionDuration) {\n this.stop();\n return;\n }\n\n this.events.push({\n type,\n timestamp: Date.now() - this.sessionStartTime,\n data,\n });\n\n if (this.events.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined') return;\n\n this.observer = new MutationObserver((mutations) => {\n const mutationData: MutationData = {\n adds: [],\n removes: [],\n attributes: [],\n texts: [],\n };\n\n for (const mutation of mutations) {\n switch (mutation.type) {\n case 'childList': {\n for (const node of Array.from(mutation.addedNodes)) {\n const serialized = serializeNode(node, {\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (serialized) {\n mutationData.adds.push({\n parentId: getNodeId(mutation.target),\n nextId: mutation.nextSibling ? getNodeId(mutation.nextSibling) : null,\n node: serialized,\n });\n }\n }\n for (const node of Array.from(mutation.removedNodes)) {\n mutationData.removes.push({\n parentId: getNodeId(mutation.target),\n id: getNodeId(node),\n });\n }\n break;\n }\n case 'attributes': {\n const el = mutation.target as Element;\n const value = el.getAttribute(mutation.attributeName || '');\n mutationData.attributes.push({\n id: getNodeId(mutation.target),\n attributes: { [mutation.attributeName || '']: value },\n });\n break;\n }\n case 'characterData': {\n let textValue = mutation.target.textContent || '';\n const parent = mutation.target.parentElement;\n if (parent && this.config.maskSelector && parent.matches(this.config.maskSelector)) {\n textValue = textValue.replace(/\\S/g, '*');\n }\n mutationData.texts.push({\n id: getNodeId(mutation.target),\n value: textValue,\n });\n break;\n }\n }\n }\n\n if (mutationData.adds.length || mutationData.removes.length ||\n mutationData.attributes.length || mutationData.texts.length) {\n this.addEvent('mutation', mutationData);\n }\n });\n\n this.observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n attributeOldValue: false,\n });\n }\n\n private setupEventListeners(): void {\n // Mouse move (throttled)\n const onMouseMove = (e: MouseEvent) => {\n this.mouseMoveBuffer.push({\n x: e.clientX,\n y: e.clientY,\n t: Date.now() - this.sessionStartTime,\n });\n\n if (!this.mouseMoveFlushTimer) {\n this.mouseMoveFlushTimer = setTimeout(() => {\n if (this.mouseMoveBuffer.length > 0) {\n const data: MouseMoveData = { positions: [...this.mouseMoveBuffer] };\n this.addEvent('mouse_move', data);\n this.mouseMoveBuffer = [];\n }\n this.mouseMoveFlushTimer = null;\n }, 50);\n }\n };\n\n // Mouse click (left)\n const onClick = (e: MouseEvent) => {\n const target = e.target as Node;\n this.addEvent('mouse_click', {\n x: e.clientX,\n y: e.clientY,\n targetId: getNodeId(target),\n button: e.button,\n });\n this.takeInteractionSnapshot();\n };\n\n // Right-click (contextmenu)\n const onContextMenu = (e: MouseEvent) => {\n const target = e.target as Node;\n this.addEvent('mouse_click', {\n x: e.clientX,\n y: e.clientY,\n targetId: getNodeId(target),\n button: 2,\n });\n this.takeInteractionSnapshot();\n };\n\n // Mouse leaving the page\n const onMouseLeave = () => {\n this.addEvent('mouse_leave', {});\n };\n\n // Touch events (taps)\n const onTouchStart = (e: TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n const target = e.target as Node;\n this.addEvent('touch', {\n x: touch.clientX,\n y: touch.clientY,\n targetId: getNodeId(target),\n });\n this.takeInteractionSnapshot();\n };\n\n // Scroll (with debounced snapshot on scroll-end)\n let scrollSnapshotTimer: ReturnType<typeof setTimeout> | null = null;\n const onScroll = () => {\n const data: ScrollData = {\n id: 0, // document scroll\n x: window.scrollX,\n y: window.scrollY,\n };\n this.addEvent('scroll', data);\n\n if (scrollSnapshotTimer) clearTimeout(scrollSnapshotTimer);\n scrollSnapshotTimer = setTimeout(() => {\n this.takeInteractionSnapshot();\n }, 250);\n };\n\n // Input changes\n const onInput = (e: Event) => {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n if (!target) return;\n\n const data: InputData = {\n id: getNodeId(target),\n value: this.config.maskInputs ? '***' : target.value,\n };\n\n if ('checked' in target) {\n data.isChecked = (target as HTMLInputElement).checked;\n }\n\n this.addEvent('input', data);\n };\n\n // Window resize\n const onResize = () => {\n this.addEvent('resize', {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n // Focus/blur\n const onFocus = (e: FocusEvent) => {\n if (e.target && e.target !== document) {\n this.addEvent('focus', { id: getNodeId(e.target as Node) });\n }\n };\n\n const onBlur = (e: FocusEvent) => {\n if (e.target && e.target !== document) {\n this.addEvent('blur', { id: getNodeId(e.target as Node) });\n }\n };\n\n // Page visibility - stop/resume\n const onVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this.flush();\n }\n };\n\n // Add listeners\n document.addEventListener('mousemove', onMouseMove, { passive: true });\n document.addEventListener('click', onClick, { passive: true });\n document.addEventListener('contextmenu', onContextMenu, { passive: true });\n document.documentElement.addEventListener('mouseleave', onMouseLeave, { passive: true });\n document.addEventListener('touchstart', onTouchStart, { passive: true });\n window.addEventListener('scroll', onScroll, { passive: true });\n document.addEventListener('input', onInput, { passive: true });\n window.addEventListener('resize', onResize, { passive: true });\n document.addEventListener('focus', onFocus, { passive: true, capture: true });\n document.addEventListener('blur', onBlur, { passive: true, capture: true });\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n // Store cleanup functions\n this.cleanupFns.push(\n () => document.removeEventListener('mousemove', onMouseMove),\n () => document.removeEventListener('click', onClick),\n () => document.removeEventListener('contextmenu', onContextMenu),\n () => document.documentElement.removeEventListener('mouseleave', onMouseLeave),\n () => document.removeEventListener('touchstart', onTouchStart),\n () => window.removeEventListener('scroll', onScroll),\n () => document.removeEventListener('input', onInput),\n () => window.removeEventListener('resize', onResize),\n () => document.removeEventListener('focus', onFocus, { capture: true } as EventListenerOptions),\n () => document.removeEventListener('blur', onBlur, { capture: true } as EventListenerOptions),\n () => document.removeEventListener('visibilitychange', onVisibilityChange),\n );\n }\n\n private setupNetworkRecording(): void {\n if (!this.config.recordNetwork) return;\n\n const sdkEndpoint = this.config.replayEndpoint || this.config.endpoint;\n this.networkRecorder = new NetworkRecorder(\n (event) => {\n this.addEvent('network', event.data);\n },\n {\n captureHeaders: this.config.captureNetworkHeaders,\n // Skip recording our own SDK API calls\n urlFilter: (url) => !url.startsWith(sdkEndpoint),\n }\n );\n\n this.networkRecorder.start();\n }\n\n private setupConsoleRecording(): void {\n if (!this.config.recordConsole) return;\n\n this.consoleRecorder = new ConsoleRecorder(\n (event) => {\n this.addEvent('console', event.data);\n },\n {\n levels: this.config.consoleLevels,\n }\n );\n\n this.consoleRecorder.start();\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n async flush(): Promise<void> {\n if (this.events.length === 0 || !this.sessionId) return;\n\n const events = [...this.events];\n this.events = [];\n\n const endpoint = this.config.replayEndpoint || `${this.config.endpoint}/api/replays`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n sessionId: this.sessionId,\n events,\n startedAt: new Date(this.sessionStartTime).toISOString(),\n pageUrl: typeof location !== 'undefined' ? location.href : undefined,\n pageTitle: typeof document !== 'undefined' ? document.title : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n userId: this.userContext?.id,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${events.length} replay events`);\n } catch (err) {\n // Re-queue on failure\n this.events.unshift(...events);\n this.log('Failed to flush replay events:', err);\n }\n }\n\n private takeInteractionSnapshot(): void {\n const now = Date.now();\n if (now - this.lastSnapshotTime < this.snapshotCooldown) return;\n this.lastSnapshotTime = now;\n\n const snapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (snapshot) {\n this.addEvent('snapshot', snapshot);\n }\n }\n\n private getOrCreateSessionId(): string {\n const storageKey = '__sp_replay_session';\n try {\n const existing = sessionStorage.getItem(storageKey);\n if (existing) return existing;\n } catch { /* ignored */ }\n const id = `rep_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n try { sessionStorage.setItem(storageKey, id); } catch { /* ignored */ }\n return id;\n }\n\n private getOrCreateStartTime(): number {\n const storageKey = '__sp_replay_start';\n try {\n const existing = sessionStorage.getItem(storageKey);\n if (existing) return parseInt(existing, 10);\n } catch { /* ignored */ }\n const now = Date.now();\n try { sessionStorage.setItem(storageKey, String(now)); } catch { /* ignored */ }\n return now;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Replay]', ...args);\n }\n }\n}\n","import type {\n PerformanceConfig,\n PerformanceMetric,\n PerformanceTransaction,\n PerformanceSpan,\n WebVitals,\n} from './types';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_FLUSH_INTERVAL = 10000;\n\nexport class PerformanceManager {\n private config: Required<Omit<PerformanceConfig, 'apiKey' | 'performanceEndpoint'>> & {\n apiKey: string;\n performanceEndpoint?: string;\n };\n private metrics: PerformanceMetric[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private vitals: WebVitals = {};\n private activeTransactions: Map<string, PerformanceTransaction> = new Map();\n private sampled: boolean;\n\n constructor(config: PerformanceConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n webVitals: true,\n navigationTiming: true,\n resourceTiming: false,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n sampleRate: 1.0,\n debug: false,\n ...config,\n };\n this.sampled = Math.random() <= this.config.sampleRate;\n }\n\n init(): void {\n if (!this.config.enabled || !this.sampled) return;\n if (typeof window === 'undefined') return;\n\n if (this.config.webVitals) {\n this.observeWebVitals();\n }\n\n if (this.config.navigationTiming) {\n this.collectNavigationTiming();\n }\n\n this.startFlushTimer();\n this.log('Performance monitoring initialized');\n }\n\n /**\n * Start a custom transaction for measuring operations\n */\n startTransaction(name: string, data?: Record<string, unknown>): string {\n const id = `txn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const transaction: PerformanceTransaction = {\n id,\n name,\n startTime: performance.now(),\n status: 'running',\n spans: [],\n data,\n };\n this.activeTransactions.set(id, transaction);\n this.log('Transaction started:', name, id);\n return id;\n }\n\n /**\n * End a transaction and report it\n */\n endTransaction(id: string, status: 'ok' | 'error' = 'ok'): void {\n const transaction = this.activeTransactions.get(id);\n if (!transaction) {\n this.log('Transaction not found:', id);\n return;\n }\n\n transaction.endTime = performance.now();\n transaction.duration = transaction.endTime - transaction.startTime;\n transaction.status = status;\n\n // End any running spans\n for (const span of transaction.spans) {\n if (span.status === 'running') {\n span.endTime = transaction.endTime;\n span.duration = span.endTime - span.startTime;\n span.status = status;\n }\n }\n\n this.activeTransactions.delete(id);\n\n this.addMetric({\n type: 'transaction',\n name: transaction.name,\n value: transaction.duration,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n transaction,\n });\n\n this.log('Transaction ended:', transaction.name, `${transaction.duration.toFixed(1)}ms`);\n }\n\n /**\n * Start a span within a transaction\n */\n startSpan(transactionId: string, name: string, data?: Record<string, unknown>): string {\n const transaction = this.activeTransactions.get(transactionId);\n if (!transaction) {\n this.log('Transaction not found for span:', transactionId);\n return '';\n }\n\n const span: PerformanceSpan = {\n id: `span_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,\n name,\n startTime: performance.now(),\n status: 'running',\n data,\n };\n\n transaction.spans.push(span);\n return span.id;\n }\n\n /**\n * End a span\n */\n endSpan(transactionId: string, spanId: string, status: 'ok' | 'error' = 'ok'): void {\n const transaction = this.activeTransactions.get(transactionId);\n if (!transaction) return;\n\n const span = transaction.spans.find((s) => s.id === spanId);\n if (!span) return;\n\n span.endTime = performance.now();\n span.duration = span.endTime - span.startTime;\n span.status = status;\n }\n\n /**\n * Get current Web Vitals\n */\n getVitals(): WebVitals {\n return { ...this.vitals };\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n this.flush();\n }\n\n private observeWebVitals(): void {\n if (typeof PerformanceObserver === 'undefined') return;\n\n // LCP\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const lastEntry = entries[entries.length - 1] as PerformanceEntry & { startTime: number };\n if (lastEntry) {\n this.vitals.lcp = lastEntry.startTime;\n this.reportVital('LCP', lastEntry.startTime);\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n } catch (e) { /* not supported */ }\n\n // FID\n try {\n const fidObserver = new PerformanceObserver((list) => {\n const entry = list.getEntries()[0] as PerformanceEntry & { processingStart: number; startTime: number };\n if (entry) {\n const fid = entry.processingStart - entry.startTime;\n this.vitals.fid = fid;\n this.reportVital('FID', fid);\n }\n });\n fidObserver.observe({ type: 'first-input', buffered: true });\n } catch (e) { /* not supported */ }\n\n // CLS\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const layoutShift = entry as PerformanceEntry & { hadRecentInput: boolean; value: number };\n if (!layoutShift.hadRecentInput) {\n clsValue += layoutShift.value;\n }\n }\n this.vitals.cls = clsValue;\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n\n // Report CLS on page hide\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden' && clsValue > 0) {\n this.reportVital('CLS', clsValue, 'score');\n }\n });\n }\n } catch (e) { /* not supported */ }\n\n // FCP\n try {\n const fcpObserver = new PerformanceObserver((list) => {\n const entry = list.getEntries().find(\n (e) => e.name === 'first-contentful-paint'\n );\n if (entry) {\n this.vitals.fcp = entry.startTime;\n this.reportVital('FCP', entry.startTime);\n }\n });\n fcpObserver.observe({ type: 'paint', buffered: true });\n } catch (e) { /* not supported */ }\n\n // INP\n try {\n let maxINP = 0;\n const inpObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const duration = (entry as PerformanceEntry).duration;\n if (duration > maxINP) {\n maxINP = duration;\n this.vitals.inp = maxINP;\n }\n }\n });\n inpObserver.observe({ type: 'event', buffered: true });\n } catch (e) { /* not supported */ }\n }\n\n private collectNavigationTiming(): void {\n if (typeof window === 'undefined' || !window.performance) return;\n\n // Defer until page is loaded\n const collect = () => {\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n if (!nav) return;\n\n const ttfb = nav.responseStart - nav.requestStart;\n this.vitals.ttfb = ttfb;\n this.reportVital('TTFB', ttfb);\n\n this.addMetric({\n type: 'navigation',\n name: 'page_load',\n value: nav.loadEventEnd - nav.startTime,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: window.location.href,\n data: {\n dns: nav.domainLookupEnd - nav.domainLookupStart,\n tcp: nav.connectEnd - nav.connectStart,\n ttfb,\n domContentLoaded: nav.domContentLoadedEventEnd - nav.startTime,\n domComplete: nav.domComplete - nav.startTime,\n transferSize: nav.transferSize,\n encodedBodySize: nav.encodedBodySize,\n decodedBodySize: nav.decodedBodySize,\n },\n });\n };\n\n if (document.readyState === 'complete') {\n setTimeout(collect, 0);\n } else {\n window.addEventListener('load', () => setTimeout(collect, 0));\n }\n }\n\n private reportVital(name: string, value: number, unit: 'ms' | 'score' = 'ms'): void {\n this.addMetric({\n type: 'web_vital',\n name,\n value,\n unit,\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n });\n }\n\n private addMetric(metric: PerformanceMetric): void {\n this.metrics.push(metric);\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n // Flush on page hide\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flush();\n }\n });\n }\n }\n\n async flush(): Promise<void> {\n if (this.metrics.length === 0) return;\n\n const metrics = [...this.metrics];\n this.metrics = [];\n\n const endpoint = this.config.performanceEndpoint || `${this.config.endpoint}/api/performance`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ metrics }),\n });\n\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n this.log(`Flushed ${metrics.length} performance metrics`);\n } catch (err) {\n this.metrics.unshift(...metrics);\n this.log('Failed to flush metrics:', err);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Performance]', ...args);\n }\n }\n}\n","export interface TraceContext {\n traceId: string;\n spanId: string;\n parentSpanId: string | null;\n sampled: boolean;\n}\n\nfunction randomHex(byteLength: number): string {\n try {\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const bytes = new Uint8Array(byteLength);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n } catch {\n // Fall through to Math.random fallback\n }\n\n let hex = '';\n for (let i = 0; i < byteLength; i++) {\n hex += Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n }\n return hex;\n}\n\nexport function generateTraceId(): string {\n return randomHex(16);\n}\n\nexport function generateSpanId(): string {\n return randomHex(8);\n}\n\nexport function createTraceContext(): TraceContext {\n return {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: null,\n sampled: true,\n };\n}\n\nexport function propagateTrace(context: TraceContext): Record<string, string> {\n const sampledFlag = context.sampled ? '01' : '00';\n return {\n traceparent: `00-${context.traceId}-${context.spanId}-${sampledFlag}`,\n tracestate: `sitepong=${context.spanId}`,\n };\n}\n\nexport function extractTrace(headers: Record<string, string>): TraceContext | null {\n const traceparent = headers['traceparent'] || headers['Traceparent'];\n if (!traceparent) {\n return null;\n }\n\n const parts = traceparent.split('-');\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, parentSpanId, flags] = parts;\n\n if (version !== '00') {\n return null;\n }\n\n if (traceId.length !== 32 || !/^[0-9a-f]{32}$/.test(traceId)) {\n return null;\n }\n\n if (parentSpanId.length !== 16 || !/^[0-9a-f]{16}$/.test(parentSpanId)) {\n return null;\n }\n\n if (flags.length !== 2 || !/^[0-9a-f]{2}$/.test(flags)) {\n return null;\n }\n\n const sampled = (parseInt(flags, 16) & 0x01) === 1;\n\n return {\n traceId,\n spanId: generateSpanId(),\n parentSpanId,\n sampled,\n };\n}\n\nexport class TracePropagator {\n private targets: string[];\n private originalFetch: typeof fetch | null = null;\n\n constructor(targets: string[]) {\n this.targets = targets;\n }\n\n shouldPropagate(url: string): boolean {\n return this.targets.some((pattern) => {\n if (pattern.includes('*')) {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(url);\n }\n return url.startsWith(pattern);\n });\n }\n\n injectHeaders(\n url: string,\n headers: Record<string, string>,\n context: TraceContext\n ): Record<string, string> {\n if (!this.shouldPropagate(url)) {\n return headers;\n }\n\n const traceHeaders = propagateTrace(context);\n return {\n ...headers,\n ...traceHeaders,\n };\n }\n\n start(): void {\n if (typeof window === 'undefined' || !window.fetch) {\n return;\n }\n\n if (this.originalFetch) {\n return;\n }\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const url = typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n if (self.shouldPropagate(url)) {\n const context = createTraceContext();\n const traceHeaders = propagateTrace(context);\n\n const existingHeaders: Record<string, string> = {};\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => {\n existingHeaders[key] = value;\n });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n existingHeaders[key] = value;\n }\n } else {\n Object.assign(existingHeaders, init.headers);\n }\n }\n\n const mergedHeaders = {\n ...existingHeaders,\n ...traceHeaders,\n };\n\n const patchedInit: RequestInit = {\n ...init,\n headers: mergedHeaders,\n };\n\n return self.originalFetch!.call(window, input, patchedInit);\n }\n\n return self.originalFetch!.call(window, input, init);\n };\n }\n\n stop(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n }\n}\n","/**\n * Cron Job Monitoring SDK Module\n *\n * Usage:\n * import { cronMonitor } from '@sitepong/sdk';\n *\n * // Simple check-in\n * await cronMonitor.checkin('my-job-slug');\n *\n * // With duration tracking\n * const done = cronMonitor.start('my-job-slug');\n * try { await doWork(); done.ok(); }\n * catch (e) { done.error(e.message); }\n */\n\nexport interface CronCheckinOptions {\n status?: 'ok' | 'error' | 'in_progress';\n duration_ms?: number;\n message?: string;\n environment?: string;\n}\n\nexport interface CronHandle {\n ok: (message?: string) => Promise<void>;\n error: (message?: string) => Promise<void>;\n}\n\nexport class CronMonitorManager {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n\n constructor(config: { apiKey: string; endpoint: string; debug?: boolean }) {\n this.apiKey = config.apiKey;\n this.endpoint = config.endpoint;\n this.debug = config.debug || false;\n }\n\n /**\n * Send a check-in for a cron monitor\n */\n async checkin(slug: string, options: CronCheckinOptions = {}): Promise<void> {\n try {\n const response = await fetch(`${this.endpoint}/api/sdk/crons`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify({\n slug,\n status: options.status || 'ok',\n duration_ms: options.duration_ms,\n message: options.message,\n environment: options.environment,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Check-in sent for \"${slug}\" (${options.status || 'ok'})`);\n } catch (err) {\n this.log('Failed to send check-in:', err);\n }\n }\n\n /**\n * Start tracking a cron job execution.\n * Returns a handle with ok() and error() methods to complete the check-in.\n */\n start(slug: string, environment?: string): CronHandle {\n const startTime = Date.now();\n\n // Send in_progress check-in\n this.checkin(slug, { status: 'in_progress', environment });\n\n return {\n ok: async (message?: string) => {\n const duration_ms = Date.now() - startTime;\n await this.checkin(slug, { status: 'ok', duration_ms, message, environment });\n },\n error: async (message?: string) => {\n const duration_ms = Date.now() - startTime;\n await this.checkin(slug, { status: 'error', duration_ms, message, environment });\n },\n };\n }\n\n /**\n * Wrap an async function with automatic cron monitoring.\n * Sends 'in_progress' on start, 'ok' on success, 'error' on failure.\n */\n wrap<T>(slug: string, fn: () => Promise<T>, environment?: string): Promise<T> {\n const handle = this.start(slug, environment);\n return fn().then(\n async (result) => { await handle.ok(); return result; },\n async (err) => { await handle.error(err?.message || String(err)); throw err; }\n );\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[SitePong:Cron]', ...args);\n }\n }\n}\n","/**\n * Custom Metrics SDK Module\n *\n * Usage:\n * import { metrics } from '@sitepong/sdk';\n *\n * // Counter\n * metrics.increment('api.requests', 1, { endpoint: '/users' });\n *\n * // Gauge\n * metrics.gauge('memory.usage', process.memoryUsage().heapUsed, { unit: 'bytes' });\n *\n * // Distribution (for percentile calculations)\n * metrics.distribution('api.latency', responseTime, { unit: 'ms' });\n *\n * // Histogram\n * metrics.histogram('request.size', bodySize, { unit: 'bytes' });\n */\n\nexport interface MetricOptions {\n tags?: Record<string, string>;\n unit?: string;\n timestamp?: string;\n}\n\ninterface QueuedMetric {\n name: string;\n value: number;\n type: string;\n unit?: string;\n tags?: Record<string, string>;\n timestamp: string;\n}\n\nexport class MetricsManager {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n private queue: QueuedMetric[] = [];\n private flushInterval: number;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private maxBatchSize: number;\n\n constructor(config: {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n flushInterval?: number;\n maxBatchSize?: number;\n }) {\n this.apiKey = config.apiKey;\n this.endpoint = config.endpoint;\n this.debug = config.debug || false;\n this.flushInterval = config.flushInterval || 10000;\n this.maxBatchSize = config.maxBatchSize || 100;\n this.startFlushTimer();\n }\n\n /**\n * Increment a counter metric\n */\n increment(name: string, value: number = 1, options?: MetricOptions): void {\n this.enqueue(name, value, 'counter', options);\n }\n\n /**\n * Decrement a counter metric\n */\n decrement(name: string, value: number = 1, options?: MetricOptions): void {\n this.enqueue(name, -value, 'counter', options);\n }\n\n /**\n * Set a gauge metric (instantaneous value)\n */\n gauge(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'gauge', options);\n }\n\n /**\n * Record a histogram value (for aggregation server-side)\n */\n histogram(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'histogram', options);\n }\n\n /**\n * Record a distribution value (for percentile calculations)\n */\n distribution(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'distribution', options);\n }\n\n /**\n * Time a function execution and record as distribution\n */\n async time<T>(name: string, fn: () => Promise<T>, options?: MetricOptions): Promise<T> {\n const start = Date.now();\n try {\n const result = await fn();\n this.distribution(name, Date.now() - start, { ...options, unit: options?.unit || 'ms' });\n return result;\n } catch (err) {\n this.distribution(name, Date.now() - start, {\n ...options,\n unit: options?.unit || 'ms',\n tags: { ...options?.tags, error: 'true' },\n });\n throw err;\n }\n }\n\n /**\n * Create a timer that records on stop\n */\n startTimer(name: string, options?: MetricOptions): { stop: () => void } {\n const start = Date.now();\n return {\n stop: () => {\n this.distribution(name, Date.now() - start, { ...options, unit: options?.unit || 'ms' });\n },\n };\n }\n\n /**\n * Force flush all queued metrics\n */\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n\n const metrics = [...this.queue];\n this.queue = [];\n\n try {\n const response = await fetch(`${this.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify({ metrics }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${metrics.length} metrics`);\n } catch (err) {\n // Re-queue on failure\n this.queue.unshift(...metrics);\n this.log('Failed to flush metrics:', err);\n }\n }\n\n /**\n * Stop the flush timer and flush remaining metrics\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private enqueue(name: string, value: number, type: string, options?: MetricOptions): void {\n this.queue.push({\n name,\n value,\n type,\n unit: options?.unit,\n tags: options?.tags,\n timestamp: options?.timestamp || new Date().toISOString(),\n });\n\n if (this.queue.length >= this.maxBatchSize) {\n this.flush();\n }\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.flushInterval);\n\n // Flush on page unload in browser\n if (typeof window !== 'undefined') {\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flushWithBeacon();\n }\n });\n }\n }\n\n private flushWithBeacon(): void {\n if (this.queue.length === 0 || typeof navigator?.sendBeacon !== 'function') return;\n\n const metrics = [...this.queue];\n this.queue = [];\n\n const blob = new Blob(\n [JSON.stringify({ metrics, apiKey: this.apiKey })],\n { type: 'application/json' }\n );\n\n navigator.sendBeacon(`${this.endpoint}/api/sdk/metrics`, blob);\n this.log(`Flushed ${metrics.length} metrics via beacon`);\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[SitePong:Metrics]', ...args);\n }\n }\n}\n","/**\n * Database Query Tracking SDK Module\n *\n * Usage (Node.js):\n * import { dbTracker } from '@sitepong/sdk';\n *\n * // Wrap a database query\n * const result = await dbTracker.track('SELECT * FROM users WHERE id = ?', async () => {\n * return await db.query('SELECT * FROM users WHERE id = ?', [userId]);\n * });\n *\n * // Integration with ORMs\n * dbTracker.patchKnex(knex); // Auto-tracks all Knex queries\n */\n\nexport interface DatabaseQueryEvent {\n query: string;\n duration_ms: number;\n timestamp: string;\n source?: string;\n rows_affected?: number;\n error?: string;\n is_slow?: boolean;\n}\n\nexport interface DatabaseTrackerConfig {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n slowQueryThreshold?: number; // ms, default 1000\n maxBatchSize?: number;\n flushInterval?: number;\n /** Redact query parameters for security */\n redactParams?: boolean;\n}\n\nexport class DatabaseTracker {\n private config: DatabaseTrackerConfig;\n private queue: DatabaseQueryEvent[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private queryCounter = 0;\n private nPlusOneDetector: Map<string, { count: number; since: number }> = new Map();\n\n constructor(config: DatabaseTrackerConfig) {\n this.config = {\n slowQueryThreshold: 1000,\n maxBatchSize: 50,\n flushInterval: 10000,\n redactParams: true,\n ...config,\n };\n this.startFlushTimer();\n }\n\n /**\n * Track a database query execution\n */\n async track<T>(query: string, fn: () => Promise<T>, source?: string): Promise<T> {\n const start = Date.now();\n this.queryCounter++;\n\n try {\n const result = await fn();\n const duration_ms = Date.now() - start;\n\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n is_slow: duration_ms >= (this.config.slowQueryThreshold || 1000),\n });\n\n // N+1 detection\n this.detectNPlusOne(query);\n\n return result;\n } catch (err) {\n const duration_ms = Date.now() - start;\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n /**\n * Track a synchronous database query\n */\n trackSync<T>(query: string, fn: () => T, source?: string): T {\n const start = Date.now();\n this.queryCounter++;\n\n try {\n const result = fn();\n const duration_ms = Date.now() - start;\n\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n is_slow: duration_ms >= (this.config.slowQueryThreshold || 1000),\n });\n\n return result;\n } catch (err) {\n const duration_ms = Date.now() - start;\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n /**\n * Get current query count (useful for N+1 detection in tests)\n */\n getQueryCount(): number {\n return this.queryCounter;\n }\n\n /**\n * Reset the query counter\n */\n resetQueryCount(): void {\n this.queryCounter = 0;\n this.nPlusOneDetector.clear();\n }\n\n /**\n * Get detected N+1 patterns\n */\n getNPlusOnePatterns(): Array<{ query: string; count: number }> {\n const patterns: Array<{ query: string; count: number }> = [];\n for (const [query, { count }] of this.nPlusOneDetector.entries()) {\n if (count >= 5) {\n patterns.push({ query, count });\n }\n }\n return patterns;\n }\n\n /**\n * Force flush queued query events\n */\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n\n const queries = [...this.queue];\n this.queue = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n metrics: queries.map((q) => ({\n name: 'db.query',\n value: q.duration_ms,\n type: 'distribution',\n unit: 'ms',\n tags: {\n query: q.query.substring(0, 200),\n source: q.source || 'unknown',\n is_slow: String(q.is_slow || false),\n ...(q.error ? { error: 'true' } : {}),\n },\n timestamp: q.timestamp,\n })),\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${queries.length} query events`);\n } catch (err) {\n this.queue.unshift(...queries);\n this.log('Failed to flush query events:', err);\n }\n }\n\n /**\n * Destroy the tracker and flush remaining events\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private recordQuery(event: DatabaseQueryEvent): void {\n this.queue.push(event);\n\n if (this.queue.length >= (this.config.maxBatchSize || 50)) {\n this.flush();\n }\n\n if (event.is_slow) {\n this.log(`Slow query (${event.duration_ms}ms):`, event.query.substring(0, 100));\n }\n }\n\n private detectNPlusOne(query: string): void {\n // Normalize query for pattern matching\n const pattern = this.normalizeQuery(query);\n const now = Date.now();\n\n const existing = this.nPlusOneDetector.get(pattern);\n if (existing) {\n // If same pattern repeated within 1 second\n if (now - existing.since < 1000) {\n existing.count++;\n if (existing.count === 5) {\n this.log(`N+1 query detected! Pattern repeated ${existing.count} times:`, pattern.substring(0, 100));\n }\n } else {\n // Reset window\n this.nPlusOneDetector.set(pattern, { count: 1, since: now });\n }\n } else {\n this.nPlusOneDetector.set(pattern, { count: 1, since: now });\n }\n\n // Cleanup old patterns\n if (this.nPlusOneDetector.size > 100) {\n const entries = [...this.nPlusOneDetector.entries()];\n entries.sort((a, b) => a[1].since - b[1].since);\n for (let i = 0; i < 50; i++) {\n this.nPlusOneDetector.delete(entries[i][0]);\n }\n }\n }\n\n private normalizeQuery(query: string): string {\n return query\n .replace(/\\s+/g, ' ')\n .replace(/'[^']*'/g, '?')\n .replace(/\\b\\d+\\b/g, '?')\n .trim()\n .substring(0, 300);\n }\n\n private redactQuery(query: string): string {\n return query\n .replace(/'[^']*'/g, \"'***'\")\n .replace(/\\b\\d{4,}\\b/g, '***');\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval || 10000);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong:DB]', ...args);\n }\n }\n}\n","/**\n * Production Profiling SDK Module\n *\n * Usage:\n * import { profiler } from '@sitepong/sdk';\n *\n * // Profile a function\n * const result = await profiler.profile('processOrder', async () => {\n * return await processOrder(orderId);\n * });\n *\n * // Get flame graph data\n * const profile = profiler.getProfile();\n */\n\nexport interface ProfileFrame {\n name: string;\n duration_ms: number;\n start_ms: number;\n children: ProfileFrame[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProfileData {\n id: string;\n name: string;\n startTime: number;\n duration_ms: number;\n frames: ProfileFrame[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProfilerConfig {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n /** Sample rate for profiling (0-1, default 0.1 = 10%) */\n sampleRate?: number;\n /** Maximum profile duration in ms (default 30000) */\n maxDuration?: number;\n /** Flush interval for sending profiles (default 30000) */\n flushInterval?: number;\n}\n\nexport class Profiler {\n private config: ProfilerConfig;\n private profiles: ProfileData[] = [];\n private activeProfile: ProfileData | null = null;\n private frameStack: ProfileFrame[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: ProfilerConfig) {\n this.config = {\n sampleRate: 0.1,\n maxDuration: 30000,\n flushInterval: 30000,\n ...config,\n };\n this.startFlushTimer();\n }\n\n /**\n * Profile an async function execution\n */\n async profile<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T> {\n // Sample rate check\n if (Math.random() > (this.config.sampleRate || 0.1)) {\n return fn();\n }\n\n const profileId = this.generateId();\n const startTime = performance.now();\n\n this.activeProfile = {\n id: profileId,\n name,\n startTime,\n duration_ms: 0,\n frames: [],\n metadata,\n };\n this.frameStack = [];\n\n const rootFrame: ProfileFrame = {\n name,\n start_ms: 0,\n duration_ms: 0,\n children: [],\n metadata,\n };\n this.frameStack.push(rootFrame);\n\n try {\n const result = await fn();\n\n rootFrame.duration_ms = performance.now() - startTime;\n this.activeProfile.duration_ms = rootFrame.duration_ms;\n this.activeProfile.frames = [rootFrame];\n\n // Only record if under max duration\n if (rootFrame.duration_ms <= (this.config.maxDuration || 30000)) {\n this.profiles.push(this.activeProfile);\n }\n\n this.activeProfile = null;\n this.frameStack = [];\n\n return result;\n } catch (err) {\n rootFrame.duration_ms = performance.now() - startTime;\n rootFrame.metadata = { ...rootFrame.metadata, error: true };\n if (this.activeProfile) {\n this.activeProfile.duration_ms = rootFrame.duration_ms;\n this.activeProfile.frames = [rootFrame];\n this.profiles.push(this.activeProfile);\n }\n this.activeProfile = null;\n this.frameStack = [];\n throw err;\n }\n }\n\n /**\n * Start a profiling span within an active profile\n */\n startSpan(name: string, metadata?: Record<string, unknown>): () => void {\n if (!this.activeProfile) return () => {};\n\n const startMs = performance.now() - this.activeProfile.startTime;\n const frame: ProfileFrame = {\n name,\n start_ms: startMs,\n duration_ms: 0,\n children: [],\n metadata,\n };\n\n // Add as child of current frame\n const parent = this.frameStack[this.frameStack.length - 1];\n if (parent) {\n parent.children.push(frame);\n }\n this.frameStack.push(frame);\n\n return () => {\n frame.duration_ms = (performance.now() - this.activeProfile!.startTime) - frame.start_ms;\n this.frameStack.pop();\n };\n }\n\n /**\n * Get all collected profiles\n */\n getProfiles(): ProfileData[] {\n return [...this.profiles];\n }\n\n /**\n * Get the latest profile\n */\n getLatestProfile(): ProfileData | null {\n return this.profiles.length > 0 ? this.profiles[this.profiles.length - 1] : null;\n }\n\n /**\n * Flush profiles to the server\n */\n async flush(): Promise<void> {\n if (this.profiles.length === 0) return;\n\n const profiles = [...this.profiles];\n this.profiles = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n metrics: profiles.map((p) => ({\n name: `profile.${p.name}`,\n value: p.duration_ms,\n type: 'distribution',\n unit: 'ms',\n tags: {\n profile_id: p.id,\n frame_count: String(countFrames(p.frames)),\n ...(p.metadata as Record<string, string> || {}),\n },\n timestamp: new Date(Date.now() - p.duration_ms).toISOString(),\n })),\n }),\n });\n\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n this.log(`Flushed ${profiles.length} profiles`);\n } catch (err) {\n this.profiles.unshift(...profiles);\n this.log('Failed to flush profiles:', err);\n }\n }\n\n /**\n * Destroy the profiler\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval || 30000);\n }\n\n private generateId(): string {\n return `prof_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 8)}`;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong:Profiler]', ...args);\n }\n }\n}\n\nfunction countFrames(frames: ProfileFrame[]): number {\n let count = frames.length;\n for (const frame of frames) {\n count += countFrames(frame.children);\n }\n return count;\n}\n","export interface SitePongConfig {\n apiKey: string;\n endpoint?: string;\n environment?: string;\n release?: string;\n autoCapture?: boolean;\n maxBatchSize?: number;\n flushInterval?: number;\n debug?: boolean;\n}\n\nexport interface ErrorContext {\n user?: {\n id?: string;\n email?: string;\n [key: string]: unknown;\n };\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n}\n\nexport interface CapturedError {\n message: string;\n stack?: string;\n type: string;\n timestamp: string;\n url?: string;\n userAgent?: string;\n environment?: string;\n release?: string;\n context?: ErrorContext;\n fingerprint?: string;\n /** Replay session ID if session recording is active */\n replaySessionId?: string;\n}\n\nimport { FlagManager } from './flags';\nimport { AnalyticsManager } from './analytics';\nimport type { TrackProperties, UserTraits, GroupTraits } from './analytics';\nimport { FingerprintManager } from './fingerprint';\nimport type { VisitorIdResult, DeviceSignals } from './fingerprint';\nimport { ReplayManager } from './replay';\nimport { PerformanceManager } from './performance';\nimport type { WebVitals } from './performance';\nimport { CronMonitorManager } from './crons';\nimport type { CronCheckinOptions, CronHandle } from './crons';\nimport { MetricsManager } from './metrics';\nimport type { MetricOptions } from './metrics';\nimport { DatabaseTracker } from './database';\nimport { Profiler } from './profiling';\nimport type { ProfileData } from './profiling';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL = 5000;\n\nexport interface SitePongInitConfig extends SitePongConfig {\n /** Enable feature flags (default: false) */\n enableFlags?: boolean;\n /** Custom endpoint for flags API (default: uses main endpoint) */\n flagsEndpoint?: string;\n /** Analytics configuration */\n analytics?: {\n enabled?: boolean;\n autocapturePageviews?: boolean;\n autocaptureClicks?: boolean;\n autocaptureForms?: boolean;\n /** Full autocapture configuration (overrides individual autocapture flags) */\n autocapture?: {\n clicks?: boolean;\n forms?: boolean;\n pageviews?: boolean;\n blockSelectors?: string[];\n allowSelectors?: string[];\n } | boolean;\n maxBatchSize?: number;\n flushInterval?: number;\n eventsEndpoint?: string;\n };\n /** Fingerprint / device intelligence configuration */\n fingerprint?: {\n enabled?: boolean;\n extendedSignals?: boolean;\n visitorEndpoint?: string;\n };\n /** Performance monitoring configuration */\n performance?: {\n enabled?: boolean;\n webVitals?: boolean;\n navigationTiming?: boolean;\n resourceTiming?: boolean;\n sampleRate?: number;\n flushInterval?: number;\n performanceEndpoint?: string;\n };\n /** Session replay configuration */\n replay?: {\n enabled?: boolean;\n maskInputs?: boolean;\n blockSelector?: string;\n maskSelector?: string;\n sampleRate?: number;\n maxSessionDuration?: number;\n flushInterval?: number;\n replayEndpoint?: string;\n /** Record network requests (XHR/fetch) in the replay timeline */\n recordNetwork?: boolean;\n /** Include request/response headers in network recording */\n captureNetworkHeaders?: boolean;\n /** Record console logs in the replay timeline */\n recordConsole?: boolean;\n /** Which console levels to record (default: all) */\n consoleLevels?: Array<'log' | 'info' | 'warn' | 'error' | 'debug'>;\n };\n /** Cron monitoring configuration */\n crons?: {\n enabled?: boolean;\n };\n /** Custom metrics configuration */\n metrics?: {\n enabled?: boolean;\n flushInterval?: number;\n maxBatchSize?: number;\n };\n /** Database query tracking configuration */\n database?: {\n enabled?: boolean;\n slowQueryThreshold?: number;\n redactParams?: boolean;\n };\n /** Production profiling configuration */\n profiling?: {\n enabled?: boolean;\n sampleRate?: number;\n maxDuration?: number;\n flushInterval?: number;\n };\n}\n\nclass SitePongClient {\n private config: Required<Omit<SitePongConfig, 'apiKey'>> & { apiKey: string };\n private errorQueue: CapturedError[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private context: ErrorContext = {};\n private initialized = false;\n private flagManager: FlagManager | null = null;\n private analyticsManager: AnalyticsManager | null = null;\n private fingerprintManager: FingerprintManager | null = null;\n private replayManager: ReplayManager | null = null;\n private performanceManager: PerformanceManager | null = null;\n private cronManager: CronMonitorManager | null = null;\n private metricsManager: MetricsManager | null = null;\n private databaseTracker: DatabaseTracker | null = null;\n private profiler: Profiler | null = null;\n\n constructor() {\n this.config = {\n apiKey: '',\n endpoint: DEFAULT_ENDPOINT,\n environment: 'production',\n release: '',\n autoCapture: true,\n maxBatchSize: DEFAULT_BATCH_SIZE,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n debug: false,\n };\n }\n\n init(config: SitePongInitConfig): void {\n if (!config.apiKey) {\n console.error('[SitePong] API key is required');\n return;\n }\n\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.initialized = true;\n\n if (this.config.autoCapture) {\n this.setupAutoCapture();\n }\n\n this.startFlushTimer();\n this.log('Initialized with endpoint:', this.config.endpoint);\n\n // Initialize flags if enabled\n if (config.enableFlags) {\n this.flagManager = new FlagManager({\n apiKey: config.apiKey,\n endpoint: config.flagsEndpoint || config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n // Start flag initialization (non-blocking)\n this.flagManager.init().catch((err) => {\n this.log('Failed to initialize flags:', err);\n });\n }\n\n // Initialize analytics if enabled\n if (config.analytics?.enabled) {\n if (this.analyticsManager) {\n this.analyticsManager.destroy();\n }\n this.analyticsManager = new AnalyticsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n autocapturePageviews: config.analytics.autocapturePageviews,\n autocaptureClicks: config.analytics.autocaptureClicks,\n autocaptureForms: config.analytics.autocaptureForms,\n autocapture: config.analytics.autocapture,\n maxBatchSize: config.analytics.maxBatchSize,\n flushInterval: config.analytics.flushInterval,\n eventsEndpoint: config.analytics.eventsEndpoint,\n debug: config.debug,\n });\n this.analyticsManager.init();\n }\n\n // Initialize fingerprint if enabled\n if (config.fingerprint?.enabled) {\n this.fingerprintManager = new FingerprintManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n extendedSignals: config.fingerprint.extendedSignals,\n visitorEndpoint: config.fingerprint.visitorEndpoint,\n debug: config.debug,\n });\n }\n\n // Initialize performance monitoring if enabled\n if (config.performance?.enabled) {\n if (this.performanceManager) {\n this.performanceManager.destroy();\n }\n this.performanceManager = new PerformanceManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n webVitals: config.performance.webVitals,\n navigationTiming: config.performance.navigationTiming,\n resourceTiming: config.performance.resourceTiming,\n sampleRate: config.performance.sampleRate,\n flushInterval: config.performance.flushInterval,\n performanceEndpoint: config.performance.performanceEndpoint,\n debug: config.debug,\n });\n this.performanceManager.init();\n }\n\n // Initialize session replay if enabled\n if (config.replay?.enabled) {\n // Stop previous replay manager if re-initialized (e.g. React Strict Mode)\n if (this.replayManager) {\n this.replayManager.stop();\n }\n this.replayManager = new ReplayManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n maskInputs: config.replay.maskInputs,\n blockSelector: config.replay.blockSelector,\n maskSelector: config.replay.maskSelector,\n sampleRate: config.replay.sampleRate,\n maxSessionDuration: config.replay.maxSessionDuration,\n flushInterval: config.replay.flushInterval,\n replayEndpoint: config.replay.replayEndpoint,\n recordNetwork: config.replay.recordNetwork,\n captureNetworkHeaders: config.replay.captureNetworkHeaders,\n recordConsole: config.replay.recordConsole,\n consoleLevels: config.replay.consoleLevels,\n debug: config.debug,\n });\n // Auto-start recording\n this.replayManager.start();\n }\n\n // Initialize cron monitoring if enabled\n if (config.crons?.enabled) {\n this.cronManager = new CronMonitorManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n }\n\n // Initialize database query tracking if enabled\n if (config.database?.enabled) {\n this.databaseTracker = new DatabaseTracker({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n slowQueryThreshold: config.database.slowQueryThreshold,\n redactParams: config.database.redactParams,\n });\n }\n\n // Initialize custom metrics if enabled\n if (config.metrics?.enabled) {\n this.metricsManager = new MetricsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n flushInterval: config.metrics.flushInterval,\n maxBatchSize: config.metrics.maxBatchSize,\n });\n }\n\n // Initialize profiling if enabled\n if (config.profiling?.enabled) {\n this.profiler = new Profiler({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n sampleRate: config.profiling.sampleRate,\n maxDuration: config.profiling.maxDuration,\n flushInterval: config.profiling.flushInterval,\n });\n }\n }\n\n /**\n * Get a feature flag value\n * Returns the cached evaluated result or default value\n */\n getFlag(key: string, defaultValue = false): boolean {\n if (!this.flagManager) {\n this.log('Flags not enabled. Set enableFlags: true in init()');\n return defaultValue;\n }\n return this.flagManager.getFlag(key, defaultValue);\n }\n\n /**\n * Get all feature flag values\n */\n getAllFlags(): Record<string, boolean> {\n if (!this.flagManager) {\n return {};\n }\n return this.flagManager.getAllFlags();\n }\n\n /**\n * Wait for flags to be initialized\n */\n async waitForFlags(): Promise<void> {\n if (!this.flagManager) {\n return;\n }\n await this.flagManager.waitForInit();\n }\n\n /**\n * Check if flags are ready\n */\n areFlagsReady(): boolean {\n return this.flagManager?.isInitialized() ?? false;\n }\n\n /**\n * Get a multivariate flag variant\n * Returns the assigned variant key or the default value\n */\n getVariant(key: string, defaultValue: string | null = null): string | null {\n if (!this.flagManager) {\n this.log('Flags not enabled. Set enableFlags: true in init()');\n return defaultValue;\n }\n return this.flagManager.getVariant(key, defaultValue);\n }\n\n /**\n * Get the payload for a multivariate flag's assigned variant\n */\n getVariantPayload<T = unknown>(key: string, defaultValue: T | null = null): T | null {\n if (!this.flagManager) {\n return defaultValue;\n }\n return this.flagManager.getVariantPayload<T>(key, defaultValue);\n }\n\n /**\n * Force refresh flags from the server\n */\n async refreshFlags(): Promise<void> {\n if (!this.flagManager) {\n return;\n }\n await this.flagManager.refresh();\n }\n\n // --- Analytics (Tier 4) ---\n\n track(eventName: string, properties?: TrackProperties): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.track(eventName, properties);\n }\n\n trackPageView(url?: string, properties?: TrackProperties): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.trackPageView(url, properties);\n }\n\n identify(userId: string, traits?: UserTraits): void {\n if (this.replayManager) {\n this.replayManager.setUser({ id: userId });\n }\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.identify(userId, traits);\n }\n\n group(groupId: string, traits?: GroupTraits): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.group(groupId, traits);\n }\n\n resetAnalytics(): void {\n if (!this.analyticsManager) {\n return;\n }\n this.analyticsManager.reset();\n }\n\n // --- Fingerprint (Tier 5) ---\n\n async getVisitorId(): Promise<VisitorIdResult> {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getVisitorId();\n }\n\n async getDeviceSignals(): Promise<DeviceSignals> {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getDeviceSignals();\n }\n\n async getFraudCheck() {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getFraudCheck();\n }\n\n // --- Session Replay (Tier 6) ---\n\n startReplay(): boolean {\n if (!this.replayManager) {\n this.log('Replay not enabled. Set replay.enabled: true in init()');\n return false;\n }\n return this.replayManager.start();\n }\n\n stopReplay(): void {\n if (!this.replayManager) return;\n this.replayManager.stop();\n }\n\n isReplayRecording(): boolean {\n return this.replayManager?.isRecording() ?? false;\n }\n\n getReplaySessionId(): string | null {\n return this.replayManager?.getSessionId() ?? null;\n }\n\n // --- Performance (Tier 7) ---\n\n startTransaction(name: string, data?: Record<string, unknown>): string {\n if (!this.performanceManager) {\n this.log('Performance not enabled. Set performance.enabled: true in init()');\n return '';\n }\n return this.performanceManager.startTransaction(name, data);\n }\n\n endTransaction(id: string, status: 'ok' | 'error' = 'ok'): void {\n if (!this.performanceManager) return;\n this.performanceManager.endTransaction(id, status);\n }\n\n startSpan(transactionId: string, name: string, data?: Record<string, unknown>): string {\n if (!this.performanceManager) return '';\n return this.performanceManager.startSpan(transactionId, name, data);\n }\n\n endSpan(transactionId: string, spanId: string, status: 'ok' | 'error' = 'ok'): void {\n if (!this.performanceManager) return;\n this.performanceManager.endSpan(transactionId, spanId, status);\n }\n\n getWebVitals(): WebVitals {\n if (!this.performanceManager) return {};\n return this.performanceManager.getVitals();\n }\n\n // --- Cron Monitor methods ---\n\n cronCheckin(slug: string, options?: CronCheckinOptions): Promise<void> {\n if (!this.cronManager) {\n this.log('Cron monitoring not enabled. Set crons.enabled: true in init()');\n return Promise.resolve();\n }\n return this.cronManager.checkin(slug, options);\n }\n\n cronStart(slug: string, environment?: string): CronHandle {\n if (!this.cronManager) {\n this.log('Cron monitoring not enabled. Set crons.enabled: true in init()');\n return { ok: () => Promise.resolve(), error: () => Promise.resolve() };\n }\n return this.cronManager.start(slug, environment);\n }\n\n cronWrap<T>(slug: string, fn: () => Promise<T>, environment?: string): Promise<T> {\n if (!this.cronManager) {\n return fn();\n }\n return this.cronManager.wrap(slug, fn, environment);\n }\n\n // --- Custom Metrics methods ---\n\n metricIncrement(name: string, value?: number, options?: MetricOptions): void {\n if (!this.metricsManager) {\n this.log('Metrics not enabled. Set metrics.enabled: true in init()');\n return;\n }\n this.metricsManager.increment(name, value, options);\n }\n\n metricGauge(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.gauge(name, value, options);\n }\n\n metricHistogram(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.histogram(name, value, options);\n }\n\n metricDistribution(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.distribution(name, value, options);\n }\n\n async metricTime<T>(name: string, fn: () => Promise<T>, options?: MetricOptions): Promise<T> {\n if (!this.metricsManager) return fn();\n return this.metricsManager.time(name, fn, options);\n }\n\n metricStartTimer(name: string, options?: MetricOptions): { stop: () => void } {\n if (!this.metricsManager) return { stop: () => {} };\n return this.metricsManager.startTimer(name, options);\n }\n\n async flushMetrics(): Promise<void> {\n if (!this.metricsManager) return;\n return this.metricsManager.flush();\n }\n\n // --- Database Query Tracking methods ---\n\n async dbTrack<T>(query: string, fn: () => Promise<T>, source?: string): Promise<T> {\n if (!this.databaseTracker) return fn();\n return this.databaseTracker.track(query, fn, source);\n }\n\n dbTrackSync<T>(query: string, fn: () => T, source?: string): T {\n if (!this.databaseTracker) return fn();\n return this.databaseTracker.trackSync(query, fn, source);\n }\n\n getDbQueryCount(): number {\n if (!this.databaseTracker) return 0;\n return this.databaseTracker.getQueryCount();\n }\n\n resetDbQueryCount(): void {\n if (this.databaseTracker) this.databaseTracker.resetQueryCount();\n }\n\n getDbNPlusOnePatterns(): Array<{ query: string; count: number }> {\n if (!this.databaseTracker) return [];\n return this.databaseTracker.getNPlusOnePatterns();\n }\n\n // --- Profiling methods ---\n\n async profile<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T> {\n if (!this.profiler) return fn();\n return this.profiler.profile(name, fn, metadata);\n }\n\n startProfileSpan(name: string, metadata?: Record<string, unknown>): () => void {\n if (!this.profiler) return () => {};\n return this.profiler.startSpan(name, metadata);\n }\n\n getProfiles(): ProfileData[] {\n if (!this.profiler) return [];\n return this.profiler.getProfiles();\n }\n\n getLatestProfile(): ProfileData | null {\n if (!this.profiler) return null;\n return this.profiler.getLatestProfile();\n }\n\n async flushProfiles(): Promise<void> {\n if (!this.profiler) return;\n return this.profiler.flush();\n }\n\n setContext(context: ErrorContext): void {\n this.context = { ...this.context, ...context };\n }\n\n setUser(user: ErrorContext['user']): void {\n this.context.user = user;\n if (this.replayManager) {\n this.replayManager.setUser(user ? { id: user.id } : null);\n }\n }\n\n setTags(tags: Record<string, string>): void {\n this.context.tags = { ...this.context.tags, ...tags };\n }\n\n captureError(error: Error | string, additionalContext?: ErrorContext): void {\n if (!this.initialized) {\n console.warn('[SitePong] SDK not initialized. Call init() first.');\n return;\n }\n\n const capturedError = this.formatError(error, additionalContext);\n this.errorQueue.push(capturedError);\n this.log('Captured error:', capturedError.message);\n\n if (this.errorQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n captureMessage(message: string, level: 'info' | 'warning' | 'error' = 'info', additionalContext?: ErrorContext): void {\n if (!this.initialized) {\n console.warn('[SitePong] SDK not initialized. Call init() first.');\n return;\n }\n\n const capturedError: CapturedError = {\n message,\n type: level,\n timestamp: new Date().toISOString(),\n url: this.getUrl(),\n userAgent: this.getUserAgent(),\n environment: this.config.environment,\n release: this.config.release,\n context: { ...this.context, ...additionalContext },\n replaySessionId: this.replayManager?.isRecording() ? this.replayManager.getSessionId() || undefined : undefined,\n };\n\n this.errorQueue.push(capturedError);\n this.log('Captured message:', message);\n\n if (this.errorQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.errorQueue.length === 0) {\n return;\n }\n\n const errors = [...this.errorQueue];\n this.errorQueue = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/errors/batch`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ errors }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${errors.length} errors`);\n } catch (err) {\n // Re-queue errors on failure\n this.errorQueue.unshift(...errors);\n this.log('Failed to flush errors:', err);\n }\n }\n\n private formatError(error: Error | string, additionalContext?: ErrorContext): CapturedError {\n const isError = error instanceof Error;\n const message = isError ? error.message : String(error);\n const stack = isError ? error.stack : new Error(message).stack;\n const type = isError ? error.name : 'Error';\n\n return {\n message,\n stack,\n type,\n timestamp: new Date().toISOString(),\n url: this.getUrl(),\n userAgent: this.getUserAgent(),\n environment: this.config.environment,\n release: this.config.release,\n context: { ...this.context, ...additionalContext },\n fingerprint: this.generateFingerprint(message, stack),\n replaySessionId: this.replayManager?.isRecording() ? this.replayManager.getSessionId() || undefined : undefined,\n };\n }\n\n private generateFingerprint(message: string, stack?: string): string {\n const input = stack\n ? stack.split('\\n').slice(0, 3).join('\\n')\n : message;\n \n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n }\n\n private setupAutoCapture(): void {\n if (typeof window !== 'undefined') {\n // Browser environment\n window.addEventListener('error', (event) => {\n this.captureError(event.error || event.message);\n });\n\n window.addEventListener('unhandledrejection', (event) => {\n const error = event.reason instanceof Error\n ? event.reason\n : new Error(String(event.reason));\n this.captureError(error);\n });\n\n this.log('Auto-capture enabled for browser');\n } else if (typeof process !== 'undefined') {\n // Node.js environment\n process.on('uncaughtException', (error) => {\n this.captureError(error);\n this.flush().finally(() => process.exit(1));\n });\n\n process.on('unhandledRejection', (reason) => {\n const error = reason instanceof Error\n ? reason\n : new Error(String(reason));\n this.captureError(error);\n });\n\n this.log('Auto-capture enabled for Node.js');\n }\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n // Flush on page unload in browser\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush();\n });\n\n // Use sendBeacon for more reliable delivery on unload\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flushWithBeacon();\n }\n });\n }\n }\n\n private flushWithBeacon(): void {\n if (this.errorQueue.length === 0 || typeof navigator?.sendBeacon !== 'function') {\n return;\n }\n\n const errors = [...this.errorQueue];\n this.errorQueue = [];\n\n const blob = new Blob([JSON.stringify({ errors, apiKey: this.config.apiKey })], {\n type: 'application/json',\n });\n\n navigator.sendBeacon(`${this.config.endpoint}/api/errors/batch`, blob);\n this.log(`Flushed ${errors.length} errors via beacon`);\n }\n\n private getUrl(): string | undefined {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return undefined;\n }\n\n private getUserAgent(): string | undefined {\n if (typeof navigator !== 'undefined') {\n return navigator.userAgent;\n }\n return undefined;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong]', ...args);\n }\n }\n}\n\n// Singleton instance\nconst sitepong = new SitePongClient();\n\n// Named exports\nexport const init = sitepong.init.bind(sitepong);\nexport const captureError = sitepong.captureError.bind(sitepong);\nexport const captureMessage = sitepong.captureMessage.bind(sitepong);\nexport const setContext = sitepong.setContext.bind(sitepong);\nexport const setUser = sitepong.setUser.bind(sitepong);\nexport const setTags = sitepong.setTags.bind(sitepong);\nexport const flush = sitepong.flush.bind(sitepong);\n\n// Feature flags exports\nexport const getFlag = sitepong.getFlag.bind(sitepong);\nexport const getAllFlags = sitepong.getAllFlags.bind(sitepong);\nexport const getVariant = sitepong.getVariant.bind(sitepong);\nexport const getVariantPayload = sitepong.getVariantPayload.bind(sitepong);\nexport const waitForFlags = sitepong.waitForFlags.bind(sitepong);\nexport const areFlagsReady = sitepong.areFlagsReady.bind(sitepong);\nexport const refreshFlags = sitepong.refreshFlags.bind(sitepong);\n\n// Analytics exports (Tier 4)\nexport const track = sitepong.track.bind(sitepong);\nexport const trackPageView = sitepong.trackPageView.bind(sitepong);\nexport const identify = sitepong.identify.bind(sitepong);\nexport const group = sitepong.group.bind(sitepong);\nexport const resetAnalytics = sitepong.resetAnalytics.bind(sitepong);\n\n// Fingerprint exports (Tier 5)\nexport const getVisitorId = sitepong.getVisitorId.bind(sitepong);\nexport const getDeviceSignals = sitepong.getDeviceSignals.bind(sitepong);\nexport const getFraudCheck = sitepong.getFraudCheck.bind(sitepong);\n\n// Session Replay exports (Tier 6)\nexport const startReplay = sitepong.startReplay.bind(sitepong);\nexport const stopReplay = sitepong.stopReplay.bind(sitepong);\nexport const isReplayRecording = sitepong.isReplayRecording.bind(sitepong);\nexport const getReplaySessionId = sitepong.getReplaySessionId.bind(sitepong);\n\n// Performance exports (Tier 7)\nexport const startTransaction = sitepong.startTransaction.bind(sitepong);\nexport const endTransaction = sitepong.endTransaction.bind(sitepong);\nexport const startSpan = sitepong.startSpan.bind(sitepong);\nexport const endSpan = sitepong.endSpan.bind(sitepong);\nexport const getWebVitals = sitepong.getWebVitals.bind(sitepong);\n\n// Database query tracking exports\nexport const dbTrack = sitepong.dbTrack.bind(sitepong);\nexport const dbTrackSync = sitepong.dbTrackSync.bind(sitepong);\nexport const getDbQueryCount = sitepong.getDbQueryCount.bind(sitepong);\nexport const resetDbQueryCount = sitepong.resetDbQueryCount.bind(sitepong);\nexport const getDbNPlusOnePatterns = sitepong.getDbNPlusOnePatterns.bind(sitepong);\n\n// Cron monitoring exports\nexport const cronCheckin = sitepong.cronCheckin.bind(sitepong);\nexport const cronStart = sitepong.cronStart.bind(sitepong);\nexport const cronWrap = sitepong.cronWrap.bind(sitepong);\n\n// Custom metrics exports\nexport const metricIncrement = sitepong.metricIncrement.bind(sitepong);\nexport const metricGauge = sitepong.metricGauge.bind(sitepong);\nexport const metricHistogram = sitepong.metricHistogram.bind(sitepong);\nexport const metricDistribution = sitepong.metricDistribution.bind(sitepong);\nexport const metricTime = sitepong.metricTime.bind(sitepong);\nexport const metricStartTimer = sitepong.metricStartTimer.bind(sitepong);\nexport const flushMetrics = sitepong.flushMetrics.bind(sitepong);\n\n// Profiling exports\nexport const profile = sitepong.profile.bind(sitepong);\nexport const startProfileSpan = sitepong.startProfileSpan.bind(sitepong);\nexport const getProfiles = sitepong.getProfiles.bind(sitepong);\nexport const getLatestProfile = sitepong.getLatestProfile.bind(sitepong);\nexport const flushProfiles = sitepong.flushProfiles.bind(sitepong);\n\n// Re-export flag utilities for advanced use cases\nexport { getAnonymousId, clearAnonymousId, setAnonymousId } from './flags';\n\n// Re-export types for advanced use cases\nexport type { TrackProperties, UserTraits, GroupTraits } from './analytics';\nexport type { VisitorIdResult, DeviceSignals, FraudCheckResult } from './fingerprint';\nexport type { ReplayConfig, ReplayEvent } from './replay';\nexport type { PerformanceConfig, WebVitals, PerformanceTransaction, PerformanceSpan } from './performance';\nexport type { CronCheckinOptions, CronHandle } from './crons';\nexport type { MetricOptions } from './metrics';\nexport type { DatabaseQueryEvent, DatabaseTrackerConfig } from './database';\nexport type { ProfileData, ProfileFrame, ProfilerConfig } from './profiling';\n\n// Distributed tracing exports\nexport {\n TracePropagator,\n createTraceContext,\n propagateTrace,\n extractTrace,\n generateTraceId,\n generateSpanId,\n} from './performance';\nexport type { TraceContext } from './performance';\n\n// Default export\nexport default sitepong;\n","import { useCallback, useContext, useState, useEffect, useRef } from \"react\";\nimport { SitePongContext } from \"./provider\";\nimport {\n captureException,\n captureMessage,\n setUser,\n clearUser,\n setTag,\n setTags,\n setContext,\n addBreadcrumb,\n client,\n} from \"../core/client\";\nimport type { CaptureContext, LogLevel, User } from \"../core/types\";\nimport {\n track as trackFn,\n trackPageView as trackPageViewFn,\n identify as identifyFn,\n group as groupFn,\n getVisitorId as getVisitorIdFn,\n getFraudCheck as getFraudCheckFn,\n getFlag as getFlagFn,\n getAllFlags as getAllFlagsFn,\n areFlagsReady as areFlagsReadyFn,\n startTransaction as startTransactionFn,\n endTransaction as endTransactionFn,\n getWebVitals as getWebVitalsFn,\n startReplay as startReplayFn,\n stopReplay as stopReplayFn,\n isReplayRecording as isReplayRecordingFn,\n} from \"../index\";\nimport type { TrackProperties, UserTraits, GroupTraits } from \"../analytics\";\nimport type { VisitorIdResult, FraudCheckResult } from \"../fingerprint\";\nimport type { WebVitals } from \"../performance\";\n\n/**\n * Hook to access all SitePong SDK methods\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const sitepong = useSitePong();\n *\n * useEffect(() => {\n * sitepong.setUser({ id: 'user-123' });\n * }, []);\n *\n * const handleError = () => {\n * sitepong.captureMessage('Something happened', 'warning');\n * };\n * }\n * ```\n */\nexport function useSitePong() {\n const context = useContext(SitePongContext);\n\n return {\n isInitialized: context.isInitialized,\n captureException,\n captureMessage,\n setUser,\n clearUser,\n setTag,\n setTags,\n setContext,\n addBreadcrumb,\n getConfig: () => client.getConfig(),\n };\n}\n\n/**\n * Hook to capture errors with a stable callback\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const capture = useErrorCapture();\n *\n * const handleClick = async () => {\n * try {\n * await riskyOperation();\n * } catch (error) {\n * capture(error, { tags: { action: 'click' } });\n * }\n * };\n * }\n * ```\n */\nexport function useErrorCapture() {\n return useCallback(\n (error: Error | unknown, context?: CaptureContext): string | null => {\n return captureException(error, context);\n },\n []\n );\n}\n\n/**\n * Hook to capture exceptions (alias for useErrorCapture)\n */\nexport function useCaptureException() {\n return useCallback(\n (error: Error | unknown, context?: CaptureContext): string | null => {\n return captureException(error, context);\n },\n []\n );\n}\n\n/**\n * Hook to capture messages\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const capture = useCaptureMessage();\n *\n * useEffect(() => {\n * capture('Component mounted', 'info');\n * }, []);\n * }\n * ```\n */\nexport function useCaptureMessage() {\n return useCallback(\n (\n message: string,\n level?: LogLevel,\n context?: CaptureContext\n ): string | null => {\n return captureMessage(message, level, context);\n },\n []\n );\n}\n\n/**\n * Hook to set the current user\n *\n * @example\n * ```tsx\n * function useAuth() {\n * const setUser = useSetUser();\n *\n * const login = (user) => {\n * setUser({\n * id: user.id,\n * email: user.email,\n * username: user.name,\n * });\n * };\n * }\n * ```\n */\nexport function useSetUser() {\n return useCallback((user: User | null) => {\n if (user) {\n setUser(user);\n } else {\n clearUser();\n }\n }, []);\n}\n\n/**\n * Hook to add breadcrumbs\n *\n * @example\n * ```tsx\n * function NavigationTracker() {\n * const addBreadcrumb = useAddBreadcrumb();\n *\n * useEffect(() => {\n * addBreadcrumb({\n * type: 'navigation',\n * category: 'route',\n * message: 'Navigated to /dashboard',\n * });\n * }, []);\n * }\n * ```\n */\nexport function useAddBreadcrumb() {\n return useCallback(\n (breadcrumb: Parameters<typeof addBreadcrumb>[0]) => {\n addBreadcrumb(breadcrumb);\n },\n []\n );\n}\n\n// --- Analytics Hooks (Tier 4) ---\n\n/**\n * Hook to track custom events with a stable callback\n */\nexport function useTrack() {\n return useCallback(\n (eventName: string, properties?: TrackProperties): void => {\n trackFn(eventName, properties);\n },\n []\n );\n}\n\n/**\n * Hook to track page views with a stable callback\n */\nexport function useTrackPageView() {\n return useCallback(\n (url?: string, properties?: TrackProperties): void => {\n trackPageViewFn(url, properties);\n },\n []\n );\n}\n\n/**\n * Hook to identify users with a stable callback\n */\nexport function useIdentify() {\n return useCallback(\n (userId: string, traits?: UserTraits): void => {\n identifyFn(userId, traits);\n },\n []\n );\n}\n\n/**\n * Hook to associate users with groups with a stable callback\n */\nexport function useGroup() {\n return useCallback(\n (groupId: string, traits?: GroupTraits): void => {\n groupFn(groupId, traits);\n },\n []\n );\n}\n\n// --- Fingerprint Hooks (Tier 5) ---\n\n/**\n * Hook to get the visitor ID with loading/error state\n */\nexport function useVisitorId() {\n const [visitorId, setVisitorId] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const fetch = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result: VisitorIdResult = await getVisitorIdFn();\n if (mountedRef.current) {\n setVisitorId(result.visitorId);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => {\n mountedRef.current = false;\n };\n }, [fetch]);\n\n return { visitorId, loading, error, refetch: fetch };\n}\n\n/**\n * Hook to perform a fraud check with loading/error state\n */\nexport function useFraudCheck() {\n const [result, setResult] = useState<FraudCheckResult | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const fetch = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await getFraudCheckFn();\n if (mountedRef.current) {\n setResult(data);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => {\n mountedRef.current = false;\n };\n }, [fetch]);\n\n return {\n visitorId: result?.visitorId ?? null,\n riskScore: result?.riskScore ?? null,\n signals: result?.signals ?? null,\n loading,\n error,\n refetch: fetch,\n };\n}\n\n// --- Feature Flags Hooks (Tier 8) ---\n\n/**\n * Hook to get a feature flag value with reactive updates\n */\nexport function useFeatureFlag(key: string, defaultValue = false): boolean {\n const [value, setValue] = useState(() => {\n if (areFlagsReadyFn()) {\n return getFlagFn(key, defaultValue);\n }\n return defaultValue;\n });\n\n useEffect(() => {\n // Re-evaluate when flags become ready\n const check = () => {\n if (areFlagsReadyFn()) {\n setValue(getFlagFn(key, defaultValue));\n }\n };\n\n check();\n // Poll for flag readiness (flags load async)\n const interval = setInterval(check, 500);\n return () => clearInterval(interval);\n }, [key, defaultValue]);\n\n return value;\n}\n\n/**\n * Hook to get a feature flag payload (the flag value and metadata)\n */\nexport function useFeatureFlagPayload(key: string): {\n enabled: boolean;\n loading: boolean;\n} {\n const [enabled, setEnabled] = useState(false);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const check = () => {\n if (areFlagsReadyFn()) {\n setEnabled(getFlagFn(key, false));\n setLoading(false);\n return true;\n }\n return false;\n };\n\n if (check()) return;\n\n const interval = setInterval(() => {\n if (check()) clearInterval(interval);\n }, 200);\n\n // Timeout after 5s\n const timeout = setTimeout(() => {\n clearInterval(interval);\n setLoading(false);\n }, 5000);\n\n return () => {\n clearInterval(interval);\n clearTimeout(timeout);\n };\n }, [key]);\n\n return { enabled, loading };\n}\n\n/**\n * Hook for A/B experiments based on feature flags\n * Returns the experiment variant (true/false) and loading state\n */\nexport function useExperiment(experimentKey: string): {\n variant: 'control' | 'test';\n loading: boolean;\n} {\n const { enabled, loading } = useFeatureFlagPayload(experimentKey);\n\n return {\n variant: enabled ? 'test' : 'control',\n loading,\n };\n}\n\n/**\n * Hook to get all feature flags\n */\nexport function useAllFlags(): Record<string, boolean> {\n const [flags, setFlags] = useState<Record<string, boolean>>({});\n\n useEffect(() => {\n const check = () => {\n if (areFlagsReadyFn()) {\n setFlags(getAllFlagsFn());\n return true;\n }\n return false;\n };\n\n if (check()) return;\n\n const interval = setInterval(() => {\n if (check()) clearInterval(interval);\n }, 500);\n\n return () => clearInterval(interval);\n }, []);\n\n return flags;\n}\n\n// --- Performance Hooks (Tier 7) ---\n\n/**\n * Hook to track component render performance as a transaction\n */\nexport function usePerformanceTransaction(name: string) {\n const transactionRef = useRef<string | null>(null);\n\n const start = useCallback(() => {\n transactionRef.current = startTransactionFn(name);\n return transactionRef.current;\n }, [name]);\n\n const end = useCallback((status: 'ok' | 'error' = 'ok') => {\n if (transactionRef.current) {\n endTransactionFn(transactionRef.current, status);\n transactionRef.current = null;\n }\n }, []);\n\n return { start, end, transactionId: transactionRef.current };\n}\n\n/**\n * Hook to get current Web Vitals\n */\nexport function useWebVitals(): WebVitals {\n const [vitals, setVitals] = useState<WebVitals>({});\n\n useEffect(() => {\n // Poll for vitals (they come in asynchronously)\n const interval = setInterval(() => {\n const current = getWebVitalsFn();\n if (Object.keys(current).length > 0) {\n setVitals(current);\n }\n }, 2000);\n\n return () => clearInterval(interval);\n }, []);\n\n return vitals;\n}\n\n// --- Session Replay Hooks (Tier 6) ---\n\n/**\n * Hook to control session replay recording\n */\nexport function useReplay() {\n const [recording, setRecording] = useState(isReplayRecordingFn());\n\n const start = useCallback(() => {\n const started = startReplayFn();\n setRecording(started);\n return started;\n }, []);\n\n const stop = useCallback(() => {\n stopReplayFn();\n setRecording(false);\n }, []);\n\n return { recording, start, stop };\n}\n"]}
|