d2/d2js/js/src/worker.node.js

78 lines
2.4 KiB
JavaScript
Raw Normal View History

2025-01-14 05:07:03 +00:00
import { parentPort } from "node:worker_threads";
2025-01-14 18:31:57 +00:00
let currentPort;
let d2;
2025-01-14 18:55:48 +00:00
let elk;
2025-01-14 18:31:57 +00:00
export function setupMessageHandler(isNode, port, initWasm) {
currentPort = port;
const handleMessage = async (e) => {
const { type, data } = e;
switch (type) {
case "init":
try {
if (isNode) {
eval(data.wasmExecContent);
2025-01-14 18:55:48 +00:00
eval(data.elkContent);
2025-01-14 18:31:57 +00:00
}
d2 = await initWasm(data.wasm);
2025-01-14 18:55:48 +00:00
elk = new ELK();
2025-01-14 18:31:57 +00:00
currentPort.postMessage({ type: "ready" });
} catch (err) {
currentPort.postMessage({ type: "error", error: err.message });
}
break;
case "compile":
try {
if (data.options.layout === "elk" || data.options.layout == null) {
const elkGraph = await d2.getELKGraph(JSON.stringify(data));
2025-02-25 21:30:51 +00:00
const response = JSON.parse(elkGraph);
if (response.error) throw new Error(response.error.message);
const elkGraph2 = response.data;
const layout = await elk.layout(elkGraph2);
globalThis.elkResult = layout;
}
2025-01-14 18:31:57 +00:00
const result = await d2.compile(JSON.stringify(data));
const response = JSON.parse(result);
if (response.error) throw new Error(response.error.message);
currentPort.postMessage({ type: "result", data: response.data });
} catch (err) {
currentPort.postMessage({ type: "error", error: err.message });
}
break;
case "render":
try {
const result = await d2.render(JSON.stringify(data));
const response = JSON.parse(result);
if (response.error) throw new Error(response.error.message);
2025-02-28 17:04:45 +00:00
const decoded = new TextDecoder().decode(
Uint8Array.from(atob(response.data), (c) => c.charCodeAt(0))
);
currentPort.postMessage({ type: "result", data: decoded });
2025-01-14 18:31:57 +00:00
} catch (err) {
currentPort.postMessage({ type: "error", error: err.message });
}
break;
}
};
if (isNode) {
port.on("message", handleMessage);
} else {
port.onmessage = (e) => handleMessage(e.data);
}
}
2025-01-14 05:07:03 +00:00
async function initWasmNode(wasmBinary) {
const go = new Go();
const result = await WebAssembly.instantiate(wasmBinary, go.importObject);
go.run(result.instance);
return global.d2;
}
2025-01-14 06:00:37 +00:00
setupMessageHandler(true, parentPort, initWasmNode);