@fingerprintiq/js 0.1.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":["../src/hash.ts","../src/signals/canvas.ts","../src/signals/webgl.ts","../src/signals/webgpu.ts","../src/signals/audio.ts","../src/signals/fonts.ts","../src/signals/webrtc.ts","../src/signals/wasm.ts","../src/signals/navigator.ts","../src/signals/media.ts","../src/signals/screen.ts","../src/signals/integrity.ts","../src/signals/wallets.ts","../src/signals/storage.ts","../src/signals/math.ts","../src/signals/domrect.ts","../src/signals/headless.ts","../src/signals/speech.ts","../src/signals/intl.ts","../src/signals/timezone.ts","../src/signals/cssStyle.ts","../src/signals/errors.ts","../src/signals/workerScope.ts","../src/signals/resistance.ts","../src/signals/svg.ts","../src/signals/windowFeatures.ts","../src/signals/htmlElement.ts","../src/signals/codecs.ts","../src/signals/status.ts","../src/signals/platformFeatures.ts","../src/signals/uaClientHints.ts","../src/signals/capabilityVector.ts","../src/signals/geometryVector.ts","../src/signals/runtimeVector.ts","../src/signals/sensorCapabilities.ts","../src/signals/behaviorTracker.ts","../src/signals/behavioralRisk.ts","../src/signals/incognito.ts","../src/signals/devTools.ts","../src/signals/virtualization.ts","../src/signals/rooted.ts","../src/collect.ts","../src/signals/wallet-connect.ts","../src/index.ts"],"sourcesContent":["export async function sha256(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function murmur3(input: string, seed: number = 0): number {\n let h = seed >>> 0;\n const len = input.length;\n for (let i = 0; i < len; i++) {\n let k = input.charCodeAt(i);\n k = Math.imul(k, 0xcc9e2d51);\n k = (k << 15) | (k >>> 17);\n k = Math.imul(k, 0x1b873593);\n h ^= k;\n h = (h << 13) | (h >>> 19);\n h = (Math.imul(h, 5) + 0xe6546b64) >>> 0;\n }\n h ^= len;\n h ^= h >>> 16;\n h = Math.imul(h, 0x85ebca6b);\n h ^= h >>> 13;\n h = Math.imul(h, 0xc2b2ae35);\n h ^= h >>> 16;\n return h >>> 0;\n}\n\nexport async function compositeHash(components: string[]): Promise<string> {\n const combined = components.sort().join(\"|\");\n return sha256(combined);\n}\n","import type { SignalResult, CanvasSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nfunction renderScene(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement): void {\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);\n gradient.addColorStop(0, \"#ff6b6b\");\n gradient.addColorStop(0.5, \"#4ecdc4\");\n gradient.addColorStop(1, \"#45b7d1\");\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n ctx.fillStyle = \"#1a1a2e\";\n ctx.font = \"18px Arial\";\n ctx.textBaseline = \"top\";\n ctx.fillText(\"FingerprintIQ \\u{1F9E0} Cwm fjord veg balks nth pyx quiz\", 2, 2);\n\n ctx.font = \"14px 'Times New Roman'\";\n ctx.fillText(\"\\u00E9\\u00E8\\u00EA\\u00EB \\u00FC\\u00F9 \\u00E7\\u00E0 \\u4E16\\u754C \\u0410\\u0411\\u0412\", 4, 28);\n\n ctx.beginPath();\n ctx.arc(80, 80, 30, 0, Math.PI * 2);\n ctx.fillStyle = \"rgba(255, 107, 107, 0.7)\";\n ctx.fill();\n ctx.closePath();\n\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = \"rgba(78, 205, 196, 0.5)\";\n ctx.fillRect(50, 50, 100, 60);\n ctx.globalCompositeOperation = \"source-over\";\n\n ctx.font = \"12px sans-serif\";\n ctx.fillStyle = \"#000\";\n ctx.fillText(\"\\u{1F600}\\u{1F680}\\u{1F308}\\u{1F3B5}\", 180, 80);\n}\n\n/**\n * Detect if the browser adds noise to canvas output.\n * Safari 17+ and Firefox 120+ inject noise that produces garbage data.\n * Skip canvas collection for these browsers to avoid unstable fingerprints.\n */\nfunction shouldSkipCanvas(): boolean {\n try {\n const ua = navigator.userAgent;\n // Safari 17+ adds canvas noise\n const safariMatch = ua.match(/Version\\/(\\d+)\\.\\d+.*Safari/);\n if (safariMatch && parseInt(safariMatch[1]!, 10) >= 17) return true;\n // Firefox 120+ with fingerprinting protection\n const firefoxMatch = ua.match(/Firefox\\/(\\d+)/);\n if (firefoxMatch && parseInt(firefoxMatch[1]!, 10) >= 120) return true;\n } catch { /* ignore */ }\n return false;\n}\n\nexport async function collectCanvas(): Promise<SignalResult<CanvasSignal> | null> {\n const start = performance.now();\n try {\n if (shouldSkipCanvas()) return null;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = 300;\n canvas.height = 150;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n const renders: string[] = [];\n for (let i = 0; i < 3; i++) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n renderScene(ctx, canvas);\n renders.push(canvas.toDataURL(\"image/png\"));\n }\n\n const isFarbled = renders.some((r) => r !== renders[0]);\n const hash = await sha256(renders[0]!);\n\n return {\n value: { hash, isFarbled },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, WebGLSignal } from \"../types\";\n\nconst SOFTWARE_RENDERERS = [\"swiftshader\", \"llvmpipe\", \"softpipe\", \"mesa\"];\nconst GL_PARAMS = [0x0d33, 0x8869, 0x8dfb, 0x8dfc, 0x8dfd] as const;\n\nfunction measureGpuTiming(gl: WebGLRenderingContext): number | null {\n try {\n const vs = gl.createShader(gl.VERTEX_SHADER);\n const fs = gl.createShader(gl.FRAGMENT_SHADER);\n if (!vs || !fs) return null;\n\n gl.shaderSource(vs, \"void main(){gl_Position=vec4(0,0,0,1);}\");\n gl.compileShader(vs);\n if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS)) { gl.deleteShader(vs); gl.deleteShader(fs); return null; }\n\n gl.shaderSource(fs, \"precision mediump float;void main(){float v=0.0;for(int i=0;i<1000;i++){v+=sin(float(i)*0.01);}gl_FragColor=vec4(v,0,0,1);}\");\n gl.compileShader(fs);\n if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS)) { gl.deleteShader(vs); gl.deleteShader(fs); return null; }\n\n const program = gl.createProgram();\n if (!program) { gl.deleteShader(vs); gl.deleteShader(fs); return null; }\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { gl.deleteProgram(program); gl.deleteShader(vs); gl.deleteShader(fs); return null; }\n\n gl.useProgram(program);\n const start = performance.now();\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n gl.finish();\n const elapsed = performance.now() - start;\n gl.deleteProgram(program); gl.deleteShader(vs); gl.deleteShader(fs);\n return elapsed;\n } catch { return null; }\n}\n\nexport async function collectWebGL(): Promise<SignalResult<WebGLSignal> | null> {\n const start = performance.now();\n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl\") as WebGLRenderingContext | null;\n if (!gl) return null;\n\n const dbgExt = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const renderer = dbgExt ? (gl.getParameter(dbgExt.UNMASKED_RENDERER_WEBGL) as string) : \"unknown\";\n const vendor = dbgExt ? (gl.getParameter(dbgExt.UNMASKED_VENDOR_WEBGL) as string) : \"unknown\";\n const extensions = gl.getSupportedExtensions() ?? [];\n\n const params: Record<string, number> = {};\n for (const p of GL_PARAMS) {\n const val = gl.getParameter(p);\n if (typeof val === \"number\") params[`0x${p.toString(16)}`] = val;\n }\n\n const isSoftwareRenderer = SOFTWARE_RENDERERS.some((sr) => renderer.toLowerCase().includes(sr));\n const gpuTimingMs = measureGpuTiming(gl);\n\n return {\n value: { renderer, vendor, extensions, params, gpuTimingMs, isSoftwareRenderer },\n duration: performance.now() - start,\n };\n } catch { return null; }\n}\n","import type { SignalResult, WebGPUSignal } from \"../types\";\n\nconst EMPTY_SIGNAL: WebGPUSignal = {\n available: false, vendor: \"\", architecture: \"\", device: \"\", description: \"\", features: [],\n};\n\nexport async function collectWebGPU(): Promise<SignalResult<WebGPUSignal>> {\n const start = performance.now();\n try {\n if (!(navigator as unknown as Record<string, unknown>).gpu) return { value: EMPTY_SIGNAL, duration: performance.now() - start };\n\n const gpu = (navigator as unknown as Record<string, unknown>).gpu as { requestAdapter: () => Promise<{ info: { vendor: string; architecture: string; device: string; description: string }; features: Set<string> } | null> };\n const adapter = await gpu.requestAdapter();\n if (!adapter) return { value: EMPTY_SIGNAL, duration: performance.now() - start };\n\n const info = adapter.info;\n const features = Array.from(adapter.features) as string[];\n\n return {\n value: {\n available: true,\n vendor: info.vendor,\n architecture: info.architecture,\n device: info.device,\n description: info.description,\n features,\n },\n duration: performance.now() - start,\n };\n } catch {\n return { value: EMPTY_SIGNAL, duration: performance.now() - start };\n }\n}\n","import type { SignalResult, AudioSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nfunction getOfflineAudioContext(): (new (channels: number, length: number, sampleRate: number) => OfflineAudioContext) | null {\n if (typeof OfflineAudioContext !== \"undefined\") return OfflineAudioContext;\n if (typeof (globalThis as Record<string, unknown>).webkitOfflineAudioContext !== \"undefined\") {\n return (globalThis as Record<string, unknown>).webkitOfflineAudioContext as typeof OfflineAudioContext;\n }\n return null;\n}\n\nexport async function collectAudio(): Promise<SignalResult<AudioSignal> | null> {\n const start = performance.now();\n try {\n const AudioCtxClass = getOfflineAudioContext();\n if (!AudioCtxClass) return null;\n\n const ctx = new AudioCtxClass(1, 4500, 44100);\n const oscillator = ctx.createOscillator();\n oscillator.type = \"triangle\";\n oscillator.frequency.value = 10000;\n\n const compressor = ctx.createDynamicsCompressor();\n compressor.threshold.value = -50;\n compressor.knee.value = 40;\n compressor.ratio.value = 12;\n compressor.attack.value = 0;\n compressor.release.value = 0.25;\n\n oscillator.connect(compressor);\n compressor.connect(ctx.destination);\n oscillator.start(0);\n\n const renderedBuffer = await ctx.startRendering();\n const channelData = renderedBuffer.getChannelData(0);\n\n const hashInput = Array.from(channelData.slice(0, 100)).map((v) => v.toFixed(6)).join(\",\");\n const hash = await sha256(hashInput);\n\n const sampleRate = ctx.sampleRate;\n const maxChannelCount = ctx.destination.maxChannelCount;\n const isSuspended = ctx.state === \"suspended\";\n\n oscillator.stop();\n oscillator.disconnect();\n compressor.disconnect();\n try { await (ctx as unknown as { close: () => Promise<void> }).close(); } catch { /* some browsers don't support closing offline context */ }\n\n return { value: { hash, sampleRate, maxChannelCount, isSuspended }, duration: performance.now() - start };\n } catch { return null; }\n}\n","import type { SignalResult, FontSignal } from \"../types\";\n\nconst TEST_FONTS = [\n \"Arial\", \"Arial Black\", \"Calibri\", \"Cambria\", \"Comic Sans MS\", \"Consolas\",\n \"Courier New\", \"Georgia\", \"Helvetica\", \"Helvetica Neue\", \"Impact\",\n \"Lucida Console\", \"Lucida Sans Unicode\", \"Microsoft Sans Serif\",\n \"Palatino Linotype\", \"Segoe UI\", \"Tahoma\", \"Times New Roman\", \"Trebuchet MS\",\n \"Verdana\", \"Monaco\", \"Menlo\", \"SF Pro\", \"SF Mono\", \"Roboto\", \"Noto Sans\",\n \"Ubuntu\", \"Cantarell\", \"DejaVu Sans\", \"Liberation Sans\", \"Fira Code\",\n \"Source Code Pro\", \"Droid Sans\", \"Open Sans\", \"Lato\", \"Montserrat\",\n \"Gill Sans\", \"Futura\", \"Optima\", \"Baskerville\", \"Garamond\",\n \"Century Gothic\", \"Franklin Gothic Medium\", \"Rockwell\", \"Copperplate\",\n \"Papyrus\", \"Brush Script MT\",\n \"SimHei\", \"SimSun\", \"MS Gothic\", \"MS Mincho\", \"Malgun Gothic\",\n \"Yu Gothic\", \"Meiryo\", \"Apple SD Gothic Neo\", \"Nanum Gothic\",\n \"Arabic Typesetting\", \"Nirmala UI\", \"Mangal\",\n];\n\nconst BASE_FONTS = [\"monospace\", \"sans-serif\", \"serif\"] as const;\nconst TEST_STRING = \"mmmmmmmmmmlli1WWWWW\";\nconst TEST_SIZE = \"72px\";\n\nfunction measureWidth(fontFamily: string): number {\n const span = document.createElement(\"span\");\n span.style.position = \"absolute\";\n span.style.left = \"-9999px\";\n span.style.fontSize = TEST_SIZE;\n span.style.fontFamily = fontFamily;\n span.style.letterSpacing = \"normal\";\n span.textContent = TEST_STRING;\n document.body.appendChild(span);\n const width = span.getBoundingClientRect().width;\n span.remove();\n return width;\n}\n\nexport async function collectFonts(): Promise<SignalResult<FontSignal> | null> {\n const start = performance.now();\n try {\n const baseWidths = BASE_FONTS.map((f) => measureWidth(f));\n const detected: string[] = [];\n\n for (const font of TEST_FONTS) {\n for (let i = 0; i < BASE_FONTS.length; i++) {\n const testWidth = measureWidth(`'${font}', ${BASE_FONTS[i]}`);\n if (testWidth !== baseWidths[i]) {\n detected.push(font);\n break;\n }\n }\n }\n\n const allSameWidth = detected.length === 0 && TEST_FONTS.length > 10;\n const allDetected = detected.length === TEST_FONTS.length;\n const isSpoofed = allSameWidth || allDetected;\n\n return { value: { detected, count: detected.length, isSpoofed }, duration: performance.now() - start };\n } catch { return null; }\n}\n","import type { SignalResult, WebRTCSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nconst LOCAL_IP_REGEX = /(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})/;\nconst PRIVATE_IP_REGEX = /^(192\\.168\\.|10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.)/;\nconst CANDIDATE_TYPE_REGEX = /typ\\s+(\\w+)/;\n\nexport async function collectWebRTC(): Promise<SignalResult<WebRTCSignal> | null> {\n const start = performance.now();\n try {\n if (typeof RTCPeerConnection === \"undefined\") return null;\n\n const pc = new RTCPeerConnection({ iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }] });\n pc.createDataChannel(\"\");\n\n const candidates: string[] = [];\n const localIps: string[] = [];\n const candidateTypes: Set<string> = new Set();\n\n const gatheringComplete = new Promise<void>((resolve) => {\n const timeout = setTimeout(() => resolve(), 3000);\n pc.onicecandidate = (event) => {\n if (!event.candidate) { clearTimeout(timeout); resolve(); return; }\n const candidateStr = event.candidate.candidate;\n candidates.push(candidateStr);\n const typeMatch = candidateStr.match(CANDIDATE_TYPE_REGEX);\n if (typeMatch?.[1]) candidateTypes.add(typeMatch[1]);\n const ipMatch = candidateStr.match(LOCAL_IP_REGEX);\n if (ipMatch?.[1] && PRIVATE_IP_REGEX.test(ipMatch[1])) localIps.push(ipMatch[1]);\n };\n });\n\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n await gatheringComplete;\n pc.close();\n\n let localIpHash: string | null = null;\n if (localIps.length > 0) {\n const prefix = localIps[0]!.split(\".\").slice(0, 3).join(\".\");\n localIpHash = await sha256(prefix);\n }\n\n return {\n value: { localIpHash, candidateCount: candidates.length, candidateTypes: Array.from(candidateTypes), multipleNics: localIps.length > 1 },\n duration: performance.now() - start,\n };\n } catch { return null; }\n}\n","import type { SignalResult, WasmTimingSignal } from \"../types\";\n\nconst ITERATIONS = 10;\n\nfunction median(values: number[]): number {\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 !== 0 ? sorted[mid]! : (sorted[mid - 1]! + sorted[mid]!) / 2;\n}\n\nfunction stddev(values: number[], mean: number): number {\n const variance = values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;\n return Math.sqrt(variance);\n}\n\n/**\n * Build a minimal WASM module programmatically that runs a compute loop.\n * The module exports a function \"bench\" that computes sum of i*i for i in [0, 100000).\n */\nfunction buildWasmModule(): Uint8Array {\n return new Uint8Array([\n 0x00, 0x61, 0x73, 0x6d, // magic: \\0asm\n 0x01, 0x00, 0x00, 0x00, // version: 1\n // Type section (id=1): one function type () -> (i32)\n 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f,\n // Function section (id=3): one function using type index 0\n 0x03, 0x02, 0x01, 0x00,\n // Export section (id=7): export \"bench\" as function 0\n 0x07, 0x09, 0x01, 0x05, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x00, 0x00,\n // Code section (id=10): one function body\n 0x0a, 0x23, 0x01, // section id, section size=35, count=1\n 0x21, // body size=33\n // Locals: 1 group of 2 x i32\n 0x01, 0x02, 0x7f,\n // loop\n 0x03, 0x40,\n // sum = sum + i*i\n 0x20, 0x01, // local.get 1 (sum)\n 0x20, 0x00, // local.get 0 (i)\n 0x20, 0x00, // local.get 0 (i)\n 0x6c, // i32.mul\n 0x6a, // i32.add\n 0x21, 0x01, // local.set 1\n // i = i + 1; if i < 100000 branch back\n 0x20, 0x00, // local.get 0 (i)\n 0x41, 0x01, // i32.const 1\n 0x6a, // i32.add\n 0x22, 0x00, // local.tee 0\n 0x41, 0xa0, 0x8d, 0x06, // i32.const 100000 (LEB128)\n 0x49, // i32.lt_u\n 0x0d, 0x00, // br_if 0\n 0x0b, // end loop\n 0x20, 0x01, // local.get 1 (return sum)\n 0x0b, // end function\n ]);\n}\n\nexport async function collectWasmTiming(): Promise<SignalResult<WasmTimingSignal> | null> {\n const start = performance.now();\n try {\n if (typeof WebAssembly === \"undefined\") return null;\n\n const wasmBytes = buildWasmModule();\n const module = await WebAssembly.compile(wasmBytes.buffer as ArrayBuffer);\n const instance = await WebAssembly.instantiate(module);\n const bench = instance.exports[\"bench\"] as () => number;\n\n const timings: number[] = [];\n for (let i = 0; i < ITERATIONS; i++) {\n const t0 = performance.now();\n bench();\n timings.push(performance.now() - t0);\n }\n\n const med = median(timings);\n const sd = stddev(timings, med);\n\n return { value: { medianMs: med, stddevMs: sd }, duration: performance.now() - start };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, NavigatorSignal } from \"../types\";\n\nexport async function collectNavigator(): Promise<SignalResult<NavigatorSignal> | null> {\n const start = performance.now();\n try {\n if (typeof navigator === \"undefined\") return null;\n\n const nav = navigator as Navigator & Record<string, unknown>;\n\n let hardwareConcurrency = 0;\n try { hardwareConcurrency = nav.hardwareConcurrency ?? 0; } catch { /* ignore */ }\n\n let deviceMemory: number | null = null;\n try { deviceMemory = (nav as Record<string, unknown>).deviceMemory as number ?? null; } catch { /* ignore */ }\n\n let maxTouchPoints = 0;\n try { maxTouchPoints = nav.maxTouchPoints ?? 0; } catch { /* ignore */ }\n\n let languages: string[] = [];\n try { languages = Array.from(nav.languages ?? []); } catch { /* ignore */ }\n\n let platform = \"\";\n try { platform = nav.platform ?? \"\"; } catch { /* ignore */ }\n\n let cookieEnabled = false;\n try { cookieEnabled = nav.cookieEnabled ?? false; } catch { /* ignore */ }\n\n let doNotTrack: string | null = null;\n try { doNotTrack = nav.doNotTrack ?? null; } catch { /* ignore */ }\n\n let keyboardLayout: string | null = null;\n try {\n const keyboard = (nav as Record<string, unknown>).keyboard as { getLayoutMap?: () => Promise<Map<string, string>> } | undefined;\n if (keyboard?.getLayoutMap) {\n const layoutMap = await keyboard.getLayoutMap();\n keyboardLayout = layoutMap instanceof Map ? layoutMap.get(\"KeyA\") ?? null : null;\n }\n } catch { /* ignore */ }\n\n let connectionType: string | null = null;\n try {\n const connection = (nav as Record<string, unknown>).connection as Record<string, unknown> | undefined;\n connectionType = connection?.effectiveType as string ?? null;\n } catch { /* ignore */ }\n\n const hasBluetooth = \"bluetooth\" in nav;\n const hasUsb = \"usb\" in nav;\n const hasHid = \"hid\" in nav;\n const hasSerial = \"serial\" in nav;\n const hasWakeLock = \"wakeLock\" in nav;\n const hasGpu = \"gpu\" in nav;\n\n let bluetoothAvailable: boolean | null = null;\n try {\n const bluetooth = (nav as Record<string, unknown>).bluetooth as { getAvailability?: () => Promise<boolean> } | undefined;\n if (bluetooth?.getAvailability) {\n bluetoothAvailable = await bluetooth.getAvailability();\n }\n } catch { /* ignore */ }\n\n return {\n value: {\n hardwareConcurrency,\n deviceMemory,\n maxTouchPoints,\n languages,\n platform,\n cookieEnabled,\n doNotTrack,\n keyboardLayout,\n connectionType,\n hasBluetooth,\n hasUsb,\n hasHid,\n hasSerial,\n hasWakeLock,\n hasGpu,\n bluetoothAvailable,\n },\n duration: performance.now() - start,\n };\n } catch { return null; }\n}\n","import type { SignalResult, MediaSignal } from \"../types\";\n\nfunction query(mq: string): boolean {\n try {\n return typeof matchMedia !== \"undefined\" && matchMedia(mq).matches;\n } catch { return false; }\n}\n\nfunction firstMatch(queries: Array<[string, string]>): string {\n for (const [mq, value] of queries) {\n if (query(mq)) return value;\n }\n return queries[queries.length - 1]?.[1] ?? \"\";\n}\n\nexport async function collectMedia(): Promise<SignalResult<MediaSignal>> {\n const start = performance.now();\n\n const colorScheme = firstMatch([\n [\"(prefers-color-scheme: dark)\", \"dark\"],\n [\"(prefers-color-scheme: light)\", \"light\"],\n [\"(prefers-color-scheme: no-preference)\", \"no-preference\"],\n ]);\n\n const contrast = firstMatch([\n [\"(prefers-contrast: more)\", \"more\"],\n [\"(prefers-contrast: less)\", \"less\"],\n [\"(prefers-contrast: no-preference)\", \"no-preference\"],\n ]);\n\n const forcedColors = query(\"(forced-colors: active)\");\n\n const pointer = firstMatch([\n [\"(pointer: fine)\", \"fine\"],\n [\"(pointer: coarse)\", \"coarse\"],\n [\"(pointer: none)\", \"none\"],\n ]);\n\n const hover = firstMatch([\n [\"(hover: hover)\", \"hover\"],\n [\"(hover: none)\", \"none\"],\n ]);\n\n const displayMode = firstMatch([\n [\"(display-mode: fullscreen)\", \"fullscreen\"],\n [\"(display-mode: standalone)\", \"standalone\"],\n [\"(display-mode: minimal-ui)\", \"minimal-ui\"],\n [\"(display-mode: browser)\", \"browser\"],\n ]);\n\n const reducedMotion = query(\"(prefers-reduced-motion: reduce)\");\n\n const colorGamut = firstMatch([\n [\"(color-gamut: rec2020)\", \"rec2020\"],\n [\"(color-gamut: p3)\", \"p3\"],\n [\"(color-gamut: srgb)\", \"srgb\"],\n ]);\n\n return {\n value: {\n colorScheme,\n contrast,\n forcedColors,\n pointer,\n hover,\n displayMode,\n reducedMotion,\n colorGamut,\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult, ScreenSignal } from \"../types\";\n\nconst FIREFOX_RFP_WIDTHS = [1000, 1400, 1600];\n\nexport async function collectScreen(): Promise<SignalResult<ScreenSignal>> {\n const start = performance.now();\n\n const width = screen.width ?? 0;\n const height = screen.height ?? 0;\n const availWidth = screen.availWidth ?? 0;\n const availHeight = screen.availHeight ?? 0;\n const colorDepth = screen.colorDepth ?? 0;\n const pixelRatio = window.devicePixelRatio ?? 1;\n\n const isFirefoxRfp =\n FIREFOX_RFP_WIDTHS.includes(width) &&\n width === height &&\n pixelRatio === 1;\n\n return {\n value: {\n width,\n height,\n availWidth,\n availHeight,\n colorDepth,\n pixelRatio,\n isFirefoxRfp,\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface IntegritySignal {\n tamperedApis: string[];\n workerMismatch: boolean;\n lieScore: number;\n}\n\nconst NATIVE_CODE_REGEX = /\\[native code\\]/;\n\nfunction isNative(fn: unknown): boolean {\n if (typeof fn !== \"function\") return false;\n try {\n return NATIVE_CODE_REGEX.test(Function.prototype.toString.call(fn));\n } catch { return false; }\n}\n\nfunction checkPropertyDescriptors(fn: unknown): boolean {\n if (typeof fn !== \"function\") return true;\n try {\n const keys = Object.getOwnPropertyNames(fn);\n // Native functions typically only have 'length', 'name', and 'prototype' (for constructors)\n const unexpected = keys.filter((k) => ![\"length\", \"name\", \"prototype\", \"arguments\", \"caller\"].includes(k));\n return unexpected.length === 0;\n } catch { return true; }\n}\n\nfunction checkPrototypeChain(fn: unknown, expectedProto: unknown): boolean {\n if (typeof fn !== \"function\") return true;\n try {\n const proto = Object.getPrototypeOf(fn);\n return proto === expectedProto;\n } catch { return true; }\n}\n\ninterface ApiCheck {\n name: string;\n get: () => unknown;\n expectedProto?: unknown;\n}\n\nfunction getApiChecks(): ApiCheck[] {\n const checks: ApiCheck[] = [];\n const fnProto = Function.prototype;\n\n if (typeof HTMLCanvasElement !== \"undefined\") {\n checks.push({ name: \"HTMLCanvasElement.toDataURL\", get: () => HTMLCanvasElement.prototype.toDataURL, expectedProto: fnProto });\n checks.push({ name: \"HTMLCanvasElement.getContext\", get: () => HTMLCanvasElement.prototype.getContext, expectedProto: fnProto });\n }\n if (typeof CanvasRenderingContext2D !== \"undefined\") {\n checks.push({ name: \"CanvasRenderingContext2D.getImageData\", get: () => CanvasRenderingContext2D.prototype.getImageData, expectedProto: fnProto });\n checks.push({ name: \"CanvasRenderingContext2D.measureText\", get: () => CanvasRenderingContext2D.prototype.measureText, expectedProto: fnProto });\n }\n if (typeof WebGLRenderingContext !== \"undefined\") {\n checks.push({ name: \"WebGLRenderingContext.getParameter\", get: () => WebGLRenderingContext.prototype.getParameter, expectedProto: fnProto });\n checks.push({ name: \"WebGLRenderingContext.getExtension\", get: () => WebGLRenderingContext.prototype.getExtension, expectedProto: fnProto });\n }\n\n checks.push({ name: \"Date.getTimezoneOffset\", get: () => Date.prototype.getTimezoneOffset, expectedProto: fnProto });\n checks.push({ name: \"Intl.DateTimeFormat.resolvedOptions\", get: () => Intl.DateTimeFormat.prototype.resolvedOptions, expectedProto: fnProto });\n checks.push({ name: \"Element.getBoundingClientRect\", get: () => typeof Element !== \"undefined\" ? Element.prototype.getBoundingClientRect : undefined, expectedProto: fnProto });\n\n // Check navigator property getters\n try {\n const hwDesc = Object.getOwnPropertyDescriptor(Navigator.prototype, \"hardwareConcurrency\");\n if (hwDesc?.get) checks.push({ name: \"navigator.hardwareConcurrency.get\", get: () => hwDesc.get, expectedProto: fnProto });\n } catch { /* skip */ }\n\n try {\n const langDesc = Object.getOwnPropertyDescriptor(Navigator.prototype, \"languages\");\n if (langDesc?.get) checks.push({ name: \"navigator.languages.get\", get: () => langDesc.get, expectedProto: fnProto });\n } catch { /* skip */ }\n\n try {\n const uaDesc = Object.getOwnPropertyDescriptor(Navigator.prototype, \"userAgent\");\n if (uaDesc?.get) checks.push({ name: \"navigator.userAgent.get\", get: () => uaDesc.get, expectedProto: fnProto });\n } catch { /* skip */ }\n\n return checks;\n}\n\nexport async function collectIntegrity(): Promise<SignalResult<IntegritySignal>> {\n const start = performance.now();\n const tamperedApis: string[] = [];\n let lieScore = 0;\n\n const checks = getApiChecks();\n\n for (const check of checks) {\n try {\n const fn = check.get();\n if (fn === undefined) continue;\n\n // Test 1: toString native code check\n if (!isNative(fn)) {\n tamperedApis.push(check.name);\n lieScore += 1;\n continue;\n }\n\n // Test 2: Property descriptor check\n if (!checkPropertyDescriptors(fn)) {\n tamperedApis.push(`${check.name}:props`);\n lieScore += 0.5;\n }\n\n // Test 3: Prototype chain check\n if (check.expectedProto && !checkPrototypeChain(fn, check.expectedProto)) {\n tamperedApis.push(`${check.name}:proto`);\n lieScore += 0.5;\n }\n } catch {\n tamperedApis.push(check.name);\n lieScore += 1;\n }\n }\n\n // Test 4: Check if Function.prototype.toString itself is tampered\n try {\n const toStringStr = Function.prototype.toString.call(Function.prototype.toString);\n if (!NATIVE_CODE_REGEX.test(toStringStr)) {\n tamperedApis.push(\"Function.prototype.toString\");\n lieScore += 2; // This is a strong signal — it means ALL toString checks are unreliable\n }\n } catch {\n tamperedApis.push(\"Function.prototype.toString\");\n lieScore += 2;\n }\n\n return {\n value: {\n tamperedApis,\n workerMismatch: false, // Updated by collect.ts after worker comparison\n lieScore: Math.min(lieScore, 10),\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult, WalletSignal } from \"../types\";\n\ninterface EIP6963ProviderInfo {\n rdns: string;\n name: string;\n icon?: string;\n}\n\ninterface EIP6963AnnounceProviderEvent extends Event {\n detail: {\n info: EIP6963ProviderInfo;\n provider: unknown;\n };\n}\n\nfunction classifyWallet(name: string): \"evm\" | \"solana\" | \"both\" {\n const lower = name.toLowerCase();\n if (lower.includes(\"phantom\") || lower.includes(\"solflare\") || lower.includes(\"backpack\") || lower.includes(\"solana\")) {\n return \"solana\";\n }\n if (lower.includes(\"keplr\")) {\n return \"evm\"; // Keplr is cosmos but treat as non-solana\n }\n return \"evm\";\n}\n\nasync function discoverEIP6963Providers(): Promise<string[]> {\n if (typeof window === \"undefined\" || typeof window.dispatchEvent === \"undefined\") {\n return [];\n }\n\n return new Promise<string[]>((resolve) => {\n const discovered: string[] = [];\n\n const handler = (event: Event) => {\n const e = event as EIP6963AnnounceProviderEvent;\n if (e.detail?.info?.name) {\n discovered.push(e.detail.info.name);\n }\n };\n\n window.addEventListener(\"eip6963:announceProvider\", handler);\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n\n setTimeout(() => {\n window.removeEventListener(\"eip6963:announceProvider\", handler);\n resolve(discovered);\n }, 50);\n });\n}\n\nasync function tryGetMetaMaskVersion(ethereum: Record<string, unknown>): Promise<string | null> {\n try {\n if (typeof ethereum.request === \"function\") {\n const version = await (ethereum.request as (args: { method: string }) => Promise<string>)({\n method: \"web3_clientVersion\",\n });\n if (typeof version === \"string\") return version;\n }\n } catch {\n // ignore errors\n }\n return null;\n}\n\nexport async function collectWallets(): Promise<SignalResult<WalletSignal>> {\n const start = performance.now();\n\n const detected: string[] = [];\n const evmProviders: string[] = [];\n const solanaProviders: string[] = [];\n const versions: Record<string, string> = {};\n\n try {\n // Step 1: EIP-6963 provider discovery\n const eip6963Names = await discoverEIP6963Providers();\n for (const name of eip6963Names) {\n if (!detected.includes(name)) {\n detected.push(name);\n const type = classifyWallet(name);\n if (type === \"solana\") {\n if (!solanaProviders.includes(name)) solanaProviders.push(name);\n } else {\n if (!evmProviders.includes(name)) evmProviders.push(name);\n }\n }\n }\n\n // Step 2: Legacy window object detection\n const g = globalThis as Record<string, unknown>;\n\n // window.ethereum\n const ethereum = g[\"ethereum\"] as Record<string, unknown> | undefined;\n if (ethereum && typeof ethereum === \"object\") {\n if (ethereum[\"isMetaMask\"] && !detected.includes(\"MetaMask\")) {\n detected.push(\"MetaMask\");\n evmProviders.push(\"MetaMask\");\n const version = await tryGetMetaMaskVersion(ethereum);\n if (version) versions[\"MetaMask\"] = version;\n }\n if (ethereum[\"isCoinbaseWallet\"] && !detected.includes(\"Coinbase Wallet\")) {\n detected.push(\"Coinbase Wallet\");\n evmProviders.push(\"Coinbase Wallet\");\n }\n if (ethereum[\"isRainbow\"] && !detected.includes(\"Rainbow\")) {\n detected.push(\"Rainbow\");\n evmProviders.push(\"Rainbow\");\n }\n if (ethereum[\"isBraveWallet\"] && !detected.includes(\"Brave Wallet\")) {\n detected.push(\"Brave Wallet\");\n evmProviders.push(\"Brave Wallet\");\n }\n }\n\n // window.coinbaseWalletExtension\n if (g[\"coinbaseWalletExtension\"] && !detected.includes(\"Coinbase Wallet\")) {\n detected.push(\"Coinbase Wallet\");\n evmProviders.push(\"Coinbase Wallet\");\n }\n\n // window.okxwallet\n if (g[\"okxwallet\"] && !detected.includes(\"OKX Wallet\")) {\n detected.push(\"OKX Wallet\");\n evmProviders.push(\"OKX Wallet\");\n }\n\n // window.xfi (XDEFI)\n if (g[\"xfi\"] && !detected.includes(\"XDEFI\")) {\n detected.push(\"XDEFI\");\n evmProviders.push(\"XDEFI\");\n }\n\n // window.solana\n const solana = g[\"solana\"] as Record<string, unknown> | undefined;\n if (solana && typeof solana === \"object\") {\n if (solana[\"isPhantom\"] && !detected.includes(\"Phantom\")) {\n detected.push(\"Phantom\");\n solanaProviders.push(\"Phantom\");\n }\n if (solana[\"isSolflare\"] && !detected.includes(\"Solflare\")) {\n detected.push(\"Solflare\");\n solanaProviders.push(\"Solflare\");\n }\n if (solana[\"isBackpack\"] && !detected.includes(\"Backpack\")) {\n detected.push(\"Backpack\");\n solanaProviders.push(\"Backpack\");\n }\n }\n\n // window.phantom.solana\n const phantom = g[\"phantom\"] as Record<string, unknown> | undefined;\n if (phantom && typeof phantom === \"object\") {\n const phantomSolana = phantom[\"solana\"] as Record<string, unknown> | undefined;\n if (phantomSolana && typeof phantomSolana === \"object\" && !detected.includes(\"Phantom\")) {\n detected.push(\"Phantom\");\n solanaProviders.push(\"Phantom\");\n }\n }\n\n // window.keplr\n if (g[\"keplr\"] && !detected.includes(\"Keplr\")) {\n detected.push(\"Keplr\");\n evmProviders.push(\"Keplr\");\n }\n\n // window.unisat\n if (g[\"unisat\"] && !detected.includes(\"UniSat\")) {\n detected.push(\"UniSat\");\n evmProviders.push(\"UniSat\");\n }\n } catch {\n // always succeed\n }\n\n return {\n value: {\n detected,\n count: detected.length,\n evmProviders,\n solanaProviders,\n multipleWallets: detected.length > 1,\n versions,\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult, StorageSignal } from \"../types\";\n\nconst FIQ_VID_KEY = \"fiq_vid\";\nconst TEST_KEY = \"__fiq_test__\";\n\nfunction testStorage(storage: Storage): boolean {\n try {\n storage.setItem(TEST_KEY, \"1\");\n storage.removeItem(TEST_KEY);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction testCookies(): boolean {\n try {\n const testValue = \"__fiq_cookie_test__=1\";\n document.cookie = testValue + \"; SameSite=Strict\";\n const found = document.cookie.indexOf(\"__fiq_cookie_test__\") !== -1;\n // Clean up\n document.cookie = \"__fiq_cookie_test__=; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict\";\n return found;\n } catch {\n return false;\n }\n}\n\nfunction testIndexedDB(): Promise<boolean> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => resolve(false), 1000);\n try {\n if (typeof indexedDB === \"undefined\" || !indexedDB) {\n clearTimeout(timeout);\n resolve(false);\n return;\n }\n const req = indexedDB.open(\"__fiq_test__\", 1);\n req.onsuccess = () => {\n clearTimeout(timeout);\n req.result.close();\n indexedDB.deleteDatabase(\"__fiq_test__\");\n resolve(true);\n };\n req.onerror = () => {\n clearTimeout(timeout);\n resolve(false);\n };\n } catch {\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\nfunction getSurvivingMechanisms(): string[] {\n const surviving: string[] = [];\n try {\n if (typeof localStorage !== \"undefined\" && localStorage.getItem(FIQ_VID_KEY) !== null) {\n surviving.push(\"localStorage\");\n }\n } catch { /* ignore */ }\n try {\n if (typeof sessionStorage !== \"undefined\" && sessionStorage.getItem(FIQ_VID_KEY) !== null) {\n surviving.push(\"sessionStorage\");\n }\n } catch { /* ignore */ }\n try {\n if (document.cookie.indexOf(FIQ_VID_KEY + \"=\") !== -1) {\n surviving.push(\"cookie\");\n }\n } catch { /* ignore */ }\n return surviving;\n}\n\nexport async function collectStorage(): Promise<SignalResult<StorageSignal>> {\n const start = performance.now();\n\n let localStorageAvailable = false;\n try {\n localStorageAvailable = testStorage(localStorage);\n } catch { /* ignore */ }\n\n let sessionStorageAvailable = false;\n try {\n sessionStorageAvailable = testStorage(sessionStorage);\n } catch { /* ignore */ }\n\n const cookieAvailable = testCookies();\n const indexedDbAvailable = await testIndexedDB();\n const survivingMechanisms = getSurvivingMechanisms();\n\n return {\n value: {\n localStorage: localStorageAvailable,\n sessionStorage: sessionStorageAvailable,\n indexedDb: indexedDbAvailable,\n cookie: cookieAvailable,\n survivingMechanisms,\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface MathSignal {\n values: number[];\n hash: string;\n}\n\nconst MATH_TESTS: Array<() => number> = [\n () => Math.acos(0.123456789),\n () => Math.asin(0.123456789),\n () => Math.atan(0.123456789),\n () => Math.atan2(0.123456789, 0.987654321),\n () => Math.cos(0.123456789),\n () => Math.sin(0.123456789),\n () => Math.tan(0.123456789),\n () => Math.exp(0.123456789),\n () => Math.log(0.123456789),\n () => Math.sqrt(0.123456789),\n () => Math.sinh(0.123456789),\n () => Math.cosh(0.123456789),\n () => Math.tanh(0.123456789),\n () => Math.expm1(0.123456789),\n () => Math.log1p(0.123456789),\n () => Math.cbrt(0.123456789),\n () => Math.hypot(0.123456789, 0.987654321),\n () => Math.fround(0.123456789),\n () => Math.clz32(0.123456789),\n () => Math.log2(0.123456789),\n () => Math.log10(0.123456789),\n];\n\nexport async function collectMath(): Promise<SignalResult<MathSignal>> {\n const start = performance.now();\n const values = MATH_TESTS.map((fn) => fn());\n\n // Create a hash from the concatenated values\n const hashInput = values.map((v) => v.toString()).join(\",\");\n const data = new TextEncoder().encode(hashInput);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hash = Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return {\n value: { values, hash },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface DOMRectSignal {\n hash: string;\n emojiHash: string;\n rectCount: number;\n}\n\nconst TEST_ELEMENTS = [\n { tag: \"div\", text: \"FingerprintIQ\", style: \"font-size:16px;font-family:Arial;padding:10px;display:inline-block;\" },\n { tag: \"span\", text: \"mmmmmmmmm\", style: \"font-size:72px;font-family:monospace;\" },\n { tag: \"span\", text: \"WWWWWWWWW\", style: \"font-size:72px;font-family:serif;\" },\n { tag: \"div\", text: \"The quick brown fox\", style: \"font-size:14px;font-family:sans-serif;width:200px;word-wrap:break-word;\" },\n];\n\nconst EMOJI_TEST = \"\\u{1F600}\\u{1F680}\\u{1F308}\\u{1F3B5}\\u{1F9E0}\\u{2764}\\u{FE0F}\\u{1F44D}\\u{1F602}\\u{1F525}\";\n\nasync function hashRect(rect: DOMRect): Promise<string> {\n const str = `${rect.x},${rect.y},${rect.width},${rect.height},${rect.top},${rect.right},${rect.bottom},${rect.left}`;\n const data = new TextEncoder().encode(str);\n const buf = await crypto.subtle.digest(\"SHA-256\", data);\n return Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport async function collectDOMRect(): Promise<SignalResult<DOMRectSignal> | null> {\n const start = performance.now();\n\n try {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"-9999px\";\n container.style.top = \"-9999px\";\n document.body.appendChild(container);\n\n const rectHashes: string[] = [];\n\n for (const el of TEST_ELEMENTS) {\n const node = document.createElement(el.tag);\n node.textContent = el.text;\n node.setAttribute(\"style\", el.style);\n container.appendChild(node);\n const rect = node.getBoundingClientRect();\n rectHashes.push(await hashRect(rect));\n }\n\n // Emoji rendering dimensions\n const emojiSpan = document.createElement(\"span\");\n emojiSpan.style.fontSize = \"48px\";\n emojiSpan.textContent = EMOJI_TEST;\n container.appendChild(emojiSpan);\n const emojiRect = emojiSpan.getBoundingClientRect();\n const emojiHash = await hashRect(emojiRect);\n\n container.remove();\n\n // Combine all rect hashes\n const combined = rectHashes.join(\"|\");\n const data = new TextEncoder().encode(combined);\n const buf = await crypto.subtle.digest(\"SHA-256\", data);\n const hash = Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n return {\n value: { hash, emojiHash, rectCount: rectHashes.length },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface HeadlessSignal {\n isHeadless: boolean;\n markers: string[];\n}\n\nexport async function collectHeadless(): Promise<SignalResult<HeadlessSignal>> {\n const start = performance.now();\n const markers: string[] = [];\n const win = globalThis as Record<string, unknown>;\n const nav = globalThis.navigator as unknown as Record<string, unknown>;\n\n // WebDriver flag\n if (nav.webdriver === true) markers.push(\"webdriver\");\n\n // Check if webdriver is writable (real browsers lock it)\n try {\n const desc = Object.getOwnPropertyDescriptor(Navigator.prototype, \"webdriver\");\n if (desc && desc.configurable) markers.push(\"webdriver_configurable\");\n } catch { /* ignore */ }\n\n // Selenium markers\n if (win._selenium !== undefined) markers.push(\"selenium\");\n if (win.__selenium_unwrapped !== undefined) markers.push(\"selenium_unwrapped\");\n if ((document as unknown as Record<string, unknown>).$cdc_asdjflasutopfhvcZLmcfl_ !== undefined) markers.push(\"chromedriver_cdc\");\n if ((document as unknown as Record<string, unknown>).__webdriver_evaluate !== undefined) markers.push(\"webdriver_evaluate\");\n if ((document as unknown as Record<string, unknown>).__driver_evaluate !== undefined) markers.push(\"driver_evaluate\");\n\n // Playwright markers\n if (win.__playwright !== undefined) markers.push(\"playwright\");\n if (win.__pw_manual !== undefined) markers.push(\"playwright_manual\");\n\n // Puppeteer markers\n if (win.__puppeteer !== undefined) markers.push(\"puppeteer\");\n\n // Nightmare.js\n if (win.__nightmare !== undefined) markers.push(\"nightmare\");\n\n // PhantomJS\n if (win.callPhantom !== undefined || win._phantom !== undefined) markers.push(\"phantom\");\n\n // Chrome-specific: real Chrome has window.chrome\n const ua = (typeof navigator !== \"undefined\" ? navigator.userAgent : \"\").toLowerCase();\n const claimsChrome = ua.includes(\"chrome\") && !ua.includes(\"edg\");\n if (claimsChrome && !win.chrome) markers.push(\"missing_chrome_object\");\n\n // HeadlessChrome in user agent\n if (ua.includes(\"headlesschrome\")) markers.push(\"headless_ua\");\n\n // Plugin count (real browsers usually have > 0 plugins)\n if (typeof navigator !== \"undefined\" && navigator.plugins && navigator.plugins.length === 0 && claimsChrome) {\n markers.push(\"no_plugins\");\n }\n\n // Languages empty (headless default)\n if (typeof navigator !== \"undefined\" && (!navigator.languages || navigator.languages.length === 0)) {\n markers.push(\"no_languages\");\n }\n\n // Impossible deviceMemory\n const deviceMem = (nav as Record<string, unknown>).deviceMemory;\n if (typeof deviceMem === \"number\" && (deviceMem <= 0 || deviceMem > 256)) {\n markers.push(\"impossible_device_memory\");\n }\n\n // Notification permission anomaly (headless browsers often have \"denied\" even before asking)\n try {\n if (typeof Notification !== \"undefined\" && Notification.permission === \"denied\" && !win._notificationDenied) {\n // This alone isn't conclusive, but combined with other markers it helps\n }\n } catch { /* ignore */ }\n\n // DOM automation interfaces\n if (win.domAutomation !== undefined || win.domAutomationController !== undefined) {\n markers.push(\"dom_automation\");\n }\n\n return {\n value: {\n isHeadless: markers.length >= 2,\n markers,\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult, SpeechSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nexport async function collectSpeech(): Promise<SignalResult<SpeechSignal> | null> {\n const start = performance.now();\n try {\n if (typeof speechSynthesis === \"undefined\") return null;\n\n let voices = speechSynthesis.getVoices();\n\n if (voices.length === 0) {\n voices = await new Promise<SpeechSynthesisVoice[]>((resolve) => {\n const timeout = setTimeout(() => resolve([]), 2000);\n speechSynthesis.onvoiceschanged = () => {\n clearTimeout(timeout);\n resolve(speechSynthesis.getVoices());\n };\n });\n }\n\n if (voices.length === 0) return null;\n\n const localVoices = voices\n .filter((v) => v.localService)\n .map((v) => v.name)\n .sort();\n\n const remoteVoiceCount = voices.filter((v) => !v.localService).length;\n const defaultVoice = voices.find((v) => v.default)?.name ?? null;\n\n const hashInput = voices\n .map((v) => `${v.name}:${v.lang}:${v.localService}`)\n .sort()\n .join(\"|\");\n const hash = await sha256(hashInput);\n\n return {\n value: {\n voiceCount: voices.length,\n localVoices,\n remoteVoiceCount,\n defaultVoice,\n hash,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, IntlSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nexport async function collectIntl(): Promise<SignalResult<IntlSignal> | null> {\n const start = performance.now();\n try {\n const locales: string[] = [];\n const parts: string[] = [];\n\n // Collator\n try {\n const collator = new Intl.Collator();\n locales.push(collator.resolvedOptions().locale);\n parts.push(`collator:${collator.resolvedOptions().locale}`);\n } catch { /* ignore */ }\n\n // DateTimeFormat\n try {\n const dtf = new Intl.DateTimeFormat();\n locales.push(dtf.resolvedOptions().locale);\n const formatted = dtf.format(new Date(2024, 0, 1));\n parts.push(`dtf:${dtf.resolvedOptions().locale}:${formatted}`);\n } catch { /* ignore */ }\n\n // DisplayNames\n let displayNamesOutput = \"\";\n try {\n const dn = new (Intl as unknown as { DisplayNames: new (locale: string[], opts: object) => { of: (code: string) => string; resolvedOptions: () => { locale: string } } }).DisplayNames([\"en\"], { type: \"region\" });\n locales.push(dn.resolvedOptions().locale);\n const us = dn.of(\"US\") ?? \"\";\n const jp = dn.of(\"JP\") ?? \"\";\n const de = dn.of(\"DE\") ?? \"\";\n displayNamesOutput = `${us},${jp},${de}`;\n parts.push(`displayNames:${displayNamesOutput}`);\n } catch { /* ignore */ }\n\n // ListFormat\n let formattedList = \"\";\n try {\n const lf = new (Intl as unknown as { ListFormat: new (locale: string[], opts: object) => { format: (items: string[]) => string; resolvedOptions: () => { locale: string } } }).ListFormat([\"en\"], { style: \"long\", type: \"conjunction\" });\n locales.push(lf.resolvedOptions().locale);\n formattedList = lf.format([\"Alice\", \"Bob\", \"Carol\"]);\n parts.push(`listFormat:${formattedList}`);\n } catch { /* ignore */ }\n\n // NumberFormat\n let formattedNumber = \"\";\n try {\n const nf = new Intl.NumberFormat(undefined, { notation: \"compact\", compactDisplay: \"long\" } as Intl.NumberFormatOptions);\n locales.push(nf.resolvedOptions().locale);\n formattedNumber = nf.format(21000000);\n parts.push(`numberFormat:${formattedNumber}`);\n } catch { /* ignore */ }\n\n // PluralRules\n try {\n const pr = new Intl.PluralRules();\n locales.push(pr.resolvedOptions().locale);\n const p0 = pr.select(0);\n const p1 = pr.select(1);\n const p2 = pr.select(2);\n parts.push(`pluralRules:${p0},${p1},${p2}`);\n } catch { /* ignore */ }\n\n // RelativeTimeFormat\n let formattedRelativeTime = \"\";\n try {\n const rtf = new (Intl as unknown as { RelativeTimeFormat: new (locale: string[], opts: object) => { format: (value: number, unit: string) => string; resolvedOptions: () => { locale: string } } }).RelativeTimeFormat([\"en\"], { numeric: \"auto\" });\n locales.push(rtf.resolvedOptions().locale);\n formattedRelativeTime = rtf.format(-1, \"year\");\n parts.push(`relativeTime:${formattedRelativeTime}`);\n } catch { /* ignore */ }\n\n const uniqueLocales = [...new Set(locales)];\n\n // Detect locale spoofing: compare against navigator.language\n let localeSpoofed = false;\n try {\n const navLang = navigator.language?.split(\"-\")[0].toLowerCase();\n if (navLang && uniqueLocales.length > 0) {\n const intlLang = uniqueLocales[0].split(\"-\")[0].toLowerCase();\n localeSpoofed = intlLang !== navLang;\n }\n } catch { /* ignore */ }\n\n const hash = await sha256(parts.join(\"|\"));\n\n return {\n value: {\n locales: uniqueLocales,\n formattedNumber,\n formattedRelativeTime,\n formattedList,\n localeSpoofed,\n hash,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, TimezoneSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nexport async function collectTimezone(): Promise<SignalResult<TimezoneSignal> | null> {\n const start = performance.now();\n try {\n // Reported timezone from Intl\n const reported = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n // Historical offset (July 2005 — chosen to capture DST historical behavior)\n const offsetHistorical = new Date(2005, 6, 1).getTimezoneOffset();\n\n // Compute timezone name via formatToParts\n let computed: string | null = null;\n try {\n const parts = Intl.DateTimeFormat(undefined, { timeZoneName: \"long\" }).formatToParts(new Date());\n const tzPart = parts.find((p) => p.type === \"timeZoneName\");\n computed = tzPart?.value ?? null;\n } catch { /* ignore */ }\n\n // Detect spoofing: compare implied hour from reported timezone vs actual offset\n let isSpoofed = false;\n try {\n const currentOffset = new Date().getTimezoneOffset();\n // Get the UTC offset implied by the reported timezone\n const testDate = new Date();\n const utcStr = testDate.toLocaleString(\"en-US\", { timeZone: \"UTC\", hour12: false, hour: \"numeric\" });\n const localStr = testDate.toLocaleString(\"en-US\", { timeZone: reported, hour12: false, hour: \"numeric\" });\n const utcHour = parseInt(utcStr, 10);\n const localHour = parseInt(localStr, 10);\n const impliedOffset = (utcHour - localHour) * 60;\n // Allow 60 min difference to account for half-hour/quarter-hour zones\n isSpoofed = Math.abs(impliedOffset - currentOffset) > 90;\n } catch { /* ignore */ }\n\n const hash = await sha256(`${reported}|${offsetHistorical}|${new Date().getTimezoneOffset()}`);\n\n return {\n value: {\n reported,\n computed,\n offsetHistorical,\n isSpoofed,\n hash,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, CssStyleSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nconst SYSTEM_COLORS = [\n \"ActiveText\",\n \"ButtonBorder\",\n \"ButtonFace\",\n \"ButtonText\",\n \"Canvas\",\n \"CanvasText\",\n \"Field\",\n \"FieldText\",\n \"GrayText\",\n \"Highlight\",\n \"HighlightText\",\n \"LinkText\",\n \"Mark\",\n \"MarkText\",\n \"SelectedItem\",\n \"SelectedItemText\",\n \"VisitedText\",\n \"AccentColor\",\n \"AccentColorText\",\n];\n\nconst SYSTEM_FONTS = [\n \"caption\",\n \"icon\",\n \"menu\",\n \"message-box\",\n \"small-caption\",\n \"status-bar\",\n];\n\nexport async function collectCssStyle(): Promise<SignalResult<CssStyleSignal> | null> {\n const start = performance.now();\n try {\n if (typeof document === \"undefined\") return null;\n\n // Count computed style properties\n const propertyCount = getComputedStyle(document.documentElement).length;\n\n // Create a hidden element for reading system values\n const el = document.createElement(\"div\");\n el.style.cssText = \"position:absolute;visibility:hidden;pointer-events:none;\";\n document.body.appendChild(el);\n\n // Read system colors\n const colorValues: string[] = [];\n for (const color of SYSTEM_COLORS) {\n try {\n el.style.color = color;\n const computed = getComputedStyle(el).color;\n colorValues.push(`${color}:${computed}`);\n } catch { /* ignore */ }\n }\n\n // Read system fonts\n const fontValues: string[] = [];\n for (const font of SYSTEM_FONTS) {\n try {\n el.style.font = font;\n const computed = getComputedStyle(el).font;\n fontValues.push(`${font}:${computed}`);\n } catch { /* ignore */ }\n }\n\n document.body.removeChild(el);\n\n const systemColorHash = await sha256(colorValues.join(\"|\"));\n const systemFontHash = await sha256(fontValues.join(\"|\"));\n const hash = await sha256(`${propertyCount}|${systemColorHash}|${systemFontHash}`);\n\n return {\n value: {\n propertyCount,\n systemColorHash,\n systemFontHash,\n hash,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, ErrorSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nexport async function collectErrors(): Promise<SignalResult<ErrorSignal> | null> {\n const start = performance.now();\n try {\n const messages: string[] = [];\n\n // 1. null property access\n try { (null as unknown as Record<string, unknown>).x; } catch (e) { messages.push((e as Error).message); }\n\n // 2. undefined property access\n try { (undefined as unknown as Record<string, unknown>).x; } catch (e) { messages.push((e as Error).message); }\n\n // 3. spread undefined\n try { [...(undefined as unknown as Iterable<unknown>)]; } catch (e) { messages.push((e as Error).message); }\n\n // 4. eval syntax error\n try { eval(\")\"); } catch (e) { messages.push((e as Error).message); }\n\n // 5. invalid array length\n try { new Array(-1); } catch (e) { messages.push((e as Error).message); }\n\n // 6. repeat negative count\n try { \"abc\".repeat(-1); } catch (e) { messages.push((e as Error).message); }\n\n // 7. setPrototypeOf cycle\n try {\n const a = {};\n const b = {};\n Object.setPrototypeOf(a, b);\n Object.setPrototypeOf(b, a);\n } catch (e) { messages.push((e as Error).message); }\n\n // 8. invalid regex\n try { new RegExp(\"(\"); } catch (e) { messages.push((e as Error).message); }\n\n // 9. repeat Infinity\n try { \"\".repeat(Infinity); } catch (e) { messages.push((e as Error).message); }\n\n const hash = await sha256(messages.join(\"|\"));\n\n return {\n value: { messages, hash },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, WorkerScopeSignal } from \"../types\";\n\nconst WORKER_SCRIPT = `\nself.onmessage = function() {\n var nav = {\n hardwareConcurrency: self.navigator.hardwareConcurrency || 0,\n platform: self.navigator.platform || '',\n languages: Array.from(self.navigator.languages || []),\n userAgent: self.navigator.userAgent || ''\n };\n\n var webgl = null;\n try {\n var canvas = new OffscreenCanvas(1, 1);\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (gl) {\n var ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n webgl = {\n renderer: gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) || '',\n vendor: gl.getParameter(ext.UNMASKED_VENDOR_WEBGL) || ''\n };\n }\n }\n } catch(e) {}\n\n self.postMessage({ nav: nav, webgl: webgl });\n};\n`;\n\nexport async function collectWorkerScope(): Promise<SignalResult<WorkerScopeSignal> | null> {\n const start = performance.now();\n try {\n if (typeof Worker === \"undefined\") return null;\n\n const blob = new Blob([WORKER_SCRIPT], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n\n const workerData = await new Promise<{ nav: WorkerScopeSignal[\"workerNavigator\"]; webgl: WorkerScopeSignal[\"workerWebGL\"] } | null>((resolve) => {\n let worker: Worker;\n const timeout = setTimeout(() => {\n try { worker.terminate(); } catch { /* ignore */ }\n URL.revokeObjectURL(url);\n resolve(null);\n }, 5000);\n\n try {\n worker = new Worker(url);\n worker.onmessage = (e: MessageEvent) => {\n clearTimeout(timeout);\n worker.terminate();\n URL.revokeObjectURL(url);\n resolve(e.data);\n };\n worker.onerror = () => {\n clearTimeout(timeout);\n URL.revokeObjectURL(url);\n resolve(null);\n };\n worker.postMessage(null);\n } catch {\n clearTimeout(timeout);\n URL.revokeObjectURL(url);\n resolve(null);\n }\n });\n\n const workerNavigator = workerData?.nav ?? null;\n const workerWebGL = workerData?.webgl ?? null;\n\n // Compare against main-thread navigator\n const mismatches: string[] = [];\n if (workerNavigator) {\n if (workerNavigator.hardwareConcurrency !== navigator.hardwareConcurrency) {\n mismatches.push(\"hardwareConcurrency\");\n }\n if (workerNavigator.platform !== navigator.platform) {\n mismatches.push(\"platform\");\n }\n if (workerNavigator.userAgent !== navigator.userAgent) {\n mismatches.push(\"userAgent\");\n }\n const mainLangs = navigator.languages?.join(\",\") ?? \"\";\n const workerLangs = workerNavigator.languages?.join(\",\") ?? \"\";\n if (mainLangs !== workerLangs) {\n mismatches.push(\"languages\");\n }\n }\n\n // Compare main-thread WebGL renderer/vendor when both contexts expose them.\n if (workerWebGL) {\n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl\") as WebGLRenderingContext | null;\n const debugInfo = gl?.getExtension(\"WEBGL_debug_renderer_info\");\n if (gl && debugInfo) {\n const mainRenderer = String(\n gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) ?? \"\",\n );\n const mainVendor = String(\n gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) ?? \"\",\n );\n if (\n workerWebGL.renderer &&\n mainRenderer &&\n workerWebGL.renderer !== mainRenderer\n ) {\n mismatches.push(\"webglRenderer\");\n }\n if (\n workerWebGL.vendor &&\n mainVendor &&\n workerWebGL.vendor !== mainVendor\n ) {\n mismatches.push(\"webglVendor\");\n }\n }\n } catch {\n // Ignore WebGL compare failures; worker navigator mismatches are still useful.\n }\n }\n\n return {\n value: {\n workerNavigator,\n workerWebGL,\n mismatches,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, ResistanceSignal } from \"../types\";\n\nfunction measureTimerPrecision(): number {\n const samples: number[] = [];\n let prev = performance.now();\n for (let i = 0; i < 100; i++) {\n const now = performance.now();\n const delta = now - prev;\n if (delta > 0) samples.push(delta);\n prev = now;\n }\n if (samples.length === 0) return 0;\n samples.sort((a, b) => a - b);\n return samples[0];\n}\n\nexport async function collectResistance(): Promise<SignalResult<ResistanceSignal> | null> {\n const start = performance.now();\n try {\n const timerPrecisionMs = measureTimerPrecision();\n\n // Detect browser\n let browser: string | null = null;\n\n // Brave detection\n try {\n const nav = navigator as Navigator & { brave?: { isBrave: () => Promise<boolean> } };\n if (nav.brave) {\n const isBrave = await nav.brave.isBrave();\n if (isBrave) browser = \"brave\";\n }\n } catch { /* ignore */ }\n\n // Tor detection: screen dimensions rounded to 200x100 multiples AND high timer precision\n if (!browser) {\n try {\n const isScreenRounded =\n screen.width % 200 === 0 &&\n screen.height % 100 === 0;\n if (isScreenRounded && timerPrecisionMs >= 50) {\n browser = \"tor\";\n }\n } catch { /* ignore */ }\n }\n\n // Firefox RFP (Resist Fingerprinting) detection\n if (!browser && timerPrecisionMs >= 80) {\n browser = \"firefox-rfp\";\n }\n\n // Detect extensions\n const extensions: string[] = [];\n\n // DuckDuckGo Privacy Essentials\n try {\n const ddgEl = document.querySelector(\"[data-duckduckgo-privacy]\") ??\n document.querySelector(\"[ddg-extension-hide]\");\n if (ddgEl) extensions.push(\"duckduckgo\");\n } catch { /* ignore */ }\n\n // CanvasBlocker: canvas toDataURL differs between calls\n try {\n const cbCanvas = document.createElement(\"canvas\");\n cbCanvas.width = 16;\n cbCanvas.height = 16;\n const cbCtx = cbCanvas.getContext(\"2d\");\n if (cbCtx) {\n cbCtx.fillStyle = \"red\";\n cbCtx.fillRect(0, 0, 16, 16);\n const url1 = cbCanvas.toDataURL();\n const url2 = cbCanvas.toDataURL();\n if (url1 !== url2) extensions.push(\"canvas-blocker\");\n }\n } catch { /* ignore */ }\n\n // JShelter: WebGL getParameter toString check\n try {\n const jsCanvas = document.createElement(\"canvas\");\n const gl = jsCanvas.getContext(\"webgl\") as (WebGLRenderingContext & { getParameter: { toString?: () => string } }) | null;\n if (gl) {\n const gpStr = gl.getParameter.toString?.() ?? \"\";\n if (gpStr.includes(\"native\") === false && gpStr.length > 0) {\n extensions.push(\"jshelter\");\n }\n }\n } catch { /* ignore */ }\n\n // Trace extension: navigator.plugins descriptor check\n try {\n const pluginsDescriptor = Object.getOwnPropertyDescriptor(Navigator.prototype, \"plugins\") ??\n Object.getOwnPropertyDescriptor(navigator, \"plugins\");\n if (pluginsDescriptor && pluginsDescriptor.get) {\n const getterStr = pluginsDescriptor.get.toString();\n if (!getterStr.includes(\"[native code]\")) {\n extensions.push(\"trace\");\n }\n }\n } catch { /* ignore */ }\n\n return {\n value: {\n browser,\n extensions,\n timerPrecisionMs,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, SvgSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nexport async function collectSvg(): Promise<SignalResult<SvgSignal> | null> {\n const start = performance.now();\n try {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"width\", \"500\");\n svg.setAttribute(\"height\", \"100\");\n svg.style.position = \"absolute\";\n svg.style.left = \"-9999px\";\n svg.style.top = \"-9999px\";\n\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", \"10\");\n text.setAttribute(\"y\", \"50\");\n text.setAttribute(\"font-size\", \"16\");\n text.setAttribute(\"font-family\", \"sans-serif\");\n text.textContent = \"\\u{1F600}\\u{1F680}\\u{1F308}\\u{1F3B5}ABCxyz\";\n svg.appendChild(text);\n document.body.appendChild(svg);\n\n const textLengths: number[] = [];\n try {\n const bbox = text.getBBox();\n textLengths.push(bbox.width, bbox.height);\n } catch { /* unavailable */ }\n\n try {\n const computedLength = text.getComputedTextLength();\n textLengths.push(computedLength);\n } catch { /* unavailable */ }\n\n try {\n const sub1 = text.getSubStringLength(0, 4);\n const sub2 = text.getSubStringLength(4, 3);\n textLengths.push(sub1, sub2);\n } catch { /* unavailable */ }\n\n document.body.removeChild(svg);\n\n if (textLengths.length === 0) return null;\n\n const hash = await sha256(textLengths.join(\",\"));\n\n return {\n value: { hash, textLengths },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, WindowFeaturesSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nconst KNOWN_GLOBALS = new Set([\n \"undefined\", \"globalThis\", \"Infinity\", \"NaN\",\n \"eval\", \"isFinite\", \"isNaN\", \"parseFloat\", \"parseInt\",\n \"decodeURI\", \"decodeURIComponent\", \"encodeURI\", \"encodeURIComponent\",\n \"escape\", \"unescape\", \"Object\", \"Function\", \"Boolean\", \"Symbol\",\n \"Error\", \"EvalError\", \"RangeError\", \"ReferenceError\", \"SyntaxError\",\n \"TypeError\", \"URIError\", \"AggregateError\", \"InternalError\",\n \"Number\", \"BigInt\", \"Math\", \"Date\", \"String\", \"RegExp\", \"Array\",\n \"Int8Array\", \"Uint8Array\", \"Uint8ClampedArray\", \"Int16Array\", \"Uint16Array\",\n \"Int32Array\", \"Uint32Array\", \"Float32Array\", \"Float64Array\", \"BigInt64Array\",\n \"BigUint64Array\", \"Map\", \"Set\", \"WeakMap\", \"WeakSet\", \"WeakRef\",\n \"ArrayBuffer\", \"SharedArrayBuffer\", \"Atomics\", \"DataView\", \"JSON\",\n \"Promise\", \"Generator\", \"GeneratorFunction\", \"AsyncFunction\",\n \"AsyncGenerator\", \"AsyncGeneratorFunction\", \"Reflect\", \"Proxy\",\n \"Intl\", \"Iterator\",\n // Browser globals\n \"window\", \"self\", \"document\", \"frames\", \"parent\", \"top\", \"opener\",\n \"closed\", \"length\", \"frameElement\", \"external\", \"location\", \"history\",\n \"navigator\", \"screen\", \"visualViewport\", \"performance\", \"crypto\",\n \"console\", \"alert\", \"confirm\", \"prompt\", \"open\", \"close\", \"focus\",\n \"blur\", \"postMessage\", \"requestAnimationFrame\", \"cancelAnimationFrame\",\n \"requestIdleCallback\", \"cancelIdleCallback\", \"setTimeout\", \"clearTimeout\",\n \"setInterval\", \"clearInterval\", \"queueMicrotask\", \"fetch\", \"XMLHttpRequest\",\n \"WebSocket\", \"EventSource\", \"Worker\", \"SharedWorker\", \"ServiceWorker\",\n \"Notification\", \"PushManager\", \"Blob\", \"File\", \"FileList\", \"FileReader\",\n \"FormData\", \"URLSearchParams\", \"URL\", \"Headers\", \"Request\", \"Response\",\n \"Event\", \"EventTarget\", \"CustomEvent\", \"MessageEvent\", \"ErrorEvent\",\n \"ProgressEvent\", \"UIEvent\", \"MouseEvent\", \"KeyboardEvent\", \"TouchEvent\",\n \"PointerEvent\", \"WheelEvent\", \"FocusEvent\", \"InputEvent\", \"CompositionEvent\",\n \"DragEvent\", \"ClipboardEvent\", \"BeforeUnloadEvent\", \"HashChangeEvent\",\n \"PopStateEvent\", \"PageTransitionEvent\", \"StorageEvent\", \"AnimationEvent\",\n \"TransitionEvent\", \"DeviceOrientationEvent\", \"DeviceMotionEvent\",\n \"MediaQueryList\", \"MediaQueryListEvent\", \"ResizeObserver\", \"MutationObserver\",\n \"IntersectionObserver\", \"PerformanceObserver\",\n \"HTMLElement\", \"Element\", \"Node\", \"NodeList\", \"HTMLCollection\",\n \"Document\", \"DocumentFragment\", \"ShadowRoot\", \"Text\", \"Comment\",\n \"Attr\", \"CSSStyleDeclaration\", \"DOMParser\", \"XMLSerializer\", \"Range\",\n \"Selection\", \"TreeWalker\", \"NodeIterator\", \"XPathResult\", \"XPathExpression\",\n \"Canvas\", \"CanvasRenderingContext2D\", \"WebGLRenderingContext\",\n \"WebGL2RenderingContext\", \"ImageData\", \"ImageBitmap\",\n \"Audio\", \"AudioContext\", \"AudioBuffer\", \"AudioNode\",\n \"MediaStream\", \"MediaStreamTrack\", \"RTCPeerConnection\",\n \"IDBFactory\", \"IDBDatabase\", \"indexedDB\", \"localStorage\", \"sessionStorage\",\n \"caches\", \"cookieStore\", \"speechSynthesis\", \"speechRecognition\",\n \"CSS\", \"CSSAnimation\", \"CSSTransition\",\n \"customElements\", \"reportError\",\n \"AbortController\", \"AbortSignal\",\n \"TextEncoder\", \"TextDecoder\", \"TextDecoderStream\", \"TextEncoderStream\",\n \"TransformStream\", \"ReadableStream\", \"WritableStream\", \"ByteLengthQueuingStrategy\",\n \"CountQueuingStrategy\",\n \"structuredClone\", \"atob\", \"btoa\",\n \"clearImmediate\", \"setImmediate\",\n \"matchMedia\", \"getComputedStyle\", \"getSelection\", \"dispatchEvent\",\n \"addEventListener\", \"removeEventListener\",\n \"scrollX\", \"scrollY\", \"pageXOffset\", \"pageYOffset\",\n \"screenX\", \"screenY\", \"screenLeft\", \"screenTop\",\n \"innerWidth\", \"innerHeight\", \"outerWidth\", \"outerHeight\",\n \"devicePixelRatio\", \"scrollbars\", \"menubar\", \"toolbar\",\n \"statusbar\", \"personalbar\", \"locationbar\",\n \"status\", \"defaultStatus\", \"name\",\n \"origin\", \"crossOriginIsolated\", \"isSecureContext\",\n \"trustedTypes\", \"launchQueue\",\n \"scheduler\", \"navigation\",\n \"TEMPORARY\", \"PERSISTENT\",\n \"Gamepad\", \"GamepadEvent\",\n \"SpeechSynthesis\", \"SpeechSynthesisVoice\", \"SpeechSynthesisUtterance\",\n \"SpeechRecognition\", \"SpeechGrammar\", \"SpeechGrammarList\",\n \"BroadcastChannel\", \"MessageChannel\", \"MessagePort\",\n \"OffscreenCanvas\", \"Path2D\",\n \"PaymentRequest\", \"PaymentResponse\",\n \"CredentialsContainer\", \"PublicKeyCredential\",\n \"SubtleCrypto\",\n \"CompressionStream\", \"DecompressionStream\",\n \"LockManager\", \"Lock\",\n \"StorageManager\",\n \"BarProp\", \"History\", \"Location\", \"Navigator\", \"Screen\",\n \"DataTransfer\", \"DataTransferItem\", \"DataTransferItemList\",\n \"DOMException\", \"DOMImplementation\", \"DOMRect\", \"DOMPoint\", \"DOMMatrix\",\n \"DOMRectReadOnly\", \"DOMPointReadOnly\", \"DOMMatrixReadOnly\",\n]);\n\nexport async function collectWindowFeatures(): Promise<SignalResult<WindowFeaturesSignal> | null> {\n const start = performance.now();\n try {\n const props = Object.getOwnPropertyNames(window);\n const propertyCount = props.length;\n\n let webkitCount = 0;\n let mozCount = 0;\n const litterKeys: string[] = [];\n\n for (const key of props) {\n const lower = key.toLowerCase();\n if (lower.startsWith(\"webkit\")) {\n webkitCount++;\n continue;\n }\n if (lower.startsWith(\"moz\")) {\n mozCount++;\n continue;\n }\n // Skip known globals\n if (KNOWN_GLOBALS.has(key)) continue;\n // Skip \"on*\" event handlers\n if (key.startsWith(\"on\")) continue;\n // Skip \"__\" prefixed properties\n if (key.startsWith(\"__\")) continue;\n // Skip numeric indices\n if (/^\\d+$/.test(key)) continue;\n // Skip webkit/moz already counted\n // This key is \"litter\"\n litterKeys.push(key);\n }\n\n litterKeys.sort();\n const capped = litterKeys.slice(0, 50);\n\n const hash = await sha256(\n `${propertyCount}|${webkitCount}|${mozCount}|${capped.join(\",\")}`\n );\n\n return {\n value: {\n propertyCount,\n webkitCount,\n mozCount,\n litterKeys: capped,\n hash,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, HtmlElementSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nexport async function collectHtmlElement(): Promise<SignalResult<HtmlElementSignal> | null> {\n const start = performance.now();\n try {\n const properties = new Set<string>();\n let proto: object | null = document.documentElement;\n\n while (proto !== null) {\n try {\n const names = Object.getOwnPropertyNames(proto);\n for (const name of names) {\n properties.add(name);\n }\n } catch { /* ignore */ }\n proto = Object.getPrototypeOf(proto) as object | null;\n }\n\n const sorted = [...properties].sort();\n const propertyCount = sorted.length;\n const hash = await sha256(sorted.join(\",\"));\n\n return {\n value: { propertyCount, hash },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, CodecSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nconst MIME_TYPES = [\n 'video/mp4; codecs=\"avc1.42E01E\"',\n 'video/mp4; codecs=\"hev1.1.6.L93.B0\"',\n 'video/webm; codecs=\"vp8\"',\n 'video/webm; codecs=\"vp9\"',\n 'video/webm; codecs=\"av01.0.05M.08\"',\n \"video/ogg\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/webm\",\n \"audio/aac\",\n \"audio/flac\",\n \"audio/wav\",\n];\n\nexport async function collectCodecs(): Promise<SignalResult<CodecSignal> | null> {\n const start = performance.now();\n try {\n const matrix: Record<string, { canPlay: string; mediaSource: boolean; mediaRecorder: boolean }> = {};\n\n const video = document.createElement(\"video\");\n\n for (const mime of MIME_TYPES) {\n let canPlay = \"\";\n try {\n canPlay = video.canPlayType(mime);\n } catch { /* ignore */ }\n\n let mediaSource = false;\n try {\n if (typeof MediaSource !== \"undefined\" && \"isTypeSupported\" in MediaSource) {\n mediaSource = (MediaSource as { isTypeSupported: (type: string) => boolean }).isTypeSupported(mime);\n }\n } catch { /* ignore */ }\n\n let mediaRecorder = false;\n try {\n if (typeof MediaRecorder !== \"undefined\" && \"isTypeSupported\" in MediaRecorder) {\n mediaRecorder = (MediaRecorder as { isTypeSupported: (type: string) => boolean }).isTypeSupported(mime);\n }\n } catch { /* ignore */ }\n\n matrix[mime] = { canPlay, mediaSource, mediaRecorder };\n }\n\n const hashInput = Object.entries(matrix)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}:${v.canPlay}:${v.mediaSource}:${v.mediaRecorder}`)\n .join(\"|\");\n const hash = await sha256(hashInput);\n\n return {\n value: { matrix, hash },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, StatusSignal } from \"../types\";\n\nexport async function collectStatus(): Promise<SignalResult<StatusSignal> | null> {\n const start = performance.now();\n try {\n // Timer precision: min delta across 100 consecutive performance.now() calls\n let timingResolution = 0;\n try {\n let minDelta = Infinity;\n let prev = performance.now();\n for (let i = 0; i < 100; i++) {\n const now = performance.now();\n const delta = now - prev;\n if (delta > 0 && delta < minDelta) minDelta = delta;\n prev = now;\n }\n timingResolution = minDelta === Infinity ? 0 : minDelta;\n } catch { /* ignore */ }\n\n // Max stack size via recursion\n let maxStackSize = 0;\n try {\n const recurse = (depth: number): number => {\n try {\n return recurse(depth + 1);\n } catch {\n return depth;\n }\n };\n maxStackSize = recurse(0);\n } catch { /* ignore */ }\n\n // Storage quota\n let storageQuotaMB: number | null = null;\n try {\n if (navigator.storage && navigator.storage.estimate) {\n const estimate = await navigator.storage.estimate();\n if (estimate.quota !== undefined) {\n storageQuotaMB = Math.round(estimate.quota / (1024 * 1024));\n }\n }\n } catch { /* ignore */ }\n\n // Battery\n let battery: { charging: boolean; level: number } | null = null;\n try {\n if (\"getBattery\" in navigator) {\n const bat = await (navigator as unknown as { getBattery: () => Promise<{ charging: boolean; level: number }> }).getBattery();\n battery = { charging: bat.charging, level: bat.level };\n }\n } catch { /* ignore */ }\n\n // Heap limit\n let heapLimit: number | null = null;\n try {\n const mem = (performance as unknown as { memory?: { jsHeapSizeLimit: number } }).memory;\n if (mem && mem.jsHeapSizeLimit) {\n heapLimit = mem.jsHeapSizeLimit;\n }\n } catch { /* ignore */ }\n\n return {\n value: {\n timingResolution,\n maxStackSize,\n storageQuotaMB,\n battery,\n heapLimit,\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult, PlatformFeaturesSignal } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nfunction estimatePlatform(features: Record<string, boolean>): string {\n if (features[\"BarcodeDetector\"] && features[\"ContactsManager\"]) return \"Android\";\n if (features[\"TouchEvent\"] && !features[\"SharedWorker\"]) return \"Mobile\";\n if (features[\"HID\"] || features[\"Serial\"] || features[\"showDirectoryPicker\"]) return \"Desktop\";\n return \"Unknown\";\n}\n\nexport async function collectPlatformFeatures(): Promise<SignalResult<PlatformFeaturesSignal> | null> {\n const start = performance.now();\n try {\n const features: Record<string, boolean> = {};\n\n features[\"BarcodeDetector\"] = typeof (globalThis as Record<string, unknown>)[\"BarcodeDetector\"] !== \"undefined\";\n features[\"ContactsManager\"] = typeof (navigator as unknown as Record<string, unknown>)[\"contacts\"] !== \"undefined\";\n features[\"ContentIndex\"] = (() => {\n try {\n return typeof (self as unknown as Record<string, unknown>)[\"ContentIndex\"] !== \"undefined\";\n } catch { return false; }\n })();\n features[\"EyeDropper\"] = typeof (globalThis as Record<string, unknown>)[\"EyeDropper\"] !== \"undefined\";\n features[\"FileSystemWritableFileStream\"] = typeof (globalThis as Record<string, unknown>)[\"FileSystemWritableFileStream\"] !== \"undefined\";\n features[\"HID\"] = typeof (navigator as unknown as Record<string, unknown>)[\"hid\"] !== \"undefined\";\n features[\"Serial\"] = typeof (navigator as unknown as Record<string, unknown>)[\"serial\"] !== \"undefined\";\n features[\"USB\"] = typeof (navigator as unknown as Record<string, unknown>)[\"usb\"] !== \"undefined\";\n features[\"SharedWorker\"] = typeof (globalThis as Record<string, unknown>)[\"SharedWorker\"] !== \"undefined\";\n features[\"PointerEvent\"] = typeof (globalThis as Record<string, unknown>)[\"PointerEvent\"] !== \"undefined\";\n features[\"TouchEvent\"] = typeof (globalThis as Record<string, unknown>)[\"TouchEvent\"] !== \"undefined\";\n features[\"showDirectoryPicker\"] = typeof (globalThis as Record<string, unknown>)[\"showDirectoryPicker\"] !== \"undefined\";\n features[\"showOpenFilePicker\"] = typeof (globalThis as Record<string, unknown>)[\"showOpenFilePicker\"] !== \"undefined\";\n features[\"Bluetooth\"] = typeof (navigator as unknown as Record<string, unknown>)[\"bluetooth\"] !== \"undefined\";\n features[\"WakeLock\"] = typeof (navigator as unknown as Record<string, unknown>)[\"wakeLock\"] !== \"undefined\";\n\n const estimatedPlatform = estimatePlatform(features);\n\n const hashInput = Object.entries(features)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}:${v}`)\n .join(\"|\");\n const hash = await sha256(hashInput);\n\n return {\n value: { features, estimatedPlatform, hash },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type {\n SignalResult,\n UAClientHintsBrand,\n UAClientHintsSignal,\n} from \"../types\";\nimport { sha256 } from \"../hash\";\n\ninterface NavigatorUADataLike {\n brands?: Array<{ brand?: string; version?: string }>;\n mobile?: boolean;\n platform?: string;\n getHighEntropyValues?: (\n hints: string[],\n ) => Promise<Record<string, unknown>>;\n}\n\nconst HIGH_ENTROPY_HINTS = [\n \"architecture\",\n \"bitness\",\n \"formFactors\",\n \"fullVersionList\",\n \"model\",\n \"platformVersion\",\n \"wow64\",\n];\n\nfunction normalizeBrands(\n brands: Array<{ brand?: string; version?: string }> | undefined,\n): UAClientHintsBrand[] {\n return (brands ?? [])\n .map((entry) => ({\n brand: entry.brand ?? \"\",\n version: entry.version ?? \"\",\n }))\n .filter((entry) => entry.brand.length > 0)\n .sort((a, b) =>\n a.brand.localeCompare(b.brand) || a.version.localeCompare(b.version),\n );\n}\n\nexport async function collectUaClientHints(): Promise<\n SignalResult<UAClientHintsSignal> | null\n> {\n const start = performance.now();\n\n try {\n const nav = navigator as Navigator & {\n userAgentData?: NavigatorUADataLike;\n };\n const uaData = nav.userAgentData;\n\n if (!uaData) {\n return {\n value: {\n available: false,\n mobile: null,\n platform: null,\n architecture: null,\n bitness: null,\n model: null,\n platformVersion: null,\n wow64: null,\n formFactors: [],\n brands: [],\n fullVersionList: [],\n hash: null,\n },\n duration: performance.now() - start,\n };\n }\n\n let highEntropyValues: Record<string, unknown> = {};\n try {\n if (typeof uaData.getHighEntropyValues === \"function\") {\n highEntropyValues =\n (await uaData.getHighEntropyValues(HIGH_ENTROPY_HINTS)) ?? {};\n }\n } catch {\n highEntropyValues = {};\n }\n\n const brands = normalizeBrands(uaData.brands);\n const fullVersionList = normalizeBrands(\n highEntropyValues.fullVersionList as\n | Array<{ brand?: string; version?: string }>\n | undefined,\n );\n const formFactors = Array.isArray(highEntropyValues.formFactors)\n ? [...(highEntropyValues.formFactors as string[])].sort()\n : [];\n\n const fingerprintParts = [\n `mobile:${String(uaData.mobile ?? \"\")}`,\n `platform:${uaData.platform ?? \"\"}`,\n `architecture:${String(highEntropyValues.architecture ?? \"\")}`,\n `bitness:${String(highEntropyValues.bitness ?? \"\")}`,\n `model:${String(highEntropyValues.model ?? \"\")}`,\n `platformVersion:${String(highEntropyValues.platformVersion ?? \"\")}`,\n `wow64:${String(highEntropyValues.wow64 ?? \"\")}`,\n `brands:${brands\n .map((entry) => `${entry.brand}/${entry.version}`)\n .join(\",\")}`,\n `fullVersionList:${fullVersionList\n .map((entry) => `${entry.brand}/${entry.version}`)\n .join(\",\")}`,\n `formFactors:${formFactors.join(\",\")}`,\n ];\n\n return {\n value: {\n available: true,\n mobile: uaData.mobile ?? null,\n platform: uaData.platform ?? null,\n architecture:\n (highEntropyValues.architecture as string | undefined) ?? null,\n bitness: (highEntropyValues.bitness as string | undefined) ?? null,\n model: (highEntropyValues.model as string | undefined) ?? null,\n platformVersion:\n (highEntropyValues.platformVersion as string | undefined) ?? null,\n wow64: (highEntropyValues.wow64 as boolean | undefined) ?? null,\n formFactors,\n brands,\n fullVersionList,\n hash: await sha256(fingerprintParts.join(\"|\")),\n },\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { CapabilityVectorSignal, SignalResult } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nfunction normalizePluginName(name: string): string {\n return name.trim().toLowerCase();\n}\n\nexport async function collectCapabilityVector(): Promise<\n SignalResult<CapabilityVectorSignal> | null\n> {\n const start = performance.now();\n\n try {\n const nav = navigator as Navigator & Record<string, unknown> & {\n userAgentData?: { getHighEntropyValues?: unknown };\n };\n\n const plugins = Array.from(nav.plugins ?? []);\n const normalizedPluginNames = plugins\n .map((plugin) => normalizePluginName(plugin.name))\n .sort();\n const hasPdfPlugin = normalizedPluginNames.some((name) =>\n name.includes(\"pdf\"),\n );\n\n const pdfViewerEnabled =\n \"pdfViewerEnabled\" in nav\n ? Boolean((nav as Record<string, unknown>).pdfViewerEnabled)\n : null;\n const globalPrivacyControl =\n \"globalPrivacyControl\" in nav\n ? Boolean((nav as Record<string, unknown>).globalPrivacyControl)\n : null;\n const hasSpeechRecognition =\n typeof (globalThis as Record<string, unknown>).SpeechRecognition !==\n \"undefined\" ||\n typeof (globalThis as Record<string, unknown>).webkitSpeechRecognition !==\n \"undefined\";\n\n const value: CapabilityVectorSignal = {\n pdfViewerEnabled,\n globalPrivacyControl,\n hasPdfPlugin,\n pluginCount: plugins.length,\n hasWebGPU: \"gpu\" in nav,\n hasVirtualKeyboard: \"virtualKeyboard\" in nav,\n hasSpeechSynthesis:\n typeof (globalThis as Record<string, unknown>).speechSynthesis !==\n \"undefined\",\n hasSpeechRecognition,\n hasMediaCapabilities: \"mediaCapabilities\" in nav,\n hasKeyboardLayoutApi:\n typeof (nav as Record<string, unknown>).keyboard === \"object\" &&\n typeof (\n (nav as Record<string, unknown>).keyboard as Record<string, unknown>\n )?.getLayoutMap === \"function\",\n hasBluetooth: \"bluetooth\" in nav,\n hasUsb: \"usb\" in nav,\n hasHid: \"hid\" in nav,\n hasSerial: \"serial\" in nav,\n hasHighEntropyUaHints:\n typeof nav.userAgentData?.getHighEntropyValues === \"function\",\n suspiciousFlags: [],\n hash: \"\",\n };\n\n if (value.pdfViewerEnabled !== null && value.pdfViewerEnabled !== value.hasPdfPlugin) {\n value.suspiciousFlags.push(\"pdf_viewer_mismatch\");\n }\n\n const hashInput = [\n `pdfViewerEnabled:${String(value.pdfViewerEnabled)}`,\n `globalPrivacyControl:${String(value.globalPrivacyControl)}`,\n `hasPdfPlugin:${String(value.hasPdfPlugin)}`,\n `pluginCount:${String(value.pluginCount ?? \"\")}`,\n `hasWebGPU:${String(value.hasWebGPU)}`,\n `hasVirtualKeyboard:${String(value.hasVirtualKeyboard)}`,\n `hasSpeechSynthesis:${String(value.hasSpeechSynthesis)}`,\n `hasSpeechRecognition:${String(value.hasSpeechRecognition)}`,\n `hasMediaCapabilities:${String(value.hasMediaCapabilities)}`,\n `hasKeyboardLayoutApi:${String(value.hasKeyboardLayoutApi)}`,\n `hasBluetooth:${String(value.hasBluetooth)}`,\n `hasUsb:${String(value.hasUsb)}`,\n `hasHid:${String(value.hasHid)}`,\n `hasSerial:${String(value.hasSerial)}`,\n `hasHighEntropyUaHints:${String(value.hasHighEntropyUaHints)}`,\n `plugins:${normalizedPluginNames.slice(0, 8).join(\",\")}`,\n `flags:${value.suspiciousFlags.join(\",\")}`,\n ];\n value.hash = await sha256(hashInput.join(\"|\"));\n\n return {\n value,\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { GeometryVectorSignal, SignalResult } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nfunction roundNumber(value: number | null | undefined): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n return Number(value.toFixed(2));\n}\n\nexport async function collectGeometryVector(): Promise<\n SignalResult<GeometryVectorSignal> | null\n> {\n const start = performance.now();\n\n try {\n const viewport = window.visualViewport;\n const visualViewport =\n viewport != null\n ? {\n width: roundNumber(viewport.width) ?? 0,\n height: roundNumber(viewport.height) ?? 0,\n scale: roundNumber(viewport.scale) ?? 1,\n offsetLeft: roundNumber(viewport.offsetLeft) ?? 0,\n offsetTop: roundNumber(viewport.offsetTop) ?? 0,\n }\n : null;\n\n const value: GeometryVectorSignal = {\n screen: {\n width: screen.width ?? 0,\n height: screen.height ?? 0,\n availWidth: screen.availWidth ?? 0,\n availHeight: screen.availHeight ?? 0,\n },\n window: {\n innerWidth: window.innerWidth ?? 0,\n innerHeight: window.innerHeight ?? 0,\n outerWidth: window.outerWidth ?? 0,\n outerHeight: window.outerHeight ?? 0,\n devicePixelRatio: roundNumber(window.devicePixelRatio) ?? 1,\n },\n visualViewport,\n orientation: {\n type:\n typeof screen.orientation?.type === \"string\"\n ? screen.orientation.type\n : null,\n angle:\n typeof screen.orientation?.angle === \"number\"\n ? screen.orientation.angle\n : null,\n },\n chromeInsetX:\n window.outerWidth > 0 ? window.outerWidth - window.innerWidth : null,\n chromeInsetY:\n window.outerHeight > 0 ? window.outerHeight - window.innerHeight : null,\n suspiciousFlags: [],\n hash: \"\",\n };\n\n if (\n value.screen.availWidth > value.screen.width ||\n value.screen.availHeight > value.screen.height\n ) {\n value.suspiciousFlags.push(\"avail_exceeds_screen\");\n }\n if (\n value.window.outerWidth > 0 &&\n value.window.innerWidth > value.window.outerWidth\n ) {\n value.suspiciousFlags.push(\"outer_width_smaller_than_inner\");\n }\n if (\n value.window.outerHeight > 0 &&\n value.window.innerHeight > value.window.outerHeight\n ) {\n value.suspiciousFlags.push(\"outer_height_smaller_than_inner\");\n }\n if (\n visualViewport &&\n (visualViewport.width > value.window.innerWidth + 1 ||\n visualViewport.height > value.window.innerHeight + 1)\n ) {\n value.suspiciousFlags.push(\"visual_viewport_exceeds_inner\");\n }\n if (\n value.orientation.type?.startsWith(\"portrait\") &&\n value.screen.width > value.screen.height\n ) {\n value.suspiciousFlags.push(\"orientation_screen_mismatch\");\n }\n if (\n value.orientation.type?.startsWith(\"landscape\") &&\n value.screen.height > value.screen.width\n ) {\n value.suspiciousFlags.push(\"orientation_screen_mismatch\");\n }\n\n const hashInput = [\n `screen:${value.screen.width}x${value.screen.height}:${value.screen.availWidth}x${value.screen.availHeight}`,\n `window:${value.window.innerWidth}x${value.window.innerHeight}:${value.window.outerWidth}x${value.window.outerHeight}@${value.window.devicePixelRatio}`,\n `visualViewport:${\n visualViewport\n ? `${visualViewport.width}x${visualViewport.height}@${visualViewport.scale}:${visualViewport.offsetLeft},${visualViewport.offsetTop}`\n : \"none\"\n }`,\n `orientation:${value.orientation.type ?? \"\"}:${String(value.orientation.angle ?? \"\")}`,\n `chromeInsets:${String(value.chromeInsetX ?? \"\")},${String(value.chromeInsetY ?? \"\")}`,\n `flags:${value.suspiciousFlags.join(\",\")}`,\n ];\n value.hash = await sha256(hashInput.join(\"|\"));\n\n return {\n value,\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { RuntimeVectorSignal, SignalResult } from \"../types\";\nimport { sha256 } from \"../hash\";\n\nfunction roundNumber(value: number | null | undefined): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n return Number(value.toFixed(2));\n}\n\nfunction bucketedMemoryMb(value: number | null): number | null {\n if (value === null) return null;\n return Math.round(value / 64) * 64;\n}\n\nexport async function collectRuntimeVector(): Promise<\n SignalResult<RuntimeVectorSignal> | null\n> {\n const start = performance.now();\n\n try {\n const nav = navigator as Navigator & Record<string, unknown>;\n const perf = performance as Performance & {\n memory?: {\n usedJSHeapSize?: number;\n totalJSHeapSize?: number;\n jsHeapSizeLimit?: number;\n };\n };\n const connection = (nav.connection ?? null) as\n | {\n rtt?: number;\n downlink?: number;\n saveData?: boolean;\n }\n | null;\n\n let timingResolutionMs: number | null = null;\n try {\n let minDelta = Infinity;\n let previous = performance.now();\n for (let i = 0; i < 64; i += 1) {\n const current = performance.now();\n const delta = current - previous;\n if (delta > 0 && delta < minDelta) {\n minDelta = delta;\n }\n previous = current;\n }\n timingResolutionMs = minDelta === Infinity ? null : roundNumber(minDelta);\n } catch {\n timingResolutionMs = null;\n }\n\n let maxStackSize: number | null = null;\n try {\n const recurse = (depth: number): number => {\n try {\n return recurse(depth + 1);\n } catch {\n return depth;\n }\n };\n maxStackSize = recurse(0);\n } catch {\n maxStackSize = null;\n }\n\n let storageQuotaMB: number | null = null;\n try {\n const estimate = await navigator.storage?.estimate?.();\n if (typeof estimate?.quota === \"number\") {\n storageQuotaMB = Math.round(estimate.quota / (1024 * 1024));\n }\n } catch {\n storageQuotaMB = null;\n }\n\n const value: RuntimeVectorSignal = {\n hardwareConcurrency:\n typeof nav.hardwareConcurrency === \"number\"\n ? nav.hardwareConcurrency\n : 0,\n deviceMemory:\n typeof (nav as Record<string, unknown>).deviceMemory === \"number\"\n ? ((nav as Record<string, unknown>).deviceMemory as number)\n : null,\n timingResolutionMs,\n maxStackSize,\n storageQuotaMB,\n jsHeapUsedMB:\n typeof perf.memory?.usedJSHeapSize === \"number\"\n ? roundNumber(perf.memory.usedJSHeapSize / (1024 * 1024))\n : null,\n jsHeapTotalMB:\n typeof perf.memory?.totalJSHeapSize === \"number\"\n ? roundNumber(perf.memory.totalJSHeapSize / (1024 * 1024))\n : null,\n jsHeapLimitMB:\n typeof perf.memory?.jsHeapSizeLimit === \"number\"\n ? roundNumber(perf.memory.jsHeapSizeLimit / (1024 * 1024))\n : null,\n networkRttMs:\n typeof connection?.rtt === \"number\" ? roundNumber(connection.rtt) : null,\n downlinkMbps:\n typeof connection?.downlink === \"number\"\n ? roundNumber(connection.downlink)\n : null,\n saveData:\n typeof connection?.saveData === \"boolean\" ? connection.saveData : null,\n suspiciousFlags: [],\n hash: \"\",\n };\n\n if (value.hardwareConcurrency <= 0) {\n value.suspiciousFlags.push(\"invalid_hardware_concurrency\");\n }\n if (\n value.deviceMemory !== null &&\n ![0.25, 0.5, 1, 2, 4, 8, 16, 32].includes(value.deviceMemory)\n ) {\n value.suspiciousFlags.push(\"unexpected_device_memory_bucket\");\n }\n if (\n value.jsHeapUsedMB !== null &&\n value.jsHeapTotalMB !== null &&\n value.jsHeapUsedMB > value.jsHeapTotalMB\n ) {\n value.suspiciousFlags.push(\"heap_used_exceeds_total\");\n }\n if (\n value.jsHeapTotalMB !== null &&\n value.jsHeapLimitMB !== null &&\n value.jsHeapTotalMB > value.jsHeapLimitMB\n ) {\n value.suspiciousFlags.push(\"heap_total_exceeds_limit\");\n }\n if (value.networkRttMs !== null && value.networkRttMs < 0) {\n value.suspiciousFlags.push(\"negative_network_rtt\");\n }\n\n const hashInput = [\n `hardwareConcurrency:${value.hardwareConcurrency}`,\n `deviceMemory:${String(value.deviceMemory ?? \"\")}`,\n `timingResolutionMs:${String(value.timingResolutionMs ?? \"\")}`,\n `maxStackSize:${String(value.maxStackSize ?? \"\")}`,\n `storageQuotaMB:${String(value.storageQuotaMB ?? \"\")}`,\n `heapLimitBucket:${String(bucketedMemoryMb(value.jsHeapLimitMB))}`,\n `networkRttMs:${String(value.networkRttMs ?? \"\")}`,\n `downlinkMbps:${String(value.downlinkMbps ?? \"\")}`,\n `saveData:${String(value.saveData ?? \"\")}`,\n `flags:${value.suspiciousFlags.join(\",\")}`,\n ];\n value.hash = await sha256(hashInput.join(\"|\"));\n\n return {\n value,\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SensorCapabilitiesSignal, SignalResult } from \"../types\";\nimport { sha256 } from \"../hash\";\n\ntype PermissionNameLike =\n | PermissionName\n | \"clipboard-read\"\n | \"accelerometer\"\n | \"gyroscope\"\n | \"magnetometer\";\n\nasync function queryPermission(\n name: PermissionNameLike,\n): Promise<string | null> {\n try {\n const permissions = (navigator as Navigator & {\n permissions?: {\n query?: (descriptor: PermissionDescriptor) => Promise<{ state: PermissionState }>;\n };\n }).permissions;\n if (!permissions?.query) return null;\n const result = await permissions.query({ name } as PermissionDescriptor);\n return result.state;\n } catch {\n return null;\n }\n}\n\nfunction detectPolicyBlocked(key: string): boolean {\n const ctorMap: Record<string, unknown> = {\n accelerometer: (globalThis as Record<string, unknown>).Accelerometer,\n gyroscope: (globalThis as Record<string, unknown>).Gyroscope,\n magnetometer: (globalThis as Record<string, unknown>).Magnetometer,\n absoluteOrientation:\n (globalThis as Record<string, unknown>).AbsoluteOrientationSensor,\n relativeOrientation:\n (globalThis as Record<string, unknown>).RelativeOrientationSensor,\n ambientLight: (globalThis as Record<string, unknown>).AmbientLightSensor,\n };\n\n const Ctor = ctorMap[key] as (new () => object) | undefined;\n if (typeof Ctor !== \"function\") return false;\n\n try {\n void new Ctor();\n return false;\n } catch (error) {\n const name =\n error instanceof Error && typeof error.name === \"string\"\n ? error.name\n : \"\";\n return name === \"SecurityError\" || name === \"NotAllowedError\";\n }\n}\n\nexport async function collectSensorCapabilities(): Promise<\n SignalResult<SensorCapabilitiesSignal> | null\n> {\n const start = performance.now();\n\n try {\n const apis = {\n accelerometer:\n typeof (globalThis as Record<string, unknown>).Accelerometer !==\n \"undefined\",\n gyroscope:\n typeof (globalThis as Record<string, unknown>).Gyroscope !== \"undefined\",\n magnetometer:\n typeof (globalThis as Record<string, unknown>).Magnetometer !==\n \"undefined\",\n absoluteOrientation:\n typeof (globalThis as Record<string, unknown>)\n .AbsoluteOrientationSensor !== \"undefined\",\n relativeOrientation:\n typeof (globalThis as Record<string, unknown>)\n .RelativeOrientationSensor !== \"undefined\",\n ambientLight:\n typeof (globalThis as Record<string, unknown>).AmbientLightSensor !==\n \"undefined\",\n geolocation:\n typeof (navigator as unknown as Record<string, unknown>).geolocation !==\n \"undefined\",\n deviceMotion:\n typeof (globalThis as Record<string, unknown>).DeviceMotionEvent !==\n \"undefined\",\n deviceOrientation:\n typeof (globalThis as Record<string, unknown>).DeviceOrientationEvent !==\n \"undefined\",\n };\n\n const permissionStates = {\n geolocation: await queryPermission(\"geolocation\"),\n camera: await queryPermission(\"camera\"),\n microphone: await queryPermission(\"microphone\"),\n clipboardRead: await queryPermission(\"clipboard-read\"),\n accelerometer: await queryPermission(\"accelerometer\"),\n gyroscope: await queryPermission(\"gyroscope\"),\n magnetometer: await queryPermission(\"magnetometer\"),\n };\n\n const policyBlocked = Object.keys(apis).filter((key) =>\n detectPolicyBlocked(key),\n );\n\n const value: SensorCapabilitiesSignal = {\n apis,\n permissionStates,\n policyBlocked,\n availableCount: Object.values(apis).filter(Boolean).length,\n hash: \"\",\n };\n\n const hashInput = [\n `apis:${Object.entries(apis)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, enabled]) => `${key}:${enabled}`)\n .join(\",\")}`,\n `permissions:${Object.entries(permissionStates)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, state]) => `${key}:${state ?? \"unknown\"}`)\n .join(\",\")}`,\n `blocked:${policyBlocked.sort().join(\",\")}`,\n ];\n value.hash = await sha256(hashInput.join(\"|\"));\n\n return {\n value,\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","interface PointerSample {\n x: number;\n y: number;\n t: number;\n}\n\ninterface TrackerState {\n installedAt: number;\n pointerMoveCount: number;\n pointerDistancePx: number;\n pointerDirectionChanges: number;\n clickCount: number;\n scrollEventCount: number;\n scrollBurstCount: number;\n keyEventCount: number;\n inputEventCount: number;\n focusTransitions: number;\n blurTransitions: number;\n visibilityTransitions: number;\n pointerIntervals: number[];\n keyIntervals: number[];\n firstPointerSample: PointerSample | null;\n lastPointerSample: PointerSample | null;\n lastPointerAngle: number | null;\n lastScrollAt: number | null;\n lastKeyAt: number | null;\n}\n\ninterface BehaviorSnapshot {\n elapsedMs: number;\n pointerMoveCount: number;\n pointerDistancePx: number;\n pointerDirectionChanges: number;\n clickCount: number;\n scrollEventCount: number;\n scrollBurstCount: number;\n keyEventCount: number;\n inputEventCount: number;\n focusTransitions: number;\n blurTransitions: number;\n visibilityTransitions: number;\n meanPointerIntervalMs: number | null;\n meanKeyIntervalMs: number | null;\n pointerStraightness: number | null;\n}\n\nconst GLOBAL_TRACKER_KEY = \"__fiq_behavior_tracker_state__\";\nconst MIN_DIRECTION_DELTA_RAD = Math.PI / 6;\n\nfunction nowMs(): number {\n try {\n return performance.now();\n } catch {\n return Date.now();\n }\n}\n\nfunction createInitialState(): TrackerState {\n return {\n installedAt: nowMs(),\n pointerMoveCount: 0,\n pointerDistancePx: 0,\n pointerDirectionChanges: 0,\n clickCount: 0,\n scrollEventCount: 0,\n scrollBurstCount: 0,\n keyEventCount: 0,\n inputEventCount: 0,\n focusTransitions: 0,\n blurTransitions: 0,\n visibilityTransitions: 0,\n pointerIntervals: [],\n keyIntervals: [],\n firstPointerSample: null,\n lastPointerSample: null,\n lastPointerAngle: null,\n lastScrollAt: null,\n lastKeyAt: null,\n };\n}\n\nfunction average(values: number[]): number | null {\n if (values.length === 0) return null;\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nfunction computeStraightness(\n firstPointerSample: PointerSample | null,\n lastPointerSample: PointerSample | null,\n pointerDistancePx: number,\n): number | null {\n if (!firstPointerSample || !lastPointerSample || pointerDistancePx <= 0) {\n return null;\n }\n const dx = lastPointerSample.x - firstPointerSample.x;\n const dy = lastPointerSample.y - firstPointerSample.y;\n const displacement = Math.hypot(dx, dy);\n return Math.min(1, displacement / pointerDistancePx);\n}\n\nfunction getTrackerState(): TrackerState | null {\n const globalState = globalThis as Record<string, unknown>;\n return (globalState[GLOBAL_TRACKER_KEY] as TrackerState | null) ?? null;\n}\n\nfunction setTrackerState(state: TrackerState): void {\n (globalThis as Record<string, unknown>)[GLOBAL_TRACKER_KEY] = state;\n}\n\nexport function primeBehaviorTracking(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n if (getTrackerState()) return;\n\n const state = createInitialState();\n setTrackerState(state);\n\n const trackPointer = (event: MouseEvent | PointerEvent): void => {\n const sample: PointerSample = {\n x: event.clientX ?? 0,\n y: event.clientY ?? 0,\n t: nowMs(),\n };\n\n state.pointerMoveCount += 1;\n if (!state.firstPointerSample) {\n state.firstPointerSample = sample;\n }\n\n if (state.lastPointerSample) {\n const dx = sample.x - state.lastPointerSample.x;\n const dy = sample.y - state.lastPointerSample.y;\n state.pointerDistancePx += Math.hypot(dx, dy);\n\n const dt = sample.t - state.lastPointerSample.t;\n if (dt > 0) {\n state.pointerIntervals.push(dt);\n }\n\n if (dx !== 0 || dy !== 0) {\n const angle = Math.atan2(dy, dx);\n if (\n state.lastPointerAngle !== null &&\n Math.abs(angle - state.lastPointerAngle) > MIN_DIRECTION_DELTA_RAD\n ) {\n state.pointerDirectionChanges += 1;\n }\n state.lastPointerAngle = angle;\n }\n }\n\n state.lastPointerSample = sample;\n };\n\n const trackClick = (): void => {\n state.clickCount += 1;\n };\n\n const trackScroll = (): void => {\n const at = nowMs();\n state.scrollEventCount += 1;\n if (state.lastScrollAt !== null && at - state.lastScrollAt <= 120) {\n state.scrollBurstCount += 1;\n }\n state.lastScrollAt = at;\n };\n\n const trackKey = (): void => {\n const at = nowMs();\n state.keyEventCount += 1;\n if (state.lastKeyAt !== null) {\n const dt = at - state.lastKeyAt;\n if (dt > 0) {\n state.keyIntervals.push(dt);\n }\n }\n state.lastKeyAt = at;\n };\n\n const trackInput = (): void => {\n state.inputEventCount += 1;\n };\n\n const trackFocus = (): void => {\n state.focusTransitions += 1;\n };\n\n const trackBlur = (): void => {\n state.blurTransitions += 1;\n };\n\n const trackVisibility = (): void => {\n state.visibilityTransitions += 1;\n };\n\n window.addEventListener(\"pointermove\", trackPointer, { passive: true, capture: true });\n window.addEventListener(\"click\", trackClick, { passive: true, capture: true });\n window.addEventListener(\"scroll\", trackScroll, { passive: true, capture: true });\n window.addEventListener(\"keydown\", trackKey, { passive: true, capture: true });\n window.addEventListener(\"input\", trackInput, { passive: true, capture: true });\n window.addEventListener(\"focus\", trackFocus, true);\n window.addEventListener(\"blur\", trackBlur, true);\n document.addEventListener(\"visibilitychange\", trackVisibility, true);\n}\n\nexport function collectBehaviorSnapshot(): BehaviorSnapshot | null {\n const state = getTrackerState();\n if (!state) return null;\n\n return {\n elapsedMs: Math.max(0, Math.round(nowMs() - state.installedAt)),\n pointerMoveCount: state.pointerMoveCount,\n pointerDistancePx: Math.round(state.pointerDistancePx),\n pointerDirectionChanges: state.pointerDirectionChanges,\n clickCount: state.clickCount,\n scrollEventCount: state.scrollEventCount,\n scrollBurstCount: state.scrollBurstCount,\n keyEventCount: state.keyEventCount,\n inputEventCount: state.inputEventCount,\n focusTransitions: state.focusTransitions,\n blurTransitions: state.blurTransitions,\n visibilityTransitions: state.visibilityTransitions,\n meanPointerIntervalMs: average(state.pointerIntervals),\n meanKeyIntervalMs: average(state.keyIntervals),\n pointerStraightness: computeStraightness(\n state.firstPointerSample,\n state.lastPointerSample,\n state.pointerDistancePx,\n ),\n };\n}\n\nexport function resetBehaviorTrackingForTests(): void {\n const globalState = globalThis as Record<string, unknown>;\n delete globalState[GLOBAL_TRACKER_KEY];\n}\n","import type { BehavioralRiskSignal, SignalResult } from \"../types\";\nimport { sha256 } from \"../hash\";\nimport {\n collectBehaviorSnapshot,\n primeBehaviorTracking,\n} from \"./behaviorTracker\";\n\nexport async function collectBehavioralRisk(): Promise<\n SignalResult<BehavioralRiskSignal> | null\n> {\n const start = performance.now();\n\n try {\n primeBehaviorTracking();\n const snapshot = collectBehaviorSnapshot();\n if (!snapshot) return null;\n\n const totalEventCount =\n snapshot.pointerMoveCount +\n snapshot.clickCount +\n snapshot.scrollEventCount +\n snapshot.keyEventCount +\n snapshot.inputEventCount;\n const reasons: string[] = [];\n let riskScore = 0;\n let classification: BehavioralRiskSignal[\"classification\"] =\n \"insufficient_data\";\n\n if (snapshot.elapsedMs >= 750 && totalEventCount >= 2) {\n classification = totalEventCount < 4 ? \"low_interaction\" : \"human_like\";\n\n if (\n snapshot.pointerMoveCount >= 8 &&\n snapshot.pointerStraightness !== null &&\n snapshot.pointerStraightness > 0.985 &&\n snapshot.pointerDirectionChanges <= 1\n ) {\n reasons.push(\"low_pointer_curvature\");\n riskScore += 0.24;\n }\n\n if (snapshot.scrollEventCount >= 8 && snapshot.scrollBurstCount >= 3) {\n reasons.push(\"scroll_burst\");\n riskScore += 0.16;\n }\n\n if (\n snapshot.keyEventCount >= 4 &&\n snapshot.meanKeyIntervalMs !== null &&\n snapshot.meanKeyIntervalMs < 25\n ) {\n reasons.push(\"unusually_fast_typing\");\n riskScore += 0.22;\n }\n\n if (\n snapshot.focusTransitions + snapshot.blurTransitions >= 4 &&\n snapshot.elapsedMs < 2500\n ) {\n reasons.push(\"rapid_focus_switches\");\n riskScore += 0.12;\n }\n\n if (riskScore >= 0.45 && totalEventCount >= 5) {\n classification = \"synthetic_like\";\n }\n }\n\n const value: BehavioralRiskSignal = {\n elapsedMs: snapshot.elapsedMs,\n totalEventCount,\n pointerMoveCount: snapshot.pointerMoveCount,\n pointerDistancePx: snapshot.pointerDistancePx,\n pointerDirectionChanges: snapshot.pointerDirectionChanges,\n pointerStraightness: snapshot.pointerStraightness,\n clickCount: snapshot.clickCount,\n scrollEventCount: snapshot.scrollEventCount,\n scrollBurstCount: snapshot.scrollBurstCount,\n keyEventCount: snapshot.keyEventCount,\n inputEventCount: snapshot.inputEventCount,\n focusTransitions: snapshot.focusTransitions,\n blurTransitions: snapshot.blurTransitions,\n visibilityTransitions: snapshot.visibilityTransitions,\n meanPointerIntervalMs: snapshot.meanPointerIntervalMs,\n meanKeyIntervalMs: snapshot.meanKeyIntervalMs,\n classification,\n riskScore: Number(riskScore.toFixed(2)),\n reasons,\n hash: \"\",\n };\n\n value.hash = await sha256(\n [\n `elapsedMs:${value.elapsedMs}`,\n `totalEventCount:${value.totalEventCount}`,\n `pointerMoveCount:${value.pointerMoveCount}`,\n `pointerDistancePx:${value.pointerDistancePx}`,\n `pointerDirectionChanges:${value.pointerDirectionChanges}`,\n `pointerStraightness:${String(value.pointerStraightness ?? \"\")}`,\n `clickCount:${value.clickCount}`,\n `scrollEventCount:${value.scrollEventCount}`,\n `scrollBurstCount:${value.scrollBurstCount}`,\n `keyEventCount:${value.keyEventCount}`,\n `inputEventCount:${value.inputEventCount}`,\n `focusTransitions:${value.focusTransitions}`,\n `blurTransitions:${value.blurTransitions}`,\n `visibilityTransitions:${value.visibilityTransitions}`,\n `meanPointerIntervalMs:${String(value.meanPointerIntervalMs ?? \"\")}`,\n `meanKeyIntervalMs:${String(value.meanKeyIntervalMs ?? \"\")}`,\n `classification:${value.classification}`,\n `riskScore:${value.riskScore}`,\n `reasons:${value.reasons.join(\",\")}`,\n ].join(\"|\"),\n );\n\n return {\n value,\n duration: performance.now() - start,\n };\n } catch {\n return null;\n }\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface IncognitoSignal {\n isPrivate: boolean;\n method: string | null;\n}\n\nexport async function collectIncognito(): Promise<SignalResult<IncognitoSignal>> {\n const start = performance.now();\n let isPrivate = false;\n let method: string | null = null;\n\n // Method 1: Storage quota estimation\n // Incognito mode typically limits quota to ~120MB vs ~1GB+ in normal mode\n try {\n if (navigator.storage && navigator.storage.estimate) {\n const estimate = await navigator.storage.estimate();\n if (estimate.quota && estimate.quota < 200 * 1024 * 1024) {\n isPrivate = true;\n method = \"storage_quota\";\n }\n }\n } catch { /* ignore */ }\n\n // Method 2: Firefox - indexedDB.databases() throws in private mode\n if (!isPrivate) {\n try {\n const idb = globalThis.indexedDB as unknown as Record<string, unknown>;\n if (typeof idb?.databases === \"function\") {\n await (idb.databases as () => Promise<unknown>)();\n }\n } catch {\n isPrivate = true;\n method = \"indexeddb_databases\";\n }\n }\n\n // Method 3: Safari/legacy - webkitRequestFileSystem throws in incognito\n if (!isPrivate) {\n try {\n const win = globalThis as unknown as Record<string, unknown>;\n if (typeof win.webkitRequestFileSystem === \"function\") {\n await new Promise<void>((resolve, reject) => {\n (win.webkitRequestFileSystem as Function)(\n 0, // TEMPORARY\n 1,\n () => resolve(),\n () => reject(new Error(\"filesystem_denied\")),\n );\n });\n }\n } catch {\n isPrivate = true;\n method = \"webkit_filesystem\";\n }\n }\n\n return {\n value: { isPrivate, method },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface DevToolsSignal {\n isOpen: boolean;\n indicators: string[];\n}\n\nexport async function collectDevTools(): Promise<SignalResult<DevToolsSignal>> {\n const start = performance.now();\n const indicators: string[] = [];\n\n // Method 1: debugger statement timing\n // When DevTools is open, the debugger statement pauses execution (>100ms)\n try {\n const t0 = performance.now();\n new Function(\"debugger\")();\n const elapsed = performance.now() - t0;\n if (elapsed > 100) {\n indicators.push(\"debugger_timing\");\n }\n } catch { /* ignore */ }\n\n // Method 2: Window outer vs inner size differential\n // DevTools panels take up space, causing a large diff between outer and inner dimensions\n try {\n const widthDiff = window.outerWidth - window.innerWidth;\n const heightDiff = window.outerHeight - window.innerHeight;\n if (widthDiff > 160 || heightDiff > 200) {\n indicators.push(\"window_size_diff\");\n }\n } catch { /* ignore */ }\n\n // Method 3: console.log with getter side-effect object\n // DevTools eagerly evaluates logged objects, triggering the getter\n try {\n let consoleTriggered = false;\n const element = new Image();\n Object.defineProperty(element, \"id\", {\n get() {\n consoleTriggered = true;\n return \"devtools-detect\";\n },\n });\n console.log(\"%c\", element as unknown as string);\n if (consoleTriggered) {\n indicators.push(\"console_getter\");\n }\n } catch { /* ignore */ }\n\n // Method 4: Element ID getter fires when DevTools inspects DOM\n try {\n let idGetterFired = false;\n const el = document.createElement(\"div\");\n Object.defineProperty(el, \"id\", {\n get() {\n idGetterFired = true;\n return \"devtools-trap\";\n },\n configurable: true,\n });\n console.debug(el);\n if (idGetterFired) {\n indicators.push(\"element_id_getter\");\n }\n } catch { /* ignore */ }\n\n return {\n value: {\n isOpen: indicators.length >= 1,\n indicators,\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface VirtualizationSignal {\n vmDetected: boolean;\n emulatorDetected: boolean;\n indicators: string[];\n confidence: \"low\" | \"medium\" | \"high\";\n}\n\nconst VM_RENDERER_PATTERNS = [\n \"swiftshader\",\n \"llvmpipe\",\n \"virtualbox\",\n \"vmware\",\n \"parallels\",\n \"microsoft basic render\",\n \"hyper-v\",\n \"qemu\",\n];\n\nconst VM_SCREEN_RESOLUTIONS = [\n [1024, 768],\n [800, 600],\n];\n\nconst EMULATOR_SCREEN_RESOLUTIONS = [\n [360, 640],\n [412, 915],\n];\n\nexport async function collectVirtualization(): Promise<SignalResult<VirtualizationSignal>> {\n const start = performance.now();\n const vmIndicators: string[] = [];\n const emulatorIndicators: string[] = [];\n\n // --- VM Heuristics ---\n\n // 1. WebGL renderer matches VM patterns\n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n if (gl) {\n const glCtx = gl as WebGLRenderingContext;\n const debugExt = glCtx.getExtension(\"WEBGL_debug_renderer_info\");\n if (debugExt) {\n const renderer = glCtx.getParameter(debugExt.UNMASKED_RENDERER_WEBGL)?.toLowerCase() ?? \"\";\n const vendor = glCtx.getParameter(debugExt.UNMASKED_VENDOR_WEBGL)?.toLowerCase() ?? \"\";\n const combined = renderer + \" \" + vendor;\n for (const pattern of VM_RENDERER_PATTERNS) {\n if (combined.includes(pattern)) {\n vmIndicators.push(\"vm_renderer:\" + pattern);\n break;\n }\n }\n }\n }\n } catch { /* ignore */ }\n\n // 2. Low hardware specs: hardwareConcurrency === 1 AND deviceMemory <= 2\n try {\n const cores = navigator.hardwareConcurrency ?? 0;\n const mem = (navigator as unknown as Record<string, unknown>).deviceMemory as number | undefined;\n if (cores === 1 && typeof mem === \"number\" && mem <= 2) {\n vmIndicators.push(\"low_hw_specs\");\n }\n } catch { /* ignore */ }\n\n // 3. Battery always-plugged profile\n try {\n const nav = navigator as unknown as Record<string, Function>;\n if (typeof nav.getBattery === \"function\") {\n const battery = await nav.getBattery() as {\n charging: boolean;\n level: number;\n chargingTime: number;\n dischargingTime: number;\n };\n if (\n battery.charging === true &&\n battery.level === 1 &&\n battery.chargingTime === 0 &&\n battery.dischargingTime === Infinity\n ) {\n vmIndicators.push(\"battery_always_plugged\");\n }\n }\n } catch { /* ignore */ }\n\n // 4. Performance.now() timing jitter (stddev > 0.5ms over 10 samples)\n try {\n const samples: number[] = [];\n for (let i = 0; i < 10; i++) {\n const t0 = performance.now();\n // Small busy loop to create a measurable interval\n let x = 0;\n for (let j = 0; j < 1000; j++) x += j;\n void x;\n samples.push(performance.now() - t0);\n }\n const mean = samples.reduce((a, b) => a + b, 0) / samples.length;\n const variance = samples.reduce((a, b) => a + (b - mean) ** 2, 0) / samples.length;\n const stddev = Math.sqrt(variance);\n if (stddev > 0.5) {\n vmIndicators.push(\"timing_jitter\");\n }\n } catch { /* ignore */ }\n\n // 5. Common VM screen resolutions with DPR 1\n try {\n const w = screen.width;\n const h = screen.height;\n const dpr = window.devicePixelRatio;\n if (dpr === 1) {\n for (const [rw, rh] of VM_SCREEN_RESOLUTIONS) {\n if (w === rw && h === rh) {\n vmIndicators.push(\"vm_screen_resolution:\" + rw + \"x\" + rh);\n break;\n }\n }\n }\n } catch { /* ignore */ }\n\n // --- Emulator Heuristics ---\n\n // 6. maxTouchPoints > 0 but ontouchstart missing\n try {\n if (navigator.maxTouchPoints > 0 && !(\"ontouchstart\" in window)) {\n emulatorIndicators.push(\"touch_mismatch\");\n }\n } catch { /* ignore */ }\n\n // 7. Mobile UA but desktop-class specs (cores > 8 or memory > 8)\n try {\n const ua = navigator.userAgent.toLowerCase();\n const isMobileUA = /android|iphone|ipad|ipod|mobile/.test(ua);\n if (isMobileUA) {\n const cores = navigator.hardwareConcurrency ?? 0;\n const mem = (navigator as unknown as Record<string, unknown>).deviceMemory as number | undefined;\n if (cores > 8 || (typeof mem === \"number\" && mem > 8)) {\n emulatorIndicators.push(\"mobile_ua_desktop_specs\");\n }\n }\n } catch { /* ignore */ }\n\n // 8. Exact emulator screen sizes with DPR 1\n try {\n const w = screen.width;\n const h = screen.height;\n const dpr = window.devicePixelRatio;\n if (dpr === 1) {\n for (const [rw, rh] of EMULATOR_SCREEN_RESOLUTIONS) {\n if (w === rw && h === rh) {\n emulatorIndicators.push(\"emulator_screen_resolution:\" + rw + \"x\" + rh);\n break;\n }\n }\n }\n } catch { /* ignore */ }\n\n // --- Compute results ---\n const allIndicators = [...vmIndicators, ...emulatorIndicators];\n const vmDetected = vmIndicators.length >= 2;\n const emulatorDetected = emulatorIndicators.length >= 2 || (emulatorIndicators.length >= 1 && vmIndicators.length >= 1);\n\n let confidence: \"low\" | \"medium\" | \"high\";\n if (allIndicators.length >= 3) {\n confidence = \"high\";\n } else if (allIndicators.length === 2) {\n confidence = \"medium\";\n } else {\n confidence = \"low\";\n }\n\n return {\n value: {\n vmDetected,\n emulatorDetected,\n indicators: allIndicators,\n confidence,\n },\n duration: performance.now() - start,\n };\n}\n","import type { SignalResult } from \"../types\";\n\nexport interface RootedSignal {\n detected: boolean;\n confidence: \"low\" | \"medium\";\n indicators: string[];\n}\n\nconst ROOT_FRAMEWORK_GLOBALS = [\n \"__xposed\",\n \"Xposed\",\n \"XposedBridge\",\n \"SuperSU\",\n \"MagiskManager\",\n \"magisk\",\n \"daemonsu\",\n \"rootCloak\",\n];\n\nconst BUILD_ANOMALY_PATTERNS = [\n \"lineage\",\n \"unofficial\",\n \"userdebug\",\n \"cyanogen\",\n];\n\nexport async function collectRooted(): Promise<SignalResult<RootedSignal>> {\n const start = performance.now();\n const indicators: string[] = [];\n\n // 1. Check for root framework globals on window and navigator\n try {\n const win = globalThis as unknown as Record<string, unknown>;\n const nav = navigator as unknown as Record<string, unknown>;\n for (const name of ROOT_FRAMEWORK_GLOBALS) {\n if (win[name] !== undefined || nav[name] !== undefined) {\n indicators.push(\"root_global:\" + name);\n }\n }\n } catch { /* ignore */ }\n\n // 2. Navigator prototype has >5 non-standard/unusual properties\n try {\n const standardProps = new Set([\n \"appCodeName\", \"appName\", \"appVersion\", \"cookieEnabled\", \"credentials\",\n \"doNotTrack\", \"geolocation\", \"hardwareConcurrency\", \"language\", \"languages\",\n \"locks\", \"maxTouchPoints\", \"mediaCapabilities\", \"mediaDevices\", \"mediaSession\",\n \"mimeTypes\", \"onLine\", \"pdfViewerEnabled\", \"permissions\", \"platform\",\n \"plugins\", \"product\", \"productSub\", \"serviceWorker\", \"storage\",\n \"usb\", \"userActivation\", \"userAgent\", \"vendor\", \"vendorSub\",\n \"webdriver\", \"bluetooth\", \"clipboard\", \"connection\", \"contacts\",\n \"deviceMemory\", \"getBattery\", \"getGamepads\", \"getUserMedia\",\n \"hid\", \"ink\", \"keyboard\", \"managed\", \"presentation\",\n \"registerProtocolHandler\", \"requestMIDIAccess\", \"requestMediaKeySystemAccess\",\n \"scheduling\", \"sendBeacon\", \"serial\", \"setAppBadge\", \"share\",\n \"vibrate\", \"virtualKeyboard\", \"wakeLock\", \"windowControlsOverlay\",\n \"xr\", \"gpu\", \"login\", \"deprecatedReplaceInURN\", \"deprecatedRunAdAuctionEnforcesKAnonymity\",\n \"deprecatedURNToURL\", \"javaEnabled\", \"canShare\", \"clearAppBadge\",\n \"getAutoplayPolicy\", \"getInstalledRelatedApps\", \"unregisterProtocolHandler\",\n \"constructor\", \"toString\", \"toJSON\",\n ]);\n const navProto = Object.getOwnPropertyNames(Navigator.prototype);\n const nonStandard = navProto.filter((p) => !standardProps.has(p));\n if (nonStandard.length > 5) {\n indicators.push(\"nav_proto_non_standard:\" + nonStandard.length);\n }\n } catch { /* ignore */ }\n\n // 3. UA build anomalies\n try {\n const ua = navigator.userAgent.toLowerCase();\n for (const pattern of BUILD_ANOMALY_PATTERNS) {\n if (ua.includes(pattern)) {\n indicators.push(\"build_anomaly:\" + pattern);\n }\n }\n } catch { /* ignore */ }\n\n const detected = indicators.length >= 1;\n const confidence: \"low\" | \"medium\" = indicators.length >= 2 ? \"medium\" : \"low\";\n\n return {\n value: {\n detected,\n confidence,\n indicators,\n },\n duration: performance.now() - start,\n };\n}\n","import type { ClientSignals } from \"./types\";\nimport { collectCanvas } from \"./signals/canvas\";\nimport { collectWebGL } from \"./signals/webgl\";\nimport { collectWebGPU } from \"./signals/webgpu\";\nimport { collectAudio } from \"./signals/audio\";\nimport { collectFonts } from \"./signals/fonts\";\nimport { collectWebRTC } from \"./signals/webrtc\";\nimport { collectWasmTiming } from \"./signals/wasm\";\nimport { collectNavigator } from \"./signals/navigator\";\nimport { collectMedia } from \"./signals/media\";\nimport { collectScreen } from \"./signals/screen\";\nimport { collectIntegrity } from \"./signals/integrity\";\nimport { collectWallets } from \"./signals/wallets\";\nimport { collectStorage } from \"./signals/storage\";\nimport { collectMath } from \"./signals/math\";\nimport { collectDOMRect } from \"./signals/domrect\";\nimport { collectHeadless } from \"./signals/headless\";\nimport { collectSpeech } from \"./signals/speech\";\nimport { collectIntl } from \"./signals/intl\";\nimport { collectTimezone } from \"./signals/timezone\";\nimport { collectCssStyle } from \"./signals/cssStyle\";\nimport { collectErrors } from \"./signals/errors\";\nimport { collectWorkerScope } from \"./signals/workerScope\";\nimport { collectResistance } from \"./signals/resistance\";\nimport { collectSvg } from \"./signals/svg\";\nimport { collectWindowFeatures } from \"./signals/windowFeatures\";\nimport { collectHtmlElement } from \"./signals/htmlElement\";\nimport { collectCodecs } from \"./signals/codecs\";\nimport { collectStatus } from \"./signals/status\";\nimport { collectPlatformFeatures } from \"./signals/platformFeatures\";\nimport { collectUaClientHints } from \"./signals/uaClientHints\";\nimport { collectCapabilityVector } from \"./signals/capabilityVector\";\nimport { collectGeometryVector } from \"./signals/geometryVector\";\nimport { collectRuntimeVector } from \"./signals/runtimeVector\";\nimport { collectSensorCapabilities } from \"./signals/sensorCapabilities\";\nimport { collectBehavioralRisk } from \"./signals/behavioralRisk\";\nimport { collectIncognito } from \"./signals/incognito\";\nimport { collectDevTools } from \"./signals/devTools\";\nimport { collectVirtualization } from \"./signals/virtualization\";\nimport { collectRooted } from \"./signals/rooted\";\nimport { primeBehaviorTracking } from \"./signals/behaviorTracker\";\n\ninterface CollectOptions {\n detectWallets: boolean;\n}\n\nexport async function collectAllSignals(options: CollectOptions): Promise<ClientSignals> {\n primeBehaviorTracking();\n\n const [\n canvas, webgl, webgpu, audio, fonts, webrtc, wasmTiming,\n navigator, media, screen, integrity, wallets, storage,\n math, domRect, headless,\n speech, intl, timezone, cssStyle, error, workerScope, resistance,\n svg, windowFeatures, htmlElement, codec, status, platformFeatures,\n uaClientHints, capabilityVector, geometryVector, runtimeVector,\n sensorCapabilities, behavioralRisk,\n incognito, devTools, virtualization, rooted,\n ] = await Promise.all([\n collectCanvas(), collectWebGL(), collectWebGPU(), collectAudio(),\n collectFonts(), collectWebRTC(), collectWasmTiming(), collectNavigator(),\n collectMedia(), collectScreen(), collectIntegrity(),\n options.detectWallets ? collectWallets() : Promise.resolve(null),\n collectStorage(),\n collectMath(), collectDOMRect(), collectHeadless(),\n collectSpeech(), collectIntl(), collectTimezone(), collectCssStyle(),\n collectErrors(), collectWorkerScope(), collectResistance(),\n collectSvg(), collectWindowFeatures(), collectHtmlElement(),\n collectCodecs(), collectStatus(), collectPlatformFeatures(),\n collectUaClientHints(),\n collectCapabilityVector(), collectGeometryVector(), collectRuntimeVector(),\n collectSensorCapabilities(), collectBehavioralRisk(),\n collectIncognito(), collectDevTools(), collectVirtualization(), collectRooted(),\n ]);\n\n if (integrity?.value) {\n integrity.value.workerMismatch = (workerScope?.value?.mismatches.length ?? 0) > 0;\n }\n\n return {\n canvas, webgl, webgpu, audio, fonts, webrtc, wasmTiming,\n navigator, media, screen, integrity, wallets, storage,\n math, domRect, headless,\n speech, intl, timezone, cssStyle, error, workerScope, resistance,\n svg, windowFeatures, htmlElement, codec, status, platformFeatures,\n uaClientHints, capabilityVector, geometryVector, runtimeVector,\n sensorCapabilities, behavioralRisk,\n incognito, devTools, virtualization, rooted,\n };\n}\n","import type { WalletConnection } from \"../types\";\n\nconst discoveredAddresses = new Set<string>();\nconst connections: WalletConnection[] = [];\nlet listening = false;\n\nfunction normalizeAddress(addr: string): string {\n return addr.toLowerCase();\n}\n\nfunction addConnection(address: string, chain: \"evm\" | \"solana\", provider: string, method: WalletConnection[\"method\"]) {\n const norm = normalizeAddress(address);\n if (discoveredAddresses.has(norm)) return;\n discoveredAddresses.add(norm);\n connections.push({ address: norm, chain, provider, method });\n}\n\nasync function checkPreConnected() {\n const g = globalThis as Record<string, unknown>;\n const ethereum = g[\"ethereum\"] as { request?: (args: { method: string }) => Promise<string[]> } | undefined;\n if (ethereum?.request) {\n try {\n const accounts = await ethereum.request({ method: \"eth_accounts\" });\n if (Array.isArray(accounts)) {\n for (const addr of accounts) {\n if (typeof addr === \"string\" && addr.startsWith(\"0x\")) {\n addConnection(addr, \"evm\", \"ethereum\", \"pre-connected\");\n }\n }\n }\n } catch { /* silent */ }\n }\n\n const solana = g[\"solana\"] as { publicKey?: { toBase58?: () => string }; isConnected?: boolean } | undefined;\n if (solana?.isConnected && solana?.publicKey?.toBase58) {\n try {\n const addr = solana.publicKey.toBase58();\n if (addr) addConnection(addr, \"solana\", \"solana\", \"pre-connected\");\n } catch { /* silent */ }\n }\n\n const phantom = g[\"phantom\"] as { solana?: typeof solana } | undefined;\n if (phantom?.solana?.isConnected && phantom?.solana?.publicKey?.toBase58) {\n try {\n const addr = phantom.solana.publicKey.toBase58();\n if (addr) addConnection(addr, \"solana\", \"Phantom\", \"pre-connected\");\n } catch { /* silent */ }\n }\n}\n\nfunction attachListeners() {\n if (listening) return;\n listening = true;\n const g = globalThis as Record<string, unknown>;\n\n const ethereum = g[\"ethereum\"] as { on?: (event: string, cb: (accounts: string[]) => void) => void } | undefined;\n if (ethereum?.on) {\n ethereum.on(\"accountsChanged\", (accounts: string[]) => {\n for (const addr of accounts) {\n if (typeof addr === \"string\" && addr.startsWith(\"0x\")) {\n addConnection(addr, \"evm\", \"ethereum\", \"listener\");\n }\n }\n });\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"eip6963:announceProvider\", (event: Event) => {\n const e = event as Event & { detail?: { info?: { name?: string }; provider?: { on?: (event: string, cb: (accounts: string[]) => void) => void; request?: (args: { method: string }) => Promise<string[]> } } };\n const provider = e.detail?.provider;\n const name = e.detail?.info?.name ?? \"unknown\";\n\n if (provider?.on) {\n provider.on(\"accountsChanged\", (accounts: string[]) => {\n for (const addr of accounts) {\n if (typeof addr === \"string\" && addr.startsWith(\"0x\")) {\n addConnection(addr, \"evm\", name, \"listener\");\n }\n }\n });\n }\n\n if (provider?.request) {\n provider.request({ method: \"eth_accounts\" }).then((accounts) => {\n if (Array.isArray(accounts)) {\n for (const addr of accounts) {\n if (typeof addr === \"string\" && addr.startsWith(\"0x\")) {\n addConnection(addr, \"evm\", name, \"pre-connected\");\n }\n }\n }\n }).catch(() => { /* silent */ });\n }\n });\n }\n\n const solana = g[\"solana\"] as { on?: (event: string, cb: () => void) => void; publicKey?: { toBase58?: () => string } } | undefined;\n if (solana?.on) {\n solana.on(\"connect\", () => {\n if (solana?.publicKey?.toBase58) {\n try {\n const addr = solana.publicKey.toBase58();\n if (addr) addConnection(addr, \"solana\", \"solana\", \"listener\");\n } catch { /* silent */ }\n }\n });\n }\n}\n\nexport function initWalletListener() {\n if (typeof window === \"undefined\") return;\n checkPreConnected();\n attachListeners();\n}\n\nexport function getDiscoveredAddresses(): string[] {\n return Array.from(discoveredAddresses);\n}\n\nexport function getWalletConnections(): WalletConnection[] {\n return [...connections];\n}\n\nexport async function requestWalletConnection(): Promise<string | null> {\n const g = globalThis as Record<string, unknown>;\n const ethereum = g[\"ethereum\"] as { request?: (args: { method: string }) => Promise<string[]> } | undefined;\n if (!ethereum?.request) return null;\n try {\n const accounts = await ethereum.request({ method: \"eth_requestAccounts\" });\n if (Array.isArray(accounts) && accounts[0]) {\n addConnection(accounts[0], \"evm\", \"ethereum\", \"manual\");\n return normalizeAddress(accounts[0]);\n }\n } catch { /* user rejected */ }\n return null;\n}\n","import type { FingerprintIQConfig, IdentifyResponse, IdentifyPayload } from \"./types\";\nimport { collectAllSignals } from \"./collect\";\nimport { primeBehaviorTracking } from \"./signals/behaviorTracker\";\nimport { initWalletListener, getDiscoveredAddresses } from \"./signals/wallet-connect\";\n\nconst DEFAULT_ENDPOINT = \"https://api.fingerprintiq.com\";\nconst DEFAULT_TIMEOUT = 10_000;\nconst CH_BOOTSTRAP_KEY = \"__fiq_ua_ch_bootstrapped__\";\n\nexport default class FingerprintIQ {\n private readonly apiKey: string;\n private readonly endpoint: string;\n private readonly timeout: number;\n private readonly detectWallets: boolean;\n\n constructor(config: FingerprintIQConfig) {\n if (!config.apiKey) throw new Error(\"apiKey is required\");\n this.apiKey = config.apiKey;\n this.endpoint = (config.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, \"\");\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.detectWallets = config.detectWallets ?? true;\n primeBehaviorTracking();\n initWalletListener();\n }\n\n private async ensureClientHintsBootstrapped(): Promise<void> {\n if (typeof navigator === \"undefined\") return;\n\n const nav = navigator as Navigator & { userAgentData?: unknown };\n if (!nav.userAgentData) return;\n\n try {\n if (\n typeof sessionStorage !== \"undefined\" &&\n sessionStorage.getItem(CH_BOOTSTRAP_KEY) === \"1\"\n ) {\n return;\n }\n } catch {\n // Ignore storage failures and continue.\n }\n\n try {\n await fetch(`${this.endpoint}/v1/bootstrap`, {\n method: \"GET\",\n credentials: \"include\",\n keepalive: true,\n });\n try {\n if (typeof sessionStorage !== \"undefined\") {\n sessionStorage.setItem(CH_BOOTSTRAP_KEY, \"1\");\n }\n } catch {\n // Ignore storage failures; the optimization is best-effort.\n }\n } catch {\n // Best-effort bootstrap only.\n }\n }\n\n async identify(): Promise<IdentifyResponse> {\n await this.ensureClientHintsBootstrapped();\n const signals = await collectAllSignals({ detectWallets: this.detectWallets });\n const payload: IdentifyPayload = {\n signals, timestamp: Date.now(),\n url: typeof location !== \"undefined\" ? location.href : \"\",\n referrer: typeof document !== \"undefined\" ? document.referrer : \"\",\n };\n\n const walletAddrs = getDiscoveredAddresses();\n if (walletAddrs.length > 0) {\n payload.walletAddresses = walletAddrs;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.endpoint}/v1/identify`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-API-Key\": this.apiKey },\n body: JSON.stringify(payload),\n signal: controller.signal,\n credentials: \"include\",\n });\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"Unknown error\");\n throw new Error(`FingerprintIQ API error (${response.status}): ${errorBody}`);\n }\n return (await response.json()) as IdentifyResponse;\n } finally { clearTimeout(timeoutId); }\n }\n}\n\nexport type { FingerprintIQConfig, IdentifyResponse, ClientSignals, CanvasSignal, WebGLSignal, WebGPUSignal, AudioSignal, FontSignal, WebRTCSignal, WasmTimingSignal, NavigatorSignal, MediaSignal, ScreenSignal, IntegritySignal, WalletSignal, StorageSignal, MathSignal, DOMRectSignal, HeadlessSignal, SpeechSignal, IntlSignal, TimezoneSignal, CssStyleSignal, ErrorSignal, WorkerScopeSignal, ResistanceSignal, SvgSignal, WindowFeaturesSignal, HtmlElementSignal, CodecSignal, StatusSignal, PlatformFeaturesSignal, UAClientHintsSignal, UAClientHintsBrand, CapabilityVectorSignal, GeometryVectorSignal, RuntimeVectorSignal, SensorCapabilitiesSignal, BehavioralRiskSignal } from \"./types\";\nexport { requestWalletConnection, getDiscoveredAddresses } from \"./signals/wallet-connect\";\n"],"mappings":"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","names":["sha256","input","data","hashBuffer","hashArray","b","renderScene","ctx","canvas","gradient","shouldSkipCanvas","ua","safariMatch","firefoxMatch","collectCanvas","start","renders","i","isFarbled","r","sha256","SOFTWARE_RENDERERS","GL_PARAMS","measureGpuTiming","gl","vs","fs","program","start","elapsed","collectWebGL","dbgExt","renderer","vendor","extensions","params","p","val","isSoftwareRenderer","sr","gpuTimingMs","EMPTY_SIGNAL","collectWebGPU","start","adapter","info","features","getOfflineAudioContext","collectAudio","start","AudioCtxClass","ctx","oscillator","compressor","channelData","hashInput","v","hash","sha256","sampleRate","maxChannelCount","isSuspended","TEST_FONTS","BASE_FONTS","TEST_STRING","TEST_SIZE","measureWidth","fontFamily","span","width","collectFonts","start","baseWidths","f","detected","font","allSameWidth","allDetected","isSpoofed","LOCAL_IP_REGEX","PRIVATE_IP_REGEX","CANDIDATE_TYPE_REGEX","collectWebRTC","start","pc","candidates","localIps","candidateTypes","gatheringComplete","resolve","timeout","event","candidateStr","typeMatch","ipMatch","offer","localIpHash","prefix","sha256","median","values","sorted","a","b","mid","stddev","mean","variance","sum","v","buildWasmModule","collectWasmTiming","start","wasmBytes","module","bench","timings","i","t0","med","sd","collectNavigator","start","nav","hardwareConcurrency","deviceMemory","maxTouchPoints","languages","platform","cookieEnabled","doNotTrack","keyboardLayout","keyboard","layoutMap","connectionType","hasBluetooth","hasUsb","hasHid","hasSerial","hasWakeLock","hasGpu","bluetoothAvailable","bluetooth","query","mq","firstMatch","queries","value","collectMedia","start","colorScheme","contrast","forcedColors","pointer","hover","displayMode","reducedMotion","colorGamut","FIREFOX_RFP_WIDTHS","collectScreen","start","width","height","availWidth","availHeight","colorDepth","pixelRatio","isFirefoxRfp","NATIVE_CODE_REGEX","isNative","fn","checkPropertyDescriptors","k","checkPrototypeChain","expectedProto","getApiChecks","checks","fnProto","hwDesc","langDesc","uaDesc","collectIntegrity","start","tamperedApis","lieScore","check","toStringStr","classifyWallet","name","lower","discoverEIP6963Providers","resolve","discovered","handler","event","e","tryGetMetaMaskVersion","ethereum","version","collectWallets","start","detected","evmProviders","solanaProviders","versions","eip6963Names","g","solana","phantom","phantomSolana","FIQ_VID_KEY","TEST_KEY","testStorage","storage","testCookies","testValue","found","testIndexedDB","resolve","timeout","req","getSurvivingMechanisms","surviving","collectStorage","start","localStorageAvailable","sessionStorageAvailable","cookieAvailable","indexedDbAvailable","survivingMechanisms","MATH_TESTS","collectMath","start","values","fn","hashInput","v","data","hashBuffer","hash","b","TEST_ELEMENTS","EMOJI_TEST","hashRect","rect","str","data","buf","b","collectDOMRect","start","container","rectHashes","el","node","emojiSpan","emojiRect","emojiHash","combined","collectHeadless","start","markers","win","nav","desc","ua","claimsChrome","deviceMem","collectSpeech","start","voices","resolve","timeout","localVoices","v","remoteVoiceCount","defaultVoice","hashInput","hash","sha256","collectIntl","start","locales","parts","collator","dtf","formatted","displayNamesOutput","dn","us","jp","de","formattedList","lf","formattedNumber","nf","pr","p0","p1","p2","formattedRelativeTime","rtf","uniqueLocales","localeSpoofed","navLang","hash","sha256","collectTimezone","start","reported","offsetHistorical","computed","p","isSpoofed","currentOffset","testDate","utcStr","localStr","utcHour","localHour","impliedOffset","hash","sha256","SYSTEM_COLORS","SYSTEM_FONTS","collectCssStyle","start","propertyCount","el","colorValues","color","computed","fontValues","font","systemColorHash","sha256","systemFontHash","hash","collectErrors","e","a","b","sha256","WORKER_SCRIPT","collectWorkerScope","start","blob","url","workerData","resolve","worker","timeout","e","workerNavigator","workerWebGL","mismatches","mainLangs","workerLangs","gl","debugInfo","mainRenderer","mainVendor","measureTimerPrecision","samples","prev","i","now","delta","a","b","collectResistance","start","timerPrecisionMs","browser","nav","extensions","cbCanvas","cbCtx","url1","url2","gl","gpStr","pluginsDescriptor","collectSvg","start","svg","text","textLengths","bbox","computedLength","sub1","sub2","sha256","KNOWN_GLOBALS","collectWindowFeatures","start","props","propertyCount","webkitCount","mozCount","litterKeys","key","lower","capped","hash","sha256","collectHtmlElement","start","properties","proto","names","name","sorted","propertyCount","hash","sha256","MIME_TYPES","collectCodecs","start","matrix","video","mime","canPlay","mediaSource","mediaRecorder","hashInput","a","b","k","v","hash","sha256","collectStatus","start","timingResolution","minDelta","prev","i","now","delta","maxStackSize","recurse","depth","storageQuotaMB","estimate","battery","bat","heapLimit","mem","estimatePlatform","features","collectPlatformFeatures","start","estimatedPlatform","hashInput","a","b","k","v","hash","sha256","HIGH_ENTROPY_HINTS","normalizeBrands","brands","entry","a","b","collectUaClientHints","start","uaData","highEntropyValues","fullVersionList","formFactors","fingerprintParts","sha256","normalizePluginName","name","collectCapabilityVector","start","nav","plugins","normalizedPluginNames","plugin","hasPdfPlugin","pdfViewerEnabled","globalPrivacyControl","hasSpeechRecognition","value","hashInput","sha256","roundNumber","value","collectGeometryVector","start","viewport","visualViewport","hashInput","sha256","roundNumber","value","bucketedMemoryMb","collectRuntimeVector","start","nav","perf","connection","timingResolutionMs","minDelta","previous","i","current","delta","maxStackSize","recurse","depth","storageQuotaMB","estimate","hashInput","sha256","queryPermission","name","permissions","detectPolicyBlocked","key","Ctor","error","collectSensorCapabilities","start","apis","permissionStates","policyBlocked","value","hashInput","left","right","enabled","state","sha256","GLOBAL_TRACKER_KEY","MIN_DIRECTION_DELTA_RAD","nowMs","createInitialState","average","values","sum","value","computeStraightness","firstPointerSample","lastPointerSample","pointerDistancePx","dx","dy","displacement","getTrackerState","setTrackerState","state","primeBehaviorTracking","trackPointer","event","sample","dt","angle","trackClick","trackScroll","at","trackKey","trackInput","trackFocus","trackBlur","trackVisibility","collectBehaviorSnapshot","collectBehavioralRisk","start","primeBehaviorTracking","snapshot","collectBehaviorSnapshot","totalEventCount","reasons","riskScore","classification","value","sha256","collectIncognito","start","isPrivate","method","estimate","idb","win","resolve","reject","collectDevTools","start","indicators","t0","widthDiff","heightDiff","consoleTriggered","element","idGetterFired","el","VM_RENDERER_PATTERNS","VM_SCREEN_RESOLUTIONS","EMULATOR_SCREEN_RESOLUTIONS","collectVirtualization","start","vmIndicators","emulatorIndicators","canvas","gl","glCtx","debugExt","renderer","vendor","combined","pattern","cores","mem","nav","battery","samples","i","t0","x","j","mean","a","b","variance","w","h","rw","rh","ua","allIndicators","vmDetected","emulatorDetected","confidence","ROOT_FRAMEWORK_GLOBALS","BUILD_ANOMALY_PATTERNS","collectRooted","start","indicators","win","nav","name","standardProps","nonStandard","p","ua","pattern","detected","confidence","collectAllSignals","options","primeBehaviorTracking","canvas","webgl","webgpu","audio","fonts","webrtc","wasmTiming","navigator","media","screen","integrity","wallets","storage","math","domRect","headless","speech","intl","timezone","cssStyle","error","workerScope","resistance","svg","windowFeatures","htmlElement","codec","status","platformFeatures","uaClientHints","capabilityVector","geometryVector","runtimeVector","sensorCapabilities","behavioralRisk","incognito","devTools","virtualization","rooted","collectCanvas","collectWebGL","collectWebGPU","collectAudio","collectFonts","collectWebRTC","collectWasmTiming","collectNavigator","collectMedia","collectScreen","collectIntegrity","collectWallets","collectStorage","collectMath","collectDOMRect","collectHeadless","collectSpeech","collectIntl","collectTimezone","collectCssStyle","collectErrors","collectWorkerScope","collectResistance","collectSvg","collectWindowFeatures","collectHtmlElement","collectCodecs","collectStatus","collectPlatformFeatures","collectUaClientHints","collectCapabilityVector","collectGeometryVector","collectRuntimeVector","collectSensorCapabilities","collectBehavioralRisk","collectIncognito","collectDevTools","collectVirtualization","collectRooted","discoveredAddresses","connections","listening","normalizeAddress","addr","addConnection","address","chain","provider","method","norm","checkPreConnected","g","ethereum","accounts","solana","phantom","attachListeners","event","e","name","initWalletListener","getDiscoveredAddresses","requestWalletConnection","ethereum","accounts","addConnection","normalizeAddress","DEFAULT_ENDPOINT","DEFAULT_TIMEOUT","CH_BOOTSTRAP_KEY","FingerprintIQ","config","primeBehaviorTracking","initWalletListener","payload","collectAllSignals","walletAddrs","getDiscoveredAddresses","controller","timeoutId","response","errorBody"]}