58 lines
2.1 KiB
JavaScript
58 lines
2.1 KiB
JavaScript
/** Compare first-keystroke layouts in the SHIPPED browser WASM. */
|
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
import { resolve, dirname } from "node:path";
|
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
const repo = resolve(here, "../../");
|
|
const payloads = JSON.parse(readFileSync(resolve(here, "forensic_real/wasm_keystroke_payloads.json"), "utf8"));
|
|
const pdfBytes = readFileSync(payloads.pdf);
|
|
const mjsPath = resolve(repo, "frontend/public/pdfium-engine.mjs");
|
|
const wasmPath = resolve(repo, "frontend/public/pdfium-engine.wasm");
|
|
|
|
const { default: createModule } = await import(pathToFileURL(mjsPath).href);
|
|
const Module = await createModule({
|
|
locateFile: (p) => (p.endsWith(".wasm") ? wasmPath : p),
|
|
});
|
|
|
|
const ptr = Module._malloc(pdfBytes.length);
|
|
Module.HEAPU8.set(pdfBytes, ptr);
|
|
const handle = Module.ccall("loadDocument", "number", ["number", "number"], [ptr, pdfBytes.length]);
|
|
Module._free(ptr);
|
|
|
|
function run(label, op) {
|
|
Module.ccall("previewRender", "number", ["number", "number", "number", "string"], [
|
|
handle, 0, 144, JSON.stringify(op),
|
|
]);
|
|
const layoutJson = Module.ccall("lastLayoutJson", "string", [], []) || "{}";
|
|
const layout = JSON.parse(layoutJson);
|
|
const line = layout.lines?.[0];
|
|
const adv = line?.adv || [];
|
|
const seed = payloads.seed_adv;
|
|
let firstAdvDiff = null;
|
|
for (let i = 0; i < Math.min(seed.length, adv.length); i++) {
|
|
if (Math.abs(seed[i] - adv[i]) > 0.05) {
|
|
firstAdvDiff = { i, seed: seed[i], got: adv[i], ch: "Professional Experience"[i] };
|
|
break;
|
|
}
|
|
}
|
|
return {
|
|
label,
|
|
text: line?.text,
|
|
x0: line?.x0,
|
|
advLen: adv.length,
|
|
advPrefix: adv.slice(0, 8),
|
|
seedPrefix: seed.slice(0, 8),
|
|
firstAdvDiff,
|
|
prefixAdvancesMatch: firstAdvDiff === null && adv.length >= seed.length,
|
|
};
|
|
}
|
|
|
|
const results = {};
|
|
for (const [k, op] of Object.entries(payloads.payloads)) {
|
|
results[k] = run(k, op);
|
|
}
|
|
writeFileSync(resolve(here, "forensic_real/wasm_keystroke_compare.json"), JSON.stringify(results, null, 2));
|
|
console.log(JSON.stringify(results, null, 2));
|
|
Module.ccall("freeDocument", null, ["number"], [handle]);
|