1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-27 09:39:08 -05:00
denoland-deno/core
Andreu Botella 68782346d0
feat(core): Reland support for async ops in realms (#17204)
Currently realms are supported on `deno_core`, but there was no support
for async ops anywhere other than the main realm. The main issue is that
the `js_recv_cb` callback, which resolves promises corresponding to
async ops, was only set for the main realm, so async ops in other realms
would never resolve. Furthermore, promise ID's are specific to each
realm, which meant that async ops from other realms would result in a
wrong promise from the main realm being resolved.

This change takes the `ContextState` struct added in #17050, and adds to
it a `js_recv_cb` callback for each realm. Combined with the fact that
that same PR also added a list of known realms to `JsRuntimeState`, and
that #17174 made `OpCtx` instances realm-specific and had them include
an index into that list of known realms, this makes it possible to know
the current realm in the `queue_async_op` and `queue_fast_async_op`
methods, and therefore to send the results of promises for each realm to
that realm, and prevent the ID's from getting mixed up.

Additionally, since promise ID's are no longer unique to the isolate,
having a single set of unrefed ops doesn't work. This change therefore
also moves `unrefed_ops` from `JsRuntimeState` to `ContextState`, and
adds the lengths of the unrefed op sets for all known realms to get the
total number of unrefed ops to compare in the event loop.

This PR is a reland of #14734 after it was reverted in #16366, except
that `ContextState` and `JsRuntimeState::known_realms` were previously
relanded in #17050. Another significant difference with the original PR
is passing around an index into `JsRuntimeState::known_realms` instead
of a `v8::Global<v8::Context>` to identify the realm, because async op
queuing in fast calls cannot call into V8, and therefore cannot have
access to V8 globals. This also simplified the implementation of
`resolve_async_ops`.

Co-authored-by: Luis Malheiro <luismalheiro@gmail.com>
2023-01-14 14:40:16 +01:00
..
examples fix(npm): allow to read package.json if permissions are granted (#17209) 2023-01-10 14:35:44 +01:00
00_primordials.js chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
01_core.js chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
02_error.js chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
async_cancel.rs refactor(cli,core,ext,rt): remove some unnecessary clone or malloc (#17274) 2023-01-05 14:29:50 -05:00
async_cell.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
bindings.rs fix(npm): allow to read package.json if permissions are granted (#17209) 2023-01-10 14:35:44 +01:00
Cargo.toml chore: forward 1.29.3 release back to main (#17401) 2023-01-13 13:36:51 -05:00
encode_decode_test.js chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
error.rs refactor(cli,core,ext,rt): remove some unnecessary clone or malloc (#17274) 2023-01-05 14:29:50 -05:00
error_builder_test.js chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
error_codes.rs chore: add copyright_checker tool and add the missing copyright (#17285) 2023-01-13 16:51:32 +09:00
extensions.rs feat(core): allow specifying name and dependencies of an Extension (#17301) 2023-01-08 23:48:46 +01:00
flags.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
gotham_state.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
icudtl.dat chore: upgrade rusty_v8 to 0.43.1 (#14713) 2022-05-26 13:13:01 +02:00
inspector.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
internal.d.ts chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
io.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
lib.deno_core.d.ts chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
lib.rs fix(npm): allow to read package.json if permissions are granted (#17209) 2023-01-10 14:35:44 +01:00
module_specifier.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
modules.rs fix(npm): allow to read package.json if permissions are granted (#17209) 2023-01-10 14:35:44 +01:00
normalize_path.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
ops.rs feat(core): Reland support for async ops in realms (#17204) 2023-01-14 14:40:16 +01:00
ops_builtin.rs feat(core): allow specifying name and dependencies of an Extension (#17301) 2023-01-08 23:48:46 +01:00
ops_builtin_v8.rs feat(core): Reland support for async ops in realms (#17204) 2023-01-14 14:40:16 +01:00
ops_metrics.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
README.md chore(core): remove core.opSync (#16379) 2022-10-21 19:35:23 +05:30
resources.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
runtime.rs feat(core): Reland support for async ops in realms (#17204) 2023-01-14 14:40:16 +01:00
serialize_deserialize_test.js chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00
snapshot_util.rs chore: add copyright_checker tool and add the missing copyright (#17285) 2023-01-13 16:51:32 +09:00
source_map.rs chore: update copyright year to 2023 (#17247) 2023-01-02 21:00:42 +00:00

Deno Core Crate

crates docs

The main dependency of this crate is rusty_v8, which provides the V8-Rust bindings.

This Rust crate contains the essential V8 bindings for Deno's command-line interface (Deno CLI). The main abstraction here is the JsRuntime which provides a way to execute JavaScript.

The JsRuntime implements an event loop abstraction for the executed code that keeps track of all pending tasks (async ops, dynamic module loads). It is user's responsibility to drive that loop by using JsRuntime::run_event_loop method - it must be executed in the context of Rust's future executor (eg. tokio, smol).

Rust functions can be registered in JavaScript using deno_core::Extension. Use the Deno.core.ops.op_name() and Deno.core.opAsync("op_name", ...) functions to trigger the op function callback. A conventional way to write ops is using the deno_ops crate.

Documentation for this crate is thin at the moment. Please see hello_world.rs and http_bench_json_ops.rs as examples of usage.

TypeScript support and lots of other functionality are not available at this layer. See the CLI for that.