49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
export async function getNodeWrapper(id: `${string}/${string}/${string}`) {
|
|
|
|
const wrapperReponse = await fetch(`/n/${id}/wrapper`);
|
|
if (!wrapperReponse.ok) {
|
|
throw new Error(`Failed to load node ${id}`);
|
|
}
|
|
|
|
let wrapperCode = await wrapperReponse.text();
|
|
wrapperCode = wrapperCode.replace("wasm = val;", `if(wasm) return;
|
|
wasm = val;`);
|
|
const wasmWrapper = await import(/*@vite-ignore*/`data:text/javascript;base64,${btoa(wrapperCode)}`);
|
|
|
|
return wasmWrapper;
|
|
}
|
|
|
|
export async function getNodeWasm(id: `${string}/${string}/${string}`): Promise<WebAssembly.Instance> {
|
|
|
|
const wasmResponse = await fetch(`/n/${id}/wasm`);
|
|
|
|
if (!wasmResponse.ok) {
|
|
throw new Error(`Failed to load node ${id}`);
|
|
}
|
|
|
|
const wasmWrapper = await getNodeWrapper(id);
|
|
|
|
const module = new WebAssembly.Module(await wasmResponse.arrayBuffer());
|
|
const instance = new WebAssembly.Instance(module, { ["./index_bg.js"]: wasmWrapper });
|
|
wasmWrapper.__wbg_set_wasm(instance.exports);
|
|
|
|
return wasmWrapper;
|
|
}
|
|
|
|
|
|
export async function getNode(id: `${string}/${string}/${string}`) {
|
|
|
|
const wrapper = await getNodeWasm(id);
|
|
|
|
const outputs = wrapper.get_outputs();
|
|
const rawInputs = wrapper.get_input_types();
|
|
try {
|
|
const inputTypes = JSON.parse(rawInputs);
|
|
return { id, outputs, inputs: inputTypes }
|
|
} catch (e) {
|
|
console.log("Failed to parse input types for node", { id, rawInputs });
|
|
}
|
|
|
|
|
|
}
|