Skip to content
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
936 lines (615 sloc) 31 KB

wasm-bindgen Change Log


Released YYYY-MM-DD.


  • TODO (or remove section if none)


  • TODO (or remove section if none)


  • TODO (or remove section if none)


  • TODO (or remove section if none)


  • TODO (or remove section if none)


  • TODO (or remove section if none)


Released 2019-04-11.


  • Fixed an issue in Firefox where using encodeInto accidentally caused empty strings to keep getting passed to Rust. #1434


Released 2019-04-10.


  • Initial support for transitive NPM dependencies has been added, although support has not fully landed in wasm-pack yet so it's not 100% integrated. #1305

  • The constructor property of Object is now bound in js-sys. #1403

  • The Closure type now always implements Debug. #1408

  • Closures which take one &T argument are now supported. More implementations may be added in the future, but for now it's just one argument closures. #1417

  • The TypeScript bindings for --web now expose the init function. #1412

  • A js_sys::JsString::is_valid_utf16 method has been added to handle unpaired surrogates in JS strings. Surrounding documentation has also been updated to document this potential pitfall. #1416

  • A wasm_bindgen::function_table() function has been added to expose the WebAssembly.Table and get access to it in wasm code. #1431


  • Reexporting the wasm_bindgen macro in crates has been fixed. #1359

  • Returning u32 to JS has been fixed where large u32 values would show up in JS as large negative numbers. #1401

  • Manual instantiation with WebAssembly.Module has been fixed. #1419

  • Error message for non-Copy public struct fields has been improved. #1430


  • Performance of passing strings to Rust in Node.js has been improved. #1391

  • Performance of js_sys::try_iter has been improved. #1393

  • Performance of using TextEncoder#encodeInto has been improved. #1414


Released 2019-03-21.


  • TypeScript and JS generation will now attempt to preserve argument names in the generated JS where possible. #1344

  • Enable Option<T> support for enums defined in WebIDL. #1350

  • Add a raw_module attribute to #[wasm_bindgen] which is the same as module except doesn't attempt to recognize ./, ../, or /` prefixed paths. #1353

  • The wasm-bindgen CLI flags have now all been renamed under a --target flag. Instead of --web you'll now pass --target web, for example. This increases consistency between the wasm-bindgen and wasm-pack CLI. #1369


  • Definitions for TypedArray imports of js-sys have been unified with a macro to improve consistency and fix future bugs. #1371

  • Usage of --no-modules in CloudFlare workers should now work by default. #1384

  • A use-after-free when a closure is reinvoked after being destroyed on the Rust die has been fixed. #1385

  • A bug causing nondeterministic generation of JS bindings has been fixed. #1383


Released 2018-03-13.


  • Crates can now import locally written JS snippets to get bundled into the final output. See RFC 6 for more details as well as the PR. #1295


  • A typo in the return value of slice methods on typed arrays in js-sys was corrected. #1321

  • The directory specified by --out-dir is now created if it doesn't exist already. #1330


  • A bug where if nom was in a crate graph and was compiled with the verbose-errors feature has been fixed. Previously the wasm-bindgen-webidl crate wouldn't compile, and now it will. #1338


Released 2019-03-04.


  • Support for Option<RustStruct> in #[wasm_bindgen] functions has now been added. #1275

  • Experimental support for the anyref type proposal in WebAssembly has now landed and is enabled with WASM_BINDGEN_ANYREF=1. #1002

  • Support fot the new browser TextEncode#encodeInto API has been added. #1279

  • JS doc comments are now added to TypeScript bindings in addition to the JS bindings generated. #1302

  • Initial support for FnOnce closures has been added to the Closure type. #1281


  • Fixed an internal assert tripping when some modules were compiled with LTO. #1274

  • The Context type in the wasm-bindgen-test crate had its JS name changed to avoid conflicts with other crates that have a Context type being exported. #1280

  • The headless test runner for Safari on macOS High Sierra has been fixed. #1298


  • The wasm-bindgen CLI tool now emits the producers section again with relevant bugs having been fixed in the meantime. The --remove-producers-section flag can continue to be used to omit emission of this section. #1263


Released 2019-02-15.


  • The HtmlMediaElement type now exposes a src_object getter. #1248.

  • The js_sys::Reflect type now has specializes getter/setters for u32 and f64 indices. #1225.

  • A --remove-producers-section flag has been added to the CLI tool to, well, remove the producers section from the final wasm file. #1256.


  • The wasm-bindgen CLI tool will correctly strip DWARF debug information unless --keep-debug is passed. #1255.


  • The wasm-bindgen CLI tool no longer emits the producers custom section by default to work around a webpack bug. See #1260.


Released 2019-02-12.


  • Fixed a bug where using closures and LTO together caused a panic inside the wasm-bindgen CLI tool. See #1244.


Released 2019-02-12.


  • wasm-bindgen now internally uses the walrus crate to perform its transformations of the wasm that rustc/LLVM emits. See #1237.


  • When WebAssembly.instantiateStreaming fails due to incorrect MIME type, actually properly recover. See #1243.


Released 2019-02-11.


  • Added support for optional enums. See #1214.
  • Added the UnwrapThrowExt<T> trait, which can enable smaller code sizes for panics. See #1219.


  • Some WebGlRenderingContext methods are now whitelisted to use shared slices instead of exclusive slices. See #1199.
  • Fixed TypeScript definitions for optional types. See #1201.
  • Quiet clippy warnings inside generated code. See 1207.
  • Fixed using cfg_attr and wasm_bindgen together like #[cfg_attr(..., wasm_bindgen)]. See 1208.
  • The WebAudio example program was fixed. See #1215.
  • Fixed logging HTML in wasm-bindgen-test. See #1233.
  • When WebAssembly.instantiateStreaming fails due to incorrect MIME type, properly recover. See #1235.


Released 2019-01-18.


  • Improved the Debug output of JsValue #1161

  • Bindings for JSON.stringify and its optional arguments have been added #1190


  • A bug with windows binaries being released has ben resolved.


Released 2019-01-16.


  • Added support for Web IDL sequences. This enabled bindings generation for a couple more Web APIs. We generate functions for Web APIs that take sequences to accept any iterable, and for Web APIs that return sequences, a js_sys::Array is returned. See #1152 and #1038.
  • The wasm-bindgen-test test runner will capture console.debug,, and console.warn log messages and print them to stdout now. It already supported console.log and console.error and continues to support them. See #1183 and #1184.
  • Added additional --debug-only assertions in the emitted JS glue for cases where an imported JS function that is not annotated with #[wasm_bindgen(catch)] throws an exception. This should help catch some bugs earlier! See #1179.


  • Fixed a bug where #[wasm_bindgen_test] tests would fail in non-headless Web browsers if they used console.log. See #1167.
  • Fixed a bug where returning closures from exported functions sometimes resulted in a faulty error. See #1174 and #1175.
  • Sometimes our generated TypeScript interface files had syntax errors in them (missing semicolons). This has been fixed. See #1181.


Released 2019-01-09.


  • A new spawn_local function has been added to the wasm-bindgen-futures crate. #1148

  • Built-in conversions are now available from typed arrays and Rust arrays. #1147


  • Some casing of dictionary properties in WebIDL has been fixed. #1155


Released 2019-01-07.


  • The wasm-bindgen CLI now has an --out-name argument to name the output module. #1084

  • Support for importing the default export has been added. #1106


  • All web-sys methods are now flagged as structural, fixing a few bindings. #1117


  • A small bug with LTO and closures has been fixed. #1145


Released 2018-12-04.


  • Add a #[wasm_bindgen(start)] attribute to customize the start section of the wasm module. #1057

  • Add support for producing the new "producers" section of wasm binaries #1041

  • Add support a typescript_custom_section attribute for producing custom typescript abstractions #1048

  • Generate *.d.ts files for wasm files in addition to the JS bindings #1053

  • Add a feature to assert that all attributes in #[wasm_bindgen] are used to help catch typos and mistakes #1055


  • JS glue generation has received a few small optimizations such as removing shims and removing object allocations #1033 #1030

  • JS glue now just uses one array of JS objects instead of two #1069


  • Fix a typo in the --no-modules generated JS #1045


Released 2018-11-12.


  • The js_class support is now supported on exported types to define a different class in JS than is named in Rust #1012

  • More WebIDL bindings are exposed with some internal restructuring to ignore unimplemented types at a different location #1014

  • All imported types now implement Deref to their first extends attribute (or JsValue if one isn't listed). This is intended to greatly improve the ergonomics of web-sys bindings by allowing easy access to parent class methods #1019

  • A new attribute, final, can be applied to JS imports. This attribute is relatively nuanced and best explained in documentation, but is added since structural is now the default #1019

  • A new CLI flag, --remove-name-section, can be passed to remove the wasm name section which contains the names of functions for debugging (typically not needed in release mode) #1024


  • All imported functions are now structural by default. This shouldn't change the semantics of imported functions, only how they're invoked in the JS function shims that are generated by wasm-bindgen. More discussion can be founed on RFC 5 and the PR #1019
  • JS glue assertions for moved arguments are now only emitted in debug mode, which is still off by default #1020


  • Typescript generated bindings now correctly reflect Option<T> for more types #1008

  • The JS shim code generation has been optimized for structural bindings (now the default) to include fewer JS shims and more easily optimizable for JS engines #1019

  • Passing a WebAssembly.Module to the --no-modules constructor has been fixed #1025


Released 2018-10-29.


  • Fixed an internal panic where the gc passes were being too aggressive #995


Released 2018-10-29.


  • The TypedArray.slice methods have now been bound in js-sys. #956

  • The Debug and Clone traits are now implemented for js_sys::Promise. #957

  • The js_sys::DataView type now exposes overloads to specify endianness. #966

  • When using --no-modules a WebAssembly.Module can now be directly passed into the instantiation glue. #969


  • The JsValue type is no longer considered Send. #955

  • The generated JS glue is now more robust in the face of missing APIs. #959

  • An issue with the latest version of safaridriver used to run headless tests has been resolved. #991


Released 2018-10-10.


  • Using wasm-bindgen will no longer unconditionally pull in Rust's default allocator for Wasm (dlmalloc) regardless if you configured a custom global allocator (eg wee_alloc). #947

  • Fixed web-sys build on some Windows machines. #943

  • Fixed generated ES class bindings to Rust structs that were only referenced through struct fields. #948


Released 2018-10-05.


  • Constructors for types in web-sys should now have better documentation.

  • A new vendor_prefix attribute in #[wasm_bindgen] is supported to bind APIs on the web which may have a vendor prefix (like webkitAudioContext). This is then subsequently used to fix AudioContext usage in Safari.

  • The #[wasm_bindgen(extends = Foo)] attribute now supports full paths, so you can also say #[wasm_bindgen(extends = foo::Bar)] and such.


  • The Closure<T> type is now optimized when the underlying closure is a ZST. The type now no longer allocates memory in this situation.

  • The documentation now has a list of caveats for browser support, including how TextEncoder and TextDecoder are not implemented in Edge. If you're using webpack there's a listed strategy available, and improvements to the polyfill strategy are always welcome!

  • The BaseAudioContext and AudioScheduledSourceNode types in web-sys have been deprecated as they don't exist in Safari or Edge.


  • Fixed the #[wasm_bindgen_test]'s error messages in a browser to correctly escape HTML-looking output.

  • WebIDL Attributes on Window are now correctly bound to not go through Window.prototype which doesn't exist but instead use a structural definition.

  • Fixed a codegen error when the BorrowMut trait was in scope.

  • Fixed TypeScript generation for constructors of classes, it was accidentally producing a syntactially invalid file!


Released 2018-09-26.


  • This is the first release of the web-sys crate!

  • Added support for unions of interfaces and non-interfaces in the WebIDL frontend.

  • Added a policy for inclusion of new ECMAScript features in js-sys: the feature must be in stage 4 or greater for us to support it.

  • Added some documentation about size profiling and optimization with wasm-bindgen to the guide.

  • Added the Clamped<T> type for generating JavaScript Uint8ClampedArrays.

  • CI is now running on beta! Can't wait for the rustc release trains to roll over, so we can run CI on stable too!

  • Added the js_sys::try_iter function, which checks arbitrary JS values for compliance with the JS iteration protocol, and if they are iterable, converts them into an iterator over the JS values that they yield.


  • We now only generate null checks on methods on the JS side when in debug mode. For safety we will always null check on the Rust side, however.

  • Improved error messages when defining setters that don't start with set_ and don't use js_name = ....

  • Improved generated code for classes in a way that avoids an unnecessary allocation with static methods that return Self but are not the "main" constructor.

  • BREAKING: js_sys::Reflect APIs are all fallible now. This is because reflecting on Proxys whose trap handlers throw an exception can cause any of the reflection APIs to throw. Accordingly, js_sys has been bumped from 0.2.X to 0.3.X.


  • The method of ensuring that __wbindgen_malloc and __wbindgen_free are always emitted in the .wasm binary, regardless of seeming reachability is now zero-overhead.


Released 2018-09-21


  • The IntoIterator trait is now implemented for JS Iterator types
  • A number of variadic methods in js-sys have had explicit arities added.
  • The guide has been improved quite a bit as well as enhanced with more examples
  • The js-sys crate is now complete! Thanks so much to everyone involved to help fill out all the APIs.
  • Exported Rust functions with #[wasm_bindgen] can now return a Result where the Err payload is raised as an exception in JS.


  • An issue with running wasm-bindgen on crates that have been compiled with LTO has been resolved.


Released 2018-09-07


  • Added many more bindings for WebAssembly in the js-sys crate.


  • The "names" section of the wasm binary is now correctly preserved by wasm-bindgen.


Released 2018-09-06


  • All of wasm-bindgen is configured to compile on stable Rust as of the upcoming 1.30.0 release, scheduled for October 25, 2018.
  • The underlying JsValue of a Closure<T> type can now be extracted at any time.
  • Initial and experimental support was added for modules that have shared memory (use atomic instructions).


  • The --wasm2asm flag of wasm2es6js was removed because the wasm2asm tool has been removed from upstream Binaryen. This is replaced with the new wasm2js tool from Binaryen.


  • The "schema" version for wasm-bindgen now changes on all publishes, meaning we can't forget to update it. This means that the crate version and CLI version must exactly match.
  • The wasm-bindgen crate now has a links key which forbids multiple versions of wasm-bindgen from being linked into a dependency graph, fixing obscure linking errors with a more first-class error message.
  • Binary releases for Windows has been fixed.

0.2.19 (and 0.2.18)

Released 2018-08-27.


  • Added bindings to js-sys for some WebAssembly types.
  • Added bindings to js-sys for some Intl types.
  • Added bindings to js-sys for some String methods.
  • Added an example of using the WebAudio APIs.
  • Added an example of using the fetch API.
  • Added more extends annotations for types in js-sys.
  • Experimental support for WeakRef was added to automatically deallocate Rust objects when gc'd.
  • Added support for executing wasm-bindgen over modules that import their memory.
  • Added a global memory() function in the wasm-bindgen crate for accessing the JS object that represent wasm's own memory.


  • Removed AsMut implementations for imported objects.


  • Fixed the constructor and catch attributes combined on imported types.
  • Fixed importing the same-named static in two modules.


Released 2018-08-16.


  • Greatly expanded documentation in the wasm-bindgen guide.
  • Added bindings to js-sys for Intl.DateTimeFormat
  • Added a number of extends attributes for types in js-sys


  • Fixed compile on latest nightly with latest proc-macro2
  • Fixed compilation in some scenarios on Windows with paths in module paths


Released 2018-08-13.


  • Added the wasm_bindgen::JsCast trait, as described in RFC #2.
  • Added the #[wasm_bindgen(extends = ...)] attribute to describe inheritance relationships, as described in RFC #2.
  • Added support for receiving Option<&T> parameters from JavaScript in exported Rust functions and methods.
  • Added support for receiving Option<u32> and other option-wrapped scalars.
  • Added reference documentation to the guide for every #[wasm_bindgen] attribute and how it affects the generated bindings.
  • Published the wasm-bindgen-futures crate for converting between JS Promises and Rust Futures.


  • Overhauled the guide's documentation on passing JS closures to Rust, and Rust closures to JS.
  • Overhauled the guide's documentation on using serde to serialize complex data to JsValue and deserialize JsValues back into complex data.
  • Static methods are now always bound to their JS class, as is required for Promise's static methods.


  • Removed internal usage of syn's visit-mut cargo feature, which should result in faster build times.


  • Various usage errors for the #[wasm_bindgen] proc-macro are now properly reported with source span information, rather than panic!()s inside the proc-macro.
  • Fixed a bug where taking a struct by reference and returning a slice resulted in lexical variable redeclaration errors in the generated JS glue. #662
  • The #[wasm_bindgen(js_class = "....")] attribute for binding methods to renamed imported JS classes now properly works with constructors.


Released 2018-07-26.


  • Fixed wasm-bindgen CLI version mismatch checks that got broken in the last point release.


Released 2018-07-25.


  • Fixed compilation errors on targets that use Mach-O. #545


Released 2018-07-22.


  • Support the #[wasm_bindgen(js_name = foo)] attribute on exported functions and methods to allow renaming an export to JS. This allows JS to call it by one name and Rust to call it by another, for example using camelCase in JS and snake_case in Rust


  • Compilation with the latest nightly compiler has been fixed (nightlies on and after 2018-07-21)


Released 2018-07-19.

This release is mostly internal refactorings and minor improvements to the existing crates and functionality, but the bigs news is an upcoming js-sys and web-sys set of crates. The js-sys crate will expose all global JS bindings and the web-sys crate will be generated from WebIDL to expose all APIs browsers have. More info on this soon!


  • Support for Option<T> was added where T can be a number of slices or imported types.
  • Comments in Rust are now preserved in generated JS bindings, as well as comments being generated to indicate the types of arguments/return values.
  • The online documentation has been reorganized into a book.
  • The generated JS is now formatted better by default for readability.
  • A --keep-debug flag has been added to the CLI to retain debug sections by default. This happens by default when --debug is passed.


  • Compilation with the latest nightly compiler has been fixed (nightlies on and after 2018-07-19)
  • Declarations of an imported function in multiple crates have been fixed to not conflict.
  • Compilation with #![deny(missing_docs)] has been fixed.


Released 2018-05-24.


Released 2018-05-17.


Released 2018-05-11.

You can’t perform that action at this time.