1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00
ZoKrates/zokrates_js/patch.js
2023-01-23 03:28:06 +01:00

75 lines
1.9 KiB
JavaScript

import { parse } from "acorn";
import { generate } from "astring";
import fs from "fs/promises";
import pako from "pako";
(async function () {
const packageObject = JSON.parse(
await fs.readFile("pkg/package.json", { encoding: "utf-8" })
);
const wasmPath = packageObject.files.find((file) => file.endsWith(".wasm"));
const wasm = await fs.readFile(`pkg/${wasmPath}`);
const deflated = Buffer.from(pako.deflate(wasm));
const wasmBase64 = deflated.toString("base64");
const init = `export async function init(inflate) {
const encoded = '${wasmBase64}';
let bytes;
if (typeof atob === 'function') {
const binary = atob(encoded);
bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
} else if (typeof Buffer === 'function') {
bytes = Buffer.from(encoded, 'base64');
} else {
throw new Error('Unsupported platform');
}
const imports = getImports();
initMemory(imports);
bytes = inflate(bytes);
const { instance, module } = await WebAssembly.instantiate(bytes, imports);
return finalizeInit(instance, module);
}
export default init;`;
const generatedSource = await fs.readFile(`pkg/${packageObject.module}`, {
encoding: "utf-8",
});
const ast = parse(generatedSource, {
ecmaVersion: "latest",
sourceType: "module",
});
let body = ast.body.filter((v) => {
switch (v.type) {
case "FunctionDeclaration":
// we don't use these functions so we strip them out
return !["load", "init", "initSync"].includes(v.id.name);
case "ExportDefaultDeclaration":
// we will provide our own default export
return false;
default:
return true;
}
});
body.pop(); // removes `export { initSync }`
const source = generate({
...ast,
body,
});
await fs.writeFile("wasm.js", source + init);
})();