@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
JavaScript
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
};