32 lines
1.5 KiB
TypeScript
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"));
|
|
};
|