@keverdjs/fraud-sdk-angular 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +29 -7
- package/dist/index.d.ts +29 -7
- package/dist/index.js +420 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +420 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../fraud-sdk/src/collectors/device.ts","../../fraud-sdk/src/collectors/kinematic-engine.ts","../../fraud-sdk/src/collectors/keystroke-monitor.ts","../../fraud-sdk/src/collectors/behavioral.ts","../../fraud-sdk/src/collectors/canvas-fingerprint.ts","../../fraud-sdk/src/collectors/webgl-fingerprint.ts","../../fraud-sdk/src/collectors/audio-fingerprint.ts","../../fraud-sdk/src/collectors/font-detection.ts","../../fraud-sdk/src/collectors/media-devices.ts","../../fraud-sdk/src/collectors/screen-display.ts","../../fraud-sdk/src/collectors/timezone-locale.ts","../../fraud-sdk/src/collectors/plugin-mime.ts","../../fraud-sdk/src/collectors/battery-api.ts","../../fraud-sdk/src/collectors/storage-database.ts","../../fraud-sdk/src/collectors/cpu-memory.ts","../../fraud-sdk/src/collectors/touch-pointer.ts","../../fraud-sdk/src/collectors/permissions-api.ts","../../fraud-sdk/src/collectors/webrtc-ip.ts","../../fraud-sdk/src/collectors/visitor-id-generator.ts","../../fraud-sdk/src/collectors/fingerprint-manager.ts","../../fraud-sdk/src/collectors/privacy-signals.ts","../../fraud-sdk/src/collectors/browser-capabilities.ts","../../fraud-sdk/src/collectors/hardware-signals.ts","../../fraud-sdk/src/collectors/form-interactions.ts","../../fraud-sdk/src/collectors/page-interactions.ts","../../fraud-sdk/src/core/sdk.ts","../src/services/keverd.service.ts","../src/keverd.module.ts"],"names":["vendor","combined","window","KeverdService","throwError","from","map","catchError","Injectable","Optional","KeverdModule","NgModule","CommonModule"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Device Fingerprint Collector\n * Collects device information and generates SHA-256 fingerprint\n * Matches React SDK implementation for consistency\n */\n\nimport { DeviceInfo } from '../types';\n\nexport class DeviceCollector {\n private cachedDeviceInfo: DeviceInfo | null = null;\n\n /**\n * Collect all device information and generate fingerprint\n */\n collect(): DeviceInfo {\n if (this.cachedDeviceInfo) {\n return this.cachedDeviceInfo;\n }\n\n const fingerprint = this.generateDeviceFingerprint();\n const deviceId = this.generateDeviceId(fingerprint);\n\n this.cachedDeviceInfo = {\n deviceId,\n fingerprint,\n manufacturer: this.getManufacturer(),\n model: this.getModel(),\n brand: this.getBrand(),\n device: this.getDevice(),\n product: this.getProduct(),\n hardware: this.getHardware(),\n sdkVersion: '1.0.0',\n osVersion: this.getOSVersion(),\n screenWidth: String(screen.width),\n screenHeight: String(screen.height),\n screenDensity: this.getScreenDensity(),\n locale: navigator.language || navigator.languages?.[0] || 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n\n return this.cachedDeviceInfo;\n }\n\n /**\n * Generate a stable device fingerprint using multiple browser characteristics\n * Returns SHA-256 hash (64 hex characters) as required by backend\n */\n private generateDeviceFingerprint(): string {\n const components: string[] = [];\n\n // Canvas fingerprint\n const canvasFingerprint = this.getCanvasFingerprint();\n if (canvasFingerprint) components.push(canvasFingerprint);\n\n // WebGL fingerprint\n const webglFingerprint = this.getWebGLFingerprint();\n if (webglFingerprint) components.push(webglFingerprint);\n\n // User agent\n components.push(navigator.userAgent);\n\n // Language\n components.push(navigator.language || navigator.languages?.[0] || '');\n\n // Screen properties\n components.push(`${screen.width}x${screen.height}x${screen.colorDepth}`);\n\n // Timezone offset\n components.push(String(new Date().getTimezoneOffset()));\n\n // Platform\n components.push(navigator.platform);\n\n // Hardware concurrency\n components.push(String(navigator.hardwareConcurrency || 0));\n\n // Device memory (if available)\n if ('deviceMemory' in navigator) {\n components.push(String((navigator as any).deviceMemory));\n }\n\n // Max touch points\n if ('maxTouchPoints' in navigator) {\n components.push(String((navigator as any).maxTouchPoints));\n }\n\n // Plugins (limited for privacy)\n if (navigator.plugins && navigator.plugins.length > 0) {\n const pluginNames = Array.from(navigator.plugins)\n .slice(0, 3)\n .map(p => p.name)\n .join(',');\n components.push(pluginNames);\n }\n\n // Combine and hash with SHA-256-like algorithm\n const combined = components.join('|');\n return this.hashString(combined);\n }\n\n /**\n * Generate canvas fingerprint\n */\n private getCanvasFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) return '';\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(125, 1, 62, 20);\n ctx.fillStyle = '#069';\n ctx.fillText('KeverdFingerprint', 2, 15);\n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';\n ctx.fillText('KeverdFingerprint', 4, 17);\n\n return this.hashString(canvas.toDataURL());\n } catch (error) {\n return '';\n }\n }\n\n /**\n * Generate WebGL fingerprint\n */\n private getWebGLFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || \n canvas.getContext('experimental-webgl') as WebGLRenderingContext | null;\n \n if (!gl) return '';\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n return this.hashString(`${vendor}|${renderer}`);\n }\n\n const version = gl.getParameter(gl.VERSION);\n const vendor = gl.getParameter(gl.VENDOR);\n return this.hashString(`${version}|${vendor}`);\n } catch (error) {\n return '';\n }\n }\n\n /**\n * Generate a stable device ID from fingerprint\n */\n private generateDeviceId(fingerprint: string): string {\n // Use fingerprint as device ID (already a hash)\n return fingerprint.substring(0, 32);\n }\n\n /**\n * Get manufacturer from user agent\n */\n private getManufacturer(): string | undefined {\n const ua = navigator.userAgent.toLowerCase();\n if (ua.includes('iphone') || ua.includes('ipad')) return 'Apple';\n if (ua.includes('android')) {\n const match = ua.match(/(?:^|\\s)([a-z]+)(?:\\s|$)/);\n return match ? match[1].charAt(0).toUpperCase() + match[1].slice(1) : undefined;\n }\n return undefined;\n }\n\n /**\n * Get model from user agent\n */\n private getModel(): string | undefined {\n const ua = navigator.userAgent;\n const match = ua.match(/(iPhone|iPad|Android)[\\s\\/]+([\\w]+)/i);\n return match ? match[2] : undefined;\n }\n\n /**\n * Get brand from user agent\n */\n private getBrand(): string | undefined {\n return this.getManufacturer();\n }\n\n /**\n * Get device type\n */\n private getDevice(): string | undefined {\n const ua = navigator.userAgent.toLowerCase();\n if (ua.includes('mobile')) return 'mobile';\n if (ua.includes('tablet')) return 'tablet';\n return 'desktop';\n }\n\n /**\n * Get product name\n */\n private getProduct(): string | undefined {\n const ua = navigator.userAgent;\n const match = ua.match(/(iPhone|iPad|Android|Windows|Mac|Linux)/i);\n return match ? match[1] : undefined;\n }\n\n /**\n * Get hardware info\n */\n private getHardware(): string | undefined {\n const ua = navigator.userAgent;\n const match = ua.match(/\\(([^)]+)\\)/);\n return match ? match[1] : undefined;\n }\n\n /**\n * Get OS version\n */\n private getOSVersion(): string | undefined {\n const ua = navigator.userAgent;\n const patterns = [\n /OS\\s+([\\d_]+)/i, // iOS\n /Android\\s+([\\d.]+)/i, // Android\n /Windows\\s+([\\d.]+)/i, // Windows\n /Mac\\s+OS\\s+X\\s+([\\d_]+)/i, // macOS\n /Linux/i, // Linux\n ];\n\n for (const pattern of patterns) {\n const match = ua.match(pattern);\n if (match) {\n return match[1]?.replace(/_/g, '.') || match[0];\n }\n }\n\n return undefined;\n }\n\n /**\n * Get screen density\n */\n private getScreenDensity(): string | undefined {\n if (window.devicePixelRatio) {\n return String(window.devicePixelRatio);\n }\n return undefined;\n }\n\n /**\n * Hash a string using SHA-256-like algorithm (64 hex characters)\n * Backend expects SHA-256 format (64 hex chars)\n */\n private hashString(str: string): string {\n return this.sha256LikeHash(str);\n }\n\n /**\n * SHA-256-like hash function (synchronous, deterministic)\n * Produces 64-character hex string matching SHA-256 format\n */\n private sha256LikeHash(str: string): string {\n // Create multiple hash passes for better distribution\n const hashes: number[] = [];\n \n // Pass 1: Standard djb2\n let h1 = 5381;\n for (let i = 0; i < str.length; i++) {\n h1 = ((h1 << 5) + h1) + str.charCodeAt(i);\n h1 = h1 & 0xFFFFFFFF;\n }\n hashes.push(h1);\n \n // Pass 2: Reverse string\n let h2 = 0;\n for (let i = str.length - 1; i >= 0; i--) {\n h2 = ((h2 << 7) - h2) + str.charCodeAt(i);\n h2 = h2 & 0xFFFFFFFF;\n }\n hashes.push(h2);\n \n // Pass 3: XOR with position\n let h3 = 0;\n for (let i = 0; i < str.length; i++) {\n h3 = h3 ^ (str.charCodeAt(i) << ((i % 4) * 8));\n h3 = h3 & 0xFFFFFFFF;\n }\n hashes.push(h3);\n \n // Pass 4: Multiplicative hash\n let h4 = 0;\n for (let i = 0; i < str.length; i++) {\n h4 = (h4 * 31 + str.charCodeAt(i)) & 0xFFFFFFFF;\n }\n hashes.push(h4);\n \n // Pass 5: Rotating hash\n let h5 = 0;\n for (let i = 0; i < str.length; i++) {\n const rotated = ((str.charCodeAt(i) << (i % 16)) | (str.charCodeAt(i) >>> (32 - (i % 16)))) & 0xFFFFFFFF;\n h5 = (h5 + rotated) & 0xFFFFFFFF;\n }\n hashes.push(h5);\n \n // Pass 6: FNV-1a variant\n let h6 = 2166136261;\n for (let i = 0; i < str.length; i++) {\n h6 = (h6 ^ str.charCodeAt(i)) * 16777619;\n h6 = h6 & 0xFFFFFFFF;\n }\n hashes.push(h6);\n \n // Pass 7: Position-weighted hash\n let h7 = 0;\n for (let i = 0; i < str.length; i++) {\n h7 = (h7 + str.charCodeAt(i) * (i + 1)) & 0xFFFFFFFF;\n }\n hashes.push(h7);\n \n // Pass 8: Combined character codes\n let h8 = 0;\n for (let i = 0; i < str.length; i += 2) {\n const combined = str.charCodeAt(i) + (str.charCodeAt(i + 1) || 0) * 256;\n h8 = ((h8 << 3) - h8) + combined;\n h8 = h8 & 0xFFFFFFFF;\n }\n hashes.push(h8);\n \n // Convert all hashes to hex and combine into 64-char string\n const hexParts = hashes.map(h => Math.abs(h).toString(16).padStart(8, '0'));\n const combined = hexParts.join('');\n \n // Ensure exactly 64 characters (SHA-256 format)\n return combined.substring(0, 64).padEnd(64, '0');\n }\n\n /**\n * Clear cached device info (useful for testing)\n */\n clearCache(): void {\n this.cachedDeviceInfo = null;\n }\n}\n\n","import { KinematicFeatureVector } from '../types';\n\nconst VELOCITY_SPIKE_THRESHOLD = 2.5; // px/ms threshold for suspicious swipes\nconst WINDOW_LIMIT = 200; // cap internal buffer to avoid unbounded growth\n\ntype PointerPoint = {\n x: number;\n y: number;\n timestamp: number;\n type: 'move' | 'down' | 'up';\n};\n\nexport type KinematicEngineEvent = 'mousemove' | 'mousedown' | 'mouseup';\n\ninterface KinematicEngineOptions {\n onEvent?: (event: KinematicEngineEvent) => void;\n maskValue?: number;\n}\n\nexport class KinematicEngine {\n private featureVectors: KinematicFeatureVector[] = [];\n private pointerQueue: PointerPoint[] = [];\n private lastVelocity = 0;\n private lastAcceleration = 0;\n private lastAngle = 0;\n private lastPoint: PointerPoint | null = null;\n private secondLastPoint: PointerPoint | null = null;\n private rafId: number | null = null;\n private maxSwipeVelocity = 0;\n private onEvent?: (event: KinematicEngineEvent) => void;\n private maskValue: number;\n private isActive = false;\n // Enhanced tracking\n private clickCount = 0;\n private rightClickCount = 0;\n private doubleClickCount = 0;\n private totalMouseDistance = 0;\n private lastClickTime = 0;\n private scrollDistance = 0;\n private lastScrollTop = 0;\n private touchEventCount = 0;\n\n private mouseMoveHandler = (event: MouseEvent) => this.enqueuePoint(event, 'move');\n private mouseDownHandler = (event: MouseEvent) => {\n this.enqueuePoint(event, 'down');\n this.handleClick(event);\n };\n private mouseUpHandler = (event: MouseEvent) => this.enqueuePoint(event, 'up');\n private contextMenuHandler = (event: MouseEvent) => this.handleRightClick(event);\n private scrollHandler = () => this.handleScroll();\n private touchStartHandler = () => this.handleTouch();\n private touchMoveHandler = () => this.handleTouch();\n private touchEndHandler = () => this.handleTouch();\n\n constructor(options: KinematicEngineOptions = {}) {\n this.onEvent = options.onEvent;\n this.maskValue = options.maskValue ?? -1;\n }\n\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n document.addEventListener('mousemove', this.mouseMoveHandler, { passive: true });\n document.addEventListener('mousedown', this.mouseDownHandler, { passive: true });\n document.addEventListener('mouseup', this.mouseUpHandler, { passive: true });\n document.addEventListener('contextmenu', this.contextMenuHandler, { passive: true });\n window.addEventListener('scroll', this.scrollHandler, { passive: true });\n document.addEventListener('touchstart', this.touchStartHandler, { passive: true });\n document.addEventListener('touchmove', this.touchMoveHandler, { passive: true });\n document.addEventListener('touchend', this.touchEndHandler, { passive: true });\n this.lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\n this.isActive = true;\n }\n\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n document.removeEventListener('mousemove', this.mouseMoveHandler);\n document.removeEventListener('mousedown', this.mouseDownHandler);\n document.removeEventListener('mouseup', this.mouseUpHandler);\n document.removeEventListener('contextmenu', this.contextMenuHandler);\n window.removeEventListener('scroll', this.scrollHandler);\n document.removeEventListener('touchstart', this.touchStartHandler);\n document.removeEventListener('touchmove', this.touchMoveHandler);\n document.removeEventListener('touchend', this.touchEndHandler);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.isActive = false;\n }\n\n getVectors(): KinematicFeatureVector[] {\n return this.featureVectors;\n }\n\n getSuspiciousSwipeVelocity(): number {\n return this.maxSwipeVelocity;\n }\n\n /**\n * Get enhanced mouse/touch signals\n */\n getMouseSignals(): {\n totalDistance: number;\n averageVelocity: number;\n clickCount: number;\n rightClickCount: number;\n doubleClickCount: number;\n scrollDistance: number;\n scrollDirection: 'up' | 'down' | 'both';\n touchEvents: number;\n } {\n const averageVelocity = this.featureVectors.length > 0\n ? this.featureVectors.reduce((sum, v) => sum + v.velocity, 0) / this.featureVectors.length\n : 0;\n\n const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollDiff = Math.abs(currentScrollTop - this.lastScrollTop);\n const scrollDirection: 'up' | 'down' | 'both' = currentScrollTop > this.lastScrollTop ? 'down' : 'up';\n\n return {\n totalDistance: this.totalMouseDistance,\n averageVelocity,\n clickCount: this.clickCount,\n rightClickCount: this.rightClickCount,\n doubleClickCount: this.doubleClickCount,\n scrollDistance: this.scrollDistance + scrollDiff,\n scrollDirection,\n touchEvents: this.touchEventCount,\n };\n }\n\n reset(): void {\n this.featureVectors = [];\n this.pointerQueue = [];\n this.lastVelocity = 0;\n this.lastAcceleration = 0;\n this.lastAngle = 0;\n this.lastPoint = null;\n this.secondLastPoint = null;\n this.maxSwipeVelocity = 0;\n this.clickCount = 0;\n this.rightClickCount = 0;\n this.doubleClickCount = 0;\n this.totalMouseDistance = 0;\n this.lastClickTime = 0;\n this.scrollDistance = 0;\n this.lastScrollTop = 0;\n this.touchEventCount = 0;\n }\n\n private enqueuePoint(event: MouseEvent, type: PointerPoint['type']): void {\n const point: PointerPoint = {\n x: event.clientX,\n y: event.clientY,\n timestamp: performance.now(),\n type,\n };\n this.pointerQueue.push(point);\n if (this.pointerQueue.length > WINDOW_LIMIT) {\n this.pointerQueue.shift();\n }\n if (this.onEvent) {\n this.onEvent(type === 'move' ? 'mousemove' : type === 'down' ? 'mousedown' : 'mouseup');\n }\n this.scheduleProcess();\n }\n\n private scheduleProcess(): void {\n if (this.rafId !== null) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.processQueue();\n if (this.pointerQueue.length > 0) {\n this.scheduleProcess();\n }\n });\n }\n\n private processQueue(): void {\n while (this.pointerQueue.length > 0) {\n const point = this.pointerQueue.shift()!;\n this.computeFeatures(point);\n this.secondLastPoint = this.lastPoint;\n this.lastPoint = point;\n }\n }\n\n private computeFeatures(point: PointerPoint): void {\n if (!this.lastPoint) {\n this.lastPoint = point;\n this.lastAngle = 0;\n return;\n }\n\n const dt = point.timestamp - this.lastPoint.timestamp;\n if (dt <= 0) {\n return;\n }\n\n const dx = point.x - this.lastPoint.x;\n const dy = point.y - this.lastPoint.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n this.totalMouseDistance += distance; // Track total mouse movement distance\n const velocity = distance / dt;\n const acceleration = (velocity - this.lastVelocity) / dt;\n const jerk = (acceleration - this.lastAcceleration) / dt;\n\n const angle = Math.atan2(dy, dx);\n const angularVelocity = this.normalizeAngle(angle - this.lastAngle) / dt;\n\n const curvature = this.calculateCurvature(point);\n\n this.featureVectors.push({\n timestamp: point.timestamp,\n velocity,\n acceleration,\n jerk,\n curvature,\n angularVelocity,\n });\n\n this.maxSwipeVelocity = Math.max(this.maxSwipeVelocity, velocity);\n\n if (velocity > VELOCITY_SPIKE_THRESHOLD) {\n // Mark suspicious spike as a strong signal\n this.featureVectors.push({\n timestamp: point.timestamp,\n velocity,\n acceleration,\n jerk,\n curvature,\n angularVelocity: angularVelocity * 1.2,\n });\n }\n\n if (this.featureVectors.length > WINDOW_LIMIT) {\n this.featureVectors.splice(0, this.featureVectors.length - WINDOW_LIMIT);\n }\n\n this.lastVelocity = velocity;\n this.lastAcceleration = acceleration;\n this.lastAngle = angle;\n }\n\n private calculateCurvature(point: PointerPoint): number {\n if (!this.lastPoint || !this.secondLastPoint) return 0;\n const p0 = this.secondLastPoint;\n const p1 = this.lastPoint;\n const p2 = point;\n\n const chordLength = Math.hypot(p2.x - p0.x, p2.y - p0.y);\n const pathLength =\n Math.hypot(p1.x - p0.x, p1.y - p0.y) +\n Math.hypot(p2.x - p1.x, p2.y - p1.y);\n\n if (chordLength === 0) return 0;\n return (pathLength - chordLength) / chordLength;\n }\n\n private normalizeAngle(angleDiff: number): number {\n while (angleDiff > Math.PI) angleDiff -= 2 * Math.PI;\n while (angleDiff < -Math.PI) angleDiff += 2 * Math.PI;\n return angleDiff;\n }\n\n private handleClick(_event: MouseEvent): void {\n const now = performance.now();\n // Detect double click (within 500ms)\n if (now - this.lastClickTime < 500) {\n this.doubleClickCount++;\n } else {\n this.clickCount++;\n }\n this.lastClickTime = now;\n }\n\n private handleRightClick(_event: MouseEvent): void {\n this.rightClickCount++;\n }\n\n private handleScroll(): void {\n const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollDiff = Math.abs(currentScrollTop - this.lastScrollTop);\n this.scrollDistance += scrollDiff;\n this.lastScrollTop = currentScrollTop;\n }\n\n private handleTouch(): void {\n this.touchEventCount++;\n }\n}\n","import { KeystrokeFeatureVector } from '../types';\n\nconst MAX_BUFFER = 200;\n\ntype KeystrokeMonitorEvent = 'keydown' | 'keyup';\n\ninterface KeystrokeMonitorOptions {\n onEvent?: (event: KeystrokeMonitorEvent) => void;\n}\n\nexport class KeystrokeMonitor {\n private keyDownTimes = new Map<string, number>();\n private lastKeyUpTime: number | null = null;\n private lastKeyDownTime: number | null = null;\n private featureVectors: KeystrokeFeatureVector[] = [];\n private dwellTimes: number[] = [];\n private flightTimes: number[] = [];\n private digraphLatencies: number[] = [];\n private isActive = false;\n private onEvent?: (event: KeystrokeMonitorEvent) => void;\n // Enhanced tracking\n private keydownCount = 0;\n private keyupCount = 0;\n private specialKeyCount = 0;\n private lastKeystrokeTime: number | null = null;\n private pauseCount = 0;\n private PAUSE_THRESHOLD = 2000; // 2 seconds\n private keystrokeTimestamps: number[] = [];\n\n private keyDownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n private keyUpHandler = (event: KeyboardEvent) => this.handleKeyUp(event);\n\n constructor(options: KeystrokeMonitorOptions = {}) {\n this.onEvent = options.onEvent;\n }\n\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n document.addEventListener('keydown', this.keyDownHandler, { passive: true, capture: true });\n document.addEventListener('keyup', this.keyUpHandler, { passive: true, capture: true });\n this.isActive = true;\n }\n\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n document.removeEventListener('keydown', this.keyDownHandler, true);\n document.removeEventListener('keyup', this.keyUpHandler, true);\n this.isActive = false;\n }\n\n getVectors(): KeystrokeFeatureVector[] {\n return this.featureVectors;\n }\n\n getDwellTimes(limit = 50): number[] {\n return this.dwellTimes.slice(-limit);\n }\n\n getFlightTimes(limit = 50): number[] {\n return this.flightTimes.slice(-limit);\n }\n\n /**\n * Get enhanced keyboard signals\n */\n getKeyboardSignals(): {\n keydownCount: number;\n keyupCount: number;\n specialKeyCount: number;\n typingSpeed: number; // Characters per minute\n pauseCount: number;\n backspaceRatio: number;\n } {\n // Calculate typing speed (characters per minute)\n let typingSpeed = 0;\n if (this.keystrokeTimestamps.length > 1) {\n const timeSpan = this.keystrokeTimestamps[this.keystrokeTimestamps.length - 1] - this.keystrokeTimestamps[0];\n const minutes = timeSpan / 60000;\n if (minutes > 0) {\n typingSpeed = this.keystrokeTimestamps.length / minutes;\n }\n }\n\n // Calculate backspace ratio\n const totalKeystrokes = this.keydownCount;\n const backspaceRatio = totalKeystrokes > 0 ? this.getBackspaceCount() / totalKeystrokes : 0;\n\n return {\n keydownCount: this.keydownCount,\n keyupCount: this.keyupCount,\n specialKeyCount: this.specialKeyCount,\n typingSpeed,\n pauseCount: this.pauseCount,\n backspaceRatio,\n };\n }\n\n private getBackspaceCount(): number {\n // Count backspace keys from feature vectors or track separately\n // For now, estimate from backspace ratio in form interactions\n return 0; // Will be enhanced with form interaction collector\n }\n\n reset(): void {\n this.keyDownTimes.clear();\n this.lastKeyUpTime = null;\n this.lastKeyDownTime = null;\n this.featureVectors = [];\n this.dwellTimes = [];\n this.flightTimes = [];\n this.digraphLatencies = [];\n this.keydownCount = 0;\n this.keyupCount = 0;\n this.specialKeyCount = 0;\n this.lastKeystrokeTime = null;\n this.pauseCount = 0;\n this.keystrokeTimestamps = [];\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (!this.isTargetField(event)) return;\n const now = performance.now();\n\n this.keydownCount++;\n this.keystrokeTimestamps.push(now);\n\n // Track special keys (Ctrl, Alt, Shift, Meta)\n if (event.ctrlKey || event.altKey || event.shiftKey || event.metaKey) {\n this.specialKeyCount++;\n }\n\n // Detect pauses (> 2 seconds between keystrokes)\n if (this.lastKeystrokeTime !== null && now - this.lastKeystrokeTime > this.PAUSE_THRESHOLD) {\n this.pauseCount++;\n }\n this.lastKeystrokeTime = now;\n\n if (this.lastKeyUpTime !== null) {\n const flight = now - this.lastKeyUpTime;\n this.flightTimes.push(flight);\n this.appendVector({ dwellTime: -1, flightTime: flight, digraphLatency: -1, timestamp: now });\n }\n\n if (this.lastKeyDownTime !== null) {\n const digraphLatency = now - this.lastKeyDownTime;\n this.digraphLatencies.push(digraphLatency);\n this.appendVector({ dwellTime: -1, flightTime: -1, digraphLatency, timestamp: now });\n }\n\n this.lastKeyDownTime = now;\n this.keyDownTimes.set(event.code, now);\n if (this.onEvent) this.onEvent('keydown');\n }\n\n private handleKeyUp(event: KeyboardEvent): void {\n if (!this.isTargetField(event)) return;\n const now = performance.now();\n this.keyupCount++;\n \n const start = this.keyDownTimes.get(event.code);\n if (start !== undefined) {\n const dwell = now - start;\n this.dwellTimes.push(dwell);\n this.appendVector({ dwellTime: dwell, flightTime: -1, digraphLatency: -1, timestamp: now });\n this.keyDownTimes.delete(event.code);\n }\n this.lastKeyUpTime = now;\n if (this.onEvent) this.onEvent('keyup');\n }\n\n private appendVector(vector: KeystrokeFeatureVector): void {\n this.featureVectors.push(vector);\n if (this.featureVectors.length > MAX_BUFFER) {\n this.featureVectors.splice(0, this.featureVectors.length - MAX_BUFFER);\n }\n }\n\n private isTargetField(event: KeyboardEvent): boolean {\n const target = event.target as HTMLElement | null;\n if (!target) return false;\n const isEditable = target.isContentEditable || ['INPUT', 'TEXTAREA'].includes(target.tagName);\n return isEditable;\n }\n}\n\n","import { BehavioralData, BehavioralSequence } from '../types';\nimport { KinematicEngine } from './kinematic-engine';\nimport { KeystrokeMonitor } from './keystroke-monitor';\n\nconst WINDOW_SIZE = 50;\nconst MASK_VALUE = -1;\nconst FEATURE_NAMES = [\n 'velocity',\n 'acceleration',\n 'jerk',\n 'curvature',\n 'angularVelocity',\n 'dwell',\n 'flight',\n 'digraphLatency',\n] as const;\n\ntype BehavioralEvent = 'mousemove' | 'mousedown' | 'mouseup' | 'keydown' | 'keyup';\n\nexport class BehavioralCollector {\n private isActive = false;\n private sessionEvents: Array<{ type: BehavioralEvent; timestamp: number }> = [];\n private kinematicEngine: KinematicEngine;\n private keystrokeMonitor: KeystrokeMonitor;\n\n constructor() {\n this.kinematicEngine = new KinematicEngine({ onEvent: this.trackEvent });\n this.keystrokeMonitor = new KeystrokeMonitor({ onEvent: this.trackEvent });\n }\n\n start(): void {\n if (this.isActive) return;\n this.kinematicEngine.start();\n this.keystrokeMonitor.start();\n this.isActive = true;\n }\n\n stop(): void {\n if (!this.isActive) return;\n this.kinematicEngine.stop();\n this.keystrokeMonitor.stop();\n this.isActive = false;\n }\n\n reset(): void {\n this.sessionEvents = [];\n this.kinematicEngine.reset();\n this.keystrokeMonitor.reset();\n }\n\n getData(): BehavioralData {\n const kinematicVectors = this.kinematicEngine.getVectors();\n const keystrokeVectors = this.keystrokeMonitor.getVectors();\n\n const merged = [\n ...kinematicVectors.map(v => ({\n timestamp: v.timestamp,\n values: [\n v.velocity,\n v.acceleration,\n v.jerk,\n v.curvature,\n v.angularVelocity,\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n ],\n })),\n ...keystrokeVectors.map(v => ({\n timestamp: v.timestamp,\n values: [\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n v.dwellTime,\n v.flightTime,\n v.digraphLatency,\n ],\n })),\n ].sort((a, b) => a.timestamp - b.timestamp);\n\n const sequence = this.buildSequence(merged);\n const suspiciousSwipeVelocity = this.kinematicEngine.getSuspiciousSwipeVelocity();\n const entropy = this.calculateSessionEntropy();\n\n const dwellTimes = this.keystrokeMonitor.getDwellTimes();\n const flightTimes = this.keystrokeMonitor.getFlightTimes();\n\n return {\n typing_dwell_ms: dwellTimes,\n typing_flight_ms: flightTimes,\n swipe_velocity: suspiciousSwipeVelocity,\n suspicious_swipe_velocity: suspiciousSwipeVelocity,\n session_entropy: entropy,\n behavioral_vectors: sequence,\n };\n }\n\n private buildSequence(\n vectors: Array<{ timestamp: number; values: number[] }>\n ): BehavioralSequence {\n const padded: number[][] = [];\n const startIndex = Math.max(0, vectors.length - WINDOW_SIZE);\n const window = vectors.slice(startIndex);\n\n for (const vector of window) {\n padded.push(vector.values);\n }\n\n while (padded.length < WINDOW_SIZE) {\n padded.unshift(new Array(FEATURE_NAMES.length).fill(MASK_VALUE));\n }\n\n return {\n featureNames: [...FEATURE_NAMES],\n windowSize: WINDOW_SIZE,\n maskValue: MASK_VALUE,\n sequence: padded,\n };\n }\n\n private trackEvent = (event: BehavioralEvent) => {\n this.sessionEvents.push({ type: event, timestamp: performance.now() });\n if (this.sessionEvents.length > 500) {\n this.sessionEvents.shift();\n }\n };\n\n private calculateSessionEntropy(): number {\n if (this.sessionEvents.length === 0) return 0;\n const counts: Record<string, number> = {};\n this.sessionEvents.forEach(evt => {\n counts[evt.type] = (counts[evt.type] || 0) + 1;\n });\n const total = this.sessionEvents.length;\n return Object.values(counts).reduce((entropy, count) => {\n const probability = count / total;\n return probability > 0 ? entropy - probability * Math.log2(probability) : entropy;\n }, 0);\n }\n\n /**\n * Get mouse signals from kinematic engine\n */\n getMouseSignals() {\n return this.kinematicEngine.getMouseSignals();\n }\n\n /**\n * Get keyboard signals from keystroke monitor\n */\n getKeyboardSignals() {\n return this.keystrokeMonitor.getKeyboardSignals();\n }\n}\n","/**\n * Canvas Fingerprint Collector\n * Generates a stable canvas fingerprint using text rendering, shapes, and gradients\n * This is a key component for device identification\n */\n\nexport interface CanvasFingerprint {\n value: string; // Base64 or hash of canvas data\n duration: number; // Time taken to generate (ms)\n}\n\nexport class CanvasFingerprintCollector {\n private cachedFingerprint: CanvasFingerprint | null = null;\n\n /**\n * Generate canvas fingerprint\n * Returns null if canvas is not available\n */\n collect(): CanvasFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 200;\n canvas.height = 50;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n // Text rendering with various styles\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.textBaseline = 'alphabetic';\n \n // Background rectangle\n ctx.fillStyle = '#f60';\n ctx.fillRect(125, 1, 62, 20);\n \n // Text with different styles\n ctx.fillStyle = '#069';\n ctx.fillText('KeverdFingerprint', 2, 15);\n \n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';\n ctx.fillText('KeverdFingerprint', 4, 17);\n\n // Add shapes and gradients for more uniqueness\n const gradient = ctx.createLinearGradient(0, 0, 200, 50);\n gradient.addColorStop(0, 'rgba(255, 0, 0, 0.5)');\n gradient.addColorStop(1, 'rgba(0, 0, 255, 0.5)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 200, 50);\n\n // Add geometric shapes\n ctx.strokeStyle = '#000';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(100, 25, 20, 0, Math.PI * 2);\n ctx.stroke();\n\n // Add more text with different fonts\n ctx.font = '12px Verdana';\n ctx.fillStyle = '#000';\n ctx.fillText('CanvasFP', 150, 30);\n\n // Get canvas data\n const dataURL = canvas.toDataURL();\n \n // Hash the data URL for privacy (we'll use a simple hash for now)\n const hash = this.hashString(dataURL);\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n value: hash,\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Canvas fingerprinting failed:', error);\n return null;\n }\n }\n\n /**\n * Hash a string to create a stable fingerprint\n */\n private hashString(str: string): string {\n // Simple hash function that produces consistent results\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; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * WebGL Fingerprint Collector\n * Extracts WebGL vendor, renderer, version, supported extensions, and shader precision\n * This provides hardware-level identification\n */\n\nexport interface WebGLFingerprint {\n vendor: string | null;\n renderer: string | null;\n version: string | null;\n shadingLanguageVersion: string | null;\n extensions: string[];\n parameters: Record<string, any>;\n precision: Record<string, string>;\n duration: number;\n}\n\nexport class WebGLFingerprintCollector {\n private cachedFingerprint: WebGLFingerprint | null = null;\n\n /**\n * Generate WebGL fingerprint\n * Returns null if WebGL is not available\n */\n collect(): WebGLFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || \n canvas.getContext('experimental-webgl') as WebGLRenderingContext | null;\n\n if (!gl) {\n return null;\n }\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n \n // Get vendor and renderer (most identifying info)\n let vendor: string | null = null;\n let renderer: string | null = null;\n\n if (debugInfo) {\n vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || null;\n renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || null;\n } else {\n vendor = gl.getParameter(gl.VENDOR) || null;\n renderer = gl.getParameter(gl.RENDERER) || null;\n }\n\n // Get version info\n const version = gl.getParameter(gl.VERSION) || null;\n const shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION) || null;\n\n // Get supported extensions\n const extensions: string[] = [];\n try {\n const supportedExtensions = gl.getSupportedExtensions();\n if (supportedExtensions) {\n extensions.push(...supportedExtensions);\n }\n } catch (e) {\n // Some browsers may throw when accessing extensions\n }\n\n // Get important parameters\n const parameters: Record<string, any> = {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxVertexAttribs: gl.getParameter(gl.MAX_VERTEX_ATTRIBS),\n maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),\n maxTextureImageUnits: gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),\n maxCombinedTextureImageUnits: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n maxFragmentUniformVectors: gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS),\n maxVaryingVectors: gl.getParameter(gl.MAX_VARYING_VECTORS),\n aliasedLineWidthRange: gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE),\n aliasedPointSizeRange: gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE),\n };\n\n // Get shader precision\n const precision: Record<string, string> = {};\n try {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n if (vertexShader) {\n gl.shaderSource(vertexShader, 'precision mediump float;');\n gl.compileShader(vertexShader);\n \n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (fragmentShader) {\n gl.shaderSource(fragmentShader, 'precision mediump float;');\n gl.compileShader(fragmentShader);\n \n // Get precision for different types\n precision.float = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT)?.precision?.toString() || 'unknown';\n precision.int = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT)?.precision?.toString() || 'unknown';\n }\n }\n } catch (e) {\n // Precision detection may fail in some browsers\n }\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n vendor,\n renderer,\n version,\n shadingLanguageVersion,\n extensions: extensions.sort(), // Sort for consistency\n parameters,\n precision,\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] WebGL fingerprinting failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Audio Fingerprint Collector\n * Generates audio context fingerprint using oscillator analysis and frequency response\n * This is a powerful technique for device identification\n */\n\nexport interface AudioFingerprint {\n value: number; // Audio fingerprint value\n duration: number; // Time taken to generate (ms)\n}\n\nexport class AudioFingerprintCollector {\n private cachedFingerprint: AudioFingerprint | null = null;\n\n /**\n * Generate audio fingerprint\n * Returns null if audio context is not available\n */\n async collect(): Promise<AudioFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if AudioContext is available\n const AudioContext = window.AudioContext || \n (window as any).webkitAudioContext || \n (window as any).mozAudioContext;\n\n if (!AudioContext) {\n return null;\n }\n\n const context = new AudioContext();\n const oscillator = context.createOscillator();\n const analyser = context.createAnalyser();\n const gainNode = context.createGain();\n const scriptProcessor = context.createScriptProcessor(4096, 1, 1);\n\n // Configure analyser\n analyser.fftSize = 2048;\n analyser.smoothingTimeConstant = 0.8;\n\n // Connect nodes\n oscillator.connect(analyser);\n analyser.connect(scriptProcessor);\n scriptProcessor.connect(gainNode);\n gainNode.connect(context.destination);\n\n // Set oscillator properties\n oscillator.type = 'triangle';\n oscillator.frequency.value = 10000; // High frequency for better detection\n\n // Collect audio data\n return new Promise((resolve) => {\n const audioData: number[] = [];\n let sampleCount = 0;\n const maxSamples = 5; // Collect 5 samples\n\n scriptProcessor.onaudioprocess = (event) => {\n const inputBuffer = event.inputBuffer;\n const inputData = inputBuffer.getChannelData(0);\n\n // Calculate RMS (Root Mean Square) for this sample\n let sum = 0;\n for (let i = 0; i < inputData.length; i++) {\n sum += inputData[i] * inputData[i];\n }\n const rms = Math.sqrt(sum / inputData.length);\n audioData.push(rms);\n\n sampleCount++;\n if (sampleCount >= maxSamples) {\n // Stop oscillator and clean up\n oscillator.stop();\n context.close();\n\n // Calculate fingerprint from audio data\n const fingerprint = this.calculateFingerprint(audioData);\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n value: fingerprint,\n duration: Math.round(duration * 100) / 100,\n };\n\n resolve(this.cachedFingerprint);\n }\n };\n\n // Start oscillator\n oscillator.start(0);\n gainNode.gain.value = 0; // Mute to avoid sound\n\n // Timeout fallback (in case audio processing doesn't work)\n setTimeout(() => {\n if (!this.cachedFingerprint) {\n oscillator.stop();\n context.close();\n \n // Use a fallback fingerprint based on available audio properties\n const fallbackFingerprint = this.getFallbackFingerprint(context);\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n value: fallbackFingerprint,\n duration: Math.round(duration * 100) / 100,\n };\n\n resolve(this.cachedFingerprint);\n }\n }, 1000);\n });\n } catch (error) {\n console.warn('[Keverd SDK] Audio fingerprinting failed:', error);\n return null;\n }\n }\n\n /**\n * Calculate fingerprint from audio data\n */\n private calculateFingerprint(audioData: number[]): number {\n if (audioData.length === 0) {\n return 0;\n }\n\n // Calculate various statistics from audio data\n const sum = audioData.reduce((a, b) => a + b, 0);\n const mean = sum / audioData.length;\n \n const variance = audioData.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / audioData.length;\n const stdDev = Math.sqrt(variance);\n\n // Combine statistics into a single fingerprint value\n const fingerprint = (mean * 1000000) + (stdDev * 1000) + audioData.length;\n \n return Math.round(fingerprint * 100) / 100;\n }\n\n /**\n * Get fallback fingerprint when audio processing fails\n */\n private getFallbackFingerprint(context: AudioContext): number {\n // Use AudioContext properties as fallback\n const sampleRate = context.sampleRate || 44100;\n const state = context.state || 'unknown';\n \n // Create a simple hash from available properties\n const hash = (sampleRate.toString() + state).split('').reduce((acc, char) => {\n return ((acc << 5) - acc) + char.charCodeAt(0);\n }, 0);\n\n return Math.abs(hash);\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Font Detection Collector\n * Detects installed fonts using font measurement techniques and fallback detection\n * This helps identify unique system configurations\n */\n\nexport interface FontFingerprint {\n availableFonts: string[];\n missingFonts: string[];\n duration: number;\n}\n\nexport class FontDetectionCollector {\n private cachedFingerprint: FontFingerprint | null = null;\n\n // Common fonts to test\n private readonly testFonts = [\n 'Arial', 'Verdana', 'Times New Roman', 'Courier New', 'Georgia',\n 'Palatino', 'Garamond', 'Bookman', 'Comic Sans MS', 'Trebuchet MS',\n 'Arial Black', 'Impact', 'Tahoma', 'Lucida Console', 'Lucida Sans Unicode',\n 'MS Sans Serif', 'MS Serif', 'Symbol', 'Webdings', 'Wingdings',\n 'Monaco', 'Menlo', 'Consolas', 'Courier', 'Helvetica',\n 'Helvetica Neue', 'Roboto', 'Open Sans', 'Lato', 'Montserrat',\n ];\n\n /**\n * Detect available fonts\n * Returns null if detection fails\n */\n collect(): FontFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Create a canvas for font measurement\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) {\n return null;\n }\n\n // Base font for comparison\n const baseFont = 'monospace';\n const testString = 'mmmmmmmmmmlli';\n const testSize = '72px';\n\n // Set base font and measure\n ctx.font = `${testSize} ${baseFont}`;\n const baseWidth = ctx.measureText(testString).width;\n\n const availableFonts: string[] = [];\n const missingFonts: string[] = [];\n\n // Test each font\n for (const font of this.testFonts) {\n ctx.font = `${testSize} ${font}, ${baseFont}`;\n const width = ctx.measureText(testString).width;\n\n // If width differs from base, font is likely available\n // (this is a heuristic, not 100% accurate)\n if (Math.abs(width - baseWidth) > 1) {\n availableFonts.push(font);\n } else {\n missingFonts.push(font);\n }\n }\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n availableFonts: availableFonts.sort(),\n missingFonts: missingFonts.sort(),\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Font detection failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Media Devices Collector\n * Lists audio/video devices and enumerates media devices with labels\n * Requires user permission for device labels\n */\n\nexport interface MediaDeviceFingerprint {\n audioInputs: MediaDeviceInfo[];\n audioOutputs: MediaDeviceInfo[];\n videoInputs: MediaDeviceInfo[];\n hasPermission: boolean;\n duration: number;\n}\n\nexport class MediaDevicesCollector {\n private cachedFingerprint: MediaDeviceFingerprint | null = null;\n\n /**\n * Collect media device information\n * Returns null if MediaDevices API is not available\n */\n async collect(): Promise<MediaDeviceFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if MediaDevices API is available\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return null;\n }\n\n // Request permission to access device labels\n // This will prompt the user if permission hasn't been granted\n let hasPermission = false;\n try {\n // Try to get user media to trigger permission request\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false });\n hasPermission = true;\n // Stop the stream immediately\n stream.getTracks().forEach(track => track.stop());\n } catch (e) {\n // Permission denied or not available - continue without labels\n hasPermission = false;\n }\n\n // Enumerate devices\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n // Categorize devices\n const audioInputs: MediaDeviceInfo[] = [];\n const audioOutputs: MediaDeviceInfo[] = [];\n const videoInputs: MediaDeviceInfo[] = [];\n\n devices.forEach(device => {\n // Sanitize device info for privacy\n const sanitizedDevice: MediaDeviceInfo = {\n deviceId: device.deviceId,\n kind: device.kind,\n label: hasPermission ? device.label : '', // Only include label if permission granted\n groupId: device.groupId,\n toJSON: () => ({\n deviceId: device.deviceId,\n kind: device.kind,\n label: hasPermission ? device.label : '',\n groupId: device.groupId,\n }),\n };\n\n switch (device.kind) {\n case 'audioinput':\n audioInputs.push(sanitizedDevice);\n break;\n case 'audiooutput':\n audioOutputs.push(sanitizedDevice);\n break;\n case 'videoinput':\n videoInputs.push(sanitizedDevice);\n break;\n }\n });\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n audioInputs,\n audioOutputs,\n videoInputs,\n hasPermission,\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Media devices enumeration failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Screen & Display Collector\n * Collects screen resolution, color depth, pixel ratio, orientation, and multi-monitor info\n */\n\nexport interface ScreenDisplayFingerprint {\n width: number;\n height: number;\n availWidth: number;\n availHeight: number;\n colorDepth: number;\n pixelDepth: number;\n pixelRatio: number;\n orientation: string | null;\n orientationAngle: number | null;\n duration: number;\n}\n\nexport class ScreenDisplayCollector {\n private cachedFingerprint: ScreenDisplayFingerprint | null = null;\n\n /**\n * Collect screen and display information\n */\n collect(): ScreenDisplayFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: ScreenDisplayFingerprint = {\n width: screen.width,\n height: screen.height,\n availWidth: screen.availWidth,\n availHeight: screen.availHeight,\n colorDepth: screen.colorDepth,\n pixelDepth: screen.pixelDepth,\n pixelRatio: window.devicePixelRatio || 1,\n orientation: this.getOrientation(),\n orientationAngle: this.getOrientationAngle(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Get screen orientation\n */\n private getOrientation(): string | null {\n // Check Screen Orientation API\n if ('orientation' in screen) {\n const orientation = (screen as any).orientation;\n if (orientation && orientation.type) {\n return orientation.type;\n }\n }\n\n // Fallback to window.orientation (deprecated but widely supported)\n if ('orientation' in window) {\n const angle = (window as any).orientation;\n if (angle !== undefined) {\n if (angle === 0 || angle === 180) {\n return 'portrait';\n } else if (angle === 90 || angle === -90) {\n return 'landscape';\n }\n }\n }\n\n // Fallback to media query\n if (window.matchMedia) {\n if (window.matchMedia('(orientation: portrait)').matches) {\n return 'portrait';\n } else if (window.matchMedia('(orientation: landscape)').matches) {\n return 'landscape';\n }\n }\n\n return null;\n }\n\n /**\n * Get screen orientation angle\n */\n private getOrientationAngle(): number | null {\n // Check Screen Orientation API\n if ('orientation' in screen) {\n const orientation = (screen as any).orientation;\n if (orientation && typeof orientation.angle === 'number') {\n return orientation.angle;\n }\n }\n\n // Fallback to window.orientation\n if ('orientation' in window) {\n const angle = (window as any).orientation;\n if (typeof angle === 'number') {\n return angle;\n }\n }\n\n return null;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Timezone & Locale Collector\n * Collects timezone, locale, date/time formatting preferences, and calendar system\n */\n\nexport interface TimezoneLocaleFingerprint {\n timezone: string;\n timezoneOffset: number;\n locale: string;\n locales: string[];\n dateFormat: string;\n timeFormat: string;\n numberFormat: string;\n calendar: string | null;\n duration: number;\n}\n\nexport class TimezoneLocaleCollector {\n private cachedFingerprint: TimezoneLocaleFingerprint | null = null;\n\n /**\n * Collect timezone and locale information\n */\n collect(): TimezoneLocaleFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n // Get timezone\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const timezoneOffset = new Date().getTimezoneOffset();\n\n // Get locale information\n const resolvedOptions = Intl.DateTimeFormat().resolvedOptions();\n const locale = resolvedOptions.locale;\n const locales = navigator.languages || [navigator.language];\n\n // Get date format\n const dateFormat = this.getDateFormat();\n\n // Get time format\n const timeFormat = this.getTimeFormat();\n\n // Get number format\n const numberFormat = this.getNumberFormat();\n\n // Get calendar system\n const calendar = resolvedOptions.calendar || null;\n\n const fingerprint: TimezoneLocaleFingerprint = {\n timezone,\n timezoneOffset,\n locale,\n locales: locales.slice(0, 5), // Limit to first 5 locales\n dateFormat,\n timeFormat,\n numberFormat,\n calendar,\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Get date format preference\n */\n private getDateFormat(): string {\n try {\n const formatter = new Intl.DateTimeFormat();\n const sample = formatter.format(new Date(2023, 0, 15)); // Jan 15, 2023\n // Extract format pattern (simplified)\n if (sample.includes('/')) {\n return 'numeric'; // Likely MM/DD/YYYY or DD/MM/YYYY\n } else if (sample.includes('-')) {\n return 'iso'; // Likely YYYY-MM-DD\n } else if (sample.includes('.')) {\n return 'european'; // Likely DD.MM.YYYY\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get time format preference (12h vs 24h)\n */\n private getTimeFormat(): string {\n try {\n const formatter = new Intl.DateTimeFormat(undefined, {\n hour: 'numeric',\n minute: 'numeric',\n });\n const sample = formatter.format(new Date(2023, 0, 15, 13, 30));\n // Check if sample contains AM/PM indicators\n if (sample.toLowerCase().includes('am') || sample.toLowerCase().includes('pm')) {\n return '12h';\n }\n return '24h';\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get number format preference\n */\n private getNumberFormat(): string {\n try {\n const formatter = new Intl.NumberFormat();\n const sample = formatter.format(1234.56);\n // Check for decimal separator\n if (sample.includes(',')) {\n return 'european'; // Uses comma as decimal separator\n } else if (sample.includes('.')) {\n return 'american'; // Uses dot as decimal separator\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Plugin & MIME Type Collector\n * Safely enumerates plugins and MIME types (privacy-conscious, limited data)\n * Note: Modern browsers have deprecated plugins, but we collect what's available\n */\n\nexport interface PluginMimeFingerprint {\n plugins: Array<{\n name: string;\n description: string;\n mimeTypes: string[];\n }>;\n mimeTypes: string[];\n duration: number;\n}\n\nexport class PluginMimeCollector {\n private cachedFingerprint: PluginMimeFingerprint | null = null;\n\n /**\n * Collect plugin and MIME type information\n * Returns null if plugins are not available (modern browsers)\n */\n collect(): PluginMimeFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if plugins are available\n if (!navigator.plugins || navigator.plugins.length === 0) {\n // Modern browsers don't expose plugins\n return null;\n }\n\n const plugins: Array<{ name: string; description: string; mimeTypes: string[] }> = [];\n const allMimeTypes = new Set<string>();\n\n // Collect plugin information (limited for privacy)\n for (let i = 0; i < Math.min(navigator.plugins.length, 10); i++) {\n const plugin = navigator.plugins[i];\n if (!plugin) continue;\n\n const mimeTypes: string[] = [];\n \n // Collect MIME types for this plugin (limited)\n for (let j = 0; j < Math.min(plugin.length, 5); j++) {\n const mimeType = plugin[j];\n if (mimeType && mimeType.type) {\n mimeTypes.push(mimeType.type);\n allMimeTypes.add(mimeType.type);\n }\n }\n\n plugins.push({\n name: plugin.name || 'Unknown',\n description: plugin.description || '',\n mimeTypes,\n });\n }\n\n const fingerprint: PluginMimeFingerprint = {\n plugins,\n mimeTypes: Array.from(allMimeTypes).sort(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Plugin/MIME collection failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Battery API Collector\n * Collects battery level, charging status, charging time (if available, with fallbacks)\n * Note: Battery API is deprecated but still available in some browsers\n */\n\nexport interface BatteryFingerprint {\n level: number | null; // 0.0 to 1.0\n charging: boolean | null;\n chargingTime: number | null; // seconds until fully charged\n dischargingTime: number | null; // seconds until fully discharged\n duration: number;\n}\n\nexport class BatteryAPICollector {\n private cachedFingerprint: BatteryFingerprint | null = null;\n\n /**\n * Collect battery information\n * Returns null if Battery API is not available\n */\n async collect(): Promise<BatteryFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check for Battery API (deprecated but still available)\n const batteryManager = await this.getBatteryManager();\n \n if (!batteryManager) {\n return null;\n }\n\n const fingerprint: BatteryFingerprint = {\n level: batteryManager.level,\n charging: batteryManager.charging,\n chargingTime: batteryManager.chargingTime,\n dischargingTime: batteryManager.dischargingTime,\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n // Battery API may not be available or may require user permission\n return null;\n }\n }\n\n /**\n * Get battery manager from various API locations\n */\n private async getBatteryManager(): Promise<any> {\n // Try standard Battery API\n if ('getBattery' in navigator) {\n try {\n return await (navigator as any).getBattery();\n } catch (e) {\n // API may be available but fail due to permissions\n }\n }\n\n // Try webkit prefix\n if ('webkitGetBattery' in navigator) {\n try {\n return await (navigator as any).webkitGetBattery();\n } catch (e) {\n // API may be available but fail due to permissions\n }\n }\n\n // Try moz prefix\n if ('mozGetBattery' in navigator) {\n try {\n return await (navigator as any).mozGetBattery();\n } catch (e) {\n // API may be available but fail due to permissions\n }\n }\n\n return null;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Storage & Database Collector\n * Detects localStorage, sessionStorage, IndexedDB, WebSQL availability and quotas\n */\n\nexport interface StorageDatabaseFingerprint {\n localStorage: {\n available: boolean;\n quota: number | null;\n usage: number | null;\n };\n sessionStorage: {\n available: boolean;\n quota: number | null;\n usage: number | null;\n };\n indexedDB: {\n available: boolean;\n };\n webSQL: {\n available: boolean;\n };\n duration: number;\n}\n\nexport class StorageDatabaseCollector {\n private cachedFingerprint: StorageDatabaseFingerprint | null = null;\n\n /**\n * Collect storage and database information\n */\n async collect(): Promise<StorageDatabaseFingerprint> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: StorageDatabaseFingerprint = {\n localStorage: await this.checkLocalStorage(),\n sessionStorage: await this.checkSessionStorage(),\n indexedDB: this.checkIndexedDB(),\n webSQL: this.checkWebSQL(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Check localStorage availability and quota\n */\n private async checkLocalStorage(): Promise<{ available: boolean; quota: number | null; usage: number | null }> {\n let available = false;\n let quota: number | null = null;\n let usage: number | null = null;\n\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n available = true;\n\n // Try to get storage quota (if available)\n if ('storage' in navigator && 'estimate' in (navigator as any).storage) {\n try {\n const estimate = await (navigator as any).storage.estimate();\n if (estimate) {\n quota = estimate.quota || null;\n usage = estimate.usage || null;\n }\n } catch (e) {\n // Quota API may not be available\n }\n }\n } catch (e) {\n available = false;\n }\n\n return { available, quota, usage };\n }\n\n /**\n * Check sessionStorage availability and quota\n */\n private async checkSessionStorage(): Promise<{ available: boolean; quota: number | null; usage: number | null }> {\n let available = false;\n let quota: number | null = null;\n let usage: number | null = null;\n\n try {\n const test = '__sessionStorage_test__';\n sessionStorage.setItem(test, test);\n sessionStorage.removeItem(test);\n available = true;\n\n // Try to get storage quota (if available)\n if ('storage' in navigator && 'estimate' in (navigator as any).storage) {\n try {\n const estimate = await (navigator as any).storage.estimate();\n if (estimate) {\n quota = estimate.quota || null;\n usage = estimate.usage || null;\n }\n } catch (e) {\n // Quota API may not be available\n }\n }\n } catch (e) {\n available = false;\n }\n\n return { available, quota, usage };\n }\n\n /**\n * Check IndexedDB availability\n */\n private checkIndexedDB(): { available: boolean } {\n return {\n available: 'indexedDB' in window && !!window.indexedDB,\n };\n }\n\n /**\n * Check WebSQL availability (deprecated but still in some browsers)\n */\n private checkWebSQL(): { available: boolean } {\n return {\n available: 'openDatabase' in window && !!(window as any).openDatabase,\n };\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * CPU & Memory Collector\n * Collects hardwareConcurrency, deviceMemory, performance.memory (if available)\n */\n\nexport interface CPUMemoryFingerprint {\n hardwareConcurrency: number;\n deviceMemory: number | null;\n performanceMemory: {\n jsHeapSizeLimit: number | null;\n totalJSHeapSize: number | null;\n usedJSHeapSize: number | null;\n };\n duration: number;\n}\n\nexport class CPUMemoryCollector {\n private cachedFingerprint: CPUMemoryFingerprint | null = null;\n\n /**\n * Collect CPU and memory information\n */\n collect(): CPUMemoryFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: CPUMemoryFingerprint = {\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n deviceMemory: this.getDeviceMemory(),\n performanceMemory: this.getPerformanceMemory(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Get device memory (if available)\n */\n private getDeviceMemory(): number | null {\n // @ts-ignore - deviceMemory is not in all TypeScript definitions\n if ('deviceMemory' in navigator && navigator.deviceMemory) {\n // @ts-ignore\n return navigator.deviceMemory;\n }\n return null;\n }\n\n /**\n * Get performance memory information (Chrome-specific)\n */\n private getPerformanceMemory(): {\n jsHeapSizeLimit: number | null;\n totalJSHeapSize: number | null;\n usedJSHeapSize: number | null;\n } {\n if ('memory' in performance) {\n const memory = (performance as any).memory;\n return {\n jsHeapSizeLimit: memory.jsHeapSizeLimit || null,\n totalJSHeapSize: memory.totalJSHeapSize || null,\n usedJSHeapSize: memory.usedJSHeapSize || null,\n };\n }\n return {\n jsHeapSizeLimit: null,\n totalJSHeapSize: null,\n usedJSHeapSize: null,\n };\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Touch & Pointer Collector\n * Collects maxTouchPoints, pointer capabilities, touch event support\n */\n\nexport interface TouchPointerFingerprint {\n maxTouchPoints: number;\n touchSupport: boolean;\n pointerSupport: boolean;\n pointerTypes: string[];\n duration: number;\n}\n\nexport class TouchPointerCollector {\n private cachedFingerprint: TouchPointerFingerprint | null = null;\n\n /**\n * Collect touch and pointer information\n */\n collect(): TouchPointerFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: TouchPointerFingerprint = {\n maxTouchPoints: navigator.maxTouchPoints || 0,\n touchSupport: this.checkTouchSupport(),\n pointerSupport: this.checkPointerSupport(),\n pointerTypes: this.getPointerTypes(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Check if touch events are supported\n */\n private checkTouchSupport(): boolean {\n return 'ontouchstart' in window || \n navigator.maxTouchPoints > 0 ||\n !!(window as any).DocumentTouch && document instanceof (window as any).DocumentTouch;\n }\n\n /**\n * Check if Pointer Events are supported\n */\n private checkPointerSupport(): boolean {\n return 'PointerEvent' in window || 'MSPointerEvent' in window;\n }\n\n /**\n * Get available pointer types\n */\n private getPointerTypes(): string[] {\n const types: string[] = [];\n\n if ('PointerEvent' in window) {\n // Check for different pointer types\n if (navigator.maxTouchPoints > 0) {\n types.push('touch');\n }\n types.push('mouse');\n if ('pen' in navigator) {\n types.push('pen');\n }\n }\n\n return types;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Permissions API Collector\n * Checks permissions for camera, microphone, notifications, geolocation\n */\n\nexport interface PermissionsFingerprint {\n camera: string | null;\n microphone: string | null;\n notifications: string | null;\n geolocation: string | null;\n persistentStorage: string | null;\n duration: number;\n}\n\nexport class PermissionsAPICollector {\n private cachedFingerprint: PermissionsFingerprint | null = null;\n\n /**\n * Collect permission states\n * Returns null if Permissions API is not available\n */\n async collect(): Promise<PermissionsFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if Permissions API is available\n if (!('permissions' in navigator)) {\n return null;\n }\n\n const permissions = (navigator as any).permissions;\n\n const fingerprint: PermissionsFingerprint = {\n camera: await this.queryPermission(permissions, 'camera'),\n microphone: await this.queryPermission(permissions, 'microphone'),\n notifications: await this.queryPermission(permissions, 'notifications'),\n geolocation: await this.queryPermission(permissions, 'geolocation'),\n persistentStorage: await this.queryPermission(permissions, 'persistent-storage'),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Permissions API collection failed:', error);\n return null;\n }\n }\n\n /**\n * Query a specific permission\n */\n private async queryPermission(permissions: any, name: string): Promise<string | null> {\n try {\n const result = await permissions.query({ name });\n return result.state || null; // 'granted', 'denied', or 'prompt'\n } catch (e) {\n // Permission name may not be supported\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * WebRTC IP Collector\n * Extracts local IP addresses via WebRTC (with privacy considerations and error handling)\n * Note: This requires user interaction and may be blocked by privacy settings\n */\n\nexport interface WebRTCIPFingerprint {\n localIPs: string[];\n publicIP: string | null;\n duration: number;\n}\n\nexport class WebRTCIPCollector {\n private cachedFingerprint: WebRTCIPFingerprint | null = null;\n\n /**\n * Collect WebRTC IP information\n * Returns null if WebRTC is not available or fails\n */\n async collect(): Promise<WebRTCIPFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if RTCPeerConnection is available\n const RTCPeerConnection = window.RTCPeerConnection || \n (window as any).webkitRTCPeerConnection || \n (window as any).mozRTCPeerConnection;\n\n if (!RTCPeerConnection) {\n return null;\n }\n\n const localIPs: string[] = [];\n let publicIP: string | null = null;\n\n // Create a peer connection to trigger candidate gathering\n const pc = new RTCPeerConnection({\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],\n });\n\n // Collect ICE candidates\n pc.onicecandidate = (event) => {\n if (event.candidate) {\n const candidate = event.candidate.candidate;\n \n // Extract IP addresses from candidate string\n const ipMatch = candidate.match(/([0-9]{1,3}\\.){3}[0-9]{1,3}/);\n if (ipMatch) {\n const ip = ipMatch[0];\n \n // Filter out local/private IPs\n if (this.isLocalIP(ip)) {\n if (!localIPs.includes(ip)) {\n localIPs.push(ip);\n }\n } else {\n // Public IP\n publicIP = ip;\n }\n }\n }\n };\n\n // Create a data channel to trigger candidate gathering\n pc.createDataChannel('');\n\n // Create offer to start ICE gathering\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n\n // Wait for ICE gathering to complete (with timeout)\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n resolve();\n }, 2000); // 2 second timeout\n\n pc.onicegatheringstatechange = () => {\n if (pc.iceGatheringState === 'complete') {\n clearTimeout(timeout);\n resolve();\n }\n };\n\n // Also resolve if already complete\n if (pc.iceGatheringState === 'complete') {\n clearTimeout(timeout);\n resolve();\n }\n });\n\n // Clean up\n pc.close();\n\n const fingerprint: WebRTCIPFingerprint = {\n localIPs: localIPs.sort(),\n publicIP,\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n // WebRTC may be blocked or unavailable\n return null;\n }\n }\n\n /**\n * Check if an IP is a local/private IP\n */\n private isLocalIP(ip: string): boolean {\n // Check for localhost\n if (ip === '127.0.0.1' || ip === '::1') {\n return true;\n }\n\n // Check for private IP ranges\n const parts = ip.split('.');\n if (parts.length === 4) {\n const first = parseInt(parts[0], 10);\n const second = parseInt(parts[1], 10);\n\n // 10.0.0.0/8\n if (first === 10) {\n return true;\n }\n\n // 172.16.0.0/12\n if (first === 172 && second >= 16 && second <= 31) {\n return true;\n }\n\n // 192.168.0.0/16\n if (first === 192 && second === 168) {\n return true;\n }\n\n // 169.254.0.0/16 (link-local)\n if (first === 169 && second === 254) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Stable Visitor ID Generator\n * Combines all fingerprint components into deterministic, stable visitor ID using SHA-256\n * This replaces FingerprintJS visitor ID with our own implementation\n */\n\nimport { FingerprintComponents } from '../types/fingerprint';\n\nexport class VisitorIDGenerator {\n /**\n * Generate a stable visitor ID from fingerprint components\n * Uses SHA-256-like hashing for consistency\n */\n generate(components: FingerprintComponents): string {\n // Collect all stable identifiers from components\n const identifiers: string[] = [];\n\n // Canvas fingerprint (very stable)\n if (components.canvas?.value) {\n identifiers.push(`canvas:${components.canvas.value}`);\n }\n\n // WebGL renderer and vendor (very stable)\n if (components.webgl) {\n if (components.webgl.vendor) {\n identifiers.push(`webgl_vendor:${components.webgl.vendor}`);\n }\n if (components.webgl.renderer) {\n identifiers.push(`webgl_renderer:${components.webgl.renderer}`);\n }\n if (components.webgl.extensions.length > 0) {\n identifiers.push(`webgl_ext:${components.webgl.extensions.slice(0, 10).join(',')}`);\n }\n }\n\n // Audio fingerprint (stable)\n if (components.audio?.value) {\n identifiers.push(`audio:${components.audio.value}`);\n }\n\n // Screen resolution and pixel ratio (stable)\n if (components.screen) {\n identifiers.push(`screen:${components.screen.width}x${components.screen.height}x${components.screen.pixelRatio}`);\n identifiers.push(`color:${components.screen.colorDepth}`);\n }\n\n // Timezone (stable)\n if (components.timezone) {\n identifiers.push(`tz:${components.timezone.timezone}`);\n identifiers.push(`locale:${components.timezone.locale}`);\n }\n\n // Hardware concurrency (stable)\n if (components.cpu) {\n identifiers.push(`cpu:${components.cpu.hardwareConcurrency}`);\n if (components.cpu.deviceMemory) {\n identifiers.push(`memory:${components.cpu.deviceMemory}`);\n }\n }\n\n // Touch points (stable)\n if (components.touch) {\n identifiers.push(`touch:${components.touch.maxTouchPoints}`);\n }\n\n // User agent (stable but less reliable)\n identifiers.push(`ua:${navigator.userAgent}`);\n\n // Language (stable)\n identifiers.push(`lang:${navigator.language}`);\n\n // Platform (stable)\n identifiers.push(`platform:${navigator.platform}`);\n\n // Fonts (stable - use available fonts)\n if (components.fonts && components.fonts.availableFonts.length > 0) {\n identifiers.push(`fonts:${components.fonts.availableFonts.slice(0, 20).join(',')}`);\n }\n\n // Combine all identifiers\n const combined = identifiers.join('|');\n\n // Generate SHA-256-like hash\n return this.sha256Hash(combined);\n }\n\n /**\n * Calculate confidence score based on component availability\n * More components = higher confidence\n */\n calculateConfidence(components: FingerprintComponents): number {\n let score = 0;\n let maxScore = 0;\n\n // Weight different components by their stability\n const weights: Record<string, number> = {\n canvas: 20,\n webgl: 20,\n audio: 15,\n screen: 10,\n timezone: 10,\n cpu: 10,\n fonts: 10,\n touch: 5,\n storage: 5,\n permissions: 5,\n webrtc: 5,\n mediaDevices: 5,\n battery: 3,\n plugins: 3,\n };\n\n // Calculate score\n Object.keys(weights).forEach((key) => {\n maxScore += weights[key];\n if (components[key as keyof FingerprintComponents]) {\n score += weights[key];\n }\n });\n\n // Normalize to 0.0 - 1.0 range\n return maxScore > 0 ? Math.min(score / maxScore, 1.0) : 0.0;\n }\n\n /**\n * SHA-256-like hash function\n * Produces a 64-character hex string (matching SHA-256 format)\n */\n private sha256Hash(input: string): string {\n // Use Web Crypto API if available (more secure and faster)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n // For now, use a synchronous hash function\n // In production, you might want to use async crypto.subtle.digest\n return this.sha256LikeHash(input);\n }\n\n // Fallback to custom hash\n return this.sha256LikeHash(input);\n }\n\n /**\n * SHA-256-like hash (synchronous, deterministic)\n * Produces 64-character hex string\n */\n private sha256LikeHash(str: string): string {\n // Create multiple hash passes for better distribution\n const hashes: number[] = [];\n \n // Pass 1: Standard djb2\n let h1 = 5381;\n for (let i = 0; i < str.length; i++) {\n h1 = ((h1 << 5) + h1) + str.charCodeAt(i);\n h1 = h1 & 0xFFFFFFFF;\n }\n hashes.push(h1);\n \n // Pass 2: Reverse string\n let h2 = 0;\n for (let i = str.length - 1; i >= 0; i--) {\n h2 = ((h2 << 7) - h2) + str.charCodeAt(i);\n h2 = h2 & 0xFFFFFFFF;\n }\n hashes.push(h2);\n \n // Pass 3: XOR with position\n let h3 = 0;\n for (let i = 0; i < str.length; i++) {\n h3 = h3 ^ (str.charCodeAt(i) << ((i % 4) * 8));\n h3 = h3 & 0xFFFFFFFF;\n }\n hashes.push(h3);\n \n // Pass 4: Multiplicative hash\n let h4 = 0;\n for (let i = 0; i < str.length; i++) {\n h4 = (h4 * 31 + str.charCodeAt(i)) & 0xFFFFFFFF;\n }\n hashes.push(h4);\n \n // Pass 5: Rotating hash\n let h5 = 0;\n for (let i = 0; i < str.length; i++) {\n const rotated = ((str.charCodeAt(i) << (i % 16)) | (str.charCodeAt(i) >>> (32 - (i % 16)))) & 0xFFFFFFFF;\n h5 = (h5 + rotated) & 0xFFFFFFFF;\n }\n hashes.push(h5);\n \n // Pass 6: FNV-1a variant\n let h6 = 2166136261;\n for (let i = 0; i < str.length; i++) {\n h6 = (h6 ^ str.charCodeAt(i)) * 16777619;\n h6 = h6 & 0xFFFFFFFF;\n }\n hashes.push(h6);\n \n // Pass 7: Position-weighted hash\n let h7 = 0;\n for (let i = 0; i < str.length; i++) {\n h7 = (h7 + str.charCodeAt(i) * (i + 1)) & 0xFFFFFFFF;\n }\n hashes.push(h7);\n \n // Pass 8: Combined character codes\n let h8 = 0;\n for (let i = 0; i < str.length; i += 2) {\n const combined = str.charCodeAt(i) + (str.charCodeAt(i + 1) || 0) * 256;\n h8 = ((h8 << 3) - h8) + combined;\n h8 = h8 & 0xFFFFFFFF;\n }\n hashes.push(h8);\n \n // Convert all hashes to hex and combine into 64-char string\n const hexParts = hashes.map(h => Math.abs(h).toString(16).padStart(8, '0'));\n const combined = hexParts.join('');\n \n // Ensure exactly 64 characters (SHA-256 format)\n return combined.substring(0, 64).padEnd(64, '0');\n }\n}\n\n","/**\n * Fingerprint Component Manager\n * Orchestrates all fingerprint collectors, handles caching, error recovery, and component weighting\n * This is the main entry point for custom fingerprinting (replaces FingerprintJS)\n */\n\nimport { FingerprintComponents, FingerprintData } from '../types/fingerprint';\nimport { CanvasFingerprintCollector } from './canvas-fingerprint';\nimport { WebGLFingerprintCollector } from './webgl-fingerprint';\nimport { AudioFingerprintCollector } from './audio-fingerprint';\nimport { FontDetectionCollector } from './font-detection';\nimport { MediaDevicesCollector } from './media-devices';\nimport { ScreenDisplayCollector } from './screen-display';\nimport { TimezoneLocaleCollector } from './timezone-locale';\nimport { PluginMimeCollector } from './plugin-mime';\nimport { BatteryAPICollector } from './battery-api';\nimport { StorageDatabaseCollector } from './storage-database';\nimport { CPUMemoryCollector } from './cpu-memory';\nimport { TouchPointerCollector } from './touch-pointer';\nimport { PermissionsAPICollector } from './permissions-api';\nimport { WebRTCIPCollector } from './webrtc-ip';\nimport { VisitorIDGenerator } from './visitor-id-generator';\n\nexport class FingerprintManager {\n private collectors: {\n canvas: CanvasFingerprintCollector;\n webgl: WebGLFingerprintCollector;\n audio: AudioFingerprintCollector;\n fonts: FontDetectionCollector;\n mediaDevices: MediaDevicesCollector;\n screen: ScreenDisplayCollector;\n timezone: TimezoneLocaleCollector;\n plugins: PluginMimeCollector;\n battery: BatteryAPICollector;\n storage: StorageDatabaseCollector;\n cpu: CPUMemoryCollector;\n touch: TouchPointerCollector;\n permissions: PermissionsAPICollector;\n webrtc: WebRTCIPCollector;\n };\n\n private visitorIDGenerator: VisitorIDGenerator;\n private cachedData: FingerprintData | null = null;\n private collectionStartTime: number = 0;\n\n constructor() {\n // Initialize all collectors\n this.collectors = {\n canvas: new CanvasFingerprintCollector(),\n webgl: new WebGLFingerprintCollector(),\n audio: new AudioFingerprintCollector(),\n fonts: new FontDetectionCollector(),\n mediaDevices: new MediaDevicesCollector(),\n screen: new ScreenDisplayCollector(),\n timezone: new TimezoneLocaleCollector(),\n plugins: new PluginMimeCollector(),\n battery: new BatteryAPICollector(),\n storage: new StorageDatabaseCollector(),\n cpu: new CPUMemoryCollector(),\n touch: new TouchPointerCollector(),\n permissions: new PermissionsAPICollector(),\n webrtc: new WebRTCIPCollector(),\n };\n\n this.visitorIDGenerator = new VisitorIDGenerator();\n }\n\n /**\n * Collect all fingerprint data\n * This is the main method that replaces FingerprintJS.get()\n */\n async collect(): Promise<FingerprintData> {\n if (this.cachedData) {\n return this.cachedData;\n }\n\n this.collectionStartTime = performance.now();\n\n const components: FingerprintComponents = {};\n\n // Collect synchronous components first (fast)\n try {\n components.canvas = this.collectors.canvas.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Canvas collection failed:', e);\n }\n\n try {\n components.webgl = this.collectors.webgl.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] WebGL collection failed:', e);\n }\n\n try {\n components.fonts = this.collectors.fonts.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Font detection failed:', e);\n }\n\n try {\n components.screen = this.collectors.screen.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Screen collection failed:', e);\n }\n\n try {\n components.timezone = this.collectors.timezone.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Timezone collection failed:', e);\n }\n\n try {\n components.plugins = this.collectors.plugins.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Plugin collection failed:', e);\n }\n\n try {\n components.cpu = this.collectors.cpu.collect();\n } catch (e) {\n console.warn('[Keverd SDK] CPU collection failed:', e);\n }\n\n try {\n components.touch = this.collectors.touch.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Touch collection failed:', e);\n }\n\n // Collect async components (may take longer)\n try {\n components.audio = await this.collectors.audio.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Audio collection failed:', e);\n }\n\n try {\n components.mediaDevices = await this.collectors.mediaDevices.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Media devices collection failed:', e);\n }\n\n try {\n components.battery = await this.collectors.battery.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Battery collection failed:', e);\n }\n\n try {\n components.storage = await this.collectors.storage.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Storage collection failed:', e);\n }\n\n try {\n components.permissions = await this.collectors.permissions.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Permissions collection failed:', e);\n }\n\n try {\n components.webrtc = await this.collectors.webrtc.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] WebRTC collection failed:', e);\n }\n\n // Generate visitor ID from all components\n const visitorId = this.visitorIDGenerator.generate(components);\n\n // Calculate confidence score\n const confidence = this.visitorIDGenerator.calculateConfidence(components);\n\n // const totalDuration = performance.now() - this.collectionStartTime;\n\n this.cachedData = {\n visitorId,\n confidence: Math.round(confidence * 1000) / 1000, // Round to 3 decimal places\n components,\n version: '1.0.0', // SDK version\n timestamp: Date.now(),\n };\n\n return this.cachedData;\n }\n\n /**\n * Get visitor ID only (faster, uses cached data if available)\n */\n async getVisitorId(): Promise<string> {\n const data = await this.collect();\n return data.visitorId;\n }\n\n /**\n * Clear all cached data\n */\n clearCache(): void {\n this.cachedData = null;\n // Clear all collector caches\n Object.values(this.collectors).forEach(collector => {\n if (collector && typeof collector.clearCache === 'function') {\n collector.clearCache();\n }\n });\n }\n\n /**\n * Get collection statistics\n */\n getStats(): {\n componentsCollected: number;\n totalComponents: number;\n collectionTime: number;\n } {\n if (!this.cachedData) {\n return {\n componentsCollected: 0,\n totalComponents: 13,\n collectionTime: 0,\n };\n }\n\n const componentsCollected = Object.keys(this.cachedData.components).length;\n const collectionTime = performance.now() - this.collectionStartTime;\n\n return {\n componentsCollected,\n totalComponents: 13,\n collectionTime: Math.round(collectionTime * 100) / 100,\n };\n }\n}\n\n","/**\n * Privacy Signal Collector\n * Detects incognito mode, VPN/proxy, automation/bots, and ad blockers\n */\n\nexport interface PrivacySignals {\n isIncognito: boolean;\n isVPN: boolean;\n isAutomated: boolean;\n hasAdBlocker: boolean;\n}\n\nexport class PrivacySignalCollector {\n private cachedSignals: PrivacySignals | null = null;\n\n /**\n * Collect all privacy signals\n */\n collect(): PrivacySignals {\n if (this.cachedSignals) {\n return this.cachedSignals;\n }\n\n const signals: PrivacySignals = {\n isIncognito: this.detectIncognito(),\n isVPN: false, // VPN detection requires backend IP analysis\n isAutomated: this.detectAutomation(),\n hasAdBlocker: this.detectAdBlocker(),\n };\n\n this.cachedSignals = signals;\n return signals;\n }\n\n /**\n * Detect incognito/private mode\n * Uses multiple detection methods for accuracy\n */\n private detectIncognito(): boolean {\n try {\n // Method 1: FileSystem API availability\n // In incognito mode, FileSystem API is often unavailable\n if ('storage' in navigator && 'estimate' in navigator.storage) {\n // This will throw in some incognito modes\n try {\n navigator.storage.estimate().then(() => {}).catch(() => {});\n } catch {\n return true;\n }\n }\n\n // Method 2: Storage quota limits\n // Incognito mode often has very limited storage\n // Note: This is async, so we check synchronously if possible\n if ('storage' in navigator && 'estimate' in navigator.storage) {\n // We can't await here, so we'll check synchronously available methods\n // The async check would be done elsewhere if needed\n }\n\n // Method 3: Battery API availability\n // Some browsers disable Battery API in incognito\n // Note: This is async, so we check synchronously if possible\n if ('getBattery' in navigator) {\n // Check if the API exists, but don't call it (async)\n // The actual check would be done elsewhere if needed\n }\n\n // Method 4: Chrome-specific check\n // @ts-ignore - Chrome-specific property\n if ((window as any).chrome && (window as any).chrome.runtime && !(window as any).chrome.runtime.onConnect) {\n return true;\n }\n\n // Method 5: localStorage quota test\n try {\n const testKey = '__incognito_test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n } catch {\n // localStorage blocked - likely incognito\n return true;\n }\n\n return false;\n } catch (error) {\n // If detection fails, assume not incognito (conservative)\n return false;\n }\n }\n\n /**\n * Detect automation/bot frameworks\n */\n private detectAutomation(): boolean {\n try {\n // Method 1: navigator.webdriver property\n // Set by Selenium, Puppeteer, Playwright, etc.\n // @ts-ignore - webdriver property\n if (navigator.webdriver === true) {\n return true;\n }\n\n // Method 2: Chrome DevTools Protocol detection\n // @ts-ignore - Chrome-specific\n if (window.chrome && window.chrome.runtime && window.chrome.runtime.onConnect) {\n // @ts-ignore\n const hasDevTools = window.chrome.runtime.onConnect.hasListeners();\n if (hasDevTools) {\n return true;\n }\n }\n\n // Method 3: Missing browser APIs (headless browsers often lack these)\n if (!(window as any).chrome && !(window as any).safari) {\n // Check for missing APIs that real browsers have\n if (!window.Notification || !(window as any).DeviceMotionEvent) {\n return true;\n }\n }\n\n // Method 4: Canvas fingerprint anomalies\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillText('Automation test', 2, 2);\n const fingerprint = canvas.toDataURL();\n // Headless browsers often produce identical fingerprints\n if (fingerprint.length < 100) {\n return true;\n }\n }\n } catch {\n // Canvas blocked - could indicate automation\n }\n\n // Method 5: Check for automation frameworks\n // @ts-ignore\n if (window.__nightmare || window.__phantomas || window.Buffer) {\n return true;\n }\n\n return false;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Detect ad blocker\n */\n private detectAdBlocker(): boolean {\n try {\n // Method 1: Try to load a known ad URL\n const testDiv = document.createElement('div');\n testDiv.innerHTML = ' ';\n testDiv.className = 'adsbox';\n testDiv.style.position = 'absolute';\n testDiv.style.left = '-9999px';\n document.body.appendChild(testDiv);\n\n // Check if ad blocker removed the element\n setTimeout(() => {\n const isBlocked = testDiv.offsetHeight === 0 || testDiv.offsetWidth === 0;\n document.body.removeChild(testDiv);\n return isBlocked;\n }, 100);\n\n // Method 2: Check for blocked scripts\n const scripts = Array.from(document.getElementsByTagName('script'));\n const blockedCount = scripts.filter((script) => {\n return script.src && script.src.includes('ads') && !script.textContent;\n }).length;\n\n if (blockedCount > 0) {\n return true;\n }\n\n // Method 3: Check for common ad blocker properties\n // @ts-ignore\n if (window.uBlock || window.adblock || window.BlockAdBlock) {\n return true;\n }\n\n return false;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Clear cached signals (useful for testing)\n */\n clearCache(): void {\n this.cachedSignals = null;\n }\n}\n\n","/**\n * Browser Capability Collector\n * Collects browser API availability and capabilities\n */\n\nexport interface BrowserCapabilities {\n hasWebGL: boolean;\n hasCanvas: boolean;\n hasWebRTC: boolean;\n hasServiceWorker: boolean;\n hasIndexedDB: boolean;\n hasLocalStorage: boolean;\n hasSessionStorage: boolean;\n cookieEnabled: boolean;\n doNotTrack: boolean;\n}\n\nexport class BrowserCapabilityCollector {\n private cachedCapabilities: BrowserCapabilities | null = null;\n\n /**\n * Collect all browser capabilities\n */\n collect(): BrowserCapabilities {\n if (this.cachedCapabilities) {\n return this.cachedCapabilities;\n }\n\n const capabilities: BrowserCapabilities = {\n hasWebGL: this.checkWebGL(),\n hasCanvas: this.checkCanvas(),\n hasWebRTC: this.checkWebRTC(),\n hasServiceWorker: this.checkServiceWorker(),\n hasIndexedDB: this.checkIndexedDB(),\n hasLocalStorage: this.checkLocalStorage(),\n hasSessionStorage: this.checkSessionStorage(),\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack === '1' || navigator.doNotTrack === 'yes',\n };\n\n this.cachedCapabilities = capabilities;\n return capabilities;\n }\n\n private checkWebGL(): boolean {\n try {\n const canvas = document.createElement('canvas');\n return !!(canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));\n } catch {\n return false;\n }\n }\n\n private checkCanvas(): boolean {\n try {\n const canvas = document.createElement('canvas');\n return !!canvas.getContext('2d');\n } catch {\n return false;\n }\n }\n\n private checkWebRTC(): boolean {\n return !!(\n (window.RTCPeerConnection ||\n // @ts-ignore\n window.webkitRTCPeerConnection ||\n // @ts-ignore\n window.mozRTCPeerConnection) &&\n navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia\n );\n }\n\n private checkServiceWorker(): boolean {\n return 'serviceWorker' in navigator;\n }\n\n private checkIndexedDB(): boolean {\n return 'indexedDB' in window;\n }\n\n private checkLocalStorage(): boolean {\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n private checkSessionStorage(): boolean {\n try {\n const test = '__sessionStorage_test__';\n sessionStorage.setItem(test, test);\n sessionStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Clear cached capabilities (useful for testing)\n */\n clearCache(): void {\n this.cachedCapabilities = null;\n }\n}\n\n","/**\n * Hardware Signal Collector\n * Collects hardware and network information\n */\n\nexport interface HardwareSignals {\n hardwareConcurrency: number;\n deviceMemory: number | null;\n maxTouchPoints: number;\n connectionType: string | null;\n effectiveType: string | null;\n downlink: number | null;\n rtt: number | null;\n saveData: boolean | null;\n}\n\nexport class HardwareSignalCollector {\n private cachedSignals: HardwareSignals | null = null;\n\n /**\n * Collect all hardware signals\n */\n collect(): HardwareSignals {\n if (this.cachedSignals) {\n return this.cachedSignals;\n }\n\n const signals: HardwareSignals = {\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n deviceMemory: this.getDeviceMemory(),\n maxTouchPoints: navigator.maxTouchPoints || 0,\n connectionType: this.getConnectionType(),\n effectiveType: this.getEffectiveType(),\n downlink: this.getDownlink(),\n rtt: this.getRTT(),\n saveData: this.getSaveData(),\n };\n\n this.cachedSignals = signals;\n return signals;\n }\n\n private getDeviceMemory(): number | null {\n // @ts-ignore - deviceMemory is not in all TypeScript definitions\n if ('deviceMemory' in navigator && navigator.deviceMemory) {\n // @ts-ignore\n return navigator.deviceMemory;\n }\n return null;\n }\n\n private getConnectionType(): string | null {\n // @ts-ignore - Connection API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.type) {\n return connection.type;\n }\n return null;\n }\n\n private getEffectiveType(): string | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.effectiveType) {\n return connection.effectiveType;\n }\n return null;\n }\n\n private getDownlink(): number | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.downlink) {\n return connection.downlink;\n }\n return null;\n }\n\n private getRTT(): number | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.rtt) {\n return connection.rtt;\n }\n return null;\n }\n\n private getSaveData(): boolean | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.saveData !== undefined) {\n return connection.saveData;\n }\n return null;\n }\n\n /**\n * Clear cached signals (useful for testing)\n */\n clearCache(): void {\n this.cachedSignals = null;\n }\n}\n\n","/**\n * Form Interaction Collector\n * Tracks form field interactions: focus/blur, copy/paste, autofill, etc.\n */\n\nexport interface FormInteractions {\n focusCount: number;\n blurCount: number;\n copyCount: number;\n pasteCount: number;\n cutCount: number;\n autofillDetected: boolean;\n autocompleteDetected: boolean;\n fieldFocusOrder: string[];\n timePerField: Record<string, number>;\n backspaceCount: number;\n deleteCount: number;\n}\n\nexport class FormInteractionCollector {\n private focusCount = 0;\n private blurCount = 0;\n private copyCount = 0;\n private pasteCount = 0;\n private cutCount = 0;\n private fieldFocusOrder: string[] = [];\n private fieldFocusTimes: Map<string, number> = new Map();\n private backspaceCount = 0;\n private deleteCount = 0;\n private autofillDetected = false;\n private autocompleteDetected = false;\n private isActive = false;\n\n private focusHandler = (event: FocusEvent) => this.handleFocus(event);\n private blurHandler = (event: FocusEvent) => this.handleBlur(event);\n private copyHandler = (event: ClipboardEvent) => this.handleCopy(event);\n private pasteHandler = (event: ClipboardEvent) => this.handlePaste(event);\n private cutHandler = (event: ClipboardEvent) => this.handleCut(event);\n private keydownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n private inputHandler = (event: Event) => this.handleInput(event);\n\n /**\n * Start collecting form interactions\n */\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n\n document.addEventListener('focus', this.focusHandler, true);\n document.addEventListener('blur', this.blurHandler, true);\n document.addEventListener('copy', this.copyHandler, true);\n document.addEventListener('paste', this.pasteHandler, true);\n document.addEventListener('cut', this.cutHandler, true);\n document.addEventListener('keydown', this.keydownHandler, true);\n document.addEventListener('input', this.inputHandler, true);\n\n this.isActive = true;\n }\n\n /**\n * Stop collecting form interactions\n */\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n\n document.removeEventListener('focus', this.focusHandler, true);\n document.removeEventListener('blur', this.blurHandler, true);\n document.removeEventListener('copy', this.copyHandler, true);\n document.removeEventListener('paste', this.pasteHandler, true);\n document.removeEventListener('cut', this.cutHandler, true);\n document.removeEventListener('keydown', this.keydownHandler, true);\n document.removeEventListener('input', this.inputHandler, true);\n\n this.isActive = false;\n }\n\n /**\n * Get collected form interaction data\n */\n getData(): FormInteractions {\n // Calculate time per field\n const timePerField: Record<string, number> = {};\n this.fieldFocusTimes.forEach((time, fieldId) => {\n timePerField[fieldId] = time;\n });\n\n return {\n focusCount: this.focusCount,\n blurCount: this.blurCount,\n copyCount: this.copyCount,\n pasteCount: this.pasteCount,\n cutCount: this.cutCount,\n autofillDetected: this.autofillDetected,\n autocompleteDetected: this.autocompleteDetected,\n fieldFocusOrder: [...this.fieldFocusOrder],\n timePerField,\n backspaceCount: this.backspaceCount,\n deleteCount: this.deleteCount,\n };\n }\n\n /**\n * Reset all collected data\n */\n reset(): void {\n this.focusCount = 0;\n this.blurCount = 0;\n this.copyCount = 0;\n this.pasteCount = 0;\n this.cutCount = 0;\n this.fieldFocusOrder = [];\n this.fieldFocusTimes.clear();\n this.backspaceCount = 0;\n this.deleteCount = 0;\n this.autofillDetected = false;\n this.autocompleteDetected = false;\n }\n\n private handleFocus(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n if (!this.isFormField(target)) return;\n\n this.focusCount++;\n const fieldId = this.getFieldId(target);\n if (fieldId && !this.fieldFocusOrder.includes(fieldId)) {\n this.fieldFocusOrder.push(fieldId);\n }\n this.fieldFocusTimes.set(fieldId || 'unknown', Date.now());\n }\n\n private handleBlur(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n if (!this.isFormField(target)) return;\n\n this.blurCount++;\n const fieldId = this.getFieldId(target);\n if (fieldId) {\n const focusTime = this.fieldFocusTimes.get(fieldId) || Date.now();\n const timeSpent = Date.now() - focusTime;\n this.fieldFocusTimes.set(fieldId, timeSpent);\n }\n }\n\n private handleCopy(event: ClipboardEvent): void {\n const target = event.target as HTMLElement;\n if (this.isFormField(target)) {\n this.copyCount++;\n }\n }\n\n private handlePaste(event: ClipboardEvent): void {\n const target = event.target as HTMLElement;\n if (this.isFormField(target)) {\n this.pasteCount++;\n }\n }\n\n private handleCut(event: ClipboardEvent): void {\n const target = event.target as HTMLElement;\n if (this.isFormField(target)) {\n this.cutCount++;\n }\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n if (!this.isFormField(target)) return;\n\n if (event.key === 'Backspace') {\n this.backspaceCount++;\n } else if (event.key === 'Delete') {\n this.deleteCount++;\n }\n }\n\n private handleInput(event: Event): void {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n if (!this.isFormField(target)) return;\n\n // Detect autofill/autocomplete\n // Autofill often triggers input events with specific patterns\n const value = target.value;\n if (value && target.type === 'password') {\n // Password autofill detection\n this.autofillDetected = true;\n }\n\n // Check for autocomplete attribute\n if (target.hasAttribute('autocomplete') && target.getAttribute('autocomplete') !== 'off') {\n this.autocompleteDetected = true;\n }\n }\n\n private isFormField(element: HTMLElement | null): boolean {\n if (!element) return false;\n const tagName = element.tagName.toLowerCase();\n return (\n tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select' ||\n element.isContentEditable\n );\n }\n\n private getFieldId(element: HTMLElement): string | null {\n if (element.id) return element.id;\n // Check if element has name property (HTMLInputElement, HTMLSelectElement, etc.)\n if ('name' in element && (element as HTMLInputElement).name) {\n return (element as HTMLInputElement).name;\n }\n if (element.getAttribute('data-field-id')) {\n return element.getAttribute('data-field-id');\n }\n return null;\n }\n}\n\n","/**\n * Page Interaction Collector\n * Tracks page-level interactions: load time, scroll depth, clicks, etc.\n */\n\nexport interface PageInteractions {\n pageLoadTime: number;\n timeToFirstInteraction: number;\n timeOnPage: number;\n scrollDepth: number;\n clickCount: number;\n linkClickCount: number;\n imageViewCount: number;\n videoPlayCount: number;\n}\n\nexport class PageInteractionCollector {\n private pageLoadTime = 0;\n private timeToFirstInteraction = 0;\n private startTime = Date.now();\n private firstInteractionTime: number | null = null;\n private maxScrollDepth = 0;\n private clickCount = 0;\n private linkClickCount = 0;\n private imageViewCount = 0;\n private videoPlayCount = 0;\n private isActive = false;\n\n private clickHandler = (event: MouseEvent) => this.handleClick(event);\n private scrollHandler = () => this.handleScroll();\n private loadHandler = () => this.handleLoad();\n private imageLoadHandler = () => this.handleImageLoad();\n private videoPlayHandler = () => this.handleVideoPlay();\n\n constructor() {\n this.startTime = performance.now();\n }\n\n /**\n * Start collecting page interactions\n */\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n\n // Track page load time\n if (document.readyState === 'complete') {\n this.pageLoadTime = performance.now() - this.startTime;\n } else {\n window.addEventListener('load', this.loadHandler);\n }\n\n document.addEventListener('click', this.clickHandler, true);\n window.addEventListener('scroll', this.scrollHandler, { passive: true });\n document.addEventListener('load', this.imageLoadHandler, true);\n document.addEventListener('play', this.videoPlayHandler, true);\n\n this.isActive = true;\n }\n\n /**\n * Stop collecting page interactions\n */\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n\n window.removeEventListener('load', this.loadHandler);\n document.removeEventListener('click', this.clickHandler, true);\n window.removeEventListener('scroll', this.scrollHandler);\n document.removeEventListener('load', this.imageLoadHandler, true);\n document.removeEventListener('play', this.videoPlayHandler, true);\n\n this.isActive = false;\n }\n\n /**\n * Get collected page interaction data\n */\n getData(): PageInteractions {\n const timeOnPage = Date.now() - this.startTime;\n const scrollDepth = this.calculateScrollDepth();\n\n return {\n pageLoadTime: this.pageLoadTime,\n timeToFirstInteraction: this.firstInteractionTime\n ? this.firstInteractionTime - this.startTime\n : 0,\n timeOnPage,\n scrollDepth,\n clickCount: this.clickCount,\n linkClickCount: this.linkClickCount,\n imageViewCount: this.imageViewCount,\n videoPlayCount: this.videoPlayCount,\n };\n }\n\n /**\n * Reset all collected data\n */\n reset(): void {\n this.pageLoadTime = 0;\n this.timeToFirstInteraction = 0;\n this.startTime = Date.now();\n this.firstInteractionTime = null;\n this.maxScrollDepth = 0;\n this.clickCount = 0;\n this.linkClickCount = 0;\n this.imageViewCount = 0;\n this.videoPlayCount = 0;\n }\n\n private handleLoad(): void {\n this.pageLoadTime = performance.now() - this.startTime;\n }\n\n private handleClick(event: MouseEvent): void {\n if (!this.firstInteractionTime) {\n this.firstInteractionTime = performance.now();\n }\n\n this.clickCount++;\n\n const target = event.target as HTMLElement;\n if (target.tagName.toLowerCase() === 'a' || target.closest('a')) {\n this.linkClickCount++;\n }\n }\n\n private handleScroll(): void {\n const scrollDepth = this.calculateScrollDepth();\n this.maxScrollDepth = Math.max(this.maxScrollDepth, scrollDepth);\n }\n\n private handleImageLoad(): void {\n this.imageViewCount++;\n }\n\n private handleVideoPlay(): void {\n this.videoPlayCount++;\n }\n\n private calculateScrollDepth(): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return 0;\n }\n\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const documentHeight = Math.max(\n document.body.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.clientHeight,\n document.documentElement.scrollHeight,\n document.documentElement.offsetHeight\n );\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\n if (documentHeight === 0) return 0;\n\n const scrolled = scrollTop + windowHeight;\n return Math.min(scrolled / documentHeight, 1.0);\n }\n}\n\n","/**\n * Keverd Fraud SDK Core (Vanilla JS)\n * Main SDK class for fingerprinting and risk assessment\n * Matches backend FingerprintSDKRequest format exactly\n */\n\nimport { SDKConfig, FingerprintRequest, FingerprintResponse, TransactionMetadata } from '../types';\nimport { DeviceCollector } from '../collectors/device';\nimport { BehavioralCollector } from '../collectors/behavioral';\nimport { FingerprintManager } from '../collectors/fingerprint-manager';\nimport { PrivacySignalCollector } from '../collectors/privacy-signals';\nimport { BrowserCapabilityCollector } from '../collectors/browser-capabilities';\nimport { HardwareSignalCollector } from '../collectors/hardware-signals';\nimport { FormInteractionCollector } from '../collectors/form-interactions';\nimport { PageInteractionCollector } from '../collectors/page-interactions';\n\nexport class KeverdSDK {\n private config: SDKConfig | null = null;\n private deviceCollector: DeviceCollector;\n private behavioralCollector: BehavioralCollector;\n private fingerprintManager: FingerprintManager;\n private privacySignalCollector: PrivacySignalCollector;\n private browserCapabilityCollector: BrowserCapabilityCollector;\n private hardwareSignalCollector: HardwareSignalCollector;\n private formInteractionCollector: FormInteractionCollector;\n private pageInteractionCollector: PageInteractionCollector;\n private isInitialized = false;\n private sessionId: string | null = null;\n\n constructor() {\n this.deviceCollector = new DeviceCollector();\n this.behavioralCollector = new BehavioralCollector();\n this.fingerprintManager = new FingerprintManager();\n this.privacySignalCollector = new PrivacySignalCollector();\n this.browserCapabilityCollector = new BrowserCapabilityCollector();\n this.hardwareSignalCollector = new HardwareSignalCollector();\n this.formInteractionCollector = new FormInteractionCollector();\n this.pageInteractionCollector = new PageInteractionCollector();\n }\n\n /**\n * Initialize the SDK with configuration\n */\n init(config: SDKConfig | string): void {\n if (this.isInitialized) {\n if (this.config?.debug) {\n console.warn('[Keverd SDK] Already initialized');\n }\n return;\n }\n\n // Handle simplified API key only initialization\n if (typeof config === 'string') {\n this.config = {\n apiKey: config,\n endpoint: 'https://api.keverd.com',\n debug: false,\n };\n } else {\n this.config = {\n endpoint: 'https://api.keverd.com',\n debug: false,\n ...config,\n };\n }\n\n // Start behavioral collection (non-blocking, passive listeners)\n this.behavioralCollector.start();\n this.formInteractionCollector.start();\n this.pageInteractionCollector.start();\n\n // Generate session ID\n this.sessionId = this.generateSessionId();\n\n this.isInitialized = true;\n\n if (this.config.debug) {\n console.log('[Keverd SDK] Initialized successfully', {\n endpoint: this.config.endpoint,\n });\n }\n }\n\n /**\n * Get visitor data (fingerprint and risk assessment)\n * This is the main method for getting risk scores\n */\n async getVisitorData(): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n try {\n // Collect device information\n const deviceInfo = this.deviceCollector.collect();\n\n // Collect behavioral data\n const behavioralData = this.behavioralCollector.getData();\n\n // Collect custom fingerprint data (async) - replaces FingerprintJS\n const fingerprintData = await this.fingerprintManager.collect();\n \n // Transform to match existing FingerprintJSData interface for backend compatibility\n const fingerprintjsData = {\n visitorId: fingerprintData.visitorId,\n confidence: fingerprintData.confidence,\n components: fingerprintData.components,\n };\n\n // Collect privacy signals\n const privacySignals = this.privacySignalCollector.collect();\n\n // Collect browser capabilities\n const browserCapabilities = this.browserCapabilityCollector.collect();\n\n // Collect hardware signals\n const hardwareSignals = this.hardwareSignalCollector.collect();\n\n // Collect form interactions\n const formInteractions = this.formInteractionCollector.getData();\n\n // Collect mouse signals from kinematic engine\n const mouseSignals = this.behavioralCollector.getMouseSignals();\n\n // Collect keyboard signals from keystroke monitor\n const keyboardSignals = this.behavioralCollector.getKeyboardSignals();\n\n // Collect page interactions\n const pageInteractions = this.pageInteractionCollector.getData();\n\n // Extract network signals from hardware signals\n const networkSignals = {\n connectionType: hardwareSignals.connectionType || undefined,\n effectiveType: hardwareSignals.effectiveType || undefined,\n downlink: hardwareSignals.downlink || undefined,\n rtt: hardwareSignals.rtt || undefined,\n saveData: hardwareSignals.saveData || undefined,\n };\n\n // Build session info\n const sessionInfo = {\n sessionId: this.sessionId || undefined,\n timestamp: new Date().toISOString(),\n };\n\n // Build request in SDK format (matches backend FingerprintSDKRequest)\n const request: FingerprintRequest = {\n userId: this.config.userId,\n device: deviceInfo,\n session: sessionInfo,\n behavioral: behavioralData,\n fingerprintjs: fingerprintjsData || undefined,\n privacySignals,\n browserCapabilities,\n hardwareSignals,\n formInteractions,\n mouseSignals,\n keyboardSignals,\n pageInteractions,\n networkSignals,\n useCase: 'general',\n // Note: sim field is NOT included for web SDKs\n };\n\n // Send to backend\n const response = await this.sendFingerprintRequest(request);\n\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n \n if (this.config.debug) {\n console.error('[Keverd SDK] Error getting visitor data:', error);\n }\n\n throw new Error(`Failed to get visitor data: ${errorMessage}`);\n }\n }\n\n /**\n * Create transaction ID with risk assessment (legacy method)\n * For new implementations, use getVisitorData() instead\n */\n async createTransactionID(_metadata?: TransactionMetadata): Promise<string> {\n const response = await this.getVisitorData();\n // Return session_id as transaction ID for backward compatibility\n return response.session_id;\n }\n\n /**\n * Verify user identity during login attempts\n */\n async verifyLogin(userId?: string, metadata?: Record<string, unknown>): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('login', { userId, metadata });\n return response;\n }\n\n /**\n * Verify user during checkout/payment\n */\n async verifyCheckout(\n amount?: number,\n currency?: string,\n metadata?: Record<string, unknown>\n ): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('checkout', { amount, currency, metadata });\n return response;\n }\n\n /**\n * Detect fake/bot registrations\n */\n async verifyRegistration(metadata?: Record<string, unknown>): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('registration', { metadata });\n return response;\n }\n\n /**\n * Detect account takeover attempts during password reset\n */\n async verifyPasswordReset(email?: string, metadata?: Record<string, unknown>): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('password_reset', { email, metadata });\n return response;\n }\n\n /**\n * Verify sensitive account changes (email, phone, password)\n */\n async verifyAccountChange(\n changeType?: string,\n metadata?: Record<string, unknown>\n ): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('account_change', { changeType, metadata });\n return response;\n }\n\n /**\n * Helper to send verify request to use-case-specific endpoint\n */\n private async sendVerifyRequest(\n useCase: string,\n options: {\n userId?: string;\n amount?: number;\n currency?: string;\n email?: string;\n changeType?: string;\n metadata?: Record<string, unknown>;\n }\n ): Promise<FingerprintResponse> {\n if (!this.config) {\n throw new Error('SDK not initialized');\n }\n\n // Collect all signals (same as getVisitorData)\n const deviceInfo = this.deviceCollector.collect();\n const behavioralData = this.behavioralCollector.getData();\n \n // Collect custom fingerprint data (async) - replaces FingerprintJS\n const fingerprintData = await this.fingerprintManager.collect();\n \n // Transform to match existing FingerprintJSData interface for backend compatibility\n const fingerprintjsData = {\n visitorId: fingerprintData.visitorId,\n confidence: fingerprintData.confidence,\n components: fingerprintData.components,\n };\n \n const privacySignals = this.privacySignalCollector.collect();\n const browserCapabilities = this.browserCapabilityCollector.collect();\n const hardwareSignals = this.hardwareSignalCollector.collect();\n const formInteractions = this.formInteractionCollector.getData();\n const mouseSignals = this.behavioralCollector.getMouseSignals();\n const keyboardSignals = this.behavioralCollector.getKeyboardSignals();\n const pageInteractions = this.pageInteractionCollector.getData();\n\n const networkSignals = {\n connectionType: hardwareSignals.connectionType || undefined,\n effectiveType: hardwareSignals.effectiveType || undefined,\n downlink: hardwareSignals.downlink || undefined,\n rtt: hardwareSignals.rtt || undefined,\n saveData: hardwareSignals.saveData || undefined,\n };\n\n const sessionInfo = {\n sessionId: this.sessionId || undefined,\n timestamp: new Date().toISOString(),\n };\n\n // Build request with use case\n const request: FingerprintRequest = {\n userId: options.userId || this.config.userId,\n device: deviceInfo,\n session: sessionInfo,\n behavioral: behavioralData,\n fingerprintjs: fingerprintjsData || undefined,\n privacySignals,\n browserCapabilities,\n hardwareSignals,\n formInteractions,\n mouseSignals,\n keyboardSignals,\n pageInteractions,\n networkSignals,\n useCase,\n };\n\n // Merge metadata into request\n if (options.metadata) {\n Object.assign(request, options.metadata);\n }\n if (options.amount !== undefined) {\n (request as any).amount = options.amount;\n }\n if (options.currency) {\n (request as any).currency = options.currency;\n }\n if (options.email) {\n (request as any).email = options.email;\n }\n if (options.changeType) {\n (request as any).changeType = options.changeType;\n }\n\n const endpoint = this.config.endpoint || 'https://api.keverd.com';\n const url = `${endpoint}/fingerprint/verify/${useCase}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SDK-Source': 'javascript',\n };\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const data: FingerprintResponse = await response.json();\n return data;\n }\n\n /**\n * Send fingerprint request to backend\n */\n private async sendFingerprintRequest(\n request: FingerprintRequest\n ): Promise<FingerprintResponse> {\n if (!this.config) {\n throw new Error('SDK not initialized');\n }\n\n const endpoint = this.config.endpoint || 'https://api.keverd.com';\n const url = `${endpoint}/fingerprint/score`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SDK-Source': 'javascript', // Identify SDK source for backend analytics\n };\n\n // Add API key to headers (support multiple header formats)\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const data: FingerprintResponse = await response.json();\n return data;\n }\n\n /**\n * Generate a unique session ID\n */\n private generateSessionId(): string {\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Destroy the SDK instance\n */\n destroy(): void {\n this.behavioralCollector.stop();\n this.formInteractionCollector.stop();\n this.pageInteractionCollector.stop();\n this.fingerprintManager.clearCache();\n this.isInitialized = false;\n \n // Log debug message BEFORE nulling config\n if (this.config?.debug) {\n console.log('[Keverd SDK] Destroyed');\n }\n \n this.config = null;\n this.sessionId = null;\n }\n\n /**\n * Check if SDK is initialized and ready to use\n */\n isReady(): boolean {\n return this.isInitialized && this.config !== null;\n }\n}\n\n// Export singleton instance for convenience\nexport const Keverd = new KeverdSDK();\n","/**\n * Angular service for Keverd SDK\n * Provides RxJS observables for reactive data access\n * Wraps the web SDK to provide Angular-specific interface with all enhanced signals\n */\n\nimport { Injectable, Inject, Optional } from '@angular/core';\nimport { Observable, from, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport type {\n KeverdConfig,\n KeverdVisitorData,\n KeverdVisitorDataOptions,\n KeverdError,\n} from '../types';\n// Import web SDK - in production this would be @keverdjs/fraud-sdk\n// For local development, we reference it relatively\nimport { Keverd as WebSDK } from '../../../fraud-sdk/src/index';\nimport type { FingerprintResponse } from '../../../fraud-sdk/src/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class KeverdService {\n private config: KeverdConfig | null = null;\n private isInitialized = false;\n\n constructor(@Optional() @Inject('KEVERD_CONFIG') config?: KeverdConfig) {\n // Web SDK handles all collectors including FingerprintJS\n\n if (config) {\n this.init(config);\n }\n }\n\n /**\n * Initialize the SDK with configuration\n * Wraps the web SDK initialization\n */\n init(config: KeverdConfig): void {\n if (this.isInitialized) {\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[Keverd SDK] Already initialized');\n }\n return;\n }\n\n if (!config.apiKey) {\n throw new Error('Keverd SDK: apiKey is required');\n }\n\n this.config = {\n endpoint: config.endpoint || this.getDefaultEndpoint(),\n debug: false,\n ...config,\n };\n\n // Initialize the web SDK with all enhanced signals including FingerprintJS\n WebSDK.init({\n apiKey: this.config.apiKey,\n endpoint: this.config.endpoint,\n userId: this.config.userId,\n debug: this.config.debug || false,\n });\n\n this.isInitialized = true;\n\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.log('[Keverd SDK] Initialized successfully', {\n endpoint: this.config.endpoint,\n });\n }\n }\n\n /**\n * Get visitor data (fingerprint and risk assessment)\n * Returns an RxJS Observable\n */\n getVisitorData(options?: KeverdVisitorDataOptions): Observable<KeverdVisitorData> {\n if (!this.isInitialized || !this.config) {\n const error: KeverdError = {\n message: 'Keverd SDK not initialized. Call init() first.',\n code: 'SDK_NOT_INITIALIZED',\n };\n return throwError(() => error);\n }\n\n return from(this.collectAndSendFingerprint(options)).pipe(\n map((response) => this.transformResponse(response)),\n catchError((error) => {\n const keverdError: KeverdError = {\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'FETCH_ERROR',\n };\n\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.error('[Keverd SDK] Error getting visitor data:', error);\n }\n\n return throwError(() => keverdError);\n })\n );\n }\n\n /**\n * Collect data and send fingerprint request\n * Uses the web SDK which includes all enhanced signals including FingerprintJS\n */\n private async collectAndSendFingerprint(\n _options?: KeverdVisitorDataOptions\n ): Promise<FingerprintResponse> {\n if (!this.config) {\n throw new Error('SDK not initialized');\n }\n\n // Use web SDK which includes all enhanced signals:\n // - FingerprintJS visitor ID\n // - Privacy signals (incognito, VPN, automation, ad blocker)\n // - Browser capabilities\n // - Hardware signals\n // - Form interactions\n // - Mouse signals\n // - Keyboard signals\n // - Page interactions\n // - Network signals\n return await WebSDK.getVisitorData();\n }\n\n /**\n * Transform API response to visitor data format\n */\n private transformResponse(response: FingerprintResponse): KeverdVisitorData {\n return {\n visitorId: response.requestId,\n riskScore: response.risk_score,\n score: response.score,\n action: response.action,\n reasons: response.reason || [],\n sessionId: response.session_id,\n requestId: response.requestId,\n simSwapEngine: response.sim_swap_engine,\n confidence: response.confidence || (1.0 - response.score),\n // Enhanced fields\n fingerprintjsVisitorId: response.fingerprintjs_visitor_id,\n privacySignals: response.privacy_signals ? {\n isIncognito: response.privacy_signals.is_incognito,\n isVPN: response.privacy_signals.is_vpn,\n isAutomated: response.privacy_signals.is_automated,\n hasAdBlocker: response.privacy_signals.has_ad_blocker,\n } : undefined,\n deviceMatch: response.device_match,\n fraudProbability: response.fraud_probability,\n recommendedAction: response.recommended_action,\n };\n }\n\n /**\n * Get default endpoint\n */\n private getDefaultEndpoint(): string {\n return 'https://api.keverd.com';\n }\n\n /**\n * Generate a session ID\n */\n private generateSessionId(): string {\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Destroy the SDK instance\n */\n destroy(): void {\n WebSDK.destroy();\n this.isInitialized = false;\n this.config = null;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): KeverdConfig | null {\n return this.config;\n }\n\n /**\n * Check if SDK is initialized\n */\n isReady(): boolean {\n return this.isInitialized;\n }\n}\n","/**\n * Angular module for Keverd SDK\n * Provides module configuration for easy setup\n */\n\nimport { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { KeverdService } from './services/keverd.service';\nimport type { KeverdConfig } from './types';\n\n@NgModule({\n imports: [CommonModule],\n providers: [KeverdService],\n})\nexport class KeverdModule {\n /**\n * Configure the module with SDK settings\n * Call this in your app.module.ts imports array\n * \n * @example\n * ```typescript\n * @NgModule({\n * imports: [\n * KeverdModule.forRoot({\n * apiKey: 'your-api-key',\n * endpoint: 'https://api.keverd.com'\n * })\n * ]\n * })\n * export class AppModule {}\n * ```\n */\n static forRoot(config: KeverdConfig): ModuleWithProviders<KeverdModule> {\n return {\n ngModule: KeverdModule,\n providers: [\n KeverdService,\n {\n provide: 'KEVERD_CONFIG',\n useValue: config,\n },\n ],\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../fraud-sdk/src/collectors/device.ts","../../fraud-sdk/src/collectors/kinematic-engine.ts","../../fraud-sdk/src/collectors/keystroke-monitor.ts","../../fraud-sdk/src/collectors/behavioral.ts","../../fraud-sdk/src/collectors/canvas-fingerprint.ts","../../fraud-sdk/src/collectors/webgl-fingerprint.ts","../../fraud-sdk/src/collectors/audio-fingerprint.ts","../../fraud-sdk/src/collectors/font-detection.ts","../../fraud-sdk/src/collectors/media-devices.ts","../../fraud-sdk/src/collectors/screen-display.ts","../../fraud-sdk/src/collectors/timezone-locale.ts","../../fraud-sdk/src/collectors/plugin-mime.ts","../../fraud-sdk/src/collectors/battery-api.ts","../../fraud-sdk/src/collectors/storage-database.ts","../../fraud-sdk/src/collectors/cpu-memory.ts","../../fraud-sdk/src/collectors/touch-pointer.ts","../../fraud-sdk/src/collectors/permissions-api.ts","../../fraud-sdk/src/collectors/webrtc-ip.ts","../../fraud-sdk/src/collectors/visitor-id-generator.ts","../../fraud-sdk/src/collectors/fingerprint-manager.ts","../../fraud-sdk/src/collectors/privacy-signals.ts","../../fraud-sdk/src/collectors/browser-capabilities.ts","../../fraud-sdk/src/collectors/hardware-signals.ts","../../fraud-sdk/src/collectors/form-interactions.ts","../../fraud-sdk/src/collectors/page-interactions.ts","../../fraud-sdk/src/core/sdk.ts","../src/services/keverd.service.ts","../src/keverd.module.ts"],"names":["vendor","combined","window","KeverdService","throwError","from","map","catchError","Injectable","Optional","KeverdModule","NgModule","CommonModule"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Device Fingerprint Collector\n * Collects device information and generates SHA-256 fingerprint\n * Matches React SDK implementation for consistency\n */\n\nimport { DeviceInfo } from '../types';\n\nexport class DeviceCollector {\n private cachedDeviceInfo: DeviceInfo | null = null;\n\n /**\n * Collect all device information and generate fingerprint\n */\n collect(): DeviceInfo {\n if (this.cachedDeviceInfo) {\n return this.cachedDeviceInfo;\n }\n\n const fingerprint = this.generateDeviceFingerprint();\n const deviceId = this.generateDeviceId(fingerprint);\n\n this.cachedDeviceInfo = {\n deviceId,\n fingerprint,\n manufacturer: this.getManufacturer(),\n model: this.getModel(),\n brand: this.getBrand(),\n device: this.getDevice(),\n product: this.getProduct(),\n hardware: this.getHardware(),\n sdkVersion: '1.0.0',\n osVersion: this.getOSVersion(),\n screenWidth: String(screen.width),\n screenHeight: String(screen.height),\n screenDensity: this.getScreenDensity(),\n locale: navigator.language || navigator.languages?.[0] || 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n\n return this.cachedDeviceInfo;\n }\n\n /**\n * Generate a stable device fingerprint using multiple browser characteristics\n * Returns SHA-256 hash (64 hex characters) as required by backend\n */\n private generateDeviceFingerprint(): string {\n const components: string[] = [];\n\n // Canvas fingerprint\n const canvasFingerprint = this.getCanvasFingerprint();\n if (canvasFingerprint) components.push(canvasFingerprint);\n\n // WebGL fingerprint\n const webglFingerprint = this.getWebGLFingerprint();\n if (webglFingerprint) components.push(webglFingerprint);\n\n // User agent\n components.push(navigator.userAgent);\n\n // Language\n components.push(navigator.language || navigator.languages?.[0] || '');\n\n // Screen properties\n components.push(`${screen.width}x${screen.height}x${screen.colorDepth}`);\n\n // Timezone offset\n components.push(String(new Date().getTimezoneOffset()));\n\n // Platform\n components.push(navigator.platform);\n\n // Hardware concurrency\n components.push(String(navigator.hardwareConcurrency || 0));\n\n // Device memory (if available)\n if ('deviceMemory' in navigator) {\n components.push(String((navigator as any).deviceMemory));\n }\n\n // Max touch points\n if ('maxTouchPoints' in navigator) {\n components.push(String((navigator as any).maxTouchPoints));\n }\n\n // Plugins (limited for privacy)\n if (navigator.plugins && navigator.plugins.length > 0) {\n const pluginNames = Array.from(navigator.plugins)\n .slice(0, 3)\n .map(p => p.name)\n .join(',');\n components.push(pluginNames);\n }\n\n // Combine and hash with SHA-256-like algorithm\n const combined = components.join('|');\n return this.hashString(combined);\n }\n\n /**\n * Generate canvas fingerprint\n */\n private getCanvasFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) return '';\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(125, 1, 62, 20);\n ctx.fillStyle = '#069';\n ctx.fillText('KeverdFingerprint', 2, 15);\n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';\n ctx.fillText('KeverdFingerprint', 4, 17);\n\n return this.hashString(canvas.toDataURL());\n } catch (error) {\n return '';\n }\n }\n\n /**\n * Generate WebGL fingerprint\n */\n private getWebGLFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || \n canvas.getContext('experimental-webgl') as WebGLRenderingContext | null;\n \n if (!gl) return '';\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n return this.hashString(`${vendor}|${renderer}`);\n }\n\n const version = gl.getParameter(gl.VERSION);\n const vendor = gl.getParameter(gl.VENDOR);\n return this.hashString(`${version}|${vendor}`);\n } catch (error) {\n return '';\n }\n }\n\n /**\n * Generate a stable device ID from fingerprint\n */\n private generateDeviceId(fingerprint: string): string {\n // Use fingerprint as device ID (already a hash)\n return fingerprint.substring(0, 32);\n }\n\n /**\n * Get manufacturer from user agent\n */\n private getManufacturer(): string | undefined {\n const ua = navigator.userAgent.toLowerCase();\n if (ua.includes('iphone') || ua.includes('ipad')) return 'Apple';\n if (ua.includes('android')) {\n const match = ua.match(/(?:^|\\s)([a-z]+)(?:\\s|$)/);\n return match ? match[1].charAt(0).toUpperCase() + match[1].slice(1) : undefined;\n }\n return undefined;\n }\n\n /**\n * Get model from user agent\n */\n private getModel(): string | undefined {\n const ua = navigator.userAgent;\n const match = ua.match(/(iPhone|iPad|Android)[\\s\\/]+([\\w]+)/i);\n return match ? match[2] : undefined;\n }\n\n /**\n * Get brand from user agent\n */\n private getBrand(): string | undefined {\n return this.getManufacturer();\n }\n\n /**\n * Get device type\n */\n private getDevice(): string | undefined {\n const ua = navigator.userAgent.toLowerCase();\n if (ua.includes('mobile')) return 'mobile';\n if (ua.includes('tablet')) return 'tablet';\n return 'desktop';\n }\n\n /**\n * Get product name\n */\n private getProduct(): string | undefined {\n const ua = navigator.userAgent;\n const match = ua.match(/(iPhone|iPad|Android|Windows|Mac|Linux)/i);\n return match ? match[1] : undefined;\n }\n\n /**\n * Get hardware info\n */\n private getHardware(): string | undefined {\n const ua = navigator.userAgent;\n const match = ua.match(/\\(([^)]+)\\)/);\n return match ? match[1] : undefined;\n }\n\n /**\n * Get OS version\n */\n private getOSVersion(): string | undefined {\n const ua = navigator.userAgent;\n const patterns = [\n /OS\\s+([\\d_]+)/i, // iOS\n /Android\\s+([\\d.]+)/i, // Android\n /Windows\\s+([\\d.]+)/i, // Windows\n /Mac\\s+OS\\s+X\\s+([\\d_]+)/i, // macOS\n /Linux/i, // Linux\n ];\n\n for (const pattern of patterns) {\n const match = ua.match(pattern);\n if (match) {\n return match[1]?.replace(/_/g, '.') || match[0];\n }\n }\n\n return undefined;\n }\n\n /**\n * Get screen density\n */\n private getScreenDensity(): string | undefined {\n if (window.devicePixelRatio) {\n return String(window.devicePixelRatio);\n }\n return undefined;\n }\n\n /**\n * Hash a string using SHA-256-like algorithm (64 hex characters)\n * Backend expects SHA-256 format (64 hex chars)\n */\n private hashString(str: string): string {\n return this.sha256LikeHash(str);\n }\n\n /**\n * SHA-256-like hash function (synchronous, deterministic)\n * Produces 64-character hex string matching SHA-256 format\n */\n private sha256LikeHash(str: string): string {\n // Create multiple hash passes for better distribution\n const hashes: number[] = [];\n \n // Pass 1: Standard djb2\n let h1 = 5381;\n for (let i = 0; i < str.length; i++) {\n h1 = ((h1 << 5) + h1) + str.charCodeAt(i);\n h1 = h1 & 0xFFFFFFFF;\n }\n hashes.push(h1);\n \n // Pass 2: Reverse string\n let h2 = 0;\n for (let i = str.length - 1; i >= 0; i--) {\n h2 = ((h2 << 7) - h2) + str.charCodeAt(i);\n h2 = h2 & 0xFFFFFFFF;\n }\n hashes.push(h2);\n \n // Pass 3: XOR with position\n let h3 = 0;\n for (let i = 0; i < str.length; i++) {\n h3 = h3 ^ (str.charCodeAt(i) << ((i % 4) * 8));\n h3 = h3 & 0xFFFFFFFF;\n }\n hashes.push(h3);\n \n // Pass 4: Multiplicative hash\n let h4 = 0;\n for (let i = 0; i < str.length; i++) {\n h4 = (h4 * 31 + str.charCodeAt(i)) & 0xFFFFFFFF;\n }\n hashes.push(h4);\n \n // Pass 5: Rotating hash\n let h5 = 0;\n for (let i = 0; i < str.length; i++) {\n const rotated = ((str.charCodeAt(i) << (i % 16)) | (str.charCodeAt(i) >>> (32 - (i % 16)))) & 0xFFFFFFFF;\n h5 = (h5 + rotated) & 0xFFFFFFFF;\n }\n hashes.push(h5);\n \n // Pass 6: FNV-1a variant\n let h6 = 2166136261;\n for (let i = 0; i < str.length; i++) {\n h6 = (h6 ^ str.charCodeAt(i)) * 16777619;\n h6 = h6 & 0xFFFFFFFF;\n }\n hashes.push(h6);\n \n // Pass 7: Position-weighted hash\n let h7 = 0;\n for (let i = 0; i < str.length; i++) {\n h7 = (h7 + str.charCodeAt(i) * (i + 1)) & 0xFFFFFFFF;\n }\n hashes.push(h7);\n \n // Pass 8: Combined character codes\n let h8 = 0;\n for (let i = 0; i < str.length; i += 2) {\n const combined = str.charCodeAt(i) + (str.charCodeAt(i + 1) || 0) * 256;\n h8 = ((h8 << 3) - h8) + combined;\n h8 = h8 & 0xFFFFFFFF;\n }\n hashes.push(h8);\n \n // Convert all hashes to hex and combine into 64-char string\n const hexParts = hashes.map(h => Math.abs(h).toString(16).padStart(8, '0'));\n const combined = hexParts.join('');\n \n // Ensure exactly 64 characters (SHA-256 format)\n return combined.substring(0, 64).padEnd(64, '0');\n }\n\n /**\n * Clear cached device info (useful for testing)\n */\n clearCache(): void {\n this.cachedDeviceInfo = null;\n }\n}\n\n","import { KinematicFeatureVector } from '../types';\n\nconst VELOCITY_SPIKE_THRESHOLD = 2.5; // px/ms threshold for suspicious swipes\nconst WINDOW_LIMIT = 200; // cap internal buffer to avoid unbounded growth\n\ntype PointerPoint = {\n x: number;\n y: number;\n timestamp: number;\n type: 'move' | 'down' | 'up';\n};\n\nexport type KinematicEngineEvent = 'mousemove' | 'mousedown' | 'mouseup';\n\ninterface KinematicEngineOptions {\n onEvent?: (event: KinematicEngineEvent) => void;\n maskValue?: number;\n}\n\nexport class KinematicEngine {\n private featureVectors: KinematicFeatureVector[] = [];\n private pointerQueue: PointerPoint[] = [];\n private lastVelocity = 0;\n private lastAcceleration = 0;\n private lastAngle = 0;\n private lastPoint: PointerPoint | null = null;\n private secondLastPoint: PointerPoint | null = null;\n private rafId: number | null = null;\n private maxSwipeVelocity = 0;\n private onEvent?: (event: KinematicEngineEvent) => void;\n private maskValue: number;\n private isActive = false;\n // Enhanced tracking\n private clickCount = 0;\n private rightClickCount = 0;\n private doubleClickCount = 0;\n private totalMouseDistance = 0;\n private lastClickTime = 0;\n private scrollDistance = 0;\n private lastScrollTop = 0;\n private touchEventCount = 0;\n\n private mouseMoveHandler = (event: MouseEvent) => this.enqueuePoint(event, 'move');\n private mouseDownHandler = (event: MouseEvent) => {\n this.enqueuePoint(event, 'down');\n this.handleClick(event);\n };\n private mouseUpHandler = (event: MouseEvent) => this.enqueuePoint(event, 'up');\n private contextMenuHandler = (event: MouseEvent) => this.handleRightClick(event);\n private scrollHandler = () => this.handleScroll();\n private touchStartHandler = () => this.handleTouch();\n private touchMoveHandler = () => this.handleTouch();\n private touchEndHandler = () => this.handleTouch();\n\n constructor(options: KinematicEngineOptions = {}) {\n this.onEvent = options.onEvent;\n this.maskValue = options.maskValue ?? -1;\n }\n\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n document.addEventListener('mousemove', this.mouseMoveHandler, { passive: true });\n document.addEventListener('mousedown', this.mouseDownHandler, { passive: true });\n document.addEventListener('mouseup', this.mouseUpHandler, { passive: true });\n document.addEventListener('contextmenu', this.contextMenuHandler, { passive: true });\n window.addEventListener('scroll', this.scrollHandler, { passive: true });\n document.addEventListener('touchstart', this.touchStartHandler, { passive: true });\n document.addEventListener('touchmove', this.touchMoveHandler, { passive: true });\n document.addEventListener('touchend', this.touchEndHandler, { passive: true });\n this.lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\n this.isActive = true;\n }\n\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n document.removeEventListener('mousemove', this.mouseMoveHandler);\n document.removeEventListener('mousedown', this.mouseDownHandler);\n document.removeEventListener('mouseup', this.mouseUpHandler);\n document.removeEventListener('contextmenu', this.contextMenuHandler);\n window.removeEventListener('scroll', this.scrollHandler);\n document.removeEventListener('touchstart', this.touchStartHandler);\n document.removeEventListener('touchmove', this.touchMoveHandler);\n document.removeEventListener('touchend', this.touchEndHandler);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.isActive = false;\n }\n\n getVectors(): KinematicFeatureVector[] {\n return this.featureVectors;\n }\n\n getSuspiciousSwipeVelocity(): number {\n return this.maxSwipeVelocity;\n }\n\n /**\n * Get enhanced mouse/touch signals\n */\n getMouseSignals(): {\n totalDistance: number;\n averageVelocity: number;\n clickCount: number;\n rightClickCount: number;\n doubleClickCount: number;\n scrollDistance: number;\n scrollDirection: 'up' | 'down' | 'both';\n touchEvents: number;\n } {\n const averageVelocity = this.featureVectors.length > 0\n ? this.featureVectors.reduce((sum, v) => sum + v.velocity, 0) / this.featureVectors.length\n : 0;\n\n const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollDiff = Math.abs(currentScrollTop - this.lastScrollTop);\n const scrollDirection: 'up' | 'down' | 'both' = currentScrollTop > this.lastScrollTop ? 'down' : 'up';\n\n return {\n totalDistance: this.totalMouseDistance,\n averageVelocity,\n clickCount: this.clickCount,\n rightClickCount: this.rightClickCount,\n doubleClickCount: this.doubleClickCount,\n scrollDistance: this.scrollDistance + scrollDiff,\n scrollDirection,\n touchEvents: this.touchEventCount,\n };\n }\n\n reset(): void {\n this.featureVectors = [];\n this.pointerQueue = [];\n this.lastVelocity = 0;\n this.lastAcceleration = 0;\n this.lastAngle = 0;\n this.lastPoint = null;\n this.secondLastPoint = null;\n this.maxSwipeVelocity = 0;\n this.clickCount = 0;\n this.rightClickCount = 0;\n this.doubleClickCount = 0;\n this.totalMouseDistance = 0;\n this.lastClickTime = 0;\n this.scrollDistance = 0;\n this.lastScrollTop = 0;\n this.touchEventCount = 0;\n }\n\n private enqueuePoint(event: MouseEvent, type: PointerPoint['type']): void {\n const point: PointerPoint = {\n x: event.clientX,\n y: event.clientY,\n timestamp: performance.now(),\n type,\n };\n this.pointerQueue.push(point);\n if (this.pointerQueue.length > WINDOW_LIMIT) {\n this.pointerQueue.shift();\n }\n if (this.onEvent) {\n this.onEvent(type === 'move' ? 'mousemove' : type === 'down' ? 'mousedown' : 'mouseup');\n }\n this.scheduleProcess();\n }\n\n private scheduleProcess(): void {\n if (this.rafId !== null) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.processQueue();\n if (this.pointerQueue.length > 0) {\n this.scheduleProcess();\n }\n });\n }\n\n private processQueue(): void {\n while (this.pointerQueue.length > 0) {\n const point = this.pointerQueue.shift()!;\n this.computeFeatures(point);\n this.secondLastPoint = this.lastPoint;\n this.lastPoint = point;\n }\n }\n\n private computeFeatures(point: PointerPoint): void {\n if (!this.lastPoint) {\n this.lastPoint = point;\n this.lastAngle = 0;\n return;\n }\n\n const dt = point.timestamp - this.lastPoint.timestamp;\n if (dt <= 0) {\n return;\n }\n\n const dx = point.x - this.lastPoint.x;\n const dy = point.y - this.lastPoint.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n this.totalMouseDistance += distance; // Track total mouse movement distance\n const velocity = distance / dt;\n const acceleration = (velocity - this.lastVelocity) / dt;\n const jerk = (acceleration - this.lastAcceleration) / dt;\n\n const angle = Math.atan2(dy, dx);\n const angularVelocity = this.normalizeAngle(angle - this.lastAngle) / dt;\n\n const curvature = this.calculateCurvature(point);\n\n this.featureVectors.push({\n timestamp: point.timestamp,\n velocity,\n acceleration,\n jerk,\n curvature,\n angularVelocity,\n });\n\n this.maxSwipeVelocity = Math.max(this.maxSwipeVelocity, velocity);\n\n if (velocity > VELOCITY_SPIKE_THRESHOLD) {\n // Mark suspicious spike as a strong signal\n this.featureVectors.push({\n timestamp: point.timestamp,\n velocity,\n acceleration,\n jerk,\n curvature,\n angularVelocity: angularVelocity * 1.2,\n });\n }\n\n if (this.featureVectors.length > WINDOW_LIMIT) {\n this.featureVectors.splice(0, this.featureVectors.length - WINDOW_LIMIT);\n }\n\n this.lastVelocity = velocity;\n this.lastAcceleration = acceleration;\n this.lastAngle = angle;\n }\n\n private calculateCurvature(point: PointerPoint): number {\n if (!this.lastPoint || !this.secondLastPoint) return 0;\n const p0 = this.secondLastPoint;\n const p1 = this.lastPoint;\n const p2 = point;\n\n const chordLength = Math.hypot(p2.x - p0.x, p2.y - p0.y);\n const pathLength =\n Math.hypot(p1.x - p0.x, p1.y - p0.y) +\n Math.hypot(p2.x - p1.x, p2.y - p1.y);\n\n if (chordLength === 0) return 0;\n return (pathLength - chordLength) / chordLength;\n }\n\n private normalizeAngle(angleDiff: number): number {\n while (angleDiff > Math.PI) angleDiff -= 2 * Math.PI;\n while (angleDiff < -Math.PI) angleDiff += 2 * Math.PI;\n return angleDiff;\n }\n\n private handleClick(_event: MouseEvent): void {\n const now = performance.now();\n // Detect double click (within 500ms)\n if (now - this.lastClickTime < 500) {\n this.doubleClickCount++;\n } else {\n this.clickCount++;\n }\n this.lastClickTime = now;\n }\n\n private handleRightClick(_event: MouseEvent): void {\n this.rightClickCount++;\n }\n\n private handleScroll(): void {\n const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollDiff = Math.abs(currentScrollTop - this.lastScrollTop);\n this.scrollDistance += scrollDiff;\n this.lastScrollTop = currentScrollTop;\n }\n\n private handleTouch(): void {\n this.touchEventCount++;\n }\n}\n","import { KeystrokeFeatureVector } from '../types';\n\nconst MAX_BUFFER = 200;\n\ntype KeystrokeMonitorEvent = 'keydown' | 'keyup';\n\ninterface KeystrokeMonitorOptions {\n onEvent?: (event: KeystrokeMonitorEvent) => void;\n}\n\nexport class KeystrokeMonitor {\n private keyDownTimes = new Map<string, number>();\n private lastKeyUpTime: number | null = null;\n private lastKeyDownTime: number | null = null;\n private featureVectors: KeystrokeFeatureVector[] = [];\n private dwellTimes: number[] = [];\n private flightTimes: number[] = [];\n private digraphLatencies: number[] = [];\n private isActive = false;\n private onEvent?: (event: KeystrokeMonitorEvent) => void;\n // Enhanced tracking\n private keydownCount = 0;\n private keyupCount = 0;\n private specialKeyCount = 0;\n private lastKeystrokeTime: number | null = null;\n private pauseCount = 0;\n private PAUSE_THRESHOLD = 2000; // 2 seconds\n private keystrokeTimestamps: number[] = [];\n\n private keyDownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n private keyUpHandler = (event: KeyboardEvent) => this.handleKeyUp(event);\n\n constructor(options: KeystrokeMonitorOptions = {}) {\n this.onEvent = options.onEvent;\n }\n\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n document.addEventListener('keydown', this.keyDownHandler, { passive: true, capture: true });\n document.addEventListener('keyup', this.keyUpHandler, { passive: true, capture: true });\n this.isActive = true;\n }\n\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n document.removeEventListener('keydown', this.keyDownHandler, true);\n document.removeEventListener('keyup', this.keyUpHandler, true);\n this.isActive = false;\n }\n\n getVectors(): KeystrokeFeatureVector[] {\n return this.featureVectors;\n }\n\n getDwellTimes(limit = 50): number[] {\n return this.dwellTimes.slice(-limit);\n }\n\n getFlightTimes(limit = 50): number[] {\n return this.flightTimes.slice(-limit);\n }\n\n /**\n * Get enhanced keyboard signals\n */\n getKeyboardSignals(): {\n keydownCount: number;\n keyupCount: number;\n specialKeyCount: number;\n typingSpeed: number; // Characters per minute\n pauseCount: number;\n backspaceRatio: number;\n } {\n // Calculate typing speed (characters per minute)\n let typingSpeed = 0;\n if (this.keystrokeTimestamps.length > 1) {\n const timeSpan = this.keystrokeTimestamps[this.keystrokeTimestamps.length - 1] - this.keystrokeTimestamps[0];\n const minutes = timeSpan / 60000;\n if (minutes > 0) {\n typingSpeed = this.keystrokeTimestamps.length / minutes;\n }\n }\n\n // Calculate backspace ratio\n const totalKeystrokes = this.keydownCount;\n const backspaceRatio = totalKeystrokes > 0 ? this.getBackspaceCount() / totalKeystrokes : 0;\n\n return {\n keydownCount: this.keydownCount,\n keyupCount: this.keyupCount,\n specialKeyCount: this.specialKeyCount,\n typingSpeed,\n pauseCount: this.pauseCount,\n backspaceRatio,\n };\n }\n\n private getBackspaceCount(): number {\n // Count backspace keys from feature vectors or track separately\n // For now, estimate from backspace ratio in form interactions\n return 0; // Will be enhanced with form interaction collector\n }\n\n reset(): void {\n this.keyDownTimes.clear();\n this.lastKeyUpTime = null;\n this.lastKeyDownTime = null;\n this.featureVectors = [];\n this.dwellTimes = [];\n this.flightTimes = [];\n this.digraphLatencies = [];\n this.keydownCount = 0;\n this.keyupCount = 0;\n this.specialKeyCount = 0;\n this.lastKeystrokeTime = null;\n this.pauseCount = 0;\n this.keystrokeTimestamps = [];\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (!this.isTargetField(event)) return;\n const now = performance.now();\n\n this.keydownCount++;\n this.keystrokeTimestamps.push(now);\n\n // Track special keys (Ctrl, Alt, Shift, Meta)\n if (event.ctrlKey || event.altKey || event.shiftKey || event.metaKey) {\n this.specialKeyCount++;\n }\n\n // Detect pauses (> 2 seconds between keystrokes)\n if (this.lastKeystrokeTime !== null && now - this.lastKeystrokeTime > this.PAUSE_THRESHOLD) {\n this.pauseCount++;\n }\n this.lastKeystrokeTime = now;\n\n if (this.lastKeyUpTime !== null) {\n const flight = now - this.lastKeyUpTime;\n this.flightTimes.push(flight);\n this.appendVector({ dwellTime: -1, flightTime: flight, digraphLatency: -1, timestamp: now });\n }\n\n if (this.lastKeyDownTime !== null) {\n const digraphLatency = now - this.lastKeyDownTime;\n this.digraphLatencies.push(digraphLatency);\n this.appendVector({ dwellTime: -1, flightTime: -1, digraphLatency, timestamp: now });\n }\n\n this.lastKeyDownTime = now;\n this.keyDownTimes.set(event.code, now);\n if (this.onEvent) this.onEvent('keydown');\n }\n\n private handleKeyUp(event: KeyboardEvent): void {\n if (!this.isTargetField(event)) return;\n const now = performance.now();\n this.keyupCount++;\n \n const start = this.keyDownTimes.get(event.code);\n if (start !== undefined) {\n const dwell = now - start;\n this.dwellTimes.push(dwell);\n this.appendVector({ dwellTime: dwell, flightTime: -1, digraphLatency: -1, timestamp: now });\n this.keyDownTimes.delete(event.code);\n }\n this.lastKeyUpTime = now;\n if (this.onEvent) this.onEvent('keyup');\n }\n\n private appendVector(vector: KeystrokeFeatureVector): void {\n this.featureVectors.push(vector);\n if (this.featureVectors.length > MAX_BUFFER) {\n this.featureVectors.splice(0, this.featureVectors.length - MAX_BUFFER);\n }\n }\n\n private isTargetField(event: KeyboardEvent): boolean {\n const target = event.target as HTMLElement | null;\n if (!target) return false;\n const isEditable = target.isContentEditable || ['INPUT', 'TEXTAREA'].includes(target.tagName);\n return isEditable;\n }\n}\n\n","import { BehavioralData, BehavioralSequence } from '../types';\nimport { KinematicEngine } from './kinematic-engine';\nimport { KeystrokeMonitor } from './keystroke-monitor';\n\nconst WINDOW_SIZE = 50;\nconst MASK_VALUE = -1;\nconst FEATURE_NAMES = [\n 'velocity',\n 'acceleration',\n 'jerk',\n 'curvature',\n 'angularVelocity',\n 'dwell',\n 'flight',\n 'digraphLatency',\n] as const;\n\ntype BehavioralEvent = 'mousemove' | 'mousedown' | 'mouseup' | 'keydown' | 'keyup';\n\nexport class BehavioralCollector {\n private isActive = false;\n private sessionEvents: Array<{ type: BehavioralEvent; timestamp: number }> = [];\n private kinematicEngine: KinematicEngine;\n private keystrokeMonitor: KeystrokeMonitor;\n\n constructor() {\n this.kinematicEngine = new KinematicEngine({ onEvent: this.trackEvent });\n this.keystrokeMonitor = new KeystrokeMonitor({ onEvent: this.trackEvent });\n }\n\n start(): void {\n if (this.isActive) return;\n this.kinematicEngine.start();\n this.keystrokeMonitor.start();\n this.isActive = true;\n }\n\n stop(): void {\n if (!this.isActive) return;\n this.kinematicEngine.stop();\n this.keystrokeMonitor.stop();\n this.isActive = false;\n }\n\n reset(): void {\n this.sessionEvents = [];\n this.kinematicEngine.reset();\n this.keystrokeMonitor.reset();\n }\n\n getData(): BehavioralData {\n const kinematicVectors = this.kinematicEngine.getVectors();\n const keystrokeVectors = this.keystrokeMonitor.getVectors();\n\n const merged = [\n ...kinematicVectors.map(v => ({\n timestamp: v.timestamp,\n values: [\n v.velocity,\n v.acceleration,\n v.jerk,\n v.curvature,\n v.angularVelocity,\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n ],\n })),\n ...keystrokeVectors.map(v => ({\n timestamp: v.timestamp,\n values: [\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n MASK_VALUE,\n v.dwellTime,\n v.flightTime,\n v.digraphLatency,\n ],\n })),\n ].sort((a, b) => a.timestamp - b.timestamp);\n\n const sequence = this.buildSequence(merged);\n const suspiciousSwipeVelocity = this.kinematicEngine.getSuspiciousSwipeVelocity();\n const entropy = this.calculateSessionEntropy();\n\n const dwellTimes = this.keystrokeMonitor.getDwellTimes();\n const flightTimes = this.keystrokeMonitor.getFlightTimes();\n\n return {\n typing_dwell_ms: dwellTimes,\n typing_flight_ms: flightTimes,\n swipe_velocity: suspiciousSwipeVelocity,\n suspicious_swipe_velocity: suspiciousSwipeVelocity,\n session_entropy: entropy,\n behavioral_vectors: sequence,\n };\n }\n\n private buildSequence(\n vectors: Array<{ timestamp: number; values: number[] }>\n ): BehavioralSequence {\n const padded: number[][] = [];\n const startIndex = Math.max(0, vectors.length - WINDOW_SIZE);\n const window = vectors.slice(startIndex);\n\n for (const vector of window) {\n padded.push(vector.values);\n }\n\n while (padded.length < WINDOW_SIZE) {\n padded.unshift(new Array(FEATURE_NAMES.length).fill(MASK_VALUE));\n }\n\n return {\n featureNames: [...FEATURE_NAMES],\n windowSize: WINDOW_SIZE,\n maskValue: MASK_VALUE,\n sequence: padded,\n };\n }\n\n private trackEvent = (event: BehavioralEvent) => {\n this.sessionEvents.push({ type: event, timestamp: performance.now() });\n if (this.sessionEvents.length > 500) {\n this.sessionEvents.shift();\n }\n };\n\n private calculateSessionEntropy(): number {\n if (this.sessionEvents.length === 0) return 0;\n const counts: Record<string, number> = {};\n this.sessionEvents.forEach(evt => {\n counts[evt.type] = (counts[evt.type] || 0) + 1;\n });\n const total = this.sessionEvents.length;\n return Object.values(counts).reduce((entropy, count) => {\n const probability = count / total;\n return probability > 0 ? entropy - probability * Math.log2(probability) : entropy;\n }, 0);\n }\n\n /**\n * Get mouse signals from kinematic engine\n */\n getMouseSignals() {\n return this.kinematicEngine.getMouseSignals();\n }\n\n /**\n * Get keyboard signals from keystroke monitor\n */\n getKeyboardSignals() {\n return this.keystrokeMonitor.getKeyboardSignals();\n }\n}\n","/**\n * Canvas Fingerprint Collector\n * Generates a stable canvas fingerprint using text rendering, shapes, and gradients\n * This is a key component for device identification\n */\n\nexport interface CanvasFingerprint {\n value: string; // Base64 or hash of canvas data\n duration: number; // Time taken to generate (ms)\n}\n\nexport class CanvasFingerprintCollector {\n private cachedFingerprint: CanvasFingerprint | null = null;\n\n /**\n * Generate canvas fingerprint\n * Returns null if canvas is not available\n */\n collect(): CanvasFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 200;\n canvas.height = 50;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n // Text rendering with various styles\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.textBaseline = 'alphabetic';\n \n // Background rectangle\n ctx.fillStyle = '#f60';\n ctx.fillRect(125, 1, 62, 20);\n \n // Text with different styles\n ctx.fillStyle = '#069';\n ctx.fillText('KeverdFingerprint', 2, 15);\n \n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';\n ctx.fillText('KeverdFingerprint', 4, 17);\n\n // Add shapes and gradients for more uniqueness\n const gradient = ctx.createLinearGradient(0, 0, 200, 50);\n gradient.addColorStop(0, 'rgba(255, 0, 0, 0.5)');\n gradient.addColorStop(1, 'rgba(0, 0, 255, 0.5)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 200, 50);\n\n // Add geometric shapes\n ctx.strokeStyle = '#000';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(100, 25, 20, 0, Math.PI * 2);\n ctx.stroke();\n\n // Add more text with different fonts\n ctx.font = '12px Verdana';\n ctx.fillStyle = '#000';\n ctx.fillText('CanvasFP', 150, 30);\n\n // Get canvas data\n const dataURL = canvas.toDataURL();\n \n // Hash the data URL for privacy (we'll use a simple hash for now)\n const hash = this.hashString(dataURL);\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n value: hash,\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Canvas fingerprinting failed:', error);\n return null;\n }\n }\n\n /**\n * Hash a string to create a stable fingerprint\n */\n private hashString(str: string): string {\n // Simple hash function that produces consistent results\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; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * WebGL Fingerprint Collector\n * Extracts WebGL vendor, renderer, version, supported extensions, and shader precision\n * This provides hardware-level identification\n */\n\nexport interface WebGLFingerprint {\n vendor: string | null;\n renderer: string | null;\n version: string | null;\n shadingLanguageVersion: string | null;\n extensions: string[];\n parameters: Record<string, any>;\n precision: Record<string, string>;\n duration: number;\n}\n\nexport class WebGLFingerprintCollector {\n private cachedFingerprint: WebGLFingerprint | null = null;\n\n /**\n * Generate WebGL fingerprint\n * Returns null if WebGL is not available\n */\n collect(): WebGLFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || \n canvas.getContext('experimental-webgl') as WebGLRenderingContext | null;\n\n if (!gl) {\n return null;\n }\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n \n // Get vendor and renderer (most identifying info)\n let vendor: string | null = null;\n let renderer: string | null = null;\n\n if (debugInfo) {\n vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || null;\n renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || null;\n } else {\n vendor = gl.getParameter(gl.VENDOR) || null;\n renderer = gl.getParameter(gl.RENDERER) || null;\n }\n\n // Get version info\n const version = gl.getParameter(gl.VERSION) || null;\n const shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION) || null;\n\n // Get supported extensions\n const extensions: string[] = [];\n try {\n const supportedExtensions = gl.getSupportedExtensions();\n if (supportedExtensions) {\n extensions.push(...supportedExtensions);\n }\n } catch (e) {\n // Some browsers may throw when accessing extensions\n }\n\n // Get important parameters\n const parameters: Record<string, any> = {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxVertexAttribs: gl.getParameter(gl.MAX_VERTEX_ATTRIBS),\n maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),\n maxTextureImageUnits: gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),\n maxCombinedTextureImageUnits: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n maxFragmentUniformVectors: gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS),\n maxVaryingVectors: gl.getParameter(gl.MAX_VARYING_VECTORS),\n aliasedLineWidthRange: gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE),\n aliasedPointSizeRange: gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE),\n };\n\n // Get shader precision\n const precision: Record<string, string> = {};\n try {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n if (vertexShader) {\n gl.shaderSource(vertexShader, 'precision mediump float;');\n gl.compileShader(vertexShader);\n \n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (fragmentShader) {\n gl.shaderSource(fragmentShader, 'precision mediump float;');\n gl.compileShader(fragmentShader);\n \n // Get precision for different types\n precision.float = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT)?.precision?.toString() || 'unknown';\n precision.int = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT)?.precision?.toString() || 'unknown';\n }\n }\n } catch (e) {\n // Precision detection may fail in some browsers\n }\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n vendor,\n renderer,\n version,\n shadingLanguageVersion,\n extensions: extensions.sort(), // Sort for consistency\n parameters,\n precision,\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] WebGL fingerprinting failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Audio Fingerprint Collector\n * Generates audio context fingerprint using oscillator analysis and frequency response\n * This is a powerful technique for device identification\n */\n\nexport interface AudioFingerprint {\n value: number; // Audio fingerprint value\n duration: number; // Time taken to generate (ms)\n}\n\nexport class AudioFingerprintCollector {\n private cachedFingerprint: AudioFingerprint | null = null;\n\n /**\n * Generate audio fingerprint\n * Returns null if audio context is not available\n */\n async collect(): Promise<AudioFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if AudioContext is available\n const AudioContext = window.AudioContext || \n (window as any).webkitAudioContext || \n (window as any).mozAudioContext;\n\n if (!AudioContext) {\n return null;\n }\n\n const context = new AudioContext();\n const oscillator = context.createOscillator();\n const analyser = context.createAnalyser();\n const gainNode = context.createGain();\n const scriptProcessor = context.createScriptProcessor(4096, 1, 1);\n\n // Configure analyser\n analyser.fftSize = 2048;\n analyser.smoothingTimeConstant = 0.8;\n\n // Connect nodes\n oscillator.connect(analyser);\n analyser.connect(scriptProcessor);\n scriptProcessor.connect(gainNode);\n gainNode.connect(context.destination);\n\n // Set oscillator properties\n oscillator.type = 'triangle';\n oscillator.frequency.value = 10000; // High frequency for better detection\n\n // Collect audio data\n return new Promise((resolve) => {\n const audioData: number[] = [];\n let sampleCount = 0;\n const maxSamples = 5; // Collect 5 samples\n\n scriptProcessor.onaudioprocess = (event) => {\n const inputBuffer = event.inputBuffer;\n const inputData = inputBuffer.getChannelData(0);\n\n // Calculate RMS (Root Mean Square) for this sample\n let sum = 0;\n for (let i = 0; i < inputData.length; i++) {\n sum += inputData[i] * inputData[i];\n }\n const rms = Math.sqrt(sum / inputData.length);\n audioData.push(rms);\n\n sampleCount++;\n if (sampleCount >= maxSamples) {\n // Stop oscillator and clean up\n oscillator.stop();\n context.close();\n\n // Calculate fingerprint from audio data\n const fingerprint = this.calculateFingerprint(audioData);\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n value: fingerprint,\n duration: Math.round(duration * 100) / 100,\n };\n\n resolve(this.cachedFingerprint);\n }\n };\n\n // Start oscillator\n oscillator.start(0);\n gainNode.gain.value = 0; // Mute to avoid sound\n\n // Timeout fallback (in case audio processing doesn't work)\n setTimeout(() => {\n if (!this.cachedFingerprint) {\n oscillator.stop();\n context.close();\n \n // Use a fallback fingerprint based on available audio properties\n const fallbackFingerprint = this.getFallbackFingerprint(context);\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n value: fallbackFingerprint,\n duration: Math.round(duration * 100) / 100,\n };\n\n resolve(this.cachedFingerprint);\n }\n }, 1000);\n });\n } catch (error) {\n console.warn('[Keverd SDK] Audio fingerprinting failed:', error);\n return null;\n }\n }\n\n /**\n * Calculate fingerprint from audio data\n */\n private calculateFingerprint(audioData: number[]): number {\n if (audioData.length === 0) {\n return 0;\n }\n\n // Calculate various statistics from audio data\n const sum = audioData.reduce((a, b) => a + b, 0);\n const mean = sum / audioData.length;\n \n const variance = audioData.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / audioData.length;\n const stdDev = Math.sqrt(variance);\n\n // Combine statistics into a single fingerprint value\n const fingerprint = (mean * 1000000) + (stdDev * 1000) + audioData.length;\n \n return Math.round(fingerprint * 100) / 100;\n }\n\n /**\n * Get fallback fingerprint when audio processing fails\n */\n private getFallbackFingerprint(context: AudioContext): number {\n // Use AudioContext properties as fallback\n const sampleRate = context.sampleRate || 44100;\n const state = context.state || 'unknown';\n \n // Create a simple hash from available properties\n const hash = (sampleRate.toString() + state).split('').reduce((acc, char) => {\n return ((acc << 5) - acc) + char.charCodeAt(0);\n }, 0);\n\n return Math.abs(hash);\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Font Detection Collector\n * Detects installed fonts using font measurement techniques and fallback detection\n * This helps identify unique system configurations\n */\n\nexport interface FontFingerprint {\n availableFonts: string[];\n missingFonts: string[];\n duration: number;\n}\n\nexport class FontDetectionCollector {\n private cachedFingerprint: FontFingerprint | null = null;\n\n // Common fonts to test\n private readonly testFonts = [\n 'Arial', 'Verdana', 'Times New Roman', 'Courier New', 'Georgia',\n 'Palatino', 'Garamond', 'Bookman', 'Comic Sans MS', 'Trebuchet MS',\n 'Arial Black', 'Impact', 'Tahoma', 'Lucida Console', 'Lucida Sans Unicode',\n 'MS Sans Serif', 'MS Serif', 'Symbol', 'Webdings', 'Wingdings',\n 'Monaco', 'Menlo', 'Consolas', 'Courier', 'Helvetica',\n 'Helvetica Neue', 'Roboto', 'Open Sans', 'Lato', 'Montserrat',\n ];\n\n /**\n * Detect available fonts\n * Returns null if detection fails\n */\n collect(): FontFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Create a canvas for font measurement\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) {\n return null;\n }\n\n // Base font for comparison\n const baseFont = 'monospace';\n const testString = 'mmmmmmmmmmlli';\n const testSize = '72px';\n\n // Set base font and measure\n ctx.font = `${testSize} ${baseFont}`;\n const baseWidth = ctx.measureText(testString).width;\n\n const availableFonts: string[] = [];\n const missingFonts: string[] = [];\n\n // Test each font\n for (const font of this.testFonts) {\n ctx.font = `${testSize} ${font}, ${baseFont}`;\n const width = ctx.measureText(testString).width;\n\n // If width differs from base, font is likely available\n // (this is a heuristic, not 100% accurate)\n if (Math.abs(width - baseWidth) > 1) {\n availableFonts.push(font);\n } else {\n missingFonts.push(font);\n }\n }\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n availableFonts: availableFonts.sort(),\n missingFonts: missingFonts.sort(),\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Font detection failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Media Devices Collector\n * Lists audio/video devices and enumerates media devices with labels\n * Requires user permission for device labels\n */\n\nexport interface MediaDeviceFingerprint {\n audioInputs: MediaDeviceInfo[];\n audioOutputs: MediaDeviceInfo[];\n videoInputs: MediaDeviceInfo[];\n hasPermission: boolean;\n duration: number;\n}\n\nexport class MediaDevicesCollector {\n private cachedFingerprint: MediaDeviceFingerprint | null = null;\n\n /**\n * Collect media device information\n * Returns null if MediaDevices API is not available\n */\n async collect(): Promise<MediaDeviceFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if MediaDevices API is available\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return null;\n }\n\n // Request permission to access device labels\n // This will prompt the user if permission hasn't been granted\n let hasPermission = false;\n try {\n // Try to get user media to trigger permission request\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false });\n hasPermission = true;\n // Stop the stream immediately\n stream.getTracks().forEach(track => track.stop());\n } catch (e) {\n // Permission denied or not available - continue without labels\n hasPermission = false;\n }\n\n // Enumerate devices\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n // Categorize devices\n const audioInputs: MediaDeviceInfo[] = [];\n const audioOutputs: MediaDeviceInfo[] = [];\n const videoInputs: MediaDeviceInfo[] = [];\n\n devices.forEach(device => {\n // Sanitize device info for privacy\n const sanitizedDevice: MediaDeviceInfo = {\n deviceId: device.deviceId,\n kind: device.kind,\n label: hasPermission ? device.label : '', // Only include label if permission granted\n groupId: device.groupId,\n toJSON: () => ({\n deviceId: device.deviceId,\n kind: device.kind,\n label: hasPermission ? device.label : '',\n groupId: device.groupId,\n }),\n };\n\n switch (device.kind) {\n case 'audioinput':\n audioInputs.push(sanitizedDevice);\n break;\n case 'audiooutput':\n audioOutputs.push(sanitizedDevice);\n break;\n case 'videoinput':\n videoInputs.push(sanitizedDevice);\n break;\n }\n });\n\n const duration = performance.now() - startTime;\n\n this.cachedFingerprint = {\n audioInputs,\n audioOutputs,\n videoInputs,\n hasPermission,\n duration: Math.round(duration * 100) / 100,\n };\n\n return this.cachedFingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Media devices enumeration failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Screen & Display Collector\n * Collects screen resolution, color depth, pixel ratio, orientation, and multi-monitor info\n */\n\nexport interface ScreenDisplayFingerprint {\n width: number;\n height: number;\n availWidth: number;\n availHeight: number;\n colorDepth: number;\n pixelDepth: number;\n pixelRatio: number;\n orientation: string | null;\n orientationAngle: number | null;\n duration: number;\n}\n\nexport class ScreenDisplayCollector {\n private cachedFingerprint: ScreenDisplayFingerprint | null = null;\n\n /**\n * Collect screen and display information\n */\n collect(): ScreenDisplayFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: ScreenDisplayFingerprint = {\n width: screen.width,\n height: screen.height,\n availWidth: screen.availWidth,\n availHeight: screen.availHeight,\n colorDepth: screen.colorDepth,\n pixelDepth: screen.pixelDepth,\n pixelRatio: window.devicePixelRatio || 1,\n orientation: this.getOrientation(),\n orientationAngle: this.getOrientationAngle(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Get screen orientation\n */\n private getOrientation(): string | null {\n // Check Screen Orientation API\n if ('orientation' in screen) {\n const orientation = (screen as any).orientation;\n if (orientation && orientation.type) {\n return orientation.type;\n }\n }\n\n // Fallback to window.orientation (deprecated but widely supported)\n if ('orientation' in window) {\n const angle = (window as any).orientation;\n if (angle !== undefined) {\n if (angle === 0 || angle === 180) {\n return 'portrait';\n } else if (angle === 90 || angle === -90) {\n return 'landscape';\n }\n }\n }\n\n // Fallback to media query\n if (window.matchMedia) {\n if (window.matchMedia('(orientation: portrait)').matches) {\n return 'portrait';\n } else if (window.matchMedia('(orientation: landscape)').matches) {\n return 'landscape';\n }\n }\n\n return null;\n }\n\n /**\n * Get screen orientation angle\n */\n private getOrientationAngle(): number | null {\n // Check Screen Orientation API\n if ('orientation' in screen) {\n const orientation = (screen as any).orientation;\n if (orientation && typeof orientation.angle === 'number') {\n return orientation.angle;\n }\n }\n\n // Fallback to window.orientation\n if ('orientation' in window) {\n const angle = (window as any).orientation;\n if (typeof angle === 'number') {\n return angle;\n }\n }\n\n return null;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Timezone & Locale Collector\n * Collects timezone, locale, date/time formatting preferences, and calendar system\n */\n\nexport interface TimezoneLocaleFingerprint {\n timezone: string;\n timezoneOffset: number;\n locale: string;\n locales: string[];\n dateFormat: string;\n timeFormat: string;\n numberFormat: string;\n calendar: string | null;\n duration: number;\n}\n\nexport class TimezoneLocaleCollector {\n private cachedFingerprint: TimezoneLocaleFingerprint | null = null;\n\n /**\n * Collect timezone and locale information\n */\n collect(): TimezoneLocaleFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n // Get timezone\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const timezoneOffset = new Date().getTimezoneOffset();\n\n // Get locale information\n const resolvedOptions = Intl.DateTimeFormat().resolvedOptions();\n const locale = resolvedOptions.locale;\n const locales = navigator.languages || [navigator.language];\n\n // Get date format\n const dateFormat = this.getDateFormat();\n\n // Get time format\n const timeFormat = this.getTimeFormat();\n\n // Get number format\n const numberFormat = this.getNumberFormat();\n\n // Get calendar system\n const calendar = resolvedOptions.calendar || null;\n\n const fingerprint: TimezoneLocaleFingerprint = {\n timezone,\n timezoneOffset,\n locale,\n locales: locales.slice(0, 5), // Limit to first 5 locales\n dateFormat,\n timeFormat,\n numberFormat,\n calendar,\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Get date format preference\n */\n private getDateFormat(): string {\n try {\n const formatter = new Intl.DateTimeFormat();\n const sample = formatter.format(new Date(2023, 0, 15)); // Jan 15, 2023\n // Extract format pattern (simplified)\n if (sample.includes('/')) {\n return 'numeric'; // Likely MM/DD/YYYY or DD/MM/YYYY\n } else if (sample.includes('-')) {\n return 'iso'; // Likely YYYY-MM-DD\n } else if (sample.includes('.')) {\n return 'european'; // Likely DD.MM.YYYY\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get time format preference (12h vs 24h)\n */\n private getTimeFormat(): string {\n try {\n const formatter = new Intl.DateTimeFormat(undefined, {\n hour: 'numeric',\n minute: 'numeric',\n });\n const sample = formatter.format(new Date(2023, 0, 15, 13, 30));\n // Check if sample contains AM/PM indicators\n if (sample.toLowerCase().includes('am') || sample.toLowerCase().includes('pm')) {\n return '12h';\n }\n return '24h';\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get number format preference\n */\n private getNumberFormat(): string {\n try {\n const formatter = new Intl.NumberFormat();\n const sample = formatter.format(1234.56);\n // Check for decimal separator\n if (sample.includes(',')) {\n return 'european'; // Uses comma as decimal separator\n } else if (sample.includes('.')) {\n return 'american'; // Uses dot as decimal separator\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Plugin & MIME Type Collector\n * Safely enumerates plugins and MIME types (privacy-conscious, limited data)\n * Note: Modern browsers have deprecated plugins, but we collect what's available\n */\n\nexport interface PluginMimeFingerprint {\n plugins: Array<{\n name: string;\n description: string;\n mimeTypes: string[];\n }>;\n mimeTypes: string[];\n duration: number;\n}\n\nexport class PluginMimeCollector {\n private cachedFingerprint: PluginMimeFingerprint | null = null;\n\n /**\n * Collect plugin and MIME type information\n * Returns null if plugins are not available (modern browsers)\n */\n collect(): PluginMimeFingerprint | null {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if plugins are available\n if (!navigator.plugins || navigator.plugins.length === 0) {\n // Modern browsers don't expose plugins\n return null;\n }\n\n const plugins: Array<{ name: string; description: string; mimeTypes: string[] }> = [];\n const allMimeTypes = new Set<string>();\n\n // Collect plugin information (limited for privacy)\n for (let i = 0; i < Math.min(navigator.plugins.length, 10); i++) {\n const plugin = navigator.plugins[i];\n if (!plugin) continue;\n\n const mimeTypes: string[] = [];\n \n // Collect MIME types for this plugin (limited)\n for (let j = 0; j < Math.min(plugin.length, 5); j++) {\n const mimeType = plugin[j];\n if (mimeType && mimeType.type) {\n mimeTypes.push(mimeType.type);\n allMimeTypes.add(mimeType.type);\n }\n }\n\n plugins.push({\n name: plugin.name || 'Unknown',\n description: plugin.description || '',\n mimeTypes,\n });\n }\n\n const fingerprint: PluginMimeFingerprint = {\n plugins,\n mimeTypes: Array.from(allMimeTypes).sort(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Plugin/MIME collection failed:', error);\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Battery API Collector\n * Collects battery level, charging status, charging time (if available, with fallbacks)\n * Note: Battery API is deprecated but still available in some browsers\n */\n\nexport interface BatteryFingerprint {\n level: number | null; // 0.0 to 1.0\n charging: boolean | null;\n chargingTime: number | null; // seconds until fully charged\n dischargingTime: number | null; // seconds until fully discharged\n duration: number;\n}\n\nexport class BatteryAPICollector {\n private cachedFingerprint: BatteryFingerprint | null = null;\n\n /**\n * Collect battery information\n * Returns null if Battery API is not available\n */\n async collect(): Promise<BatteryFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check for Battery API (deprecated but still available)\n const batteryManager = await this.getBatteryManager();\n \n if (!batteryManager) {\n return null;\n }\n\n const fingerprint: BatteryFingerprint = {\n level: batteryManager.level,\n charging: batteryManager.charging,\n chargingTime: batteryManager.chargingTime,\n dischargingTime: batteryManager.dischargingTime,\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n // Battery API may not be available or may require user permission\n return null;\n }\n }\n\n /**\n * Get battery manager from various API locations\n */\n private async getBatteryManager(): Promise<any> {\n // Try standard Battery API\n if ('getBattery' in navigator) {\n try {\n return await (navigator as any).getBattery();\n } catch (e) {\n // API may be available but fail due to permissions\n }\n }\n\n // Try webkit prefix\n if ('webkitGetBattery' in navigator) {\n try {\n return await (navigator as any).webkitGetBattery();\n } catch (e) {\n // API may be available but fail due to permissions\n }\n }\n\n // Try moz prefix\n if ('mozGetBattery' in navigator) {\n try {\n return await (navigator as any).mozGetBattery();\n } catch (e) {\n // API may be available but fail due to permissions\n }\n }\n\n return null;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Storage & Database Collector\n * Detects localStorage, sessionStorage, IndexedDB, WebSQL availability and quotas\n */\n\nexport interface StorageDatabaseFingerprint {\n localStorage: {\n available: boolean;\n quota: number | null;\n usage: number | null;\n };\n sessionStorage: {\n available: boolean;\n quota: number | null;\n usage: number | null;\n };\n indexedDB: {\n available: boolean;\n };\n webSQL: {\n available: boolean;\n };\n duration: number;\n}\n\nexport class StorageDatabaseCollector {\n private cachedFingerprint: StorageDatabaseFingerprint | null = null;\n\n /**\n * Collect storage and database information\n */\n async collect(): Promise<StorageDatabaseFingerprint> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: StorageDatabaseFingerprint = {\n localStorage: await this.checkLocalStorage(),\n sessionStorage: await this.checkSessionStorage(),\n indexedDB: this.checkIndexedDB(),\n webSQL: this.checkWebSQL(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Check localStorage availability and quota\n */\n private async checkLocalStorage(): Promise<{ available: boolean; quota: number | null; usage: number | null }> {\n let available = false;\n let quota: number | null = null;\n let usage: number | null = null;\n\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n available = true;\n\n // Try to get storage quota (if available)\n if ('storage' in navigator && 'estimate' in (navigator as any).storage) {\n try {\n const estimate = await (navigator as any).storage.estimate();\n if (estimate) {\n quota = estimate.quota || null;\n usage = estimate.usage || null;\n }\n } catch (e) {\n // Quota API may not be available\n }\n }\n } catch (e) {\n available = false;\n }\n\n return { available, quota, usage };\n }\n\n /**\n * Check sessionStorage availability and quota\n */\n private async checkSessionStorage(): Promise<{ available: boolean; quota: number | null; usage: number | null }> {\n let available = false;\n let quota: number | null = null;\n let usage: number | null = null;\n\n try {\n const test = '__sessionStorage_test__';\n sessionStorage.setItem(test, test);\n sessionStorage.removeItem(test);\n available = true;\n\n // Try to get storage quota (if available)\n if ('storage' in navigator && 'estimate' in (navigator as any).storage) {\n try {\n const estimate = await (navigator as any).storage.estimate();\n if (estimate) {\n quota = estimate.quota || null;\n usage = estimate.usage || null;\n }\n } catch (e) {\n // Quota API may not be available\n }\n }\n } catch (e) {\n available = false;\n }\n\n return { available, quota, usage };\n }\n\n /**\n * Check IndexedDB availability\n */\n private checkIndexedDB(): { available: boolean } {\n return {\n available: 'indexedDB' in window && !!window.indexedDB,\n };\n }\n\n /**\n * Check WebSQL availability (deprecated but still in some browsers)\n */\n private checkWebSQL(): { available: boolean } {\n return {\n available: 'openDatabase' in window && !!(window as any).openDatabase,\n };\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * CPU & Memory Collector\n * Collects hardwareConcurrency, deviceMemory, performance.memory (if available)\n */\n\nexport interface CPUMemoryFingerprint {\n hardwareConcurrency: number;\n deviceMemory: number | null;\n performanceMemory: {\n jsHeapSizeLimit: number | null;\n totalJSHeapSize: number | null;\n usedJSHeapSize: number | null;\n };\n duration: number;\n}\n\nexport class CPUMemoryCollector {\n private cachedFingerprint: CPUMemoryFingerprint | null = null;\n\n /**\n * Collect CPU and memory information\n */\n collect(): CPUMemoryFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: CPUMemoryFingerprint = {\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n deviceMemory: this.getDeviceMemory(),\n performanceMemory: this.getPerformanceMemory(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Get device memory (if available)\n */\n private getDeviceMemory(): number | null {\n // @ts-ignore - deviceMemory is not in all TypeScript definitions\n if ('deviceMemory' in navigator && navigator.deviceMemory) {\n // @ts-ignore\n return navigator.deviceMemory;\n }\n return null;\n }\n\n /**\n * Get performance memory information (Chrome-specific)\n */\n private getPerformanceMemory(): {\n jsHeapSizeLimit: number | null;\n totalJSHeapSize: number | null;\n usedJSHeapSize: number | null;\n } {\n if ('memory' in performance) {\n const memory = (performance as any).memory;\n return {\n jsHeapSizeLimit: memory.jsHeapSizeLimit || null,\n totalJSHeapSize: memory.totalJSHeapSize || null,\n usedJSHeapSize: memory.usedJSHeapSize || null,\n };\n }\n return {\n jsHeapSizeLimit: null,\n totalJSHeapSize: null,\n usedJSHeapSize: null,\n };\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Touch & Pointer Collector\n * Collects maxTouchPoints, pointer capabilities, touch event support\n */\n\nexport interface TouchPointerFingerprint {\n maxTouchPoints: number;\n touchSupport: boolean;\n pointerSupport: boolean;\n pointerTypes: string[];\n duration: number;\n}\n\nexport class TouchPointerCollector {\n private cachedFingerprint: TouchPointerFingerprint | null = null;\n\n /**\n * Collect touch and pointer information\n */\n collect(): TouchPointerFingerprint {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n const fingerprint: TouchPointerFingerprint = {\n maxTouchPoints: navigator.maxTouchPoints || 0,\n touchSupport: this.checkTouchSupport(),\n pointerSupport: this.checkPointerSupport(),\n pointerTypes: this.getPointerTypes(),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n }\n\n /**\n * Check if touch events are supported\n */\n private checkTouchSupport(): boolean {\n return 'ontouchstart' in window || \n navigator.maxTouchPoints > 0 ||\n !!(window as any).DocumentTouch && document instanceof (window as any).DocumentTouch;\n }\n\n /**\n * Check if Pointer Events are supported\n */\n private checkPointerSupport(): boolean {\n return 'PointerEvent' in window || 'MSPointerEvent' in window;\n }\n\n /**\n * Get available pointer types\n */\n private getPointerTypes(): string[] {\n const types: string[] = [];\n\n if ('PointerEvent' in window) {\n // Check for different pointer types\n if (navigator.maxTouchPoints > 0) {\n types.push('touch');\n }\n types.push('mouse');\n if ('pen' in navigator) {\n types.push('pen');\n }\n }\n\n return types;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Permissions API Collector\n * Checks permissions for camera, microphone, notifications, geolocation\n */\n\nexport interface PermissionsFingerprint {\n camera: string | null;\n microphone: string | null;\n notifications: string | null;\n geolocation: string | null;\n persistentStorage: string | null;\n duration: number;\n}\n\nexport class PermissionsAPICollector {\n private cachedFingerprint: PermissionsFingerprint | null = null;\n\n /**\n * Collect permission states\n * Returns null if Permissions API is not available\n */\n async collect(): Promise<PermissionsFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if Permissions API is available\n if (!('permissions' in navigator)) {\n return null;\n }\n\n const permissions = (navigator as any).permissions;\n\n const fingerprint: PermissionsFingerprint = {\n camera: await this.queryPermission(permissions, 'camera'),\n microphone: await this.queryPermission(permissions, 'microphone'),\n notifications: await this.queryPermission(permissions, 'notifications'),\n geolocation: await this.queryPermission(permissions, 'geolocation'),\n persistentStorage: await this.queryPermission(permissions, 'persistent-storage'),\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n console.warn('[Keverd SDK] Permissions API collection failed:', error);\n return null;\n }\n }\n\n /**\n * Query a specific permission\n */\n private async queryPermission(permissions: any, name: string): Promise<string | null> {\n try {\n const result = await permissions.query({ name });\n return result.state || null; // 'granted', 'denied', or 'prompt'\n } catch (e) {\n // Permission name may not be supported\n return null;\n }\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * WebRTC IP Collector\n * Extracts local IP addresses via WebRTC (with privacy considerations and error handling)\n * Note: This requires user interaction and may be blocked by privacy settings\n */\n\nexport interface WebRTCIPFingerprint {\n localIPs: string[];\n publicIP: string | null;\n duration: number;\n}\n\nexport class WebRTCIPCollector {\n private cachedFingerprint: WebRTCIPFingerprint | null = null;\n\n /**\n * Collect WebRTC IP information\n * Returns null if WebRTC is not available or fails\n */\n async collect(): Promise<WebRTCIPFingerprint | null> {\n if (this.cachedFingerprint) {\n return this.cachedFingerprint;\n }\n\n const startTime = performance.now();\n\n try {\n // Check if RTCPeerConnection is available\n const RTCPeerConnection = window.RTCPeerConnection || \n (window as any).webkitRTCPeerConnection || \n (window as any).mozRTCPeerConnection;\n\n if (!RTCPeerConnection) {\n return null;\n }\n\n const localIPs: string[] = [];\n let publicIP: string | null = null;\n\n // Create a peer connection to trigger candidate gathering\n const pc = new RTCPeerConnection({\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],\n });\n\n // Collect ICE candidates\n pc.onicecandidate = (event) => {\n if (event.candidate) {\n const candidate = event.candidate.candidate;\n \n // Extract IP addresses from candidate string\n const ipMatch = candidate.match(/([0-9]{1,3}\\.){3}[0-9]{1,3}/);\n if (ipMatch) {\n const ip = ipMatch[0];\n \n // Filter out local/private IPs\n if (this.isLocalIP(ip)) {\n if (!localIPs.includes(ip)) {\n localIPs.push(ip);\n }\n } else {\n // Public IP\n publicIP = ip;\n }\n }\n }\n };\n\n // Create a data channel to trigger candidate gathering\n pc.createDataChannel('');\n\n // Create offer to start ICE gathering\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n\n // Wait for ICE gathering to complete (with timeout)\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n resolve();\n }, 2000); // 2 second timeout\n\n pc.onicegatheringstatechange = () => {\n if (pc.iceGatheringState === 'complete') {\n clearTimeout(timeout);\n resolve();\n }\n };\n\n // Also resolve if already complete\n if (pc.iceGatheringState === 'complete') {\n clearTimeout(timeout);\n resolve();\n }\n });\n\n // Clean up\n pc.close();\n\n const fingerprint: WebRTCIPFingerprint = {\n localIPs: localIPs.sort(),\n publicIP,\n duration: 0,\n };\n\n fingerprint.duration = Math.round((performance.now() - startTime) * 100) / 100;\n\n this.cachedFingerprint = fingerprint;\n return fingerprint;\n } catch (error) {\n // WebRTC may be blocked or unavailable\n return null;\n }\n }\n\n /**\n * Check if an IP is a local/private IP\n */\n private isLocalIP(ip: string): boolean {\n // Check for localhost\n if (ip === '127.0.0.1' || ip === '::1') {\n return true;\n }\n\n // Check for private IP ranges\n const parts = ip.split('.');\n if (parts.length === 4) {\n const first = parseInt(parts[0], 10);\n const second = parseInt(parts[1], 10);\n\n // 10.0.0.0/8\n if (first === 10) {\n return true;\n }\n\n // 172.16.0.0/12\n if (first === 172 && second >= 16 && second <= 31) {\n return true;\n }\n\n // 192.168.0.0/16\n if (first === 192 && second === 168) {\n return true;\n }\n\n // 169.254.0.0/16 (link-local)\n if (first === 169 && second === 254) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Clear cached fingerprint\n */\n clearCache(): void {\n this.cachedFingerprint = null;\n }\n}\n\n","/**\n * Stable Visitor ID Generator\n * Combines all fingerprint components into deterministic, stable visitor ID using SHA-256\n * This replaces FingerprintJS visitor ID with our own implementation\n */\n\nimport { FingerprintComponents } from '../types/fingerprint';\n\nexport class VisitorIDGenerator {\n /**\n * Generate a stable visitor ID from fingerprint components\n * Uses SHA-256-like hashing for consistency\n */\n generate(components: FingerprintComponents): string {\n // Collect all stable identifiers from components\n const identifiers: string[] = [];\n\n // Canvas fingerprint (very stable)\n if (components.canvas?.value) {\n identifiers.push(`canvas:${components.canvas.value}`);\n }\n\n // WebGL renderer and vendor (very stable)\n if (components.webgl) {\n if (components.webgl.vendor) {\n identifiers.push(`webgl_vendor:${components.webgl.vendor}`);\n }\n if (components.webgl.renderer) {\n identifiers.push(`webgl_renderer:${components.webgl.renderer}`);\n }\n if (components.webgl.extensions.length > 0) {\n identifiers.push(`webgl_ext:${components.webgl.extensions.slice(0, 10).join(',')}`);\n }\n }\n\n // Audio fingerprint (stable)\n if (components.audio?.value) {\n identifiers.push(`audio:${components.audio.value}`);\n }\n\n // Screen resolution and pixel ratio (stable)\n if (components.screen) {\n identifiers.push(`screen:${components.screen.width}x${components.screen.height}x${components.screen.pixelRatio}`);\n identifiers.push(`color:${components.screen.colorDepth}`);\n }\n\n // Timezone (stable)\n if (components.timezone) {\n identifiers.push(`tz:${components.timezone.timezone}`);\n identifiers.push(`locale:${components.timezone.locale}`);\n }\n\n // Hardware concurrency (stable)\n if (components.cpu) {\n identifiers.push(`cpu:${components.cpu.hardwareConcurrency}`);\n if (components.cpu.deviceMemory) {\n identifiers.push(`memory:${components.cpu.deviceMemory}`);\n }\n }\n\n // Touch points (stable)\n if (components.touch) {\n identifiers.push(`touch:${components.touch.maxTouchPoints}`);\n }\n\n // User agent (stable but less reliable)\n identifiers.push(`ua:${navigator.userAgent}`);\n\n // Language (stable)\n identifiers.push(`lang:${navigator.language}`);\n\n // Platform (stable)\n identifiers.push(`platform:${navigator.platform}`);\n\n // Fonts (stable - use available fonts)\n if (components.fonts && components.fonts.availableFonts.length > 0) {\n identifiers.push(`fonts:${components.fonts.availableFonts.slice(0, 20).join(',')}`);\n }\n\n // Combine all identifiers\n const combined = identifiers.join('|');\n\n // Generate SHA-256-like hash\n return this.sha256Hash(combined);\n }\n\n /**\n * Calculate confidence score based on component availability\n * More components = higher confidence\n */\n calculateConfidence(components: FingerprintComponents): number {\n let score = 0;\n let maxScore = 0;\n\n // Weight different components by their stability\n const weights: Record<string, number> = {\n canvas: 20,\n webgl: 20,\n audio: 15,\n screen: 10,\n timezone: 10,\n cpu: 10,\n fonts: 10,\n touch: 5,\n storage: 5,\n permissions: 5,\n webrtc: 5,\n mediaDevices: 5,\n battery: 3,\n plugins: 3,\n };\n\n // Calculate score\n Object.keys(weights).forEach((key) => {\n maxScore += weights[key];\n if (components[key as keyof FingerprintComponents]) {\n score += weights[key];\n }\n });\n\n // Normalize to 0.0 - 1.0 range\n return maxScore > 0 ? Math.min(score / maxScore, 1.0) : 0.0;\n }\n\n /**\n * SHA-256-like hash function\n * Produces a 64-character hex string (matching SHA-256 format)\n */\n private sha256Hash(input: string): string {\n // Use Web Crypto API if available (more secure and faster)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n // For now, use a synchronous hash function\n // In production, you might want to use async crypto.subtle.digest\n return this.sha256LikeHash(input);\n }\n\n // Fallback to custom hash\n return this.sha256LikeHash(input);\n }\n\n /**\n * SHA-256-like hash (synchronous, deterministic)\n * Produces 64-character hex string\n */\n private sha256LikeHash(str: string): string {\n // Create multiple hash passes for better distribution\n const hashes: number[] = [];\n \n // Pass 1: Standard djb2\n let h1 = 5381;\n for (let i = 0; i < str.length; i++) {\n h1 = ((h1 << 5) + h1) + str.charCodeAt(i);\n h1 = h1 & 0xFFFFFFFF;\n }\n hashes.push(h1);\n \n // Pass 2: Reverse string\n let h2 = 0;\n for (let i = str.length - 1; i >= 0; i--) {\n h2 = ((h2 << 7) - h2) + str.charCodeAt(i);\n h2 = h2 & 0xFFFFFFFF;\n }\n hashes.push(h2);\n \n // Pass 3: XOR with position\n let h3 = 0;\n for (let i = 0; i < str.length; i++) {\n h3 = h3 ^ (str.charCodeAt(i) << ((i % 4) * 8));\n h3 = h3 & 0xFFFFFFFF;\n }\n hashes.push(h3);\n \n // Pass 4: Multiplicative hash\n let h4 = 0;\n for (let i = 0; i < str.length; i++) {\n h4 = (h4 * 31 + str.charCodeAt(i)) & 0xFFFFFFFF;\n }\n hashes.push(h4);\n \n // Pass 5: Rotating hash\n let h5 = 0;\n for (let i = 0; i < str.length; i++) {\n const rotated = ((str.charCodeAt(i) << (i % 16)) | (str.charCodeAt(i) >>> (32 - (i % 16)))) & 0xFFFFFFFF;\n h5 = (h5 + rotated) & 0xFFFFFFFF;\n }\n hashes.push(h5);\n \n // Pass 6: FNV-1a variant\n let h6 = 2166136261;\n for (let i = 0; i < str.length; i++) {\n h6 = (h6 ^ str.charCodeAt(i)) * 16777619;\n h6 = h6 & 0xFFFFFFFF;\n }\n hashes.push(h6);\n \n // Pass 7: Position-weighted hash\n let h7 = 0;\n for (let i = 0; i < str.length; i++) {\n h7 = (h7 + str.charCodeAt(i) * (i + 1)) & 0xFFFFFFFF;\n }\n hashes.push(h7);\n \n // Pass 8: Combined character codes\n let h8 = 0;\n for (let i = 0; i < str.length; i += 2) {\n const combined = str.charCodeAt(i) + (str.charCodeAt(i + 1) || 0) * 256;\n h8 = ((h8 << 3) - h8) + combined;\n h8 = h8 & 0xFFFFFFFF;\n }\n hashes.push(h8);\n \n // Convert all hashes to hex and combine into 64-char string\n const hexParts = hashes.map(h => Math.abs(h).toString(16).padStart(8, '0'));\n const combined = hexParts.join('');\n \n // Ensure exactly 64 characters (SHA-256 format)\n return combined.substring(0, 64).padEnd(64, '0');\n }\n}\n\n","/**\n * Fingerprint Component Manager\n * Orchestrates all fingerprint collectors, handles caching, error recovery, and component weighting\n * This is the main entry point for custom fingerprinting (replaces FingerprintJS)\n */\n\nimport { FingerprintComponents, FingerprintData } from '../types/fingerprint';\nimport { CanvasFingerprintCollector } from './canvas-fingerprint';\nimport { WebGLFingerprintCollector } from './webgl-fingerprint';\nimport { AudioFingerprintCollector } from './audio-fingerprint';\nimport { FontDetectionCollector } from './font-detection';\nimport { MediaDevicesCollector } from './media-devices';\nimport { ScreenDisplayCollector } from './screen-display';\nimport { TimezoneLocaleCollector } from './timezone-locale';\nimport { PluginMimeCollector } from './plugin-mime';\nimport { BatteryAPICollector } from './battery-api';\nimport { StorageDatabaseCollector } from './storage-database';\nimport { CPUMemoryCollector } from './cpu-memory';\nimport { TouchPointerCollector } from './touch-pointer';\nimport { PermissionsAPICollector } from './permissions-api';\nimport { WebRTCIPCollector } from './webrtc-ip';\nimport { VisitorIDGenerator } from './visitor-id-generator';\n\nexport class FingerprintManager {\n private collectors: {\n canvas: CanvasFingerprintCollector;\n webgl: WebGLFingerprintCollector;\n audio: AudioFingerprintCollector;\n fonts: FontDetectionCollector;\n mediaDevices: MediaDevicesCollector;\n screen: ScreenDisplayCollector;\n timezone: TimezoneLocaleCollector;\n plugins: PluginMimeCollector;\n battery: BatteryAPICollector;\n storage: StorageDatabaseCollector;\n cpu: CPUMemoryCollector;\n touch: TouchPointerCollector;\n permissions: PermissionsAPICollector;\n webrtc: WebRTCIPCollector;\n };\n\n private visitorIDGenerator: VisitorIDGenerator;\n private cachedData: FingerprintData | null = null;\n private collectionStartTime: number = 0;\n\n constructor() {\n // Initialize all collectors\n this.collectors = {\n canvas: new CanvasFingerprintCollector(),\n webgl: new WebGLFingerprintCollector(),\n audio: new AudioFingerprintCollector(),\n fonts: new FontDetectionCollector(),\n mediaDevices: new MediaDevicesCollector(),\n screen: new ScreenDisplayCollector(),\n timezone: new TimezoneLocaleCollector(),\n plugins: new PluginMimeCollector(),\n battery: new BatteryAPICollector(),\n storage: new StorageDatabaseCollector(),\n cpu: new CPUMemoryCollector(),\n touch: new TouchPointerCollector(),\n permissions: new PermissionsAPICollector(),\n webrtc: new WebRTCIPCollector(),\n };\n\n this.visitorIDGenerator = new VisitorIDGenerator();\n }\n\n /**\n * Collect all fingerprint data\n * This is the main method that replaces FingerprintJS.get()\n */\n async collect(): Promise<FingerprintData> {\n if (this.cachedData) {\n return this.cachedData;\n }\n\n this.collectionStartTime = performance.now();\n\n const components: FingerprintComponents = {};\n\n // Collect synchronous components first (fast)\n try {\n components.canvas = this.collectors.canvas.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Canvas collection failed:', e);\n }\n\n try {\n components.webgl = this.collectors.webgl.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] WebGL collection failed:', e);\n }\n\n try {\n components.fonts = this.collectors.fonts.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Font detection failed:', e);\n }\n\n try {\n components.screen = this.collectors.screen.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Screen collection failed:', e);\n }\n\n try {\n components.timezone = this.collectors.timezone.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Timezone collection failed:', e);\n }\n\n try {\n components.plugins = this.collectors.plugins.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Plugin collection failed:', e);\n }\n\n try {\n components.cpu = this.collectors.cpu.collect();\n } catch (e) {\n console.warn('[Keverd SDK] CPU collection failed:', e);\n }\n\n try {\n components.touch = this.collectors.touch.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Touch collection failed:', e);\n }\n\n // Collect async components (may take longer)\n try {\n components.audio = await this.collectors.audio.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Audio collection failed:', e);\n }\n\n try {\n components.mediaDevices = await this.collectors.mediaDevices.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Media devices collection failed:', e);\n }\n\n try {\n components.battery = await this.collectors.battery.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Battery collection failed:', e);\n }\n\n try {\n components.storage = await this.collectors.storage.collect();\n } catch (e) {\n console.warn('[Keverd SDK] Storage collection failed:', e);\n }\n\n try {\n components.permissions = await this.collectors.permissions.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] Permissions collection failed:', e);\n }\n\n try {\n components.webrtc = await this.collectors.webrtc.collect() || undefined;\n } catch (e) {\n console.warn('[Keverd SDK] WebRTC collection failed:', e);\n }\n\n // Generate visitor ID from all components\n const visitorId = this.visitorIDGenerator.generate(components);\n\n // Calculate confidence score\n const confidence = this.visitorIDGenerator.calculateConfidence(components);\n\n // const totalDuration = performance.now() - this.collectionStartTime;\n\n this.cachedData = {\n visitorId,\n confidence: Math.round(confidence * 1000) / 1000, // Round to 3 decimal places\n components,\n version: '1.0.0', // SDK version\n timestamp: Date.now(),\n };\n\n return this.cachedData;\n }\n\n /**\n * Get visitor ID only (faster, uses cached data if available)\n */\n async getVisitorId(): Promise<string> {\n const data = await this.collect();\n return data.visitorId;\n }\n\n /**\n * Clear all cached data\n */\n clearCache(): void {\n this.cachedData = null;\n // Clear all collector caches\n Object.values(this.collectors).forEach(collector => {\n if (collector && typeof collector.clearCache === 'function') {\n collector.clearCache();\n }\n });\n }\n\n /**\n * Get collection statistics\n */\n getStats(): {\n componentsCollected: number;\n totalComponents: number;\n collectionTime: number;\n } {\n if (!this.cachedData) {\n return {\n componentsCollected: 0,\n totalComponents: 13,\n collectionTime: 0,\n };\n }\n\n const componentsCollected = Object.keys(this.cachedData.components).length;\n const collectionTime = performance.now() - this.collectionStartTime;\n\n return {\n componentsCollected,\n totalComponents: 13,\n collectionTime: Math.round(collectionTime * 100) / 100,\n };\n }\n}\n\n","/**\n * Privacy Signal Collector\n * Detects incognito mode, VPN/proxy, automation/bots, and ad blockers\n */\n\nexport interface PrivacySignals {\n isIncognito: boolean;\n isVPN: boolean;\n isAutomated: boolean;\n hasAdBlocker: boolean;\n}\n\nexport class PrivacySignalCollector {\n private cachedSignals: PrivacySignals | null = null;\n\n /**\n * Collect all privacy signals\n */\n collect(): PrivacySignals {\n if (this.cachedSignals) {\n return this.cachedSignals;\n }\n\n const signals: PrivacySignals = {\n isIncognito: this.detectIncognito(),\n isVPN: false, // VPN detection requires backend IP analysis\n isAutomated: this.detectAutomation(),\n hasAdBlocker: this.detectAdBlocker(),\n };\n\n this.cachedSignals = signals;\n return signals;\n }\n\n /**\n * Detect incognito/private mode\n * Uses multiple detection methods for accuracy\n */\n private detectIncognito(): boolean {\n try {\n // Method 1: FileSystem API availability\n // In incognito mode, FileSystem API is often unavailable\n if ('storage' in navigator && 'estimate' in navigator.storage) {\n // This will throw in some incognito modes\n try {\n navigator.storage.estimate().then(() => {}).catch(() => {});\n } catch {\n return true;\n }\n }\n\n // Method 2: Storage quota limits\n // Incognito mode often has very limited storage\n // Note: This is async, so we check synchronously if possible\n if ('storage' in navigator && 'estimate' in navigator.storage) {\n // We can't await here, so we'll check synchronously available methods\n // The async check would be done elsewhere if needed\n }\n\n // Method 3: Battery API availability\n // Some browsers disable Battery API in incognito\n // Note: This is async, so we check synchronously if possible\n if ('getBattery' in navigator) {\n // Check if the API exists, but don't call it (async)\n // The actual check would be done elsewhere if needed\n }\n\n // Method 4: Chrome-specific check\n // @ts-ignore - Chrome-specific property\n if ((window as any).chrome && (window as any).chrome.runtime && !(window as any).chrome.runtime.onConnect) {\n return true;\n }\n\n // Method 5: localStorage quota test\n try {\n const testKey = '__incognito_test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n } catch {\n // localStorage blocked - likely incognito\n return true;\n }\n\n return false;\n } catch (error) {\n // If detection fails, assume not incognito (conservative)\n return false;\n }\n }\n\n /**\n * Detect automation/bot frameworks\n */\n private detectAutomation(): boolean {\n try {\n // Method 1: navigator.webdriver property\n // Set by Selenium, Puppeteer, Playwright, etc.\n // @ts-ignore - webdriver property\n if (navigator.webdriver === true) {\n return true;\n }\n\n // Method 2: Chrome DevTools Protocol detection\n // @ts-ignore - Chrome-specific\n if (window.chrome && window.chrome.runtime && window.chrome.runtime.onConnect) {\n // @ts-ignore\n const hasDevTools = window.chrome.runtime.onConnect.hasListeners();\n if (hasDevTools) {\n return true;\n }\n }\n\n // Method 3: Missing browser APIs (headless browsers often lack these)\n if (!(window as any).chrome && !(window as any).safari) {\n // Check for missing APIs that real browsers have\n if (!window.Notification || !(window as any).DeviceMotionEvent) {\n return true;\n }\n }\n\n // Method 4: Canvas fingerprint anomalies\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillText('Automation test', 2, 2);\n const fingerprint = canvas.toDataURL();\n // Headless browsers often produce identical fingerprints\n if (fingerprint.length < 100) {\n return true;\n }\n }\n } catch {\n // Canvas blocked - could indicate automation\n }\n\n // Method 5: Check for automation frameworks\n // @ts-ignore\n if (window.__nightmare || window.__phantomas || window.Buffer) {\n return true;\n }\n\n return false;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Detect ad blocker\n */\n private detectAdBlocker(): boolean {\n try {\n // Method 1: Try to load a known ad URL\n const testDiv = document.createElement('div');\n testDiv.innerHTML = ' ';\n testDiv.className = 'adsbox';\n testDiv.style.position = 'absolute';\n testDiv.style.left = '-9999px';\n document.body.appendChild(testDiv);\n\n // Check if ad blocker removed the element\n setTimeout(() => {\n const isBlocked = testDiv.offsetHeight === 0 || testDiv.offsetWidth === 0;\n document.body.removeChild(testDiv);\n return isBlocked;\n }, 100);\n\n // Method 2: Check for blocked scripts\n const scripts = Array.from(document.getElementsByTagName('script'));\n const blockedCount = scripts.filter((script) => {\n return script.src && script.src.includes('ads') && !script.textContent;\n }).length;\n\n if (blockedCount > 0) {\n return true;\n }\n\n // Method 3: Check for common ad blocker properties\n // @ts-ignore\n if (window.uBlock || window.adblock || window.BlockAdBlock) {\n return true;\n }\n\n return false;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Clear cached signals (useful for testing)\n */\n clearCache(): void {\n this.cachedSignals = null;\n }\n}\n\n","/**\n * Browser Capability Collector\n * Collects browser API availability and capabilities\n */\n\nexport interface BrowserCapabilities {\n hasWebGL: boolean;\n hasCanvas: boolean;\n hasWebRTC: boolean;\n hasServiceWorker: boolean;\n hasIndexedDB: boolean;\n hasLocalStorage: boolean;\n hasSessionStorage: boolean;\n cookieEnabled: boolean;\n doNotTrack: boolean;\n}\n\nexport class BrowserCapabilityCollector {\n private cachedCapabilities: BrowserCapabilities | null = null;\n\n /**\n * Collect all browser capabilities\n */\n collect(): BrowserCapabilities {\n if (this.cachedCapabilities) {\n return this.cachedCapabilities;\n }\n\n const capabilities: BrowserCapabilities = {\n hasWebGL: this.checkWebGL(),\n hasCanvas: this.checkCanvas(),\n hasWebRTC: this.checkWebRTC(),\n hasServiceWorker: this.checkServiceWorker(),\n hasIndexedDB: this.checkIndexedDB(),\n hasLocalStorage: this.checkLocalStorage(),\n hasSessionStorage: this.checkSessionStorage(),\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack === '1' || navigator.doNotTrack === 'yes',\n };\n\n this.cachedCapabilities = capabilities;\n return capabilities;\n }\n\n private checkWebGL(): boolean {\n try {\n const canvas = document.createElement('canvas');\n return !!(canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));\n } catch {\n return false;\n }\n }\n\n private checkCanvas(): boolean {\n try {\n const canvas = document.createElement('canvas');\n return !!canvas.getContext('2d');\n } catch {\n return false;\n }\n }\n\n private checkWebRTC(): boolean {\n return !!(\n (window.RTCPeerConnection ||\n // @ts-ignore\n window.webkitRTCPeerConnection ||\n // @ts-ignore\n window.mozRTCPeerConnection) &&\n navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia\n );\n }\n\n private checkServiceWorker(): boolean {\n return 'serviceWorker' in navigator;\n }\n\n private checkIndexedDB(): boolean {\n return 'indexedDB' in window;\n }\n\n private checkLocalStorage(): boolean {\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n private checkSessionStorage(): boolean {\n try {\n const test = '__sessionStorage_test__';\n sessionStorage.setItem(test, test);\n sessionStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Clear cached capabilities (useful for testing)\n */\n clearCache(): void {\n this.cachedCapabilities = null;\n }\n}\n\n","/**\n * Hardware Signal Collector\n * Collects hardware and network information\n */\n\nexport interface HardwareSignals {\n hardwareConcurrency: number;\n deviceMemory: number | null;\n maxTouchPoints: number;\n connectionType: string | null;\n effectiveType: string | null;\n downlink: number | null;\n rtt: number | null;\n saveData: boolean | null;\n}\n\nexport class HardwareSignalCollector {\n private cachedSignals: HardwareSignals | null = null;\n\n /**\n * Collect all hardware signals\n */\n collect(): HardwareSignals {\n if (this.cachedSignals) {\n return this.cachedSignals;\n }\n\n const signals: HardwareSignals = {\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n deviceMemory: this.getDeviceMemory(),\n maxTouchPoints: navigator.maxTouchPoints || 0,\n connectionType: this.getConnectionType(),\n effectiveType: this.getEffectiveType(),\n downlink: this.getDownlink(),\n rtt: this.getRTT(),\n saveData: this.getSaveData(),\n };\n\n this.cachedSignals = signals;\n return signals;\n }\n\n private getDeviceMemory(): number | null {\n // @ts-ignore - deviceMemory is not in all TypeScript definitions\n if ('deviceMemory' in navigator && navigator.deviceMemory) {\n // @ts-ignore\n return navigator.deviceMemory;\n }\n return null;\n }\n\n private getConnectionType(): string | null {\n // @ts-ignore - Connection API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.type) {\n return connection.type;\n }\n return null;\n }\n\n private getEffectiveType(): string | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.effectiveType) {\n return connection.effectiveType;\n }\n return null;\n }\n\n private getDownlink(): number | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.downlink) {\n return connection.downlink;\n }\n return null;\n }\n\n private getRTT(): number | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.rtt) {\n return connection.rtt;\n }\n return null;\n }\n\n private getSaveData(): boolean | null {\n // @ts-ignore - NetworkInformation API\n const connection = (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection;\n if (connection && connection.saveData !== undefined) {\n return connection.saveData;\n }\n return null;\n }\n\n /**\n * Clear cached signals (useful for testing)\n */\n clearCache(): void {\n this.cachedSignals = null;\n }\n}\n\n","/**\n * Form Interaction Collector\n * Tracks form field interactions: focus/blur, copy/paste, autofill, etc.\n */\n\nexport interface FormInteractions {\n focusCount: number;\n blurCount: number;\n copyCount: number;\n pasteCount: number;\n cutCount: number;\n autofillDetected: boolean;\n autocompleteDetected: boolean;\n fieldFocusOrder: string[];\n timePerField: Record<string, number>;\n backspaceCount: number;\n deleteCount: number;\n}\n\nexport class FormInteractionCollector {\n private focusCount = 0;\n private blurCount = 0;\n private copyCount = 0;\n private pasteCount = 0;\n private cutCount = 0;\n private fieldFocusOrder: string[] = [];\n private fieldFocusTimes: Map<string, number> = new Map();\n private backspaceCount = 0;\n private deleteCount = 0;\n private autofillDetected = false;\n private autocompleteDetected = false;\n private isActive = false;\n\n private focusHandler = (event: FocusEvent) => this.handleFocus(event);\n private blurHandler = (event: FocusEvent) => this.handleBlur(event);\n private copyHandler = (event: ClipboardEvent) => this.handleCopy(event);\n private pasteHandler = (event: ClipboardEvent) => this.handlePaste(event);\n private cutHandler = (event: ClipboardEvent) => this.handleCut(event);\n private keydownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n private inputHandler = (event: Event) => this.handleInput(event);\n\n /**\n * Start collecting form interactions\n */\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n\n document.addEventListener('focus', this.focusHandler, true);\n document.addEventListener('blur', this.blurHandler, true);\n document.addEventListener('copy', this.copyHandler, true);\n document.addEventListener('paste', this.pasteHandler, true);\n document.addEventListener('cut', this.cutHandler, true);\n document.addEventListener('keydown', this.keydownHandler, true);\n document.addEventListener('input', this.inputHandler, true);\n\n this.isActive = true;\n }\n\n /**\n * Stop collecting form interactions\n */\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n\n document.removeEventListener('focus', this.focusHandler, true);\n document.removeEventListener('blur', this.blurHandler, true);\n document.removeEventListener('copy', this.copyHandler, true);\n document.removeEventListener('paste', this.pasteHandler, true);\n document.removeEventListener('cut', this.cutHandler, true);\n document.removeEventListener('keydown', this.keydownHandler, true);\n document.removeEventListener('input', this.inputHandler, true);\n\n this.isActive = false;\n }\n\n /**\n * Get collected form interaction data\n */\n getData(): FormInteractions {\n // Calculate time per field\n const timePerField: Record<string, number> = {};\n this.fieldFocusTimes.forEach((time, fieldId) => {\n timePerField[fieldId] = time;\n });\n\n return {\n focusCount: this.focusCount,\n blurCount: this.blurCount,\n copyCount: this.copyCount,\n pasteCount: this.pasteCount,\n cutCount: this.cutCount,\n autofillDetected: this.autofillDetected,\n autocompleteDetected: this.autocompleteDetected,\n fieldFocusOrder: [...this.fieldFocusOrder],\n timePerField,\n backspaceCount: this.backspaceCount,\n deleteCount: this.deleteCount,\n };\n }\n\n /**\n * Reset all collected data\n */\n reset(): void {\n this.focusCount = 0;\n this.blurCount = 0;\n this.copyCount = 0;\n this.pasteCount = 0;\n this.cutCount = 0;\n this.fieldFocusOrder = [];\n this.fieldFocusTimes.clear();\n this.backspaceCount = 0;\n this.deleteCount = 0;\n this.autofillDetected = false;\n this.autocompleteDetected = false;\n }\n\n private handleFocus(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n if (!this.isFormField(target)) return;\n\n this.focusCount++;\n const fieldId = this.getFieldId(target);\n if (fieldId && !this.fieldFocusOrder.includes(fieldId)) {\n this.fieldFocusOrder.push(fieldId);\n }\n this.fieldFocusTimes.set(fieldId || 'unknown', Date.now());\n }\n\n private handleBlur(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n if (!this.isFormField(target)) return;\n\n this.blurCount++;\n const fieldId = this.getFieldId(target);\n if (fieldId) {\n const focusTime = this.fieldFocusTimes.get(fieldId) || Date.now();\n const timeSpent = Date.now() - focusTime;\n this.fieldFocusTimes.set(fieldId, timeSpent);\n }\n }\n\n private handleCopy(event: ClipboardEvent): void {\n const target = event.target as HTMLElement;\n if (this.isFormField(target)) {\n this.copyCount++;\n }\n }\n\n private handlePaste(event: ClipboardEvent): void {\n const target = event.target as HTMLElement;\n if (this.isFormField(target)) {\n this.pasteCount++;\n }\n }\n\n private handleCut(event: ClipboardEvent): void {\n const target = event.target as HTMLElement;\n if (this.isFormField(target)) {\n this.cutCount++;\n }\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n if (!this.isFormField(target)) return;\n\n if (event.key === 'Backspace') {\n this.backspaceCount++;\n } else if (event.key === 'Delete') {\n this.deleteCount++;\n }\n }\n\n private handleInput(event: Event): void {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n if (!this.isFormField(target)) return;\n\n // Detect autofill/autocomplete\n // Autofill often triggers input events with specific patterns\n const value = target.value;\n if (value && target.type === 'password') {\n // Password autofill detection\n this.autofillDetected = true;\n }\n\n // Check for autocomplete attribute\n if (target.hasAttribute('autocomplete') && target.getAttribute('autocomplete') !== 'off') {\n this.autocompleteDetected = true;\n }\n }\n\n private isFormField(element: HTMLElement | null): boolean {\n if (!element) return false;\n const tagName = element.tagName.toLowerCase();\n return (\n tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select' ||\n element.isContentEditable\n );\n }\n\n private getFieldId(element: HTMLElement): string | null {\n if (element.id) return element.id;\n // Check if element has name property (HTMLInputElement, HTMLSelectElement, etc.)\n if ('name' in element && (element as HTMLInputElement).name) {\n return (element as HTMLInputElement).name;\n }\n if (element.getAttribute('data-field-id')) {\n return element.getAttribute('data-field-id');\n }\n return null;\n }\n}\n\n","/**\n * Page Interaction Collector\n * Tracks page-level interactions: load time, scroll depth, clicks, etc.\n */\n\nexport interface PageInteractions {\n pageLoadTime: number;\n timeToFirstInteraction: number;\n timeOnPage: number;\n scrollDepth: number;\n clickCount: number;\n linkClickCount: number;\n imageViewCount: number;\n videoPlayCount: number;\n}\n\nexport class PageInteractionCollector {\n private pageLoadTime = 0;\n private timeToFirstInteraction = 0;\n private startTime = Date.now();\n private firstInteractionTime: number | null = null;\n private maxScrollDepth = 0;\n private clickCount = 0;\n private linkClickCount = 0;\n private imageViewCount = 0;\n private videoPlayCount = 0;\n private isActive = false;\n\n private clickHandler = (event: MouseEvent) => this.handleClick(event);\n private scrollHandler = () => this.handleScroll();\n private loadHandler = () => this.handleLoad();\n private imageLoadHandler = () => this.handleImageLoad();\n private videoPlayHandler = () => this.handleVideoPlay();\n\n constructor() {\n this.startTime = performance.now();\n }\n\n /**\n * Start collecting page interactions\n */\n start(): void {\n if (this.isActive || typeof document === 'undefined') return;\n\n // Track page load time\n if (document.readyState === 'complete') {\n this.pageLoadTime = performance.now() - this.startTime;\n } else {\n window.addEventListener('load', this.loadHandler);\n }\n\n document.addEventListener('click', this.clickHandler, true);\n window.addEventListener('scroll', this.scrollHandler, { passive: true });\n document.addEventListener('load', this.imageLoadHandler, true);\n document.addEventListener('play', this.videoPlayHandler, true);\n\n this.isActive = true;\n }\n\n /**\n * Stop collecting page interactions\n */\n stop(): void {\n if (!this.isActive || typeof document === 'undefined') return;\n\n window.removeEventListener('load', this.loadHandler);\n document.removeEventListener('click', this.clickHandler, true);\n window.removeEventListener('scroll', this.scrollHandler);\n document.removeEventListener('load', this.imageLoadHandler, true);\n document.removeEventListener('play', this.videoPlayHandler, true);\n\n this.isActive = false;\n }\n\n /**\n * Get collected page interaction data\n */\n getData(): PageInteractions {\n const timeOnPage = Date.now() - this.startTime;\n const scrollDepth = this.calculateScrollDepth();\n\n return {\n pageLoadTime: this.pageLoadTime,\n timeToFirstInteraction: this.firstInteractionTime\n ? this.firstInteractionTime - this.startTime\n : 0,\n timeOnPage,\n scrollDepth,\n clickCount: this.clickCount,\n linkClickCount: this.linkClickCount,\n imageViewCount: this.imageViewCount,\n videoPlayCount: this.videoPlayCount,\n };\n }\n\n /**\n * Reset all collected data\n */\n reset(): void {\n this.pageLoadTime = 0;\n this.timeToFirstInteraction = 0;\n this.startTime = Date.now();\n this.firstInteractionTime = null;\n this.maxScrollDepth = 0;\n this.clickCount = 0;\n this.linkClickCount = 0;\n this.imageViewCount = 0;\n this.videoPlayCount = 0;\n }\n\n private handleLoad(): void {\n this.pageLoadTime = performance.now() - this.startTime;\n }\n\n private handleClick(event: MouseEvent): void {\n if (!this.firstInteractionTime) {\n this.firstInteractionTime = performance.now();\n }\n\n this.clickCount++;\n\n const target = event.target as HTMLElement;\n if (target.tagName.toLowerCase() === 'a' || target.closest('a')) {\n this.linkClickCount++;\n }\n }\n\n private handleScroll(): void {\n const scrollDepth = this.calculateScrollDepth();\n this.maxScrollDepth = Math.max(this.maxScrollDepth, scrollDepth);\n }\n\n private handleImageLoad(): void {\n this.imageViewCount++;\n }\n\n private handleVideoPlay(): void {\n this.videoPlayCount++;\n }\n\n private calculateScrollDepth(): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return 0;\n }\n\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const documentHeight = Math.max(\n document.body.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.clientHeight,\n document.documentElement.scrollHeight,\n document.documentElement.offsetHeight\n );\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\n if (documentHeight === 0) return 0;\n\n const scrolled = scrollTop + windowHeight;\n return Math.min(scrolled / documentHeight, 1.0);\n }\n}\n\n","/**\n * Keverd Fraud SDK Core (Vanilla JS)\n * Main SDK class for fingerprinting and risk assessment\n * Matches backend FingerprintSDKRequest format exactly\n */\n\nimport { SDKConfig, FingerprintRequest, FingerprintResponse, TransactionMetadata } from '../types';\nimport { DeviceCollector } from '../collectors/device';\nimport { BehavioralCollector } from '../collectors/behavioral';\nimport { FingerprintManager } from '../collectors/fingerprint-manager';\nimport { PrivacySignalCollector } from '../collectors/privacy-signals';\nimport { BrowserCapabilityCollector } from '../collectors/browser-capabilities';\nimport { HardwareSignalCollector } from '../collectors/hardware-signals';\nimport { FormInteractionCollector } from '../collectors/form-interactions';\nimport { PageInteractionCollector } from '../collectors/page-interactions';\n\nconst DEFAULT_ENDPOINT = 'https://api.keverd.com';\n\nexport class KeverdSDK {\n private config: SDKConfig | null = null;\n private deviceCollector: DeviceCollector;\n private behavioralCollector: BehavioralCollector;\n private fingerprintManager: FingerprintManager;\n private privacySignalCollector: PrivacySignalCollector;\n private browserCapabilityCollector: BrowserCapabilityCollector;\n private hardwareSignalCollector: HardwareSignalCollector;\n private formInteractionCollector: FormInteractionCollector;\n private pageInteractionCollector: PageInteractionCollector;\n private isInitialized = false;\n private sessionId: string | null = null;\n private ghostInterval: ReturnType<typeof setInterval> | null = null;\n private ghostStartTime: number | null = null;\n private ghostSignalCount = 0;\n private readonly MIN_GHOST_SIGNALS = 10; // Collect at least 10 signals (5 minutes of data)\n private readonly MAX_GHOST_COLLECTION_TIME = 10 * 60 * 1000; // Maximum 10 minutes of collection\n\n constructor() {\n this.deviceCollector = new DeviceCollector();\n this.behavioralCollector = new BehavioralCollector();\n this.fingerprintManager = new FingerprintManager();\n this.privacySignalCollector = new PrivacySignalCollector();\n this.browserCapabilityCollector = new BrowserCapabilityCollector();\n this.hardwareSignalCollector = new HardwareSignalCollector();\n this.formInteractionCollector = new FormInteractionCollector();\n this.pageInteractionCollector = new PageInteractionCollector();\n }\n\n /**\n * Initialize the SDK with configuration\n */\n init(config: SDKConfig | string): void {\n if (this.isInitialized) {\n if (this.config?.debug) {\n console.warn('[Keverd SDK] Already initialized');\n }\n return;\n }\n\n // Handle simplified API key only initialization\n if (typeof config === 'string') {\n this.config = {\n apiKey: config,\n debug: false,\n };\n } else {\n this.config = {\n debug: false,\n ...config,\n };\n }\n\n // Start behavioral collection (non-blocking, passive listeners)\n this.behavioralCollector.start();\n this.formInteractionCollector.start();\n this.pageInteractionCollector.start();\n\n // Generate session ID\n this.sessionId = this.generateSessionId();\n\n this.isInitialized = true;\n\n if (this.config.debug) {\n console.log('[Keverd SDK] Initialized successfully');\n }\n\n // Start session on server (fire and forget)\n this.startSession().catch(() => {\n // Session will be created on first event if this fails\n });\n\n // Start non-billable ghost collection (every 30s until sufficient data is collected)\n this.startGhostSignalCollection();\n }\n\n private startGhostSignalCollection(): void {\n // Avoid starting multiple intervals\n if (this.ghostInterval) return;\n if (!this.config) return;\n\n // Record start time for duration calculation\n this.ghostStartTime = Date.now();\n this.ghostSignalCount = 0;\n\n const intervalMs = 30_000;\n\n // Function to send ghost signal\n const sendGhostSignal = () => {\n // Check if we've collected sufficient data\n const now = Date.now();\n const totalCollectionTime = this.ghostStartTime ? now - this.ghostStartTime : 0;\n \n // Stop if we've collected enough signals OR exceeded max collection time\n const hasEnoughSignals = this.ghostSignalCount >= this.MIN_GHOST_SIGNALS;\n const exceededMaxTime = totalCollectionTime >= this.MAX_GHOST_COLLECTION_TIME;\n \n if (hasEnoughSignals || exceededMaxTime) {\n if (this.config?.debug) {\n console.log(`[Keverd SDK] Ghost collection complete: ${this.ghostSignalCount} signals, ${Math.round(totalCollectionTime / 1000)}s elapsed`);\n }\n this.stopGhostSignalCollection();\n return;\n }\n\n // Calculate duration since last ghost signal (or since start for first signal)\n const durationMs = this.ghostStartTime \n ? now - this.ghostStartTime \n : intervalMs;\n\n // Fire and forget; never block app\n this.sendGhostSignals(durationMs).catch((err) => {\n if (this.config?.debug) {\n console.debug('[Keverd SDK] Ghost signals upload failed:', err);\n }\n });\n\n // Increment signal count\n this.ghostSignalCount++;\n\n // Reset start time for next interval\n this.ghostStartTime = now;\n };\n\n // Send first ghost signal after 30 seconds\n setTimeout(() => {\n sendGhostSignal();\n\n // Start interval for subsequent signals (every 30 seconds)\n this.ghostInterval = setInterval(() => {\n sendGhostSignal();\n }, intervalMs);\n }, intervalMs);\n }\n\n private stopGhostSignalCollection(): void {\n if (this.ghostInterval) {\n clearInterval(this.ghostInterval);\n this.ghostInterval = null;\n this.ghostStartTime = null;\n }\n }\n\n private async sendGhostSignals(durationMs: number): Promise<void> {\n if (!this.isInitialized || !this.config) return;\n\n const deviceInfo = this.deviceCollector.collect();\n const behavioralData = this.behavioralCollector.getData();\n\n // Collect custom fingerprint data (async) so we can attach visitorId for correlation.\n const fingerprintData = await this.fingerprintManager.collect();\n const fingerprintjsData = {\n visitorId: fingerprintData.visitorId,\n confidence: fingerprintData.confidence,\n components: fingerprintData.components,\n };\n\n const privacySignals = this.privacySignalCollector.collect();\n const browserCapabilities = this.browserCapabilityCollector.collect();\n const hardwareSignals = this.hardwareSignalCollector.collect();\n const formInteractions = this.formInteractionCollector.getData();\n const mouseSignals = this.behavioralCollector.getMouseSignals();\n const keyboardSignals = this.behavioralCollector.getKeyboardSignals();\n const pageInteractions = this.pageInteractionCollector.getData();\n\n const networkSignals = {\n connectionType: hardwareSignals.connectionType || undefined,\n effectiveType: hardwareSignals.effectiveType || undefined,\n downlink: hardwareSignals.downlink || undefined,\n rtt: hardwareSignals.rtt || undefined,\n saveData: hardwareSignals.saveData || undefined,\n };\n\n const sessionInfo = {\n sessionId: this.sessionId || undefined,\n timestamp: new Date().toISOString(),\n };\n\n const request: FingerprintRequest = {\n userId: this.config.userId,\n device: deviceInfo,\n session: sessionInfo,\n behavioral: behavioralData,\n duration_ms: durationMs,\n fingerprintjs: fingerprintjsData || undefined,\n privacySignals,\n browserCapabilities,\n hardwareSignals,\n formInteractions,\n mouseSignals,\n keyboardSignals,\n pageInteractions,\n networkSignals,\n useCase: 'ghost',\n };\n\n const url = `${DEFAULT_ENDPOINT}/fingerprint/ghost`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SDK-Source': 'javascript',\n };\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n }).catch(() => {\n // swallow network failures\n });\n }\n\n /**\n * Get visitor data (fingerprint and risk assessment)\n * This is the main method for getting risk scores\n */\n async getVisitorData(): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n try {\n // Collect device information\n const deviceInfo = this.deviceCollector.collect();\n\n // Collect behavioral data\n const behavioralData = this.behavioralCollector.getData();\n\n // Collect custom fingerprint data (async) - replaces FingerprintJS\n const fingerprintData = await this.fingerprintManager.collect();\n \n // Transform to match existing FingerprintJSData interface for backend compatibility\n const fingerprintjsData = {\n visitorId: fingerprintData.visitorId,\n confidence: fingerprintData.confidence,\n components: fingerprintData.components,\n };\n\n // Collect privacy signals\n const privacySignals = this.privacySignalCollector.collect();\n\n // Collect browser capabilities\n const browserCapabilities = this.browserCapabilityCollector.collect();\n\n // Collect hardware signals\n const hardwareSignals = this.hardwareSignalCollector.collect();\n\n // Collect form interactions\n const formInteractions = this.formInteractionCollector.getData();\n\n // Collect mouse signals from kinematic engine\n const mouseSignals = this.behavioralCollector.getMouseSignals();\n\n // Collect keyboard signals from keystroke monitor\n const keyboardSignals = this.behavioralCollector.getKeyboardSignals();\n\n // Collect page interactions\n const pageInteractions = this.pageInteractionCollector.getData();\n\n // Extract network signals from hardware signals\n const networkSignals = {\n connectionType: hardwareSignals.connectionType || undefined,\n effectiveType: hardwareSignals.effectiveType || undefined,\n downlink: hardwareSignals.downlink || undefined,\n rtt: hardwareSignals.rtt || undefined,\n saveData: hardwareSignals.saveData || undefined,\n };\n\n // Build session info\n const sessionInfo = {\n sessionId: this.sessionId || undefined,\n timestamp: new Date().toISOString(),\n };\n\n // Build request in SDK format (matches backend FingerprintSDKRequest)\n const request: FingerprintRequest = {\n userId: this.config.userId,\n device: deviceInfo,\n session: sessionInfo,\n behavioral: behavioralData,\n fingerprintjs: fingerprintjsData || undefined,\n privacySignals,\n browserCapabilities,\n hardwareSignals,\n formInteractions,\n mouseSignals,\n keyboardSignals,\n pageInteractions,\n networkSignals,\n useCase: 'general',\n // Note: sim field is NOT included for web SDKs\n };\n\n // Send to backend\n const response = await this.sendFingerprintRequest(request);\n\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n \n if (this.config.debug) {\n console.error('[Keverd SDK] Error getting visitor data:', error);\n }\n\n throw new Error(`Failed to get visitor data: ${errorMessage}`);\n }\n }\n\n /**\n * Create transaction ID with risk assessment (legacy method)\n * For new implementations, use getVisitorData() instead\n */\n async createTransactionID(_metadata?: TransactionMetadata): Promise<string> {\n const response = await this.getVisitorData();\n // Return session_id as transaction ID for backward compatibility\n return response.session_id;\n }\n\n /**\n * Verify user identity during login attempts\n */\n async verifyLogin(userId?: string, metadata?: Record<string, unknown>): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('login', { userId, metadata });\n return response;\n }\n\n /**\n * Verify user during checkout/payment\n */\n async verifyCheckout(\n amount?: number,\n currency?: string,\n metadata?: Record<string, unknown>\n ): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('checkout', { amount, currency, metadata });\n return response;\n }\n\n /**\n * Detect fake/bot registrations\n */\n async verifyRegistration(metadata?: Record<string, unknown>): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('registration', { metadata });\n return response;\n }\n\n /**\n * Detect account takeover attempts during password reset\n */\n async verifyPasswordReset(email?: string, metadata?: Record<string, unknown>): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('password_reset', { email, metadata });\n return response;\n }\n\n /**\n * Verify sensitive account changes (email, phone, password)\n */\n async verifyAccountChange(\n changeType?: string,\n metadata?: Record<string, unknown>\n ): Promise<FingerprintResponse> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n const response = await this.sendVerifyRequest('account_change', { changeType, metadata });\n return response;\n }\n\n /**\n * Helper to send verify request to use-case-specific endpoint\n */\n private async sendVerifyRequest(\n useCase: string,\n options: {\n userId?: string;\n amount?: number;\n currency?: string;\n email?: string;\n changeType?: string;\n metadata?: Record<string, unknown>;\n }\n ): Promise<FingerprintResponse> {\n if (!this.config) {\n throw new Error('SDK not initialized');\n }\n\n // Collect all signals (same as getVisitorData)\n const deviceInfo = this.deviceCollector.collect();\n const behavioralData = this.behavioralCollector.getData();\n \n // Collect custom fingerprint data (async) - replaces FingerprintJS\n const fingerprintData = await this.fingerprintManager.collect();\n \n // Transform to match existing FingerprintJSData interface for backend compatibility\n const fingerprintjsData = {\n visitorId: fingerprintData.visitorId,\n confidence: fingerprintData.confidence,\n components: fingerprintData.components,\n };\n \n const privacySignals = this.privacySignalCollector.collect();\n const browserCapabilities = this.browserCapabilityCollector.collect();\n const hardwareSignals = this.hardwareSignalCollector.collect();\n const formInteractions = this.formInteractionCollector.getData();\n const mouseSignals = this.behavioralCollector.getMouseSignals();\n const keyboardSignals = this.behavioralCollector.getKeyboardSignals();\n const pageInteractions = this.pageInteractionCollector.getData();\n\n const networkSignals = {\n connectionType: hardwareSignals.connectionType || undefined,\n effectiveType: hardwareSignals.effectiveType || undefined,\n downlink: hardwareSignals.downlink || undefined,\n rtt: hardwareSignals.rtt || undefined,\n saveData: hardwareSignals.saveData || undefined,\n };\n\n const sessionInfo = {\n sessionId: this.sessionId || undefined,\n timestamp: new Date().toISOString(),\n };\n\n // Build request with use case\n const request: FingerprintRequest = {\n userId: options.userId || this.config.userId,\n device: deviceInfo,\n session: sessionInfo,\n behavioral: behavioralData,\n fingerprintjs: fingerprintjsData || undefined,\n privacySignals,\n browserCapabilities,\n hardwareSignals,\n formInteractions,\n mouseSignals,\n keyboardSignals,\n pageInteractions,\n networkSignals,\n useCase,\n };\n\n // Merge metadata into request\n if (options.metadata) {\n Object.assign(request, options.metadata);\n }\n if (options.amount !== undefined) {\n (request as any).amount = options.amount;\n }\n if (options.currency) {\n (request as any).currency = options.currency;\n }\n if (options.email) {\n (request as any).email = options.email;\n }\n if (options.changeType) {\n (request as any).changeType = options.changeType;\n }\n\n const url = `${DEFAULT_ENDPOINT}/fingerprint/verify/${useCase}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SDK-Source': 'javascript',\n };\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const data: FingerprintResponse = await response.json();\n return data;\n }\n\n /**\n * Send fingerprint request to backend\n */\n private async sendFingerprintRequest(\n request: FingerprintRequest\n ): Promise<FingerprintResponse> {\n if (!this.config) {\n throw new Error('SDK not initialized');\n }\n\n // Note: Ghost collection continues independently until sufficient data is collected\n // User fingerprint submissions don't stop ghost collection\n\n const url = `${DEFAULT_ENDPOINT}/fingerprint/score`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SDK-Source': 'javascript', // Identify SDK source for backend analytics\n };\n\n // Add API key to headers (support multiple header formats)\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const data: FingerprintResponse = await response.json();\n return data;\n }\n\n /**\n * Generate a unique session ID\n */\n private generateSessionId(): string {\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Detect browser name from user agent\n */\n private _detectBrowser(): string | undefined {\n const ua = navigator.userAgent;\n if (ua.includes('Chrome')) return 'Chrome';\n if (ua.includes('Firefox')) return 'Firefox';\n if (ua.includes('Safari') && !ua.includes('Chrome')) return 'Safari';\n if (ua.includes('Edge')) return 'Edge';\n if (ua.includes('Opera')) return 'Opera';\n return undefined;\n }\n\n /**\n * Detect OS from user agent\n */\n private _detectOS(): string | undefined {\n const ua = navigator.userAgent;\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Mac OS')) return 'macOS';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) return 'iOS';\n return undefined;\n }\n\n /**\n * Start a new session (called automatically on init, but can be called manually)\n */\n async startSession(\n userId?: string,\n deviceHash?: string,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!this.isInitialized || !this.config) {\n throw new Error('Keverd SDK not initialized. Call init() first.');\n }\n\n if (!this.sessionId) {\n this.sessionId = this.generateSessionId();\n }\n\n try {\n const url = `${DEFAULT_ENDPOINT}/dashboard/sessions/start`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n // Collect device info for metadata\n const deviceInfo = this.deviceCollector.collect();\n \n await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n session_id: this.sessionId,\n user_id: userId || this.config.userId,\n device_hash: deviceHash || deviceInfo.fingerprint,\n metadata: metadata || {},\n user_agent: navigator.userAgent,\n browser: this._detectBrowser(),\n os: this._detectOS(),\n platform: 'web',\n sdk_type: 'web',\n sdk_source: 'javascript',\n }),\n });\n\n if (this.config.debug) {\n console.log(`[Keverd SDK] Session started: ${this.sessionId}`);\n }\n } catch (error) {\n if (this.config.debug) {\n console.warn('[Keverd SDK] Failed to start session on server:', error);\n }\n // Continue even if server call fails - session will be created on first event\n }\n }\n\n /**\n * End the current session\n */\n async endSession(): Promise<void> {\n if (!this.isInitialized || !this.config || !this.sessionId) {\n return;\n }\n\n try {\n const url = `${DEFAULT_ENDPOINT}/dashboard/sessions/${this.sessionId}/end`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n await fetch(url, {\n method: 'POST',\n headers,\n });\n\n if (this.config.debug) {\n console.log(`[Keverd SDK] Session ended: ${this.sessionId}`);\n }\n } catch (error) {\n if (this.config.debug) {\n console.warn('[Keverd SDK] Failed to end session on server:', error);\n }\n }\n }\n\n /**\n * Pause the current session (e.g., when app goes to background)\n */\n async pauseSession(): Promise<void> {\n if (!this.isInitialized || !this.config || !this.sessionId) {\n return;\n }\n\n try {\n const url = `${DEFAULT_ENDPOINT}/dashboard/sessions/${this.sessionId}/pause`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n await fetch(url, {\n method: 'POST',\n headers,\n });\n\n if (this.config.debug) {\n console.log(`[Keverd SDK] Session paused: ${this.sessionId}`);\n }\n } catch (error) {\n if (this.config.debug) {\n console.warn('[Keverd SDK] Failed to pause session on server:', error);\n }\n }\n }\n\n /**\n * Resume a paused session (e.g., when app comes to foreground)\n */\n async resumeSession(): Promise<void> {\n if (!this.isInitialized || !this.config || !this.sessionId) {\n return;\n }\n\n try {\n const url = `${DEFAULT_ENDPOINT}/dashboard/sessions/${this.sessionId}/resume`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n await fetch(url, {\n method: 'POST',\n headers,\n });\n\n if (this.config.debug) {\n console.log(`[Keverd SDK] Session resumed: ${this.sessionId}`);\n }\n } catch (error) {\n if (this.config.debug) {\n console.warn('[Keverd SDK] Failed to resume session on server:', error);\n }\n }\n }\n\n /**\n * Get current session status\n */\n async getSessionStatus(): Promise<{\n session_id: string;\n status: string;\n is_active: boolean;\n is_paused: boolean;\n event_count: number;\n started_at: string;\n last_activity_at: string;\n duration_seconds: number | null;\n } | null> {\n if (!this.isInitialized || !this.config || !this.sessionId) {\n return null;\n }\n\n try {\n const url = `${DEFAULT_ENDPOINT}/dashboard/sessions/${this.sessionId}/status`;\n const headers: Record<string, string> = {};\n\n const apiKey = this.config.apiKey;\n if (apiKey) {\n headers['x-keverd-key'] = apiKey;\n headers['X-API-KEY'] = apiKey;\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n return null;\n }\n\n return await response.json();\n } catch (error) {\n if (this.config.debug) {\n console.warn('[Keverd SDK] Failed to get session status:', error);\n }\n return null;\n }\n }\n\n /**\n * Destroy the SDK instance\n */\n async destroy(): Promise<void> {\n // End session before destroying\n if (this.sessionId) {\n await this.endSession();\n }\n\n this.behavioralCollector.stop();\n this.formInteractionCollector.stop();\n this.pageInteractionCollector.stop();\n this.fingerprintManager.clearCache();\n this.isInitialized = false;\n\n // Stop ghost signal collection\n this.stopGhostSignalCollection();\n this.ghostSignalCount = 0;\n \n // Log debug message BEFORE nulling config\n if (this.config?.debug) {\n console.log('[Keverd SDK] Destroyed');\n }\n \n this.config = null;\n this.sessionId = null;\n }\n\n /**\n * Check if SDK is initialized and ready to use\n */\n isReady(): boolean {\n return this.isInitialized && this.config !== null;\n }\n}\n\n// Export singleton instance for convenience\nexport const Keverd = new KeverdSDK();\n","/**\n * Angular service for Keverd SDK\n * Provides RxJS observables for reactive data access\n * Wraps the web SDK to provide Angular-specific interface with all enhanced signals\n */\n\nimport { Injectable, Inject, Optional } from '@angular/core';\nimport { Observable, from, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport type {\n KeverdConfig,\n KeverdVisitorData,\n KeverdVisitorDataOptions,\n KeverdError,\n} from '../types';\n// Import web SDK - in production this would be @keverdjs/fraud-sdk\n// For local development, we reference it relatively\nimport { Keverd as WebSDK } from '../../../fraud-sdk/src/index';\nimport type { FingerprintResponse } from '../../../fraud-sdk/src/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class KeverdService {\n private config: KeverdConfig | null = null;\n private isInitialized = false;\n\n constructor(@Optional() @Inject('KEVERD_CONFIG') config?: KeverdConfig) {\n // Web SDK handles all collectors including FingerprintJS\n\n if (config) {\n this.init(config);\n }\n }\n\n /**\n * Initialize the SDK with configuration\n * Wraps the web SDK initialization\n */\n init(config: KeverdConfig): void {\n if (this.isInitialized) {\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[Keverd SDK] Already initialized');\n }\n return;\n }\n\n if (!config.apiKey) {\n throw new Error('Keverd SDK: apiKey is required');\n }\n\n this.config = {\n debug: false,\n ...config,\n };\n\n // Initialize the web SDK with all enhanced signals including FingerprintJS\n WebSDK.init({\n apiKey: this.config.apiKey,\n userId: this.config.userId,\n debug: this.config.debug || false,\n });\n\n this.isInitialized = true;\n\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.log('[Keverd SDK] Initialized successfully');\n }\n\n // Start session on server (fire and forget)\n WebSDK.startSession().catch(() => {\n // Session will be created on first event if this fails\n });\n }\n\n /**\n * Get visitor data (fingerprint and risk assessment)\n * Returns an RxJS Observable\n */\n getVisitorData(options?: KeverdVisitorDataOptions): Observable<KeverdVisitorData> {\n if (!this.isInitialized || !this.config) {\n const error: KeverdError = {\n message: 'Keverd SDK not initialized. Call init() first.',\n code: 'SDK_NOT_INITIALIZED',\n };\n return throwError(() => error);\n }\n\n return from(this.collectAndSendFingerprint(options)).pipe(\n map((response) => this.transformResponse(response)),\n catchError((error) => {\n const keverdError: KeverdError = {\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'FETCH_ERROR',\n };\n\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.error('[Keverd SDK] Error getting visitor data:', error);\n }\n\n return throwError(() => keverdError);\n })\n );\n }\n\n /**\n * Collect data and send fingerprint request\n * Uses the web SDK which includes all enhanced signals including FingerprintJS\n */\n private async collectAndSendFingerprint(\n _options?: KeverdVisitorDataOptions\n ): Promise<FingerprintResponse> {\n if (!this.config) {\n throw new Error('SDK not initialized');\n }\n\n // Use web SDK which includes all enhanced signals:\n // - FingerprintJS visitor ID\n // - Privacy signals (incognito, VPN, automation, ad blocker)\n // - Browser capabilities\n // - Hardware signals\n // - Form interactions\n // - Mouse signals\n // - Keyboard signals\n // - Page interactions\n // - Network signals\n return await WebSDK.getVisitorData();\n }\n\n /**\n * Transform API response to visitor data format\n */\n private transformResponse(response: FingerprintResponse): KeverdVisitorData {\n return {\n visitorId: response.requestId,\n riskScore: response.risk_score,\n score: response.score,\n action: response.action,\n reasons: response.reason || [],\n sessionId: response.session_id,\n requestId: response.requestId,\n simSwapEngine: response.sim_swap_engine,\n confidence: response.confidence || (1.0 - response.score),\n // Enhanced fields\n fingerprintjsVisitorId: response.fingerprintjs_visitor_id,\n privacySignals: response.privacy_signals ? {\n isIncognito: response.privacy_signals.is_incognito,\n isVPN: response.privacy_signals.is_vpn,\n isAutomated: response.privacy_signals.is_automated,\n hasAdBlocker: response.privacy_signals.has_ad_blocker,\n } : undefined,\n deviceMatch: response.device_match,\n fraudProbability: response.fraud_probability,\n recommendedAction: response.recommended_action,\n };\n }\n\n /**\n * Generate a session ID\n */\n private generateSessionId(): string {\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Start a new session (called automatically on init, but can be called manually)\n */\n startSession(\n userId?: string,\n deviceHash?: string,\n metadata?: Record<string, unknown>\n ): Observable<void> {\n if (!this.isInitialized || !this.config) {\n return throwError(() => ({\n message: 'Keverd SDK not initialized. Call init() first.',\n code: 'SDK_NOT_INITIALIZED',\n }));\n }\n\n return from(WebSDK.startSession(userId, deviceHash, metadata)).pipe(\n catchError((error) => {\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[Keverd SDK] Failed to start session:', error);\n }\n return throwError(() => error);\n })\n );\n }\n\n /**\n * End the current session\n */\n endSession(): Observable<void> {\n if (!this.isInitialized || !this.config) {\n return throwError(() => ({\n message: 'Keverd SDK not initialized. Call init() first.',\n code: 'SDK_NOT_INITIALIZED',\n }));\n }\n\n return from(WebSDK.endSession()).pipe(\n catchError((error) => {\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[Keverd SDK] Failed to end session:', error);\n }\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Pause the current session (e.g., when app goes to background)\n */\n pauseSession(): Observable<void> {\n if (!this.isInitialized || !this.config) {\n return throwError(() => ({\n message: 'Keverd SDK not initialized. Call init() first.',\n code: 'SDK_NOT_INITIALIZED',\n }));\n }\n\n return from(WebSDK.pauseSession()).pipe(\n catchError((error) => {\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[Keverd SDK] Failed to pause session:', error);\n }\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Resume a paused session (e.g., when app comes to foreground)\n */\n resumeSession(): Observable<void> {\n if (!this.isInitialized || !this.config) {\n return throwError(() => ({\n message: 'Keverd SDK not initialized. Call init() first.',\n code: 'SDK_NOT_INITIALIZED',\n }));\n }\n\n return from(WebSDK.resumeSession()).pipe(\n catchError((error) => {\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[Keverd SDK] Failed to resume session:', error);\n }\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Get current session status\n */\n getSessionStatus(): Observable<{\n session_id: string;\n status: string;\n is_active: boolean;\n is_paused: boolean;\n event_count: number;\n started_at: string;\n last_activity_at: string;\n duration_seconds: number | null;\n } | null> {\n if (!this.isInitialized || !this.config) {\n return throwError(() => ({\n message: 'Keverd SDK not initialized. Call init() first.',\n code: 'SDK_NOT_INITIALIZED',\n }));\n }\n\n return from(WebSDK.getSessionStatus()).pipe(\n catchError((error) => {\n if (this.config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[Keverd SDK] Failed to get session status:', error);\n }\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Destroy the SDK instance\n */\n destroy(): void {\n // End session before destroying (fire and forget)\n if (this.isInitialized) {\n WebSDK.endSession().catch(() => {\n // Ignore errors on destroy\n });\n }\n WebSDK.destroy();\n this.isInitialized = false;\n this.config = null;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): KeverdConfig | null {\n return this.config;\n }\n\n /**\n * Check if SDK is initialized\n */\n isReady(): boolean {\n return this.isInitialized;\n }\n}\n","/**\n * Angular module for Keverd SDK\n * Provides module configuration for easy setup\n */\n\nimport { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { KeverdService } from './services/keverd.service';\nimport type { KeverdConfig } from './types';\n\n@NgModule({\n imports: [CommonModule],\n providers: [KeverdService],\n})\nexport class KeverdModule {\n /**\n * Configure the module with SDK settings\n * Call this in your app.module.ts imports array\n * \n * @example\n * ```typescript\n * @NgModule({\n * imports: [\n * KeverdModule.forRoot({\n * apiKey: 'your-api-key',\n * })\n * ]\n * })\n * export class AppModule {}\n * ```\n */\n static forRoot(config: KeverdConfig): ModuleWithProviders<KeverdModule> {\n return {\n ngModule: KeverdModule,\n providers: [\n KeverdService,\n {\n provide: 'KEVERD_CONFIG',\n useValue: config,\n },\n ],\n };\n }\n}\n"]}
|