28 lines
4.5 KiB
JavaScript
28 lines
4.5 KiB
JavaScript
#!/usr/bin/env node
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import crypto from "node:crypto";
|
|
import { execFileSync } from "node:child_process";
|
|
import { Worker } from "node:worker_threads";
|
|
import { pathToFileURL } from "node:url";
|
|
const root = "/home/mes123456/FreeCADWasmDev/working/FreeCAD";
|
|
const build = path.resolve(process.argv[2] || `${root}/freecad-source/build-web/cam-configure-r1/bin`);
|
|
const batch = JSON.parse(fs.readFileSync(`${root}/docs/current/module-batch-manifest.json`));
|
|
if (batch.batchId !== "e3aaf5b97a0ad8b837ec0dc7" || batch.selected?.module !== "CAM" || batch.selected?.tier !== "object-contract" || batch.selected?.family !== "geometry-recompute") throw new Error("unexpected CAM geometry-recompute batch");
|
|
const records = batch.records.map(([id,name,disposition,sourcePath,sourceLine]) => ({apiId:id,name,family:"geometry-recompute",sourcePath,sourceLine,disposition}));
|
|
const out = fs.mkdtempSync("/tmp/cam-geometry-recompute-");
|
|
execFileSync(`${root}/web/node_modules/.bin/tsc`, ["--target","ES2022","--module","ESNext","--moduleResolution","Bundler","--strict","--skipLibCheck","--outDir",out,`${root}/web/src/facade-envelope.ts`,`${root}/web/src/cam-python-family-batch-facade.ts`], {cwd:root,stdio:"inherit"});
|
|
const facade = await import(pathToFileURL(`${out}/cam-python-family-batch-facade.js`));
|
|
const envelope = await import(pathToFileURL(`${out}/facade-envelope.js`));
|
|
const worker = new Worker(`${root}/tools/cam-python-family-batch-smoke-worker.mjs`, {workerData:{buildDirectory:build,facadePath:pathToFileURL(`${out}/cam-python-family-batch-facade.js`).href,envelopePath:pathToFileURL(`${out}/facade-envelope.js`).href}});
|
|
const next=()=>new Promise((resolve,reject)=>{worker.once("message",resolve);worker.once("error",reject)});
|
|
const request=facade.createCamPythonFamilyBatchRequest("cam-geometry-recompute",records,"object-contract");
|
|
const repeatRequest=facade.createCamPythonFamilyBatchRequest("cam-geometry-recompute-repeat",records,"object-contract");
|
|
const ready=await next(); worker.postMessage(request); const success=await next(); worker.postMessage(repeatRequest); const repeat=await next(); await worker.terminate();
|
|
if(ready.kind!=="ready"||success.kind!=="result"||repeat.kind!=="result") throw new Error(JSON.stringify({ready,success,repeat}));
|
|
const result=success.result; if(result.count!==4||result.resourcesReleased!==true||result.records.some(r=>r.native!==true||r.resourcesReleased!==true||!['exposed','restricted','nonportable','not_implemented'].includes(r.status))) throw new Error("invalid native result");
|
|
if(JSON.stringify(result)!==JSON.stringify(repeat.result)) throw new Error("replay mismatch");
|
|
const hash=v=>crypto.createHash("sha256").update(JSON.stringify(v)).digest("hex"); const modules=JSON.parse(fs.readFileSync(`${root}/web/public/modules/manifest.json`)); const cam=modules.modules.CAM; const cw=cam.workers["cam.worker.ts"];
|
|
const report={schema:"freecad-web-cam-geometry-recompute-module-batch-runtime/v1",taskId:"FW-P6-FPA-Y",batchId:batch.batchId,module:"CAM",tier:"object-contract",family:"geometry-recompute",status:"pass_with_boundaries",dispatcher:"fc_web_dispatch_json",route:{command:facade.CAM_PYTHON_FAMILY_BATCH_COMMAND,native:"freecad-source/src/WebAssembly/FreeCADCoreProbe/CAMRuntimeProbe.cpp:fc_web_dispatch_json",facade:"web/src/cam-python-family-batch-facade.ts",worker:"web/src/cam.worker.ts"},input:{cmd:facade.CAM_PYTHON_FAMILY_BATCH_COMMAND,args:{tier:"object-contract",records}},inputSha256:hash(records),result,resultSha256:hash(result),replay:{equal:true,resultSha256:hash(repeat.result)},facadeWorker:{ready,success,repeat},records:result.records,resources:{resourcesReleased:true,documentMutation:false},artifacts:{module:"CAM",worker:"cam.worker.ts",revision:cam.revision,workerRevision:cw.revision,runtimeUrl:cw.runtimeUrl,wasmUrl:cw.wasmUrl,dataUrl:cw.dataUrl??null,assetBaseUrl:cam.assetBaseUrl,runtimeSha256:cw.hashes.runtime,wasmSha256:cw.hashes.wasm},boundaries:["Statuses and recompute fixture derive from compiled FreeCAD native dispatcher.","CAM remains an independent dynamically loaded module artifact."]};
|
|
fs.writeFileSync(`${root}/docs/p6/cam-geometry-recompute-module-batch-${batch.batchId}-runtime.json`,JSON.stringify(report,null,2)+"\n"); fs.writeFileSync(`${root}/docs/freecad-p6-cam-geometry-recompute-module-batch-${batch.batchId}.log`,JSON.stringify({status:report.status,count:4,resultSha256:report.resultSha256})+"\n"); console.log(JSON.stringify({status:report.status,count:4,resultSha256:report.resultSha256}));
|