按建议,继续完成后续工作

结论:已新增 OPFS session snapshot store,提供通用 JSON 包络、格式校验和保存/读取往返验证;该层只处理 host-side 持久化,不定义 CNC 机床状态语义。
This commit is contained in:
2026-06-08 03:29:23 +08:00
parent 84bdc819b4
commit 63a697a503
5 changed files with 116 additions and 8 deletions

View File

@@ -15,6 +15,12 @@ import {
sessionSnapshotPath,
toolTablePath,
} from "../../../runtime/opfs/path-model.js";
import {
createSessionSnapshot,
loadSessionSnapshot,
saveSessionSnapshot,
validateSessionSnapshot,
} from "../../../runtime/opfs/snapshot-store.js";
class MockFileHandle {
constructor(name) {
@@ -86,6 +92,26 @@ assert.deepEqual(defaultMachinePaths("xyzab-tdr"), {
parameters: "linuxcnc/machines/xyzab-tdr/linuxcnc.var",
});
const snapshotPayload = {
files: {
ini: machineIniPath("xyzab-tdr"),
toolTable: toolTablePath("xyzab-tdr"),
},
};
const snapshot = createSessionSnapshot("session-1", snapshotPayload, {
createdAt: "2026-06-08T00:00:00.000Z",
metadata: { source: "node-smoke" },
});
assert.deepEqual(snapshot, {
format: "linuxcnc-wasm-session-snapshot",
version: 1,
sessionId: "session-1",
createdAt: "2026-06-08T00:00:00.000Z",
metadata: { source: "node-smoke" },
payload: snapshotPayload,
});
assert.equal(validateSessionSnapshot(snapshot, "session-1"), snapshot);
await saveTextFile(
"linuxcnc/machines/xyzab.ini",
"[EMC]\nMACHINE = opfs-smoke\n",
@@ -96,6 +122,13 @@ assert.equal(
"[EMC]\nMACHINE = opfs-smoke\n",
);
await saveSessionSnapshot("session-1", snapshotPayload, {
storage,
createdAt: "2026-06-08T00:00:00.000Z",
metadata: { source: "node-smoke" },
});
assert.deepEqual(await loadSessionSnapshot("session-1", { storage }), snapshot);
await assert.rejects(
() => loadTextFile("linuxcnc/machines/missing.ini", storage),
/missing file/,
@@ -108,6 +141,15 @@ assert.throws(
() => machineIniPath("../escape"),
/Invalid machine id/,
);
await saveTextFile(sessionSnapshotPath("bad-json"), "{", storage);
await assert.rejects(
() => loadSessionSnapshot("bad-json", { storage }),
/Invalid session snapshot JSON/,
);
await assert.rejects(
() => loadSessionSnapshot("missing-session", { storage }),
/missing directory|missing file/,
);
await assert.rejects(
() => getOpfsRoot({}),
/OPFS is not available/,