84 lines
2.9 KiB
JavaScript
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));
|