@keverdjs/fraud-sdk-react 1.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/LICENSE +22 -0
- package/README.md +340 -0
- package/dist/index.d.mts +365 -0
- package/dist/index.d.ts +365 -0
- package/dist/index.js +783 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +776 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/collectors/keverd-device-collector.ts","../src/collectors/keverd-behavioral-collector.ts","../src/core/keverd-sdk.ts","../src/react/KeverdProvider.tsx","../src/react/useKeverdVisitorData.ts"],"names":["vendor","combined","createContext","useRef","useState","useEffect","useContext","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Keverd Device Fingerprint Collector\n * Collects device information, canvas fingerprint, WebGL fingerprint, and generates a stable device ID\n */\n\nimport { KeverdDeviceInfo } from '../types';\n\nexport class KeverdDeviceCollector {\n private cachedDeviceInfo: KeverdDeviceInfo | null = null;\n\n /**\n * Collect all device information and generate fingerprint\n */\n collect(): KeverdDeviceInfo {\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\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 // Try to extract manufacturer from user agent\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 // Extract model information if available\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 // Extract OS version patterns\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 (required for backend compatibility)\n * Backend expects SHA-256 hash (64 hex characters)\n * Uses Web Crypto API synchronously via a cached approach\n */\n private hashString(str: string): string {\n // Use Web Crypto API if available (preferred method)\n // Since we need synchronous hashing for device fingerprint, we'll use\n // a deterministic hash that produces 64-char hex output\n // For true SHA-256, we'd need async, but for device fingerprinting,\n // a deterministic hash is acceptable as long as it's stable\n \n // Use a robust hash that produces 64-character hex output\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 * This is a deterministic hash that mimics SHA-256 characteristics\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","/**\n * Keverd Behavioral Data Collector\n * Collects typing patterns, mouse movements, swipe gestures, and calculates session entropy\n */\n\nimport { KeverdBehavioralData } from '../types';\n\ninterface KeystrokeEvent {\n key: string;\n timestamp: number;\n type: 'keydown' | 'keyup';\n dwellTime?: number;\n flightTime?: number;\n}\n\ninterface KeverdMouseEvent {\n x: number;\n y: number;\n timestamp: number;\n type: 'move' | 'click';\n velocity?: number;\n}\n\nexport class KeverdBehavioralCollector {\n private keystrokes: KeystrokeEvent[] = [];\n private mouseMovements: KeverdMouseEvent[] = [];\n private lastKeyDownTime: Map<string, number> = new Map();\n private lastKeyUpTime: number | null = null;\n private isActive = false;\n private sessionStartTime: number = Date.now();\n private typingDwellTimes: number[] = [];\n private typingFlightTimes: number[] = [];\n private swipeVelocities: number[] = [];\n private sessionEvents: Array<{ type: string; timestamp: number }> = [];\n private touchStartPositions: Map<number, { x: number; y: number; timestamp: number }> = new Map();\n\n private keyDownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n private keyUpHandler = (event: KeyboardEvent) => this.handleKeyUp(event);\n private mouseMoveHandler = (event: globalThis.MouseEvent) => this.handleMouseMove(event);\n private touchStartHandler = (event: TouchEvent) => this.handleTouchStart(event);\n private touchEndHandler = (event: TouchEvent) => this.handleTouchEnd(event);\n\n /**\n * Start collecting behavioral data\n */\n start(): void {\n if (this.isActive) return;\n\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', this.keyDownHandler, { passive: true });\n document.addEventListener('keyup', this.keyUpHandler, { passive: true });\n document.addEventListener('mousemove', this.mouseMoveHandler, { passive: true });\n document.addEventListener('touchstart', this.touchStartHandler, { passive: true });\n document.addEventListener('touchend', this.touchEndHandler, { passive: true });\n }\n\n this.isActive = true;\n this.sessionStartTime = Date.now();\n }\n\n /**\n * Stop collecting behavioral data\n */\n stop(): void {\n if (!this.isActive) return;\n\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', this.keyDownHandler);\n document.removeEventListener('keyup', this.keyUpHandler);\n document.removeEventListener('mousemove', this.mouseMoveHandler);\n document.removeEventListener('touchstart', this.touchStartHandler);\n document.removeEventListener('touchend', this.touchEndHandler);\n }\n\n this.isActive = false;\n }\n\n /**\n * Get collected behavioral data\n */\n getData(): KeverdBehavioralData {\n // Calculate typing dwell times (time key is held down)\n const dwellTimes = this.typingDwellTimes.slice(-20); // Last 20 samples\n const flightTimes = this.typingFlightTimes.slice(-20); // Last 20 samples\n\n // Calculate average swipe velocity\n const avgSwipeVelocity = this.swipeVelocities.length > 0\n ? this.swipeVelocities.reduce((a, b) => a + b, 0) / this.swipeVelocities.length\n : 0;\n\n // Calculate session entropy\n const sessionEntropy = this.calculateSessionEntropy();\n\n // Backend expects arrays/floats, not undefined\n // Send empty arrays if no data (backend will use defaults)\n return {\n typing_dwell_ms: dwellTimes.length > 0 ? dwellTimes : [],\n typing_flight_ms: flightTimes.length > 0 ? flightTimes : [],\n swipe_velocity: avgSwipeVelocity > 0 ? avgSwipeVelocity : 0.0,\n session_entropy: sessionEntropy >= 0 ? sessionEntropy : 0.0,\n };\n }\n\n /**\n * Reset collected data\n */\n reset(): void {\n this.keystrokes = [];\n this.mouseMovements = [];\n this.lastKeyDownTime.clear();\n this.lastKeyUpTime = null;\n this.typingDwellTimes = [];\n this.typingFlightTimes = [];\n this.swipeVelocities = [];\n this.sessionEvents = [];\n this.touchStartPositions.clear();\n this.sessionStartTime = Date.now();\n }\n\n /**\n * Handle keydown event\n */\n private handleKeyDown(event: KeyboardEvent): void {\n if (this.shouldIgnoreKey(event)) return;\n\n const now = performance.now();\n this.lastKeyDownTime.set(event.key, now);\n\n const keystroke: KeystrokeEvent = {\n key: event.key,\n timestamp: now,\n type: 'keydown',\n };\n\n this.keystrokes.push(keystroke);\n this.sessionEvents.push({ type: 'keydown', timestamp: now });\n }\n\n /**\n * Handle keyup event\n */\n private handleKeyUp(event: KeyboardEvent): void {\n if (this.shouldIgnoreKey(event)) return;\n\n const now = performance.now();\n const keyDownTime = this.lastKeyDownTime.get(event.key);\n\n // Calculate dwell time (time key was held down)\n if (keyDownTime !== undefined) {\n const dwellTime = now - keyDownTime;\n this.typingDwellTimes.push(dwellTime);\n this.lastKeyDownTime.delete(event.key);\n }\n\n // Calculate flight time (time between key releases)\n if (this.lastKeyUpTime !== null) {\n const flightTime = now - this.lastKeyUpTime;\n this.typingFlightTimes.push(flightTime);\n }\n\n this.lastKeyUpTime = now;\n\n const keystroke: KeystrokeEvent = {\n key: event.key,\n timestamp: now,\n type: 'keyup',\n };\n\n this.keystrokes.push(keystroke);\n this.sessionEvents.push({ type: 'keyup', timestamp: now });\n }\n\n /**\n * Handle mouse move event\n */\n private handleMouseMove(event: globalThis.MouseEvent): void {\n const mouseEvent: KeverdMouseEvent = {\n x: event.clientX,\n y: event.clientY,\n timestamp: performance.now(),\n type: 'move',\n };\n\n // Calculate velocity if we have previous movement\n if (this.mouseMovements.length > 0) {\n const lastEvent = this.mouseMovements[this.mouseMovements.length - 1];\n const timeDelta = mouseEvent.timestamp - lastEvent.timestamp;\n if (timeDelta > 0) {\n const distance = Math.sqrt(\n Math.pow(mouseEvent.x - lastEvent.x, 2) +\n Math.pow(mouseEvent.y - lastEvent.y, 2)\n );\n mouseEvent.velocity = distance / timeDelta;\n }\n }\n\n this.mouseMovements.push(mouseEvent);\n this.sessionEvents.push({ type: 'mousemove', timestamp: mouseEvent.timestamp });\n }\n\n /**\n * Handle touch start (for swipe detection)\n */\n private handleTouchStart(event: TouchEvent): void {\n const now = performance.now();\n for (let i = 0; i < event.touches.length; i++) {\n const touch = event.touches[i];\n this.touchStartPositions.set(touch.identifier, {\n x: touch.clientX,\n y: touch.clientY,\n timestamp: now,\n });\n }\n this.sessionEvents.push({\n type: 'touchstart',\n timestamp: now,\n });\n }\n\n /**\n * Handle touch end (calculate swipe velocity)\n */\n private handleTouchEnd(event: TouchEvent): void {\n const now = performance.now();\n for (let i = 0; i < event.changedTouches.length; i++) {\n const touch = event.changedTouches[i];\n const startPos = this.touchStartPositions.get(touch.identifier);\n\n if (startPos) {\n const timeDelta = now - startPos.timestamp;\n if (timeDelta > 0 && timeDelta < 1000) { // Valid swipe within 1 second\n const distance = Math.sqrt(\n Math.pow(touch.clientX - startPos.x, 2) +\n Math.pow(touch.clientY - startPos.y, 2)\n );\n if (distance > 10) { // Minimum swipe distance\n const velocity = distance / timeDelta;\n this.swipeVelocities.push(velocity);\n }\n }\n this.touchStartPositions.delete(touch.identifier);\n }\n }\n\n this.sessionEvents.push({\n type: 'touchend',\n timestamp: now,\n });\n }\n\n /**\n * Calculate session entropy based on event diversity\n */\n private calculateSessionEntropy(): number {\n if (this.sessionEvents.length === 0) return 0;\n\n // Count event types\n const eventTypeCounts: Record<string, number> = {};\n for (const event of this.sessionEvents) {\n eventTypeCounts[event.type] = (eventTypeCounts[event.type] || 0) + 1;\n }\n\n // Calculate Shannon entropy\n const totalEvents = this.sessionEvents.length;\n let entropy = 0;\n\n for (const count of Object.values(eventTypeCounts)) {\n const probability = count / totalEvents;\n if (probability > 0) {\n entropy -= probability * Math.log2(probability);\n }\n }\n\n return entropy;\n }\n\n /**\n * Check if key should be ignored\n */\n private shouldIgnoreKey(event: KeyboardEvent): boolean {\n // Ignore modifier keys and navigation keys\n const ignoredKeys = [\n 'Shift', 'Control', 'Alt', 'Meta', 'CapsLock',\n 'Tab', 'Escape', 'Enter', 'ArrowLeft', 'ArrowRight',\n 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown',\n 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12',\n ];\n\n return ignoredKeys.includes(event.key);\n }\n}\n\n","/**\n * Keverd Fraud SDK Core\n * Main SDK class for fingerprinting and risk assessment\n */\n\nimport {\n KeverdConfig,\n KeverdFingerprintRequest,\n KeverdFingerprintResponse,\n KeverdVisitorData,\n KeverdVisitorDataOptions,\n KeverdError,\n KeverdDeviceInfo,\n KeverdSessionInfo,\n KeverdBehavioralData,\n} from '../types';\nimport { KeverdDeviceCollector } from '../collectors/keverd-device-collector';\nimport { KeverdBehavioralCollector } from '../collectors/keverd-behavioral-collector';\n\nexport class KeverdSDK {\n private config: KeverdConfig | null = null;\n private deviceCollector: KeverdDeviceCollector;\n private behavioralCollector: KeverdBehavioralCollector;\n private isInitialized = false;\n private sessionId: string | null = null;\n\n constructor() {\n this.deviceCollector = new KeverdDeviceCollector();\n this.behavioralCollector = new KeverdBehavioralCollector();\n }\n\n /**\n * Initialize the SDK with configuration\n */\n init(config: KeverdConfig): void {\n if (this.isInitialized) {\n if (this.config?.debug) {\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 // Start behavioral collection\n this.behavioralCollector.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 */\n async getVisitorData(\n options?: KeverdVisitorDataOptions\n ): Promise<KeverdVisitorData> {\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 // Build session info\n const sessionInfo: KeverdSessionInfo = {\n sessionId: this.sessionId || undefined,\n timestamp: new Date().toISOString(),\n };\n\n // Build request\n const request: KeverdFingerprintRequest = {\n userId: this.config.userId,\n device: deviceInfo,\n session: sessionInfo,\n behavioral: behavioralData,\n };\n\n // Send to backend\n const response = await this.sendFingerprintRequest(request, options);\n\n // Transform response to visitor data\n return this.transformResponse(response);\n } catch (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 console.error('[Keverd SDK] Error getting visitor data:', error);\n }\n\n throw keverdError;\n }\n }\n\n /**\n * Send fingerprint request to backend\n */\n private async sendFingerprintRequest(\n request: KeverdFingerprintRequest,\n options?: KeverdVisitorDataOptions\n ): Promise<KeverdFingerprintResponse> {\n if (!this.config) {\n throw new Error('SDK not initialized');\n }\n\n const endpoint = this.config.endpoint || this.getDefaultEndpoint();\n const url = `${endpoint}/fingerprint/score`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SDK-Source': 'react', // 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 // Add sandbox header if needed\n if (options?.tag === 'sandbox') {\n headers['X-Sandbox'] = 'true';\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 const error: KeverdError = {\n message: `HTTP ${response.status}: ${errorText}`,\n code: `HTTP_${response.status}`,\n statusCode: response.status,\n };\n\n if (this.config.debug) {\n console.error('[Keverd SDK] API error:', error);\n }\n\n throw error;\n }\n\n const data: KeverdFingerprintResponse = await response.json();\n return data;\n }\n\n /**\n * Transform API response to visitor data format\n */\n private transformResponse(response: KeverdFingerprintResponse): 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: 1.0 - response.score, // Inverse of risk score as confidence\n };\n }\n\n /**\n * Get default endpoint\n */\n private getDefaultEndpoint(): string {\n return 'https://app.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 const wasDebug = this.config?.debug;\n this.behavioralCollector.stop();\n this.isInitialized = false;\n this.config = null;\n this.sessionId = null;\n\n if (wasDebug) {\n console.log('[Keverd SDK] Destroyed');\n }\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","/**\n * Keverd Provider Component\n * React Context Provider for Keverd SDK\n */\n\nimport React, { createContext, useContext, useEffect, useRef, useState, ReactNode } from 'react';\nimport { KeverdSDK } from '../core/keverd-sdk';\nimport { KeverdLoadOptions } from '../types';\n\ninterface KeverdContextValue {\n sdk: KeverdSDK;\n isReady: boolean;\n}\n\nconst KeverdContext = createContext<KeverdContextValue | null>(null);\n\nexport interface KeverdProviderProps {\n loadOptions: KeverdLoadOptions;\n children: ReactNode;\n}\n\n/**\n * KeverdProvider - Wrap your app with this component to enable Keverd SDK\n */\nexport function KeverdProvider({ loadOptions, children }: KeverdProviderProps) {\n const sdkRef = useRef<KeverdSDK>(new KeverdSDK());\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n // Initialize SDK\n const sdk = sdkRef.current;\n if (!sdk.isReady()) {\n sdk.init({\n apiKey: loadOptions.apiKey,\n endpoint: loadOptions.endpoint,\n debug: loadOptions.debug || false,\n });\n setIsReady(true);\n }\n\n // Cleanup on unmount\n return () => {\n if (sdk.isReady()) {\n sdk.destroy();\n setIsReady(false);\n }\n };\n }, []); // Only run once on mount\n\n const contextValue: KeverdContextValue = {\n sdk: sdkRef.current,\n isReady,\n };\n\n return (\n <KeverdContext.Provider value={contextValue}>\n {children}\n </KeverdContext.Provider>\n );\n}\n\n/**\n * Hook to access Keverd SDK from context\n */\nexport function useKeverdContext(): KeverdContextValue {\n const context = useContext(KeverdContext);\n if (!context) {\n throw new Error('useKeverdContext must be used within a KeverdProvider');\n }\n return context;\n}\n\n","/**\n * useKeverdVisitorData Hook\n * React hook for accessing visitor data and risk assessment\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n KeverdVisitorData,\n KeverdVisitorDataHookOptions,\n KeverdVisitorDataOptions,\n KeverdError,\n} from '../types';\nimport { useKeverdContext } from './KeverdProvider';\n\nexport interface KeverdVisitorDataResult {\n isLoading: boolean;\n error: KeverdError | null;\n data: KeverdVisitorData | null;\n getData: (options?: KeverdVisitorDataOptions) => Promise<KeverdVisitorData>;\n}\n\n/**\n * Hook to get visitor data and risk assessment\n * \n * @param options - Configuration options for the hook\n * @returns Object containing loading state, error, data, and getData function\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { isLoading, error, data, getData } = useKeverdVisitorData({\n * extendedResult: true,\n * immediate: true\n * });\n * \n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * \n * return (\n * <div>\n * <p>Risk Score: {data?.riskScore}</p>\n * <p>Action: {data?.action}</p>\n * <button onClick={() => getData({ ignoreCache: true })}>\n * Reload data\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useKeverdVisitorData(\n options?: KeverdVisitorDataHookOptions\n): KeverdVisitorDataResult {\n const { sdk, isReady } = useKeverdContext();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<KeverdError | null>(null);\n const [data, setData] = useState<KeverdVisitorData | null>(null);\n\n const getData = useCallback(\n async (getDataOptions?: KeverdVisitorDataOptions): Promise<KeverdVisitorData> => {\n if (!isReady || !sdk) {\n const notReadyError: KeverdError = {\n message: 'Keverd SDK is not ready',\n code: 'SDK_NOT_READY',\n };\n setError(notReadyError);\n throw notReadyError;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const visitorData = await sdk.getVisitorData(getDataOptions);\n setData(visitorData);\n setIsLoading(false);\n return visitorData;\n } catch (err) {\n const keverdError: KeverdError =\n err instanceof Error\n ? {\n message: err.message,\n code: 'UNKNOWN_ERROR',\n }\n : {\n message: 'Unknown error occurred',\n code: 'UNKNOWN_ERROR',\n };\n\n setError(keverdError);\n setIsLoading(false);\n throw keverdError;\n }\n },\n [sdk, isReady]\n );\n\n // Auto-fetch on mount if immediate is true\n useEffect(() => {\n if (options?.immediate && isReady && sdk && !data && !isLoading) {\n getData({\n extendedResult: options.extendedResult,\n ignoreCache: options.ignoreCache,\n }).catch(() => {\n // Error is already handled in getData\n });\n }\n }, [options?.immediate, isReady, sdk, data, isLoading, getData, options?.extendedResult, options?.ignoreCache]);\n\n return {\n isLoading,\n error,\n data,\n getData,\n };\n}\n\n"]}
|