// Set a global delay to simulate crappy web software VV.delay = 200; // Log user activities { const MOUSE_MOVE_TIMEOUT_MS = 100; const logUrl = new URL(window.location); logUrl.pathname = "/log"; let mouseMoveTimeout; // Return a fingerprint for this browser const fingerprint = async () => { const buffer = await window.crypto.subtle.digest("SHA-1", new TextEncoder().encode(JSON.stringify([ navigator.userAgent, navigator.buildId, navigator.languages ]))); let fingerprint; for (let i = 0; i < buffer.byteLength; i++) { fingerprint += buffer[i]; } return fingerprint; }; // Log data const log = async (data) => { console.log(JSON.stringify({ data: data, fingerprint: await fingerprint() })); return await fetch(logUrl, { body: JSON.stringify({ data: data, fingerprint: await fingerprint() }), method: "POST", headers: VV.header }); }; const mouseEvent = (event) => { return { e: event.type, w: window.innerWidth, h: window.innerHeight, x: event.x, y: event.y } } const keyEvent = (event) => { return { e: event.type, c: event.key, s: event.shiftKey } } document.addEventListener("keyup", (event) => log(keyEvent(event))); document.addEventListener("keydown", (event) => log(keyEvent(event))); document.addEventListener("click", (event) => log(mouseEvent(event))); document.addEventListener("mousemove", (event) => { // Throttle mousemove events clearTimeout(mouseMoveTimeout); //mouseMoveTimeout = setTimeout(() => log(mouseEvent(event)), MOUSE_MOVE_TIMEOUT_MS); }); }