-
Notifications
You must be signed in to change notification settings - Fork 23
Description
CC @superdump
I've been working on writing bindings for the transcoder wasm that basis_universal provides so that I can parse and transcode basis files in wasm. I've got a repo for this here:
https://github.com/expenses/basis-universal-rs-wasm
It'd be fantastic if we could get support for this into this crate, so that wasm support just works. A couple of notes:
-
I had to set
EXPORT_ES6=1in the emscripten link flags:I don't know if I strictly needed to do this, but it made binding with wasm-bindgen via
#[wasm_bindgen(js_name = default)]a lot easier. -
The emscripten code loads the module asyncronously, which means you can't directly import the exports in wasm-bindgen because they're only created after initialisation. To work around this I had to use reflection to create the javascript classes: https://github.com/expenses/basis-universal-rs-wasm/blob/8274f56092c930bb0dfbb35b0386235a3c5a9813/src/lib.rs#L36-L38
-
By default the emscripten code attempts to load the wasm binary from a relative url. Because wasm-bindgen copies the referenced javascript module to a snippet such as
pkg/snippets/basis-universal-wasm-8dd816e8505190b7/basis_universal/webgl/transcoder/build/basis_transcoder.jsbut does not copy anything else. this load fails.Luckily the code allows settings a
wasmBinarykey in the object that's passed in, so you can provide your own wasm file: https://github.com/expenses/basis-universal-rs-wasm/blob/master/src/lib.rs#L26-L31. I justinclude_bytes!the file for ease of use. -
Because the wrapper API is quite different from the normal API, we're probably going to have to write our own wrapper to bring the APIs to parity.
This will all take a while, but I'll try to create good bindings for the .basisu transcoder and work from there.