|
import { dedent } from '../utils.js'; |
|
import { fetchFiles, fetchJSModules, fetchPaths, writeFileShim } from './_utils.js'; |
|
import { io, stdio } from './_io.js'; |
|
|
|
const type = 'wasmoon'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
export default { |
|
type, |
|
module: (version = '1.16.0') => |
|
`https://cdn.jsdelivr.net/npm/wasmoon@${version}/+esm`, |
|
async engine({ LuaFactory, LuaLibraries }, config) { |
|
const { stderr, stdout, get } = stdio(); |
|
const interpreter = await get(new LuaFactory().createEngine()); |
|
interpreter.global.getTable(LuaLibraries.Base, (index) => { |
|
interpreter.global.setField(index, 'print', stdout); |
|
interpreter.global.setField(index, 'printErr', stderr); |
|
}); |
|
if (config.files) await fetchFiles(this, interpreter, config.files); |
|
if (config.fetch) await fetchPaths(this, interpreter, config.fetch); |
|
if (config.js_modules) await fetchJSModules(config.js_modules); |
|
return interpreter; |
|
}, |
|
|
|
registerJSModule: (interpreter, name, value) => { |
|
interpreter.global.set(name, value); |
|
}, |
|
run: (interpreter, code, ...args) => { |
|
try { |
|
return interpreter.doStringSync(dedent(code), ...args); |
|
} |
|
catch (error) { |
|
io.get(interpreter).stderr(error); |
|
} |
|
}, |
|
runAsync: async (interpreter, code, ...args) => { |
|
try { |
|
return await interpreter.doString(dedent(code), ...args); |
|
} |
|
catch (error) { |
|
io.get(interpreter).stderr(error); |
|
} |
|
}, |
|
runEvent: async (interpreter, code, event) => { |
|
|
|
|
|
const [name, ...keys] = code.split('.'); |
|
let target = interpreter.global.get(name); |
|
let context; |
|
for (const key of keys) [context, target] = [target, target[key]]; |
|
try { |
|
await target.call(context, event); |
|
} |
|
catch (error) { |
|
io.get(interpreter).stderr(error); |
|
} |
|
}, |
|
transform: (_, value) => value, |
|
writeFile: ( |
|
{ |
|
cmodule: { |
|
module: { FS }, |
|
}, |
|
}, |
|
path, |
|
buffer, |
|
) => writeFileShim(FS, path, buffer), |
|
}; |
|
|
|
|