js 0.2.0

Call JavaScript from WebAssembly
Documentation

js-wasm

This project wants to be a simple, easy to learn, technology-agnostic way to call JavaScript from WebAssembly.

Use any WebAssembly programming language out of the box:

See a demo of it working!

How It Works

Load WebAssembly like JavaScript.

<html>
    <head>
        <script src="https://cdn.jsdelivr.net/gh/richardanaya/js-wasm/js-wasm.js"></script>
        <script type="application/wasm" src="helloworld.wasm"></script>
    </head>
    <body>
        ...
    </body>
</html>

Create JavaScript functions and invoke them

Rust:

[dependencies]
js = "0"
let fn_log = js::register_function(
    "function(strPtr,strLen){
        console.log(this.getUtf8FromMemory(strPtr,strLen)); 
    }",
);

let msg = "Hello World!";

fn_log.invoke_2(msg.as_ptr() as u32, msg.len() as u32);

C/C++:

 #include "js-wasm.h"
 
JSFunction fnLog = js_register_function(
    "function(context,strPtr,strLen){\
        console.log(thi.getUtf8FromMemory(strPtr,strLen));\
    }",
);

char *msg = "Hello World!";

js_invoke_function_2(fnLog, msg, 11);

In your JS function context is passed in to handle most issues you'll encounter

  • context.getUtf8FromMemory(start,length) - Extract utf-8 text from your program's memory.
  • context.writeUtf8ToMemory(start,str) - Write utf-8 to a memory location you are sure it should go.
  • context.storeObject(object) - Store an object in your context for later reference, get a handle you can give to WebAssembly.
  • context.getObject(handle) - Retreive and object from your context with a handle.
  • context.releaseObject(handle) - Release a stored object so it's memory can be freed.
  • context.module - Get access to your program so you can call methods on it.