Files
FreeCADWasmDev/web/src/web-dock-overlay.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

32 lines
1.5 KiB
TypeScript

import { FacadeSerialQueue, createFailure, isFacadeCancel } from "./facade-envelope.js";
import { dispatchDockOverlay, isDockOverlayRequest, DOCK_OVERLAY_COMMAND, type DockOverlayKernel } from "./web-dock-overlay-facade.js";
async function load(): Promise<DockOverlayKernel> {
const response = await fetch("/kernel/FreeCADWebWebRuntimeProbe.js");
if (!response.ok) throw new Error(`Web runtime load failed: HTTP ${response.status}`);
const url = URL.createObjectURL(new Blob([await response.text()], { type: "text/javascript" }));
try {
const factory = (await import(/* @vite-ignore */ url)).default;
return await factory({ locateFile: (file: string) => `/kernel/${file}` });
} finally { URL.revokeObjectURL(url); }
}
let queue = new FacadeSerialQueue();
let kernel = load();
void kernel.catch(() => {});
self.postMessage({ kind: "ready", action: DOCK_OVERLAY_COMMAND });
self.onmessage = async event => {
const message = event.data;
if (message?.kind === "reset") {
queue = new FacadeSerialQueue(); kernel = load(); void kernel.catch(() => {});
self.postMessage({ kind: "reset", requestId: message.requestId }); return;
}
if (isFacadeCancel(message)) {
if (!queue.cancel(message)) self.postMessage(createFailure(message.requestId, "cancel_rejected", "Request is not active"));
return;
}
if (isDockOverlayRequest(message)) {
self.postMessage(await dispatchDockOverlay(queue, message, kernel)); return;
}
self.postMessage(createFailure(message?.requestId ?? "invalid", "invalid_request", "Invalid dock overlay envelope"));
};