diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-03-09 10:56:19 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-09 14:56:19 +0000 |
commit | 8f207c0f3f3a43d77e0c88cfdc840b4b742b9708 (patch) | |
tree | a8699bca5ffffff03a9d72f1bed9208a349338ba /ext | |
parent | 99da8a69e7260b72e55d7214ec96f6ac5e759f35 (diff) |
refactor: Split extension registration for runtime and snapshotting (#18095)
This commit splits "<ext_name>::init" functions into "init_ops" and
"init_ops_and_esm". That way we don't have to construct list of
ESM sources on each startup if we're running with a snapshot.
In a follow up commit "deno_core" will be changed to not have a split
between "extensions" and "extensions_with_js" - it will be embedders'
responsibility to pass appropriately configured extensions.
Prerequisite for https://github.com/denoland/deno/pull/18080
Diffstat (limited to 'ext')
-rw-r--r-- | ext/broadcast_channel/lib.rs | 52 | ||||
-rw-r--r-- | ext/cache/lib.rs | 54 | ||||
-rw-r--r-- | ext/console/lib.rs | 10 | ||||
-rw-r--r-- | ext/crypto/lib.rs | 94 | ||||
-rw-r--r-- | ext/fetch/lib.rs | 98 | ||||
-rw-r--r-- | ext/ffi/lib.rs | 24 | ||||
-rw-r--r-- | ext/flash/lib.rs | 88 | ||||
-rw-r--r-- | ext/fs/lib.rs | 24 | ||||
-rw-r--r-- | ext/http/lib.rs | 20 | ||||
-rw-r--r-- | ext/io/lib.rs | 29 | ||||
-rw-r--r-- | ext/net/lib.rs | 62 | ||||
-rw-r--r-- | ext/node/lib.rs | 91 | ||||
-rw-r--r-- | ext/url/benches/url_ops.rs | 4 | ||||
-rw-r--r-- | ext/url/lib.rs | 34 | ||||
-rw-r--r-- | ext/web/benches/encoding.rs | 8 | ||||
-rw-r--r-- | ext/web/benches/timers_ops.rs | 8 | ||||
-rw-r--r-- | ext/web/lib.rs | 147 | ||||
-rw-r--r-- | ext/webgpu/lib.rs | 21 | ||||
-rw-r--r-- | ext/webidl/benches/dict.rs | 2 | ||||
-rw-r--r-- | ext/webidl/lib.rs | 5 | ||||
-rw-r--r-- | ext/websocket/lib.rs | 69 | ||||
-rw-r--r-- | ext/webstorage/lib.rs | 20 |
22 files changed, 645 insertions, 319 deletions
diff --git a/ext/broadcast_channel/lib.rs b/ext/broadcast_channel/lib.rs index 3698cc885..14884e99c 100644 --- a/ext/broadcast_channel/lib.rs +++ b/ext/broadcast_channel/lib.rs @@ -2,6 +2,7 @@ mod in_memory_broadcast_channel; +use deno_core::ExtensionBuilder; pub use in_memory_broadcast_channel::InMemoryBroadcastChannel; pub use in_memory_broadcast_channel::InMemoryBroadcastChannelResource; @@ -106,26 +107,45 @@ where bc.recv(&resource).await } -pub fn init<BC: BroadcastChannel + 'static>( - bc: BC, - unstable: bool, -) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &["deno_webidl", "deno_web"], ) - .esm(include_js_files!("01_broadcast_channel.js",)) - .ops(vec![ - op_broadcast_subscribe::decl::<BC>(), - op_broadcast_unsubscribe::decl::<BC>(), - op_broadcast_send::decl::<BC>(), - op_broadcast_recv::decl::<BC>(), - ]) - .state(move |state| { - state.put(bc.clone()); - state.put(Unstable(unstable)); - }) - .build() +} + +fn ops<BC: BroadcastChannel + 'static>( + ext: &mut ExtensionBuilder, + bc: BC, + unstable: bool, +) -> &mut ExtensionBuilder { + ext + .ops(vec![ + op_broadcast_subscribe::decl::<BC>(), + op_broadcast_unsubscribe::decl::<BC>(), + op_broadcast_send::decl::<BC>(), + op_broadcast_recv::decl::<BC>(), + ]) + .state(move |state| { + state.put(bc.clone()); + state.put(Unstable(unstable)); + }) +} + +pub fn init_ops_and_esm<BC: BroadcastChannel + 'static>( + bc: BC, + unstable: bool, +) -> Extension { + ops::<BC>(&mut ext(), bc, unstable) + .esm(include_js_files!("01_broadcast_channel.js",)) + .build() +} + +pub fn init_ops<BC: BroadcastChannel + 'static>( + bc: BC, + unstable: bool, +) -> Extension { + ops::<BC>(&mut ext(), bc, unstable).build() } pub fn get_declaration() -> PathBuf { diff --git a/ext/cache/lib.rs b/ext/cache/lib.rs index 477bbcb3e..a89296df9 100644 --- a/ext/cache/lib.rs +++ b/ext/cache/lib.rs @@ -13,6 +13,7 @@ use deno_core::serde::Deserialize; use deno_core::serde::Serialize; use deno_core::ByteString; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::Resource; use deno_core::ResourceId; @@ -22,28 +23,45 @@ pub use sqlite::SqliteBackedCache; #[derive(Clone)] pub struct CreateCache<C: Cache + 'static>(pub Arc<dyn Fn() -> C>); -pub fn init<CA: Cache + 'static>( - maybe_create_cache: Option<CreateCache<CA>>, -) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &["deno_webidl", "deno_web", "deno_url", "deno_fetch"], ) - .esm(include_js_files!("01_cache.js",)) - .ops(vec![ - op_cache_storage_open::decl::<CA>(), - op_cache_storage_has::decl::<CA>(), - op_cache_storage_delete::decl::<CA>(), - op_cache_put::decl::<CA>(), - op_cache_match::decl::<CA>(), - op_cache_delete::decl::<CA>(), - ]) - .state(move |state| { - if let Some(create_cache) = maybe_create_cache.clone() { - state.put(create_cache); - } - }) - .build() +} + +fn ops<CA: Cache + 'static>( + ext: &mut ExtensionBuilder, + maybe_create_cache: Option<CreateCache<CA>>, +) -> &mut ExtensionBuilder { + ext + .ops(vec![ + op_cache_storage_open::decl::<CA>(), + op_cache_storage_has::decl::<CA>(), + op_cache_storage_delete::decl::<CA>(), + op_cache_put::decl::<CA>(), + op_cache_match::decl::<CA>(), + op_cache_delete::decl::<CA>(), + ]) + .state(move |state| { + if let Some(create_cache) = maybe_create_cache.clone() { + state.put(create_cache); + } + }) +} + +pub fn init_ops_and_esm<CA: Cache + 'static>( + maybe_create_cache: Option<CreateCache<CA>>, +) -> Extension { + ops::<CA>(&mut ext(), maybe_create_cache) + .esm(include_js_files!("01_cache.js",)) + .build() +} + +pub fn init_ops<CA: Cache + 'static>( + maybe_create_cache: Option<CreateCache<CA>>, +) -> Extension { + ops::<CA>(&mut ext(), maybe_create_cache).build() } pub fn get_declaration() -> PathBuf { diff --git a/ext/console/lib.rs b/ext/console/lib.rs index 158a1a05e..a9a30c328 100644 --- a/ext/console/lib.rs +++ b/ext/console/lib.rs @@ -2,10 +2,18 @@ use deno_core::include_js_files; use deno_core::Extension; +use deno_core::ExtensionBuilder; use std::path::PathBuf; -pub fn init() -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder(env!("CARGO_PKG_NAME")) +} +pub fn init() -> Extension { + ext().build() +} + +pub fn init_esm() -> Extension { + ext() .esm(include_js_files!("01_colors.js", "02_console.js",)) .build() } diff --git a/ext/crypto/lib.rs b/ext/crypto/lib.rs index f406e64ec..89ca8e0d6 100644 --- a/ext/crypto/lib.rs +++ b/ext/crypto/lib.rs @@ -10,6 +10,7 @@ use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::include_js_files; use deno_core::op; +use deno_core::ExtensionBuilder; use deno_core::Extension; use deno_core::OpState; @@ -72,49 +73,64 @@ use crate::key::CryptoNamedCurve; use crate::key::HkdfOutput; use crate::shared::RawKeyData; -pub fn init(maybe_seed: Option<u64>) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &["deno_webidl", "deno_web"], ) - .esm(include_js_files!("00_crypto.js", "01_webidl.js",)) - .ops(vec![ - op_crypto_get_random_values::decl(), - op_crypto_generate_key::decl(), - op_crypto_sign_key::decl(), - op_crypto_verify_key::decl(), - op_crypto_derive_bits::decl(), - op_crypto_import_key::decl(), - op_crypto_export_key::decl(), - op_crypto_encrypt::decl(), - op_crypto_decrypt::decl(), - op_crypto_subtle_digest::decl(), - op_crypto_random_uuid::decl(), - op_crypto_wrap_key::decl(), - op_crypto_unwrap_key::decl(), - op_crypto_base64url_decode::decl(), - op_crypto_base64url_encode::decl(), - x25519::op_generate_x25519_keypair::decl(), - x25519::op_derive_bits_x25519::decl(), - x25519::op_import_spki_x25519::decl(), - x25519::op_import_pkcs8_x25519::decl(), - ed25519::op_generate_ed25519_keypair::decl(), - ed25519::op_import_spki_ed25519::decl(), - ed25519::op_import_pkcs8_ed25519::decl(), - ed25519::op_sign_ed25519::decl(), - ed25519::op_verify_ed25519::decl(), - ed25519::op_export_spki_ed25519::decl(), - ed25519::op_export_pkcs8_ed25519::decl(), - ed25519::op_jwk_x_ed25519::decl(), - x25519::op_export_spki_x25519::decl(), - x25519::op_export_pkcs8_x25519::decl(), - ]) - .state(move |state| { - if let Some(seed) = maybe_seed { - state.put(StdRng::seed_from_u64(seed)); - } - }) - .build() +} + +fn ops( + ext: &mut ExtensionBuilder, + maybe_seed: Option<u64>, +) -> &mut ExtensionBuilder { + ext + .ops(vec![ + op_crypto_get_random_values::decl(), + op_crypto_generate_key::decl(), + op_crypto_sign_key::decl(), + op_crypto_verify_key::decl(), + op_crypto_derive_bits::decl(), + op_crypto_import_key::decl(), + op_crypto_export_key::decl(), + op_crypto_encrypt::decl(), + op_crypto_decrypt::decl(), + op_crypto_subtle_digest::decl(), + op_crypto_random_uuid::decl(), + op_crypto_wrap_key::decl(), + op_crypto_unwrap_key::decl(), + op_crypto_base64url_decode::decl(), + op_crypto_base64url_encode::decl(), + x25519::op_generate_x25519_keypair::decl(), + x25519::op_derive_bits_x25519::decl(), + x25519::op_import_spki_x25519::decl(), + x25519::op_import_pkcs8_x25519::decl(), + ed25519::op_generate_ed25519_keypair::decl(), + ed25519::op_import_spki_ed25519::decl(), + ed25519::op_import_pkcs8_ed25519::decl(), + ed25519::op_sign_ed25519::decl(), + ed25519::op_verify_ed25519::decl(), + ed25519::op_export_spki_ed25519::decl(), + ed25519::op_export_pkcs8_ed25519::decl(), + ed25519::op_jwk_x_ed25519::decl(), + x25519::op_export_spki_x25519::decl(), + x25519::op_export_pkcs8_x25519::decl(), + ]) + .state(move |state| { + if let Some(seed) = maybe_seed { + state.put(StdRng::seed_from_u64(seed)); + } + }) +} + +pub fn init_ops_and_esm(maybe_seed: Option<u64>) -> Extension { + ops(&mut ext(), maybe_seed) + .esm(include_js_files!("00_crypto.js", "01_webidl.js",)) + .build() +} + +pub fn init_ops(maybe_seed: Option<u64>) -> Extension { + ops(&mut ext(), maybe_seed).build() } #[op] diff --git a/ext/fetch/lib.rs b/ext/fetch/lib.rs index 8576b3c53..647e0ec7f 100644 --- a/ext/fetch/lib.rs +++ b/ext/fetch/lib.rs @@ -13,6 +13,7 @@ use deno_core::futures::StreamExt; use deno_core::include_js_files; use deno_core::op; use deno_core::BufView; +use deno_core::ExtensionBuilder; use deno_core::WriteOutcome; use deno_core::url::Url; @@ -91,43 +92,74 @@ impl Default for Options { } } -pub fn init<FP>(options: Options) -> Extension -where - FP: FetchPermissions + 'static, -{ +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &["deno_webidl", "deno_web", "deno_url", "deno_console"], ) - .esm(include_js_files!( - "20_headers.js", - "21_formdata.js", - "22_body.js", - "22_http_client.js", - "23_request.js", - "23_response.js", - "26_fetch.js", - )) - .ops(vec![ - op_fetch::decl::<FP>(), - op_fetch_send::decl(), - op_fetch_custom_client::decl::<FP>(), - ]) - .state(move |state| { - state.put::<Options>(options.clone()); - state.put::<reqwest::Client>({ - create_http_client( - options.user_agent.clone(), - options.root_cert_store.clone(), - vec![], - options.proxy.clone(), - options.unsafely_ignore_certificate_errors.clone(), - options.client_cert_chain_and_key.clone(), - ) - .unwrap() - }); - }) - .build() +} + +fn ops<FP>( + ext: &mut ExtensionBuilder, + options: Options, +) -> &mut ExtensionBuilder +where + FP: FetchPermissions + 'static, +{ + ext + .ops(vec![ + op_fetch::decl::<FP>(), + op_fetch_send::decl(), + op_fetch_custom_client::decl::<FP>(), + ]) + .state(move |state| { + state.put::<Options>(options.clone()); + state.put::<reqwest::Client>({ + create_http_client( + options.user_agent.clone(), + options.root_cert_store.clone(), + vec![], + options.proxy.clone(), + options.unsafely_ignore_certificate_errors.clone(), + options.client_cert_chain_and_key.clone(), + ) + .unwrap() + }); + }) +} + +pub fn init_ops_and_esm<FP>(options: Options) -> Extension +where + FP: FetchPermissions + 'static, +{ + ops::<FP>(&mut ext(), options) + .esm(include_js_files!( + "20_headers.js", + "21_formdata.js", + "22_body.js", + "22_http_client.js", + "23_request.js", + "23_response.js", + "26_fetch.js", + )) + .build() +} + +pub fn init_ops<FP>(options: Options) -> Extension +where + FP: FetchPermissions + 'static, +{ + ops::<FP>(&mut ext(), options) + .esm(include_js_files!( + "20_headers.js", + "21_formdata.js", + "22_body.js", + "22_http_client.js", + "23_request.js", + "23_response.js", + "26_fetch.js", + )) + .build() } pub type CancelableResponseFuture = diff --git a/ext/ffi/lib.rs b/ext/ffi/lib.rs index 8a1227ed9..f93e2e121 100644 --- a/ext/ffi/lib.rs +++ b/ext/ffi/lib.rs @@ -5,6 +5,7 @@ use deno_core::futures::channel::mpsc; use deno_core::include_js_files; use deno_core::v8; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use std::cell::RefCell; @@ -81,9 +82,15 @@ pub(crate) struct FfiState { pub(crate) async_work_receiver: mpsc::UnboundedReceiver<PendingFfiAsyncWork>, } -pub fn init<P: FfiPermissions + 'static>(unstable: bool) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps(env!("CARGO_PKG_NAME"), &["deno_web"]) - .esm(include_js_files!("00_ffi.js",)) +} + +fn ops<P: FfiPermissions + 'static>( + ext: &mut ExtensionBuilder, + unstable: bool, +) -> &mut ExtensionBuilder { + ext .ops(vec![ op_ffi_load::decl::<P>(), op_ffi_get_static::decl(), @@ -151,5 +158,18 @@ pub fn init<P: FfiPermissions + 'static>(unstable: bool) -> Extension { async_work_sender, }); }) +} + +pub fn init_ops_and_esm<P: FfiPermissions + 'static>( + unstable: bool, +) -> Extension { + ops::<P>(&mut ext(), unstable) + .esm(include_js_files!("00_ffi.js",)) + .build() +} + +pub fn init_ops<P: FfiPermissions + 'static>(unstable: bool) -> Extension { + ops::<P>(&mut ext(), unstable) + .esm(include_js_files!("00_ffi.js",)) .build() } diff --git a/ext/flash/lib.rs b/ext/flash/lib.rs index 605dc3e43..41287d003 100644 --- a/ext/flash/lib.rs +++ b/ext/flash/lib.rs @@ -17,6 +17,7 @@ use deno_core::ByteString; use deno_core::CancelFuture; use deno_core::CancelHandle; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::StringOrBuffer; use deno_core::ZeroCopyBuf; @@ -1526,7 +1527,7 @@ pub trait FlashPermissions { ) -> Result<(), AnyError>; } -pub fn init<P: FlashPermissions + 'static>(unstable: bool) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &[ @@ -1537,38 +1538,55 @@ pub fn init<P: FlashPermissions + 'static>(unstable: bool) -> Extension { "deno_http", ], ) - .esm(deno_core::include_js_files!("01_http.js",)) - .ops(vec![ - op_flash_serve::decl::<P>(), - op_node_unstable_flash_serve::decl::<P>(), - op_flash_respond::decl(), - op_flash_respond_async::decl(), - op_flash_respond_chunked::decl(), - op_flash_method::decl(), - op_flash_path::decl(), - op_flash_headers::decl(), - op_flash_addr::decl(), - op_flash_next::decl(), - op_flash_next_server::decl(), - op_flash_next_async::decl(), - op_flash_read_body::decl(), - op_flash_upgrade_websocket::decl(), - op_flash_drive_server::decl(), - op_flash_wait_for_listening::decl(), - op_flash_first_packet::decl(), - op_flash_has_body_stream::decl(), - op_flash_close_server::decl(), - op_flash_make_request::decl(), - op_flash_write_resource::decl(), - op_try_flash_respond_chunked::decl(), - ]) - .state(move |op_state| { - op_state.put(Unstable(unstable)); - op_state.put(FlashContext { - next_server_id: 0, - join_handles: HashMap::default(), - servers: HashMap::default(), - }); - }) - .build() +} + +fn ops<P: FlashPermissions + 'static>( + ext: &mut ExtensionBuilder, + unstable: bool, +) -> &mut ExtensionBuilder { + ext + .ops(vec![ + op_flash_serve::decl::<P>(), + op_node_unstable_flash_serve::decl::<P>(), + op_flash_respond::decl(), + op_flash_respond_async::decl(), + op_flash_respond_chunked::decl(), + op_flash_method::decl(), + op_flash_path::decl(), + op_flash_headers::decl(), + op_flash_addr::decl(), + op_flash_next::decl(), + op_flash_next_server::decl(), + op_flash_next_async::decl(), + op_flash_read_body::decl(), + op_flash_upgrade_websocket::decl(), + op_flash_drive_server::decl(), + op_flash_wait_for_listening::decl(), + op_flash_first_packet::decl(), + op_flash_has_body_stream::decl(), + op_flash_close_server::decl(), + op_flash_make_request::decl(), + op_flash_write_resource::decl(), + op_try_flash_respond_chunked::decl(), + ]) + .state(move |op_state| { + op_state.put(Unstable(unstable)); + op_state.put(FlashContext { + next_server_id: 0, + join_handles: HashMap::default(), + servers: HashMap::default(), + }); + }) +} + +pub fn init_ops_and_esm<P: FlashPermissions + 'static>( + unstable: bool, +) -> Extension { + ops::<P>(&mut ext(), unstable) + .esm(deno_core::include_js_files!("01_http.js",)) + .build() +} + +pub fn init_ops<P: FlashPermissions + 'static>(unstable: bool) -> Extension { + ops::<P>(&mut ext(), unstable).build() } diff --git a/ext/fs/lib.rs b/ext/fs/lib.rs index 4b177a2bf..31782d38d 100644 --- a/ext/fs/lib.rs +++ b/ext/fs/lib.rs @@ -9,6 +9,7 @@ use deno_core::op; use deno_core::CancelFuture; use deno_core::CancelHandle; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::ResourceId; use deno_core::ZeroCopyBuf; @@ -117,9 +118,15 @@ use deno_core::error::generic_error; #[cfg(not(unix))] use deno_core::error::not_supported; -pub fn init<P: FsPermissions + 'static>(unstable: bool) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder("deno_fs") - .esm(include_js_files!("30_fs.js",)) +} + +fn ops<P: FsPermissions + 'static>( + ext: &mut ExtensionBuilder, + unstable: bool, +) -> &mut ExtensionBuilder { + ext .state(move |state| { state.put(UnstableChecker { unstable }); }) @@ -184,6 +191,19 @@ pub fn init<P: FsPermissions + 'static>(unstable: bool) -> Extension { op_readfile_async::decl::<P>(), op_readfile_text_async::decl::<P>(), ]) +} + +pub fn init_ops_and_esm<P: FsPermissions + 'static>( + unstable: bool, +) -> Extension { + ops::<P>(&mut ext(), unstable) + .esm(include_js_files!("30_fs.js",)) + .build() +} + +pub fn init_ops<P: FsPermissions + 'static>(unstable: bool) -> Extension { + ops::<P>(&mut ext(), unstable) + .esm(include_js_files!("30_fs.js",)) .build() } diff --git a/ext/http/lib.rs b/ext/http/lib.rs index 14a93ede9..8fd7015aa 100644 --- a/ext/http/lib.rs +++ b/ext/http/lib.rs @@ -30,6 +30,7 @@ use deno_core::CancelFuture; use deno_core::CancelHandle; use deno_core::CancelTryFuture; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::RcRef; use deno_core::Resource; @@ -77,13 +78,15 @@ use crate::reader_stream::ShutdownHandle; pub mod compressible; mod reader_stream; -pub fn init() -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &["deno_web", "deno_net", "deno_fetch", "deno_websocket"], ) - .esm(include_js_files!("01_http.js",)) - .ops(vec![ +} + +fn ops(ext: &mut ExtensionBuilder) -> &mut ExtensionBuilder { + ext.ops(vec![ op_http_accept::decl(), op_http_write_headers::decl(), op_http_headers::decl(), @@ -93,7 +96,16 @@ pub fn init() -> Extension { op_http_websocket_accept_header::decl(), op_http_upgrade_websocket::decl(), ]) - .build() +} + +pub fn init_ops_and_esm() -> Extension { + ops(&mut ext()) + .esm(include_js_files!("01_http.js",)) + .build() +} + +pub fn init_ops() -> Extension { + ops(&mut ext()).build() } pub enum HttpSocketAddr { diff --git a/ext/io/lib.rs b/ext/io/lib.rs index 8eebc93ae..92f681f1e 100644 --- a/ext/io/lib.rs +++ b/ext/io/lib.rs @@ -13,6 +13,7 @@ use deno_core::BufView; use deno_core::CancelHandle; use deno_core::CancelTryFuture; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::RcRef; use deno_core::Resource; @@ -78,13 +79,16 @@ pub static STDERR_HANDLE: Lazy<StdFile> = Lazy::new(|| { unsafe { StdFile::from_raw_handle(GetStdHandle(winbase::STD_ERROR_HANDLE)) } }); -pub fn init(stdio: Stdio) -> Extension { - // todo(dsheret): don't do this? Taking out the writers was necessary to prevent invalid handle panics - let stdio = Rc::new(RefCell::new(Some(stdio))); - +fn ext() -> ExtensionBuilder { Extension::builder_with_deps("deno_io", &["deno_web"]) +} + +fn ops( + ext: &mut ExtensionBuilder, + stdio: Rc<RefCell<Option<Stdio>>>, +) -> &mut ExtensionBuilder { + ext .ops(vec![op_read_sync::decl(), op_write_sync::decl()]) - .esm(include_js_files!("12_io.js",)) .middleware(|op| match op.name { "op_print" => op_print::decl(), _ => op, @@ -132,9 +136,24 @@ pub fn init(stdio: Stdio) -> Extension { )); assert_eq!(rid, 2, "stderr must have ResourceId 2"); }) +} + +pub fn init_ops_and_esm(stdio: Stdio) -> Extension { + // todo(dsheret): don't do this? Taking out the writers was necessary to prevent invalid handle panics + let stdio = Rc::new(RefCell::new(Some(stdio))); + + ops(&mut ext(), stdio) + .esm(include_js_files!("12_io.js",)) .build() } +pub fn init_ops(stdio: Stdio) -> Extension { + // todo(dsheret): don't do this? Taking out the writers was necessary to prevent invalid handle panics + let stdio = Rc::new(RefCell::new(Some(stdio))); + + ops(&mut ext(), stdio).build() +} + pub enum StdioPipe { Inherit, File(StdFile), diff --git a/ext/net/lib.rs b/ext/net/lib.rs index 780cbceb5..4703b05cc 100644 --- a/ext/net/lib.rs +++ b/ext/net/lib.rs @@ -10,6 +10,7 @@ pub mod resolve_addr; use deno_core::error::AnyError; use deno_core::include_js_files; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_tls::rustls::RootCertStore; use std::cell::RefCell; @@ -77,24 +78,55 @@ pub struct DefaultTlsOptions { /// would override previously used alias. pub struct UnsafelyIgnoreCertificateErrors(pub Option<Vec<String>>); -pub fn init<P: NetPermissions + 'static>( +fn ext() -> ExtensionBuilder { + Extension::builder_with_deps(env!("CARGO_PKG_NAME"), &["deno_web"]) +} + +fn ops<P: NetPermissions + 'static>( + ext: &mut ExtensionBuilder, root_cert_store: Option<RootCertStore>, unstable: bool, unsafely_ignore_certificate_errors: Option<Vec<String>>, -) -> Extension { +) -> &mut ExtensionBuilder { let mut ops = ops::init::<P>(); ops.extend(ops_tls::init::<P>()); - Extension::builder_with_deps(env!("CARGO_PKG_NAME"), &["deno_web"]) - .esm(include_js_files!("01_net.js", "02_tls.js",)) - .ops(ops) - .state(move |state| { - state.put(DefaultTlsOptions { - root_cert_store: root_cert_store.clone(), - }); - state.put(UnstableChecker { unstable }); - state.put(UnsafelyIgnoreCertificateErrors( - unsafely_ignore_certificate_errors.clone(), - )); - }) - .build() + + ext.ops(ops).state(move |state| { + state.put(DefaultTlsOptions { + root_cert_store: root_cert_store.clone(), + }); + state.put(UnstableChecker { unstable }); + state.put(UnsafelyIgnoreCertificateErrors( + unsafely_ignore_certificate_errors.clone(), + )); + }) +} + +pub fn init_ops_and_esm<P: NetPermissions + 'static>( + root_cert_store: Option<RootCertStore>, + unstable: bool, + unsafely_ignore_certificate_errors: Option<Vec<String>>, +) -> Extension { + ops::<P>( + &mut ext(), + root_cert_store, + unstable, + unsafely_ignore_certificate_errors, + ) + .esm(include_js_files!("01_net.js", "02_tls.js",)) + .build() +} + +pub fn init_ops<P: NetPermissions + 'static>( + root_cert_store: Option<RootCertStore>, + unstable: bool, + unsafely_ignore_certificate_errors: Option<Vec<String>>, +) -> Extension { + ops::<P>( + &mut ext(), + root_cert_store, + unstable, + unsafely_ignore_certificate_errors, + ) + .build() } diff --git a/ext/node/lib.rs b/ext/node/lib.rs index 899a1d30c..1c9d9e0aa 100644 --- a/ext/node/lib.rs +++ b/ext/node/lib.rs @@ -5,6 +5,7 @@ use deno_core::include_js_files; use deno_core::located_script_name; use deno_core::op; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::JsRuntime; use once_cell::sync::Lazy; use std::collections::HashSet; @@ -95,16 +96,34 @@ fn op_node_build_os() -> String { .to_string() } +fn ext_polyfill() -> ExtensionBuilder { + Extension::builder_with_deps(env!("CARGO_PKG_NAME"), &["deno_io", "deno_fs"]) +} + +fn ops_polyfill(ext: &mut ExtensionBuilder) -> &mut ExtensionBuilder { + ext.ops(vec![ + crypto::op_node_create_hash::decl(), + crypto::op_node_hash_update::decl(), + crypto::op_node_hash_update_str::decl(), + crypto::op_node_hash_digest::decl(), + crypto::op_node_hash_digest_hex::decl(), + crypto::op_node_hash_clone::decl(), + crypto::op_node_private_encrypt::decl(), + crypto::op_node_private_decrypt::decl(), + crypto::op_node_public_encrypt::decl(), + winerror::op_node_sys_to_uv_error::decl(), + v8::op_v8_cached_data_version_tag::decl(), + v8::op_v8_get_heap_statistics::decl(), + idna::op_node_idna_domain_to_ascii::decl(), + idna::op_node_idna_domain_to_unicode::decl(), + idna::op_node_idna_punycode_decode::decl(), + idna::op_node_idna_punycode_encode::decl(), + op_node_build_os::decl(), + ]) +} + pub fn init_polyfill_ops() -> Extension { - Extension::builder(env!("CARGO_PKG_NAME")) - .ops(vec![ - crypto::op_node_create_hash::decl(), - crypto::op_node_hash_update::decl(), - crypto::op_node_hash_digest::decl(), - crypto::op_node_hash_clone::decl(), - op_node_build_os::decl(), - ]) - .build() + ops_polyfill(&mut ext_polyfill()).build() } pub fn init_polyfill_ops_and_esm() -> Extension { @@ -332,40 +351,21 @@ pub fn init_polyfill_ops_and_esm() -> Extension { "zlib.ts", ); - Extension::builder_with_deps(env!("CARGO_PKG_NAME"), &["deno_io", "deno_fs"]) + ops_polyfill(&mut ext_polyfill()) .esm(esm_files) .esm_entry_point("ext:deno_node/module_all.ts") - .ops(vec![ - crypto::op_node_create_hash::decl(), - crypto::op_node_hash_update::decl(), - crypto::op_node_hash_update_str::decl(), - crypto::op_node_hash_digest::decl(), - crypto::op_node_hash_digest_hex::decl(), - crypto::op_node_hash_clone::decl(), - crypto::op_node_private_encrypt::decl(), - crypto::op_node_private_decrypt::decl(), - crypto::op_node_public_encrypt::decl(), - winerror::op_node_sys_to_uv_error::decl(), - v8::op_v8_cached_data_version_tag::decl(), - v8::op_v8_get_heap_statistics::decl(), - idna::op_node_idna_domain_to_ascii::decl(), - idna::op_node_idna_domain_to_unicode::decl(), - idna::op_node_idna_punycode_decode::decl(), - idna::op_node_idna_punycode_encode::decl(), - op_node_build_os::decl(), - ]) .build() } -pub fn init<P: NodePermissions + 'static>( - maybe_npm_resolver: Option<Rc<dyn RequireNpmResolver>>, -) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder("deno_node_loading") - .esm(include_js_files!( - "01_node.js", - "02_require.js", - "module_es_shim.js", - )) +} + +fn ops<P: NodePermissions + 'static>( + ext: &mut ExtensionBuilder, + maybe_npm_resolver: Option<Rc<dyn RequireNpmResolver>>, +) -> &mut ExtensionBuilder { + ext .ops(vec![ ops::op_require_init_paths::decl(), ops::op_require_node_module_paths::decl::<P>(), @@ -395,9 +395,26 @@ pub fn init<P: NodePermissions + 'static>( state.put(npm_resolver); } }) +} + +pub fn init_ops_and_esm<P: NodePermissions + 'static>( + maybe_npm_resolver: Option<Rc<dyn RequireNpmResolver>>, +) -> Extension { + ops::<P>(&mut ext(), maybe_npm_resolver) + .esm(include_js_files!( + "01_node.js", + "02_require.js", + "module_es_shim.js", + )) .build() } +pub fn init_ops<P: NodePermissions + 'static>( + maybe_npm_resolver: Option<Rc<dyn RequireNpmResolver>>, +) -> Extension { + ops::<P>(&mut ext(), maybe_npm_resolver).build() +} + pub async fn initialize_runtime( js_runtime: &mut JsRuntime, uses_local_node_modules_dir: bool, diff --git a/ext/url/benches/url_ops.rs b/ext/url/benches/url_ops.rs index 1be1fd593..7dc2651b2 100644 --- a/ext/url/benches/url_ops.rs +++ b/ext/url/benches/url_ops.rs @@ -11,8 +11,8 @@ use deno_core::ExtensionFileSourceCode; fn setup() -> Vec<Extension> { vec![ - deno_webidl::init(), - deno_url::init(), + deno_webidl::init_esm(), + deno_url::init_ops_and_esm(), Extension::builder("bench_setup") .esm(vec![ExtensionFileSource { specifier: "ext:setup".to_string(), diff --git a/ext/url/lib.rs b/ext/url/lib.rs index f1295a13f..8a20c9bc6 100644 --- a/ext/url/lib.rs +++ b/ext/url/lib.rs @@ -10,6 +10,7 @@ use deno_core::url::form_urlencoded; use deno_core::url::quirks; use deno_core::url::Url; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::ZeroCopyBuf; use std::path::PathBuf; @@ -17,22 +18,33 @@ use std::path::PathBuf; use crate::urlpattern::op_urlpattern_parse; use crate::urlpattern::op_urlpattern_process_match_input; -pub fn init() -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps(env!("CARGO_PKG_NAME"), &["deno_webidl"]) +} + +fn ops(ext: &mut ExtensionBuilder) -> &mut ExtensionBuilder { + ext.ops(vec![ + op_url_reparse::decl(), + op_url_parse::decl(), + op_url_get_serialization::decl(), + op_url_parse_with_base::decl(), + op_url_parse_search_params::decl(), + op_url_stringify_search_params::decl(), + op_urlpattern_parse::decl(), + op_urlpattern_process_match_input::decl(), + ]) +} + +pub fn init_ops_and_esm() -> Extension { + ops(&mut ext()) .esm(include_js_files!("00_url.js", "01_urlpattern.js",)) - .ops(vec![ - op_url_reparse::decl(), - op_url_parse::decl(), - op_url_get_serialization::decl(), - op_url_parse_with_base::decl(), - op_url_parse_search_params::decl(), - op_url_stringify_search_params::decl(), - op_urlpattern_parse::decl(), - op_urlpattern_process_match_input::decl(), - ]) .build() } +pub fn init_ops() -> Extension { + ops(&mut ext()).build() +} + /// Parse `href` with a `base_href`. Fills the out `buf` with URL components. #[op] pub fn op_url_parse_with_base( diff --git a/ext/web/benches/encoding.rs b/ext/web/benches/encoding.rs index 888557263..feb309785 100644 --- a/ext/web/benches/encoding.rs +++ b/ext/web/benches/encoding.rs @@ -23,10 +23,10 @@ impl deno_web::TimersPermission for Permissions { fn setup() -> Vec<Extension> { vec![ - deno_webidl::init(), - deno_url::init(), - deno_console::init(), - deno_web::init::<Permissions>(BlobStore::default(), None), + deno_webidl::init_esm(), + deno_url::init_ops_and_esm(), + deno_console::init_esm(), + deno_web::init_ops_and_esm::<Permissions>(BlobStore::default(), None), Extension::builder("bench_setup") .esm(vec![ExtensionFileSource { specifier: "ext:setup".to_string(), diff --git a/ext/web/benches/timers_ops.rs b/ext/web/benches/timers_ops.rs index d8ea29021..e1e97df65 100644 --- a/ext/web/benches/timers_ops.rs +++ b/ext/web/benches/timers_ops.rs @@ -21,10 +21,10 @@ impl deno_web::TimersPermission for Permissions { fn setup() -> Vec<Extension> { vec![ - deno_webidl::init(), - deno_url::init(), - deno_console::init(), - deno_web::init::<Permissions>(BlobStore::default(), None), + deno_webidl::init_esm(), + deno_url::init_ops_and_esm(), + deno_console::init_esm(), + deno_web::init_ops_and_esm::<Permissions>(BlobStore::default(), None), Extension::builder("bench_setup") .esm(vec![ ExtensionFileSource { diff --git a/ext/web/lib.rs b/ext/web/lib.rs index 6a21a7470..dfc5ece72 100644 --- a/ext/web/lib.rs +++ b/ext/web/lib.rs @@ -16,6 +16,7 @@ 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; @@ -57,74 +58,92 @@ use crate::timers::op_timer_handle; use crate::timers::StartTime; pub use crate::timers::TimersPermission; -/// Load and execute the javascript code. -pub fn init<P: TimersPermission + 'static>( - blob_store: BlobStore, - maybe_location: Option<Url>, -) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &["deno_webidl", "deno_console", "deno_url"], ) - .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", - )) - .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::<P>(), - 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()); - }) - .build() +} + +fn ops<P: TimersPermission + 'static>( + ext: &mut ExtensionBuilder, + blob_store: BlobStore, + maybe_location: Option<Url>, +) -> &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::<P>(), + 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<P: TimersPermission + 'static>( + blob_store: BlobStore, + maybe_location: Option<Url>, +) -> Extension { + ops::<P>(&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<P: TimersPermission + 'static>( + blob_store: BlobStore, + maybe_location: Option<Url>, +) -> Extension { + ops::<P>(&mut ext(), blob_store, maybe_location).build() } #[op] diff --git a/ext/webgpu/lib.rs b/ext/webgpu/lib.rs index aa6207d34..d399125c7 100644 --- a/ext/webgpu/lib.rs +++ b/ext/webgpu/lib.rs @@ -6,6 +6,7 @@ use deno_core::error::AnyError; use deno_core::include_js_files; use deno_core::op; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use deno_core::Resource; use deno_core::ResourceId; @@ -116,21 +117,31 @@ impl Resource for WebGpuQuerySet { } } -pub fn init(unstable: bool) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps( env!("CARGO_PKG_NAME"), &["deno_webidl", "deno_web"], ) - .esm(include_js_files!("01_webgpu.js", "02_idl_types.js",)) - .ops(declare_webgpu_ops()) - .state(move |state| { +} + +fn ops(ext: &mut ExtensionBuilder, unstable: bool) -> &mut ExtensionBuilder { + ext.ops(declare_webgpu_ops()).state(move |state| { // TODO: check & possibly streamline this // Unstable might be able to be OpMiddleware // let unstable_checker = state.borrow::<super::UnstableChecker>(); // let unstable = unstable_checker.unstable; state.put(Unstable(unstable)); }) - .build() +} + +pub fn init_ops_and_esm(unstable: bool) -> Extension { + ops(&mut ext(), unstable) + .esm(include_js_files!("01_webgpu.js", "02_idl_types.js",)) + .build() +} + +pub fn init_ops(unstable: bool) -> Extension { + ops(&mut ext(), unstable).build() } fn deserialize_features(features: &wgpu_types::Features) -> Vec<&'static str> { diff --git a/ext/webidl/benches/dict.rs b/ext/webidl/benches/dict.rs index d07261bca..2ed9adf78 100644 --- a/ext/webidl/benches/dict.rs +++ b/ext/webidl/benches/dict.rs @@ -11,7 +11,7 @@ use deno_core::ExtensionFileSourceCode; fn setup() -> Vec<Extension> { vec![ - deno_webidl::init(), + deno_webidl::init_esm(), Extension::builder("deno_webidl_bench") .esm(vec![ExtensionFileSource { specifier: "ext:setup".to_string(), diff --git a/ext/webidl/lib.rs b/ext/webidl/lib.rs index 1c3d760d3..42559e501 100644 --- a/ext/webidl/lib.rs +++ b/ext/webidl/lib.rs @@ -3,8 +3,11 @@ use deno_core::include_js_files; use deno_core::Extension; -/// Load and execute the javascript code. pub fn init() -> Extension { + Extension::builder(env!("CARGO_PKG_NAME")).build() +} + +pub fn init_esm() -> Extension { Extension::builder(env!("CARGO_PKG_NAME")) .esm(include_js_files!("00_webidl.js",)) .build() diff --git a/ext/websocket/lib.rs b/ext/websocket/lib.rs index bf6d51914..dbbeae21f 100644 --- a/ext/websocket/lib.rs +++ b/ext/websocket/lib.rs @@ -9,6 +9,7 @@ use deno_core::futures::SinkExt; use deno_core::futures::StreamExt; use deno_core::include_js_files; use deno_core::op; +use deno_core::ExtensionBuilder; use deno_core::url; use deno_core::AsyncRefCell; @@ -497,33 +498,65 @@ pub async fn op_ws_next_event( Ok(res) } -pub fn init<P: WebSocketPermissions + 'static>( +fn ext() -> ExtensionBuilder { + Extension::builder_with_deps( + env!("CARGO_PKG_NAME"), + &["deno_url", "deno_webidl"], + ) +} + +fn ops<P: WebSocketPermissions + 'static>( + ext: &mut ExtensionBuilder, + user_agent: String, + root_cert_store: Option<RootCertStore>, + unsafely_ignore_certificate_errors: Option<Vec<String>>, +) -> &mut ExtensionBuilder { + ext + .ops(vec![ + op_ws_check_permission_and_cancel_handle::decl::<P>(), + op_ws_create::decl::<P>(), + op_ws_send::decl(), + op_ws_close::decl(), + op_ws_next_event::decl(), + ]) + .state(move |state| { + state.put::<WsUserAgent>(WsUserAgent(user_agent.clone())); + state.put(UnsafelyIgnoreCertificateErrors( + unsafely_ignore_certificate_errors.clone(), + )); + state.put::<WsRootStore>(WsRootStore(root_cert_store.clone())); + }) +} + +pub fn init_ops_and_esm<P: WebSocketPermissions + 'static>( user_agent: String, root_cert_store: Option<RootCertStore>, unsafely_ignore_certificate_errors: Option<Vec<String>>, ) -> Extension { - Extension::builder_with_deps( - env!("CARGO_PKG_NAME"), - &["deno_url", "deno_webidl"], + ops::<P>( + &mut ext(), + user_agent, + root_cert_store, + unsafely_ignore_certificate_errors, ) .esm(include_js_files!( "01_websocket.js", "02_websocketstream.js", )) - .ops(vec![ - op_ws_check_permission_and_cancel_handle::decl::<P>(), - op_ws_create::decl::<P>(), - op_ws_send::decl(), - op_ws_close::decl(), - op_ws_next_event::decl(), - ]) - .state(move |state| { - state.put::<WsUserAgent>(WsUserAgent(user_agent.clone())); - state.put(UnsafelyIgnoreCertificateErrors( - unsafely_ignore_certificate_errors.clone(), - )); - state.put::<WsRootStore>(WsRootStore(root_cert_store.clone())); - }) + .build() +} + +pub fn init_ops<P: WebSocketPermissions + 'static>( + user_agent: String, + root_cert_store: Option<RootCertStore>, + unsafely_ignore_certificate_errors: Option<Vec<String>>, +) -> Extension { + ops::<P>( + &mut ext(), + user_agent, + root_cert_store, + unsafely_ignore_certificate_errors, + ) .build() } diff --git a/ext/webstorage/lib.rs b/ext/webstorage/lib.rs index ca96b01bc..f3caddbaf 100644 --- a/ext/webstorage/lib.rs +++ b/ext/webstorage/lib.rs @@ -9,6 +9,7 @@ use deno_core::error::AnyError; use deno_core::include_js_files; use deno_core::op; use deno_core::Extension; +use deno_core::ExtensionBuilder; use deno_core::OpState; use rusqlite::params; use rusqlite::Connection; @@ -21,9 +22,15 @@ struct OriginStorageDir(PathBuf); const MAX_STORAGE_BYTES: usize = 10 * 1024 * 1024; -pub fn init(origin_storage_dir: Option<PathBuf>) -> Extension { +fn ext() -> ExtensionBuilder { Extension::builder_with_deps(env!("CARGO_PKG_NAME"), &["deno_webidl"]) - .esm(include_js_files!("01_webstorage.js",)) +} + +fn ops( + ext: &mut ExtensionBuilder, + origin_storage_dir: Option<PathBuf>, +) -> &mut ExtensionBuilder { + ext .ops(vec![ op_webstorage_length::decl(), op_webstorage_key::decl(), @@ -38,9 +45,18 @@ pub fn init(origin_storage_dir: Option<PathBuf>) -> Extension { state.put(OriginStorageDir(origin_storage_dir.clone())); } }) +} + +pub fn init_ops_and_esm(origin_storage_dir: Option<PathBuf>) -> Extension { + ops(&mut ext(), origin_storage_dir) + .esm(include_js_files!("01_webstorage.js",)) .build() } +pub fn init_ops(origin_storage_dir: Option<PathBuf>) -> Extension { + ops(&mut ext(), origin_storage_dir).build() +} + pub fn get_declaration() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_webstorage.d.ts") } |