import assert from "node:assert/strict";
import test from "node:test";
import { decodeDump, dumpRows, handler } from
"../netlify/functions/oskiewar-dump.mjs";
const encode = (value) => Buffer.from(JSON.stringify(value), "utf8")
.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
const sample = {
v: 1, p: "paint", n: "RangeError", m: "invalid 3d triangle coordinates",
src: { file: "live", line: 1162, column: 16 },
k: "at screenTriangle (live:1162:16)",
s: {
build: "2026.08.07.1336 PDT", shell: "GAME",
round: { id: "local", result: "@JEFFREY WINS ROUND", elapsedMs: 23941 },
camera: { x: 6594, y: 11798, width: 930, aspect: 2.255 },
players: [{ handle: "@JEFFREY", stance: "ADVANCE", alive: true,
x: 6779, y: 12000, z: 0, vx: 0, vy: 0, removed: ["LEFT ARM"] }],
balls: [{ type: "beach", x: 1517, y: 11904, vx: 2082, vy: -87 }],
},
};
const get = (query) => handler({ httpMethod: "GET", queryStringParameters: query });
test("a dump link decodes back into the console's own state", () => {
const dump = decodeDump(encode(sample));
assert.equal(dump.n, "RangeError");
assert.equal(dump.s.players[0].handle, "@JEFFREY");
const rows = Object.fromEntries(dumpRows(dump));
assert.equal(rows.source, "live:1162:16");
assert.match(rows.round, /@JEFFREY WINS ROUND {2}23941ms/);
assert.match(rows["@JEFFREY"], /ADVANCE alive {2}pos 6779,12000,0/);
assert.match(rows["@JEFFREY"], /lost LEFT ARM/);
assert.match(rows.balls, /beach@1517,11904 v2082,-87/);
});
test("junk, oversized, and unversioned payloads decode to nothing", () => {
assert.equal(decodeDump(""), null);
assert.equal(decodeDump("not base64!"), null);
assert.equal(decodeDump("a".repeat(8193)), null);
assert.equal(decodeDump(encode([1, 2, 3])), null);
assert.equal(decodeDump(encode({ v: 2, s: {} })), null);
assert.equal(decodeDump(Buffer.from("nonsense").toString("base64url")), null);
});
test("the page renders a dump and escapes what the console sent", async () => {
const response = await get({ d: encode(sample) });
assert.equal(response.statusCode, 200);
assert.match(response.headers["Content-Type"], /text\/html/);
assert.match(response.headers["Cache-Control"], /immutable/);
assert.match(response.body, /aesthetic\.computer error/);
assert.match(response.body, /invalid 3d triangle coordinates/);
const hostile = await get({ d: encode({ ...sample,
m: `` }) });
assert.ok(!hostile.body.includes("