"use strict"; const test = require("node:test"); const assert = require("node:assert/strict"); const fs = require("node:fs"); const os = require("node:os"); const path = require("node:path"); const { MapGate } = require("./map-gate"); test("non-map actions stay locked until the exact current map is acknowledged", () => { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "map-gate-")); try { const maps = path.join(dir, "maps"); fs.mkdirSync(maps); fs.writeFileSync(path.join(maps, "JD-FD-PRIMARY.json"), JSON.stringify({ node_id: "JD-FD-PRIMARY", modules: [{ code: "JD-GTW-01" }] })); const gate = new MapGate({ mapsDir: maps, stateFile: path.join(dir, "state.json") }); const map = gate.read("JD-FD-PRIMARY"); assert.equal(gate.verify("session-token", "JD-FD-PRIMARY", map.hash).reason, "map_not_acknowledged"); assert.equal(gate.ack("session-token", "JD-FD-PRIMARY", map.hash, 100, 3600).ok, true); assert.equal(gate.verify("session-token", "JD-FD-PRIMARY", map.hash, 101).ok, true); assert.equal(gate.verify("session-token", "OTHER", map.hash, 101).reason, "map_target_mismatch"); } finally { fs.rmSync(dir, { recursive: true, force: true }); } }); test("changing the server map invalidates an old acknowledgement", () => { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "map-gate-")); try { const maps = path.join(dir, "maps"); fs.mkdirSync(maps); const file = path.join(maps, "JD-FD-PRIMARY.json"); fs.writeFileSync(file, JSON.stringify({ node_id: "JD-FD-PRIMARY", modules: ["A"] })); const gate = new MapGate({ mapsDir: maps }); const oldMap = gate.read("JD-FD-PRIMARY"); gate.ack("session-token", "JD-FD-PRIMARY", oldMap.hash, 100, 3600); fs.writeFileSync(file, JSON.stringify({ node_id: "JD-FD-PRIMARY", modules: ["A", "B"] })); const newMap = gate.read("JD-FD-PRIMARY"); assert.notEqual(oldMap.hash, newMap.hash); assert.equal(gate.verify("session-token", "JD-FD-PRIMARY", newMap.hash, 101).reason, "map_changed"); } finally { fs.rmSync(dir, { recursive: true, force: true }); } });