Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Show HN: Ion, a Rust/Tokio powered JavaScript runtime for embedders (github.com/alshdavid)
30 points by apatheticonion 9 months ago | hide | past | favorite | 8 comments


> 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.


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.


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());


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


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`.


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


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


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




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: