2021-12-01 15:47:56 +03:00

78 lines
2.6 KiB
JavaScript

import { WASI } from '@wasmer/wasi'
import browserBindings from '@wasmer/wasi/lib/bindings/browser'
import { WasmFs } from '@wasmer/wasmfs'
import init, { register_module, call_module} from "./marine_web_runtime.js";
const greetingPath = '/greeting.wasm' // Path to our WASI module
const avmPath = '/air_interpreter_server.wasm' // Path to our WASI module
const echoStr = 'Hello World!' // Text string to echo
//window.MARINE_WASM_MODULES = {}
// Instantiate new WASI and WasmFs Instances
// IMPORTANT:
// Instantiating WasmFs is only needed when running in a browser.
// When running on the server, NodeJS's native FS module is assigned by default
const wasmFs = new WasmFs()
let wasi = new WASI({
// Arguments passed to the Wasm Module
// The first argument is usually the filepath to the executable WASI module
// we want to run.
args: [],
// Environment variables that are accesible to the WASI module
env: {},
// Bindings that are used by the WASI Instance (fs, path, etc...)
bindings: {
...browserBindings,
fs: wasmFs.fs
}
})
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Async function to run our WASI module/instance
async function loadMarineModule(modulePath, moduleName) {
console.log("loading", moduleName);
let response = await fetch(modulePath)
let wasmBytes = new Uint8Array(await response.arrayBuffer())
let wasmModule = await WebAssembly.compile(wasmBytes);
console.log(wasmModule)
let instance = await WebAssembly.instantiate(wasmModule, {
...wasi.getImports(wasmModule),
});
console.log(instance)
//window.MARINE_WASM_MODULES[moduleName] = instance;
wasi.start(instance) // Start the WASI instance
let custom_sections = WebAssembly.Module.customSections(wasmModule,"interface-types");
console.log(custom_sections)
let custom_section2 = new Uint8Array(custom_sections[0])
return {
name: moduleName,
custom_section: custom_section2,
instance: instance,
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Everything starts here
async function main() {
let greeting = await loadMarineModule(greetingPath, "greeting");
let avm = await loadMarineModule(avmPath, "avm");
await init()
//register_module(avm.name, avm.custom_section)
register_module(greeting.name, greeting.custom_section, greeting.instance)
//test_call_avm()
let result = call_module(greeting.name, "greeting", JSON.stringify(["js"]));
console.log("JS: got result from call_module:", result)
}
main()