UNPKG

@marufme/device-key

Version:

A lightweight, modular TypeScript library for comprehensive device detection, fingerprinting, and information gathering in browsers. Features tree-shakeable modules for OS detection, browser analysis, network info, device fingerprinting, and more.

126 lines (125 loc) 4.87 kB
const c = () => { const e = navigator.userAgent, n = navigator.platform || "Unknown"; let t = "Unknown", i = "Unknown", o = "Unknown"; if (/Windows NT/.test(e)) { t = "Windows"; const r = e.match(/Windows NT (\d+\.\d+)/); r && (i = { "10.0": "10", "6.3": "8.1", "6.2": "8", "6.1": "7", "6.0": "Vista", "5.1": "XP" }[r[1]] || r[1]); } else if (/Mac OS X/.test(e)) { t = "macOS"; const r = e.match(/Mac OS X (\d+[_\.\d]+)/); r && (i = r[1].replace(/_/g, ".")); } else if (/Android/.test(e)) { t = "Android"; const r = e.match(/Android (\d+(\.\d+)?)/); r && (i = r[1]); } else if (/iPhone|iPad|iPod/.test(e)) { t = "iOS"; const r = e.match(/OS (\d+[_\.\d]+)/); r && (i = r[1].replace(/_/g, ".")); } else /Linux/.test(e) && (t = "Linux"); return e.includes("WOW64") || e.includes("Win64") || e.includes("x64") ? o = "64-bit" : e.includes("x86") || e.includes("i686") ? o = "32-bit" : o = "Unknown", { name: t, version: i, platform: n, architecture: o }; }, s = () => { const e = {}; return "connection" in navigator && (e.connectionType = navigator.connection.effectiveType), "hardwareConcurrency" in navigator && (e.cores = navigator.hardwareConcurrency), e; }, g = () => { const e = navigator.userAgent, n = navigator.vendor || "Unknown"; let t = "Unknown", i = "Unknown", o = "Unknown"; return e.includes("Edg") ? (t = "Edge", i = e.match(/Edg\/([\d.]+)/)?.[1] || "Unknown", o = "Blink") : e.includes("Chrome") && !e.includes("Edg") ? (t = "Chrome", i = e.match(/Chrome\/([\d.]+)/)?.[1] || "Unknown", o = "Blink") : e.includes("Firefox") ? (t = "Firefox", i = e.match(/Firefox\/([\d.]+)/)?.[1] || "Unknown", o = "Gecko") : e.includes("Safari") && !e.includes("Chrome") ? (t = "Safari", i = e.match(/Version\/([\d.]+)/)?.[1] || "Unknown", o = "WebKit") : (e.includes("Opera") || e.includes("OPR")) && (t = "Opera", i = e.match(/OPR\/([\d.]+)/)?.[1] || "Unknown", o = "Blink"), { name: t, version: i, engine: o, vendor: n }; }, d = async () => { let e = { level: 0, charging: !1, chargingTime: null }; if ("getBattery" in navigator) { const n = await navigator.getBattery(); e = { level: n.level * 100, // convert to percentage charging: n.charging, chargingTime: n.chargingTime && n.chargingTime !== 1 / 0 ? n.chargingTime : null }; } return e; }, a = "__did", l = async (e) => { const n = new TextEncoder().encode(e), t = await crypto.subtle.digest("SHA-256", n); return [...new Uint8Array(t)].map((i) => i.toString(16).padStart(2, "0")).join(""); }, u = () => { const e = navigator; return [ e.userAgent, e.platform, screen.width + "x" + screen.height, Intl.DateTimeFormat().resolvedOptions().timeZone, e.language, e.deviceMemory ?? "", e.hardwareConcurrency ?? "" ].join("::"); }, f = () => { const e = document.createElement("canvas"), n = e.getContext("2d"); return n ? (e.width = 200, e.height = 50, n.textBaseline = "top", n.font = "14px Arial", n.fillStyle = "#f60", n.fillRect(0, 0, 200, 50), n.fillStyle = "#069", n.fillText("canvas fingerprint test", 2, 2), e.toDataURL()) : ""; }, m = () => { const n = document.createElement("canvas").getContext("webgl"); if (!n) return ""; const t = n.getExtension("WEBGL_debug_renderer_info"), i = t ? n.getParameter(t.UNMASKED_VENDOR_WEBGL) : "", o = t ? n.getParameter(t.UNMASKED_RENDERER_WEBGL) : ""; return `${i}::${o}`; }, v = async () => { const e = u() + "|" + f() + "|" + m(); return l(e); }, w = async () => { let e = "server-mode"; if (typeof window < "u") { const n = localStorage.getItem(a); n ? e = n : (e = await v(), localStorage.setItem(a, e)); } return { deviceId: e }; }, h = () => ({ userAgent: navigator.userAgent }), y = async () => { const e = navigator.userAgent, n = /Mobi|Android/i.test(e) ? "Mobile" : /Tablet|iPad/i.test(e) ? "Tablet" : "Desktop"; let t = { width: window.screen.width, height: window.screen.height, pixelRatio: window.devicePixelRatio }; const i = navigator.hardwareConcurrency || 0, { deviceId: o } = await w(); return { deviceId: o, deviceType: n, hardwareConcurrency: i, screen: t, battery: await d() }; }, k = async () => { const e = c(), n = g(), t = s(), { userAgent: i } = h(), o = await y(); return { os: e, device: o, browser: n, network: t, userAgent: i, language: { current: navigator.language, types: Array.from(navigator.languages) }, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone }; }; export { k as default, v as generateFingerprint, d as getBatteryInfo, g as getBrowserInfo, f as getCanvasFingerprint, w as getDeviceId, k as getDeviceInfo, s as getNetworkInfo, c as getOSInfo, h as getUserAgent };