From e55b448730160a6e4df9815a268d4049ac89deab Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Fri, 17 Mar 2023 12:22:15 -0600 Subject: feat(core) deno_core::extension! macro to simplify extension registration (#18210) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- ext/web/lib.rs | 156 ++++++++++++++++++++++++--------------------------------- 1 file changed, 66 insertions(+), 90 deletions(-) (limited to 'ext/web/lib.rs') diff --git a/ext/web/lib.rs b/ext/web/lib.rs index dfc5ece72..f3a22d623 100644 --- a/ext/web/lib.rs +++ b/ext/web/lib.rs @@ -8,15 +8,12 @@ mod timers; use deno_core::error::range_error; use deno_core::error::type_error; use deno_core::error::AnyError; -use deno_core::include_js_files; use deno_core::op; use deno_core::serde_v8; use deno_core::url::Url; use deno_core::v8; use deno_core::ByteString; use deno_core::CancelHandle; -use deno_core::Extension; -use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::Resource; use deno_core::ResourceId; @@ -58,93 +55,72 @@ use crate::timers::op_timer_handle; use crate::timers::StartTime; pub use crate::timers::TimersPermission; -fn ext() -> ExtensionBuilder { - Extension::builder_with_deps( - env!("CARGO_PKG_NAME"), - &["deno_webidl", "deno_console", "deno_url"], - ) -} - -fn ops( - ext: &mut ExtensionBuilder, - blob_store: BlobStore, - maybe_location: Option, -) -> &mut ExtensionBuilder { - ext - .ops(vec![ - op_base64_decode::decl(), - op_base64_encode::decl(), - op_base64_atob::decl(), - op_base64_btoa::decl(), - op_encoding_normalize_label::decl(), - op_encoding_decode_single::decl(), - op_encoding_decode_utf8::decl(), - op_encoding_new_decoder::decl(), - op_encoding_decode::decl(), - op_encoding_encode_into::decl(), - op_encode_binary_string::decl(), - op_blob_create_part::decl(), - op_blob_slice_part::decl(), - op_blob_read_part::decl(), - op_blob_remove_part::decl(), - op_blob_create_object_url::decl(), - op_blob_revoke_object_url::decl(), - op_blob_from_object_url::decl(), - op_message_port_create_entangled::decl(), - op_message_port_post_message::decl(), - op_message_port_recv_message::decl(), - compression::op_compression_new::decl(), - compression::op_compression_write::decl(), - compression::op_compression_finish::decl(), - op_now::decl::

(), - op_timer_handle::decl(), - op_cancel_handle::decl(), - op_sleep::decl(), - op_transfer_arraybuffer::decl(), - ]) - .state(move |state| { - state.put(blob_store.clone()); - if let Some(location) = maybe_location.clone() { - state.put(Location(location)); - } - state.put(StartTime::now()); - }) -} - -pub fn init_ops_and_esm( - blob_store: BlobStore, - maybe_location: Option, -) -> Extension { - ops::

(&mut ext(), blob_store, maybe_location) - .esm(include_js_files!( - "00_infra.js", - "01_dom_exception.js", - "01_mimesniff.js", - "02_event.js", - "02_structured_clone.js", - "02_timers.js", - "03_abort_signal.js", - "04_global_interfaces.js", - "05_base64.js", - "06_streams.js", - "08_text_encoding.js", - "09_file.js", - "10_filereader.js", - "11_blob_url.js", - "12_location.js", - "13_message_port.js", - "14_compression.js", - "15_performance.js", - )) - .build() -} - -pub fn init_ops( - blob_store: BlobStore, - maybe_location: Option, -) -> Extension { - ops::

(&mut ext(), blob_store, maybe_location).build() -} +deno_core::extension!(deno_web, + deps = [ deno_webidl, deno_console, deno_url ], + parameters = [P: TimersPermission], + ops = [ + op_base64_decode, + op_base64_encode, + op_base64_atob, + op_base64_btoa, + op_encoding_normalize_label, + op_encoding_decode_single, + op_encoding_decode_utf8, + op_encoding_new_decoder, + op_encoding_decode, + op_encoding_encode_into, + op_encode_binary_string, + op_blob_create_part, + op_blob_slice_part, + op_blob_read_part, + op_blob_remove_part, + op_blob_create_object_url, + op_blob_revoke_object_url, + op_blob_from_object_url, + op_message_port_create_entangled, + op_message_port_post_message, + op_message_port_recv_message, + compression::op_compression_new, + compression::op_compression_write, + compression::op_compression_finish, + op_now

, + op_timer_handle, + op_cancel_handle, + op_sleep, + op_transfer_arraybuffer, + ], + esm = [ + "00_infra.js", + "01_dom_exception.js", + "01_mimesniff.js", + "02_event.js", + "02_structured_clone.js", + "02_timers.js", + "03_abort_signal.js", + "04_global_interfaces.js", + "05_base64.js", + "06_streams.js", + "08_text_encoding.js", + "09_file.js", + "10_filereader.js", + "11_blob_url.js", + "12_location.js", + "13_message_port.js", + "14_compression.js", + "15_performance.js", + ], + config = { + blob_store: BlobStore, + maybe_location: Option, + }, + state = |state, blob_store, maybe_location| { + state.put(blob_store); + if let Some(location) = maybe_location { + state.put(Location(location)); + } + state.put(StartTime::now()); + } +); #[op] fn op_base64_decode(input: String) -> Result { -- cgit v1.2.3