WebAssembly support

Deno can execute WebAssembly modules with the same interfaces that browsers provide.

  1. // This WASM binary exports a `main` function that just returns `42` upon
  2. // invocation.
  3. const wasmCode = new Uint8Array([
  4. 0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127,
  5. 3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0,
  6. 5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145,
  7. 128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97,
  8. 105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0,
  9. 65, 42, 11
  10. ]);
  11. const wasmModule = new WebAssembly.Module(wasmCode);
  12. const wasmInstance = new WebAssembly.Instance(wasmModule);
  13. const main = wasmInstance.exports.main as CallableFunction
  14. console.log(main().toString());

Loading from files:

  1. const wasmCode = await Deno.readFile("main.wasm");
  2. const wasmModule = new WebAssembly.Module(wasmCode);
  3. const wasmInstance = new WebAssembly.Instance(wasmModule);
  4. const main = wasmInstance.exports.main as CallableFunction;
  5. console.log(main().toString());

And for loading WebAssembly modules over the network (note that the file must be served with application/wasm MIME type):

  1. const { instance, module } = await WebAssembly.instantiateStreaming(
  2. fetch("https://wpt.live/wasm/incrementer.wasm"),
  3. );
  4. const increment = instance.exports.increment as (input: number) => number;
  5. console.log(increment(41));