A foreign function interface(FFI) library for invoking Javascript functions from Web Assembly with Rust
setTimeout
)js!
macro for inline javascriptThis project has similaries to Javascript's <function>.call(<object>,a0,a1,...)
but with the limitations of Web Assembly's function call restrictions.
toml
[dependencies]
js_ffi = "0.6"
```rust
use js_ffi::*;
pub fn main() -> () {
js!(console.log).invoke_1("Hello World");
}
html
```
js!
macro. Re-use this handle as often as possible.invoke_*
function based on the number of arguments you are passing (invoke_1
,invoke_7
,etc.).JSValue
, use the appropriate call_*
function based on the number of arguments you are passing (call_1
,invoke_7
,etc.) and make sure your object is the first paramter.```rust use js_ffi::*;
fn main() { let btn = js!(document.querySelector).call1(DOCUMENT, "#button"); js!(Node.prototype.addEventListener).call2( btn, "click", createcallback0(|| { js!(window.alert).invoke_1("I was clicked"); }), ); } ```
Using an executor
library we can easily turn callbacks into futures and run behavior asynchronously.
```rust use js_ffi::*;
pub fn main() -> () { executor::spawn(async { let consolelog = js!(console.log); consolelog.invoke1("Hello"); sleep(1000).await; consolelog.invoke_1("world!"); }); }
fn sleep(millis: u32) -> impl core::future::Future { let settimeout = js!(window.setTimeout); let (future, cb) = createcallbackfuture0(); settimeout.invoke2(cb, millis); future } ```
Wrap third party libraries. Anything function in global space should be able to be wrapped and invoked.
```rust use js_ffi::*;
fn main() { let jqueryhandle = js!($); let jqueryon_handle = js!(jQuery.prototype.on); let alert = js!((msg)=>window.alert(msg));
let body = jquery_handle.invoke_1("body");
jquery_on_handle.call_2(
body,
"click",
create_callback_1(move |_event| {
alert.invoke_1("I was clicked!");
}),
);
} ```
```html
```
The script js_ffi.js
has nothing Rust specific.
js_ffi.h
js_ffi
expects an entry point main()
jsffimalloc(i32) -> i32
jsfficallback(i32,f32,f32,f32,f32,f32,f32,f32,f32,f32,f32)
0
character.This project is licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in js_ffi
by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.