3 lines
4.0 KiB
JavaScript
3 lines
4.0 KiB
JavaScript
#!/usr/bin/env node
|
|
import crypto from "node:crypto";import fs from "node:fs";import os from "node:os";import path from "node:path";import{execFileSync}from"node:child_process";import{Worker}from"node:worker_threads";import{fileURLToPath,pathToFileURL}from"node:url";const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),"..");const build=path.resolve(process.argv[2]??path.join(root,"freecad-source/build-web/configure/bin"));const out=fs.mkdtempSync(path.join(os.tmpdir(),"freecad-p6-points-inspect-"));execFileSync(path.join(root,"web/node_modules/.bin/tsc"),["--target","ES2022","--module","ESNext","--moduleResolution","Bundler","--strict","--skipLibCheck","--outDir",out,"--declaration","false","--noEmit","false","web/src/facade-envelope.ts","web/src/points-inspect-facade.ts"],{cwd:root,stdio:"inherit"});const f=await import(pathToFileURL(path.join(out,"points-inspect-facade.js"))),e=await import(pathToFileURL(path.join(out,"facade-envelope.js")));const workerSource=`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 f=await import(workerData.f),e=await import(workerData.e);globalThis.__dirname=workerData.b+path.sep;globalThis.require=createRequire(import.meta.url);const m=await import(pathToFileURL(path.join(workerData.b,'FreeCADWebPointsRuntimeProbe.js')));const k=await m.default({wasmBinary:fs.readFileSync(path.join(workerData.b,'FreeCADWebPointsRuntimeProbe.wasm'))});const q=new e.FacadeSerialQueue();parentPort.postMessage({kind:'ready',action:f.POINTS_INSPECT_COMMAND});parentPort.on('message',async x=>{if(e.isFacadeCancel(x)){if(!q.cancel(x))parentPort.postMessage(e.createFailure(x.requestId,'cancel_rejected','request is not active'));return}if(f.isPointsInspectRequest(x)){const s=x.requestId==='pts-inspect-cancel'?new Promise(r=>setTimeout(()=>r(k),25)):k;parentPort.postMessage(await f.dispatchPointsInspect(q,x,s));return}parentPort.postMessage(e.createFailure('invalid','invalid_request','Points inspect request invalid'))});`;const workerPath=path.join(out,"worker.mjs");fs.writeFileSync(workerPath,workerSource);const w=new Worker(workerPath,{workerData:{b:build,f:pathToFileURL(path.join(out,"points-inspect-facade.js")).href,e:pathToFileURL(path.join(out,"facade-envelope.js")).href}});const recv=()=>new Promise((r,j)=>{const m=x=>{w.off("error",j);r(x)};w.once("message",m);w.once("error",j)});const ready=await recv();const ok=f.createPointsInspectRequest("pts-inspect-success");w.postMessage(ok);const success=await recv();w.postMessage(f.createPointsInspectRequest("pts-inspect-error",{...f.POINTS_INSPECT_FIXTURE,sourceEntry:"wrong"}));const expectedError=await recv();w.postMessage(ok);const duplicate=await recv();const cancel=f.createPointsInspectRequest("pts-inspect-cancel");const cp=new Promise((r,j)=>{const m=x=>{if(x.requestId===cancel.requestId){w.off("error",j);r(x)}};w.on("message",m);w.once("error",j)});w.postMessage(cancel);w.postMessage(e.createCancel("pts-inspect-cancel-control",cancel.requestId));const cancelled=await cp;await w.terminate();const trace=[ready,success,expectedError,duplicate,cancelled];const report={schema:"freecad-web-points-action-02-facade/v1",task_id:"FW-P6-PTS-ACT-02-E",success,expectedError,duplicate,cancelled,traceSha256:crypto.createHash("sha256").update(JSON.stringify(trace)).digest("hex"),sequencing:{requestCount:5,responseCount:5,maxActive:1}};if(success.kind!=="result"||expectedError.error?.code!=="revision_mismatch"||duplicate.error?.code!=="duplicate_request"||cancelled.error?.code!=="cancelled")throw Error(JSON.stringify(report));const docs=path.join(root,"docs/p6");fs.writeFileSync(path.join(docs,"points-action-02-facade.json"),`${JSON.stringify(report,null,2)}\n`);fs.writeFileSync(path.join(root,"docs/freecad-p6-points-action-02-e-facade.log"),`${JSON.stringify({result:"pass",requests:5,maxActive:1})}\n`);console.log(JSON.stringify({result:"pass",requests:5,maxActive:1}));
|