WebAssembly (Wasm) is a low-level portable code format offering near
native performance. It is intended as a compilation target for a wide
variety of source languages. However, Wasm provides no direct support
for non-local control flow features such as async/await,
generators/iterators, lightweight threads, first-class continuations,
etc. This means that compilers for source languages with such features
must ceremoniously transform whole source programs in order to target
Wasm.
We present WasmFX an extension to Wasm which provides a universal
target for non-local control features via effect handlers, enabling
compilers to translate such features directly into Wasm. Our
extension is minimal and only adds three main instructions for
creating, suspending, and resuming continuations. Moreover, our
primitive instructions are type-safe providing typed continuations
which are well-aligned with the design principles of Wasm whose stacks
are typed. We present a formal specification of WasmFX and show that
the extension is sound. We have implemented WasmFX as an extension to
the Wasm reference interpreter and also built a prototype WasmFX
extension for Wasmtime, a production-grade Wasm engine, piggybacking
on Wasmtime's existing fibers API. The preliminary performance
results for our prototype are encouraging, and we outline future plans
to realise a native implementation.