summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2021-04-28 18:41:50 +0200
committerGitHub <noreply@github.com>2021-04-28 18:41:50 +0200
commit0260b488fbba9a43c64641428d3603b8761067a4 (patch)
tree66ce487f9241a3b91942dd048c7e43cb192bf9e8 /runtime
parentb28f9445aae85dbf86033300cfcb55e404529a23 (diff)
core: introduce extensions (#9800)
Extensions allow declarative extensions to "JsRuntime" (ops, state, JS or middleware). This allows for: - `op_crates` to be plug-and-play & self-contained, reducing complexity leaked to consumers - op middleware (like metrics_op) to be opt-in and for new middleware (unstable, tracing,...) - `MainWorker` and `WebWorker` to be composable, allowing users to extend workers with their ops whilst benefiting from the other infrastructure (inspector, etc...) In short extensions improve deno's modularity, reducing complexity and leaky abstractions for embedders and the internal codebase.
Diffstat (limited to 'runtime')
-rw-r--r--runtime/build.rs31
-rw-r--r--runtime/metrics.rs45
-rw-r--r--runtime/ops/crypto.rs18
-rw-r--r--runtime/ops/fetch.rs40
-rw-r--r--runtime/ops/file.rs23
-rw-r--r--runtime/ops/mod.rs7
-rw-r--r--runtime/ops/runtime.rs32
-rw-r--r--runtime/ops/timers.rs28
-rw-r--r--runtime/ops/url.rs14
-rw-r--r--runtime/ops/webgpu.rs405
-rw-r--r--runtime/ops/websocket.rs33
-rw-r--r--runtime/web_worker.rs53
-rw-r--r--runtime/worker.rs49
13 files changed, 124 insertions, 654 deletions
diff --git a/runtime/build.rs b/runtime/build.rs
index efa949493..591ebaab7 100644
--- a/runtime/build.rs
+++ b/runtime/build.rs
@@ -1,5 +1,6 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
+use deno_core::Extension;
use deno_core::JsRuntime;
use deno_core::RuntimeOptions;
use std::env;
@@ -13,17 +14,8 @@ fn create_snapshot(
snapshot_path: &Path,
files: Vec<PathBuf>,
) {
- // Initialization order matters.
- deno_webidl::init(&mut js_runtime);
- deno_console::init(&mut js_runtime);
- deno_timers::init(&mut js_runtime);
- deno_url::init(&mut js_runtime);
- deno_web::init(&mut js_runtime);
- deno_file::init(&mut js_runtime);
- deno_fetch::init(&mut js_runtime);
- deno_websocket::init(&mut js_runtime);
- deno_crypto::init(&mut js_runtime);
- deno_webgpu::init(&mut js_runtime);
+ js_runtime.init_extension_js().unwrap();
+
// TODO(nayeemrmn): https://github.com/rust-lang/cargo/issues/3946 to get the
// workspace root.
let display_root = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap();
@@ -47,8 +39,25 @@ fn create_snapshot(
}
fn create_runtime_snapshot(snapshot_path: &Path, files: Vec<PathBuf>) {
+ let extensions: Vec<Extension> = vec![
+ deno_webidl::init(),
+ deno_console::init(),
+ deno_url::init(),
+ deno_web::init(),
+ deno_file::init(Default::default(), Default::default()),
+ deno_fetch::init::<deno_fetch::NoFetchPermissions>("".to_owned(), None),
+ deno_websocket::init::<deno_websocket::NoWebSocketPermissions>(
+ "".to_owned(),
+ None,
+ ),
+ deno_crypto::init(None),
+ deno_webgpu::init(false),
+ deno_timers::init::<deno_timers::NoTimersPermission>(),
+ ];
+
let js_runtime = JsRuntime::new(RuntimeOptions {
will_snapshot: true,
+ extensions,
..Default::default()
});
create_snapshot(js_runtime, snapshot_path, files);
diff --git a/runtime/metrics.rs b/runtime/metrics.rs
index a80ec5e21..efc2cb457 100644
--- a/runtime/metrics.rs
+++ b/runtime/metrics.rs
@@ -1,6 +1,51 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
+use crate::ops::UnstableChecker;
+use deno_core::error::AnyError;
+use deno_core::op_sync;
use deno_core::serde::Serialize;
+use deno_core::serde_json::json;
+use deno_core::serde_json::Value;
+use deno_core::Extension;
+use deno_core::OpState;
+use deno_core::ZeroCopyBuf;
+
+pub fn init() -> Extension {
+ Extension::new(
+ None,
+ Some(vec![("op_metrics", op_sync(op_metrics))]),
+ Some(Box::new(|state| {
+ state.put(RuntimeMetrics::default());
+ Ok(())
+ })),
+ Some(Box::new(metrics_op)),
+ )
+}
+
+#[derive(serde::Serialize)]
+struct MetricsReturn {
+ combined: OpMetrics,
+ ops: Value,
+}
+#[allow(clippy::unnecessary_wraps)]
+fn op_metrics(
+ state: &mut OpState,
+ _args: (),
+ _zero_copy: Option<ZeroCopyBuf>,
+) -> Result<MetricsReturn, AnyError> {
+ let m = state.borrow::<RuntimeMetrics>();
+ let combined = m.combined_metrics();
+ let unstable_checker = state.borrow::<UnstableChecker>();
+ let maybe_ops = if unstable_checker.unstable {
+ Some(&m.ops)
+ } else {
+ None
+ };
+ Ok(MetricsReturn {
+ combined,
+ ops: json!(maybe_ops),
+ })
+}
#[derive(Default, Debug)]
pub struct RuntimeMetrics {
pub ops: HashMap<&'static str, OpMetrics>,
diff --git a/runtime/ops/crypto.rs b/runtime/ops/crypto.rs
deleted file mode 100644
index 432cc0185..000000000
--- a/runtime/ops/crypto.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use deno_crypto::op_crypto_get_random_values;
-use deno_crypto::rand::rngs::StdRng;
-use deno_crypto::rand::SeedableRng;
-
-pub fn init(rt: &mut deno_core::JsRuntime, maybe_seed: Option<u64>) {
- if let Some(seed) = maybe_seed {
- let rng = StdRng::seed_from_u64(seed);
- let op_state = rt.op_state();
- let mut state = op_state.borrow_mut();
- state.put::<StdRng>(rng);
- }
- super::reg_sync(
- rt,
- "op_crypto_get_random_values",
- op_crypto_get_random_values,
- );
-}
diff --git a/runtime/ops/fetch.rs b/runtime/ops/fetch.rs
deleted file mode 100644
index 17656974a..000000000
--- a/runtime/ops/fetch.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use crate::permissions::Permissions;
-use deno_fetch::reqwest;
-use deno_fetch::HttpClientDefaults;
-
-pub fn init(
- rt: &mut deno_core::JsRuntime,
- user_agent: String,
- ca_data: Option<Vec<u8>>,
-) {
- {
- let op_state = rt.op_state();
- let mut state = op_state.borrow_mut();
- state.put::<reqwest::Client>({
- deno_fetch::create_http_client(user_agent.clone(), ca_data.clone())
- .unwrap()
- });
- state.put::<HttpClientDefaults>(HttpClientDefaults {
- user_agent,
- ca_data,
- });
- }
- super::reg_sync(rt, "op_fetch", deno_fetch::op_fetch::<Permissions>);
- super::reg_async(rt, "op_fetch_send", deno_fetch::op_fetch_send);
- super::reg_async(
- rt,
- "op_fetch_request_write",
- deno_fetch::op_fetch_request_write,
- );
- super::reg_async(
- rt,
- "op_fetch_response_read",
- deno_fetch::op_fetch_response_read,
- );
- super::reg_sync(
- rt,
- "op_create_http_client",
- deno_fetch::op_create_http_client::<Permissions>,
- );
-}
diff --git a/runtime/ops/file.rs b/runtime/ops/file.rs
deleted file mode 100644
index 8f471ebbd..000000000
--- a/runtime/ops/file.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use deno_core::url::Url;
-use deno_file::op_file_create_object_url;
-use deno_file::op_file_revoke_object_url;
-use deno_file::BlobUrlStore;
-use deno_file::Location;
-
-pub fn init(
- rt: &mut deno_core::JsRuntime,
- blob_url_store: BlobUrlStore,
- maybe_location: Option<Url>,
-) {
- {
- let op_state = rt.op_state();
- let mut op_state = op_state.borrow_mut();
- op_state.put(blob_url_store);
- if let Some(location) = maybe_location {
- op_state.put(Location(location));
- }
- }
- super::reg_sync(rt, "op_file_create_object_url", op_file_create_object_url);
- super::reg_sync(rt, "op_file_revoke_object_url", op_file_revoke_object_url);
-}
diff --git a/runtime/ops/mod.rs b/runtime/ops/mod.rs
index 825950d65..c46f82af6 100644
--- a/runtime/ops/mod.rs
+++ b/runtime/ops/mod.rs
@@ -1,8 +1,5 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-pub mod crypto;
-pub mod fetch;
-pub mod file;
pub mod fs;
pub mod fs_events;
pub mod http;
@@ -16,14 +13,10 @@ pub mod plugin;
pub mod process;
pub mod runtime;
pub mod signal;
-pub mod timers;
pub mod tls;
pub mod tty;
-pub mod url;
mod utils;
pub mod web_worker;
-pub mod webgpu;
-pub mod websocket;
pub mod worker_host;
use crate::metrics::metrics_op;
diff --git a/runtime/ops/runtime.rs b/runtime/ops/runtime.rs
index a02bf4548..7d84fadff 100644
--- a/runtime/ops/runtime.rs
+++ b/runtime/ops/runtime.rs
@@ -1,13 +1,8 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use crate::metrics::OpMetrics;
-use crate::metrics::RuntimeMetrics;
-use crate::ops::UnstableChecker;
use crate::permissions::Permissions;
use deno_core::error::AnyError;
use deno_core::error::Context;
-use deno_core::serde_json::json;
-use deno_core::serde_json::Value;
use deno_core::ModuleSpecifier;
use deno_core::OpState;
use deno_core::ZeroCopyBuf;
@@ -19,7 +14,6 @@ pub fn init(rt: &mut deno_core::JsRuntime, main_module: ModuleSpecifier) {
state.put::<ModuleSpecifier>(main_module);
}
super::reg_sync(rt, "op_main_module", op_main_module);
- super::reg_sync(rt, "op_metrics", op_metrics);
}
fn op_main_module(
@@ -41,32 +35,6 @@ fn op_main_module(
Ok(main)
}
-#[derive(serde::Serialize)]
-struct MetricsReturn {
- combined: OpMetrics,
- ops: Value,
-}
-
-#[allow(clippy::unnecessary_wraps)]
-fn op_metrics(
- state: &mut OpState,
- _args: (),
- _zero_copy: Option<ZeroCopyBuf>,
-) -> Result<MetricsReturn, AnyError> {
- let m = state.borrow::<RuntimeMetrics>();
- let combined = m.combined_metrics();
- let unstable_checker = state.borrow::<UnstableChecker>();
- let maybe_ops = if unstable_checker.unstable {
- Some(&m.ops)
- } else {
- None
- };
- Ok(MetricsReturn {
- combined,
- ops: json!(maybe_ops),
- })
-}
-
pub fn ppid() -> i64 {
#[cfg(windows)]
{
diff --git a/runtime/ops/timers.rs b/runtime/ops/timers.rs
deleted file mode 100644
index 3401c36f1..000000000
--- a/runtime/ops/timers.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use crate::permissions::Permissions;
-
-pub fn init(rt: &mut deno_core::JsRuntime) {
- {
- let op_state = rt.op_state();
- let mut state = op_state.borrow_mut();
- state.put(deno_timers::GlobalTimer::default());
- state.put(deno_timers::StartTime::now());
- }
- super::reg_sync(
- rt,
- "op_global_timer_stop",
- deno_timers::op_global_timer_stop,
- );
- super::reg_sync(
- rt,
- "op_global_timer_start",
- deno_timers::op_global_timer_start,
- );
- super::reg_async(rt, "op_global_timer", deno_timers::op_global_timer);
- super::reg_sync(rt, "op_now", deno_timers::op_now::<Permissions>);
- super::reg_sync(
- rt,
- "op_sleep_sync",
- deno_timers::op_sleep_sync::<Permissions>,
- );
-}
diff --git a/runtime/ops/url.rs b/runtime/ops/url.rs
deleted file mode 100644
index 5168a7242..000000000
--- a/runtime/ops/url.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use deno_url::op_url_parse;
-use deno_url::op_url_parse_search_params;
-use deno_url::op_url_stringify_search_params;
-
-pub fn init(rt: &mut deno_core::JsRuntime) {
- super::reg_sync(rt, "op_url_parse", op_url_parse);
- super::reg_sync(rt, "op_url_parse_search_params", op_url_parse_search_params);
- super::reg_sync(
- rt,
- "op_url_stringify_search_params",
- op_url_stringify_search_params,
- );
-}
diff --git a/runtime/ops/webgpu.rs b/runtime/ops/webgpu.rs
deleted file mode 100644
index 55c6d1817..000000000
--- a/runtime/ops/webgpu.rs
+++ /dev/null
@@ -1,405 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use deno_webgpu::*;
-
-pub fn init(rt: &mut deno_core::JsRuntime) {
- {
- let op_state = rt.op_state();
- let mut state = op_state.borrow_mut();
- let unstable_checker = state.borrow::<super::UnstableChecker>();
- let unstable = unstable_checker.unstable;
- state.put(Unstable(unstable));
- }
-
- super::reg_async(rt, "op_webgpu_request_adapter", op_webgpu_request_adapter);
- super::reg_async(rt, "op_webgpu_request_device", op_webgpu_request_device);
- super::reg_sync(rt, "op_webgpu_create_query_set", op_webgpu_create_query_set);
-
- {
- // buffer
- super::reg_sync(
- rt,
- "op_webgpu_create_buffer",
- buffer::op_webgpu_create_buffer,
- );
- super::reg_async(
- rt,
- "op_webgpu_buffer_get_map_async",
- buffer::op_webgpu_buffer_get_map_async,
- );
- super::reg_sync(
- rt,
- "op_webgpu_buffer_get_mapped_range",
- buffer::op_webgpu_buffer_get_mapped_range,
- );
- super::reg_sync(
- rt,
- "op_webgpu_buffer_unmap",
- buffer::op_webgpu_buffer_unmap,
- );
- }
- {
- // texture
- super::reg_sync(
- rt,
- "op_webgpu_create_texture",
- texture::op_webgpu_create_texture,
- );
- super::reg_sync(
- rt,
- "op_webgpu_create_texture_view",
- texture::op_webgpu_create_texture_view,
- );
- }
- {
- // sampler
- super::reg_sync(
- rt,
- "op_webgpu_create_sampler",
- sampler::op_webgpu_create_sampler,
- );
- }
- {
- // binding
- super::reg_sync(
- rt,
- "op_webgpu_create_bind_group_layout",
- binding::op_webgpu_create_bind_group_layout,
- );
- super::reg_sync(
- rt,
- "op_webgpu_create_pipeline_layout",
- binding::op_webgpu_create_pipeline_layout,
- );
- super::reg_sync(
- rt,
- "op_webgpu_create_bind_group",
- binding::op_webgpu_create_bind_group,
- );
- }
- {
- // pipeline
- super::reg_sync(
- rt,
- "op_webgpu_create_compute_pipeline",
- pipeline::op_webgpu_create_compute_pipeline,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pipeline_get_bind_group_layout",
- pipeline::op_webgpu_compute_pipeline_get_bind_group_layout,
- );
- super::reg_sync(
- rt,
- "op_webgpu_create_render_pipeline",
- pipeline::op_webgpu_create_render_pipeline,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pipeline_get_bind_group_layout",
- pipeline::op_webgpu_render_pipeline_get_bind_group_layout,
- );
- }
- {
- // command_encoder
- super::reg_sync(
- rt,
- "op_webgpu_create_command_encoder",
- command_encoder::op_webgpu_create_command_encoder,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_begin_render_pass",
- command_encoder::op_webgpu_command_encoder_begin_render_pass,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_begin_compute_pass",
- command_encoder::op_webgpu_command_encoder_begin_compute_pass,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_copy_buffer_to_buffer",
- command_encoder::op_webgpu_command_encoder_copy_buffer_to_buffer,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_copy_buffer_to_texture",
- command_encoder::op_webgpu_command_encoder_copy_buffer_to_texture,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_copy_texture_to_buffer",
- command_encoder::op_webgpu_command_encoder_copy_texture_to_buffer,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_copy_texture_to_texture",
- command_encoder::op_webgpu_command_encoder_copy_texture_to_texture,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_push_debug_group",
- command_encoder::op_webgpu_command_encoder_push_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_pop_debug_group",
- command_encoder::op_webgpu_command_encoder_pop_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_insert_debug_marker",
- command_encoder::op_webgpu_command_encoder_insert_debug_marker,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_write_timestamp",
- command_encoder::op_webgpu_command_encoder_write_timestamp,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_resolve_query_set",
- command_encoder::op_webgpu_command_encoder_resolve_query_set,
- );
- super::reg_sync(
- rt,
- "op_webgpu_command_encoder_finish",
- command_encoder::op_webgpu_command_encoder_finish,
- );
- }
- {
- // render_pass
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_viewport",
- render_pass::op_webgpu_render_pass_set_viewport,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_scissor_rect",
- render_pass::op_webgpu_render_pass_set_scissor_rect,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_blend_color",
- render_pass::op_webgpu_render_pass_set_blend_color,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_stencil_reference",
- render_pass::op_webgpu_render_pass_set_stencil_reference,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_begin_pipeline_statistics_query",
- render_pass::op_webgpu_render_pass_begin_pipeline_statistics_query,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_end_pipeline_statistics_query",
- render_pass::op_webgpu_render_pass_end_pipeline_statistics_query,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_write_timestamp",
- render_pass::op_webgpu_render_pass_write_timestamp,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_execute_bundles",
- render_pass::op_webgpu_render_pass_execute_bundles,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_end_pass",
- render_pass::op_webgpu_render_pass_end_pass,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_bind_group",
- render_pass::op_webgpu_render_pass_set_bind_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_push_debug_group",
- render_pass::op_webgpu_render_pass_push_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_pop_debug_group",
- render_pass::op_webgpu_render_pass_pop_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_insert_debug_marker",
- render_pass::op_webgpu_render_pass_insert_debug_marker,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_pipeline",
- render_pass::op_webgpu_render_pass_set_pipeline,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_index_buffer",
- render_pass::op_webgpu_render_pass_set_index_buffer,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_set_vertex_buffer",
- render_pass::op_webgpu_render_pass_set_vertex_buffer,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_draw",
- render_pass::op_webgpu_render_pass_draw,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_draw_indexed",
- render_pass::op_webgpu_render_pass_draw_indexed,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_draw_indirect",
- render_pass::op_webgpu_render_pass_draw_indirect,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_pass_draw_indexed_indirect",
- render_pass::op_webgpu_render_pass_draw_indexed_indirect,
- );
- }
- {
- // compute_pass
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_set_pipeline",
- compute_pass::op_webgpu_compute_pass_set_pipeline,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_dispatch",
- compute_pass::op_webgpu_compute_pass_dispatch,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_dispatch_indirect",
- compute_pass::op_webgpu_compute_pass_dispatch_indirect,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_end_pass",
- compute_pass::op_webgpu_compute_pass_end_pass,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_set_bind_group",
- compute_pass::op_webgpu_compute_pass_set_bind_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_push_debug_group",
- compute_pass::op_webgpu_compute_pass_push_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_pop_debug_group",
- compute_pass::op_webgpu_compute_pass_pop_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_compute_pass_insert_debug_marker",
- compute_pass::op_webgpu_compute_pass_insert_debug_marker,
- );
- }
- {
- // bundle
- super::reg_sync(
- rt,
- "op_webgpu_create_render_bundle_encoder",
- bundle::op_webgpu_create_render_bundle_encoder,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_finish",
- bundle::op_webgpu_render_bundle_encoder_finish,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_set_bind_group",
- bundle::op_webgpu_render_bundle_encoder_set_bind_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_push_debug_group",
- bundle::op_webgpu_render_bundle_encoder_push_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_pop_debug_group",
- bundle::op_webgpu_render_bundle_encoder_pop_debug_group,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_insert_debug_marker",
- bundle::op_webgpu_render_bundle_encoder_insert_debug_marker,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_set_pipeline",
- bundle::op_webgpu_render_bundle_encoder_set_pipeline,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_set_index_buffer",
- bundle::op_webgpu_render_bundle_encoder_set_index_buffer,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_set_vertex_buffer",
- bundle::op_webgpu_render_bundle_encoder_set_vertex_buffer,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_draw",
- bundle::op_webgpu_render_bundle_encoder_draw,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_draw_indexed",
- bundle::op_webgpu_render_bundle_encoder_draw_indexed,
- );
- super::reg_sync(
- rt,
- "op_webgpu_render_bundle_encoder_draw_indirect",
- bundle::op_webgpu_render_bundle_encoder_draw_indirect,
- );
- }
- {
- // queue
- super::reg_sync(
- rt,
- "op_webgpu_queue_submit",
- queue::op_webgpu_queue_submit,
- );
- super::reg_sync(
- rt,
- "op_webgpu_write_buffer",
- queue::op_webgpu_write_buffer,
- );
- super::reg_sync(
- rt,
- "op_webgpu_write_texture",
- queue::op_webgpu_write_texture,
- );
- }
- {
- // shader
- super::reg_sync(
- rt,
- "op_webgpu_create_shader_module",
- shader::op_webgpu_create_shader_module,
- );
- }
-}
diff --git a/runtime/ops/websocket.rs b/runtime/ops/websocket.rs
deleted file mode 100644
index 1c44f8b80..000000000
--- a/runtime/ops/websocket.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-use crate::permissions::Permissions;
-use deno_websocket::op_ws_check_permission;
-use deno_websocket::op_ws_close;
-use deno_websocket::op_ws_create;
-use deno_websocket::op_ws_next_event;
-use deno_websocket::op_ws_send;
-use deno_websocket::WsCaData;
-use deno_websocket::WsUserAgent;
-
-pub fn init(
- rt: &mut deno_core::JsRuntime,
- user_agent: String,
- ca_data: Option<Vec<u8>>,
-) {
- {
- let op_state = rt.op_state();
- let mut state = op_state.borrow_mut();
- state.put::<WsUserAgent>(WsUserAgent(user_agent));
- if let Some(ca_data) = ca_data {
- state.put::<WsCaData>(WsCaData(ca_data));
- }
- }
- super::reg_sync(
- rt,
- "op_ws_check_permission",
- op_ws_check_permission::<Permissions>,
- );
- super::reg_async(rt, "op_ws_create", op_ws_create::<Permissions>);
- super::reg_async(rt, "op_ws_send", op_ws_send);
- super::reg_async(rt, "op_ws_close", op_ws_close);
- super::reg_async(rt, "op_ws_next_event", op_ws_next_event);
-}
diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs
index f6f88f59b..5feb0212c 100644
--- a/runtime/web_worker.rs
+++ b/runtime/web_worker.rs
@@ -3,7 +3,7 @@ use crate::colors;
use crate::inspector::DenoInspector;
use crate::inspector::InspectorServer;
use crate::js;
-use crate::metrics::RuntimeMetrics;
+use crate::metrics;
use crate::ops;
use crate::permissions::Permissions;
use crate::tokio_util::create_basic_runtime;
@@ -18,6 +18,7 @@ use deno_core::serde_json;
use deno_core::serde_json::json;
use deno_core::url::Url;
use deno_core::v8;
+use deno_core::Extension;
use deno_core::GetErrorClassFn;
use deno_core::JsErrorCreateFn;
use deno_core::JsRuntime;
@@ -176,11 +177,37 @@ impl WebWorker {
worker_id: u32,
options: &WebWorkerOptions,
) -> Self {
+ let extensions: Vec<Extension> = vec![
+ // Web APIs
+ deno_webidl::init(),
+ deno_console::init(),
+ deno_url::init(),
+ deno_web::init(),
+ deno_file::init(
+ options.blob_url_store.clone(),
+ Some(main_module.clone()),
+ ),
+ deno_fetch::init::<Permissions>(
+ options.user_agent.clone(),
+ options.ca_data.clone(),
+ ),
+ deno_websocket::init::<Permissions>(
+ options.user_agent.clone(),
+ options.ca_data.clone(),
+ ),
+ deno_crypto::init(options.seed),
+ deno_webgpu::init(options.unstable),
+ deno_timers::init::<Permissions>(),
+ // Metrics
+ metrics::init(),
+ ];
+
let mut js_runtime = JsRuntime::new(RuntimeOptions {
module_loader: Some(options.module_loader.clone()),
startup_snapshot: Some(js::deno_isolate_init()),
js_error_create_fn: options.js_error_create_fn.clone(),
get_error_class_fn: options.get_error_class_fn,
+ extensions,
..Default::default()
});
@@ -220,21 +247,16 @@ impl WebWorker {
{
let op_state = js_runtime.op_state();
let mut op_state = op_state.borrow_mut();
- op_state.put(RuntimeMetrics::default());
op_state.put::<Permissions>(permissions);
op_state.put(ops::UnstableChecker {
unstable: options.unstable,
});
}
+ js_runtime.init_extension_ops().unwrap();
+
ops::web_worker::init(js_runtime, sender.clone(), handle);
- ops::runtime::init(js_runtime, main_module.clone());
- ops::fetch::init(
- js_runtime,
- options.user_agent.clone(),
- options.ca_data.clone(),
- );
- ops::timers::init(js_runtime);
+ ops::runtime::init(js_runtime, main_module);
ops::worker_host::init(
js_runtime,
Some(sender),
@@ -242,20 +264,7 @@ impl WebWorker {
);
ops::reg_sync(js_runtime, "op_close", deno_core::op_close);
ops::reg_sync(js_runtime, "op_resources", deno_core::op_resources);
- ops::url::init(js_runtime);
- ops::file::init(
- js_runtime,
- options.blob_url_store.clone(),
- Some(main_module),
- );
ops::io::init(js_runtime);
- ops::webgpu::init(js_runtime);
- ops::websocket::init(
- js_runtime,
- options.user_agent.clone(),
- options.ca_data.clone(),
- );
- ops::crypto::init(js_runtime, options.seed);
if options.use_deno_namespace {
ops::fs_events::init(js_runtime);
diff --git a/runtime/worker.rs b/runtime/worker.rs
index 6dbf8e7ec..fddaf1f01 100644
--- a/runtime/worker.rs
+++ b/runtime/worker.rs
@@ -4,7 +4,7 @@ use crate::inspector::DenoInspector;
use crate::inspector::InspectorServer;
use crate::inspector::InspectorSession;
use crate::js;
-use crate::metrics::RuntimeMetrics;
+use crate::metrics;
use crate::ops;
use crate::permissions::Permissions;
use deno_core::error::AnyError;
@@ -15,6 +15,7 @@ use deno_core::futures::stream::StreamExt;
use deno_core::serde_json;
use deno_core::serde_json::json;
use deno_core::url::Url;
+use deno_core::Extension;
use deno_core::GetErrorClassFn;
use deno_core::JsErrorCreateFn;
use deno_core::JsRuntime;
@@ -77,11 +78,35 @@ impl MainWorker {
permissions: Permissions,
options: &WorkerOptions,
) -> Self {
+ // Internal modules
+ let extensions: Vec<Extension> = vec![
+ // Web APIs
+ deno_webidl::init(),
+ deno_console::init(),
+ deno_url::init(),
+ deno_web::init(),
+ deno_file::init(options.blob_url_store.clone(), options.location.clone()),
+ deno_fetch::init::<Permissions>(
+ options.user_agent.clone(),
+ options.ca_data.clone(),
+ ),
+ deno_websocket::init::<Permissions>(
+ options.user_agent.clone(),
+ options.ca_data.clone(),
+ ),
+ deno_crypto::init(options.seed),
+ deno_webgpu::init(options.unstable),
+ deno_timers::init::<Permissions>(),
+ // Metrics
+ metrics::init(),
+ ];
+
let mut js_runtime = JsRuntime::new(RuntimeOptions {
module_loader: Some(options.module_loader.clone()),
startup_snapshot: Some(js::deno_isolate_init()),
js_error_create_fn: options.js_error_create_fn.clone(),
get_error_class_fn: options.get_error_class_fn,
+ extensions,
..Default::default()
});
@@ -109,34 +134,22 @@ impl MainWorker {
{
let op_state = js_runtime.op_state();
let mut op_state = op_state.borrow_mut();
- op_state.put(RuntimeMetrics::default());
op_state.put::<Permissions>(permissions);
op_state.put(ops::UnstableChecker {
unstable: options.unstable,
});
}
+ js_runtime.init_extension_ops().unwrap();
+
ops::runtime::init(js_runtime, main_module);
- ops::fetch::init(
- js_runtime,
- options.user_agent.clone(),
- options.ca_data.clone(),
- );
- ops::timers::init(js_runtime);
ops::worker_host::init(
js_runtime,
None,
options.create_web_worker_cb.clone(),
);
- ops::crypto::init(js_runtime, options.seed);
ops::reg_sync(js_runtime, "op_close", deno_core::op_close);
ops::reg_sync(js_runtime, "op_resources", deno_core::op_resources);
- ops::url::init(js_runtime);
- ops::file::init(
- js_runtime,
- options.blob_url_store.clone(),
- options.location.clone(),
- );
ops::fs_events::init(js_runtime);
ops::fs::init(js_runtime);
ops::http::init(js_runtime);
@@ -149,12 +162,6 @@ impl MainWorker {
ops::signal::init(js_runtime);
ops::tls::init(js_runtime);
ops::tty::init(js_runtime);
- ops::webgpu::init(js_runtime);
- ops::websocket::init(
- js_runtime,
- options.user_agent.clone(),
- options.ca_data.clone(),
- );
}
{
let op_state = js_runtime.op_state();