Files
FreeCADWasmDev/tools/run_p6_facade_envelope_smoke.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

84 lines
2.9 KiB
JavaScript

#!/usr/bin/env node
import fs from "node:fs";
const modulePath = process.argv[2];
if (!modulePath) throw new Error("compiled facade-envelope module path is required");
const facade = await import(modulePath);
const {
FACADE_SCHEMA,
FacadeSerialQueue,
createCancel,
createFailure,
createRequest,
isFacadeCancel,
isFacadeRequest,
isFacadeResponse,
} = facade;
const queue = new FacadeSerialQueue();
const events = [];
const successRequest = createRequest("req-success", "echo", { value: 7 }, "doc-1");
const success = await queue.dispatch(successRequest, async (payload) => {
events.push("success-start");
return { echoed: payload.value };
});
events.push("success-end");
const errorRequest = createRequest("req-error", "reject", null, "doc-1");
const error = await queue.dispatch(errorRequest, () => {
throw new Error("fixture rejected");
});
const duplicate = await queue.dispatch(successRequest, () => ({ unexpected: true }));
const cancelRequest = createRequest("req-cancel", "slow", null, "doc-1");
const cancelResult = queue.dispatch(cancelRequest, async (_payload, signal) => {
await new Promise((resolve) => setTimeout(resolve, 25));
if (signal.aborted) throw new Error("aborted");
return { unexpected: true };
});
const cancelAccepted = queue.cancel(createCancel("cancel-1", "req-cancel", "doc-1"));
const cancelled = await cancelResult;
const invalidCancelAccepted = queue.cancel(createCancel("cancel-2", "missing"));
const invalidResponse = createFailure("req-invalid", "invalid_request", "request envelope is invalid", { source: "smoke" });
const result = {
schema: "freecad-web-facade-envelope-smoke/v1",
envelopeSchema: FACADE_SCHEMA,
success,
error,
duplicate,
cancelAccepted,
cancelled,
invalidCancelAccepted,
invalidResponse,
predicates: {
request: isFacadeRequest(successRequest),
cancel: isFacadeCancel(createCancel("cancel-3", "req-success")),
responses: [success, error, duplicate, cancelled, invalidResponse].map(isFacadeResponse),
},
events,
};
const valid = result.envelopeSchema === "freecad-web-facade/v1"
&& result.success.kind === "result"
&& result.success.requestId === "req-success"
&& result.error.kind === "error"
&& result.error.error.code === "handler_error"
&& result.duplicate.kind === "error"
&& result.duplicate.error.code === "duplicate_request"
&& result.cancelAccepted === true
&& result.cancelled.kind === "error"
&& result.cancelled.error.code === "cancelled"
&& result.invalidCancelAccepted === false
&& result.predicates.request === true
&& result.predicates.cancel === true
&& result.predicates.responses.every(Boolean)
&& result.events.join(",") === "success-start,success-end";
if (!valid) throw new Error(JSON.stringify(result));
const outputPath = process.env.P6_FACADE_OUTPUT;
if (outputPath) fs.writeFileSync(outputPath, `${JSON.stringify(result, null, 2)}\n`);
console.log(JSON.stringify(result));