Files
FreeCADWasmDev/web/src/robot-save.worker.ts
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

9 lines
1.9 KiB
TypeScript

import { FacadeCancel, FacadeResponse, FacadeSerialQueue, createFailure, isFacadeCancel } from "./facade-envelope.js";
import { dispatchRobotSave, isRobotSaveRequest, RobotSaveKernel, RobotSaveRequest } from "./robot-save-facade.js";
type Request = RobotSaveRequest | FacadeCancel | { kind: "reset"; requestId: string }; type Response = FacadeResponse | { kind: "ready"; action: string } | { kind: "reset"; requestId: string }; type Factory = (options?: Record<string, unknown>) => Promise<RobotSaveKernel>;
const scope = self as unknown as { postMessage(message: Response): void; onmessage: ((event: MessageEvent<Request>) => void) | null };
async function createKernel() { const source = await fetch("/kernel/FreeCADWebRobotRuntimeProbe.js").then(async response => { if (!response.ok) throw new Error(`Robot save loader failed: HTTP ${response.status}`); return response.text(); }); const url = URL.createObjectURL(new Blob([source], { type: "text/javascript" })); try { const module = await import(/* @vite-ignore */ url) as unknown as { default: Factory }; return module.default({ locateFile: (file: string) => `/kernel/${file}` }); } finally { URL.revokeObjectURL(url); } }
const ROBOT_SAVE_ACTION = "robot.saveReopen";
let queue = new FacadeSerialQueue(); let kernel = createKernel(); scope.postMessage({ kind: "ready", action: ROBOT_SAVE_ACTION });
scope.onmessage = async event => { const message = event.data; if (message.kind === "reset") { queue = new FacadeSerialQueue(); kernel = createKernel(); scope.postMessage({ kind: "reset", requestId: message.requestId }); return; } if (isFacadeCancel(message)) { if (!queue.cancel(message)) scope.postMessage(createFailure(message.requestId, "cancel_rejected", "request is not active")); return; } if (isRobotSaveRequest(message)) { scope.postMessage(await dispatchRobotSave(queue, message, kernel)); return; } scope.postMessage(createFailure("invalid", "invalid_request", "Robot save envelope is invalid")); };