summaryrefslogtreecommitdiff
path: root/runtime/ops
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2023-03-17 12:22:15 -0600
committerGitHub <noreply@github.com>2023-03-17 18:22:15 +0000
commite55b448730160a6e4df9815a268d4049ac89deab (patch)
tree35d80fd60f2f1d1d06903caff256484a7d703d76 /runtime/ops
parent0bc6bf5d33b8198253954d7f04558270de45c925 (diff)
feat(core) deno_core::extension! macro to simplify extension registration (#18210)
This implements two macros to simplify extension registration and centralize a lot of the boilerplate as a base for future improvements: * `deno_core::ops!` registers a block of `#[op]`s, optionally with type parameters, useful for places where we share lists of ops * `deno_core::extension!` is used to register an extension, and creates two methods that can be used at runtime/snapshot generation time: `init_ops` and `init_ops_and_esm`. --------- Co-authored-by: Bartek IwaƄczuk <biwanczuk@gmail.com>
Diffstat (limited to 'runtime/ops')
-rw-r--r--runtime/ops/fs_events.rs10
-rw-r--r--runtime/ops/http.rs14
-rw-r--r--runtime/ops/os/mod.rs86
-rw-r--r--runtime/ops/permissions.rs18
-rw-r--r--runtime/ops/process.rs24
-rw-r--r--runtime/ops/runtime.rs17
-rw-r--r--runtime/ops/signal.rs14
-rw-r--r--runtime/ops/tty.rs14
-rw-r--r--runtime/ops/web_worker.rs24
-rw-r--r--runtime/ops/worker_host.rs67
10 files changed, 130 insertions, 158 deletions
diff --git a/runtime/ops/fs_events.rs b/runtime/ops/fs_events.rs
index e550d204c..05cc22152 100644
--- a/runtime/ops/fs_events.rs
+++ b/runtime/ops/fs_events.rs
@@ -13,7 +13,6 @@ use deno_core::ResourceId;
use deno_core::op;
-use deno_core::Extension;
use notify::event::Event as NotifyEvent;
use notify::Error as NotifyError;
use notify::EventKind;
@@ -29,11 +28,10 @@ use std::path::PathBuf;
use std::rc::Rc;
use tokio::sync::mpsc;
-pub fn init() -> Extension {
- Extension::builder("deno_fs_events")
- .ops(vec![op_fs_events_open::decl(), op_fs_events_poll::decl()])
- .build()
-}
+deno_core::extension!(
+ deno_fs_events,
+ ops = [op_fs_events_open, op_fs_events_poll]
+);
struct FsEventsResource {
#[allow(unused)]
diff --git a/runtime/ops/http.rs b/runtime/ops/http.rs
index 51562589e..b9899b4e3 100644
--- a/runtime/ops/http.rs
+++ b/runtime/ops/http.rs
@@ -8,7 +8,6 @@ use deno_core::error::bad_resource_id;
use deno_core::error::custom_error;
use deno_core::error::AnyError;
use deno_core::op;
-use deno_core::Extension;
use deno_core::OpState;
use deno_core::RcRef;
use deno_core::ResourceId;
@@ -28,15 +27,10 @@ use deno_net::io::UnixStreamResource;
#[cfg(unix)]
use tokio::net::UnixStream;
-pub fn init() -> Extension {
- Extension::builder("deno_http_runtime")
- .ops(vec![
- op_http_start::decl(),
- op_http_upgrade::decl(),
- op_flash_upgrade_http::decl(),
- ])
- .build()
-}
+deno_core::extension!(
+ deno_http_runtime,
+ ops = [op_http_start, op_http_upgrade, op_flash_upgrade_http],
+);
#[op]
fn op_http_start(
diff --git a/runtime/ops/os/mod.rs b/runtime/ops/os/mod.rs
index b2c67db5c..87181654b 100644
--- a/runtime/ops/os/mod.rs
+++ b/runtime/ops/os/mod.rs
@@ -8,8 +8,6 @@ use deno_core::error::AnyError;
use deno_core::op;
use deno_core::url::Url;
use deno_core::v8;
-use deno_core::Extension;
-use deno_core::ExtensionBuilder;
use deno_core::OpState;
use deno_node::NODE_ENV_VAR_ALLOWLIST;
use serde::Serialize;
@@ -18,47 +16,49 @@ use std::env;
mod sys_info;
-fn init_ops(builder: &mut ExtensionBuilder) -> &mut ExtensionBuilder {
- builder.ops(vec![
- op_env::decl(),
- op_exec_path::decl(),
- op_exit::decl(),
- op_delete_env::decl(),
- op_get_env::decl(),
- op_gid::decl(),
- op_hostname::decl(),
- op_loadavg::decl(),
- op_network_interfaces::decl(),
- op_os_release::decl(),
- op_os_uptime::decl(),
- op_node_unstable_os_uptime::decl(),
- op_set_env::decl(),
- op_set_exit_code::decl(),
- op_system_memory_info::decl(),
- op_uid::decl(),
- op_runtime_memory_usage::decl(),
- ])
-}
-
-pub fn init(exit_code: ExitCode) -> Extension {
- let mut builder = Extension::builder("deno_os");
- init_ops(&mut builder)
- .state(move |state| {
- state.put::<ExitCode>(exit_code.clone());
- })
- .build()
-}
-
-pub fn init_for_worker() -> Extension {
- let mut builder = Extension::builder("deno_os_worker");
- init_ops(&mut builder)
- .middleware(|op| match op.name {
- "op_exit" => noop_op::decl(),
- "op_set_exit_code" => noop_op::decl(),
- _ => op,
- })
- .build()
-}
+deno_core::ops!(
+ deno_ops,
+ [
+ op_env,
+ op_exec_path,
+ op_exit,
+ op_delete_env,
+ op_get_env,
+ op_gid,
+ op_hostname,
+ op_loadavg,
+ op_network_interfaces,
+ op_os_release,
+ op_os_uptime,
+ op_node_unstable_os_uptime,
+ op_set_env,
+ op_set_exit_code,
+ op_system_memory_info,
+ op_uid,
+ op_runtime_memory_usage,
+ ]
+);
+
+deno_core::extension!(
+ deno_os,
+ ops_fn = deno_ops,
+ config = {
+ exit_code: ExitCode,
+ },
+ state = |state, exit_code| {
+ state.put::<ExitCode>(exit_code);
+ },
+);
+
+deno_core::extension!(
+ deno_os_worker,
+ ops_fn = deno_ops,
+ middleware = |op| match op.name {
+ "op_exit" => noop_op::decl(),
+ "op_set_exit_code" => noop_op::decl(),
+ _ => op,
+ },
+);
#[op]
fn noop_op() -> Result<(), AnyError> {
diff --git a/runtime/ops/permissions.rs b/runtime/ops/permissions.rs
index 3c48c1e8d..c08d11e4a 100644
--- a/runtime/ops/permissions.rs
+++ b/runtime/ops/permissions.rs
@@ -7,20 +7,18 @@ use deno_core::error::uri_error;
use deno_core::error::AnyError;
use deno_core::op;
use deno_core::url;
-use deno_core::Extension;
use deno_core::OpState;
use serde::Deserialize;
use std::path::Path;
-pub fn init() -> Extension {
- Extension::builder("deno_permissions")
- .ops(vec![
- op_query_permission::decl(),
- op_revoke_permission::decl(),
- op_request_permission::decl(),
- ])
- .build()
-}
+deno_core::extension!(
+ deno_permissions,
+ ops = [
+ op_query_permission,
+ op_revoke_permission,
+ op_request_permission,
+ ]
+);
#[derive(Deserialize)]
pub struct PermissionArgs {
diff --git a/runtime/ops/process.rs b/runtime/ops/process.rs
index 20db96af9..a15b63f80 100644
--- a/runtime/ops/process.rs
+++ b/runtime/ops/process.rs
@@ -7,7 +7,6 @@ use deno_core::op;
use deno_core::serde_json;
use deno_core::AsyncMutFuture;
use deno_core::AsyncRefCell;
-use deno_core::Extension;
use deno_core::OpState;
use deno_core::RcRef;
use deno_core::Resource;
@@ -99,18 +98,17 @@ impl StdioOrRid {
}
}
-pub fn init_ops() -> Extension {
- Extension::builder("deno_process")
- .ops(vec![
- op_spawn_child::decl(),
- op_spawn_wait::decl(),
- op_spawn_sync::decl(),
- deprecated::op_run::decl(),
- deprecated::op_run_status::decl(),
- deprecated::op_kill::decl(),
- ])
- .build()
-}
+deno_core::extension!(
+ deno_process,
+ ops = [
+ op_spawn_child,
+ op_spawn_wait,
+ op_spawn_sync,
+ deprecated::op_run,
+ deprecated::op_run_status,
+ deprecated::op_kill,
+ ]
+);
struct ChildResource(tokio::process::Child);
diff --git a/runtime/ops/runtime.rs b/runtime/ops/runtime.rs
index 5ce9966e0..564d2279b 100644
--- a/runtime/ops/runtime.rs
+++ b/runtime/ops/runtime.rs
@@ -3,18 +3,17 @@
use crate::permissions::PermissionsContainer;
use deno_core::error::AnyError;
use deno_core::op;
-use deno_core::Extension;
use deno_core::ModuleSpecifier;
use deno_core::OpState;
-pub fn init(main_module: ModuleSpecifier) -> Extension {
- Extension::builder("deno_runtime")
- .ops(vec![op_main_module::decl()])
- .state(move |state| {
- state.put::<ModuleSpecifier>(main_module.clone());
- })
- .build()
-}
+deno_core::extension!(
+ deno_runtime,
+ ops = [op_main_module],
+ config = { main_module: ModuleSpecifier },
+ state = |state, main_module| {
+ state.put::<ModuleSpecifier>(main_module);
+ }
+);
#[op]
fn op_main_module(state: &mut OpState) -> Result<String, AnyError> {
diff --git a/runtime/ops/signal.rs b/runtime/ops/signal.rs
index c2105a64e..9cc261d85 100644
--- a/runtime/ops/signal.rs
+++ b/runtime/ops/signal.rs
@@ -5,7 +5,6 @@ use deno_core::op;
use deno_core::AsyncRefCell;
use deno_core::CancelFuture;
use deno_core::CancelHandle;
-use deno_core::Extension;
use deno_core::OpState;
use deno_core::RcRef;
use deno_core::Resource;
@@ -30,15 +29,10 @@ use tokio::signal::windows::CtrlBreak;
#[cfg(windows)]
use tokio::signal::windows::CtrlC;
-pub fn init() -> Extension {
- Extension::builder("deno_signal")
- .ops(vec![
- op_signal_bind::decl(),
- op_signal_unbind::decl(),
- op_signal_poll::decl(),
- ])
- .build()
-}
+deno_core::extension!(
+ deno_signal,
+ ops = [op_signal_bind, op_signal_unbind, op_signal_poll]
+);
#[cfg(unix)]
/// The resource for signal stream.
diff --git a/runtime/ops/tty.rs b/runtime/ops/tty.rs
index d577a6755..60144e408 100644
--- a/runtime/ops/tty.rs
+++ b/runtime/ops/tty.rs
@@ -2,7 +2,6 @@
use deno_core::error::AnyError;
use deno_core::op;
-use deno_core::Extension;
use deno_core::OpState;
use deno_io::StdFileResource;
use std::io::Error;
@@ -33,15 +32,10 @@ fn get_windows_handle(
Ok(handle)
}
-pub fn init() -> Extension {
- Extension::builder("deno_tty")
- .ops(vec![
- op_stdin_set_raw::decl(),
- op_isatty::decl(),
- op_console_size::decl(),
- ])
- .build()
-}
+deno_core::extension!(
+ deno_tty,
+ ops = [op_stdin_set_raw, op_isatty, op_console_size]
+);
// ref: <https://learn.microsoft.com/en-us/windows/console/setconsolemode>
#[cfg(windows)]
diff --git a/runtime/ops/web_worker.rs b/runtime/ops/web_worker.rs
index 617615424..45137913e 100644
--- a/runtime/ops/web_worker.rs
+++ b/runtime/ops/web_worker.rs
@@ -8,7 +8,6 @@ use deno_core::error::AnyError;
use deno_core::op;
use deno_core::CancelFuture;
-use deno_core::Extension;
use deno_core::OpState;
use deno_web::JsMessageData;
use std::cell::RefCell;
@@ -16,18 +15,17 @@ use std::rc::Rc;
use self::sync_fetch::op_worker_sync_fetch;
-pub fn init() -> Extension {
- Extension::builder("deno_web_worker")
- .ops(vec![
- op_worker_post_message::decl(),
- op_worker_recv_message::decl(),
- // Notify host that guest worker closes.
- op_worker_close::decl(),
- op_worker_get_type::decl(),
- op_worker_sync_fetch::decl(),
- ])
- .build()
-}
+deno_core::extension!(
+ deno_web_worker,
+ ops = [
+ op_worker_post_message,
+ op_worker_recv_message,
+ // Notify host that guest worker closes.
+ op_worker_close,
+ op_worker_get_type,
+ op_worker_sync_fetch,
+ ]
+);
#[op]
fn op_worker_post_message(
diff --git a/runtime/ops/worker_host.rs b/runtime/ops/worker_host.rs
index 6007a3260..de7e02e18 100644
--- a/runtime/ops/worker_host.rs
+++ b/runtime/ops/worker_host.rs
@@ -18,7 +18,6 @@ use deno_core::op;
use deno_core::serde::Deserialize;
use deno_core::CancelFuture;
use deno_core::CancelHandle;
-use deno_core::Extension;
use deno_core::ModuleSpecifier;
use deno_core::OpState;
use deno_web::JsMessageData;
@@ -88,39 +87,39 @@ impl Drop for WorkerThread {
pub type WorkersTable = HashMap<WorkerId, WorkerThread>;
-pub fn init(
- create_web_worker_cb: Arc<CreateWebWorkerCb>,
- preload_module_cb: Arc<WorkerEventCb>,
- pre_execute_module_cb: Arc<WorkerEventCb>,
- format_js_error_fn: Option<Arc<FormatJsErrorFn>>,
-) -> Extension {
- Extension::builder("deno_worker_host")
- .state(move |state| {
- state.put::<WorkersTable>(WorkersTable::default());
- state.put::<WorkerId>(WorkerId::default());
-
- let create_web_worker_cb_holder =
- CreateWebWorkerCbHolder(create_web_worker_cb.clone());
- state.put::<CreateWebWorkerCbHolder>(create_web_worker_cb_holder);
- let preload_module_cb_holder =
- PreloadModuleCbHolder(preload_module_cb.clone());
- state.put::<PreloadModuleCbHolder>(preload_module_cb_holder);
- let pre_execute_module_cb_holder =
- PreExecuteModuleCbHolder(pre_execute_module_cb.clone());
- state.put::<PreExecuteModuleCbHolder>(pre_execute_module_cb_holder);
- let format_js_error_fn_holder =
- FormatJsErrorFnHolder(format_js_error_fn.clone());
- state.put::<FormatJsErrorFnHolder>(format_js_error_fn_holder);
- })
- .ops(vec![
- op_create_worker::decl(),
- op_host_terminate_worker::decl(),
- op_host_post_message::decl(),
- op_host_recv_ctrl::decl(),
- op_host_recv_message::decl(),
- ])
- .build()
-}
+deno_core::extension!(
+ deno_worker_host,
+ ops = [
+ op_create_worker,
+ op_host_terminate_worker,
+ op_host_post_message,
+ op_host_recv_ctrl,
+ op_host_recv_message,
+ ],
+ config = {
+ create_web_worker_cb: Arc<CreateWebWorkerCb>,
+ preload_module_cb: Arc<WorkerEventCb>,
+ pre_execute_module_cb: Arc<WorkerEventCb>,
+ format_js_error_fn: Option<Arc<FormatJsErrorFn>>,
+ },
+ state = |state, create_web_worker_cb, preload_module_cb, pre_execute_module_cb, format_js_error_fn| {
+ state.put::<WorkersTable>(WorkersTable::default());
+ state.put::<WorkerId>(WorkerId::default());
+
+ let create_web_worker_cb_holder =
+ CreateWebWorkerCbHolder(create_web_worker_cb.clone());
+ state.put::<CreateWebWorkerCbHolder>(create_web_worker_cb_holder);
+ let preload_module_cb_holder =
+ PreloadModuleCbHolder(preload_module_cb.clone());
+ state.put::<PreloadModuleCbHolder>(preload_module_cb_holder);
+ let pre_execute_module_cb_holder =
+ PreExecuteModuleCbHolder(pre_execute_module_cb.clone());
+ state.put::<PreExecuteModuleCbHolder>(pre_execute_module_cb_holder);
+ let format_js_error_fn_holder =
+ FormatJsErrorFnHolder(format_js_error_fn.clone());
+ state.put::<FormatJsErrorFnHolder>(format_js_error_fn_holder);
+ }
+);
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]