按建议,继续完成后续工作
结论:已新增 OPFS session snapshot store,提供通用 JSON 包络、格式校验和保存/读取往返验证;该层只处理 host-side 持久化,不定义 CNC 机床状态语义。
This commit is contained in:
@@ -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/,
|
||||
|
||||
Reference in New Issue
Block a user