JavaScript Interoperation
WebAssembly modules declare a sequence of imports, each with a module name_and an _import name. The module name for an block can bespecified using #[link(wasm_import_module)]
, currentlyit defaults to "env".
Exports have only a single name. In addition to any extern
functions theWebAssembly instance's default linear memory is exported as "memory".
Because of wasm's limited value types, these functions must operate only onprimitive numeric types.
From the JS Side
Within JS, a wasm binary turns into an ES6 module. It must be _instantiated_with linear memory and have a set of JS functions matching the expectedimports. The details of instantiation are available on MDN.
The resulting ES6 module will contain all of the functions exported from Rust, nowavailable as JS functions.
When using wasm within JS, there is a sharp split between the wasm module'smemory and the JS memory:
By contrast, wasm code has no direct access to JS objects.
Thus, sophisticated interop happens in two main ways:
Copying in or out binary data to the wasm memory. For example, this is one wayto provide an owned to the Rust side.
Fortunately, this interop story is very amenable to treatment through a generic"bindgen"-style framework: . The framework makes it possible towrite idiomatic Rust function signatures that map to idiomatic JS functions,automatically.
Custom sections allow embedding named arbitrary data into a wasm module. Thesection data is set at compile time and is read directly from the wasm module,it cannot be modified at runtime.
In Rust, custom sections are static arrays ([T; size]
) exposed with the#[link_section]
attribute:
This adds a custom section named to the wasm file, the rust variablename SECTION
is arbitrary, changing it wouldn't alter the behaviour. Thecontents are bytes of text here but could be any arbitrary data.
The custom sections can be read on the JS side using theWebAssembly.Module.customSections
function, it takes a wasm Module and thesection name as arguments and returns an Array of s. Multiplesections may be specified using the same name, in which case they will allappear in this array.