Files
FreeCADWasmDev/tools/fem-python-family-batch-smoke-worker.mjs
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

54 lines
2.2 KiB
JavaScript

import fs from "node:fs";
import path from "node:path";
import { createRequire } from "node:module";
import { parentPort, workerData } from "node:worker_threads";
import { pathToFileURL } from "node:url";
const facade = await import(workerData.facadePath);
const envelope = await import(workerData.envelopePath);
const build = workerData.buildDirectory;
globalThis.__dirname = `${build}${path.sep}`;
globalThis.require = createRequire(import.meta.url);
const loader = await import(pathToFileURL(path.join(build, "FreeCADWebFemGenericFamilyProbe.js")));
const prepareFemVirtualFileSystem = (module) => {
module.FS_createPath("/", "freecad-mod", true, true);
module.FS_createPath("/freecad-mod", "Fem", true, true);
for (const relative of ["femobjects", "femmesh", "femsolver", "femsolver/elmer", "femsolver/fenics"]) {
let parent = "/freecad-mod/Fem";
for (const segment of relative.split("/")) {
module.FS_createPath(parent, segment, true, true);
parent = `${parent}/${segment}`;
}
}
};
const kernel = await loader.default({
wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebFemGenericFamilyProbe.wasm")),
locateFile: (file) => path.join(build, file),
preRun: [prepareFemVirtualFileSystem],
print: () => {},
printErr: () => {},
});
let queue = new envelope.FacadeSerialQueue();
parentPort.postMessage({ kind: "ready", action: facade.FEM_PYTHON_FAMILY_COMMAND });
parentPort.on("message", async (message) => {
if (message.kind === "reset") {
queue = new envelope.FacadeSerialQueue();
parentPort.postMessage({ kind: "reset", requestId: message.requestId });
return;
}
if (envelope.isFacadeCancel(message)) {
if (!queue.cancel(message)) parentPort.postMessage(envelope.createFailure(message.requestId, "cancel_rejected", "request is not active"));
return;
}
if (!facade.isFemPythonFamilyRequest(message)) {
parentPort.postMessage(envelope.createFailure(message.requestId || "invalid", "invalid_request", "Fem Python family batch envelope is invalid"));
return;
}
const source = message.requestId.includes("cancel")
? new Promise((resolve) => setTimeout(() => resolve(kernel), 25))
: kernel;
parentPort.postMessage(await facade.dispatchFemPythonFamily(queue, message, source));
});