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)); });