推进 OPFS 机器会话快照加载入口
This commit is contained in:
@@ -27,6 +27,27 @@ function optionalOpfsPath(value, label) {
|
||||
return normalizeOpfsPath(value);
|
||||
}
|
||||
|
||||
function requiredSnapshotFilePath(files, key, label) {
|
||||
const value = files[key];
|
||||
if (typeof value !== "string") {
|
||||
throw new Error(`${label} must be a string.`);
|
||||
}
|
||||
return normalizeOpfsPath(value);
|
||||
}
|
||||
|
||||
function validateMachineSessionSnapshotPayload(payload, machineId) {
|
||||
assertPlainObject(payload, "machine session snapshot payload");
|
||||
if (payload.machineId !== machineId) {
|
||||
throw new Error(`Machine session snapshot id mismatch: ${payload.machineId}`);
|
||||
}
|
||||
assertPlainObject(payload.files, "machine session snapshot files");
|
||||
requiredSnapshotFilePath(payload.files, "ini", "machine session INI OPFS path");
|
||||
requiredSnapshotFilePath(payload.files, "parameters", "machine session parameter OPFS path");
|
||||
requiredSnapshotFilePath(payload.files, "toolTable", "machine session tool table OPFS path");
|
||||
optionalOpfsPath(payload.files.gcode, "machine session G-code OPFS path");
|
||||
return payload;
|
||||
}
|
||||
|
||||
export function createMachineSessionSnapshotPayload(machineId, options = {}) {
|
||||
assertPlainObject(options, "machine session snapshot options");
|
||||
const ini = optionalOpfsPath(options.iniOpfsPath, "INI OPFS path") ??
|
||||
@@ -95,6 +116,12 @@ export async function saveMachineSessionSnapshot(sessionId, machineId, options =
|
||||
return saveSessionSnapshot(sessionId, payload, options);
|
||||
}
|
||||
|
||||
export async function loadMachineSessionSnapshot(sessionId, machineId, options = {}) {
|
||||
const snapshot = await loadSessionSnapshot(sessionId, options);
|
||||
validateMachineSessionSnapshotPayload(snapshot.payload, machineId);
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
export async function loadSessionSnapshot(sessionId, options = {}) {
|
||||
const path = sessionSnapshotPath(sessionId, options.filename);
|
||||
const text = await loadTextFile(path, options.storage);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
} from "../../runtime/opfs/path-model.js";
|
||||
import {
|
||||
createMachineSessionSnapshotPayload,
|
||||
loadMachineSessionSnapshot,
|
||||
loadSessionSnapshot,
|
||||
saveMachineSessionSnapshot,
|
||||
saveSessionSnapshot,
|
||||
@@ -221,6 +222,11 @@ TOOL_TABLE = browser-tool.tbl
|
||||
"browser-machine-session",
|
||||
{ filename: "browser-machine-snapshot.json" },
|
||||
);
|
||||
const loadedCheckedMachineSessionSnapshot = await loadMachineSessionSnapshot(
|
||||
"browser-machine-session",
|
||||
"browser-smoke",
|
||||
{ filename: "browser-machine-snapshot.json" },
|
||||
);
|
||||
assertEqual(
|
||||
machineSessionSnapshot.payload.files.parameters,
|
||||
"linuxcnc/machines/browser-smoke/browser-linuxcnc.var",
|
||||
@@ -241,6 +247,20 @@ TOOL_TABLE = browser-tool.tbl
|
||||
"browser-machine-session",
|
||||
"machine session snapshot metadata",
|
||||
);
|
||||
assertEqual(
|
||||
loadedCheckedMachineSessionSnapshot.payload.machineId,
|
||||
"browser-smoke",
|
||||
"checked machine session snapshot id",
|
||||
);
|
||||
await assertRejects(
|
||||
"browser machine snapshot wrong machine",
|
||||
() => loadMachineSessionSnapshot(
|
||||
"browser-machine-session",
|
||||
"other-browser-machine",
|
||||
{ filename: "browser-machine-snapshot.json" },
|
||||
),
|
||||
/Machine session snapshot id mismatch/,
|
||||
);
|
||||
await assertRejects(
|
||||
"browser snapshot invalid filename save",
|
||||
() => saveSessionSnapshot("browser-session", {}, {
|
||||
|
||||
@@ -18,6 +18,7 @@ import {
|
||||
import {
|
||||
createMachineSessionSnapshotPayload,
|
||||
createSessionSnapshot,
|
||||
loadMachineSessionSnapshot,
|
||||
loadSessionSnapshot,
|
||||
saveMachineSessionSnapshot,
|
||||
saveSessionSnapshot,
|
||||
@@ -350,6 +351,40 @@ assert.deepEqual(
|
||||
}),
|
||||
machineSessionSnapshot,
|
||||
);
|
||||
assert.deepEqual(
|
||||
await loadMachineSessionSnapshot("machine-session-1", "xyzab-tdr", {
|
||||
storage,
|
||||
filename: "machine-session-snapshot.json",
|
||||
}),
|
||||
machineSessionSnapshot,
|
||||
);
|
||||
await assert.rejects(
|
||||
() => loadMachineSessionSnapshot("machine-session-1", "other-machine", {
|
||||
storage,
|
||||
filename: "machine-session-snapshot.json",
|
||||
}),
|
||||
/Machine session snapshot id mismatch/,
|
||||
);
|
||||
await saveTextFile(
|
||||
sessionSnapshotPath("machine-session-bad-files"),
|
||||
JSON.stringify({
|
||||
...machineSessionSnapshot,
|
||||
sessionId: "machine-session-bad-files",
|
||||
payload: {
|
||||
machineId: "xyzab-tdr",
|
||||
files: {
|
||||
ini: "linuxcnc/machines/xyzab-tdr/machine.ini",
|
||||
parameters: "../linuxcnc.var",
|
||||
toolTable: "linuxcnc/machines/xyzab-tdr/tool.tbl",
|
||||
},
|
||||
},
|
||||
}),
|
||||
storage,
|
||||
);
|
||||
await assert.rejects(
|
||||
() => loadMachineSessionSnapshot("machine-session-bad-files", "xyzab-tdr", { storage }),
|
||||
/Invalid OPFS path/,
|
||||
);
|
||||
|
||||
await saveMachineTextFiles("xyzab-tdr", {
|
||||
ini: "[EMC]\nMACHINE = xyzab-tdr\n",
|
||||
|
||||
Reference in New Issue
Block a user