const fsSync = require('fs'); const copyToCString = (mod, str) => { const len = mod.lengthBytesUTF8(str) + 1; const ptr = mod._malloc(len); mod.stringToUTF8(str, ptr, len); return ptr; }; const copyToCStringPtr = (mod, str, ptr) => { const allocated = copyToCString(mod, str); mod.setValue(ptr, allocated, '*'); return allocated; }; const copyFromCString = (mod, ptr) => { return mod.UTF8ToString(ptr); }; /** @return {{status: string, message: string, fiftCode: string, codeBoc: string, codeHashHex: string}} */ function compileFile(mod, filename) { const callbackPtr = mod.addFunction((_kind, _data, contents, error) => { const kind = copyFromCString(mod, _kind); const data = copyFromCString(mod, _data); if (kind === 'realpath') { copyToCStringPtr(mod, fsSync.realpathSync(data), contents); } else if (kind === 'source') { const path = fsSync.realpathSync(data); try { copyToCStringPtr(mod, fsSync.readFileSync(path).toString('utf-8'), contents); } catch (err) { copyToCStringPtr(mod, err.message, error); } } else { copyToCStringPtr(mod, 'Unknown callback kind ' + kind, error); } }, 'viiii'); const config = { optLevel: 2, sources: [filename] }; const configPtr = copyToCString(mod, JSON.stringify(config)); const responsePtr = mod._func_compile(configPtr, callbackPtr); return JSON.parse(copyFromCString(mod, responsePtr)); } async function compileWasm(fiftFuncLibJsFileName, fiftFuncLibWasmFileName) { const wasmModule = require(fiftFuncLibJsFileName) const wasmBinary = new Uint8Array(fsSync.readFileSync(fiftFuncLibWasmFileName)) return await wasmModule({ wasmBinary }) } module.exports = { compileFile, compileWasm }