Rust and JavaScript

wasm-bindgen

In order to expose a Rust function to the outside world, you need to use the #[wasm_bindgen] macro.

#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
	a + b
}

JS Snippets

To include a local JS file, you'll use the #[wasm_bindgen(module)] macro.

Default with JS module

// js/foo.js

export function add(a, b) {
  return a + b;
}
#[wasm_bindgen(module = "/js/foo.js")]
extern "C" {
    fn add(a: u32, b: u32) -> u32;
}

Async with JS namespace

window.__extern__ = {
	async_add: (a + b) => Promise.resolve(a + b);
	// or
	async_add: async (a + b) => a + b;
}
#[wasm_bindgen(js_namespace = __extern__)]
extern "C" {
	#[wasm_bindgen(catch)]
	async fn async_add(a: u32, b: u32) -> Result<JsValue, JsValue>;
}

You can also call any function declared in the window global scope but it is not recommended if you expose a lot of function.