Files
cnc_wams/wasm-port/runtime/workers/python-remap-worker.js
wangdequan fbf9dade9c 按text25.txt规划,实现L4-PYTHON-REMAP接入数控系统仿真系统
结论:已接入Python remap runtime proof chain,覆盖native、WASM、browser与release gate证据链;继续保持promotion_allowed=0,不批量解锁L4-PYTHON-REMAP。
2026-06-19 18:52:24 +08:00

123 lines
3.3 KiB
JavaScript

function postReply(id, type, payload) {
self.postMessage({ id, type, ok: true, ...payload });
}
function postError(id, type, error) {
self.postMessage({
id,
type,
ok: false,
error: error?.message ?? String(error),
});
}
function pythonRuntimeAvailable() {
return typeof self.loadPyodide === "function" || Boolean(self.pyodide?.runPythonAsync);
}
function getRuntimeProvider() {
return self.linuxCncPythonRemapRuntimeProvider ?? null;
}
async function loadRuntimeProvider(moduleUrl) {
if (!moduleUrl) {
return {
status: "blocked_browser_python_wasm_runtime_missing",
provider: getRuntimeProvider(),
};
}
try {
await import(moduleUrl);
} catch (error) {
return {
status: "blocked_browser_python_wasm_runtime_load_failed",
error,
provider: getRuntimeProvider(),
};
}
const provider = getRuntimeProvider();
if (!provider) {
return {
status: "blocked_browser_python_remap_provider_missing",
provider,
};
}
return {
status: "browser_python_remap_wasm_runtime_ready",
provider,
};
}
async function callProvider(type, message) {
const provider = getRuntimeProvider();
const method = provider?.[type];
if (!method) {
throw new Error("blocked_browser_python_wasm_runtime_missing");
}
return method.call(provider, message);
}
self.addEventListener("message", async (event) => {
const message = event.data ?? {};
const { id, type } = message;
try {
if (type === "start") {
const runtimeLoad = await loadRuntimeProvider(message.pythonRuntimeModuleUrl);
const provider = runtimeLoad.provider;
const requiredMethods = [
"initializePython",
"applyIniPythonPath",
"executeTopLevel",
"importModule",
"lookupCallable",
"invokeGenerator",
"observeFirstYield",
"finishGenerator",
"exportInterpreterState",
"exportDiagnostics",
];
const providerReady = requiredMethods.every((method) => typeof provider?.[method] === "function");
const ready = providerReady || pythonRuntimeAvailable();
if (providerReady && provider.start) {
await provider.start(message);
}
postReply(id, type, {
runtimeMode: "browser-python-wasm-worker",
runtimeExecutionReady: ready,
status: ready ? "browser_python_remap_wasm_runtime_ready" : runtimeLoad.status,
error: runtimeLoad.error?.message ?? null,
executionEnabled: false,
promotionAllowed: false,
bulkPromotionAllowed: false,
});
return;
}
if (type === "close") {
const provider = getRuntimeProvider();
if (provider?.close) {
await provider.close();
}
postReply(id, type, {
executionEnabled: false,
promotionAllowed: false,
bulkPromotionAllowed: false,
});
return;
}
const result = await callProvider(type, message);
postReply(id, type, {
status: result?.status ?? "ok",
value: result?.value ?? null,
ready: result?.ready !== false,
source: result?.source ?? "linuxcnc-python-remap-runtime-provider",
executionEnabled: false,
promotionAllowed: false,
bulkPromotionAllowed: false,
});
} catch (error) {
postError(id, type, error);
}
});