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); // Gates historically passed either the build tree or its `bin` directory. // Normalize both forms before resolving the generated runtime and pthread // worker so a harmless argument-shape difference cannot become a gate fail. const suppliedBuildDirectory = path.resolve(workerData.buildDirectory); const buildDirectory = fs.existsSync(path.join(suppliedBuildDirectory, "bin", "FreeCADWebPartBoxProbe.js")) ? path.join(suppliedBuildDirectory, "bin") : suppliedBuildDirectory; globalThis.__dirname = `${buildDirectory}${path.sep}`; globalThis.require = createRequire(import.meta.url); const pthreadWorker = path.join(buildDirectory, "FreeCADWebPartBoxProbe.worker.cjs"); const generatedWorker = path.join(buildDirectory, "FreeCADWebPartBoxProbe.worker.js"); // The generated pthread loader changes with each runtime relink. Refresh the // CommonJS-compatible copy so Node never starts a stale worker beside it. fs.copyFileSync(generatedWorker, pthreadWorker); const loader = await import(pathToFileURL(path.join(buildDirectory, "FreeCADWebPartBoxProbe.js"))); const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(buildDirectory, "FreeCADWebPartBoxProbe.wasm")), locateFile: (file) => file.endsWith(".worker.js") ? pthreadWorker : path.join(buildDirectory, file), print: () => {}, printErr: () => {}, }); let queue = new envelope.FacadeSerialQueue(); parentPort.postMessage({ kind: "ready", action: facade.PART_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.isPartPythonFamilyRequest(message)) { parentPort.postMessage(envelope.createFailure("invalid", "invalid_request", "Part Python family envelope is invalid")); return; } // Keep the native promise pending long enough for every family caller to // deliver its cancel envelope before the dispatcher starts the replay. const source = message.requestId.endsWith("-cancel") ? new Promise((resolve) => setTimeout(() => resolve(kernel), 25)) : kernel; parentPort.postMessage(await facade.dispatchPartPythonFamily(queue, message, source)); });