@simplr-ai/web-components 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../simplr-js-sdk/src/utils/hash.ts","../../simplr-js-sdk/src/fingerprint/canvas.ts","../../simplr-js-sdk/src/fingerprint/webgl.ts","../../simplr-js-sdk/src/fingerprint/audio.ts","../../simplr-js-sdk/src/fingerprint/fonts.ts","../../simplr-js-sdk/src/fingerprint/browser.ts","../../simplr-js-sdk/src/utils/storage.ts","../../simplr-js-sdk/src/biometrics/keyboard.ts","../../simplr-js-sdk/src/biometrics/mouse.ts","../../simplr-js-sdk/src/biometrics/touch.ts","../../simplr-js-sdk/src/rum/session.ts","../../simplr-js-sdk/src/rum/clicks.ts","../../simplr-js-sdk/src/rum/errors.ts","../../simplr-js-sdk/src/rum/network.ts","../../simplr-js-sdk/src/types/rum.ts","../../simplr-js-sdk/src/rum/performance.ts","../../simplr-js-sdk/src/rum/logs.ts","../../simplr-js-sdk/src/rum/batch.ts","../../simplr-js-sdk/src/rum/location.ts","../../simplr-js-sdk/src/rum/index.ts","../../simplr-js-sdk/src/flags/index.ts","../../simplr-js-sdk/src/ai/index.ts","../../simplr-js-sdk/src/profiles/index.ts","../../simplr-js-sdk/src/index.ts","../src/controller.ts","../src/elements/provider.ts","../src/elements/protected-form.ts","../src/elements/protected-input.ts","../src/elements/feature-flag.ts","../src/elements/rum-view.ts","../src/elements/ai-delegation.ts","../src/define.ts","../src/global.ts"],"names":["sha256","input","data","hashBuffer","b","murmurHash3","seed","h1","c1","c2","i","k1","createFingerprintHash","components","values","key","value","getCanvasFingerprint","canvas","ctx","gradient","dataUrl","detectCanvasBlocking","firstPixel","allSame","getWebGLFingerprint","gl","webgl","debugInfo","vendor","renderer","params","extensions","getAudioFingerprint","AudioContext","context","oscillator","compressor","analyser","resolve","dataArray","dataStr","v","TEST_FONTS","BASE_FONTS","TEST_STRING","getTextDimensions","font","baseFont","span","rect","width","height","isFontAvailable","baseDimensions","testDimensions","getFontFingerprint","detectedFonts","getFontFingerprintModern","getBrowserFingerprint","navigator","screen","plugins","plugin","mimeTypes","mimeType","deviceMemory","isWebDriver","timezone","detectHeadless","indicators","detectOS","ua","match","detectBrowser","STORAGE_KEY","STORAGE_TIMESTAMP_KEY","generateDeviceId","timestamp","randomPart","randomPart2","getDeviceId","deviceId","getDeviceIdCreatedAt","clearDeviceId","KeystrokeTracker","event","keyId","count","interKeyDelays","delay","holdDurations","keystroke","correctionCount","k","totalDuration","typingSpeed","calculateMean","calculateStdDev","sum","mean","squaredDiffs","createKeystrokeTracker","MouseTracker","point","distance","timeDiff","velocities","accelerations","totalDistance","directionChanges","straightLineDistance","prev","curr","dx","dy","velocity","prevVelocity","acceleration","prevPrev","prevDx","prevDy","prevAngle","currAngle","angleDiff","first","last","clickIntervals","scrollSpeeds","calculateVariance","createMouseTracker","TouchTracker","touch","activeTouch","duration","pressures","t","p","radii","r","forces","f","createTouchTracker","isTouchSupported","SESSION_STORAGE_KEY","generateUUID","c","SessionManager","sessionTimeout","onSessionEnd","existingSession","now","userId","attributes","endedSession","stored","DeviceContextCollector","windowsMatch","macMatch","iosMatch","androidMatch","patterns","pattern","group","ViewManager","onViewEnd","name","url","viewId","EXCLUDED_TAGS","extractSafeText","element","ariaLabel","truncateText","title","placeholder","tag","text","cleaned","generateSelector","parts","current","depth","maxDepth","selector","classes","parent","tagName","siblings","index","generateActionName","type","role","ClickTracker","onAction","target","actionableElement","targetInfo","actionName","fullTarget","syntheticEvent","ScrollTracker","onScroll","currentY","endY","endTime","direction","sanitizeMessage","message","sanitized","sanitizeStack","stack","getErrorType","error","parseErrorEvent","parseUnhandledRejection","reason","parseError","handled","ErrorTracker","onError","errorData","options","self","args","arg","filename","ErrorDeduplicator","windowMs","maxDuplicates","messageLine","stackLine","DEFAULT_EXCLUDED_PATTERNS","sanitizeUrl","parsed","param","shouldExcludeUrl","excludedPatterns","allowedPatterns","NetworkTracker","onResource","init","method","startTime","requestSize","response","responseSize","contentLength","async","username","password","body","xhr","originalOnReadyStateChange","ev","WEB_VITALS_THRESHOLDS","getVitalRating","thresholds","PerformanceTracker","onVital","onLongTask","observer","list","entries","lastEntry","firstEntry","clsValue","sessionValue","sessionEntries","entry","fcpEntry","navEntry","ttfb","longTaskEntry","attr","NavigationTracker","onNavigate","newPath","originalPushState","originalReplaceState","sanitizeContext","keys","lowerKey","LogCollector","onLog","level","lastArg","RETRY_DELAYS","EventBatcher","eventsToFlush","events","retryCount","batch","result","ms","blob","EventSampler","sampleRate","eventType","DEFAULT_CONFIG","LocationTracker","_LocationTracker","config","onLocationUpdate","position","DEFAULT_ENDPOINT","_SimplrRUM","session","view","endpoint","resource","vital","longTask","from","to","log","location","success","initialPath","SimplrRUM","simplrRUM","matchRule","rule","actual","SimplrFlags","res","map","uid","simplrFlags","SimplrAI","mode","gatewayUrl","left","top","popup","messageHandler","checkClosed","token","delegationId","d","path","createSimplrAI","SimplrProfiles","fn","externalId","deviceSignals","order","signals","pos","reject","outcome","headers","errorBody","createSimplrProfiles","SimplrFraud","mouseHandlers","touchHandlers","fieldName","handlers","canvasFp","webglFp","audioFp","fontsFp","browserFp","headless","os","browser","fingerprintComponents","fingerprint","deviceIdCreatedAt","device","behavior","DEFAULT_BASE_URL","resolveBlock","block","fallback","SimplrController","apiKey","ve","flagsConfig","G","profilesConfig","j","Ze","aiConfig","$","collected","json","SimplrElements","isFeatureEnabled","readKey","el","flagFor","SimplrProviderElement","appId","SimplrProtectedFormElement","e","check","form","email","hidden","SimplrProtectedInputElement","SimplrFeatureFlagElement","on","SimplrRumViewElement","_n","oldV","newV","rum","SimplrAiDelegationElement","ai","binding","fingerprintHash","SIMPLR_ELEMENTS","defineSimplrElements","ctor"],"mappings":"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","file":"simplr-web-components.global.js","sourcesContent":["/**\n * Hash utilities for creating fingerprint hashes\n */\n\n/**\n * Creates a SHA-256 hash of the input string\n */\nexport async function sha256(input: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Creates a simple murmurhash3-like hash for fast fingerprinting\n * Used when crypto.subtle is not available or for non-sensitive data\n */\nexport function murmurHash3(input: string, seed = 0): number {\n let h1 = seed;\n const c1 = 0xcc9e2d51;\n const c2 = 0x1b873593;\n\n for (let i = 0; i < input.length; i++) {\n let k1 = input.charCodeAt(i);\n k1 = Math.imul(k1, c1);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = Math.imul(k1, c2);\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1 = Math.imul(h1, 5) + 0xe6546b64;\n }\n\n h1 ^= input.length;\n h1 ^= h1 >>> 16;\n h1 = Math.imul(h1, 0x85ebca6b);\n h1 ^= h1 >>> 13;\n h1 = Math.imul(h1, 0xc2b2ae35);\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n\n/**\n * Creates a combined fingerprint hash from multiple components\n */\nexport async function createFingerprintHash(\n components: Record<string, string | number | boolean | null | undefined>\n): Promise<string> {\n const sortedKeys = Object.keys(components).sort();\n const values = sortedKeys.map((key) => {\n const value = components[key];\n return `${key}:${value ?? \"null\"}`;\n });\n return sha256(values.join(\"|\"));\n}\n","/**\n * Canvas fingerprinting\n * Creates a unique fingerprint by drawing text and shapes on a canvas\n */\n\nimport { murmurHash3 } from \"../utils/hash\";\n\nexport interface CanvasFingerprint {\n hash: string;\n isSupported: boolean;\n}\n\n/**\n * Generates a canvas fingerprint by drawing text and shapes\n */\nexport function getCanvasFingerprint(): CanvasFingerprint {\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 280;\n canvas.height = 60;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return { hash: \"\", isSupported: false };\n }\n\n // Draw background\n ctx.fillStyle = \"#f0f0f0\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Draw text with various styles\n ctx.textBaseline = \"alphabetic\";\n ctx.fillStyle = \"#069\";\n ctx.font = \"15px 'Arial', sans-serif\";\n ctx.fillText(\"Simplr Fraud SDK\", 2, 15);\n\n ctx.fillStyle = \"rgba(102, 204, 0, 0.7)\";\n ctx.font = \"18px 'Times New Roman', serif\";\n ctx.fillText(\"Canvas Fingerprint\", 4, 35);\n\n // Draw shapes\n ctx.beginPath();\n ctx.arc(50, 50, 10, 0, Math.PI * 2);\n ctx.fillStyle = \"#f00\";\n ctx.fill();\n\n ctx.beginPath();\n ctx.moveTo(80, 40);\n ctx.lineTo(100, 55);\n ctx.lineTo(80, 55);\n ctx.closePath();\n ctx.fillStyle = \"#0f0\";\n ctx.fill();\n\n // Add gradient\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"red\");\n gradient.addColorStop(0.5, \"green\");\n gradient.addColorStop(1, \"blue\");\n ctx.fillStyle = gradient;\n ctx.fillRect(120, 40, 80, 15);\n\n // Get data URL and hash it\n const dataUrl = canvas.toDataURL(\"image/png\");\n const hash = murmurHash3(dataUrl).toString(16);\n\n return { hash, isSupported: true };\n } catch {\n return { hash: \"\", isSupported: false };\n }\n}\n\n/**\n * Detects if canvas fingerprinting is being blocked or spoofed\n */\nexport function detectCanvasBlocking(): boolean {\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 16;\n canvas.height = 16;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return true;\n\n // Draw something unique\n ctx.fillStyle = \"#ff0000\";\n ctx.fillRect(0, 0, 8, 8);\n ctx.fillStyle = \"#00ff00\";\n ctx.fillRect(8, 0, 8, 8);\n\n const imageData = ctx.getImageData(0, 0, 16, 16);\n const data = imageData.data;\n\n // Check if all pixels are the same (indicates blocking)\n const firstPixel = [data[0], data[1], data[2], data[3]];\n let allSame = true;\n for (let i = 4; i < data.length; i += 4) {\n if (\n data[i] !== firstPixel[0] ||\n data[i + 1] !== firstPixel[1] ||\n data[i + 2] !== firstPixel[2]\n ) {\n allSame = false;\n break;\n }\n }\n\n return allSame;\n } catch {\n return true;\n }\n}\n","/**\n * WebGL fingerprinting\n * Extracts GPU information and rendering characteristics\n */\n\nimport { murmurHash3 } from \"../utils/hash\";\n\nexport interface WebGLFingerprint {\n hash: string;\n vendor: string | null;\n renderer: string | null;\n isSupported: boolean;\n}\n\n/**\n * Gets WebGL renderer and vendor information\n */\nexport function getWebGLFingerprint(): WebGLFingerprint {\n try {\n const canvas = document.createElement(\"canvas\");\n const gl =\n canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n\n if (!gl) {\n return { hash: \"\", vendor: null, renderer: null, isSupported: false };\n }\n\n const webgl = gl as WebGLRenderingContext;\n\n // Get debug info extension for unmasked vendor/renderer\n const debugInfo = webgl.getExtension(\"WEBGL_debug_renderer_info\");\n\n let vendor: string | null = null;\n let renderer: string | null = null;\n\n if (debugInfo) {\n vendor = webgl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n renderer = webgl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n }\n\n // Fall back to masked values if debug info not available\n if (!vendor) {\n vendor = webgl.getParameter(webgl.VENDOR);\n }\n if (!renderer) {\n renderer = webgl.getParameter(webgl.RENDERER);\n }\n\n // Collect additional WebGL parameters for fingerprinting\n const params = [\n vendor,\n renderer,\n webgl.getParameter(webgl.VERSION),\n webgl.getParameter(webgl.SHADING_LANGUAGE_VERSION),\n webgl.getParameter(webgl.MAX_VERTEX_ATTRIBS),\n webgl.getParameter(webgl.MAX_VERTEX_UNIFORM_VECTORS),\n webgl.getParameter(webgl.MAX_VARYING_VECTORS),\n webgl.getParameter(webgl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n webgl.getParameter(webgl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\n webgl.getParameter(webgl.MAX_TEXTURE_IMAGE_UNITS),\n webgl.getParameter(webgl.MAX_FRAGMENT_UNIFORM_VECTORS),\n webgl.getParameter(webgl.MAX_TEXTURE_SIZE),\n webgl.getParameter(webgl.MAX_CUBE_MAP_TEXTURE_SIZE),\n webgl.getParameter(webgl.MAX_RENDERBUFFER_SIZE),\n webgl.getParameter(webgl.MAX_VIEWPORT_DIMS),\n webgl.getParameter(webgl.ALIASED_LINE_WIDTH_RANGE),\n webgl.getParameter(webgl.ALIASED_POINT_SIZE_RANGE),\n ];\n\n // Get supported extensions\n const extensions = webgl.getSupportedExtensions() || [];\n params.push(extensions.join(\",\"));\n\n const hash = murmurHash3(params.join(\"|\")).toString(16);\n\n return { hash, vendor, renderer, isSupported: true };\n } catch {\n return { hash: \"\", vendor: null, renderer: null, isSupported: false };\n }\n}\n\n/**\n * Detects if WebGL is being spoofed\n */\nexport function detectWebGLSpoofing(): boolean {\n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl\");\n if (!gl) return false;\n\n // Check for inconsistencies that indicate spoofing\n const renderer = gl.getParameter(gl.RENDERER);\n const vendor = gl.getParameter(gl.VENDOR);\n\n // Known spoofing patterns\n const spoofPatterns = [\n /^ANGLE/i, // Often legitimate, but check context\n /SwiftShader/i, // Software renderer (can be spoofed)\n /Microsoft Basic Render/i, // Software renderer\n ];\n\n for (const pattern of spoofPatterns) {\n if (pattern.test(renderer) || pattern.test(vendor)) {\n // Not necessarily spoofing, but worth noting\n return false;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n}\n","/**\n * Audio fingerprinting\n * Uses Web Audio API to generate a unique fingerprint based on audio processing\n */\n\nimport { murmurHash3 } from \"../utils/hash\";\n\nexport interface AudioFingerprint {\n hash: string;\n isSupported: boolean;\n}\n\n/**\n * Generates an audio fingerprint using oscillator and analyser\n */\nexport async function getAudioFingerprint(): Promise<AudioFingerprint> {\n try {\n // Check if AudioContext is available\n const AudioContext =\n window.AudioContext ||\n (window as unknown as { webkitAudioContext: typeof window.AudioContext })\n .webkitAudioContext;\n\n if (!AudioContext) {\n return { hash: \"\", isSupported: false };\n }\n\n const context = new AudioContext();\n\n // Create an oscillator\n const oscillator = context.createOscillator();\n oscillator.type = \"triangle\";\n oscillator.frequency.setValueAtTime(10000, context.currentTime);\n\n // Create a compressor for more unique processing\n const compressor = context.createDynamicsCompressor();\n compressor.threshold.setValueAtTime(-50, context.currentTime);\n compressor.knee.setValueAtTime(40, context.currentTime);\n compressor.ratio.setValueAtTime(12, context.currentTime);\n compressor.attack.setValueAtTime(0, context.currentTime);\n compressor.release.setValueAtTime(0.25, context.currentTime);\n\n // Create an analyser to capture the audio data\n const analyser = context.createAnalyser();\n analyser.fftSize = 256;\n\n // Connect the nodes\n oscillator.connect(compressor);\n compressor.connect(analyser);\n\n // Don't connect to destination (we don't want sound output)\n // analyser.connect(context.destination);\n\n // Start the oscillator briefly\n oscillator.start(0);\n\n // Wait a bit for audio processing\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n // Get frequency data\n const dataArray = new Float32Array(analyser.frequencyBinCount);\n analyser.getFloatFrequencyData(dataArray);\n\n // Stop the oscillator\n oscillator.stop();\n\n // Close the context\n await context.close();\n\n // Create hash from the frequency data\n const dataStr = Array.from(dataArray)\n .slice(0, 30)\n .map((v) => v.toFixed(2))\n .join(\",\");\n\n const hash = murmurHash3(dataStr).toString(16);\n\n return { hash, isSupported: true };\n } catch {\n return { hash: \"\", isSupported: false };\n }\n}\n\n/**\n * Quick check if audio fingerprinting is likely supported\n */\nexport function isAudioFingerprintSupported(): boolean {\n const AudioContext =\n window.AudioContext ||\n (window as unknown as { webkitAudioContext: typeof window.AudioContext })\n .webkitAudioContext;\n return !!AudioContext;\n}\n","/**\n * Font fingerprinting\n * Detects installed fonts by measuring text rendering differences\n */\n\nimport { murmurHash3 } from \"../utils/hash\";\n\nexport interface FontFingerprint {\n hash: string;\n detectedFonts: string[];\n fontCount: number;\n}\n\n// Common fonts to test across platforms\nconst TEST_FONTS = [\n // Windows fonts\n \"Arial\",\n \"Arial Black\",\n \"Calibri\",\n \"Cambria\",\n \"Comic Sans MS\",\n \"Consolas\",\n \"Courier New\",\n \"Georgia\",\n \"Impact\",\n \"Lucida Console\",\n \"Lucida Sans Unicode\",\n \"Microsoft Sans Serif\",\n \"Palatino Linotype\",\n \"Segoe UI\",\n \"Tahoma\",\n \"Times New Roman\",\n \"Trebuchet MS\",\n \"Verdana\",\n // macOS fonts\n \"American Typewriter\",\n \"Andale Mono\",\n \"Apple Chancery\",\n \"Avenir\",\n \"Baskerville\",\n \"Big Caslon\",\n \"Brush Script MT\",\n \"Chalkboard\",\n \"Copperplate\",\n \"Didot\",\n \"Futura\",\n \"Geneva\",\n \"Gill Sans\",\n \"Helvetica\",\n \"Helvetica Neue\",\n \"Herculanum\",\n \"Hoefler Text\",\n \"Lucida Grande\",\n \"Marker Felt\",\n \"Menlo\",\n \"Monaco\",\n \"Optima\",\n \"Papyrus\",\n \"Rockwell\",\n \"SF Pro\",\n \"Skia\",\n // Linux fonts\n \"Liberation Sans\",\n \"Liberation Serif\",\n \"Liberation Mono\",\n \"DejaVu Sans\",\n \"DejaVu Serif\",\n \"DejaVu Sans Mono\",\n \"Ubuntu\",\n \"Droid Sans\",\n \"Droid Serif\",\n \"Roboto\",\n \"Noto Sans\",\n \"Noto Serif\",\n // Common web fonts\n \"Open Sans\",\n \"Lato\",\n \"Montserrat\",\n \"Source Sans Pro\",\n \"Oswald\",\n \"Raleway\",\n \"PT Sans\",\n \"Merriweather\",\n \"Nunito\",\n \"Playfair Display\",\n];\n\n// Base fonts that are almost always available\nconst BASE_FONTS = [\"monospace\", \"sans-serif\", \"serif\"];\n\n// Test string with various characters\nconst TEST_STRING = \"mmmmmmmmmmlli\";\n\n/**\n * Gets the width and height of text rendered in a specific font\n */\nfunction getTextDimensions(\n font: string,\n baseFont: string\n): { width: number; height: number } {\n const span = document.createElement(\"span\");\n span.style.position = \"absolute\";\n span.style.left = \"-9999px\";\n span.style.fontSize = \"72px\";\n span.style.fontStyle = \"normal\";\n span.style.fontWeight = \"normal\";\n span.style.letterSpacing = \"normal\";\n span.style.lineHeight = \"normal\";\n span.style.textTransform = \"none\";\n span.style.textAlign = \"left\";\n span.style.textDecoration = \"none\";\n span.style.textShadow = \"none\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontFamily = `'${font}', ${baseFont}`;\n span.textContent = TEST_STRING;\n\n document.body.appendChild(span);\n const rect = span.getBoundingClientRect();\n const width = rect.width;\n const height = rect.height;\n document.body.removeChild(span);\n\n return { width, height };\n}\n\n/**\n * Detects if a font is installed by comparing against base fonts\n */\nfunction isFontAvailable(font: string): boolean {\n for (const baseFont of BASE_FONTS) {\n const baseDimensions = getTextDimensions(baseFont, baseFont);\n const testDimensions = getTextDimensions(font, baseFont);\n\n // If dimensions differ, the font is installed\n if (\n testDimensions.width !== baseDimensions.width ||\n testDimensions.height !== baseDimensions.height\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Generates a font fingerprint by detecting installed fonts\n */\nexport function getFontFingerprint(): FontFingerprint {\n try {\n const detectedFonts: string[] = [];\n\n for (const font of TEST_FONTS) {\n if (isFontAvailable(font)) {\n detectedFonts.push(font);\n }\n }\n\n const hash = murmurHash3(detectedFonts.join(\",\")).toString(16);\n\n return {\n hash,\n detectedFonts,\n fontCount: detectedFonts.length,\n };\n } catch {\n return {\n hash: \"\",\n detectedFonts: [],\n fontCount: 0,\n };\n }\n}\n\n/**\n * Quick font detection using document.fonts API (modern browsers only)\n */\nexport async function getFontFingerprintModern(): Promise<FontFingerprint> {\n try {\n // Check if the Font Access API is available\n if (!document.fonts) {\n return getFontFingerprint();\n }\n\n await document.fonts.ready;\n\n const detectedFonts: string[] = [];\n\n for (const font of TEST_FONTS) {\n if (document.fonts.check(`12px '${font}'`)) {\n detectedFonts.push(font);\n }\n }\n\n const hash = murmurHash3(detectedFonts.join(\",\")).toString(16);\n\n return {\n hash,\n detectedFonts,\n fontCount: detectedFonts.length,\n };\n } catch {\n // Fall back to traditional detection\n return getFontFingerprint();\n }\n}\n","/**\n * Browser and system fingerprinting\n * Collects browser, OS, and hardware information\n */\n\nexport interface BrowserFingerprint {\n userAgent: string;\n platform: string;\n vendor: string;\n language: string;\n languages: string[];\n cookiesEnabled: boolean;\n doNotTrack: string | null;\n timezone: string;\n timezoneOffset: number;\n screenResolution: string;\n screenColorDepth: number;\n devicePixelRatio: number;\n hardwareConcurrency: number;\n deviceMemory: number | null;\n maxTouchPoints: number;\n hasTouch: boolean;\n isWebDriver: boolean;\n plugins: string[];\n mimeTypes: string[];\n}\n\n/**\n * Collects browser and system information\n */\nexport function getBrowserFingerprint(): BrowserFingerprint {\n const navigator = window.navigator;\n const screen = window.screen;\n\n // Detect plugins\n const plugins: string[] = [];\n if (navigator.plugins) {\n for (let i = 0; i < navigator.plugins.length; i++) {\n const plugin = navigator.plugins[i];\n if (plugin?.name) {\n plugins.push(plugin.name);\n }\n }\n }\n\n // Detect MIME types\n const mimeTypes: string[] = [];\n if (navigator.mimeTypes) {\n for (let i = 0; i < navigator.mimeTypes.length; i++) {\n const mimeType = navigator.mimeTypes[i];\n if (mimeType?.type) {\n mimeTypes.push(mimeType.type);\n }\n }\n }\n\n // Get device memory (not available in all browsers)\n const deviceMemory =\n (navigator as unknown as { deviceMemory?: number }).deviceMemory ?? null;\n\n // Detect WebDriver (automation)\n const isWebDriver = !!(\n navigator.webdriver ||\n (window as unknown as { __webdriver_evaluate?: unknown })\n .__webdriver_evaluate ||\n (window as unknown as { __selenium_evaluate?: unknown })\n .__selenium_evaluate ||\n (window as unknown as { __webdriver_script_function?: unknown })\n .__webdriver_script_function ||\n (window as unknown as { __webdriver_script_func?: unknown })\n .__webdriver_script_func ||\n (window as unknown as { __webdriver_script_fn?: unknown })\n .__webdriver_script_fn ||\n (window as unknown as { __fxdriver_evaluate?: unknown })\n .__fxdriver_evaluate ||\n (window as unknown as { __driver_unwrapped?: unknown }).__driver_unwrapped ||\n (window as unknown as { __webdriver_unwrapped?: unknown })\n .__webdriver_unwrapped ||\n (window as unknown as { __driver_evaluate?: unknown }).__driver_evaluate ||\n (window as unknown as { __selenium_unwrapped?: unknown })\n .__selenium_unwrapped ||\n (window as unknown as { __fxdriver_unwrapped?: unknown })\n .__fxdriver_unwrapped ||\n (window as unknown as { _Selenium_IDE_Recorder?: unknown })\n ._Selenium_IDE_Recorder ||\n (window as unknown as { _selenium?: unknown })._selenium ||\n (window as unknown as { calledSelenium?: unknown }).calledSelenium ||\n /HeadlessChrome/.test(navigator.userAgent) ||\n /Headless/.test(navigator.userAgent)\n );\n\n // Get timezone\n let timezone = \"\";\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n // Timezone detection failed\n }\n\n return {\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n vendor: navigator.vendor,\n language: navigator.language,\n languages: [...navigator.languages],\n cookiesEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || null,\n timezone,\n timezoneOffset: new Date().getTimezoneOffset(),\n screenResolution: `${screen.width}x${screen.height}`,\n screenColorDepth: screen.colorDepth,\n devicePixelRatio: window.devicePixelRatio || 1,\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n deviceMemory,\n maxTouchPoints: navigator.maxTouchPoints || 0,\n hasTouch: \"ontouchstart\" in window || navigator.maxTouchPoints > 0,\n isWebDriver,\n plugins,\n mimeTypes,\n };\n}\n\n/**\n * Detects if the browser is running in headless mode\n */\nexport function detectHeadless(): {\n isHeadless: boolean;\n indicators: string[];\n} {\n const indicators: string[] = [];\n\n // Check navigator.webdriver\n if (navigator.webdriver) {\n indicators.push(\"webdriver\");\n }\n\n // Check for headless Chrome\n if (/HeadlessChrome/.test(navigator.userAgent)) {\n indicators.push(\"headless_chrome_ua\");\n }\n\n // Check for missing plugins (headless browsers often have none)\n if (navigator.plugins.length === 0) {\n indicators.push(\"no_plugins\");\n }\n\n // Check for missing languages\n if (!navigator.languages || navigator.languages.length === 0) {\n indicators.push(\"no_languages\");\n }\n\n // Check for Puppeteer/Playwright indicators\n if (\n (window as unknown as { __puppeteer_evaluation_script__?: unknown })\n .__puppeteer_evaluation_script__\n ) {\n indicators.push(\"puppeteer\");\n }\n\n // Check for PhantomJS\n if ((window as unknown as { callPhantom?: unknown }).callPhantom) {\n indicators.push(\"phantomjs\");\n }\n\n // Check for suspicious screen dimensions (common in headless)\n if (window.outerWidth === 0 || window.outerHeight === 0) {\n indicators.push(\"zero_dimensions\");\n }\n\n // Check chrome object (missing in headless)\n if (\n /Chrome/.test(navigator.userAgent) &&\n !(window as unknown as { chrome?: unknown }).chrome\n ) {\n indicators.push(\"missing_chrome_object\");\n }\n\n return {\n isHeadless: indicators.length > 0,\n indicators,\n };\n}\n\n/**\n * Detects the operating system from user agent\n */\nexport function detectOS(): { os: string; version: string | null } {\n const ua = navigator.userAgent;\n\n if (/Windows NT 10.0/.test(ua)) return { os: \"Windows\", version: \"10\" };\n if (/Windows NT 6.3/.test(ua)) return { os: \"Windows\", version: \"8.1\" };\n if (/Windows NT 6.2/.test(ua)) return { os: \"Windows\", version: \"8\" };\n if (/Windows NT 6.1/.test(ua)) return { os: \"Windows\", version: \"7\" };\n if (/Windows/.test(ua)) return { os: \"Windows\", version: null };\n\n if (/Mac OS X/.test(ua)) {\n const match = ua.match(/Mac OS X (\\d+[._]\\d+)/);\n const version = match ? match[1].replace(\"_\", \".\") : null;\n return { os: \"macOS\", version };\n }\n\n if (/Android/.test(ua)) {\n const match = ua.match(/Android (\\d+(\\.\\d+)?)/);\n return { os: \"Android\", version: match ? match[1] : null };\n }\n\n if (/iPhone|iPad|iPod/.test(ua)) {\n const match = ua.match(/OS (\\d+[._]\\d+)/);\n const version = match ? match[1].replace(\"_\", \".\") : null;\n return { os: \"iOS\", version };\n }\n\n if (/Linux/.test(ua)) return { os: \"Linux\", version: null };\n if (/CrOS/.test(ua)) return { os: \"Chrome OS\", version: null };\n\n return { os: \"Unknown\", version: null };\n}\n\n/**\n * Detects the browser from user agent\n */\nexport function detectBrowser(): { browser: string; version: string | null } {\n const ua = navigator.userAgent;\n\n // Order matters - check more specific patterns first\n if (/Edg\\//.test(ua)) {\n const match = ua.match(/Edg\\/(\\d+(\\.\\d+)?)/);\n return { browser: \"Edge\", version: match ? match[1] : null };\n }\n\n if (/OPR\\//.test(ua)) {\n const match = ua.match(/OPR\\/(\\d+(\\.\\d+)?)/);\n return { browser: \"Opera\", version: match ? match[1] : null };\n }\n\n if (/Chrome\\//.test(ua) && !/Chromium/.test(ua)) {\n const match = ua.match(/Chrome\\/(\\d+(\\.\\d+)?)/);\n return { browser: \"Chrome\", version: match ? match[1] : null };\n }\n\n if (/Firefox\\//.test(ua)) {\n const match = ua.match(/Firefox\\/(\\d+(\\.\\d+)?)/);\n return { browser: \"Firefox\", version: match ? match[1] : null };\n }\n\n if (/Safari\\//.test(ua) && !/Chrome/.test(ua)) {\n const match = ua.match(/Version\\/(\\d+(\\.\\d+)?)/);\n return { browser: \"Safari\", version: match ? match[1] : null };\n }\n\n return { browser: \"Unknown\", version: null };\n}\n","/**\n * Persistent storage utilities for device ID\n */\n\nconst STORAGE_KEY = \"simplr_device_id\";\nconst STORAGE_TIMESTAMP_KEY = \"simplr_device_id_ts\";\n\n/**\n * Generates a unique device ID\n */\nfunction generateDeviceId(): string {\n const timestamp = Date.now().toString(36);\n const randomPart = Math.random().toString(36).substring(2, 15);\n const randomPart2 = Math.random().toString(36).substring(2, 15);\n return `${timestamp}-${randomPart}-${randomPart2}`;\n}\n\n/**\n * Gets or creates a persistent device ID\n * Uses localStorage with fallback to sessionStorage, then memory\n */\nexport function getDeviceId(): string {\n // Try localStorage first\n if (typeof localStorage !== \"undefined\") {\n try {\n let deviceId = localStorage.getItem(STORAGE_KEY);\n if (!deviceId) {\n deviceId = generateDeviceId();\n localStorage.setItem(STORAGE_KEY, deviceId);\n localStorage.setItem(STORAGE_TIMESTAMP_KEY, Date.now().toString());\n }\n return deviceId;\n } catch {\n // localStorage blocked (e.g., private browsing)\n }\n }\n\n // Fallback to sessionStorage\n if (typeof sessionStorage !== \"undefined\") {\n try {\n let deviceId = sessionStorage.getItem(STORAGE_KEY);\n if (!deviceId) {\n deviceId = generateDeviceId();\n sessionStorage.setItem(STORAGE_KEY, deviceId);\n }\n return deviceId;\n } catch {\n // sessionStorage blocked\n }\n }\n\n // Final fallback: generate new ID each time (not ideal but works)\n return generateDeviceId();\n}\n\n/**\n * Gets the timestamp when the device ID was first created\n */\nexport function getDeviceIdCreatedAt(): Date | null {\n if (typeof localStorage !== \"undefined\") {\n try {\n const timestamp = localStorage.getItem(STORAGE_TIMESTAMP_KEY);\n if (timestamp) {\n return new Date(parseInt(timestamp, 10));\n }\n } catch {\n // Storage blocked\n }\n }\n return null;\n}\n\n/**\n * Clears the stored device ID (useful for testing)\n */\nexport function clearDeviceId(): void {\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.removeItem(STORAGE_KEY);\n localStorage.removeItem(STORAGE_TIMESTAMP_KEY);\n } catch {\n // Storage blocked\n }\n }\n if (typeof sessionStorage !== \"undefined\") {\n try {\n sessionStorage.removeItem(STORAGE_KEY);\n } catch {\n // Storage blocked\n }\n }\n}\n","/**\n * Keystroke dynamics tracking\n * Captures typing patterns including timing, rhythm, and corrections\n */\n\nexport interface KeystrokeData {\n key: string;\n keyCode: number;\n timestamp: number;\n keydownTime: number;\n keyupTime: number | null;\n holdDuration: number | null;\n}\n\nexport interface KeystrokeMetrics {\n /** Average time between key presses (ms) */\n avgInterKeyDelay: number;\n /** Standard deviation of inter-key delays */\n interKeyDelayStdDev: number;\n /** Average key hold duration (ms) */\n avgHoldDuration: number;\n /** Standard deviation of hold durations */\n holdDurationStdDev: number;\n /** Characters per second */\n typingSpeed: number;\n /** Ratio of corrections (backspace/delete) to total keystrokes */\n correctionRate: number;\n /** Total number of keystrokes */\n keystrokeCount: number;\n /** Number of corrections */\n correctionCount: number;\n /** Time from first to last keystroke (ms) */\n totalDuration: number;\n /** Inter-key delays array for detailed analysis */\n interKeyDelays: number[];\n /** Hold durations array for detailed analysis */\n holdDurations: number[];\n /** Detected paste events */\n pasteCount: number;\n}\n\nexport class KeystrokeTracker {\n private keystrokes: KeystrokeData[] = [];\n private pendingKeydowns: Map<string, KeystrokeData> = new Map();\n private startTime: number | null = null;\n private pasteCount = 0;\n private isTracking = false;\n\n /**\n * Starts tracking keystrokes\n */\n start(): void {\n if (this.isTracking) return;\n this.isTracking = true;\n this.reset();\n }\n\n /**\n * Stops tracking keystrokes\n */\n stop(): void {\n this.isTracking = false;\n }\n\n /**\n * Resets all collected data\n */\n reset(): void {\n this.keystrokes = [];\n this.pendingKeydowns.clear();\n this.startTime = null;\n this.pasteCount = 0;\n }\n\n /**\n * Handles keydown events\n */\n handleKeyDown(event: KeyboardEvent): void {\n if (!this.isTracking) return;\n\n const timestamp = performance.now();\n if (this.startTime === null) {\n this.startTime = timestamp;\n }\n\n // Ignore modifier keys alone\n if ([\"Control\", \"Alt\", \"Shift\", \"Meta\"].includes(event.key)) {\n return;\n }\n\n // Detect paste (Ctrl+V or Cmd+V)\n if ((event.ctrlKey || event.metaKey) && event.key === \"v\") {\n this.pasteCount++;\n return;\n }\n\n const keyId = `${event.code}-${event.key}`;\n\n // Avoid duplicate keydowns (key repeat)\n if (this.pendingKeydowns.has(keyId)) {\n return;\n }\n\n const data: KeystrokeData = {\n key: event.key,\n keyCode: event.keyCode,\n timestamp,\n keydownTime: timestamp,\n keyupTime: null,\n holdDuration: null,\n };\n\n this.pendingKeydowns.set(keyId, data);\n this.keystrokes.push(data);\n }\n\n /**\n * Handles keyup events\n */\n handleKeyUp(event: KeyboardEvent): void {\n if (!this.isTracking) return;\n\n const keyId = `${event.code}-${event.key}`;\n const data = this.pendingKeydowns.get(keyId);\n\n if (data) {\n const timestamp = performance.now();\n data.keyupTime = timestamp;\n data.holdDuration = timestamp - data.keydownTime;\n this.pendingKeydowns.delete(keyId);\n }\n }\n\n /**\n * Creates event handlers that can be attached to elements\n */\n getEventHandlers(): {\n onKeyDown: (e: KeyboardEvent) => void;\n onKeyUp: (e: KeyboardEvent) => void;\n onPaste: () => void;\n } {\n return {\n onKeyDown: this.handleKeyDown.bind(this),\n onKeyUp: this.handleKeyUp.bind(this),\n onPaste: () => {\n if (this.isTracking) this.pasteCount++;\n },\n };\n }\n\n /**\n * Calculates metrics from collected keystrokes\n */\n getMetrics(): KeystrokeMetrics {\n const count = this.keystrokes.length;\n\n if (count === 0) {\n return {\n avgInterKeyDelay: 0,\n interKeyDelayStdDev: 0,\n avgHoldDuration: 0,\n holdDurationStdDev: 0,\n typingSpeed: 0,\n correctionRate: 0,\n keystrokeCount: 0,\n correctionCount: 0,\n totalDuration: 0,\n interKeyDelays: [],\n holdDurations: [],\n pasteCount: this.pasteCount,\n };\n }\n\n // Calculate inter-key delays\n const interKeyDelays: number[] = [];\n for (let i = 1; i < this.keystrokes.length; i++) {\n const delay =\n this.keystrokes[i].keydownTime - this.keystrokes[i - 1].keydownTime;\n // Filter out very long delays (user paused) and negative values\n if (delay > 0 && delay < 2000) {\n interKeyDelays.push(delay);\n }\n }\n\n // Calculate hold durations\n const holdDurations: number[] = [];\n for (const keystroke of this.keystrokes) {\n if (keystroke.holdDuration !== null && keystroke.holdDuration > 0) {\n holdDurations.push(keystroke.holdDuration);\n }\n }\n\n // Count corrections (Backspace and Delete)\n const correctionCount = this.keystrokes.filter(\n (k) => k.key === \"Backspace\" || k.key === \"Delete\"\n ).length;\n\n // Calculate total duration\n const totalDuration =\n count > 0\n ? this.keystrokes[count - 1].keydownTime -\n this.keystrokes[0].keydownTime\n : 0;\n\n // Calculate typing speed (characters per second)\n const typingSpeed =\n totalDuration > 0 ? (count / totalDuration) * 1000 : 0;\n\n return {\n avgInterKeyDelay: calculateMean(interKeyDelays),\n interKeyDelayStdDev: calculateStdDev(interKeyDelays),\n avgHoldDuration: calculateMean(holdDurations),\n holdDurationStdDev: calculateStdDev(holdDurations),\n typingSpeed,\n correctionRate: count > 0 ? correctionCount / count : 0,\n keystrokeCount: count,\n correctionCount,\n totalDuration,\n interKeyDelays,\n holdDurations,\n pasteCount: this.pasteCount,\n };\n }\n\n /**\n * Returns raw keystroke data\n */\n getRawData(): KeystrokeData[] {\n return [...this.keystrokes];\n }\n}\n\n/**\n * Calculates the mean of an array of numbers\n */\nfunction calculateMean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((sum, v) => sum + v, 0) / values.length;\n}\n\n/**\n * Calculates the standard deviation of an array of numbers\n */\nfunction calculateStdDev(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = calculateMean(values);\n const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));\n return Math.sqrt(calculateMean(squaredDiffs));\n}\n\n/**\n * Creates a new keystroke tracker instance\n */\nexport function createKeystrokeTracker(): KeystrokeTracker {\n return new KeystrokeTracker();\n}\n","/**\n * Mouse movement tracking\n * Captures mouse behavior including movement patterns, velocity, and clicks\n */\n\nexport interface MousePoint {\n x: number;\n y: number;\n timestamp: number;\n}\n\nexport interface ClickData {\n x: number;\n y: number;\n timestamp: number;\n button: number;\n}\n\nexport interface MouseMetrics {\n /** Average mouse velocity (pixels per second) */\n avgVelocity: number;\n /** Standard deviation of velocity */\n velocityStdDev: number;\n /** Average acceleration */\n avgAcceleration: number;\n /** Variance in acceleration (indicates human-like movement) */\n accelerationVariance: number;\n /** Total distance traveled (pixels) */\n totalDistance: number;\n /** Number of direction changes */\n directionChanges: number;\n /** Ratio of straight lines to curved movements */\n straightnessRatio: number;\n /** Average time between clicks (ms) */\n avgClickInterval: number;\n /** Total number of clicks */\n clickCount: number;\n /** Average scroll speed */\n avgScrollSpeed: number;\n /** Number of scroll events */\n scrollCount: number;\n /** Total tracking duration (ms) */\n totalDuration: number;\n /** Number of mouse movement events */\n movementCount: number;\n}\n\nexport class MouseTracker {\n private points: MousePoint[] = [];\n private clicks: ClickData[] = [];\n private scrollEvents: { delta: number; timestamp: number }[] = [];\n private isTracking = false;\n private lastPoint: MousePoint | null = null;\n\n /**\n * Starts tracking mouse movements\n */\n start(): void {\n if (this.isTracking) return;\n this.isTracking = true;\n this.reset();\n }\n\n /**\n * Stops tracking mouse movements\n */\n stop(): void {\n this.isTracking = false;\n }\n\n /**\n * Resets all collected data\n */\n reset(): void {\n this.points = [];\n this.clicks = [];\n this.scrollEvents = [];\n this.lastPoint = null;\n }\n\n /**\n * Handles mouse move events\n */\n handleMouseMove(event: MouseEvent): void {\n if (!this.isTracking) return;\n\n const point: MousePoint = {\n x: event.clientX,\n y: event.clientY,\n timestamp: performance.now(),\n };\n\n // Throttle: only record if moved significantly or time has passed\n if (this.lastPoint) {\n const distance = Math.sqrt(\n Math.pow(point.x - this.lastPoint.x, 2) +\n Math.pow(point.y - this.lastPoint.y, 2)\n );\n const timeDiff = point.timestamp - this.lastPoint.timestamp;\n\n // Skip if barely moved and not much time passed\n if (distance < 5 && timeDiff < 50) {\n return;\n }\n }\n\n this.points.push(point);\n this.lastPoint = point;\n\n // Limit stored points to prevent memory issues\n if (this.points.length > 1000) {\n this.points = this.points.slice(-500);\n }\n }\n\n /**\n * Handles click events\n */\n handleClick(event: MouseEvent): void {\n if (!this.isTracking) return;\n\n this.clicks.push({\n x: event.clientX,\n y: event.clientY,\n timestamp: performance.now(),\n button: event.button,\n });\n }\n\n /**\n * Handles scroll events\n */\n handleScroll(event: WheelEvent): void {\n if (!this.isTracking) return;\n\n this.scrollEvents.push({\n delta: Math.abs(event.deltaY),\n timestamp: performance.now(),\n });\n\n // Limit stored scroll events\n if (this.scrollEvents.length > 100) {\n this.scrollEvents = this.scrollEvents.slice(-50);\n }\n }\n\n /**\n * Creates event handlers that can be attached to elements\n */\n getEventHandlers(): {\n onMouseMove: (e: MouseEvent) => void;\n onClick: (e: MouseEvent) => void;\n onWheel: (e: WheelEvent) => void;\n } {\n return {\n onMouseMove: this.handleMouseMove.bind(this),\n onClick: this.handleClick.bind(this),\n onWheel: this.handleScroll.bind(this),\n };\n }\n\n /**\n * Calculates metrics from collected mouse data\n */\n getMetrics(): MouseMetrics {\n const velocities: number[] = [];\n const accelerations: number[] = [];\n let totalDistance = 0;\n let directionChanges = 0;\n let straightLineDistance = 0;\n\n // Calculate velocities and distances\n for (let i = 1; i < this.points.length; i++) {\n const prev = this.points[i - 1];\n const curr = this.points[i];\n\n const dx = curr.x - prev.x;\n const dy = curr.y - prev.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const timeDiff = (curr.timestamp - prev.timestamp) / 1000; // seconds\n\n totalDistance += distance;\n\n if (timeDiff > 0) {\n const velocity = distance / timeDiff;\n velocities.push(velocity);\n\n // Calculate acceleration\n if (velocities.length > 1) {\n const prevVelocity = velocities[velocities.length - 2];\n const acceleration = (velocity - prevVelocity) / timeDiff;\n accelerations.push(Math.abs(acceleration));\n }\n }\n\n // Detect direction changes\n if (i >= 2) {\n const prevPrev = this.points[i - 2];\n const prevDx = prev.x - prevPrev.x;\n const prevDy = prev.y - prevPrev.y;\n\n // Calculate angle change\n const prevAngle = Math.atan2(prevDy, prevDx);\n const currAngle = Math.atan2(dy, dx);\n let angleDiff = Math.abs(currAngle - prevAngle);\n\n // Normalize angle difference\n if (angleDiff > Math.PI) {\n angleDiff = 2 * Math.PI - angleDiff;\n }\n\n // Significant direction change (more than 45 degrees)\n if (angleDiff > Math.PI / 4) {\n directionChanges++;\n }\n }\n }\n\n // Calculate straight-line distance (first to last point)\n if (this.points.length >= 2) {\n const first = this.points[0];\n const last = this.points[this.points.length - 1];\n straightLineDistance = Math.sqrt(\n Math.pow(last.x - first.x, 2) + Math.pow(last.y - first.y, 2)\n );\n }\n\n // Calculate click intervals\n const clickIntervals: number[] = [];\n for (let i = 1; i < this.clicks.length; i++) {\n clickIntervals.push(this.clicks[i].timestamp - this.clicks[i - 1].timestamp);\n }\n\n // Calculate scroll speeds\n const scrollSpeeds: number[] = [];\n for (let i = 1; i < this.scrollEvents.length; i++) {\n const timeDiff =\n (this.scrollEvents[i].timestamp - this.scrollEvents[i - 1].timestamp) /\n 1000;\n if (timeDiff > 0) {\n scrollSpeeds.push(this.scrollEvents[i].delta / timeDiff);\n }\n }\n\n // Calculate total duration\n const totalDuration =\n this.points.length > 1\n ? this.points[this.points.length - 1].timestamp - this.points[0].timestamp\n : 0;\n\n return {\n avgVelocity: calculateMean(velocities),\n velocityStdDev: calculateStdDev(velocities),\n avgAcceleration: calculateMean(accelerations),\n accelerationVariance: calculateVariance(accelerations),\n totalDistance,\n directionChanges,\n straightnessRatio:\n totalDistance > 0 ? straightLineDistance / totalDistance : 0,\n avgClickInterval: calculateMean(clickIntervals),\n clickCount: this.clicks.length,\n avgScrollSpeed: calculateMean(scrollSpeeds),\n scrollCount: this.scrollEvents.length,\n totalDuration,\n movementCount: this.points.length,\n };\n }\n\n /**\n * Returns raw mouse movement data\n */\n getRawData(): { points: MousePoint[]; clicks: ClickData[] } {\n return {\n points: [...this.points],\n clicks: [...this.clicks],\n };\n }\n}\n\n/**\n * Calculates the mean of an array of numbers\n */\nfunction calculateMean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((sum, v) => sum + v, 0) / values.length;\n}\n\n/**\n * Calculates the standard deviation of an array of numbers\n */\nfunction calculateStdDev(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = calculateMean(values);\n const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));\n return Math.sqrt(calculateMean(squaredDiffs));\n}\n\n/**\n * Calculates the variance of an array of numbers\n */\nfunction calculateVariance(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = calculateMean(values);\n const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));\n return calculateMean(squaredDiffs);\n}\n\n/**\n * Creates a new mouse tracker instance\n */\nexport function createMouseTracker(): MouseTracker {\n return new MouseTracker();\n}\n","/**\n * Touch tracking for mobile web\n * Captures touch patterns including pressure, size, and movement\n */\n\nexport interface TouchPoint {\n x: number;\n y: number;\n timestamp: number;\n pressure: number;\n radiusX: number;\n radiusY: number;\n force: number;\n}\n\nexport interface TouchMetrics {\n /** Average touch pressure (0-1) */\n avgPressure: number;\n /** Standard deviation of touch pressure */\n pressureStdDev: number;\n /** Average touch radius */\n avgRadius: number;\n /** Average touch force */\n avgForce: number;\n /** Average swipe velocity */\n avgSwipeVelocity: number;\n /** Number of touch events */\n touchCount: number;\n /** Number of multi-touch events */\n multiTouchCount: number;\n /** Average duration of touches */\n avgTouchDuration: number;\n /** Total tracking duration */\n totalDuration: number;\n}\n\nexport class TouchTracker {\n private touches: TouchPoint[] = [];\n private touchDurations: number[] = [];\n private activeTouches: Map<number, { start: TouchPoint; startTime: number }> =\n new Map();\n private multiTouchCount = 0;\n private isTracking = false;\n private startTime: number | null = null;\n\n /**\n * Starts tracking touch events\n */\n start(): void {\n if (this.isTracking) return;\n this.isTracking = true;\n this.reset();\n }\n\n /**\n * Stops tracking touch events\n */\n stop(): void {\n this.isTracking = false;\n }\n\n /**\n * Resets all collected data\n */\n reset(): void {\n this.touches = [];\n this.touchDurations = [];\n this.activeTouches.clear();\n this.multiTouchCount = 0;\n this.startTime = null;\n }\n\n /**\n * Handles touch start events\n */\n handleTouchStart(event: TouchEvent): void {\n if (!this.isTracking) return;\n\n const timestamp = performance.now();\n if (this.startTime === null) {\n this.startTime = timestamp;\n }\n\n // Track multi-touch\n if (event.touches.length > 1) {\n this.multiTouchCount++;\n }\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const touch = event.changedTouches[i];\n const point: TouchPoint = {\n x: touch.clientX,\n y: touch.clientY,\n timestamp,\n pressure: touch.force || 0,\n radiusX: touch.radiusX || 0,\n radiusY: touch.radiusY || 0,\n force: touch.force || 0,\n };\n\n this.touches.push(point);\n this.activeTouches.set(touch.identifier, {\n start: point,\n startTime: timestamp,\n });\n }\n }\n\n /**\n * Handles touch move events\n */\n handleTouchMove(event: TouchEvent): void {\n if (!this.isTracking) return;\n\n const timestamp = performance.now();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const touch = event.changedTouches[i];\n const point: TouchPoint = {\n x: touch.clientX,\n y: touch.clientY,\n timestamp,\n pressure: touch.force || 0,\n radiusX: touch.radiusX || 0,\n radiusY: touch.radiusY || 0,\n force: touch.force || 0,\n };\n\n this.touches.push(point);\n }\n\n // Limit stored touches to prevent memory issues\n if (this.touches.length > 1000) {\n this.touches = this.touches.slice(-500);\n }\n }\n\n /**\n * Handles touch end events\n */\n handleTouchEnd(event: TouchEvent): void {\n if (!this.isTracking) return;\n\n const timestamp = performance.now();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const touch = event.changedTouches[i];\n const activeTouch = this.activeTouches.get(touch.identifier);\n\n if (activeTouch) {\n const duration = timestamp - activeTouch.startTime;\n this.touchDurations.push(duration);\n this.activeTouches.delete(touch.identifier);\n }\n }\n }\n\n /**\n * Creates event handlers that can be attached to elements\n */\n getEventHandlers(): {\n onTouchStart: (e: TouchEvent) => void;\n onTouchMove: (e: TouchEvent) => void;\n onTouchEnd: (e: TouchEvent) => void;\n } {\n return {\n onTouchStart: this.handleTouchStart.bind(this),\n onTouchMove: this.handleTouchMove.bind(this),\n onTouchEnd: this.handleTouchEnd.bind(this),\n };\n }\n\n /**\n * Calculates metrics from collected touch data\n */\n getMetrics(): TouchMetrics {\n const pressures = this.touches\n .map((t) => t.pressure)\n .filter((p) => p > 0);\n const radii = this.touches\n .map((t) => (t.radiusX + t.radiusY) / 2)\n .filter((r) => r > 0);\n const forces = this.touches\n .map((t) => t.force)\n .filter((f) => f > 0);\n\n // Calculate swipe velocities\n const velocities: number[] = [];\n for (let i = 1; i < this.touches.length; i++) {\n const prev = this.touches[i - 1];\n const curr = this.touches[i];\n const timeDiff = (curr.timestamp - prev.timestamp) / 1000;\n\n if (timeDiff > 0 && timeDiff < 1) {\n const distance = Math.sqrt(\n Math.pow(curr.x - prev.x, 2) + Math.pow(curr.y - prev.y, 2)\n );\n velocities.push(distance / timeDiff);\n }\n }\n\n const totalDuration =\n this.touches.length > 1\n ? this.touches[this.touches.length - 1].timestamp -\n this.touches[0].timestamp\n : 0;\n\n return {\n avgPressure: calculateMean(pressures),\n pressureStdDev: calculateStdDev(pressures),\n avgRadius: calculateMean(radii),\n avgForce: calculateMean(forces),\n avgSwipeVelocity: calculateMean(velocities),\n touchCount: this.touches.length,\n multiTouchCount: this.multiTouchCount,\n avgTouchDuration: calculateMean(this.touchDurations),\n totalDuration,\n };\n }\n\n /**\n * Returns raw touch data\n */\n getRawData(): TouchPoint[] {\n return [...this.touches];\n }\n}\n\n/**\n * Calculates the mean of an array of numbers\n */\nfunction calculateMean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((sum, v) => sum + v, 0) / values.length;\n}\n\n/**\n * Calculates the standard deviation of an array of numbers\n */\nfunction calculateStdDev(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = calculateMean(values);\n const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));\n return Math.sqrt(calculateMean(squaredDiffs));\n}\n\n/**\n * Creates a new touch tracker instance\n */\nexport function createTouchTracker(): TouchTracker {\n return new TouchTracker();\n}\n\n/**\n * Checks if touch events are supported\n */\nexport function isTouchSupported(): boolean {\n return (\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0 ||\n ((navigator as unknown as { msMaxTouchPoints?: number }).msMaxTouchPoints ?? 0) > 0\n );\n}\n","/**\n * Session Management for RUM\n * Handles session creation, tracking, and persistence\n */\n\nimport type { RUMSession, RUMDeviceContext, RUMPlatform } from \"../types/rum\";\n\nconst SESSION_STORAGE_KEY = \"simplr_rum_session\";\nconst DEFAULT_SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older browsers\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Session Manager - handles session lifecycle\n */\nexport class SessionManager {\n private session: RUMSession | null = null;\n private sessionTimeout: number;\n private inactivityTimer: ReturnType<typeof setTimeout> | null = null;\n private onSessionEnd?: (session: RUMSession) => void;\n\n constructor(\n sessionTimeout: number = DEFAULT_SESSION_TIMEOUT,\n onSessionEnd?: (session: RUMSession) => void\n ) {\n this.sessionTimeout = sessionTimeout;\n this.onSessionEnd = onSessionEnd;\n }\n\n /**\n * Initialize session - load from storage or create new\n */\n initialize(): RUMSession {\n // Try to restore existing session\n const existingSession = this.loadSession();\n const now = Date.now();\n\n if (existingSession) {\n // Check if session is still valid (not timed out)\n const timeSinceActivity = now - existingSession.lastActivityAt;\n if (timeSinceActivity < this.sessionTimeout) {\n this.session = existingSession;\n this.session.lastActivityAt = now;\n this.saveSession();\n this.startInactivityTimer();\n return this.session;\n }\n // Session expired - end it and create new\n if (this.onSessionEnd) {\n this.onSessionEnd(existingSession);\n }\n }\n\n // Create new session\n this.session = this.createNewSession();\n this.saveSession();\n this.startInactivityTimer();\n return this.session;\n }\n\n /**\n * Create a new session\n */\n private createNewSession(): RUMSession {\n const now = Date.now();\n return {\n sessionId: generateUUID(),\n startedAt: now,\n lastActivityAt: now,\n viewCount: 0,\n actionCount: 0,\n errorCount: 0,\n };\n }\n\n /**\n * Get current session\n */\n getSession(): RUMSession | null {\n return this.session;\n }\n\n /**\n * Get session ID\n */\n getSessionId(): string | null {\n return this.session?.sessionId || null;\n }\n\n /**\n * Update session activity timestamp\n */\n recordActivity(): void {\n if (this.session) {\n this.session.lastActivityAt = Date.now();\n this.saveSession();\n this.resetInactivityTimer();\n }\n }\n\n /**\n * Increment view count\n */\n incrementViewCount(): void {\n if (this.session) {\n this.session.viewCount++;\n this.recordActivity();\n }\n }\n\n /**\n * Increment action count\n */\n incrementActionCount(): void {\n if (this.session) {\n this.session.actionCount++;\n this.recordActivity();\n }\n }\n\n /**\n * Increment error count\n */\n incrementErrorCount(): void {\n if (this.session) {\n this.session.errorCount++;\n this.recordActivity();\n }\n }\n\n /**\n * Set user information\n */\n setUser(userId: string, attributes?: Record<string, unknown>): void {\n if (this.session) {\n this.session.userId = userId;\n this.session.userAttributes = attributes;\n this.saveSession();\n }\n }\n\n /**\n * Clear user information\n */\n clearUser(): void {\n if (this.session) {\n delete this.session.userId;\n delete this.session.userAttributes;\n this.saveSession();\n }\n }\n\n /**\n * End current session\n */\n endSession(): RUMSession | null {\n if (this.session) {\n const endedSession = { ...this.session };\n if (this.onSessionEnd) {\n this.onSessionEnd(endedSession);\n }\n this.clearSession();\n return endedSession;\n }\n return null;\n }\n\n /**\n * Clear session data\n */\n private clearSession(): void {\n this.session = null;\n this.stopInactivityTimer();\n try {\n if (typeof sessionStorage !== \"undefined\") {\n sessionStorage.removeItem(SESSION_STORAGE_KEY);\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n /**\n * Save session to storage\n */\n private saveSession(): void {\n if (!this.session) return;\n try {\n if (typeof sessionStorage !== \"undefined\") {\n sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(this.session));\n }\n } catch {\n // Ignore storage errors (e.g., quota exceeded)\n }\n }\n\n /**\n * Load session from storage\n */\n private loadSession(): RUMSession | null {\n try {\n if (typeof sessionStorage !== \"undefined\") {\n const stored = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored) as RUMSession;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n }\n\n /**\n * Start inactivity timer\n */\n private startInactivityTimer(): void {\n this.stopInactivityTimer();\n this.inactivityTimer = setTimeout(() => {\n this.handleInactivityTimeout();\n }, this.sessionTimeout);\n }\n\n /**\n * Reset inactivity timer\n */\n private resetInactivityTimer(): void {\n this.startInactivityTimer();\n }\n\n /**\n * Stop inactivity timer\n */\n private stopInactivityTimer(): void {\n if (this.inactivityTimer) {\n clearTimeout(this.inactivityTimer);\n this.inactivityTimer = null;\n }\n }\n\n /**\n * Handle inactivity timeout\n */\n private handleInactivityTimeout(): void {\n this.endSession();\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n this.stopInactivityTimer();\n this.session = null;\n }\n}\n\n/**\n * Device Context Collector\n * Collects device/browser information for context\n */\nexport class DeviceContextCollector {\n private cachedContext: RUMDeviceContext | null = null;\n\n /**\n * Get device context\n */\n getContext(): RUMDeviceContext {\n if (this.cachedContext) {\n return this.cachedContext;\n }\n\n const context: RUMDeviceContext = {\n platform: this.detectPlatform(),\n os: this.detectOS(),\n osVersion: this.detectOSVersion(),\n browser: this.detectBrowser(),\n browserVersion: this.detectBrowserVersion(),\n screenResolution: this.getScreenResolution(),\n viewportSize: this.getViewportSize(),\n language: this.getLanguage(),\n timezone: this.getTimezone(),\n userAgent: this.getUserAgent(),\n };\n\n this.cachedContext = context;\n return context;\n }\n\n /**\n * Detect platform\n */\n private detectPlatform(): RUMPlatform {\n if (typeof navigator === \"undefined\") return \"web\";\n const ua = navigator.userAgent.toLowerCase();\n if (/iphone|ipad|ipod/.test(ua)) return \"ios\";\n if (/android/.test(ua)) return \"android\";\n return \"web\";\n }\n\n /**\n * Detect OS\n */\n private detectOS(): string {\n if (typeof navigator === \"undefined\") return \"unknown\";\n const ua = navigator.userAgent;\n if (/Windows/.test(ua)) return \"Windows\";\n if (/Mac OS X/.test(ua)) return \"macOS\";\n if (/iPhone|iPad|iPod/.test(ua)) return \"iOS\";\n if (/Android/.test(ua)) return \"Android\";\n if (/Linux/.test(ua)) return \"Linux\";\n if (/CrOS/.test(ua)) return \"Chrome OS\";\n return \"unknown\";\n }\n\n /**\n * Detect OS version\n */\n private detectOSVersion(): string | undefined {\n if (typeof navigator === \"undefined\") return undefined;\n const ua = navigator.userAgent;\n\n // Windows\n const windowsMatch = ua.match(/Windows NT (\\d+\\.\\d+)/);\n if (windowsMatch) {\n const versions: Record<string, string> = {\n \"10.0\": \"10/11\",\n \"6.3\": \"8.1\",\n \"6.2\": \"8\",\n \"6.1\": \"7\",\n };\n return versions[windowsMatch[1]] || windowsMatch[1];\n }\n\n // macOS\n const macMatch = ua.match(/Mac OS X (\\d+[._]\\d+[._]?\\d*)/);\n if (macMatch) return macMatch[1].replace(/_/g, \".\");\n\n // iOS\n const iosMatch = ua.match(/OS (\\d+[._]\\d+[._]?\\d*)/);\n if (iosMatch) return iosMatch[1].replace(/_/g, \".\");\n\n // Android\n const androidMatch = ua.match(/Android (\\d+\\.?\\d*\\.?\\d*)/);\n if (androidMatch) return androidMatch[1];\n\n return undefined;\n }\n\n /**\n * Detect browser\n */\n private detectBrowser(): string | undefined {\n if (typeof navigator === \"undefined\") return undefined;\n const ua = navigator.userAgent;\n if (/Edg\\//.test(ua)) return \"Edge\";\n if (/OPR\\/|Opera/.test(ua)) return \"Opera\";\n if (/Chrome/.test(ua)) return \"Chrome\";\n if (/Safari/.test(ua)) return \"Safari\";\n if (/Firefox/.test(ua)) return \"Firefox\";\n if (/MSIE|Trident/.test(ua)) return \"Internet Explorer\";\n return undefined;\n }\n\n /**\n * Detect browser version\n */\n private detectBrowserVersion(): string | undefined {\n if (typeof navigator === \"undefined\") return undefined;\n const ua = navigator.userAgent;\n\n const patterns: [RegExp, number][] = [\n [/Edg\\/(\\d+\\.?\\d*)/, 1],\n [/OPR\\/(\\d+\\.?\\d*)/, 1],\n [/Chrome\\/(\\d+\\.?\\d*)/, 1],\n [/Version\\/(\\d+\\.?\\d*).*Safari/, 1],\n [/Firefox\\/(\\d+\\.?\\d*)/, 1],\n ];\n\n for (const [pattern, group] of patterns) {\n const match = ua.match(pattern);\n if (match) return match[group];\n }\n\n return undefined;\n }\n\n /**\n * Get screen resolution\n */\n private getScreenResolution(): string | undefined {\n if (typeof screen === \"undefined\") return undefined;\n return `${screen.width}x${screen.height}`;\n }\n\n /**\n * Get viewport size\n */\n private getViewportSize(): string | undefined {\n if (typeof window === \"undefined\") return undefined;\n return `${window.innerWidth}x${window.innerHeight}`;\n }\n\n /**\n * Get language\n */\n private getLanguage(): string | undefined {\n if (typeof navigator === \"undefined\") return undefined;\n return navigator.language;\n }\n\n /**\n * Get timezone\n */\n private getTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get user agent\n */\n private getUserAgent(): string | undefined {\n if (typeof navigator === \"undefined\") return undefined;\n return navigator.userAgent;\n }\n\n /**\n * Clear cached context (for when viewport changes, etc.)\n */\n clearCache(): void {\n this.cachedContext = null;\n }\n}\n\n/**\n * View Manager - tracks current view/page\n */\nexport class ViewManager {\n private currentView: {\n id: string;\n name: string;\n url: string;\n startedAt: number;\n actionCount: number;\n errorCount: number;\n resourceCount: number;\n } | null = null;\n private onViewEnd?: (view: {\n id: string;\n name: string;\n url: string;\n duration: number;\n actionCount: number;\n errorCount: number;\n resourceCount: number;\n }) => void;\n\n constructor(\n onViewEnd?: (view: {\n id: string;\n name: string;\n url: string;\n duration: number;\n actionCount: number;\n errorCount: number;\n resourceCount: number;\n }) => void\n ) {\n this.onViewEnd = onViewEnd;\n }\n\n /**\n * Start tracking a new view\n */\n startView(name: string, url?: string): string {\n // End previous view if exists\n this.endCurrentView();\n\n const viewId = generateUUID();\n this.currentView = {\n id: viewId,\n name,\n url: url || (typeof location !== \"undefined\" ? location.href : \"\"),\n startedAt: Date.now(),\n actionCount: 0,\n errorCount: 0,\n resourceCount: 0,\n };\n\n return viewId;\n }\n\n /**\n * End current view\n */\n endCurrentView(): void {\n if (this.currentView && this.onViewEnd) {\n const duration = Date.now() - this.currentView.startedAt;\n this.onViewEnd({\n id: this.currentView.id,\n name: this.currentView.name,\n url: this.currentView.url,\n duration,\n actionCount: this.currentView.actionCount,\n errorCount: this.currentView.errorCount,\n resourceCount: this.currentView.resourceCount,\n });\n }\n this.currentView = null;\n }\n\n /**\n * Get current view ID\n */\n getCurrentViewId(): string | null {\n return this.currentView?.id || null;\n }\n\n /**\n * Get current view name\n */\n getCurrentViewName(): string | null {\n return this.currentView?.name || null;\n }\n\n /**\n * Increment action count for current view\n */\n incrementActionCount(): void {\n if (this.currentView) {\n this.currentView.actionCount++;\n }\n }\n\n /**\n * Increment error count for current view\n */\n incrementErrorCount(): void {\n if (this.currentView) {\n this.currentView.errorCount++;\n }\n }\n\n /**\n * Increment resource count for current view\n */\n incrementResourceCount(): void {\n if (this.currentView) {\n this.currentView.resourceCount++;\n }\n }\n}\n","/**\n * Click Tracking for RUM\n * Tracks user clicks with element identification\n */\n\nimport type { RUMActionTarget, RUMActionType } from \"../types/rum\";\n\nconst MAX_TEXT_LENGTH = 100;\nconst EXCLUDED_TAGS = new Set([\"HTML\", \"BODY\", \"HEAD\", \"SCRIPT\", \"STYLE\", \"META\", \"LINK\"]);\n\n/**\n * Privacy-safe text extraction\n */\nfunction extractSafeText(element: Element): string | undefined {\n // Check for aria-label first\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel) {\n return truncateText(ariaLabel);\n }\n\n // Check for title\n const title = element.getAttribute(\"title\");\n if (title) {\n return truncateText(title);\n }\n\n // Check for placeholder\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder) {\n return truncateText(placeholder);\n }\n // Don't extract input values - PII risk\n return undefined;\n }\n\n // Get text content for buttons and links\n const tag = element.tagName.toUpperCase();\n if ([\"BUTTON\", \"A\", \"LABEL\"].includes(tag)) {\n const text = element.textContent?.trim();\n if (text) {\n return truncateText(text);\n }\n }\n\n return undefined;\n}\n\n/**\n * Truncate text to max length\n */\nfunction truncateText(text: string): string {\n const cleaned = text.replace(/\\s+/g, \" \").trim();\n if (cleaned.length <= MAX_TEXT_LENGTH) {\n return cleaned;\n }\n return cleaned.substring(0, MAX_TEXT_LENGTH) + \"...\";\n}\n\n/**\n * Generate CSS selector for element\n */\nfunction generateSelector(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n const maxDepth = 5;\n\n while (current && current !== document.body && depth < maxDepth) {\n let selector = current.tagName.toLowerCase();\n\n // Add ID if present\n if (current.id) {\n selector = `#${CSS.escape(current.id)}`;\n parts.unshift(selector);\n break; // ID is unique, stop here\n }\n\n // Add classes (limited to 2)\n const classes = Array.from(current.classList)\n .filter((c) => !c.startsWith(\"_\") && !c.includes(\"--\"))\n .slice(0, 2);\n if (classes.length > 0) {\n selector += \".\" + classes.map((c) => CSS.escape(c)).join(\".\");\n }\n\n // Add position if not unique\n const parent: Element | null = current.parentElement;\n if (parent) {\n const tagName = current.tagName;\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-of-type(${index})`;\n }\n }\n\n parts.unshift(selector);\n current = parent;\n depth++;\n }\n\n return parts.join(\" > \");\n}\n\n/**\n * Generate action name from element\n */\nfunction generateActionName(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const text = extractSafeText(element);\n const type = element.getAttribute(\"type\");\n const role = element.getAttribute(\"role\");\n const ariaLabel = element.getAttribute(\"aria-label\");\n\n // Try to generate a descriptive name\n if (ariaLabel) {\n return `Click on ${ariaLabel}`;\n }\n\n if (text) {\n return `Click on \"${text}\"`;\n }\n\n if (element.id) {\n return `Click on #${element.id}`;\n }\n\n if (tag === \"input\" && type) {\n return `Click on ${type} input`;\n }\n\n if (tag === \"button\") {\n return \"Click on button\";\n }\n\n if (tag === \"a\") {\n return \"Click on link\";\n }\n\n if (role) {\n return `Click on ${role}`;\n }\n\n return `Click on ${tag}`;\n}\n\n/**\n * Click Tracker - captures click events with element info\n */\nexport class ClickTracker {\n private isTracking = false;\n private onAction?: (\n name: string,\n type: RUMActionType,\n target: RUMActionTarget,\n event: MouseEvent\n ) => void;\n\n constructor(\n onAction?: (\n name: string,\n type: RUMActionType,\n target: RUMActionTarget,\n event: MouseEvent\n ) => void\n ) {\n this.onAction = onAction;\n }\n\n /**\n * Start tracking clicks\n */\n start(): void {\n if (this.isTracking || typeof document === \"undefined\") return;\n\n document.addEventListener(\"click\", this.handleClick, { capture: true });\n this.isTracking = true;\n }\n\n /**\n * Stop tracking clicks\n */\n stop(): void {\n if (!this.isTracking || typeof document === \"undefined\") return;\n\n document.removeEventListener(\"click\", this.handleClick, { capture: true });\n this.isTracking = false;\n }\n\n /**\n * Handle click event\n */\n private handleClick = (event: MouseEvent): void => {\n const target = event.target as Element | null;\n if (!target || !this.onAction) return;\n\n // Find the actionable element (button, link, etc.)\n const actionableElement = this.findActionableElement(target);\n if (!actionableElement) return;\n\n // Skip excluded tags\n if (EXCLUDED_TAGS.has(actionableElement.tagName.toUpperCase())) return;\n\n // Extract target information\n const targetInfo = this.extractTargetInfo(actionableElement, event);\n const actionName = generateActionName(actionableElement);\n\n this.onAction(actionName, \"click\", targetInfo, event);\n };\n\n /**\n * Find the actionable parent element\n */\n private findActionableElement(element: Element): Element | null {\n let current: Element | null = element;\n const maxDepth = 5;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const tag = current.tagName.toUpperCase();\n\n // Interactive elements\n if (\n [\"BUTTON\", \"A\", \"INPUT\", \"SELECT\", \"TEXTAREA\"].includes(tag) ||\n current.getAttribute(\"role\") === \"button\" ||\n current.getAttribute(\"onclick\") ||\n current.hasAttribute(\"tabindex\")\n ) {\n return current;\n }\n\n // Check for click handlers via data attributes\n if (\n current.hasAttribute(\"data-action\") ||\n current.hasAttribute(\"data-click\")\n ) {\n return current;\n }\n\n current = current.parentElement;\n depth++;\n }\n\n // Return original element if no actionable parent found\n return element;\n }\n\n /**\n * Extract target information\n */\n private extractTargetInfo(element: Element, event: MouseEvent): RUMActionTarget {\n const rect = element.getBoundingClientRect();\n\n return {\n tag: element.tagName.toLowerCase(),\n id: element.id || undefined,\n className: element.className\n ? Array.from(element.classList).slice(0, 3).join(\" \")\n : undefined,\n text: extractSafeText(element),\n selector: generateSelector(element),\n position: {\n x: Math.round(event.pageX),\n y: Math.round(event.pageY),\n },\n viewportPosition: {\n x: Math.round(event.clientX),\n y: Math.round(event.clientY),\n },\n };\n }\n\n /**\n * Manually track a custom action\n */\n trackAction(\n name: string,\n type: RUMActionType,\n target?: Partial<RUMActionTarget>\n ): void {\n if (this.onAction) {\n const fullTarget: RUMActionTarget = {\n tag: target?.tag || \"custom\",\n ...target,\n };\n // Create a synthetic event\n const syntheticEvent = new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n clientX: target?.viewportPosition?.x || 0,\n clientY: target?.viewportPosition?.y || 0,\n });\n this.onAction(name, type, fullTarget, syntheticEvent);\n }\n }\n\n /**\n * Check if tracking is active\n */\n isActive(): boolean {\n return this.isTracking;\n }\n}\n\n/**\n * Scroll Tracker - tracks scroll behavior\n */\nexport class ScrollTracker {\n private isTracking = false;\n private lastScrollTime = 0;\n private scrollStartY = 0;\n private scrollTimeout: ReturnType<typeof setTimeout> | null = null;\n private onScroll?: (direction: \"up\" | \"down\", distance: number, duration: number) => void;\n\n constructor(\n onScroll?: (direction: \"up\" | \"down\", distance: number, duration: number) => void\n ) {\n this.onScroll = onScroll;\n }\n\n /**\n * Start tracking scrolls\n */\n start(): void {\n if (this.isTracking || typeof window === \"undefined\") return;\n\n window.addEventListener(\"scroll\", this.handleScroll, { passive: true });\n this.isTracking = true;\n }\n\n /**\n * Stop tracking scrolls\n */\n stop(): void {\n if (!this.isTracking || typeof window === \"undefined\") return;\n\n window.removeEventListener(\"scroll\", this.handleScroll);\n this.isTracking = false;\n\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n this.scrollTimeout = null;\n }\n }\n\n /**\n * Handle scroll event\n */\n private handleScroll = (): void => {\n const now = Date.now();\n const currentY = window.scrollY;\n\n // Start of scroll\n if (now - this.lastScrollTime > 200) {\n this.scrollStartY = currentY;\n this.lastScrollTime = now;\n }\n\n // Debounce scroll end detection\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n }\n\n this.scrollTimeout = setTimeout(() => {\n this.handleScrollEnd(currentY, now);\n }, 150);\n };\n\n /**\n * Handle scroll end\n */\n private handleScrollEnd(endY: number, endTime: number): void {\n if (!this.onScroll) return;\n\n const distance = Math.abs(endY - this.scrollStartY);\n const duration = endTime - this.lastScrollTime;\n const direction: \"up\" | \"down\" = endY > this.scrollStartY ? \"down\" : \"up\";\n\n // Only report significant scrolls\n if (distance > 100) {\n this.onScroll(direction, distance, duration);\n }\n }\n}\n","/**\n * Error Tracking for RUM\n * Captures JavaScript errors, unhandled rejections, and console errors\n */\n\nimport type { RUMErrorData } from \"../types/rum\";\n\nconst MAX_STACK_LENGTH = 10000;\nconst MAX_MESSAGE_LENGTH = 1000;\n\n/**\n * Error source types\n */\ntype ErrorSource = \"source\" | \"network\" | \"console\" | \"custom\";\n\n/**\n * Sanitize error message (remove potential PII)\n */\nfunction sanitizeMessage(message: string): string {\n let sanitized = message;\n\n // Remove email patterns\n sanitized = sanitized.replace(\n /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n \"[EMAIL]\"\n );\n\n // Remove potential phone numbers\n sanitized = sanitized.replace(\n /\\b\\d{3}[-.]?\\d{3}[-.]?\\d{4}\\b/g,\n \"[PHONE]\"\n );\n\n // Remove UUIDs\n sanitized = sanitized.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \"[UUID]\"\n );\n\n // Truncate if too long\n if (sanitized.length > MAX_MESSAGE_LENGTH) {\n sanitized = sanitized.substring(0, MAX_MESSAGE_LENGTH) + \"...\";\n }\n\n return sanitized;\n}\n\n/**\n * Sanitize stack trace\n */\nfunction sanitizeStack(stack: string): string {\n // Remove query strings from URLs in stack\n let sanitized = stack.replace(/\\?[^\\s)]+/g, \"?[QUERY]\");\n\n // Truncate if too long\n if (sanitized.length > MAX_STACK_LENGTH) {\n sanitized = sanitized.substring(0, MAX_STACK_LENGTH) + \"\\n...truncated\";\n }\n\n return sanitized;\n}\n\n/**\n * Extract error type from error object\n */\nfunction getErrorType(error: unknown): string {\n if (error instanceof Error) {\n return error.constructor.name;\n }\n if (error instanceof Event && error.type === \"error\") {\n return \"ResourceError\";\n }\n return \"UnknownError\";\n}\n\n/**\n * Parse error event to error data\n */\nfunction parseErrorEvent(event: ErrorEvent): RUMErrorData {\n return {\n message: sanitizeMessage(event.message || \"Unknown error\"),\n stack: event.error?.stack ? sanitizeStack(event.error.stack) : undefined,\n type: getErrorType(event.error),\n source: \"source\",\n handled: false,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n };\n}\n\n/**\n * Parse unhandled rejection to error data\n */\nfunction parseUnhandledRejection(event: PromiseRejectionEvent): RUMErrorData {\n const reason = event.reason;\n\n if (reason instanceof Error) {\n return {\n message: sanitizeMessage(reason.message),\n stack: reason.stack ? sanitizeStack(reason.stack) : undefined,\n type: `UnhandledRejection(${reason.constructor.name})`,\n source: \"source\",\n handled: false,\n };\n }\n\n // Non-Error rejection (e.g., rejected with string)\n return {\n message: sanitizeMessage(String(reason)),\n type: \"UnhandledRejection\",\n source: \"source\",\n handled: false,\n };\n}\n\n/**\n * Parse Error object to error data\n */\nfunction parseError(error: Error, handled: boolean = false): RUMErrorData {\n return {\n message: sanitizeMessage(error.message),\n stack: error.stack ? sanitizeStack(error.stack) : undefined,\n type: error.constructor.name,\n source: \"custom\",\n handled,\n };\n}\n\n/**\n * Error Tracker - captures and reports errors\n */\nexport class ErrorTracker {\n private isTracking = false;\n private onError?: (error: RUMErrorData) => void;\n private originalConsoleError: typeof console.error | null = null;\n private trackConsoleErrors = false;\n\n constructor(onError?: (error: RUMErrorData) => void) {\n this.onError = onError;\n }\n\n /**\n * Start tracking errors\n */\n start(options?: { trackConsoleErrors?: boolean }): void {\n if (this.isTracking || typeof window === \"undefined\") return;\n\n this.trackConsoleErrors = options?.trackConsoleErrors ?? false;\n\n // Global error handler\n window.addEventListener(\"error\", this.handleError);\n\n // Unhandled promise rejections\n window.addEventListener(\"unhandledrejection\", this.handleRejection);\n\n // Console.error interception (optional)\n if (this.trackConsoleErrors) {\n this.interceptConsoleError();\n }\n\n this.isTracking = true;\n }\n\n /**\n * Stop tracking errors\n */\n stop(): void {\n if (!this.isTracking || typeof window === \"undefined\") return;\n\n window.removeEventListener(\"error\", this.handleError);\n window.removeEventListener(\"unhandledrejection\", this.handleRejection);\n\n // Restore console.error\n if (this.originalConsoleError) {\n console.error = this.originalConsoleError;\n this.originalConsoleError = null;\n }\n\n this.isTracking = false;\n }\n\n /**\n * Handle global error event\n */\n private handleError = (event: ErrorEvent): void => {\n if (!this.onError) return;\n\n // Skip errors from browser extensions\n if (event.filename && this.isExtensionError(event.filename)) return;\n\n const errorData = parseErrorEvent(event);\n this.onError(errorData);\n };\n\n /**\n * Handle unhandled promise rejection\n */\n private handleRejection = (event: PromiseRejectionEvent): void => {\n if (!this.onError) return;\n\n const errorData = parseUnhandledRejection(event);\n this.onError(errorData);\n };\n\n /**\n * Intercept console.error calls\n */\n private interceptConsoleError(): void {\n this.originalConsoleError = console.error;\n const self = this;\n\n console.error = function (...args: unknown[]) {\n // Call original console.error\n self.originalConsoleError?.apply(console, args);\n\n // Track as error\n if (self.onError) {\n const message = args\n .map((arg) => {\n if (arg instanceof Error) return arg.message;\n if (typeof arg === \"object\") {\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n })\n .join(\" \");\n\n const errorData: RUMErrorData = {\n message: sanitizeMessage(message),\n type: \"ConsoleError\",\n source: \"console\",\n handled: true,\n };\n\n // If first argument is an Error, include its stack\n if (args[0] instanceof Error) {\n errorData.stack = args[0].stack\n ? sanitizeStack(args[0].stack)\n : undefined;\n errorData.type = `ConsoleError(${args[0].constructor.name})`;\n }\n\n self.onError(errorData);\n }\n };\n }\n\n /**\n * Check if error is from browser extension\n */\n private isExtensionError(filename: string): boolean {\n const extensionPatterns = [\n /^chrome-extension:\\/\\//,\n /^moz-extension:\\/\\//,\n /^safari-extension:\\/\\//,\n /^ms-browser-extension:\\/\\//,\n ];\n return extensionPatterns.some((pattern) => pattern.test(filename));\n }\n\n /**\n * Manually track an error\n */\n trackError(\n error: Error | string,\n context?: Record<string, unknown>\n ): void {\n if (!this.onError) return;\n\n let errorData: RUMErrorData;\n\n if (error instanceof Error) {\n errorData = parseError(error, true);\n } else {\n errorData = {\n message: sanitizeMessage(error),\n type: \"CustomError\",\n source: \"custom\",\n handled: true,\n };\n }\n\n this.onError(errorData);\n }\n\n /**\n * Check if tracking is active\n */\n isActive(): boolean {\n return this.isTracking;\n }\n}\n\n/**\n * Error Deduplicator - prevents duplicate errors from flooding\n */\nexport class ErrorDeduplicator {\n private recentErrors: Map<string, number> = new Map();\n private readonly windowMs: number;\n private readonly maxDuplicates: number;\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(windowMs: number = 60000, maxDuplicates: number = 3) {\n this.windowMs = windowMs;\n this.maxDuplicates = maxDuplicates;\n }\n\n /**\n * Start cleanup interval\n */\n start(): void {\n if (this.cleanupInterval) return;\n\n this.cleanupInterval = setInterval(() => {\n this.cleanup();\n }, this.windowMs);\n }\n\n /**\n * Stop cleanup interval\n */\n stop(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.recentErrors.clear();\n }\n\n /**\n * Check if error should be tracked (not a duplicate)\n */\n shouldTrack(error: RUMErrorData): boolean {\n const key = this.getErrorKey(error);\n const count = this.recentErrors.get(key) || 0;\n\n if (count >= this.maxDuplicates) {\n return false;\n }\n\n this.recentErrors.set(key, count + 1);\n return true;\n }\n\n /**\n * Generate a key for error deduplication\n */\n private getErrorKey(error: RUMErrorData): string {\n // Use type + first line of message + first line of stack\n const messageLine = error.message.split(\"\\n\")[0];\n const stackLine = error.stack?.split(\"\\n\")[1] || \"\";\n return `${error.type}:${messageLine}:${stackLine}`;\n }\n\n /**\n * Cleanup old entries\n */\n private cleanup(): void {\n this.recentErrors.clear();\n }\n}\n","/**\n * Network Monitoring for RUM\n * Intercepts fetch and XHR requests to track API performance\n */\n\nimport type { RUMResourceData } from \"../types/rum\";\n\nconst MAX_URL_LENGTH = 2000;\n\n/**\n * Headers to exclude from tracking (privacy/security)\n */\nconst EXCLUDED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n \"x-auth-token\",\n \"x-csrf-token\",\n \"x-xsrf-token\",\n]);\n\n/**\n * URL patterns to always exclude\n */\nconst DEFAULT_EXCLUDED_PATTERNS = [\n /\\/v1\\/rum\\/events/, // Our own RUM endpoint\n /google-analytics\\.com/,\n /googletagmanager\\.com/,\n /segment\\.io/,\n /mixpanel\\.com/,\n /amplitude\\.com/,\n /sentry\\.io/,\n /datadoghq\\.com/,\n];\n\n/**\n * Sanitize URL - remove sensitive query params\n */\nfunction sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url, window.location.origin);\n\n // Remove sensitive query params\n const sensitiveParams = [\n \"token\",\n \"key\",\n \"api_key\",\n \"apikey\",\n \"auth\",\n \"password\",\n \"secret\",\n \"access_token\",\n \"refresh_token\",\n ];\n sensitiveParams.forEach((param) => {\n if (parsed.searchParams.has(param)) {\n parsed.searchParams.set(param, \"[REDACTED]\");\n }\n });\n\n let sanitized = parsed.toString();\n\n // Truncate if too long\n if (sanitized.length > MAX_URL_LENGTH) {\n sanitized = sanitized.substring(0, MAX_URL_LENGTH) + \"...\";\n }\n\n return sanitized;\n } catch {\n // If URL parsing fails, return truncated original\n return url.length > MAX_URL_LENGTH\n ? url.substring(0, MAX_URL_LENGTH) + \"...\"\n : url;\n }\n}\n\n/**\n * Check if URL should be excluded from tracking\n */\nfunction shouldExcludeUrl(\n url: string,\n excludedPatterns: RegExp[],\n allowedPatterns?: RegExp[]\n): boolean {\n // Check allowed patterns first (if specified)\n if (allowedPatterns && allowedPatterns.length > 0) {\n const isAllowed = allowedPatterns.some((pattern) => pattern.test(url));\n if (!isAllowed) return true;\n }\n\n // Check excluded patterns\n return excludedPatterns.some((pattern) => pattern.test(url));\n}\n\n/**\n * Network Tracker - intercepts fetch and XHR\n */\nexport class NetworkTracker {\n private isTracking = false;\n private originalFetch: typeof fetch | null = null;\n private originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n private originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n private excludedPatterns: RegExp[] = [];\n private allowedPatterns?: RegExp[];\n private onResource?: (resource: RUMResourceData) => void;\n\n constructor(onResource?: (resource: RUMResourceData) => void) {\n this.onResource = onResource;\n }\n\n /**\n * Start tracking network requests\n */\n start(options?: {\n excludedPatterns?: (string | RegExp)[];\n allowedPatterns?: (string | RegExp)[];\n }): void {\n if (this.isTracking || typeof window === \"undefined\") return;\n\n // Setup patterns\n this.excludedPatterns = [\n ...DEFAULT_EXCLUDED_PATTERNS,\n ...(options?.excludedPatterns || []).map((p) =>\n typeof p === \"string\" ? new RegExp(p) : p\n ),\n ];\n\n if (options?.allowedPatterns) {\n this.allowedPatterns = options.allowedPatterns.map((p) =>\n typeof p === \"string\" ? new RegExp(p) : p\n );\n }\n\n // Intercept fetch\n this.interceptFetch();\n\n // Intercept XHR\n this.interceptXHR();\n\n this.isTracking = true;\n }\n\n /**\n * Stop tracking network requests\n */\n stop(): void {\n if (!this.isTracking) return;\n\n // Restore fetch\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n\n // Restore XHR\n if (this.originalXhrOpen) {\n XMLHttpRequest.prototype.open = this.originalXhrOpen;\n this.originalXhrOpen = null;\n }\n if (this.originalXhrSend) {\n XMLHttpRequest.prototype.send = this.originalXhrSend;\n this.originalXhrSend = null;\n }\n\n this.isTracking = false;\n }\n\n /**\n * Intercept fetch API\n */\n private interceptFetch(): void {\n if (typeof fetch === \"undefined\") return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = async function (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n const method = init?.method || \"GET\";\n const startTime = performance.now();\n\n // Check if should track\n if (\n shouldExcludeUrl(url, self.excludedPatterns, self.allowedPatterns)\n ) {\n return self.originalFetch!.call(window, input, init);\n }\n\n let requestSize: number | undefined;\n if (init?.body) {\n if (typeof init.body === \"string\") {\n requestSize = init.body.length;\n } else if (init.body instanceof Blob) {\n requestSize = init.body.size;\n } else if (init.body instanceof ArrayBuffer) {\n requestSize = init.body.byteLength;\n }\n }\n\n try {\n const response = await self.originalFetch!.call(window, input, init);\n const duration = performance.now() - startTime;\n\n // Get response size\n let responseSize: number | undefined;\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength) {\n responseSize = parseInt(contentLength, 10);\n }\n\n // Report resource\n if (self.onResource) {\n self.onResource({\n url: sanitizeUrl(url),\n method: method.toUpperCase(),\n status: response.status,\n statusText: response.statusText,\n duration: Math.round(duration),\n requestSize,\n responseSize,\n type: \"fetch\",\n });\n }\n\n return response;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n // Report failed request\n if (self.onResource) {\n self.onResource({\n url: sanitizeUrl(url),\n method: method.toUpperCase(),\n duration: Math.round(duration),\n type: \"fetch\",\n error: error instanceof Error ? error.message : \"Network error\",\n });\n }\n\n throw error;\n }\n };\n }\n\n /**\n * Intercept XMLHttpRequest\n */\n private interceptXHR(): void {\n if (typeof XMLHttpRequest === \"undefined\") return;\n\n this.originalXhrOpen = XMLHttpRequest.prototype.open;\n this.originalXhrSend = XMLHttpRequest.prototype.send;\n const self = this;\n\n // Override open to capture method and URL\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ) {\n (this as any).__rum_method = method;\n (this as any).__rum_url = url.toString();\n return self.originalXhrOpen!.call(\n this,\n method,\n url,\n async,\n username,\n password\n );\n };\n\n // Override send to track timing\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const xhr = this;\n const url = (xhr as any).__rum_url as string;\n const method = (xhr as any).__rum_method as string;\n\n // Check if should track\n if (\n shouldExcludeUrl(url, self.excludedPatterns, self.allowedPatterns)\n ) {\n return self.originalXhrSend!.call(xhr, body);\n }\n\n const startTime = performance.now();\n\n // Get request size\n let requestSize: number | undefined;\n if (body) {\n if (typeof body === \"string\") {\n requestSize = body.length;\n } else if (body instanceof Blob) {\n requestSize = body.size;\n } else if (body instanceof ArrayBuffer) {\n requestSize = body.byteLength;\n }\n }\n\n // Track completion\n const originalOnReadyStateChange = xhr.onreadystatechange;\n\n xhr.onreadystatechange = function (ev) {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n const duration = performance.now() - startTime;\n\n // Get response size\n let responseSize: number | undefined;\n const contentLength = xhr.getResponseHeader(\"content-length\");\n if (contentLength) {\n responseSize = parseInt(contentLength, 10);\n }\n\n // Report resource\n if (self.onResource) {\n if (xhr.status > 0) {\n self.onResource({\n url: sanitizeUrl(url),\n method: method.toUpperCase(),\n status: xhr.status,\n statusText: xhr.statusText,\n duration: Math.round(duration),\n requestSize,\n responseSize,\n type: \"xhr\",\n });\n } else {\n // Network error (status 0)\n self.onResource({\n url: sanitizeUrl(url),\n method: method.toUpperCase(),\n duration: Math.round(duration),\n type: \"xhr\",\n error: \"Network error\",\n });\n }\n }\n }\n\n if (originalOnReadyStateChange) {\n originalOnReadyStateChange.call(xhr, ev);\n }\n };\n\n return self.originalXhrSend!.call(xhr, body);\n };\n }\n\n /**\n * Check if tracking is active\n */\n isActive(): boolean {\n return this.isTracking;\n }\n}\n\n/**\n * Resource Timing Tracker - uses Performance API for all resources\n */\nexport class ResourceTimingTracker {\n private observer: PerformanceObserver | null = null;\n private onResource?: (resource: RUMResourceData) => void;\n private excludedPatterns: RegExp[] = DEFAULT_EXCLUDED_PATTERNS;\n\n constructor(onResource?: (resource: RUMResourceData) => void) {\n this.onResource = onResource;\n }\n\n /**\n * Start observing resource timing\n */\n start(excludedPatterns?: (string | RegExp)[]): void {\n if (typeof PerformanceObserver === \"undefined\") return;\n\n if (excludedPatterns) {\n this.excludedPatterns = [\n ...DEFAULT_EXCLUDED_PATTERNS,\n ...excludedPatterns.map((p) =>\n typeof p === \"string\" ? new RegExp(p) : p\n ),\n ];\n }\n\n try {\n this.observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.handleResourceEntry(entry as PerformanceResourceTiming);\n }\n });\n\n this.observer.observe({ type: \"resource\", buffered: true });\n } catch {\n // PerformanceObserver not supported or resource type not available\n }\n }\n\n /**\n * Stop observing\n */\n stop(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n }\n\n /**\n * Handle resource timing entry\n */\n private handleResourceEntry(entry: PerformanceResourceTiming): void {\n if (!this.onResource) return;\n\n // Check exclusions\n if (\n this.excludedPatterns.some((pattern) => pattern.test(entry.name))\n ) {\n return;\n }\n\n // Only track certain resource types\n const trackableTypes = [\"fetch\", \"xmlhttprequest\", \"script\", \"css\", \"img\"];\n if (!trackableTypes.includes(entry.initiatorType)) return;\n\n this.onResource({\n url: sanitizeUrl(entry.name),\n method: \"GET\", // Resource timing doesn't provide method\n duration: Math.round(entry.duration),\n responseSize: entry.transferSize || undefined,\n type: \"resource\",\n initiator: entry.initiatorType,\n });\n }\n}\n","/**\n * RUM (Real User Monitoring) Type Definitions\n * Defines all types for session tracking, events, and observability\n */\n\n// Event types for RUM\nexport type RUMEventType =\n | \"session_start\"\n | \"session_end\"\n | \"view\"\n | \"action\"\n | \"error\"\n | \"resource\"\n | \"long_task\"\n | \"vital\"\n | \"log\";\n\n// Action types for click/tap tracking\nexport type RUMActionType = \"click\" | \"tap\" | \"scroll\" | \"swipe\" | \"custom\";\n\n// Log levels\nexport type RUMLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n// Environment types\nexport type RUMEnvironment = \"production\" | \"staging\" | \"development\";\n\n// Platform types\nexport type RUMPlatform = \"web\" | \"ios\" | \"android\";\n\n/**\n * Configuration for SimplrRUM\n */\nexport interface SimplrRUMConfig {\n /** Public API key (pk_xxx) */\n apiKey: string;\n /** Application identifier */\n applicationId: string;\n /** Application version (e.g., \"1.0.0\") */\n applicationVersion?: string;\n /** Environment */\n environment?: RUMEnvironment;\n /** API endpoint override */\n endpoint?: string;\n\n // Feature flags\n /** Track click events (default: true) */\n trackClicks?: boolean;\n /** Track errors (default: true) */\n trackErrors?: boolean;\n /** Track network requests (default: true) */\n trackNetwork?: boolean;\n /** Track performance metrics (default: true) */\n trackPerformance?: boolean;\n /** Track long tasks (default: true) */\n trackLongTasks?: boolean;\n\n // Batching configuration\n /** Number of events before auto-flush (default: 30) */\n batchSize?: number;\n /** Interval in ms to flush events (default: 10000) */\n flushInterval?: number;\n\n // Privacy\n /** Scrub PII from tracked data (default: true) */\n scrubPII?: boolean;\n /** URL patterns to include in tracking (regex strings) */\n allowedUrlPatterns?: string[];\n /** URL patterns to exclude from tracking (regex strings) */\n excludedUrlPatterns?: string[];\n\n // Sampling\n /** Sample rate for events (0-1, default: 1) */\n sampleRate?: number;\n\n // Session configuration\n /** Session timeout in ms (default: 1800000 = 30 min) */\n sessionTimeout?: number;\n\n // Location tracking\n /** Track device geolocation (default: false) */\n trackLocation?: boolean;\n /** Location update interval in ms (default: 60000 = 1 min) */\n locationUpdateInterval?: number;\n /** High accuracy GPS (uses more battery) (default: false) */\n locationHighAccuracy?: boolean;\n}\n\n/**\n * Device location data\n */\nexport interface RUMLocationData {\n latitude: number;\n longitude: number;\n accuracy?: number;\n altitude?: number;\n altitudeAccuracy?: number;\n heading?: number;\n speed?: number;\n timestamp: number;\n}\n\n/**\n * Device context information\n */\nexport interface RUMDeviceContext {\n platform: RUMPlatform;\n os: string;\n osVersion?: string;\n browser?: string;\n browserVersion?: string;\n deviceModel?: string;\n screenResolution?: string;\n viewportSize?: string;\n language?: string;\n timezone?: string;\n userAgent?: string;\n}\n\n/**\n * Session information\n */\nexport interface RUMSession {\n sessionId: string;\n startedAt: number;\n lastActivityAt: number;\n userId?: string;\n userAttributes?: Record<string, unknown>;\n viewCount: number;\n actionCount: number;\n errorCount: number;\n}\n\n/**\n * View (page) information\n */\nexport interface RUMViewData {\n id: string;\n name: string;\n url?: string;\n referrer?: string;\n startedAt: number;\n duration?: number;\n isActive: boolean;\n actionCount: number;\n errorCount: number;\n resourceCount: number;\n}\n\n/**\n * Click/action target information\n */\nexport interface RUMActionTarget {\n tag: string;\n id?: string;\n className?: string;\n text?: string;\n selector?: string;\n position?: { x: number; y: number };\n viewportPosition?: { x: number; y: number };\n}\n\n/**\n * Action event data\n */\nexport interface RUMActionData {\n name: string;\n type: RUMActionType;\n target?: RUMActionTarget;\n duration?: number;\n}\n\n/**\n * Error event data\n */\nexport interface RUMErrorData {\n message: string;\n stack?: string;\n type: string;\n source?: \"source\" | \"network\" | \"console\" | \"custom\";\n handled: boolean;\n filename?: string;\n lineno?: number;\n colno?: number;\n}\n\n/**\n * Resource (network request) event data\n */\nexport interface RUMResourceData {\n url: string;\n method: string;\n status?: number;\n statusText?: string;\n duration: number;\n requestSize?: number;\n responseSize?: number;\n type: \"fetch\" | \"xhr\" | \"resource\";\n initiator?: string;\n error?: string;\n}\n\n/**\n * Performance vital data\n */\nexport interface RUMVitalData {\n name: \"LCP\" | \"FID\" | \"CLS\" | \"FCP\" | \"TTFB\" | \"INP\";\n value: number;\n rating?: \"good\" | \"needs-improvement\" | \"poor\";\n}\n\n/**\n * Long task data\n */\nexport interface RUMLongTaskData {\n duration: number;\n startTime: number;\n attribution?: string;\n}\n\n/**\n * Log event data\n */\nexport interface RUMLogData {\n level: RUMLogLevel;\n message: string;\n context?: Record<string, unknown>;\n}\n\n/**\n * Base RUM event structure\n */\nexport interface RUMEvent {\n /** Event type */\n type: RUMEventType;\n /** Unix timestamp in ms */\n timestamp: number;\n /** Session ID */\n sessionId: string;\n /** Current view ID */\n viewId?: string;\n /** User ID (if set) */\n userId?: string;\n /** Application ID */\n applicationId: string;\n /** Application version */\n applicationVersion?: string;\n /** Environment */\n environment?: RUMEnvironment;\n /** Device context */\n device: RUMDeviceContext;\n /** Device location (if tracking enabled) */\n location?: RUMLocationData;\n /** Custom attributes */\n attributes?: Record<string, unknown>;\n /** Global attributes */\n globalAttributes?: Record<string, unknown>;\n\n // Event-specific data (only one will be present based on type)\n view?: RUMViewData;\n action?: RUMActionData;\n error?: RUMErrorData;\n resource?: RUMResourceData;\n vital?: RUMVitalData;\n longTask?: RUMLongTaskData;\n log?: RUMLogData;\n}\n\n/**\n * Batch of events to send to API\n */\nexport interface RUMEventBatch {\n events: RUMEvent[];\n sentAt: number;\n}\n\n/**\n * RUM API response\n */\nexport interface RUMAPIResponse {\n success: boolean;\n message?: string;\n eventsReceived?: number;\n}\n\n/**\n * Web Vitals thresholds\n */\nexport const WEB_VITALS_THRESHOLDS = {\n LCP: { good: 2500, poor: 4000 },\n FID: { good: 100, poor: 300 },\n CLS: { good: 0.1, poor: 0.25 },\n FCP: { good: 1800, poor: 3000 },\n TTFB: { good: 800, poor: 1800 },\n INP: { good: 200, poor: 500 },\n} as const;\n\n/**\n * Get rating for a vital value\n */\nexport function getVitalRating(\n name: RUMVitalData[\"name\"],\n value: number\n): \"good\" | \"needs-improvement\" | \"poor\" {\n const thresholds = WEB_VITALS_THRESHOLDS[name];\n if (value <= thresholds.good) return \"good\";\n if (value <= thresholds.poor) return \"needs-improvement\";\n return \"poor\";\n}\n","/**\n * Performance Monitoring for RUM\n * Tracks Web Vitals and other performance metrics\n */\n\nimport type { RUMVitalData, RUMLongTaskData } from \"../types/rum\";\nimport { getVitalRating } from \"../types/rum\";\n\n/**\n * Performance Tracker - collects Web Vitals and performance metrics\n */\nexport class PerformanceTracker {\n private observers: PerformanceObserver[] = [];\n private onVital?: (vital: RUMVitalData) => void;\n private onLongTask?: (task: RUMLongTaskData) => void;\n private reportedVitals: Set<string> = new Set();\n\n constructor(\n onVital?: (vital: RUMVitalData) => void,\n onLongTask?: (task: RUMLongTaskData) => void\n ) {\n this.onVital = onVital;\n this.onLongTask = onLongTask;\n }\n\n /**\n * Start performance tracking\n */\n start(options?: { trackLongTasks?: boolean }): void {\n if (typeof PerformanceObserver === \"undefined\") return;\n\n // Track Largest Contentful Paint (LCP)\n this.observeLCP();\n\n // Track First Input Delay (FID) / Interaction to Next Paint (INP)\n this.observeFID();\n\n // Track Cumulative Layout Shift (CLS)\n this.observeCLS();\n\n // Track First Contentful Paint (FCP)\n this.observeFCP();\n\n // Track Time to First Byte (TTFB)\n this.measureTTFB();\n\n // Track Long Tasks (optional)\n if (options?.trackLongTasks !== false) {\n this.observeLongTasks();\n }\n }\n\n /**\n * Stop performance tracking\n */\n stop(): void {\n this.observers.forEach((observer) => observer.disconnect());\n this.observers = [];\n this.reportedVitals.clear();\n }\n\n /**\n * Observe Largest Contentful Paint\n */\n private observeLCP(): void {\n try {\n const observer = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n // LCP can fire multiple times, we want the last one\n const lastEntry = entries[entries.length - 1] as PerformanceEntry & {\n renderTime?: number;\n loadTime?: number;\n };\n\n if (lastEntry && !this.reportedVitals.has(\"LCP\")) {\n const value = lastEntry.renderTime || lastEntry.loadTime || lastEntry.startTime;\n this.reportVital(\"LCP\", value);\n }\n });\n\n observer.observe({ type: \"largest-contentful-paint\", buffered: true });\n this.observers.push(observer);\n\n // Report LCP when page becomes hidden (final value)\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.visibilityState === \"hidden\") {\n this.reportedVitals.add(\"LCP\");\n }\n },\n { once: true }\n );\n }\n } catch {\n // LCP not supported\n }\n }\n\n /**\n * Observe First Input Delay\n */\n private observeFID(): void {\n try {\n const observer = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const firstEntry = entries[0] as PerformanceEventTiming;\n\n if (firstEntry && !this.reportedVitals.has(\"FID\")) {\n const value = firstEntry.processingStart - firstEntry.startTime;\n this.reportVital(\"FID\", value);\n }\n });\n\n observer.observe({ type: \"first-input\", buffered: true });\n this.observers.push(observer);\n } catch {\n // FID not supported\n }\n }\n\n /**\n * Observe Cumulative Layout Shift\n */\n private observeCLS(): void {\n let clsValue = 0;\n let sessionValue = 0;\n let sessionEntries: PerformanceEntry[] = [];\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as (PerformanceEntry & {\n hadRecentInput?: boolean;\n value?: number;\n })[]) {\n // Only count shifts without recent user input\n if (!entry.hadRecentInput && entry.value) {\n const firstEntry = sessionEntries[0] as PerformanceEntry | undefined;\n const lastEntry = sessionEntries[sessionEntries.length - 1] as PerformanceEntry | undefined;\n\n // If the entry occurred less than 1 second after the previous entry\n // and less than 5 seconds after the first entry in the session,\n // include it in the current session\n if (\n sessionValue &&\n entry.startTime - (lastEntry?.startTime || 0) < 1000 &&\n entry.startTime - (firstEntry?.startTime || 0) < 5000\n ) {\n sessionValue += entry.value;\n sessionEntries.push(entry);\n } else {\n // Start new session\n sessionValue = entry.value;\n sessionEntries = [entry];\n }\n\n // Update CLS to the max session value\n if (sessionValue > clsValue) {\n clsValue = sessionValue;\n }\n }\n }\n });\n\n observer.observe({ type: \"layout-shift\", buffered: true });\n this.observers.push(observer);\n\n // Report CLS when page becomes hidden\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (\n document.visibilityState === \"hidden\" &&\n !this.reportedVitals.has(\"CLS\")\n ) {\n this.reportVital(\"CLS\", clsValue);\n }\n },\n { once: true }\n );\n }\n } catch {\n // CLS not supported\n }\n }\n\n /**\n * Observe First Contentful Paint\n */\n private observeFCP(): void {\n try {\n const observer = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const fcpEntry = entries.find(\n (entry) => entry.name === \"first-contentful-paint\"\n );\n\n if (fcpEntry && !this.reportedVitals.has(\"FCP\")) {\n this.reportVital(\"FCP\", fcpEntry.startTime);\n }\n });\n\n observer.observe({ type: \"paint\", buffered: true });\n this.observers.push(observer);\n } catch {\n // FCP not supported\n }\n }\n\n /**\n * Measure Time to First Byte\n */\n private measureTTFB(): void {\n if (typeof performance === \"undefined\") return;\n\n // Use navigation timing API\n try {\n const navEntry = performance.getEntriesByType(\n \"navigation\"\n )[0] as PerformanceNavigationTiming;\n\n if (navEntry && !this.reportedVitals.has(\"TTFB\")) {\n const ttfb = navEntry.responseStart - navEntry.requestStart;\n if (ttfb >= 0) {\n this.reportVital(\"TTFB\", ttfb);\n }\n }\n } catch {\n // Navigation timing not available\n }\n }\n\n /**\n * Observe Long Tasks\n */\n private observeLongTasks(): void {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (this.onLongTask) {\n this.onLongTask({\n duration: Math.round(entry.duration),\n startTime: Math.round(entry.startTime),\n attribution: this.getTaskAttribution(entry),\n });\n }\n }\n });\n\n observer.observe({ type: \"longtask\", buffered: true });\n this.observers.push(observer);\n } catch {\n // Long tasks not supported\n }\n }\n\n /**\n * Get attribution for long task\n */\n private getTaskAttribution(entry: PerformanceEntry): string | undefined {\n const longTaskEntry = entry as PerformanceEntry & {\n attribution?: Array<{\n name?: string;\n containerType?: string;\n containerName?: string;\n containerSrc?: string;\n }>;\n };\n\n if (longTaskEntry.attribution && longTaskEntry.attribution.length > 0) {\n const attr = longTaskEntry.attribution[0];\n if (attr.containerSrc) {\n return attr.containerSrc;\n }\n if (attr.containerName) {\n return attr.containerName;\n }\n if (attr.name) {\n return attr.name;\n }\n }\n\n return undefined;\n }\n\n /**\n * Report a vital metric\n */\n private reportVital(\n name: RUMVitalData[\"name\"],\n value: number\n ): void {\n if (this.reportedVitals.has(name)) return;\n\n this.reportedVitals.add(name);\n\n if (this.onVital) {\n this.onVital({\n name,\n value: Math.round(value * 100) / 100, // Round to 2 decimal places\n rating: getVitalRating(name, value),\n });\n }\n }\n\n /**\n * Manually report a custom vital\n */\n trackVital(name: RUMVitalData[\"name\"], value: number): void {\n this.reportVital(name, value);\n }\n}\n\n/**\n * Navigation Tracker - tracks page navigation for SPAs\n */\nexport class NavigationTracker {\n private isTracking = false;\n private currentPath: string = \"\";\n private onNavigate?: (from: string, to: string) => void;\n\n constructor(onNavigate?: (from: string, to: string) => void) {\n this.onNavigate = onNavigate;\n }\n\n /**\n * Start tracking navigation\n */\n start(): void {\n if (this.isTracking || typeof window === \"undefined\") return;\n\n this.currentPath = window.location.pathname + window.location.search;\n\n // Listen for popstate (back/forward)\n window.addEventListener(\"popstate\", this.handleNavigation);\n\n // Intercept pushState and replaceState\n this.interceptHistoryMethods();\n\n this.isTracking = true;\n }\n\n /**\n * Stop tracking navigation\n */\n stop(): void {\n if (!this.isTracking || typeof window === \"undefined\") return;\n\n window.removeEventListener(\"popstate\", this.handleNavigation);\n\n this.isTracking = false;\n }\n\n /**\n * Handle navigation change\n */\n private handleNavigation = (): void => {\n const newPath = window.location.pathname + window.location.search;\n\n if (newPath !== this.currentPath && this.onNavigate) {\n this.onNavigate(this.currentPath, newPath);\n this.currentPath = newPath;\n }\n };\n\n /**\n * Intercept history methods for SPA navigation\n */\n private interceptHistoryMethods(): void {\n const self = this;\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (...args) {\n originalPushState.apply(this, args);\n self.handleNavigation();\n };\n\n history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n self.handleNavigation();\n };\n }\n\n /**\n * Get current path\n */\n getCurrentPath(): string {\n return this.currentPath;\n }\n}\n","/**\n * Log Collection for RUM\n * Collects application logs with context\n */\n\nimport type { RUMLogLevel, RUMLogData } from \"../types/rum\";\n\nconst MAX_MESSAGE_LENGTH = 5000;\nconst MAX_CONTEXT_SIZE = 50; // Max number of context keys\n\n/**\n * Sanitize log message\n */\nfunction sanitizeMessage(message: string): string {\n let sanitized = message;\n\n // Remove potential PII patterns\n // Email addresses\n sanitized = sanitized.replace(\n /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n \"[EMAIL]\"\n );\n\n // Phone numbers (various formats)\n sanitized = sanitized.replace(\n /\\b(\\+?\\d{1,3}[-.\\s]?)?\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\b/g,\n \"[PHONE]\"\n );\n\n // Credit card numbers\n sanitized = sanitized.replace(\n /\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}\\b/g,\n \"[CARD]\"\n );\n\n // SSN\n sanitized = sanitized.replace(\n /\\b\\d{3}[-\\s]?\\d{2}[-\\s]?\\d{4}\\b/g,\n \"[SSN]\"\n );\n\n // IP addresses (v4)\n sanitized = sanitized.replace(\n /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g,\n \"[IP]\"\n );\n\n // JWT tokens\n sanitized = sanitized.replace(\n /eyJ[a-zA-Z0-9_-]*\\.eyJ[a-zA-Z0-9_-]*\\.[a-zA-Z0-9_-]*/g,\n \"[JWT]\"\n );\n\n // Truncate if too long\n if (sanitized.length > MAX_MESSAGE_LENGTH) {\n sanitized = sanitized.substring(0, MAX_MESSAGE_LENGTH) + \"...[truncated]\";\n }\n\n return sanitized;\n}\n\n/**\n * Sanitize context object\n */\nfunction sanitizeContext(\n context: Record<string, unknown>\n): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {};\n const keys = Object.keys(context).slice(0, MAX_CONTEXT_SIZE);\n\n for (const key of keys) {\n const value = context[key];\n\n // Skip sensitive keys\n const lowerKey = key.toLowerCase();\n if (\n lowerKey.includes(\"password\") ||\n lowerKey.includes(\"secret\") ||\n lowerKey.includes(\"token\") ||\n lowerKey.includes(\"auth\") ||\n lowerKey.includes(\"key\") ||\n lowerKey.includes(\"credential\")\n ) {\n sanitized[key] = \"[REDACTED]\";\n continue;\n }\n\n // Sanitize string values\n if (typeof value === \"string\") {\n sanitized[key] = sanitizeMessage(value);\n } else if (typeof value === \"object\" && value !== null) {\n // Shallow sanitize nested objects\n try {\n sanitized[key] = JSON.parse(\n JSON.stringify(value, (k, v) => {\n if (typeof v === \"string\") return sanitizeMessage(v);\n return v;\n })\n );\n } catch {\n sanitized[key] = \"[Object]\";\n }\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n}\n\n/**\n * Log Collector - manages log collection\n */\nexport class LogCollector {\n private onLog?: (log: RUMLogData) => void;\n private isInterceptingConsole = false;\n private originalConsole: Partial<typeof console> = {};\n\n constructor(onLog?: (log: RUMLogData) => void) {\n this.onLog = onLog;\n }\n\n /**\n * Start intercepting console methods (optional)\n */\n interceptConsole(): void {\n if (this.isInterceptingConsole || typeof console === \"undefined\") return;\n\n const methods: RUMLogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n\n methods.forEach((level) => {\n this.originalConsole[level] = console[level];\n const self = this;\n\n (console as any)[level] = function (...args: unknown[]) {\n // Call original\n self.originalConsole[level]?.apply(console, args);\n\n // Track log\n self.trackFromArgs(level, args);\n };\n });\n\n this.isInterceptingConsole = true;\n }\n\n /**\n * Stop intercepting console\n */\n restoreConsole(): void {\n if (!this.isInterceptingConsole) return;\n\n Object.keys(this.originalConsole).forEach((level) => {\n (console as any)[level] = this.originalConsole[level as keyof typeof console];\n });\n\n this.originalConsole = {};\n this.isInterceptingConsole = false;\n }\n\n /**\n * Track log from console args\n */\n private trackFromArgs(level: RUMLogLevel, args: unknown[]): void {\n if (!this.onLog || args.length === 0) return;\n\n // Convert args to message\n const message = args\n .map((arg) => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return `${arg.name}: ${arg.message}`;\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(\" \");\n\n // Extract context if last arg is object\n let context: Record<string, unknown> | undefined;\n const lastArg = args[args.length - 1];\n if (\n args.length > 1 &&\n typeof lastArg === \"object\" &&\n lastArg !== null &&\n !(lastArg instanceof Error)\n ) {\n context = sanitizeContext(lastArg as Record<string, unknown>);\n }\n\n this.onLog({\n level,\n message: sanitizeMessage(message),\n context,\n });\n }\n\n /**\n * Manually log a message\n */\n log(\n level: RUMLogLevel,\n message: string,\n context?: Record<string, unknown>\n ): void {\n if (!this.onLog) return;\n\n this.onLog({\n level,\n message: sanitizeMessage(message),\n context: context ? sanitizeContext(context) : undefined,\n });\n }\n\n /**\n * Convenience methods\n */\n debug(message: string, context?: Record<string, unknown>): void {\n this.log(\"debug\", message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.log(\"info\", message, context);\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n this.log(\"warn\", message, context);\n }\n\n error(message: string, context?: Record<string, unknown>): void {\n this.log(\"error\", message, context);\n }\n\n /**\n * Check if console interception is active\n */\n isIntercepting(): boolean {\n return this.isInterceptingConsole;\n }\n}\n\n/**\n * Log Buffer - stores logs in memory with size limit\n */\nexport class LogBuffer {\n private logs: RUMLogData[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * Add log to buffer\n */\n add(log: RUMLogData): void {\n this.logs.push(log);\n\n // Remove oldest if over limit\n if (this.logs.length > this.maxSize) {\n this.logs.shift();\n }\n }\n\n /**\n * Get all logs and clear buffer\n */\n flush(): RUMLogData[] {\n const flushed = [...this.logs];\n this.logs = [];\n return flushed;\n }\n\n /**\n * Get logs without clearing\n */\n getAll(): RUMLogData[] {\n return [...this.logs];\n }\n\n /**\n * Get recent logs\n */\n getRecent(count: number): RUMLogData[] {\n return this.logs.slice(-count);\n }\n\n /**\n * Clear buffer\n */\n clear(): void {\n this.logs = [];\n }\n\n /**\n * Get buffer size\n */\n size(): number {\n return this.logs.length;\n }\n}\n","/**\n * Event Batching for RUM\n * Batches events and sends them efficiently to the API\n */\n\nimport type { RUMEvent, RUMEventBatch, RUMAPIResponse } from \"../types/rum\";\n\nconst DEFAULT_BATCH_SIZE = 30;\nconst DEFAULT_FLUSH_INTERVAL = 10000; // 10 seconds\nconst MAX_QUEUE_SIZE = 1000;\nconst MAX_RETRIES = 3;\nconst RETRY_DELAYS = [1000, 5000, 15000]; // Exponential backoff\n\n/**\n * Event Batcher - batches and sends RUM events\n */\nexport class EventBatcher {\n private queue: RUMEvent[] = [];\n private batchSize: number;\n private flushInterval: number;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private isFlushing = false;\n private endpoint: string;\n private apiKey: string;\n private onFlushError?: (error: Error, events: RUMEvent[]) => void;\n private onFlushSuccess?: (response: RUMAPIResponse, events: RUMEvent[]) => void;\n\n constructor(options: {\n endpoint: string;\n apiKey: string;\n batchSize?: number;\n flushInterval?: number;\n onFlushError?: (error: Error, events: RUMEvent[]) => void;\n onFlushSuccess?: (response: RUMAPIResponse, events: RUMEvent[]) => void;\n }) {\n this.endpoint = options.endpoint;\n this.apiKey = options.apiKey;\n this.batchSize = options.batchSize || DEFAULT_BATCH_SIZE;\n this.flushInterval = options.flushInterval || DEFAULT_FLUSH_INTERVAL;\n this.onFlushError = options.onFlushError;\n this.onFlushSuccess = options.onFlushSuccess;\n }\n\n /**\n * Start the batcher\n */\n start(): void {\n if (this.flushTimer) return;\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.flushInterval);\n\n // Also flush on page unload\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n window.addEventListener(\"pagehide\", this.handlePageHide);\n window.addEventListener(\"beforeunload\", this.handleBeforeUnload);\n }\n }\n\n /**\n * Stop the batcher\n */\n stop(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"visibilitychange\", this.handleVisibilityChange);\n window.removeEventListener(\"pagehide\", this.handlePageHide);\n window.removeEventListener(\"beforeunload\", this.handleBeforeUnload);\n }\n }\n\n /**\n * Add event to queue\n */\n add(event: RUMEvent): void {\n // Enforce queue size limit\n if (this.queue.length >= MAX_QUEUE_SIZE) {\n // Remove oldest events\n this.queue = this.queue.slice(Math.floor(MAX_QUEUE_SIZE / 2));\n }\n\n this.queue.push(event);\n\n // Flush if batch size reached\n if (this.queue.length >= this.batchSize) {\n this.flush();\n }\n }\n\n /**\n * Flush queued events\n */\n async flush(): Promise<void> {\n if (this.isFlushing || this.queue.length === 0) return;\n\n this.isFlushing = true;\n\n // Get events to flush\n const eventsToFlush = [...this.queue];\n this.queue = [];\n\n try {\n await this.sendBatch(eventsToFlush);\n } catch (error) {\n // Re-add failed events to queue (if not too many)\n if (this.queue.length + eventsToFlush.length < MAX_QUEUE_SIZE) {\n this.queue = [...eventsToFlush, ...this.queue];\n }\n\n if (this.onFlushError) {\n this.onFlushError(\n error instanceof Error ? error : new Error(String(error)),\n eventsToFlush\n );\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Send batch to API with retries\n */\n private async sendBatch(events: RUMEvent[], retryCount = 0): Promise<void> {\n const batch: RUMEventBatch = {\n events,\n sentAt: Date.now(),\n };\n\n try {\n const response = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n body: JSON.stringify(batch),\n keepalive: true, // Important for page unload\n });\n\n if (!response.ok) {\n const text = await response.text();\n console.error(`[SimplrRUM] Batch send failed: HTTP ${response.status}`, text);\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = (await response.json()) as RUMAPIResponse;\n\n if (this.onFlushSuccess) {\n this.onFlushSuccess(result, events);\n }\n } catch (error) {\n console.error(`[SimplrRUM] Batch send error (retry ${retryCount}):`, error);\n // Retry logic\n if (retryCount < MAX_RETRIES) {\n const delay = RETRY_DELAYS[retryCount] || RETRY_DELAYS[RETRY_DELAYS.length - 1];\n await this.sleep(delay);\n return this.sendBatch(events, retryCount + 1);\n }\n\n throw error;\n }\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Handle visibility change\n */\n private handleVisibilityChange = (): void => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n this.flushSync();\n }\n };\n\n /**\n * Handle page hide\n */\n private handlePageHide = (): void => {\n this.flushSync();\n };\n\n /**\n * Handle before unload\n */\n private handleBeforeUnload = (): void => {\n this.flushSync();\n };\n\n /**\n * Synchronous flush using sendBeacon\n */\n private flushSync(): void {\n if (this.queue.length === 0) return;\n\n const eventsToFlush = [...this.queue];\n this.queue = [];\n\n // Include apiKey in body since sendBeacon can't send headers\n const batch = {\n events: eventsToFlush,\n sentAt: Date.now(),\n apiKey: this.apiKey,\n };\n\n // Use sendBeacon for reliable delivery during page unload\n if (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n const blob = new Blob([JSON.stringify(batch)], {\n type: \"application/json\",\n });\n const beaconSent = navigator.sendBeacon(this.endpoint, blob);\n\n if (!beaconSent) {\n // Fallback: re-add to queue (unlikely to help during unload)\n this.queue = [...eventsToFlush, ...this.queue];\n }\n } else {\n // Fallback to async fetch with keepalive\n fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n body: JSON.stringify(batch),\n keepalive: true,\n }).catch(() => {\n // Ignore errors during page unload\n });\n }\n }\n\n /**\n * Get queue size\n */\n getQueueSize(): number {\n return this.queue.length;\n }\n\n /**\n * Check if batcher is running\n */\n isRunning(): boolean {\n return this.flushTimer !== null;\n }\n\n /**\n * Clear queue without sending\n */\n clear(): void {\n this.queue = [];\n }\n}\n\n/**\n * Event Sampler - implements sampling for high-volume events\n */\nexport class EventSampler {\n private sampleRate: number;\n private sessionSampled: boolean;\n\n constructor(sampleRate: number = 1.0) {\n this.sampleRate = Math.min(1, Math.max(0, sampleRate));\n // Decide once per session if this session should be sampled\n this.sessionSampled = Math.random() < this.sampleRate;\n }\n\n /**\n * Check if event should be sampled\n */\n shouldSample(): boolean {\n return this.sessionSampled;\n }\n\n /**\n * Check if specific event type should be sampled\n * Some events (errors) should always be sampled\n */\n shouldSampleEvent(eventType: string): boolean {\n // Always sample errors\n if (eventType === \"error\") return true;\n\n // Always sample session events\n if (eventType === \"session_start\" || eventType === \"session_end\") return true;\n\n return this.sessionSampled;\n }\n\n /**\n * Get sample rate\n */\n getSampleRate(): number {\n return this.sampleRate;\n }\n\n /**\n * Check if session is sampled\n */\n isSessionSampled(): boolean {\n return this.sessionSampled;\n }\n}\n\n/**\n * Local Storage Queue - persists events to localStorage for reliability\n */\nexport class LocalStorageQueue {\n private storageKey: string;\n private maxSize: number;\n\n constructor(storageKey: string = \"simplr_rum_queue\", maxSize: number = 100) {\n this.storageKey = storageKey;\n this.maxSize = maxSize;\n }\n\n /**\n * Save events to localStorage\n */\n save(events: RUMEvent[]): void {\n if (typeof localStorage === \"undefined\") return;\n\n try {\n const existing = this.load();\n const combined = [...existing, ...events].slice(-this.maxSize);\n localStorage.setItem(this.storageKey, JSON.stringify(combined));\n } catch {\n // Storage quota exceeded or other error\n }\n }\n\n /**\n * Load events from localStorage\n */\n load(): RUMEvent[] {\n if (typeof localStorage === \"undefined\") return [];\n\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n return JSON.parse(stored) as RUMEvent[];\n }\n } catch {\n // Parse error\n }\n\n return [];\n }\n\n /**\n * Clear localStorage queue\n */\n clear(): void {\n if (typeof localStorage === \"undefined\") return;\n\n try {\n localStorage.removeItem(this.storageKey);\n } catch {\n // Ignore errors\n }\n }\n\n /**\n * Get queue size\n */\n size(): number {\n return this.load().length;\n }\n}\n","/**\n * Location Tracking for RUM\n * Handles device geolocation tracking via browser Geolocation API\n */\n\nimport type { RUMLocationData } from \"../types/rum\";\n\nexport interface LocationTrackerConfig {\n /** Update interval in ms */\n updateInterval?: number;\n /** Use high accuracy GPS */\n highAccuracy?: boolean;\n /** Timeout for location request in ms */\n timeout?: number;\n /** Maximum age of cached location in ms */\n maximumAge?: number;\n}\n\nconst DEFAULT_CONFIG: Required<LocationTrackerConfig> = {\n updateInterval: 60000, // 1 minute\n highAccuracy: false,\n timeout: 10000,\n maximumAge: 60000,\n};\n\n/**\n * LocationTracker - collects device geolocation\n */\nexport class LocationTracker {\n private config: Required<LocationTrackerConfig>;\n private currentLocation: RUMLocationData | null = null;\n private watchId: number | null = null;\n private updateTimer: ReturnType<typeof setInterval> | null = null;\n private onLocationUpdate?: (location: RUMLocationData) => void;\n private permissionGranted = false;\n\n constructor(\n config: LocationTrackerConfig = {},\n onLocationUpdate?: (location: RUMLocationData) => void\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.onLocationUpdate = onLocationUpdate;\n }\n\n /**\n * Check if geolocation is supported\n */\n static isSupported(): boolean {\n return typeof navigator !== \"undefined\" && \"geolocation\" in navigator;\n }\n\n /**\n * Start tracking location\n */\n async start(): Promise<boolean> {\n if (!LocationTracker.isSupported()) {\n console.warn(\"SimplrRUM: Geolocation not supported\");\n return false;\n }\n\n try {\n // Request permission by getting initial position\n const position = await this.getCurrentPosition();\n if (position) {\n this.currentLocation = this.positionToLocationData(position);\n this.permissionGranted = true;\n this.onLocationUpdate?.(this.currentLocation);\n }\n\n // Start watching for updates\n this.startWatching();\n\n // Also poll periodically (in case watch fails)\n this.startUpdateTimer();\n\n return true;\n } catch (error) {\n console.warn(\"SimplrRUM: Failed to start location tracking\", error);\n return false;\n }\n }\n\n /**\n * Stop tracking location\n */\n stop(): void {\n if (this.watchId !== null) {\n navigator.geolocation.clearWatch(this.watchId);\n this.watchId = null;\n }\n if (this.updateTimer !== null) {\n clearInterval(this.updateTimer);\n this.updateTimer = null;\n }\n }\n\n /**\n * Get current location\n */\n getLocation(): RUMLocationData | null {\n return this.currentLocation;\n }\n\n /**\n * Check if permission was granted\n */\n hasPermission(): boolean {\n return this.permissionGranted;\n }\n\n /**\n * Get current position (promise-based)\n */\n private getCurrentPosition(): Promise<GeolocationPosition | null> {\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (position) => resolve(position),\n (error) => {\n console.warn(\"SimplrRUM: Geolocation error\", error.message);\n resolve(null);\n },\n {\n enableHighAccuracy: this.config.highAccuracy,\n timeout: this.config.timeout,\n maximumAge: this.config.maximumAge,\n }\n );\n });\n }\n\n /**\n * Start watching position\n */\n private startWatching(): void {\n if (this.watchId !== null) return;\n\n this.watchId = navigator.geolocation.watchPosition(\n (position) => {\n this.currentLocation = this.positionToLocationData(position);\n this.onLocationUpdate?.(this.currentLocation);\n },\n (error) => {\n // Don't log repeatedly for permission denied\n if (error.code !== error.PERMISSION_DENIED) {\n console.warn(\"SimplrRUM: Watch position error\", error.message);\n }\n },\n {\n enableHighAccuracy: this.config.highAccuracy,\n timeout: this.config.timeout,\n maximumAge: this.config.maximumAge,\n }\n );\n }\n\n /**\n * Start periodic update timer\n */\n private startUpdateTimer(): void {\n if (this.updateTimer !== null) return;\n\n this.updateTimer = setInterval(async () => {\n const position = await this.getCurrentPosition();\n if (position) {\n this.currentLocation = this.positionToLocationData(position);\n this.onLocationUpdate?.(this.currentLocation);\n }\n }, this.config.updateInterval);\n }\n\n /**\n * Convert GeolocationPosition to RUMLocationData\n */\n private positionToLocationData(position: GeolocationPosition): RUMLocationData {\n return {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n altitude: position.coords.altitude ?? undefined,\n altitudeAccuracy: position.coords.altitudeAccuracy ?? undefined,\n heading: position.coords.heading ?? undefined,\n speed: position.coords.speed ?? undefined,\n timestamp: position.timestamp,\n };\n }\n}\n","/**\n * SimplrRUM - Real User Monitoring SDK\n * Main entry point for RUM functionality\n */\n\nimport type {\n SimplrRUMConfig,\n RUMEvent,\n RUMEventType,\n RUMActionType,\n RUMLogLevel,\n RUMDeviceContext,\n RUMActionTarget,\n RUMErrorData,\n RUMResourceData,\n RUMVitalData,\n RUMLongTaskData,\n RUMLogData,\n RUMLocationData,\n} from \"../types/rum\";\n\nimport { SessionManager, DeviceContextCollector, ViewManager } from \"./session\";\nimport { ClickTracker, ScrollTracker } from \"./clicks\";\nimport { ErrorTracker, ErrorDeduplicator } from \"./errors\";\nimport { NetworkTracker } from \"./network\";\nimport { PerformanceTracker, NavigationTracker } from \"./performance\";\nimport { LogCollector } from \"./logs\";\nimport { EventBatcher, EventSampler } from \"./batch\";\nimport { LocationTracker } from \"./location\";\n\nconst DEFAULT_ENDPOINT = \"https://api.simplr.so/v1/rum/events\";\n\n/**\n * SimplrRUM - Main RUM SDK class\n */\nexport class SimplrRUM {\n private static instance: SimplrRUM | null = null;\n\n private config: SimplrRUMConfig | null = null;\n private initialized = false;\n\n // Managers\n private sessionManager: SessionManager | null = null;\n private deviceCollector: DeviceContextCollector | null = null;\n private viewManager: ViewManager | null = null;\n\n // Trackers\n private clickTracker: ClickTracker | null = null;\n private scrollTracker: ScrollTracker | null = null;\n private errorTracker: ErrorTracker | null = null;\n private errorDeduplicator: ErrorDeduplicator | null = null;\n private networkTracker: NetworkTracker | null = null;\n private performanceTracker: PerformanceTracker | null = null;\n private navigationTracker: NavigationTracker | null = null;\n private logCollector: LogCollector | null = null;\n private locationTracker: LocationTracker | null = null;\n\n // Event handling\n private batcher: EventBatcher | null = null;\n private sampler: EventSampler | null = null;\n\n // Global attributes\n private globalAttributes: Record<string, unknown> = {};\n\n /**\n * Get singleton instance\n */\n static getInstance(): SimplrRUM {\n if (!SimplrRUM.instance) {\n SimplrRUM.instance = new SimplrRUM();\n }\n return SimplrRUM.instance;\n }\n\n /**\n * Initialize the RUM SDK\n */\n initialize(config: SimplrRUMConfig): void {\n if (this.initialized) {\n console.warn(\"SimplrRUM already initialized\");\n return;\n }\n\n if (typeof window === \"undefined\") {\n console.warn(\"SimplrRUM requires a browser environment\");\n return;\n }\n\n this.config = {\n trackClicks: true,\n trackErrors: true,\n trackNetwork: true,\n trackPerformance: true,\n trackLongTasks: true,\n trackLocation: false,\n locationUpdateInterval: 60000,\n locationHighAccuracy: false,\n batchSize: 30,\n flushInterval: 10000,\n scrubPII: true,\n sampleRate: 1.0,\n sessionTimeout: 30 * 60 * 1000,\n ...config,\n };\n\n // Initialize sampler\n this.sampler = new EventSampler(this.config.sampleRate);\n\n // If session not sampled, skip initialization\n if (!this.sampler.isSessionSampled()) {\n console.log(\"SimplrRUM: Session not sampled, skipping initialization\");\n this.initialized = true;\n return;\n }\n\n // Initialize device context collector\n this.deviceCollector = new DeviceContextCollector();\n\n // Initialize session manager\n this.sessionManager = new SessionManager(\n this.config.sessionTimeout,\n (session) => this.trackEvent(\"session_end\", { attributes: { duration: Date.now() - session.startedAt } })\n );\n const session = this.sessionManager.initialize();\n\n // Track session start\n this.trackEvent(\"session_start\");\n\n // Initialize view manager\n this.viewManager = new ViewManager((view) => {\n this.trackEvent(\"view\", {\n view: {\n id: view.id,\n name: view.name,\n url: view.url,\n startedAt: 0,\n duration: view.duration,\n isActive: false,\n actionCount: view.actionCount,\n errorCount: view.errorCount,\n resourceCount: view.resourceCount,\n },\n });\n });\n\n // Initialize event batcher\n const endpoint = this.config.endpoint || DEFAULT_ENDPOINT;\n this.batcher = new EventBatcher({\n endpoint,\n apiKey: this.config.apiKey,\n batchSize: this.config.batchSize,\n flushInterval: this.config.flushInterval,\n onFlushError: (error, events) => {\n console.error(\"SimplrRUM: Failed to flush events\", error);\n },\n });\n this.batcher.start();\n\n // Initialize click tracker\n if (this.config.trackClicks) {\n this.clickTracker = new ClickTracker((name, type, target, event) => {\n this.trackAction(name, type, { target });\n });\n this.clickTracker.start();\n\n this.scrollTracker = new ScrollTracker((direction, distance, duration) => {\n this.trackAction(`Scroll ${direction}`, \"scroll\", {\n target: { tag: \"window\" },\n });\n });\n this.scrollTracker.start();\n }\n\n // Initialize error tracker\n if (this.config.trackErrors) {\n this.errorDeduplicator = new ErrorDeduplicator();\n this.errorDeduplicator.start();\n\n this.errorTracker = new ErrorTracker((error) => {\n if (this.errorDeduplicator?.shouldTrack(error)) {\n this.trackError(error);\n }\n });\n this.errorTracker.start();\n }\n\n // Initialize network tracker\n if (this.config.trackNetwork) {\n this.networkTracker = new NetworkTracker((resource) => {\n this.trackResource(resource);\n });\n this.networkTracker.start({\n excludedPatterns: this.config.excludedUrlPatterns,\n allowedPatterns: this.config.allowedUrlPatterns,\n });\n }\n\n // Initialize performance tracker\n if (this.config.trackPerformance) {\n this.performanceTracker = new PerformanceTracker(\n (vital) => this.trackVital(vital),\n (longTask) => this.trackLongTask(longTask)\n );\n this.performanceTracker.start({ trackLongTasks: this.config.trackLongTasks });\n }\n\n // Initialize navigation tracker\n this.navigationTracker = new NavigationTracker((from, to) => {\n // Auto-track view changes for SPAs\n this.trackView(to);\n });\n this.navigationTracker.start();\n\n // Initialize log collector\n this.logCollector = new LogCollector((log) => {\n this.trackLog(log);\n });\n\n // Initialize location tracker\n if (this.config.trackLocation) {\n this.locationTracker = new LocationTracker(\n {\n updateInterval: this.config.locationUpdateInterval,\n highAccuracy: this.config.locationHighAccuracy,\n },\n (location) => {\n // Location updates are automatically included in events\n console.log(\"SimplrRUM: Location updated\", location.latitude, location.longitude);\n }\n );\n this.locationTracker.start().then((success) => {\n if (success) {\n console.log(\"SimplrRUM: Location tracking enabled\");\n }\n });\n }\n\n // Track initial page view\n const initialPath = typeof location !== \"undefined\"\n ? location.pathname + location.search\n : \"/\";\n this.trackView(initialPath);\n\n this.initialized = true;\n console.log(\"SimplrRUM initialized\");\n }\n\n /**\n * Check if initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Set user information\n */\n setUser(userId: string, attributes?: Record<string, unknown>): void {\n if (!this.initialized) return;\n this.sessionManager?.setUser(userId, attributes);\n }\n\n /**\n * Clear user information\n */\n clearUser(): void {\n if (!this.initialized) return;\n this.sessionManager?.clearUser();\n }\n\n /**\n * Add global attribute\n */\n addAttribute(key: string, value: unknown): void {\n this.globalAttributes[key] = value;\n }\n\n /**\n * Remove global attribute\n */\n removeAttribute(key: string): void {\n delete this.globalAttributes[key];\n }\n\n /**\n * Track a page/screen view\n */\n trackView(name: string, attributes?: Record<string, unknown>): void {\n if (!this.initialized) return;\n\n const viewId = this.viewManager?.startView(name);\n this.sessionManager?.incrementViewCount();\n\n this.trackEvent(\"view\", {\n view: {\n id: viewId || \"\",\n name,\n url: typeof location !== \"undefined\" ? location.href : \"\",\n startedAt: Date.now(),\n isActive: true,\n actionCount: 0,\n errorCount: 0,\n resourceCount: 0,\n },\n attributes,\n });\n }\n\n /**\n * Track a user action\n */\n trackAction(\n name: string,\n type: RUMActionType,\n options?: {\n target?: Partial<RUMActionTarget>;\n attributes?: Record<string, unknown>;\n }\n ): void {\n if (!this.initialized) return;\n\n this.sessionManager?.incrementActionCount();\n this.viewManager?.incrementActionCount();\n\n this.trackEvent(\"action\", {\n action: {\n name,\n type,\n target: options?.target as RUMActionTarget,\n },\n attributes: options?.attributes,\n });\n }\n\n /**\n * Track an error\n */\n trackError(\n error: Error | RUMErrorData,\n context?: Record<string, unknown>\n ): void {\n if (!this.initialized) return;\n\n this.sessionManager?.incrementErrorCount();\n this.viewManager?.incrementErrorCount();\n\n const errorData: RUMErrorData =\n error instanceof Error\n ? {\n message: error.message,\n stack: error.stack,\n type: error.constructor.name,\n source: \"custom\",\n handled: true,\n }\n : error;\n\n this.trackEvent(\"error\", {\n error: errorData,\n attributes: context,\n });\n }\n\n /**\n * Track a resource/network request\n */\n private trackResource(resource: RUMResourceData): void {\n if (!this.initialized) return;\n\n this.viewManager?.incrementResourceCount();\n\n this.trackEvent(\"resource\", { resource });\n }\n\n /**\n * Track a performance vital\n */\n private trackVital(vital: RUMVitalData): void {\n if (!this.initialized) return;\n\n this.trackEvent(\"vital\", { vital });\n }\n\n /**\n * Track a long task\n */\n private trackLongTask(longTask: RUMLongTaskData): void {\n if (!this.initialized) return;\n\n this.trackEvent(\"long_task\", { longTask });\n }\n\n /**\n * Track a log message\n */\n private trackLog(log: RUMLogData): void {\n if (!this.initialized) return;\n\n this.trackEvent(\"log\", { log });\n }\n\n /**\n * Log a message\n */\n log(\n level: RUMLogLevel,\n message: string,\n context?: Record<string, unknown>\n ): void {\n if (!this.initialized) return;\n\n this.logCollector?.log(level, message, context);\n }\n\n /**\n * Stop the RUM session\n */\n stopSession(): void {\n if (!this.initialized) return;\n\n // End current view\n this.viewManager?.endCurrentView();\n\n // End session\n this.sessionManager?.endSession();\n\n // Flush remaining events\n this.batcher?.flush();\n\n // Stop all trackers\n this.clickTracker?.stop();\n this.scrollTracker?.stop();\n this.errorTracker?.stop();\n this.errorDeduplicator?.stop();\n this.networkTracker?.stop();\n this.performanceTracker?.stop();\n this.navigationTracker?.stop();\n this.locationTracker?.stop();\n this.batcher?.stop();\n\n this.initialized = false;\n }\n\n /**\n * Internal: Track an event\n */\n private trackEvent(\n type: RUMEventType,\n data?: Partial<Omit<RUMEvent, \"type\" | \"timestamp\" | \"sessionId\" | \"applicationId\" | \"device\">>\n ): void {\n if (!this.sampler?.shouldSampleEvent(type)) return;\n\n const session = this.sessionManager?.getSession();\n if (!session) return;\n\n const event: RUMEvent = {\n type,\n timestamp: Date.now(),\n sessionId: session.sessionId,\n viewId: this.viewManager?.getCurrentViewId() || undefined,\n userId: session.userId,\n applicationId: this.config!.applicationId,\n applicationVersion: this.config?.applicationVersion,\n environment: this.config?.environment,\n device: this.deviceCollector?.getContext() || { platform: \"web\", os: \"unknown\" },\n location: this.locationTracker?.getLocation() || undefined,\n globalAttributes:\n Object.keys(this.globalAttributes).length > 0\n ? this.globalAttributes\n : undefined,\n ...data,\n };\n\n // Record session activity\n this.sessionManager?.recordActivity();\n\n // Add to batch\n this.batcher?.add(event);\n }\n\n /**\n * Force flush events\n */\n flush(): Promise<void> {\n return this.batcher?.flush() || Promise.resolve();\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.sessionManager?.getSessionId() || null;\n }\n\n /**\n * Get current view ID\n */\n getViewId(): string | null {\n return this.viewManager?.getCurrentViewId() || null;\n }\n}\n\n// Export singleton helper\nexport const simplrRUM = SimplrRUM.getInstance();\n\n// Re-export types\nexport type {\n SimplrRUMConfig,\n RUMEvent,\n RUMEventType,\n RUMActionType,\n RUMLogLevel,\n RUMDeviceContext,\n RUMActionTarget,\n RUMErrorData,\n RUMResourceData,\n RUMVitalData,\n RUMLongTaskData,\n RUMLogData,\n RUMLocationData,\n};\n","import { murmurHash3 } from \"../utils/hash\";\nimport { getDeviceId } from \"../utils/storage\";\n\nexport interface SimplrFlagsConfig {\n /** Public API key (pk_*) */\n apiKey: string;\n /** API base URL (default https://api.simplr.sh) */\n baseUrl?: string;\n /**\n * Which environment's flags to load (default: \"test\"). Accepts a named\n * environment slug (e.g. \"dev\", \"uat\", \"prod\") as well as the legacy\n * \"live\"/\"test\" key modes. Sent to the API as `?environment=<value>`.\n */\n environment?: string;\n /** Auto-refresh interval in ms (default 60000; 0 disables) */\n refreshIntervalMs?: number;\n}\n\nexport interface FlagRule {\n attribute: string;\n op: \"eq\" | \"neq\" | \"contains\";\n value: string;\n}\n\nexport interface FlagDefinition {\n key: string;\n enabled: boolean;\n rollout_percentage: number;\n target_user_ids: string[];\n rules: FlagRule[];\n}\n\nexport interface EvalContext {\n userId?: string;\n attributes?: Record<string, unknown>;\n}\n\nfunction matchRule(rule: FlagRule, attributes: Record<string, unknown>): boolean {\n const actual = attributes[rule.attribute];\n switch (rule.op) {\n case \"eq\":\n return String(actual) === rule.value;\n case \"neq\":\n return String(actual) !== rule.value;\n case \"contains\":\n return String(actual ?? \"\").includes(rule.value);\n default:\n return false;\n }\n}\n\n/**\n * Feature flags with deterministic per-user rollout + targeting.\n *\n * ```ts\n * import { simplrFlags } from \"@simplr-ai/js\";\n * // `environment` can be a named slug (\"dev\"/\"uat\"/\"prod\") or \"live\"/\"test\".\n * await simplrFlags.initialize({ apiKey: \"pk_live_…\", environment: \"uat\" });\n * simplrFlags.setUser(\"user_123\");\n * if (simplrFlags.isEnabled(\"new-checkout\")) { ... }\n * ```\n */\nexport class SimplrFlags {\n private apiKey = \"\";\n private baseUrl = \"https://api.simplr.sh\";\n private environment: string = \"test\";\n private refreshIntervalMs = 60000;\n private flags: Record<string, FlagDefinition> = {};\n private userId?: string;\n private timer: ReturnType<typeof setInterval> | null = null;\n private ready = false;\n\n async initialize(config: SimplrFlagsConfig): Promise<void> {\n this.apiKey = config.apiKey;\n if (config.baseUrl) this.baseUrl = config.baseUrl;\n if (config.environment) this.environment = config.environment;\n if (config.refreshIntervalMs !== undefined) this.refreshIntervalMs = config.refreshIntervalMs;\n await this.refresh();\n this.ready = true;\n if (this.refreshIntervalMs > 0 && typeof setInterval !== \"undefined\") {\n this.timer = setInterval(() => this.refresh(), this.refreshIntervalMs);\n }\n }\n\n setUser(userId: string): void {\n this.userId = userId;\n }\n\n async refresh(): Promise<void> {\n try {\n const res = await fetch(`${this.baseUrl}/v1/flags?environment=${encodeURIComponent(this.environment)}`, {\n headers: { \"X-API-Key\": this.apiKey },\n });\n if (!res.ok) return;\n const json = await res.json();\n const list: FlagDefinition[] = json?.content?.flags || [];\n const map: Record<string, FlagDefinition> = {};\n for (const f of list) map[f.key] = f;\n this.flags = map;\n } catch {\n // keep last-known flags on network error\n }\n }\n\n isEnabled(key: string, ctx?: EvalContext): boolean {\n const f = this.flags[key];\n if (!f || !f.enabled) return false;\n\n const uid = ctx?.userId || this.userId || getDeviceId();\n if (f.target_user_ids && f.target_user_ids.includes(uid)) return true;\n if (ctx?.attributes && f.rules?.length && f.rules.some((r) => matchRule(r, ctx.attributes!))) return true;\n\n if (f.rollout_percentage >= 100) return true;\n if (f.rollout_percentage <= 0) return false;\n const bucket = murmurHash3(`${key}:${uid}`) % 100;\n return bucket < f.rollout_percentage;\n }\n\n getAll(): Record<string, FlagDefinition> {\n return { ...this.flags };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n dispose(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n }\n}\n\nexport const simplrFlags = new SimplrFlags();\n","/**\n * Simplr AI Delegation SDK\n * OAuth-like AI authentication for web applications\n */\n\nexport type BindingMode = \"verified_device\" | \"any_location\";\n\nexport interface AIDelegationConfig {\n /** API key (public or secret key) */\n apiKey: string;\n /** API endpoint */\n endpoint?: string;\n /** Gateway URL for connect flow */\n gatewayUrl?: string;\n}\n\nexport interface CreateDelegationOptions {\n /** Your user ID for this end user */\n userId: string;\n /** Optional user email (will be hashed) */\n email?: string;\n /** Device binding mode */\n binding?: BindingMode;\n /** Days until expiration (default: 7) */\n expiresInDays?: number;\n /** RUM session ID if available */\n sessionId?: string;\n /** Device fingerprint hash (required for verified_device binding) */\n fingerprintHash?: string;\n}\n\nexport interface DelegationResult {\n /** The delegation token - only shown once! */\n token: string;\n /** Unique delegation ID */\n delegationId: string;\n /** When the delegation expires */\n expiresAt: string;\n /** The binding mode */\n bindingMode: BindingMode;\n}\n\nexport interface DelegationInfo {\n delegationId: string;\n endUserId: string;\n bindingMode: BindingMode;\n status: \"active\" | \"revoked\" | \"expired\";\n expiresAt: string;\n useCount: number;\n lastUsedAt?: string;\n createdAt: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n sessionType?: \"ai\";\n endUserId?: string;\n delegation?: {\n delegationId: string;\n bindingMode: BindingMode;\n expiresAt: string;\n useCount: number;\n };\n error?: string;\n}\n\nexport interface DelegationStats {\n totalDelegations: number;\n activeDelegations: number;\n totalUses: number;\n delegationsByBinding: {\n verifiedDevice: number;\n anyLocation: number;\n };\n}\n\nexport interface ConnectOptions {\n /** Your user ID for this end user */\n userId: string;\n /** Optional user email */\n email?: string;\n /** Device binding mode */\n binding?: BindingMode;\n /** Days until expiration (default: 7) */\n expiresInDays?: number;\n /** Device fingerprint hash */\n fingerprintHash?: string;\n /** Open in popup (default) or redirect */\n mode?: \"popup\" | \"redirect\";\n /** Popup width */\n popupWidth?: number;\n /** Popup height */\n popupHeight?: number;\n}\n\nexport interface ConnectResult {\n /** Whether connection was successful */\n success: boolean;\n /** Delegation ID if successful */\n delegationId?: string;\n /** Delegation token if successful (only in popup mode) */\n token?: string;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Simplr AI Delegation client\n * Provides OAuth-like AI authentication\n */\nexport class SimplrAI {\n private config: {\n apiKey: string;\n endpoint: string;\n gatewayUrl: string;\n };\n\n constructor(config: AIDelegationConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint || \"https://api.simplr.so\",\n gatewayUrl: config.gatewayUrl || \"https://auth.simplr.so\",\n };\n\n if (!this.config.apiKey) {\n throw new Error(\"API key is required\");\n }\n }\n\n /**\n * Open the AI Connect gateway for users to connect their AI\n * This is the main entry point for the OAuth-like flow\n */\n async connect(options: ConnectOptions): Promise<ConnectResult> {\n const mode = options.mode || \"popup\";\n\n // First, initiate the connect session\n const response = await this.request(\"/v1/ai-connect/initiate\", {\n method: \"POST\",\n body: JSON.stringify({\n end_user_id: options.userId,\n end_user_email: options.email,\n redirect_uri: window.location.href,\n binding: options.binding || \"any_location\",\n expires_in_days: options.expiresInDays || 7,\n fingerprint_hash: options.fingerprintHash,\n }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: data.message || \"Failed to initiate connection\",\n };\n }\n\n const gatewayUrl = data.data.gateway_url;\n\n if (mode === \"redirect\") {\n // Redirect mode - navigate to gateway\n window.location.href = gatewayUrl;\n return { success: true }; // Won't actually return, but TypeScript needs it\n }\n\n // Popup mode - open in popup and wait for result\n return this.openConnectPopup(gatewayUrl, options);\n }\n\n /**\n * Open the connect gateway in a popup window\n */\n private openConnectPopup(\n gatewayUrl: string,\n options: ConnectOptions\n ): Promise<ConnectResult> {\n return new Promise((resolve) => {\n const width = options.popupWidth || 450;\n const height = options.popupHeight || 650;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const popup = window.open(\n gatewayUrl,\n \"simplr-ai-connect\",\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,resizable=yes`\n );\n\n if (!popup) {\n resolve({\n success: false,\n error: \"Popup blocked. Please allow popups for this site.\",\n });\n return;\n }\n\n // Listen for messages from the popup\n const messageHandler = (event: MessageEvent) => {\n // Verify origin\n if (!event.origin.includes(\"simplr\")) {\n return;\n }\n\n if (event.data?.type === \"simplr-ai-connect-complete\") {\n window.removeEventListener(\"message\", messageHandler);\n clearInterval(checkClosed);\n\n if (event.data.success) {\n resolve({\n success: true,\n delegationId: event.data.delegationId,\n token: event.data.token,\n });\n } else {\n resolve({\n success: false,\n error: event.data.error || \"Connection failed\",\n });\n }\n\n popup.close();\n }\n };\n\n window.addEventListener(\"message\", messageHandler);\n\n // Check if popup was closed without completing\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener(\"message\", messageHandler);\n resolve({\n success: false,\n error: \"Connection cancelled\",\n });\n }\n }, 500);\n });\n }\n\n /**\n * Create a new AI delegation token for a user\n * Similar to OAuth \"authorize\" - generates a token the user shares with their AI\n */\n async createDelegation(options: CreateDelegationOptions): Promise<DelegationResult> {\n const response = await this.request(\"/v1/ai/delegations\", {\n method: \"POST\",\n body: JSON.stringify({\n end_user_id: options.userId,\n end_user_email: options.email,\n binding: options.binding || \"any_location\",\n expires_in_days: options.expiresInDays || 7,\n session_id: options.sessionId,\n fingerprint_hash: options.fingerprintHash,\n }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || \"Failed to create delegation\");\n }\n\n return {\n token: data.data.delegation.token,\n delegationId: data.data.delegation.delegation_id,\n expiresAt: data.data.delegation.expires_at,\n bindingMode: data.data.delegation.binding_mode,\n };\n }\n\n /**\n * Validate an AI delegation token\n * Similar to OAuth \"introspect\" - verifies the token and returns session info\n */\n async validate(\n token: string,\n options?: {\n fingerprintHash?: string;\n aiProvider?: string;\n action?: string;\n }\n ): Promise<ValidationResult> {\n const response = await this.request(\"/v1/ai/validate\", {\n method: \"POST\",\n body: JSON.stringify({\n token,\n fingerprint_hash: options?.fingerprintHash,\n ai_provider: options?.aiProvider,\n action: options?.action,\n }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n valid: false,\n error: data.error || data.message || \"Validation failed\",\n };\n }\n\n return {\n valid: true,\n sessionType: data.data.session_type,\n endUserId: data.data.end_user_id,\n delegation: data.data.delegation\n ? {\n delegationId: data.data.delegation.delegation_id,\n bindingMode: data.data.delegation.binding_mode,\n expiresAt: data.data.delegation.expires_at,\n useCount: data.data.delegation.use_count,\n }\n : undefined,\n };\n }\n\n /**\n * Revoke a delegation\n * Similar to OAuth \"revoke\"\n */\n async revoke(delegationId: string, reason?: string): Promise<void> {\n const url = `/v1/ai/delegations/${delegationId}${reason ? `?reason=${encodeURIComponent(reason)}` : \"\"}`;\n const response = await this.request(url, {\n method: \"DELETE\",\n });\n\n if (!response.ok) {\n const data = await response.json();\n throw new Error(data.message || \"Failed to revoke delegation\");\n }\n }\n\n /**\n * List delegations for a user\n */\n async list(userId?: string): Promise<DelegationInfo[]> {\n const url = userId ? `/v1/ai/delegations?end_user_id=${encodeURIComponent(userId)}` : \"/v1/ai/delegations\";\n const response = await this.request(url, {\n method: \"GET\",\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || \"Failed to list delegations\");\n }\n\n return data.data.delegations.map((d: any) => ({\n delegationId: d.delegation_id,\n endUserId: d.end_user_id,\n bindingMode: d.binding_mode,\n status: d.status,\n expiresAt: d.expires_at,\n useCount: d.use_count,\n lastUsedAt: d.last_used_at,\n createdAt: d.created_at,\n }));\n }\n\n /**\n * Get a single delegation\n */\n async get(delegationId: string): Promise<DelegationInfo> {\n const response = await this.request(`/v1/ai/delegations/${delegationId}`, {\n method: \"GET\",\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || \"Failed to get delegation\");\n }\n\n const d = data.data.delegation;\n return {\n delegationId: d.delegation_id,\n endUserId: d.end_user_id,\n bindingMode: d.binding_mode,\n status: d.status,\n expiresAt: d.expires_at,\n useCount: d.use_count,\n lastUsedAt: d.last_used_at,\n createdAt: d.created_at,\n };\n }\n\n /**\n * Get delegation statistics\n */\n async stats(): Promise<DelegationStats> {\n const response = await this.request(\"/v1/ai/stats\", {\n method: \"GET\",\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || \"Failed to get stats\");\n }\n\n return {\n totalDelegations: data.data.stats.total_delegations,\n activeDelegations: data.data.stats.active_delegations,\n totalUses: data.data.stats.total_uses,\n delegationsByBinding: {\n verifiedDevice: data.data.stats.delegations_by_binding.verified_device,\n anyLocation: data.data.stats.delegations_by_binding.any_location,\n },\n };\n }\n\n /**\n * Revoke all delegations for a user (useful on logout)\n */\n async revokeAllForUser(userId: string, reason?: string): Promise<number> {\n const response = await this.request(\"/v1/ai/revoke-all\", {\n method: \"POST\",\n body: JSON.stringify({\n end_user_id: userId,\n reason,\n }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || \"Failed to revoke delegations\");\n }\n\n return data.data.revoked_count;\n }\n\n private async request(path: string, options: RequestInit): Promise<Response> {\n const url = `${this.config.endpoint}${path}`;\n\n return fetch(url, {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.config.apiKey,\n ...options.headers,\n },\n });\n }\n}\n\n/**\n * Create a Simplr AI client\n */\nexport function createSimplrAI(config: AIDelegationConfig): SimplrAI {\n return new SimplrAI(config);\n}\n","/**\n * Simplr Profiles SDK\n * Anonymous user profile management and order fraud monitoring for web applications.\n *\n * Usage:\n * const profiles = new SimplrProfiles({ apiKey: 'pk_live_...' });\n * await profiles.identify('user-123');\n * const result = await profiles.submitOrder({ ... });\n */\n\nimport type { DeviceSignals } from \"../index\";\n\nexport interface SimplrProfilesConfig {\n /** Public API key */\n apiKey: string;\n /** API base URL (defaults to production) */\n baseUrl?: string;\n}\n\nexport interface IdentifyOptions {\n /** Profile type */\n profileType?: \"customer\" | \"cashier\" | \"employee\";\n /** Pre-collected device signals (auto-collected if omitted) */\n deviceSignals?: DeviceSignals;\n}\n\nexport interface ProfileResult {\n profile: {\n id: string;\n external_id: string;\n profile_type: string;\n status: string;\n risk_score: number;\n risk_level: string;\n device_count: number;\n total_orders: number;\n first_seen_at: string;\n last_seen_at: string;\n };\n is_new: boolean;\n device_linked: boolean;\n device_anomaly?: string;\n}\n\nexport interface OrderInput {\n /** Your internal order ID */\n external_order_id: string;\n /** User's external_id (from identify()) */\n external_id?: string;\n /** Order type */\n order_type?: \"online\" | \"in_store\" | \"phone\" | \"other\";\n /** Amount in cents */\n amount_cents: number;\n /** ISO 4217 currency code */\n currency?: string;\n /** Number of items */\n item_count?: number;\n /** Payment method */\n payment_method?: \"card\" | \"cash\" | \"mobile\" | \"crypto\" | \"other\";\n /** Order location */\n location_latitude?: number;\n location_longitude?: number;\n location_country?: string;\n location_city?: string;\n location_name?: string;\n /** POS edge device ID (for in_store orders) */\n edge_device_id?: string;\n /** Cashier external_id (for in_store orders) */\n cashier_external_id?: string;\n /** ISO 8601 datetime (defaults to now) */\n ordered_at?: string;\n /** Order line items */\n items?: Array<{\n external_item_id?: string;\n item_category?: string;\n quantity: number;\n unit_price_cents: number;\n total_price_cents: number;\n discount_cents?: number;\n discount_type?: \"none\" | \"percentage\" | \"fixed\" | \"override\" | \"employee\";\n }>;\n}\n\nexport interface OrderFraudResult {\n order: {\n id: string;\n external_order_id: string;\n status: string;\n ordered_at: string;\n };\n risk: {\n risk_score: number;\n risk_level: string;\n signals: {\n velocity: number;\n amount_anomaly: number;\n location_anomaly: number;\n device_anomaly: number;\n time_anomaly: number;\n pattern: number;\n };\n flags: string[];\n flagged_for_review: boolean;\n };\n}\n\nexport interface ProfileRiskResult {\n profile: {\n id: string;\n external_id: string;\n profile_type: string;\n status: string;\n risk_score: number;\n risk_level: string;\n signals: {\n velocity: number;\n device_diversity: number;\n location_anomaly: number;\n amount_anomaly: number;\n time_anomaly: number;\n behavioral: number;\n };\n device_count: number;\n total_orders: number;\n flagged_orders: number;\n fraud_reports: number;\n legitimate_reports: number;\n first_seen_at: string;\n last_seen_at: string;\n };\n}\n\n/**\n * Simplr Profiles SDK for anonymous user profile management and order fraud monitoring.\n */\nexport class SimplrProfiles {\n private config: SimplrProfilesConfig;\n private baseUrl: string;\n private collectDeviceSignalsFn?: () => Promise<DeviceSignals>;\n\n constructor(config: SimplrProfilesConfig) {\n this.config = config;\n this.baseUrl = config.baseUrl || \"https://api.simplr.sh\";\n }\n\n /**\n * Set the device signal collector function.\n * Call this with SimplrFraud.collectDeviceSignals to enable auto-collection.\n */\n setDeviceSignalCollector(fn: () => Promise<DeviceSignals>): void {\n this.collectDeviceSignalsFn = fn;\n }\n\n /**\n * Identify a user — creates or updates an anonymous profile and links the current device.\n */\n async identify(externalId: string, options?: IdentifyOptions): Promise<ProfileResult> {\n let deviceSignals = options?.deviceSignals;\n\n // Auto-collect device signals if not provided\n if (!deviceSignals && this.collectDeviceSignalsFn) {\n deviceSignals = await this.collectDeviceSignalsFn();\n }\n\n const body: Record<string, unknown> = {\n external_id: externalId,\n profile_type: options?.profileType || \"customer\",\n };\n\n if (deviceSignals) {\n body.fingerprint_hash = deviceSignals.fingerprint;\n }\n\n return this.request<ProfileResult>(\"POST\", \"/v1/profiles\", body);\n }\n\n /**\n * Submit an order for real-time fraud scoring.\n * Automatically includes device fingerprint if a collector is set.\n */\n async submitOrder(order: OrderInput): Promise<OrderFraudResult> {\n const body: Record<string, unknown> = { ...order };\n\n // Auto-attach device fingerprint\n if (!body.fingerprint_hash && this.collectDeviceSignalsFn) {\n const signals = await this.collectDeviceSignalsFn();\n body.fingerprint_hash = signals.fingerprint;\n }\n\n // Auto-attach geolocation if available\n if (!body.location_latitude && typeof navigator !== \"undefined\" && navigator.geolocation) {\n try {\n const pos = await new Promise<GeolocationPosition>((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(resolve, reject, { timeout: 3000 });\n });\n body.location_latitude = pos.coords.latitude;\n body.location_longitude = pos.coords.longitude;\n } catch {\n // Geolocation not available or denied — proceed without it\n }\n }\n\n return this.request<OrderFraudResult>(\"POST\", \"/v1/orders\", body);\n }\n\n /**\n * Get the risk profile for a user.\n */\n async getProfileRisk(externalId: string): Promise<ProfileRiskResult> {\n return this.request<ProfileRiskResult>(\"GET\", `/v1/profiles/${encodeURIComponent(externalId)}`);\n }\n\n /**\n * Report a profile as fraud or legitimate.\n */\n async reportOutcome(externalId: string, outcome: \"fraud\" | \"legitimate\"): Promise<void> {\n await this.request(\"POST\", `/v1/profiles/${encodeURIComponent(externalId)}/report`, {\n outcome,\n });\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n };\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`SimplrProfiles API error (${response.status}): ${errorBody}`);\n }\n\n const json = await response.json();\n return json.data as T;\n }\n}\n\n/**\n * Factory function to create a SimplrProfiles instance.\n */\nexport function createSimplrProfiles(config: SimplrProfilesConfig): SimplrProfiles {\n return new SimplrProfiles(config);\n}\n","/**\n * Simplr Fraud SDK\n * Client-side fraud detection for web applications\n */\n\nimport { getCanvasFingerprint, detectCanvasBlocking } from \"./fingerprint/canvas\";\nimport { getWebGLFingerprint } from \"./fingerprint/webgl\";\nimport { getAudioFingerprint } from \"./fingerprint/audio\";\nimport { getFontFingerprintModern } from \"./fingerprint/fonts\";\nimport {\n getBrowserFingerprint,\n detectHeadless,\n detectOS,\n detectBrowser,\n} from \"./fingerprint/browser\";\nimport { createFingerprintHash } from \"./utils/hash\";\nimport { getDeviceId, getDeviceIdCreatedAt } from \"./utils/storage\";\nimport {\n KeystrokeTracker,\n KeystrokeMetrics,\n createKeystrokeTracker,\n} from \"./biometrics/keyboard\";\nimport { MouseTracker, MouseMetrics, createMouseTracker } from \"./biometrics/mouse\";\nimport { TouchTracker, TouchMetrics, createTouchTracker, isTouchSupported } from \"./biometrics/touch\";\n\nexport interface SimplrFraudConfig {\n /** Public API key (safe for client-side) */\n apiKey?: string;\n /** Whether to collect behavioral biometrics */\n collectBiometrics?: boolean;\n /** Whether to auto-start tracking on initialization */\n autoStart?: boolean;\n}\n\nexport interface DeviceSignals {\n /** Combined fingerprint hash */\n fingerprint: string;\n /** Individual fingerprint components */\n fingerprint_components: {\n canvas_hash: string;\n webgl_hash: string;\n audio_hash: string;\n fonts_hash: string;\n };\n /** Persistent device ID */\n device_id: string;\n /** When device ID was first created */\n device_id_created_at: string | null;\n /** Platform type */\n platform: \"web\";\n /** Operating system */\n os: string;\n os_version: string | null;\n /** Browser info */\n browser: string;\n browser_version: string | null;\n /** User agent */\n user_agent: string;\n /** Screen resolution */\n screen_resolution: string;\n /** Color depth */\n color_depth: number;\n /** Device pixel ratio */\n device_pixel_ratio: number;\n /** Timezone */\n timezone: string;\n timezone_offset: number;\n /** Language */\n language: string;\n languages: string[];\n /** Hardware */\n cpu_cores: number;\n device_memory: number | null;\n /** Touch support */\n has_touch: boolean;\n max_touch_points: number;\n /** Bot detection */\n is_webdriver: boolean;\n is_headless: boolean;\n headless_indicators: string[];\n /** Canvas blocking detection */\n canvas_blocked: boolean;\n /** WebGL info */\n webgl_vendor: string | null;\n webgl_renderer: string | null;\n /** Plugin count */\n plugin_count: number;\n /** Cookies enabled */\n cookies_enabled: boolean;\n /** Do Not Track */\n do_not_track: string | null;\n}\n\nexport interface BehaviorSignals {\n /** Keystroke metrics */\n keystroke?: KeystrokeMetrics;\n /** Mouse metrics */\n mouse?: MouseMetrics;\n /** Touch metrics (mobile web) */\n touch?: TouchMetrics;\n /** Form fill time (ms) */\n form_fill_time?: number;\n}\n\nexport interface CollectedSignals {\n device: DeviceSignals;\n behavior: BehaviorSignals;\n collected_at: string;\n}\n\n/**\n * Main Simplr Fraud SDK class\n */\nexport class SimplrFraud {\n private config: SimplrFraudConfig;\n private keystrokeTracker: KeystrokeTracker;\n private mouseTracker: MouseTracker;\n private touchTracker: TouchTracker;\n private formStartTime: number | null = null;\n private isInitialized = false;\n\n constructor(config: SimplrFraudConfig = {}) {\n this.config = {\n collectBiometrics: true,\n autoStart: true,\n ...config,\n };\n\n this.keystrokeTracker = createKeystrokeTracker();\n this.mouseTracker = createMouseTracker();\n this.touchTracker = createTouchTracker();\n\n if (this.config.autoStart) {\n this.initialize();\n }\n }\n\n /**\n * Initializes the SDK and starts tracking\n */\n initialize(): void {\n if (this.isInitialized) return;\n this.isInitialized = true;\n\n if (this.config.collectBiometrics) {\n this.startTracking();\n }\n }\n\n /**\n * Starts biometric tracking\n */\n startTracking(): void {\n this.keystrokeTracker.start();\n this.mouseTracker.start();\n if (isTouchSupported()) {\n this.touchTracker.start();\n }\n this.formStartTime = performance.now();\n\n // Attach global listeners for mouse tracking\n if (typeof document !== \"undefined\") {\n const mouseHandlers = this.mouseTracker.getEventHandlers();\n document.addEventListener(\"mousemove\", mouseHandlers.onMouseMove, {\n passive: true,\n });\n document.addEventListener(\"click\", mouseHandlers.onClick);\n document.addEventListener(\"wheel\", mouseHandlers.onWheel, { passive: true });\n\n if (isTouchSupported()) {\n const touchHandlers = this.touchTracker.getEventHandlers();\n document.addEventListener(\"touchstart\", touchHandlers.onTouchStart, {\n passive: true,\n });\n document.addEventListener(\"touchmove\", touchHandlers.onTouchMove, {\n passive: true,\n });\n document.addEventListener(\"touchend\", touchHandlers.onTouchEnd, {\n passive: true,\n });\n }\n }\n }\n\n /**\n * Stops biometric tracking\n */\n stopTracking(): void {\n this.keystrokeTracker.stop();\n this.mouseTracker.stop();\n this.touchTracker.stop();\n }\n\n /**\n * Creates input tracking props for an input element\n */\n trackInput(fieldName: string): {\n onKeyDown: (e: KeyboardEvent) => void;\n onKeyUp: (e: KeyboardEvent) => void;\n onPaste: () => void;\n \"data-simplr-field\": string;\n } {\n const handlers = this.keystrokeTracker.getEventHandlers();\n return {\n onKeyDown: handlers.onKeyDown,\n onKeyUp: handlers.onKeyUp,\n onPaste: handlers.onPaste,\n \"data-simplr-field\": fieldName,\n };\n }\n\n /**\n * Collects all device fingerprints\n */\n async collectDeviceSignals(): Promise<DeviceSignals> {\n // Collect fingerprints in parallel\n const [canvasFp, webglFp, audioFp, fontsFp] = await Promise.all([\n Promise.resolve(getCanvasFingerprint()),\n Promise.resolve(getWebGLFingerprint()),\n getAudioFingerprint(),\n getFontFingerprintModern(),\n ]);\n\n const browserFp = getBrowserFingerprint();\n const headless = detectHeadless();\n const os = detectOS();\n const browser = detectBrowser();\n\n // Create combined fingerprint hash\n const fingerprintComponents = {\n canvas_hash: canvasFp.hash,\n webgl_hash: webglFp.hash,\n audio_hash: audioFp.hash,\n fonts_hash: fontsFp.hash,\n };\n\n const fingerprint = await createFingerprintHash({\n ...fingerprintComponents,\n screen: browserFp.screenResolution,\n timezone: browserFp.timezone,\n language: browserFp.language,\n platform: browserFp.platform,\n });\n\n const deviceIdCreatedAt = getDeviceIdCreatedAt();\n\n return {\n fingerprint,\n fingerprint_components: fingerprintComponents,\n device_id: getDeviceId(),\n device_id_created_at: deviceIdCreatedAt?.toISOString() ?? null,\n platform: \"web\",\n os: os.os,\n os_version: os.version,\n browser: browser.browser,\n browser_version: browser.version,\n user_agent: browserFp.userAgent,\n screen_resolution: browserFp.screenResolution,\n color_depth: browserFp.screenColorDepth,\n device_pixel_ratio: browserFp.devicePixelRatio,\n timezone: browserFp.timezone,\n timezone_offset: browserFp.timezoneOffset,\n language: browserFp.language,\n languages: browserFp.languages,\n cpu_cores: browserFp.hardwareConcurrency,\n device_memory: browserFp.deviceMemory,\n has_touch: browserFp.hasTouch,\n max_touch_points: browserFp.maxTouchPoints,\n is_webdriver: browserFp.isWebDriver,\n is_headless: headless.isHeadless,\n headless_indicators: headless.indicators,\n canvas_blocked: detectCanvasBlocking(),\n webgl_vendor: webglFp.vendor,\n webgl_renderer: webglFp.renderer,\n plugin_count: browserFp.plugins.length,\n cookies_enabled: browserFp.cookiesEnabled,\n do_not_track: browserFp.doNotTrack,\n };\n }\n\n /**\n * Collects behavioral metrics\n */\n collectBehaviorSignals(): BehaviorSignals {\n const signals: BehaviorSignals = {};\n\n if (this.config.collectBiometrics) {\n signals.keystroke = this.keystrokeTracker.getMetrics();\n signals.mouse = this.mouseTracker.getMetrics();\n\n if (isTouchSupported()) {\n signals.touch = this.touchTracker.getMetrics();\n }\n\n if (this.formStartTime !== null) {\n signals.form_fill_time = performance.now() - this.formStartTime;\n }\n }\n\n return signals;\n }\n\n /**\n * Collects all signals (device + behavior)\n */\n async collect(): Promise<CollectedSignals> {\n const [device, behavior] = await Promise.all([\n this.collectDeviceSignals(),\n Promise.resolve(this.collectBehaviorSignals()),\n ]);\n\n return {\n device,\n behavior,\n collected_at: new Date().toISOString(),\n };\n }\n\n /**\n * Resets all collected behavioral data\n */\n reset(): void {\n this.keystrokeTracker.reset();\n this.mouseTracker.reset();\n this.touchTracker.reset();\n this.formStartTime = performance.now();\n }\n\n /**\n * Returns whether the SDK is ready to collect\n */\n get isReady(): boolean {\n return this.isInitialized;\n }\n}\n\n// Export types\nexport type {\n KeystrokeMetrics,\n KeystrokeData,\n} from \"./biometrics/keyboard\";\nexport type {\n MouseMetrics,\n MousePoint,\n ClickData,\n} from \"./biometrics/mouse\";\nexport type {\n TouchMetrics,\n TouchPoint,\n} from \"./biometrics/touch\";\n\n// Export utilities\nexport { getDeviceId, clearDeviceId } from \"./utils/storage\";\nexport { sha256, murmurHash3, createFingerprintHash } from \"./utils/hash\";\n\n// Export fingerprint functions for advanced usage\nexport { getCanvasFingerprint, detectCanvasBlocking } from \"./fingerprint/canvas\";\nexport { getWebGLFingerprint, detectWebGLSpoofing } from \"./fingerprint/webgl\";\nexport { getAudioFingerprint, isAudioFingerprintSupported } from \"./fingerprint/audio\";\nexport { getFontFingerprint, getFontFingerprintModern } from \"./fingerprint/fonts\";\nexport {\n getBrowserFingerprint,\n detectHeadless,\n detectOS,\n detectBrowser,\n} from \"./fingerprint/browser\";\n\n// Export biometric trackers for advanced usage\nexport {\n KeystrokeTracker,\n createKeystrokeTracker,\n} from \"./biometrics/keyboard\";\nexport {\n MouseTracker,\n createMouseTracker,\n} from \"./biometrics/mouse\";\nexport {\n TouchTracker,\n createTouchTracker,\n isTouchSupported,\n} from \"./biometrics/touch\";\n\n// RUM (Real User Monitoring) exports\nexport {\n SimplrRUM,\n simplrRUM,\n} from \"./rum\";\nexport type {\n SimplrRUMConfig,\n RUMEvent,\n RUMEventType,\n RUMActionType,\n RUMLogLevel,\n RUMDeviceContext,\n RUMActionTarget,\n RUMErrorData,\n RUMResourceData,\n RUMVitalData,\n RUMLongTaskData,\n RUMLogData,\n} from \"./rum\";\n\n// Feature flags exports\nexport { SimplrFlags, simplrFlags } from \"./flags\";\nexport type { SimplrFlagsConfig, FlagDefinition, FlagRule, EvalContext } from \"./flags\";\n\n// AI Delegation exports\nexport {\n SimplrAI,\n createSimplrAI,\n} from \"./ai\";\nexport type {\n AIDelegationConfig,\n CreateDelegationOptions,\n DelegationResult,\n DelegationInfo,\n ValidationResult,\n DelegationStats,\n BindingMode,\n} from \"./ai\";\n\n// Profiles SDK (anonymous user profiles & order fraud monitoring)\nexport {\n SimplrProfiles,\n createSimplrProfiles,\n} from \"./profiles\";\nexport type {\n SimplrProfilesConfig,\n IdentifyOptions,\n ProfileResult as ProfileIdentifyResult,\n OrderInput as ProfileOrderInput,\n OrderFraudResult as ProfileOrderFraudResult,\n ProfileRiskResult,\n} from \"./profiles\";\n\n// Default export\nexport default SimplrFraud;\n","/**\n * SimplrElements — the shared imperative controller / singleton.\n *\n * Builds and holds the configured `@simplr-ai/js` core instances\n * (SimplrFraud + SimplrFlags + SimplrProfiles + SimplrRUM + SimplrAI) so that\n * every custom element AND non-HTML consumers share ONE configured client.\n *\n * This is a THIN adapter — it never reimplements features. `check()` and\n * `submitOrder()` POST to the documented public-key endpoints (`/v1/check`,\n * `/v1/orders`) exactly as specified in the Simplr API contract, attaching the\n * device + behavior signals collected by the core fraud client.\n */\nimport {\n SimplrFraud,\n SimplrFlags,\n SimplrProfiles,\n SimplrAI,\n simplrRUM,\n type SimplrFraudConfig,\n type SimplrFlagsConfig,\n type SimplrProfilesConfig,\n type SimplrRUMConfig,\n type AIDelegationConfig,\n type CollectedSignals,\n type DeviceSignals,\n type BehaviorSignals,\n type EvalContext,\n} from \"@simplr-ai/js\";\n\nconst DEFAULT_BASE_URL = \"https://api.simplr.sh\";\n\n/** POST /v1/check input (public-key client ingestion). */\nexport interface CheckInput {\n email?: string;\n phone?: string;\n device?: Record<string, unknown>;\n behavior?: Record<string, unknown>;\n event_type?: string;\n event_id?: string;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport type RiskLevel = \"low\" | \"medium\" | \"high\" | \"critical\";\n\n/** POST /v1/check result. */\nexport interface CheckResult {\n type?: string;\n risk_score: number;\n risk_level: RiskLevel;\n signals?: Record<string, unknown>;\n email?: string;\n phone_number?: string;\n fingerprint_hash?: string;\n checked_at?: string;\n is_sandbox?: boolean;\n [key: string]: unknown;\n}\n\n/** Configuration accepted by {@link SimplrController.configure}. */\nexport interface SimplrConfig {\n /** Public API key (`pk_*`) — safe for the client. */\n apiKey: string;\n /** API base URL override (default `https://api.simplr.sh`). */\n baseUrl?: string;\n /** Whether to auto-start biometric tracking on configure (default true). */\n autoStart?: boolean;\n /** Whether to collect behavioral biometrics (default true). */\n collectBiometrics?: boolean;\n /** Core fraud / device-signal config overrides. */\n fraud?: SimplrFraudConfig;\n /** Feature-flags config. `true` = enable with defaults, object = customise, omit/false = skip. */\n flags?: Partial<SimplrFlagsConfig> | boolean;\n /** Profiles config. `true` = enable with the shared key/baseUrl, object = customise. */\n profiles?: Partial<SimplrProfilesConfig> | boolean;\n /** RUM config — requires at least `applicationId`. Omit to skip RUM. */\n rum?: SimplrRUMConfig;\n /** AI delegation config. `true` = enable with the shared key, object = customise. */\n ai?: Partial<AIDelegationConfig> | boolean;\n}\n\nfunction resolveBlock<T extends object>(\n block: Partial<T> | boolean | undefined,\n fallback: T,\n): T | undefined {\n if (block === false || block === undefined) return undefined;\n if (block === true) return fallback;\n return { ...fallback, ...block } as T;\n}\n\n/**\n * The Simplr controller. A single shared instance ({@link SimplrElements}) is\n * exported; call `.configure()` once and every element + helper reads from it.\n */\nexport class SimplrController {\n private _config: SimplrConfig | null = null;\n private _baseUrl = DEFAULT_BASE_URL;\n\n /** Core device-fingerprint + behavioral-biometrics client. */\n fraud: SimplrFraud | null = null;\n /** Feature flags (local eval + murmurhash bucketing). */\n flags: SimplrFlags | null = null;\n /** Anonymous profiles + order fraud monitoring. */\n profiles: SimplrProfiles | null = null;\n /** Real User Monitoring (shared core singleton). */\n rum: typeof simplrRUM | null = null;\n /** AI delegation (OAuth-like). */\n ai: SimplrAI | null = null;\n\n private readyResolvers: Array<() => void> = [];\n private _ready = false;\n\n /** True once {@link configure} has built the core clients. */\n get isConfigured(): boolean {\n return this._config !== null;\n }\n\n /** The resolved public API key, or undefined if not configured. */\n get apiKey(): string | undefined {\n return this._config?.apiKey;\n }\n\n /** The resolved API base URL. */\n get baseUrl(): string {\n return this._baseUrl;\n }\n\n /**\n * Configure the shared client. Idempotent: if already configured with the\n * same key it is a no-op, so multiple `<simplr-provider>` mounts are safe.\n */\n configure(config: SimplrConfig): SimplrController {\n if (this._config && this._config.apiKey === config.apiKey) {\n return this; // already configured with this key\n }\n\n this._config = {\n autoStart: true,\n collectBiometrics: true,\n ...config,\n };\n this._baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const apiKey = config.apiKey;\n\n // Core fraud client (device fingerprint + behavioral biometrics).\n this.fraud = new SimplrFraud({\n apiKey,\n autoStart: this._config.autoStart,\n collectBiometrics: this._config.collectBiometrics,\n ...config.fraud,\n });\n\n // Feature flags.\n const flagsConfig = resolveBlock<SimplrFlagsConfig>(\n config.flags === undefined ? true : config.flags,\n { apiKey, baseUrl: this._baseUrl },\n );\n if (flagsConfig) {\n this.flags = new SimplrFlags();\n void this.flags.initialize(flagsConfig);\n }\n\n // Profiles.\n const profilesConfig = resolveBlock<SimplrProfilesConfig>(\n config.profiles === undefined ? true : config.profiles,\n { apiKey, baseUrl: this._baseUrl },\n );\n if (profilesConfig) {\n this.profiles = new SimplrProfiles(profilesConfig);\n this.profiles.setDeviceSignalCollector(() => this.fraud!.collectDeviceSignals());\n }\n\n // RUM (core singleton).\n if (config.rum) {\n if (!simplrRUM.isInitialized()) {\n simplrRUM.initialize(config.rum);\n }\n this.rum = simplrRUM;\n }\n\n // AI delegation.\n const aiConfig = resolveBlock<AIDelegationConfig>(\n config.ai === undefined ? true : config.ai,\n { apiKey },\n );\n if (aiConfig && aiConfig.apiKey) {\n this.ai = new SimplrAI(aiConfig);\n }\n\n this._ready = true;\n this.readyResolvers.splice(0).forEach((r) => r());\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"simplr:configured\", { detail: { controller: this } }));\n }\n return this;\n }\n\n /** Resolves once the controller has been configured. */\n ready(): Promise<void> {\n if (this._ready) return Promise.resolve();\n return new Promise((resolve) => this.readyResolvers.push(resolve));\n }\n\n private requireFraud(): SimplrFraud {\n if (!this.fraud) {\n throw new Error(\n \"Simplr is not configured. Call SimplrElements.configure({ apiKey }) \" +\n \"or add a <simplr-provider api-key=\\\"pk_...\\\"> element first.\",\n );\n }\n return this.fraud;\n }\n\n // --- Signal collection (delegates to the core fraud client) --------------\n\n /** Collect device fingerprint + behavioral biometrics together. */\n collect(): Promise<CollectedSignals> {\n return this.requireFraud().collect();\n }\n\n /** Collect device fingerprint signals only. */\n getDeviceSignals(): Promise<DeviceSignals> {\n return this.requireFraud().collectDeviceSignals();\n }\n\n /** Collect behavioral biometric signals only (sync). */\n getBehaviorSignals(): BehaviorSignals {\n return this.requireFraud().collectBehaviorSignals();\n }\n\n /** Input tracking handlers/attrs for a named field (keystroke biometrics). */\n trackInput(fieldName: string) {\n return this.requireFraud().trackInput(fieldName);\n }\n\n /** Reset collected behavioral data. */\n reset(): void {\n this.requireFraud().reset();\n }\n\n // --- API calls (public-key ingestion, per the contract) ------------------\n\n /**\n * Run a fraud/identity check (POST `/v1/check`). Device + behavior signals\n * are auto-collected and merged into the request unless already on `input`.\n */\n async check(input: CheckInput = {}): Promise<CheckResult> {\n const collected = await this.collect();\n const body: CheckInput = {\n ...input,\n device: input.device ?? (collected.device as unknown as Record<string, unknown>),\n behavior: input.behavior ?? (collected.behavior as unknown as Record<string, unknown>),\n };\n return this.request<CheckResult>(\"/v1/check\", body);\n }\n\n private async request<T>(path: string, body: unknown): Promise<T> {\n const apiKey = this.apiKey;\n if (!apiKey) throw new Error(\"Simplr is not configured (missing apiKey).\");\n const res = await fetch(`${this._baseUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-API-Key\": apiKey },\n body: JSON.stringify(body),\n });\n const json = await res.json().catch(() => null);\n if (!res.ok) {\n const message =\n (json && (json.message || json.error)) || `Simplr API error ${res.status}`;\n throw new Error(message);\n }\n // Unwrap the standard { success, message, content } envelope when present.\n return (json && \"content\" in json ? json.content : json) as T;\n }\n\n // --- Feature flags helper ------------------------------------------------\n\n /** Evaluate a feature flag locally. Returns false if flags aren't enabled. */\n isFeatureEnabled(key: string, ctx?: EvalContext): boolean {\n return this.flags ? this.flags.isEnabled(key, ctx) : false;\n }\n\n /** Tear down timers / trackers (useful for tests + SPA teardown). */\n dispose(): void {\n this.fraud?.stopTracking();\n this.flags?.dispose();\n this.rum?.stopSession();\n this._config = null;\n this._ready = false;\n this.fraud = this.flags = this.profiles = this.ai = this.rum = null;\n }\n}\n\n/** The shared controller singleton every element + helper reads from. */\nexport const SimplrElements = new SimplrController();\n\n/**\n * Imperative feature-flag helper mirroring the core local-eval contract.\n * Reads from the shared controller.\n */\nexport function isFeatureEnabled(key: string, ctx?: EvalContext): boolean {\n return SimplrElements.isFeatureEnabled(key, ctx);\n}\n","/**\n * `<simplr-provider>` — configures the shared Simplr client.\n *\n * Configuration sources (first match wins):\n * 1. the `api-key` / `public-key` attribute on this element\n * 2. a `data-simplr-key` attribute on this element or <html>/<body>\n * 3. `window.SIMPLR_CONFIG = { apiKey, baseUrl?, autoStart? }`\n *\n * Optional attributes: `base-url`, `no-autostart`, `flags`, `profiles`, `ai`\n * (presence enables; `flags=\"false\"` disables), `app-id` (enables RUM).\n *\n * Covers: client configuration / context for all descendant elements.\n */\nimport { SimplrElements } from \"../controller\";\n\ndeclare global {\n interface Window {\n SIMPLR_CONFIG?: {\n apiKey?: string;\n publicKey?: string;\n baseUrl?: string;\n autoStart?: boolean;\n appId?: string;\n };\n }\n}\n\nfunction readKey(el: HTMLElement): string | undefined {\n return (\n el.getAttribute(\"api-key\") ||\n el.getAttribute(\"public-key\") ||\n el.getAttribute(\"publicKey\") ||\n el.getAttribute(\"data-simplr-key\") ||\n (typeof document !== \"undefined\"\n ? document.documentElement.getAttribute(\"data-simplr-key\") ||\n document.body?.getAttribute(\"data-simplr-key\") ||\n undefined\n : undefined) ||\n (typeof window !== \"undefined\"\n ? window.SIMPLR_CONFIG?.apiKey || window.SIMPLR_CONFIG?.publicKey\n : undefined) ||\n undefined\n );\n}\n\nfunction flagFor(el: HTMLElement, name: string, fallback: boolean): boolean {\n if (!el.hasAttribute(name)) return fallback;\n const v = el.getAttribute(name);\n return v !== \"false\" && v !== \"off\" && v !== \"0\";\n}\n\nexport class SimplrProviderElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\"api-key\", \"public-key\", \"base-url\"];\n }\n\n connectedCallback(): void {\n this.tryConfigure();\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.tryConfigure();\n }\n\n private tryConfigure(): void {\n const apiKey = readKey(this);\n if (!apiKey) return; // wait for a key to appear\n\n const appId =\n this.getAttribute(\"app-id\") ||\n (typeof window !== \"undefined\" ? window.SIMPLR_CONFIG?.appId : undefined);\n\n SimplrElements.configure({\n apiKey,\n baseUrl:\n this.getAttribute(\"base-url\") ||\n (typeof window !== \"undefined\" ? window.SIMPLR_CONFIG?.baseUrl : undefined) ||\n undefined,\n autoStart: !this.hasAttribute(\"no-autostart\"),\n flags: flagFor(this, \"flags\", true),\n profiles: flagFor(this, \"profiles\", true),\n ai: flagFor(this, \"ai\", true),\n rum: appId ? { apiKey, applicationId: appId } : undefined,\n });\n\n this.dispatchEvent(\n new CustomEvent(\"simplr-ready\", {\n bubbles: true,\n composed: true,\n detail: { controller: SimplrElements },\n }),\n );\n }\n}\n","/**\n * `<simplr-protected-form>` — wraps a `<form>` (via slot). On submit it collects\n * device + behavioral signals from the shared core fraud client and, if\n * `auto-check` is set, runs a `/v1/check`. It attaches the result two ways:\n * - a hidden `<input name=\"simplr_signals\">` injected into the form (JSON), and\n * - a `simplr-submit` CustomEvent carrying `{ signals, check, event }`.\n *\n * By default the native submit is prevented so you can finish it after the\n * async collect resolves; add `native-submit` to let it proceed.\n *\n * Covers: [device fingerprint] [behavioral biometrics] [fraud/identity check].\n */\nimport { SimplrElements, type CheckResult, type CheckInput } from \"../controller\";\nimport type { CollectedSignals } from \"@simplr-ai/js\";\n\nexport class SimplrProtectedFormElement extends HTMLElement {\n private form: HTMLFormElement | null = null;\n private onSubmit = (e: Event) => this.handleSubmit(e);\n\n connectedCallback(): void {\n // Locate a form: either a slotted child form or this element acting as one.\n this.form = this.querySelector(\"form\");\n const target: HTMLElement = this.form ?? this;\n target.addEventListener(\"submit\", this.onSubmit);\n }\n\n disconnectedCallback(): void {\n const target: HTMLElement = this.form ?? this;\n target.removeEventListener(\"submit\", this.onSubmit);\n }\n\n /** Field name used for the hidden signals input. */\n get fieldName(): string {\n return this.getAttribute(\"field-name\") || \"simplr_signals\";\n }\n\n private async handleSubmit(event: Event): Promise<void> {\n const allowNative = this.hasAttribute(\"native-submit\");\n if (!allowNative) event.preventDefault();\n\n this.setAttribute(\"submitting\", \"\");\n try {\n const signals: CollectedSignals = await SimplrElements.collect();\n\n let check: CheckResult | undefined;\n if (this.hasAttribute(\"auto-check\")) {\n const form = this.form ?? (event.target as HTMLFormElement);\n const input: CheckInput = {};\n const email = form?.querySelector?.<HTMLInputElement>('[type=\"email\"], [name=\"email\"]');\n if (email?.value) input.email = email.value;\n check = await SimplrElements.check(input);\n }\n\n // Inject a hidden field with the collected signals for plain HTML forms.\n if (this.form) {\n let hidden = this.form.querySelector<HTMLInputElement>(\n `input[name=\"${this.fieldName}\"]`,\n );\n if (!hidden) {\n hidden = document.createElement(\"input\");\n hidden.type = \"hidden\";\n hidden.name = this.fieldName;\n this.form.appendChild(hidden);\n }\n hidden.value = JSON.stringify({ signals, check });\n }\n\n this.dispatchEvent(\n new CustomEvent(\"simplr-submit\", {\n bubbles: true,\n composed: true,\n detail: { signals, check, event },\n }),\n );\n } catch (e) {\n this.dispatchEvent(\n new CustomEvent(\"simplr-error\", {\n bubbles: true,\n composed: true,\n detail: { error: e instanceof Error ? e : new Error(String(e)) },\n }),\n );\n } finally {\n this.removeAttribute(\"submitting\");\n }\n }\n}\n","/**\n * `<simplr-protected-input field=\"email\">` — attaches keystroke biometrics to a\n * slotted `<input>`/`<textarea>`. Works by wrapping the input: it wires the\n * core keystroke tracker's keydown/keyup/paste handlers to the inner control.\n *\n * Covers: [behavioral biometrics] (keystroke dynamics) [input validation helpers].\n */\nimport { SimplrElements } from \"../controller\";\n\nexport class SimplrProtectedInputElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\"field\"];\n }\n\n private input: HTMLInputElement | HTMLTextAreaElement | null = null;\n private handlers: ReturnType<typeof SimplrElements.trackInput> | null = null;\n private bound: { down?: EventListener; up?: EventListener; paste?: EventListener } = {};\n\n get field(): string {\n return this.getAttribute(\"field\") || \"input\";\n }\n\n connectedCallback(): void {\n // Defer one microtask so slotted children are present.\n queueMicrotask(() => this.attach());\n }\n\n disconnectedCallback(): void {\n this.detach();\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.detach();\n this.attach();\n }\n }\n\n private attach(): void {\n if (!SimplrElements.fraud) return;\n this.input =\n this.querySelector(\"input\") || this.querySelector(\"textarea\") || null;\n if (!this.input) return;\n\n this.handlers = SimplrElements.trackInput(this.field);\n this.input.setAttribute(\"data-simplr-field\", this.field);\n\n this.bound.down = (e) => this.handlers!.onKeyDown(e as KeyboardEvent);\n this.bound.up = (e) => this.handlers!.onKeyUp(e as KeyboardEvent);\n this.bound.paste = () => this.handlers!.onPaste();\n\n this.input.addEventListener(\"keydown\", this.bound.down);\n this.input.addEventListener(\"keyup\", this.bound.up);\n this.input.addEventListener(\"paste\", this.bound.paste);\n }\n\n private detach(): void {\n if (!this.input) return;\n if (this.bound.down) this.input.removeEventListener(\"keydown\", this.bound.down);\n if (this.bound.up) this.input.removeEventListener(\"keyup\", this.bound.up);\n if (this.bound.paste) this.input.removeEventListener(\"paste\", this.bound.paste);\n this.bound = {};\n this.input = null;\n }\n}\n","/**\n * `<simplr-feature-flag key=\"new-checkout\" user-id=\"u_1\">` — renders its slotted\n * content only when the flag is enabled (local eval via the core SimplrFlags).\n * Listens for `simplr:configured` and polls flag readiness so it reacts to flag\n * refreshes. Use a `<template slot=\"fallback\">` child for the disabled branch.\n *\n * Covers: [feature flags local eval].\n */\nimport { SimplrElements } from \"../controller\";\nimport type { EvalContext } from \"@simplr-ai/js\";\n\nexport class SimplrFeatureFlagElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\"key\", \"user-id\"];\n }\n\n private onConfigured = () => this.evaluate();\n private poll: ReturnType<typeof setInterval> | null = null;\n\n connectedCallback(): void {\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"simplr:configured\", this.onConfigured);\n }\n this.evaluate();\n // Re-evaluate periodically so async flag refreshes are reflected.\n this.poll = setInterval(() => this.evaluate(), 2000);\n }\n\n disconnectedCallback(): void {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"simplr:configured\", this.onConfigured);\n }\n if (this.poll) clearInterval(this.poll);\n this.poll = null;\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.evaluate();\n }\n\n /** The flag key. */\n get key(): string {\n return this.getAttribute(\"key\") || \"\";\n }\n\n /** Whether this flag currently evaluates to enabled. */\n get enabled(): boolean {\n if (!this.key) return false;\n const ctx: EvalContext = {};\n const userId = this.getAttribute(\"user-id\");\n if (userId) ctx.userId = userId;\n return SimplrElements.isFeatureEnabled(this.key, ctx);\n }\n\n private evaluate(): void {\n const on = this.enabled;\n // Reflect state for styling; default-hide via the [hidden] attribute.\n if (on) {\n this.removeAttribute(\"hidden\");\n this.setAttribute(\"enabled\", \"\");\n } else {\n this.setAttribute(\"hidden\", \"\");\n this.removeAttribute(\"enabled\");\n }\n this.dispatchEvent(\n new CustomEvent(\"simplr-flag\", {\n bubbles: true,\n composed: true,\n detail: { key: this.key, enabled: on },\n }),\n );\n }\n}\n","/**\n * `<simplr-rum-view name=\"Checkout\">` — fires `rum.trackView(name)` when it\n * connects (and again if `name` changes). RUM itself is initialized through the\n * provider (`app-id` attribute) or `configure({ rum })`.\n *\n * Covers: [RUM full] (view tracking entrypoint).\n */\nimport { SimplrElements } from \"../controller\";\n\nexport class SimplrRumViewElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\"name\"];\n }\n\n get viewName(): string {\n return this.getAttribute(\"name\") || (typeof location !== \"undefined\" ? location.pathname : \"/\");\n }\n\n connectedCallback(): void {\n this.track();\n }\n\n attributeChangedCallback(_n: string, oldV: string | null, newV: string | null): void {\n if (this.isConnected && oldV !== newV) this.track();\n }\n\n private track(): void {\n const rum = SimplrElements.rum;\n if (rum && rum.isInitialized()) {\n rum.trackView(this.viewName);\n this.dispatchEvent(\n new CustomEvent(\"simplr-view\", {\n bubbles: true,\n composed: true,\n detail: { name: this.viewName, viewId: rum.getViewId() },\n }),\n );\n }\n }\n}\n","/**\n * `<simplr-ai-delegation user-id=\"u_1\">` — a thin element around the AI\n * delegation flow. Renders a slotted trigger (default a button); on click it\n * calls `ai.createDelegation(...)` (or `ai.connect(...)` with `mode=\"connect\"`)\n * and emits the result via `simplr-delegation`.\n *\n * For full programmatic access (list/get/revoke/stats/validate/revokeAllForUser)\n * use `SimplrElements.ai` directly.\n *\n * Covers: [AI delegation].\n */\nimport { SimplrElements } from \"../controller\";\nimport type { BindingMode } from \"@simplr-ai/js\";\n\nexport class SimplrAiDelegationElement extends HTMLElement {\n private trigger: HTMLElement | null = null;\n private onClick = () => this.run();\n\n connectedCallback(): void {\n queueMicrotask(() => {\n this.trigger =\n this.querySelector(\"[slot=trigger]\") ||\n this.querySelector(\"button\") ||\n this;\n this.trigger.addEventListener(\"click\", this.onClick);\n });\n }\n\n disconnectedCallback(): void {\n this.trigger?.removeEventListener(\"click\", this.onClick);\n }\n\n get userId(): string {\n return this.getAttribute(\"user-id\") || \"\";\n }\n\n private async run(): Promise<void> {\n const ai = SimplrElements.ai;\n if (!ai) {\n this.dispatchEvent(\n new CustomEvent(\"simplr-error\", {\n bubbles: true,\n composed: true,\n detail: { error: new Error(\"AI delegation is not configured.\") },\n }),\n );\n return;\n }\n\n const binding = (this.getAttribute(\"binding\") as BindingMode) || undefined;\n const email = this.getAttribute(\"email\") || undefined;\n let fingerprintHash: string | undefined;\n try {\n if (SimplrElements.fraud) {\n fingerprintHash = (await SimplrElements.getDeviceSignals()).fingerprint;\n }\n } catch {\n // proceed without a fingerprint\n }\n\n try {\n const result =\n this.getAttribute(\"mode\") === \"connect\"\n ? await ai.connect({ userId: this.userId, email, binding, fingerprintHash })\n : await ai.createDelegation({ userId: this.userId, email, binding, fingerprintHash });\n this.dispatchEvent(\n new CustomEvent(\"simplr-delegation\", {\n bubbles: true,\n composed: true,\n detail: { result },\n }),\n );\n } catch (e) {\n this.dispatchEvent(\n new CustomEvent(\"simplr-error\", {\n bubbles: true,\n composed: true,\n detail: { error: e instanceof Error ? e : new Error(String(e)) },\n }),\n );\n }\n }\n}\n","/**\n * Element registration. SSR-safe: importing this module never touches\n * `customElements`. Call {@link defineSimplrElements} in a browser to register,\n * or import the global `<script>` bundle which auto-registers.\n */\nimport { SimplrProviderElement } from \"./elements/provider\";\nimport { SimplrProtectedFormElement } from \"./elements/protected-form\";\nimport { SimplrProtectedInputElement } from \"./elements/protected-input\";\nimport { SimplrFeatureFlagElement } from \"./elements/feature-flag\";\nimport { SimplrRumViewElement } from \"./elements/rum-view\";\nimport { SimplrAiDelegationElement } from \"./elements/ai-delegation\";\n\n/** Map of tag name → element constructor for every Simplr custom element. */\nexport const SIMPLR_ELEMENTS: Record<string, CustomElementConstructor> = {\n \"simplr-provider\": SimplrProviderElement,\n \"simplr-protected-form\": SimplrProtectedFormElement,\n \"simplr-protected-input\": SimplrProtectedInputElement,\n \"simplr-feature-flag\": SimplrFeatureFlagElement,\n \"simplr-rum-view\": SimplrRumViewElement,\n \"simplr-ai-delegation\": SimplrAiDelegationElement,\n};\n\n/**\n * Register all Simplr custom elements with the browser's CustomElementRegistry.\n * No-op (and safe) when there is no `customElements` (e.g. SSR / Node). Already\n * registered tags are skipped, so calling this twice is harmless.\n */\nexport function defineSimplrElements(): void {\n if (typeof customElements === \"undefined\") return;\n for (const [tag, ctor] of Object.entries(SIMPLR_ELEMENTS)) {\n if (!customElements.get(tag)) {\n customElements.define(tag, ctor);\n }\n }\n}\n","/**\n * Global / IIFE entry for `<script>` tag usage. Bundles the core `@simplr-ai/js`\n * inline (configured in tsup) and AUTO-REGISTERS every custom element on load,\n * so a plain HTML page works with zero build step:\n *\n * <script src=\"https://cdn.jsdelivr.net/npm/@simplr-ai/web-components/dist/simplr-web-components.global.js\"></script>\n * <simplr-provider api-key=\"pk_live_...\"></simplr-provider>\n *\n * Everything from the library is also exposed on `window.SimplrWebComponents`.\n */\nexport * from \"./index\";\nimport { defineSimplrElements } from \"./define\";\n\n// Auto-register when this bundle is loaded in a browser.\nif (typeof customElements !== \"undefined\") {\n defineSimplrElements();\n}\n"]}