#script #javascript #runtime #engine #spidermonkey

es_runtime

An API and Utils around the spidermonkey script engine

11 releases

0.1.4 Jun 1, 2020
0.1.3 Apr 10, 2020
0.0.6 Apr 4, 2020
0.0.4 Mar 31, 2020

#373 in Development tools

Download history 17/week @ 2021-04-13 28/week @ 2021-04-20 12/week @ 2021-05-04 8/week @ 2021-05-11 11/week @ 2021-05-18 16/week @ 2021-06-08 1/week @ 2021-06-22 4/week @ 2021-06-29 1/week @ 2021-07-06 13/week @ 2021-07-20 23/week @ 2021-07-27

77 downloads per month

GPL-3.0 license

150KB
3.5K SLoC

es_runtime

es_runtime is a crate aimed at making it possible for rust developers to integrate an ECMA-Script engine in their rust projects without having specialized knowledge about ECMA-Script engines.

The engine used is the Mozilla SpiderMonkey engine (https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey).

This project was started as a hobby project for me to learn rust. I hope some of you find it useful to learn about using spidermonkey from rust.

status

for the current status and versions please see https://github.com/DRFos/es_runtime

The version published on crates.io is based on mozjs 0.10.1 which is the latest published verion of mozjs.

The more current version depends on the github repo of mozjs but because of that it cannot be published to crates.io

Please see the CHANGELOG for what's new.

0.1 goals

  • Get a grip on when to use rooted values (Handle) and when to use Values (JSVal)
  • Easy loading script files
  • Error handling (get ES errors in rust with filename/linenumber etc)
  • Adding rust function to the engine so they are callable from ECMA-Script
    • Blocking
    • Non-blocking (returns a Promise in script)
  • Easy way to call ECMA-Script functions from rust
    • By name (run_global_function())
    • By object name and name (myObj.doSomething())
    • Passing params from rust
  • Getting data from engine as primitives or Vecs and Maps
    • Primitives
    • Objects from and to Maps
    • Arrays as Vecs
  • Working console (logging)
  • Working Promises in Script
  • Waiting for Promises from rust
  • import/export statement support
    • cache modules
  • No more memory leaks

0.2 and beyond goals

please see https://github.com/DRFos/es_runtime

Other plans

I'm also working on a more feature rich runtime with a commandline tool and also an application server based on this runtime

for updates on the status of those please see https://github.com/DRFos

I'd like to hear what you would want to see in this project and or what you'd like to use it for, please drop me a line @ incoming+drfos-es-runtime-17727229-issue-@incoming.gitlab.com

examples

Cargo.toml

  • for the latest version
[dependencies]
es_runtime = {git = "https://github.com/DRFos/es_runtime"}
# but you should check in the repo for the tag or branch you want to use and link to that
# es_runtime = {git = "https://github.com/DRFos/es_runtime", tag = "0.3.5"}
  • for the published version
[dependencies]
es_runtime = "0.1"

my_app.rs


    #[test]
    fn example() {
        // start a runtime

        let rt = EsRuntimeWrapper::builder()
                    // run the garbage collector every 5 secs
                    .gc_interval(Duration::from_secs(5))
                    .build();
    
        // create an example object

        rt.eval_sync("this.myObj = {a: 1, b: 2};", "test1.es")
            .ok()
            .unwrap();

        // register a native rust method

        rt.register_op(
            "my_rusty_op",
            Box::new(|_sm_rt, args: Vec<EsValueFacade>| {
                let a = args.get(0).unwrap().get_i32();
                let b = args.get(1).unwrap().get_i32();
                Ok(EsValueFacade::new_i32(a * b))
            }),
        );

        // call the rust method from ES

        rt.eval_sync(
            "this.myObj.c = esses.invoke_rust_op_sync('my_rusty_op', 3, 7);",
            "test2.es",
        )
        .ok()
        .unwrap();

        let c: Result<EsValueFacade, EsErrorInfo> =
            rt.eval_sync("(this.myObj.c);", "test3.es");

        assert_eq!(&21, c.ok().unwrap().get_i32());

        // define an ES method and calling it from rust

        rt.eval_sync("this.my_method = (a, b) => {return a * b;};", "test4.es")
            .ok()
            .unwrap();

        let args = vec![EsValueFacade::new_i32(12), EsValueFacade::new_i32(5)];
        let c_res: Result<EsValueFacade, EsErrorInfo> = rt.call_sync("my_method", args);
        let c: EsValueFacade = c_res.ok().unwrap();
        assert_eq!(&60, c.get_i32());
    }



a word on compiling

Currently I have only compiled this on and for a 64 bit linux machine (I use openSUSE)

Besides rust you'll need to install the following packages to compile the mozjs crate

  • gcc-7
  • autoconf2.13
  • automake
  • clang
  • python

for more detailed info please visit https://github.com/servo/mozjs#building

howtos

HOWTO

Dependencies

~77MB
~1.5M SLoC