Fingerprint Pro Internals
Collector s26

Media devices

enumerateDevices output, device kinds and counts without labels

Group: Media and DRM · signal map · run it live

// s26 — sig_s26_mediaDevices
// module cm, stage2, codes 0 -1 -2 -3 -4 -5
//
// measures
//   navigator.mediaDevices navigator.mediaDevices.enumerateDevices
//   navigator.mediaDevices.enumerateDevices() navigator.permissions.query()
//   navigator.permissions.query navigator.permissions navigator
//   document.removeEventListener("visibilitychange") document.addEventListener("visibilitychange")
//   document.hidden TextEncoder clearTimeout()
// engine
//   Math.ceil() Object.assign() ArrayBuffer Object.getOwnPropertyNames() Object.getPrototypeOf()
//   Promise.race() Uint32Array Uint8Array
// reported value
//   call null
// probes
//   "96375" "camera" "denied" "function" "granted" "microphone" "prompt" "state"
// compares against
//   !== "granted" <= 0 == "function" === "denied" === "function" === "granted" === "prompt"
//   in "mediaDevices" in "permissions"
// decides on
//   !h_s26_mediaDevices() || !fn114()
//   v470 !== "granted"
//   v470 === "prompt"
//   fn142: !((v957 = arg822.cancel) == null)
//   fn157: v1032 = undefined, !v1034
//   fn157: v1033-- <= 0
//   fn157: !v1034
//   fn157: !(v1032 == null)
//   h_s26_mediaDevices: "mediaDevices" in navigator && navigator.mediaDevices !== undefined && typeof navigator.mediaDevices.enumerateDevices === "function"
//   fn114: "permissions" in navigator && readVaultedProp(navigator, "permissions") && typeof navigator.permissions.query === "function"
//   h_s26_fn: v898 === v899
//   h_s26_fn: v898 === "granted" || v899 === "granted"
//   h_s26_fn: v898 === "denied" || v899 === "denied"
//   visibilitychange: !(v869 || v868)
//   visibilitychange: !v869 && v868
//   readVaultedProp: typeof v316 == "function"
//
// 4 owned helpers inlined below.
// shared with other collectors, see agent.clean.js:
//   asUint8Array:6496 crc32OfBytes:4943 fn114:6193 fn142:7227 fn157:8239 fn158:8266 fn31:1619
//   fn48:3370 readVaultedProp:1674 resolveNameByHash:7015 stringToBytes:7901 visibilitychange:6423

// agent.clean.js:1573
function h_s26_mediaDevices() {
  return (
    "mediaDevices" in navigator &&
    navigator.mediaDevices !== undefined &&
    typeof navigator.mediaDevices.enumerateDevices === "function"
  );
}

// agent.clean.js:3106
function sig_s26_mediaDevices() {
  return fn142(fn157(300, 4, { s: -2, v: null }), async () => {
    if (!h_s26_mediaDevices() || !fn114()) {
      return { s: -1, v: null };
    }
    try {
      const v470 = await h_s26_fn();
      if (v470 !== "granted") {
        return { s: v470 === "prompt" ? -3 : -4, v: null };
      }
    } catch (v471) {
      return { s: -5, v: null };
    }
    return {
      s: 0,
      v: (await navigator.mediaDevices.enumerateDevices()).map((arg362) => ({
        d: arg362.deviceId,
        g: arg362.groupId,
        k: arg362.kind,
        l: arg362.label,
      })),
    };
  });
}

// agent.clean.js:4851
async function h_s26_permissionsQuery() {
  return readVaultedProp(await navigator.permissions.query({ name: "microphone" }), "state");
}

// agent.clean.js:5414
async function h_s26_permissionsQuery2() {
  return readVaultedProp(await navigator.permissions.query({ name: "camera" }), "state");
}

// agent.clean.js:6718
async function h_s26_fn() {
  const v898 = await h_s26_permissionsQuery2(),
    v899 = await h_s26_permissionsQuery();
  if (v898 === v899) {
    return v898;
  }
  if (v898 === "granted" || v899 === "granted") {
    return "granted";
  }
  if (v898 === "denied" || v899 === "denied") {
    return "denied";
  }
  return "prompt";
}