Releases: wasm-bindgen/wasm-bindgen
Release list
0.2.128
Added
-
Added
OffscreenCanvasoverloads for the WebGLtexImage2D,texSubImage2D,
texImage3DandtexSubImage3Dfunctions, matching theTexImageSource
typedef in the WebGL specification.
#5312 -
Added
--split-debug-infoto the CLI. This option extracts the DWARF debug
info to a separate*_bg.debug.wasmfile. Use--debug-info-urlto set
the recorded URL for the debug info. #5279 -
Added
#[wasm_bindgen(experimental_generic_mono)]for imported functions,
which binds a generic import once per monomorphisation instead of erasing
its type parameters toJsValue. It can be applied to an individual import
or to a wholeextern "C"block, which every generic function in the block
then inherits. Each instantiation gets its own descriptor, so arguments and
return values are marshalled at their concrete types (au32crosses as a
number, aStringas a string) rather than being boxed. Trait bounds,
wherepredicates (including higher-ranked ones), associated-type
projections, lifetime parameters, argument-positionimpl Trait, raw
callbacks with owned generic inputs and returns,async,catch, and
slice_to_arrayare all supported; see
the guide
for the supported surface and the shapes that are rejected. The attribute
is experimental and may change as it stabilizes.
#5230
#5272
#5314 -
#[wasm_bindgen(experimental_generic_mono)]now supports class-level generic
parameters: an imported type that is itself generic (type Holder<T>),
used as a method receiver (this: &Holder<T>), or as the return type of a
constructor or self-returning static method (fn new<T>(value: T) -> Holder<T>). See Class-level generics
in the guide.
#5290 -
A generic imported type used as a method receiver or a constructor's return
type may now carry concrete generic arguments (this: &Holder<u32>,
this: &Holder<u32, T>). The arguments are re-emitted as written, so the
generated method hangs offimpl Holder<u32>rather than the class's own
parameter defaults.
#5290 -
Added experimental JSPI (JS Promise Integration) support: using it emits a
compiler warning noting the experimental status.
Supports#[wasm_bindgen(jspi)]on exports (sync orasync), within which
a#[wasm_bindgen(suspending)]import call can suspend to the JS event
loop until itsPromisesettles.js_sys::futures::jspi_block_on_promise
also suspends on anyPromiseinside a synchronous function, while
spawn_localis context-aware: tasks spawned from within a JSPI context
support synchronous JSPI suspensions throughout their call trees.
Compatible withcatch(rejections asErr),async, and
panic=unwind.
#5193 -
Added a
--ts-typed-array-buffersCLI flag to declare owned typed-array
return values (e.g.Vec<u8>) asUint8Array<ArrayBuffer>in generated
TypeScript, since they are always copied into a fresh, non-shared
ArrayBuffer. Requires TypeScript 5.7+.
#5263
Changed
-
Export shim symbols are now mangled with a per-crate hash, so identically
named exports from different crates (or two versions of one crate) no
longer fail the link with duplicate-symbol errors; the CLI restores the
canonical names in the final module. Same-named#[wasm_bindgen(private)]
structs/enums now coexist (numberedName,Name2, ... internally in the
generated bindings), while genuinely conflicting public exports are
reported as a wasm-bindgen error instead of a wasm-ld failure. Requires
matchingwasm-bindgenand CLI versions (schema bump).
#2247 -
Setting
js_namespaceon both anextern "C"block and an item inside it
is now a hard error. Nested paths must be written in a single attribute,
e.g.js_namespace = ["a", "b"]. The previous behavior silently dropped
the block-level namespace.
#4324 -
Changed WebGPU
setImmediatesAPIs to take immutable u8 slice.
#5289 -
Changed Web Bluetooth
writeValue/writeValueWithResponse/
writeValueWithoutResponseand WebUSBcontrolTransferOut/transferOut
/isochronousTransferOutAPIs to take immutable u8 slices.
#5309 -
Emscripten glue no longer reads
wasmExports['name']inline inside inner
functions. It now references the asmjs-mangled identifiers emcc's own
top-levelassignWasmExportsreceiving code binds for every wasm export
(e.g.___wbindgen_malloc,___wbindgen_externrefs), which are the
canonical DCE-graph pairs: wasm-metadce keeps exactly the exports the
included glue uses (previously internal exports and the externref table
could be stripped or left unrenamed by the import/export minifier at-O2,
breaking at runtime). Hoisted classes are now emitted as=-prefixed
string value snippets so jsifier declares them as
export var Class = class Class {...}instead of anexport class
declaration, which crashes emcc's acorn-optimizer under
-sMODULARIZE=instance.
Fixed
-
The thread-bootstrap transform is now skipped in Emscripten mode, where the
Emscripten runtime owns pthread startup and TLS. It previously ran on any
module with shared memory and aborted the build (failed to find __wasm_init_tls), since Emscripten's linker had already consumed the
synthetic symbols it looks for.
#5315 -
Fixed conflicting deprecation messages on
web-sysdictionary fields that
are themselves deprecated: the deprecated builder-style method no longer
points at an equally-deprecated setter, and the WebAuthn fields removed from
the specification (such asPublicKeyCredentialRpEntity'sicon) now state
why they are deprecated.
#5302 -
#[wasm_bindgen]on a struct now reports an actionable error when the path
to thewasm_bindgencrate cannot be resolved (e.g. whenwasm-bindgenis
only a transitive dependency throughweb-sys), instead of a confusing
recursion limit error.
#5295 -
Fixed
js_namespaceexports missing from the bundler target's entry module
re-export list, making namespaces unreachable when importing the package.
#5267 -
The CLI now reports an actionable error when the
__wasm_bindgen_unstable
custom section is missing from a module that still contains wasm-bindgen
shims (e.g. stripped byllvm-objcopy --strip-all, which removes all custom
sections since LLVM 23), instead of the confusing
import of `X` doesn't have an adapter listed.
#5268 -
The generated
&Thandle conversions (IntoWasmAbi/OptionIntoWasmAbi) for
an imported type with lifetime parameters (type Holder<'a, T>) no longer
reuse'afor the reference itself. Previously the impl header declared only
a fresh'aplus the type's type parameters, so a type whose lifetime was
not literally named'afailed withE0261against generated code, and one
that was named'ahad its lifetime forced to unify with the borrow of
&self— surfacing asE0521whenever a generic method also had to resolve
through the same impl.
#5290 -
An inline lifetime bound on a generic import (
fn f<'a: 'b, 'b, T>(..)) is no
longer dropped from the generated wrapper. Previously the bound was lost while
the generated shim still declared it, so calling the import failed with
"lifetime may not live long enough" reported against generated code.
#5290 -
A type-parameter default on a
#[wasm_bindgen(experimental_generic_mono)]import is no
longer silently ignored. It has no meaning there (every instantiation gets its
own shim, so there is no single one to default) and rustc's own
invalid_type_param_defaultlint cannot see it, since nothing of the original
signature survives expansion; it is now rejected with the same
defaults for generic parameters are not allowed herediagnostic rustc gives.
Defaults on the type-erasure generic path are unaffected, where they remain
meaningful.
#5290 -
Fix
js-syswasm64 build withatomicsfeature.
#5274 -
Declare
initSyncin the generated TypeScript definitions for
--target no-modules, matching thewasm_bindgen.initSyncfunction that
the JS output already exposes.
#5284 -
Removed the last panicking code paths from
externreftable management:
RefCell::borrow_mut()embe...
0.2.127
Added
-
Navigation API
toweb-sys#5247 -
Added
riscv64gc-unknown-linux-gnurelease artifacts.
#5265 -
Added
JsNullable<T>, modeling WebIDL nullable types (T | null). Both
nullandundefinedare treated as absent, per WebIDL's ECMAScript
conversion rules; the canonical empty value produced from Rust isnull.
web-sysnow usesJsNullable<T>instead ofJsOption<T>for nullable
types nested inside generics (e.g.Promise<GpuError?>from
GPUDevice.popErrorScope()), fixing spec-definednullresolutions being
treated as present values underJsOption<T>'s strict undefined-only
semantics.JsNullable<T>participates in the same upcast lattice as
JsOption<T>(including contravariant closure argument casts), and
additionally upcasts fromNulland fromJsOption<T>itself. Imported
extern types now also upcast intoJsOption<JsValue>and
JsNullable<JsValue>, so catch-all nullable closures can be used where a
typed callback is expected.
#5234
Changed
-
Emscripten output now marks public exports (free functions, classes, enums,
and namespace roots) with the__export: trueand__force: truesymbol
attributes on theiraddToLibraryentries, instead of mutating
EXPORTED_FUNCTIONSand pushing toextraLibraryFuncsat library-load time.
The$initBindgeninit closure is kept via__force: true, and private
symbols (including namespace leaves) carry neither attribute — they remain
reachable through__deps. Requires an emscripten with__export/__force
symbol-attribute support. -
Updated WebGPU bindings to the August 2026 spec, including the new
GPUCommandEncoder::copy_buffer_to_bufferoverloads andsetImmediates.
#5246 -
Unstable API overload names now elide name tokens shared by every overload
variant:LockManager::request_with_callbackis nowrequest, and
request_with_options_and_callbackis nowrequest_with_options.
#5246
Fixed
-
The
nameproperty of the JS error thrown forpanic=unwindis now set from
a string literal instead ofPanicError.name, so it survives minification.
#5260 -
Fixed Emscripten builds using pthreads failing to link.
#5254 -
__wbg_loadin web targets now throws a clear error including the HTTP
status and URL when given a non-ok fetchResponse, instead of surfacing a
misleading MIME-type or Wasm-magic-number error.
#5256 -
Restored
__stack_pointerwhen an exception unwinds out of a wasm export,
preventing repeatedpanic = "unwind"calls from leaking shadow-stack frames
until the shadow stack is exhausted and calls trap. Node reports
memory access out of bounds; poisoned instances can instead report
Module terminated.
#5244 -
slice_to_arrayon a&mutslice (which silently discarded JS's writes) or
on a slice with a generic element type is now a compile error, and strings
and arrays received by JS (e.g. aVec<String>return value) no longer make
a redundant copy of the freshly built value.
#5261 -
Fixed
asyncimports with non-JS-handle resolved types (e.g.
async fn f() -> u32;) silently producing garbage since 0.2.109: the
descriptor named the resolved type instead of thePromisehandle that
actually crosses the ABI.
#5249 -
Fixed
catchimports returningi64/u64throwing aTypeError(and
panicking in__wbindgen_exn_store) when the JS import throws, since the
handleErrorcatch path returnedundefinedwhich cannot be converted to
a Wasmi64.
#5238 -
js_namespaceis now part of an imported function's and imported static's
generated shim name. Two imports with identical Rust signatures that differed
only in theirjs_namespacehashed to the same__wbg_<name>_<hash>
symbol, so they were treated as one binding and one of the two call sites
silently invoked the wrong JS value.
#5250 -
Macro hygiene fixes -
slice_to_arraynow works in#![no_std]crates.
Generated code no longer namescoreorstdunqualified.
#5251 -
Fixed length prefixes in descriptor strings to count
chars rather than
UTF-8 bytes, so non-ASCII names injs_name/typescript_typeno longer
panic the CLI or mis-bind the generated bindings.
#5248 -
Fixed threaded Wasm memory layout to reserve wasm-bindgen's internal thread
page after the module's original initial memory instead of at__heap_base,
avoiding overlap with allocators that resolve__heap_base/__heap_endat
link time and treat that range as preexisting heap space.
#5225 -
Emscripten output now reaches wasm exports through emscripten's
wasmExports
object using bracket (string-literal) access (wasmExports['__wbindgen_start'])
instead of a localwasmalias with dot access.wasmExports['name']is the
form emcc's DCE graph roots and its import/export minifier renames in the JS
and the wasm together, so the glue now survives and stays consistent under
-O3/-Os(previously the export names were minified without updating the JS
call sites, e.g.__wbindgen_start is not defined). -
The emscripten detection marker static is no longer leaked as public API.
#5220
#5222
0.2.126
Changed
- Emscripten output now hoists every clean export (free functions, classes,
enums, plus their finalization registries and string-enum tables) out of the
$initBindgeninit closure into its own top-leveladdToLibrarysymbol and
self-registers it intoEXPORTED_FUNCTIONS. emscripten then emits the clean
API (add,Counter, ...) as named ESM exports under-sMODULARIZE=instance
and asModule.<name>properties (via each symbol's__postset) in factory
mode, with no extra sidecar files. Namespaced exports are reached through
their namespace root (e.g.app), assembled in the root symbol's__postset.
User module/inline-js imports are now wired asaddToLibraryshims (they were
previously dropped, since emcc resolves imports only againstenv), and their
ESM-imported bindings are__wbg_-prefixed to avoid colliding with emcc
runtime names such asModule/HEAP8.
#5210
Fixed
-
The descriptor interpreter now follows emscripten
invoke_*trampolines.
emscripten's exception/longjmp lowering rewrites direct calls into indirect
calls through the function table wrapped in importedinvoke_*(fnptr, ..args)
helpers, including the describe helpers a descriptor function must reach. The
interpreter resolvesfnptragainst the reconstructed function table, forwards
the trailing arguments, and evaluates the surrounding "did it throw?" control
flow (if/else,loop,br_table), so descriptors are interpreted
correctly on emscripten builds with unwinding/longjmp enabled.
#5215 -
Relaxed alignment requirement for 8-byte types.
#5204
0.2.125
Added
- Added the
--force-enable-abort-handlerCLI flag, which emits the hard-abort
detection andset_on_abortmachinery onpanic=abortbuilds. With
panic=unwindthis machinery is generated automatically; the flag does
nothing there.
#5191
Changed
- Made the internal
__wbindgen_destroy_closureexport private in the Rust API.
#5196
0.2.123
Added
-
Added the
maxAgeattribute to theCookieInitdictionary inweb-sys,
matching the current Cookie Store API specification.
#5169 -
The js-sys futures codegen opt-in can now also be enabled via the
WASM_BINDGEN_USE_JS_SYS=1environment variable, in addition to
--cfg=wasm_bindgen_use_js_sys. This works on stable when--target
is in use, where Cargo does not propagate the cfg to host proc-macros.
#5164
Changed
JsOption<T>now treats onlyundefinedas empty, aligning it with
TypeScript's strictT | undefinedsemantics and withOption<T>'s wire
shape (None↔undefined). Previouslyis_empty,as_option,
into_option,unwrap,expect,unwrap_or_default, and
unwrap_or_elsetreated bothnullandundefinedas absent; JSnull
is now a distinct present value. Theimpl<T> UpcastFrom<Null> for JsOption<T>is removed (Undefinedstill models absence), and the
Debug/Displayabsent placeholder changed from"null"to
"undefined". Code relying onnull → Noneshould returnundefined
from the JS side, or check explicitly with
val.as_option().filter(|v| !v.is_null()).
#5170
Fixed
-
Removed invalid
js_sys::Array<T>tojs_sys::ArrayTuple<(...)>upcasts.
ArrayTupleencodes a fixed tuple arity, while a plain JavaScript array does
not prove that arity statically. -
Fixed incorrect variance in
&mutreference upcasting.&mut Tupcasts
were covariant in the pointee, so a&mut Tcould be widened to a&mut
of a supertype and used to write back a value the original type would not
accept, leaving a reference whose static type no longer matches the value
it points to. Mutable references are now invariant in their pointee:
&mut Tonly upcasts to&mut Targetwhen bothTarget: UpcastFrom<T>
andT: UpcastFrom<Target>hold. This rejects the invalid widening but is
a breaking change for callers that relied on widening&mutreferences.
#5176 -
Fixed WASI targets (
wasm32-wasip1/wasm32-wasip2) emitting unresolved
__wbindgen_placeholder__imports, which broke component linking. The
codegen and runtime gates now excludetarget_os = "wasi"(restoring the
pre-0.2.115 stub behavior), including thepanic = "unwind"paths in
wasm-bindgen-futures.
#5175 -
Fixed a panic ("Unhandled load width 8") in the descriptor interpreter when
processing-Cinstrument-coverage-instrumented modules, unblocking
cargo llvm-cov --target wasm32-unknown-unknownfor crates whose describe
helpers get instrumented.
#5179 -
Fixed
mainsilently never running on wasm64 for bin crates.
#5181
0.2.122
Notices
-
Threading support now requires
-Clink-arg=--export=__heap_baseto be set
inRUSTFLAGSfor nightly toolchains from 2026-05-06 onward, after
rust-lang/rust#156174
removed the implicit__heap_base/__data_endexports onwasm*
targets. Atomics CI, CLI reference tests, and thenodejs-threads,
raytrace-parallel, andwasm-audio-workletexamples have been
updated to pass--export=__heap_baseexplicitly. The flag is
backward-compatible with older nightlies. -
-Cpanic=unwindon wasm targets now emits modern (exnref) exception
handling by default after
rust-lang/rust#156061,
and requires Node.js 22.22.3+ (forWebAssembly.JSTag). Legacy EH wasm
can still be produced on current nightlies by adding
-Cllvm-args=-wasm-use-legacy-ehtoRUSTFLAGS; Node.js 20 may be
supported with legacy exception handling, with a tracking issue in
#5151.
Added
-
Implemented
TryFromJsValueforVec<T>whereT: TryFromJsValue.
A JS value converts when it is a realArray(perArray.isArray)
and every element converts viaT::try_from_js_value. This composes
recursively (Vec<Vec<String>>,Vec<Option<T>>) and works for any
Twith aTryFromJsValueimpl, including primitives,String,
JsValue, andJsCasttypes. Array-likes (objects withlengthand
numeric indices) are intentionally rejected to mirror the static ABI
representation used byjs_value_vector_from_abi. -
New
extends_js_classandextends_js_namespaceattributes on
exported structs to allow defining the parentjs_classname when
it has been customized byjs_nameand the parent's ownjs_namespace
as well in turn. New validation is added at code generation time that
will now catch these cases instead of emitting invalid code. Example:#[wasm_bindgen(js_name = "Animal", js_namespace = zoo)] pub struct AnimalImpl { /* ... */ } #[wasm_bindgen( extends = AnimalImpl, extends_js_class = "Animal", extends_js_namespace = zoo, )] pub struct DogImpl { /* ... */ }
Changed
-
When an exported struct uses
js_namespace, the corresponding value
must now be repeated on everyimplblock. Previously the impl-side
defaults silently worked resulting in inconsistent emission. Example:// Before: #[wasm_bindgen(js_namespace = "default")] pub struct Counter { /* ... */ } #[wasm_bindgen] // worked, but fragile impl Counter { /* ... */ } // After: #[wasm_bindgen(js_namespace = "default")] pub struct Counter { /* ... */ } #[wasm_bindgen(js_namespace = "default")] // now required impl Counter { /* ... */ }
To ease this transition for
js_namespaceusage, diagnostic
messages now include hints for missing namespaces for easier
fixing.
Fixed
-
Fixed the descriptor interpreter panicking on
BrandBrIf
instructions emitted by recent nightly compilers when building with
panic=unwind.
#5158 -
Emscripten output now works against vanilla upstream emscripten without
requiring a fork. Dependency tracking,HEAP_DATA_VIEWsetup,
function-decl intrinsic inlining, catch-wrapper gating, and imported
global handling have all been corrected; ESM imports
(#[wasm_bindgen(module = "...")]and snippets) are emitted to a
sidecarlibrary_bindgen.extern-pre.jsconsumers pass to emcc via
--extern-pre-js; namespaced exports (js_namespace = [...]on a
struct/impl) now attach toModule.<segments>instead of emitting
top-levelexport const(which emcc's library evaluator rejects);
the generated.d.tsfor namespaced exports is now valid TypeScript
(mangled identifiers stay module-internal viadeclare class/
declare enum/declare functionplusexport { BindgenModule };
to mark the file as a module; no spurious unqualifiedCalc:
property onBindgenModulefor namespaced items; namespace shapes
land as plain interface members (app: { math: { Calc: typeof app__math__Calc } };) instead of the previously-emittedexport let app: { ... };which was invalid TS1131 syntax inside an
interface body).
#5156 -
Fixed a duplicate phantom class being emitted for an exported struct
renamed viajs_name(Rust ident != JS class name) and/or placed in a
js_namespace, when the struct crosses the boundary as aJsValue
(e.g. via.into()). TheWrapInExportedClass/UnwrapExportedClass
imports were keyed by the Rust ident rather than the qualified JS name
thatexported_classesis keyed by (a regression from #5154), so a
fresh empty class entry was minted and emitted alongside the real one,
with afree()referencing a nonexistent wasm export. Riding the
same release's #5154 wire-format bump, the now-vestigialrust_name
field is dropped from the schema and the namespace-qualified name is
no longer cached onAuxStruct,AuxEnum, orExportedClass
(derived on demand from(name, js_namespace)), collapsing three
fallback chains that only papered over the pre-#5154 keying.
0.2.121
Added
-
Added the
slice_to_arrayattribute for imported JS functions,
which makes a&[T](orOption<&[T]>) argument arrive on the JS
side as a plainArrayrather than a typed array — without
changing the Rust-side&[T]signature. Useful when binding JS
APIs that takeT[]rather thanTypedArray<T>. For primitive
element kinds the wire is the same zero-copy borrow used by plain
&[T], with the JS-side shim wrapping the view inArray.from(...)
to materialise theArray— no extra allocation. ForString,
JsValue, and JS-imported element types the Rust side builds a
fresh[u32]index buffer that JS reads and frees, with per-element
&T -> JsValue(refcount bump for handle-shaped types). NoT: Clonebound is required. The attribute can be set per-fn
(#[wasm_bindgen(slice_to_array)] fn ...) or per-block on an
extern "C" { ... }declaration to apply to every imported function
in that block.&[ExportedRustStruct]remains unsupported (use
ownedVec<T>for that). Has no effect on exported functions;
default&[T](typed-array view / memory borrow) and owned
Vec<T>semantics are unchanged for callers that didn't opt in.
See the
slice_to_arrayguide page.
#5145 -
Added
js_sys::AggregateErrorbindings (constructor,errorsgetter, and
new_with_message/new_with_optionsoverloads).AggregateErrorrepresents
multiple unrelated errors wrapped in a single error, e.g. as thrown by
Promise.anywhen all input promises reject, along withjs_sys::ErrorOptions,
accepted by built-in error constructors.ErrorOptions::new(cause)
constructs an instance pre-populated withcause, andget_cause/
set_causeprovide typed access to the property. All standard error
constructors that previously took only amessage(EvalError,
RangeError,ReferenceError,SyntaxError,TypeError,URIError,
WebAssembly.CompileError,WebAssembly.LinkError,
WebAssembly.RuntimeError) now expose anew_with_options(message, &ErrorOptions)overload, andErrorgains
new_with_error_options(message, &ErrorOptions)alongside the existing
untypednew_with_options.AggregateError::new_with_optionsalso takes
&ErrorOptions.
#5139 -
Added inheritance for Rust-exported types: an exported struct may
declare#[wasm_bindgen(extends = Parent)]to inherit from another
exported#[wasm_bindgen]struct. The macro injects a hidden
parent: wasm_bindgen::Parent<Parent>field (a refcounted cell around
the parent value) and emitsclass Child extends Parentin the
generated JS /.d.ts. The child gets anAsRef<Parent<Parent>>impl
for the direct parent, and threads per-class pointer slots through
the wasm ABI so thatinstanceof Parentis true and parent methods
dispatch soundly via the JS prototype chain. From inside child
methods, parent data is reached viaself.parent.borrow()/
self.parent.borrow_mut(). See the new
extendsguide page.
#5120 -
Added
js_sys::FinalizationRegistrybindings (constructor,register,
register_with_token, andunregister). The cleanup callback parameter
is typed as&Function<fn(JsValue) -> Undefined>, so closures created via
Closure::newcan be passed usingFunction::from_closure(for owned
closures retained by JS) orFunction::closure_ref(for borrowed scoped
closures). Pairs with the existingjs_sys::WeakRefbindings.
#5140 -
Added support for well-known symbols in
js_name,getter, and
settervia the explicit bracket-string form
"[Symbol.<name>]". This works for imported and exported methods,
fields, getters, and setters. For example,
#[wasm_bindgen(js_name = "[Symbol.iterator]")]on an exported method
generates[Symbol.iterator]() { ... }on the generated JS class, and
the same syntax works forgetter/setterand for imported items.
#4230 -
Added level 2 bindings for
ViewTransitiontoweb-sys.
#5138 -
Add support for dynamic unions: a
#[wasm_bindgen]enum that mixes string-literal
variants with single-field tuple variants is now exported as an untagged TypeScript
union and dispatched dynamically at the JS↔Rust boundary. The new enum-level
#[wasm_bindgen(fallback)]attribute makes the last tuple variant an
unconditional catch-all, supporting unions whose trailing variant has no
runtime check (e.g., interface-only imports). String enums and dynamic
unions now emitexport type(was baretype) so the alias is a named
export, and both honour theprivateflag to suppress the keyword.
#4734
#2153
#2088
Fixed
-
From<Promise<T>> for JsFuture<T>andIntoFuture for Promise<T>now
accept anyT: FromWasmAbi(rather thanT: JsGeneric), letting
importedasync fns return dynamic-union enums. -
TryFromJsValuefor C-style enums no longer accepts non-numeric values
via JS unary+coercion. Previously callingdyn_into::<MyEnum>()on
a string would silently coerce it via+"foo"(yieldingNaN, then
NaN as u32 = 0) and could match a discriminant by accident; the
conversion now returnsNonefor any value that is not a JS number.
#4734 -
Fix compilation failure with
no_std+release
#5134 -
Raw identifiers (
r#name) on enums, enum variants, extern types, statics,
andimplblocks no longer leak ther#prefix into generated JS / TS
output and shim names. The Rust-side identifier and the JS-side name are
now tracked separately for enum variants, and all known identifier
fallback paths applyIdent::unraw()so e.g.
pub enum r#Enum { r#A }generatesEnum.Ainstead of producing
syntactically invalid JS.
#4323 -
Using the
-C panic=unwindoption when building for the bundler target
would produce invalid JS.
#5142
Changed
js_sys::DataViewnow implements thejs_sys::TypedArraytrait. A
FIXMEnotes that the trait should be renamed toArrayBufferViewin
the next major release to better reflect the WebIDL spec name covering
bothDataViewand the typed-array types.
#5135
0.2.120
Added
-
Added support for the
wasm64-unknown-unknowntarget (memory64 / wasm64).
usize/isizeand raw pointers are now lowered through anf64JS
number ABI on wasm64 (matching the existing convention used forOption<u32>
etc. on wasm32), with the CLI inspecting the module's memory type to pick
the right codegen path. Includes a dedicatedwasm64CI job and test
suite covering the new ABI paths.
#5004 -
Promise ergonomics:
Promise::all_tupleandPromise::all_settled_tuple
for heterogeneous concurrent awaits (arity 1..=8, destructure via
.into_tuple()), and a newwasm_bindgen::IntoJsGenerictrait underpinning
typed-Arrayinference (with codegen-emitted identity impls and a
#[wasm_bindgen(no_into_js_generic)]opt-out for types likeJsClosure).
Also re-exportsJsGenericfrom the prelude. Typed collection on
js_sys::Array<T>is exposed as the inherent constructor
Array::<T>::from_iter_typed(and companionextend_typed), inferringT
from the iterator item viaIntoJsGeneric. The stableFromIterator/
Extendimpls onArray(=Array<JsValue>) bound byAsRef<JsValue>
are preserved, so existing.collect::<Array>()call sites keep compiling
unchanged. Fixes #5042.
#5121,
#5125 -
Added
wasm_bindgen::instance()to return the current
WebAssembly.Instance. The generated JS glue retains the
instantiatedWebAssembly.Instance.
#5118 -
Added a
--cfg=wasm_bindgen_use_js_sysopt-in that makes async macro codegen
usejs_sys::futuresinstead ofwasm_bindgen_futures, dropping the need
forwasm-bindgen-futureswhen the crate already depends onjs-sys. A cfg
is used rather than a Cargo feature so the choice stays scoped to the crate
that opts in.
#5112
#5127
Changed
- Simplified generated
web-sysbindings by omitting redundant
#[wasm_bindgen]attributes when they match wasm-bindgen defaults, including
structural method annotations and matchingjs_nameentries. The
#[wasm_bindgen]attribute parser now also accepts string-literal forms for
extends,static_method_of, andvendor_prefix(alongside the existing
bare-path/ident syntax), and the generator emits these arguments along with
js_nameas string literals sorustfmtcan format the generated
#[wasm_bindgen(...)]attributes uniformly.
#5122
Fixed
-
Fixed namespaced export identifiers in generated JS/TS to use qualified names
consistently, resolving order-dependent codegen issues across platforms. Also
fixedVec<T>types in TS signatures to resolve through the identifier map.
#5106 -
Fixed
wasm-bindgen-test-runnertreating ChromeDriver stderr warnings as
startup failures on macOS, causing a restart loop until timeout. The runner
no longer uses stderr output to determine if a driver has failed; instead a
per-attempt timeout detects stuck drivers and retries on a new port.
#5111
0.2.118
Added
-
Added
Error::stack_trace_limit()andError::set_stack_trace_limit()bindings
tojs-sysfor the non-standard V8Error.stackTraceLimitproperty.
#5082 -
Added support for multiple
#[wasm_bindgen(start)]functions, which are
chained together at initialization, as well as a new
#[wasm_bindgen(start, private)]to register a start function without
exporting it as a public export.
#5081 -
Reinitialization is no longer automatically applied when using
panic=unwind
and--experimental-reset-state-function, instead it is triggered by any
use of thehandler::schedule_reinit()function underpanic=unwind,
which is supported from within theon_aborthandler for reinit workflows.
Renamedhandler::reinit()tohandler::schedule_reinit()and removed
theset_on_reinit()handler. The__instance_terminatedaddress
is now always a simple boolean (0= live,1= terminated).
#5083 -
handler::schedule_reinit()now works underpanic=abortbuilds. Previously
it was a no-op; it now sets the JS-side reinit flag and the next export call
transparently creates a freshWebAssembly.Instance.
#5099
Changed
- MSRV bump from 1.71 to 1.76 for the CLI, and 1.82 to 1.86 for the API
#5102
Fixed
-
ES module
importstatements are now hoisted to the top of generated JS
files, placed right after the@ts-self-typesdirective. This ensures
valid ES module output sinceimportdeclarations must precede other
statements.
#5103 -
Fixed two CLI issues affecting WASM modules built by rustc 1.94+. First,
a panic (failed to find N in function table) caused by lld emitting element
segment offsets asglobal.get $__table_baseor extended const expressions
instead of plaini32.const Nfor large function tables; the fix adds a
const-expression evaluator inget_function_table_entryand guards against
integer underflow in multi-segment tables. Second, the descriptor interpreter
now routes all global reads/writes through a singleglobalsHashMap seeded
from the module's own globals, and mirrors the module's actual linear memory
rather than a fixed 32KB buffer, so the stack pointer's real value is valid
without any override. This fixes panics likefailed to find 32752 in function tablecaused byGOT.func.internal.*globals being misidentified as the
stack pointer.
#5076
#5080
#5093
#5095
0.2.117
Fixed
- Fixed a regression introduced in #5026 where stable
web-sysmethods that
accept a union type containing a[WbgGeneric]interface (e.g.
ImageBitmapSource, which includesVideoFrame) incorrectly applied typed
generics to all union expansions rather than only those whose argument type
is itself[WbgGeneric]. In practice this causedWindow::create_image_bitmap_with_*
and the correspondingWorkerGlobalScopeoverloads to return
Promise<ImageBitmap>instead ofPromise<JsValue>for the stable
(non-VideoFrame) call sites, breakingJsFuture::from(promise).await?.
#5064
#5073