The JS and C++ layers

uniffi-bindgen-gecko-js is split into 2 layers: JavaScript and C++. The main reason for this is that JavaScript doesn’t have a way of calling the Rust FFI functions. On Kotlin we can use JNA and on Python we can use ctypes, but there’s nothing equivalent in JavaScript. (technically there is the js-ctypes library however this has been deprecated for a long time).

The C++ layer provides the JavaScript layer with a way to call the Rust FFI functions. This can be thought of as a ctypes library specialized for UniFFI. In many ways it does less than ctypes, for example can only call UniFFI-generated FFI functions. In some ways however it does more, for example much of the async logic is built in to the C++ code.

UniFFI.webidl and WebIDL code generation

The interface between the C++ and JavaScript code is defined in UniFFI.webidl. This brings a second system of code generation, which auto-generates the C++ glue code needed to expose this interface to JavaScript. See Web IDL bindings for details.

Two different code-generators can be a bit mind-bending, but the high-level view is relatively simple. The C++ code needs to implement the interface defined in UniFFI.webidl. The JavaScript code uses that interface to handle the low-level FFI details.

The JavaScript code mostly looks like normal UniFFI bindings, while the C++ code is very unique to uniffi-bindgen-gecko-js.