Running Rust in WebAssembly in a Pool of Concurrent Web Workers in JavaScript

_config.yml

Your scientists were so preoccupied with whether or not they could, that they didn’t stop to think whether they should.

- Ian Malcolm

I would like to share a little experiment I did for no other reason than to show I could.

In this proof of concept application, the main application starts a pool of web workers that it later uses to offload a series of heavy tasks.

The task in question is to to render a single frame of a simple 3D scene using ray-tracing (path-tracing). The computationally intensive rendering is performed by a rust library compiled to WebAssembly.

These are the tools I used:

  • post-me to communicate with the workers using a Promise API: Blog - Github
  • My own toy ray tracing engine I implemented in rust a couple of years ago: Github
  • wasm-bindgen to compile rust to wasm and create js bindings: Github
  • Small in-house task queue to dispatch tasks to workers when available.
  • react for the scheleton of the app.

If you would like to run this madness, an instance of this application is deployed here.

_config.yml

If you would like to see the details of the implementation, you can find the source code of the app on Github

Bonus

Using a similar approach, I also created an app that can detect the pitch of sounds being captured by the device’s microphone.

Try it out

_config.yml

Written on January 16, 2021