Show HN: Ion, a Rust/Tokio powered JavaScript runtime for embedders

30 pointsposted 9 days ago
by apatheticonion

9 Comments

laurencerowe

6 days ago

> To gain access to the Deno (and Node.js compat) standard library used by Deno requires forking deno_cli as they have largely coupled these additions to the main executable.

This is no longer the case. While it does not currently provide a stable API, that functionality exists in the deno_runtime crate and is relatively easy to reuse.

apatheticonion

4 days ago

The deno_runtime crate is indeed easy to use however the exts that provide compat for web apis and Nodejs compat still require forking deno_cli. You can use some of their ext crates https://github.com/denoland/deno/tree/main/ext but not everything.

Also using ops within Workers is challenging, particularly if they share state.

laurencerowe

a day ago

The web api extensions and Nodejs compatibility stuff are now in deno_runtime: https://github.com/denoland/deno/blob/main/runtime/Cargo.tom...

The CLI only depends on them transitively via deno_runtime: https://github.com/denoland/deno/blob/main/cli/Cargo.toml

For instance I was able to run the following script using just deno_runtime with https://github.com/lrowe/deno_varnish/blob/main/src/main.rs

    import { DatabaseSync } from "node:sqlite";
    console.log(new DatabaseSync(":memory:").prepare("SELECT 1").get());

apatheticonion

7 hours ago

Huh, it's come a long way since I last looked at it

CGamesPlay

6 days ago

The async example in the readme is weird. It appears to be an example of tokio::sleep, where you synchronously call into your library before you sleep. Nothing about your library usage is async. In fact, the whole usage of the library is blocking, so I can't even call it from my existing async code. I'm expecting: I can call my async Rust function from JavaScript, and I can await a JavaScript async method. The example should at the very least be using `async fn main`.

apatheticonion

4 days ago

You're right. I've actually removed it because it doesn't make sense.

There's now `call_blocking` and `call_async` to call a JavaScript function from Rust from normal and async call sites

01HNNWZ0MV43FF

6 days ago

Still built on v8, but it claims to present a more Rust-friendly API than competitors

apatheticonion

4 days ago

It's more that it's an abstraction that models JavaScript rather than v8. I'm actually planning to have a swappable engine with an implementation for QuickJS. It will be enabled with `JsRuntimeOptions { backend: JsRuntimeBackend::QuickJS }`.

The public API should remain the same, as will the extensions, so swapping out backends is an interesting idea to explore