Ton
63 строки · 1.7 Кб
1const fsSync = require('fs');2
3const copyToCString = (mod, str) => {4const len = mod.lengthBytesUTF8(str) + 1;5const ptr = mod._malloc(len);6mod.stringToUTF8(str, ptr, len);7return ptr;8};9
10const copyToCStringPtr = (mod, str, ptr) => {11const allocated = copyToCString(mod, str);12mod.setValue(ptr, allocated, '*');13return allocated;14};15
16const copyFromCString = (mod, ptr) => {17return mod.UTF8ToString(ptr);18};19
20async function compileFile(mod, filename) {21const callbackPtr = mod.addFunction((_kind, _data, contents, error) => {22const kind = copyFromCString(mod, _kind);23const data = copyFromCString(mod, _data);24if (kind === 'realpath') {25copyToCStringPtr(mod, fsSync.realpathSync(data), contents);26} else if (kind === 'source') {27const path = fsSync.realpathSync(data);28try {29copyToCStringPtr(mod, fsSync.readFileSync(path).toString('utf-8'), contents);30} catch (err) {31copyToCStringPtr(mod, e.message, error);32}33} else {34copyToCStringPtr(mod, 'Unknown callback kind ' + kind, error);35}36}, 'viiii');37
38const config = {39optLevel: 2,40sources: [filename]41};42
43const configPtr = copyToCString(mod, JSON.stringify(config));44
45const responsePtr = mod._func_compile(configPtr, callbackPtr);46
47return JSON.parse(copyFromCString(mod, responsePtr));48}
49
50const wasmModule = require(process.env.FUNCFIFTLIB_MODULE)51
52const wasmBinary = new Uint8Array(fsSync.readFileSync(process.env.FUNCFIFTLIB_WASM))53
54async function compileWasm() {55const mod = await wasmModule({ wasmBinary })56
57return mod58}
59
60module.exports = {61compileFile,62compileWasm
63}
64