diff --git a/crates/js-sys/src/lib.rs b/crates/js-sys/src/lib.rs index 26b2b300..07ffd5a0 100644 --- a/crates/js-sys/src/lib.rs +++ b/crates/js-sys/src/lib.rs @@ -2880,6 +2880,15 @@ pub mod WebAssembly { #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiate)] pub fn instantiate_module(module: &Module, imports: &Object) -> Promise; + /// The `WebAssembly.instantiateStreaming()` function compiles and + /// instantiates a WebAssembly module directly from a streamed + /// underlying source. This is the most efficient, optimized way to load + /// wasm code. + /// + /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming) + #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiateStreaming)] + pub fn instantiate_streaming(response: &Promise, imports: &Object) -> Promise; + /// The `WebAssembly.validate()` function validates a given typed /// array of WebAssembly binary code, returning whether the bytes /// form a valid wasm module (`true`) or not (`false`). diff --git a/crates/js-sys/tests/wasm/WebAssembly.js b/crates/js-sys/tests/wasm/WebAssembly.js index a24342f5..69404685 100644 --- a/crates/js-sys/tests/wasm/WebAssembly.js +++ b/crates/js-sys/tests/wasm/WebAssembly.js @@ -31,6 +31,12 @@ function getImports() { }; } +// Polyfill `WebAssembly.instantiateStreaming` for node. +if (!global.WebAssembly.instantiateStreaming) { + global.WebAssembly.instantiateStreaming = + (response, imports) => response.then(buf => WebAssembly.instantiate(buf, imports)); +} + module.exports = { getInvalidTableObject, getTableObject, diff --git a/crates/js-sys/tests/wasm/WebAssembly.rs b/crates/js-sys/tests/wasm/WebAssembly.rs index 72ec451a..e0b10931 100644 --- a/crates/js-sys/tests/wasm/WebAssembly.rs +++ b/crates/js-sys/tests/wasm/WebAssembly.rs @@ -183,6 +183,20 @@ fn instantiate_module() -> impl Future { }) } +#[wasm_bindgen_test(async)] +fn instantiate_streaming() -> impl Future { + let response = Promise::resolve(&get_valid_wasm()); + let imports = get_imports(); + let p = WebAssembly::instantiate_streaming(&response, &imports); + JsFuture::from(p) + .map(|obj| { + assert!( + Reflect::get(obj.as_ref(), &"instance".into()) + .is_instance_of::() + ); + }) +} + #[wasm_bindgen_test] fn memory_works() { let obj = Object::new();