4 releases

0.1.0 Apr 28, 2023
0.0.3 Jan 14, 2023
0.0.2 Sep 2, 2022
0.0.1 Aug 27, 2022

#1721 in Web programming

Download history 1005/week @ 2024-01-01 1401/week @ 2024-01-08 567/week @ 2024-01-15 1020/week @ 2024-01-22 1186/week @ 2024-01-29 682/week @ 2024-02-05 622/week @ 2024-02-12 1321/week @ 2024-02-19 1042/week @ 2024-02-26 827/week @ 2024-03-04 1098/week @ 2024-03-11 1246/week @ 2024-03-18 597/week @ 2024-03-25 1050/week @ 2024-04-01 871/week @ 2024-04-08 1107/week @ 2024-04-15

3,703 downloads per month
Used in 3 crates (via wasmer)

MIT license

63KB
1.5K SLoC

JavaScriptCore API for Rust

crates docs

This library provides a Rust API for the JavaScriptCore engine with the following goals:

  • High-level API like the JavaScriptCore API for Swift
  • Wrap the low-level C++ API instead of jsc to avoid the dependency to GTK.

Getting Started

Implementing a JavaScript runtime

Please check out PunJS for an example of how to implement a JavaScript runtime with rusty_jsc.

Evaluating a JavaScript script

use rusty_jsc::JSContext;

let mut context = JSContext::default();
let value = context.evaluate_script("'hello, world'", 1);
if let Some(value) = value {
    println!("{}", value.to_string(&context));
    // Prints:
    // hello, world
}

Callbacks from JavaScript to Rust

use rusty_jsc::{JSContext, JSValue};
use rusty_jsc_macros::callback;

// The JavaScript code calls this Rust function.
#[callback]
fn foo(_context: JSContext) {
    println!("hello from Rust land!");
}

fn main() {
    let mut context = JSContext::default();
    let callback = JSValue::callback(&context, Some(foo));
    let mut global = context.get_global_object();
    global.set_property(&context, "foo".to_string(), callback);
    context.evaluate_script("foo()", 1);
    // Prints:
    // hello from Rust land!
}

FAQ

What about the other JavaScriptCore bindings for Rust?

The wrappers in rusty_jsc are built against <JavaScriptCore/JavaScript.h> header rather than the jsc variant that requires GTK.

Why JavaScriptCore when there's already rusty_v8?

Bun has shown that JavaScriptCore is a worthy contender to V8 on the server-side, so let's bring it over to the Rust ecosystem as well.

How were the C++ low-level bindings generated?

I first used bindgen to do the rough conversion of JavaScript/JavaScript.h header and then cleaned it up by hand. The plan is to maintain the low-level bindings by hand.

Dependencies

~1.5MB
~33K SLoC