diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-03-17 12:22:15 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-17 18:22:15 +0000 |
commit | e55b448730160a6e4df9815a268d4049ac89deab (patch) | |
tree | 35d80fd60f2f1d1d06903caff256484a7d703d76 /runtime/ops | |
parent | 0bc6bf5d33b8198253954d7f04558270de45c925 (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.rs | 10 | ||||
-rw-r--r-- | runtime/ops/http.rs | 14 | ||||
-rw-r--r-- | runtime/ops/os/mod.rs | 86 | ||||
-rw-r--r-- | runtime/ops/permissions.rs | 18 | ||||
-rw-r--r-- | runtime/ops/process.rs | 24 | ||||
-rw-r--r-- | runtime/ops/runtime.rs | 17 | ||||
-rw-r--r-- | runtime/ops/signal.rs | 14 | ||||
-rw-r--r-- | runtime/ops/tty.rs | 14 | ||||
-rw-r--r-- | runtime/ops/web_worker.rs | 24 | ||||
-rw-r--r-- | runtime/ops/worker_host.rs | 67 |
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")] |