0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 17:34:47 -05:00

fix: Split extension registration and snapshotting (#18098)

This commit partially reverts changes from
https://github.com/denoland/deno/pull/18095.

Turns out I made a mistake that became apparent when working
on removing "RuntimeOptions::extensions_with_js" in a follow up.
This commit is contained in:
Bartek Iwańczuk 2023-03-09 16:09:45 -04:00 committed by GitHub
parent 47012bd931
commit 44e67df1cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 161 additions and 354 deletions

View file

@ -322,40 +322,36 @@ mod ts {
fn create_cli_snapshot(snapshot_path: PathBuf) { fn create_cli_snapshot(snapshot_path: PathBuf) {
let extensions: Vec<Extension> = vec![ let extensions: Vec<Extension> = vec![
deno_webidl::init_esm(), deno_webidl::init(),
deno_console::init_esm(), deno_console::init(),
deno_url::init_ops_and_esm(), deno_url::init_ops(),
deno_tls::init(), deno_tls::init_ops(),
deno_web::init_ops_and_esm::<PermissionsContainer>( deno_web::init_ops::<PermissionsContainer>(
deno_web::BlobStore::default(), deno_web::BlobStore::default(),
Default::default(), Default::default(),
), ),
deno_fetch::init_ops_and_esm::<PermissionsContainer>(Default::default()), deno_fetch::init_ops::<PermissionsContainer>(Default::default()),
deno_cache::init_ops_and_esm::<SqliteBackedCache>(None), deno_cache::init_ops::<SqliteBackedCache>(None),
deno_websocket::init_ops_and_esm::<PermissionsContainer>( deno_websocket::init_ops::<PermissionsContainer>("".to_owned(), None, None),
"".to_owned(), deno_webstorage::init_ops(None),
None, deno_crypto::init_ops(None),
None, deno_webgpu::init_ops(false),
), deno_broadcast_channel::init_ops(
deno_webstorage::init_ops_and_esm(None),
deno_crypto::init_ops_and_esm(None),
deno_webgpu::init_ops_and_esm(false),
deno_broadcast_channel::init_ops_and_esm(
deno_broadcast_channel::InMemoryBroadcastChannel::default(), deno_broadcast_channel::InMemoryBroadcastChannel::default(),
false, // No --unstable. false, // No --unstable.
), ),
deno_io::init_ops_and_esm(Default::default()), deno_io::init_ops(Default::default()),
deno_fs::init_ops_and_esm::<PermissionsContainer>(false), deno_fs::init_ops::<PermissionsContainer>(false),
deno_node::init_ops_and_esm::<PermissionsContainer>(None), // No --unstable. deno_node::init_ops::<PermissionsContainer>(None), // No --unstable.
deno_node::init_polyfill_ops_and_esm(), deno_node::init_polyfill_ops(),
deno_ffi::init_ops_and_esm::<PermissionsContainer>(false), deno_ffi::init_ops::<PermissionsContainer>(false),
deno_net::init_ops_and_esm::<PermissionsContainer>( deno_net::init_ops::<PermissionsContainer>(
None, false, // No --unstable. None, false, // No --unstable.
None, None,
), ),
deno_napi::init::<PermissionsContainer>(), deno_napi::init_ops::<PermissionsContainer>(),
deno_http::init_ops_and_esm(), deno_http::init_ops(),
deno_flash::init_ops_and_esm::<PermissionsContainer>(false), // No --unstable deno_flash::init_ops::<PermissionsContainer>(false), // No --unstable
]; ];
let mut esm_files = include_js_files!( let mut esm_files = include_js_files!(

View file

@ -514,7 +514,7 @@ impl Env {
} }
} }
pub fn init<P: NapiPermissions + 'static>() -> Extension { pub fn init_ops<P: NapiPermissions + 'static>() -> Extension {
Extension::builder(env!("CARGO_PKG_NAME")) Extension::builder(env!("CARGO_PKG_NAME"))
.ops(vec![op_napi_open::decl::<P>()]) .ops(vec![op_napi_open::decl::<P>()])
.event_loop_middleware(|op_state_rc, cx| { .event_loop_middleware(|op_state_rc, cx| {

View file

@ -36,7 +36,7 @@ use std::sync::Arc;
use std::time::SystemTime; use std::time::SystemTime;
/// This extension has no runtime apis, it only exports some shared native functions. /// This extension has no runtime apis, it only exports some shared native functions.
pub fn init() -> Extension { pub fn init_ops() -> Extension {
Extension::builder(env!("CARGO_PKG_NAME")).build() Extension::builder(env!("CARGO_PKG_NAME")).build()
} }

View file

@ -254,7 +254,7 @@ mod startup_snapshot {
deno_webidl::init_esm(), deno_webidl::init_esm(),
deno_console::init_esm(), deno_console::init_esm(),
deno_url::init_ops_and_esm(), deno_url::init_ops_and_esm(),
deno_tls::init(), deno_tls::init_ops(),
deno_web::init_ops_and_esm::<Permissions>( deno_web::init_ops_and_esm::<Permissions>(
deno_web::BlobStore::default(), deno_web::BlobStore::default(),
Default::default(), Default::default(),
@ -278,7 +278,7 @@ mod startup_snapshot {
None, false, // No --unstable. None, false, // No --unstable.
None, None,
), ),
deno_napi::init::<Permissions>(), deno_napi::init_ops::<Permissions>(),
deno_http::init_ops_and_esm(), deno_http::init_ops_and_esm(),
deno_io::init_ops_and_esm(Default::default()), deno_io::init_ops_and_esm(Default::default()),
deno_fs::init_ops_and_esm::<Permissions>(false), deno_fs::init_ops_and_esm::<Permissions>(false),

View file

@ -346,168 +346,6 @@ pub struct WebWorkerOptions {
pub stdio: Stdio, pub stdio: Stdio,
} }
#[cfg(feature = "dont_create_runtime_snapshot")]
fn get_extensions(
options: &mut WebWorkerOptions,
unstable: bool,
main_module: ModuleSpecifier,
) -> Vec<Extension> {
let create_cache = options.cache_storage_dir.take().map(|storage_dir| {
let create_cache_fn = move || SqliteBackedCache::new(storage_dir.clone());
CreateCache(Arc::new(create_cache_fn))
});
vec![
// Web APIs
deno_webidl::init(),
deno_console::init(),
deno_url::init_ops(),
deno_web::init_ops::<PermissionsContainer>(
options.blob_store.clone(),
Some(main_module.clone()),
),
deno_fetch::init_ops::<PermissionsContainer>(deno_fetch::Options {
user_agent: options.bootstrap.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Rc::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_cache::init_ops::<SqliteBackedCache>(create_cache),
deno_websocket::init_ops::<PermissionsContainer>(
options.bootstrap.user_agent.clone(),
options.root_cert_store.clone(),
options.unsafely_ignore_certificate_errors.clone(),
),
deno_webstorage::init_ops(None).disable(),
deno_broadcast_channel::init_ops(
options.broadcast_channel.clone(),
unstable,
),
deno_crypto::init_ops(options.seed),
deno_webgpu::init_ops(unstable),
// ffi
deno_ffi::init_ops::<PermissionsContainer>(unstable),
// Runtime ops that are always initialized for WebWorkers
ops::web_worker::init(),
ops::runtime::init(main_module),
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.preload_module_cb.clone(),
options.pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
// Extensions providing Deno.* features
ops::fs_events::init(),
deno_fs::init_ops::<PermissionsContainer>(unstable),
deno_io::init_ops(std::mem::take(&mut options.stdio)),
deno_tls::init(),
deno_net::init_ops::<PermissionsContainer>(
options.root_cert_store.clone(),
unstable,
options.unsafely_ignore_certificate_errors.clone(),
),
deno_napi::init::<PermissionsContainer>(),
// TODO(bartlomieju): thes two should be conditional on `dont_create_runtime_snapshot`
// cargo feature and should use `init_polyfill_ops` or `init_polyfill_ops_and_esm`
// if the feature is enabled
deno_node::init_polyfill_ops(),
deno_node::init_ops::<PermissionsContainer>(options.npm_resolver.take()),
ops::os::init_for_worker(),
ops::permissions::init(),
ops::process::init_ops(),
ops::signal::init(),
ops::tty::init(),
deno_http::init_ops(),
deno_flash::init_ops::<PermissionsContainer>(unstable),
ops::http::init(),
]
}
#[cfg(not(feature = "dont_create_runtime_snapshot"))]
fn get_extensions(
options: &mut WebWorkerOptions,
unstable: bool,
main_module: ModuleSpecifier,
) -> Vec<Extension> {
let create_cache = options.cache_storage_dir.take().map(|storage_dir| {
let create_cache_fn = move || SqliteBackedCache::new(storage_dir.clone());
CreateCache(Arc::new(create_cache_fn))
});
vec![
// Web APIs
deno_webidl::init_esm(),
deno_console::init_esm(),
deno_url::init_ops_and_esm(),
deno_web::init_ops_and_esm::<PermissionsContainer>(
options.blob_store.clone(),
Some(main_module.clone()),
),
deno_fetch::init_ops_and_esm::<PermissionsContainer>(deno_fetch::Options {
user_agent: options.bootstrap.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Rc::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_cache::init_ops_and_esm::<SqliteBackedCache>(create_cache),
deno_websocket::init_ops_and_esm::<PermissionsContainer>(
options.bootstrap.user_agent.clone(),
options.root_cert_store.clone(),
options.unsafely_ignore_certificate_errors.clone(),
),
deno_webstorage::init_ops_and_esm(None).disable(),
deno_broadcast_channel::init_ops_and_esm(
options.broadcast_channel.clone(),
unstable,
),
deno_crypto::init_ops_and_esm(options.seed),
deno_webgpu::init_ops_and_esm(unstable),
// ffi
deno_ffi::init_ops_and_esm::<PermissionsContainer>(unstable),
// Runtime ops that are always initialized for WebWorkers
ops::web_worker::init(),
ops::runtime::init(main_module),
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.preload_module_cb.clone(),
options.pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
// Extensions providing Deno.* features
ops::fs_events::init(),
deno_fs::init_ops_and_esm::<PermissionsContainer>(unstable),
deno_io::init_ops_and_esm(std::mem::take(&mut options.stdio)),
deno_tls::init(),
deno_net::init_ops_and_esm::<PermissionsContainer>(
options.root_cert_store.clone(),
unstable,
options.unsafely_ignore_certificate_errors.clone(),
),
deno_napi::init::<PermissionsContainer>(),
// TODO(bartlomieju): thes two should be conditional on `dont_create_runtime_snapshot`
// cargo feature and should use `init_polyfill_ops` or `init_polyfill_ops_and_esm`
// if the feature is enabled
deno_node::init_polyfill_ops_and_esm(),
deno_node::init_ops_and_esm::<PermissionsContainer>(
options.npm_resolver.take(),
),
ops::os::init_for_worker(),
ops::permissions::init(),
ops::process::init_ops(),
ops::signal::init(),
ops::tty::init(),
deno_http::init_ops_and_esm(),
deno_flash::init_ops_and_esm::<PermissionsContainer>(unstable),
ops::http::init(),
]
}
impl WebWorker { impl WebWorker {
pub fn bootstrap_from_options( pub fn bootstrap_from_options(
name: String, name: String,
@ -540,10 +378,77 @@ impl WebWorker {
state.put(ops::TestingFeaturesEnabled(enable_testing_features)); state.put(ops::TestingFeaturesEnabled(enable_testing_features));
}) })
.build(); .build();
let create_cache = options.cache_storage_dir.map(|storage_dir| {
let create_cache_fn = move || SqliteBackedCache::new(storage_dir.clone());
CreateCache(Arc::new(create_cache_fn))
});
let mut extensions = let mut extensions: Vec<Extension> = vec![
get_extensions(&mut options, unstable, main_module.clone()); // Web APIs
extensions.push(perm_ext); deno_webidl::init(),
deno_console::init(),
deno_url::init_ops(),
deno_web::init_ops::<PermissionsContainer>(
options.blob_store.clone(),
Some(main_module.clone()),
),
deno_fetch::init_ops::<PermissionsContainer>(deno_fetch::Options {
user_agent: options.bootstrap.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Rc::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_cache::init_ops::<SqliteBackedCache>(create_cache),
deno_websocket::init_ops::<PermissionsContainer>(
options.bootstrap.user_agent.clone(),
options.root_cert_store.clone(),
options.unsafely_ignore_certificate_errors.clone(),
),
deno_webstorage::init_ops(None).disable(),
deno_broadcast_channel::init_ops(
options.broadcast_channel.clone(),
unstable,
),
deno_crypto::init_ops(options.seed),
deno_webgpu::init_ops(unstable),
// ffi
deno_ffi::init_ops::<PermissionsContainer>(unstable),
// Runtime ops that are always initialized for WebWorkers
ops::web_worker::init(),
ops::runtime::init(main_module.clone()),
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.preload_module_cb.clone(),
options.pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
// Extensions providing Deno.* features
ops::fs_events::init(),
deno_fs::init_ops::<PermissionsContainer>(unstable),
deno_io::init_ops(options.stdio),
deno_tls::init_ops(),
deno_net::init_ops::<PermissionsContainer>(
options.root_cert_store.clone(),
unstable,
options.unsafely_ignore_certificate_errors.clone(),
),
deno_napi::init_ops::<PermissionsContainer>(),
deno_node::init_polyfill_ops(),
deno_node::init_ops::<PermissionsContainer>(options.npm_resolver),
ops::os::init_for_worker(),
ops::permissions::init(),
ops::process::init_ops(),
ops::signal::init(),
ops::tty::init(),
deno_http::init_ops(),
deno_flash::init_ops::<PermissionsContainer>(unstable),
ops::http::init(),
// Permissions ext (worker specific state)
perm_ext,
];
// Append exts // Append exts
extensions.extend(std::mem::take(&mut options.extensions)); extensions.extend(std::mem::take(&mut options.extensions));

View file

@ -183,160 +183,6 @@ impl Default for WorkerOptions {
} }
} }
#[cfg(not(feature = "dont_create_runtime_snapshot"))]
fn get_extensions(
options: &mut WorkerOptions,
unstable: bool,
exit_code: ExitCode,
main_module: ModuleSpecifier,
) -> Vec<Extension> {
let create_cache = options.cache_storage_dir.take().map(|storage_dir| {
let create_cache_fn = move || SqliteBackedCache::new(storage_dir.clone());
CreateCache(Arc::new(create_cache_fn))
});
vec![
// Web APIs
deno_webidl::init(),
deno_console::init(),
deno_url::init_ops(),
deno_web::init_ops::<PermissionsContainer>(
options.blob_store.clone(),
options.bootstrap.location.clone(),
),
deno_fetch::init_ops::<PermissionsContainer>(deno_fetch::Options {
user_agent: options.bootstrap.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Rc::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_cache::init_ops::<SqliteBackedCache>(create_cache),
deno_websocket::init_ops::<PermissionsContainer>(
options.bootstrap.user_agent.clone(),
options.root_cert_store.clone(),
options.unsafely_ignore_certificate_errors.clone(),
),
deno_webstorage::init_ops(options.origin_storage_dir.clone()),
deno_broadcast_channel::init_ops(
options.broadcast_channel.clone(),
unstable,
),
deno_crypto::init_ops(options.seed),
deno_webgpu::init_ops(unstable),
// ffi
deno_ffi::init_ops::<PermissionsContainer>(unstable),
// Runtime ops
ops::runtime::init(main_module),
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.web_worker_preload_module_cb.clone(),
options.web_worker_pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
ops::fs_events::init(),
deno_fs::init_ops::<PermissionsContainer>(unstable),
deno_io::init_ops(std::mem::take(&mut options.stdio)),
deno_tls::init(),
deno_net::init_ops::<PermissionsContainer>(
options.root_cert_store.clone(),
unstable,
options.unsafely_ignore_certificate_errors.clone(),
),
deno_napi::init::<PermissionsContainer>(),
deno_node::init_ops::<PermissionsContainer>(options.npm_resolver.take()),
ops::os::init(exit_code),
ops::permissions::init(),
ops::process::init_ops(),
ops::signal::init(),
ops::tty::init(),
deno_http::init_ops(),
deno_flash::init_ops::<PermissionsContainer>(unstable),
ops::http::init(),
deno_node::init_polyfill_ops(),
]
}
#[cfg(feature = "dont_create_runtime_snapshot")]
fn get_extensions(
options: &mut WorkerOptions,
unstable: bool,
exit_code: ExitCode,
main_module: ModuleSpecifier,
) -> Vec<Extension> {
let create_cache = options.cache_storage_dir.take().map(|storage_dir| {
let create_cache_fn = move || SqliteBackedCache::new(storage_dir.clone());
CreateCache(Arc::new(create_cache_fn))
});
vec![
// Web APIs
deno_webidl::init_esm(),
deno_console::init_esm(),
deno_url::init_ops_and_esm(),
deno_web::init_ops_and_esm::<PermissionsContainer>(
options.blob_store.clone(),
options.bootstrap.location.clone(),
),
deno_fetch::init_ops_and_esm::<PermissionsContainer>(deno_fetch::Options {
user_agent: options.bootstrap.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Rc::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_cache::init_ops_and_esm::<SqliteBackedCache>(create_cache),
deno_websocket::init_ops_and_esm::<PermissionsContainer>(
options.bootstrap.user_agent.clone(),
options.root_cert_store.clone(),
options.unsafely_ignore_certificate_errors.clone(),
),
deno_webstorage::init_ops_and_esm(options.origin_storage_dir.clone()),
deno_broadcast_channel::init_ops_and_esm(
options.broadcast_channel.clone(),
unstable,
),
deno_crypto::init_ops_and_esm(options.seed),
deno_webgpu::init_ops_and_esm(unstable),
// ffi
deno_ffi::init_ops_and_esm::<PermissionsContainer>(unstable),
// Runtime ops
ops::runtime::init(main_module),
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.web_worker_preload_module_cb.clone(),
options.web_worker_pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
ops::fs_events::init(),
deno_fs::init_ops_and_esm::<PermissionsContainer>(unstable),
deno_io::init_ops_and_esm(std::mem::take(&mut options.stdio)),
deno_tls::init(),
deno_net::init_ops_and_esm::<PermissionsContainer>(
options.root_cert_store.clone(),
unstable,
options.unsafely_ignore_certificate_errors.clone(),
),
deno_napi::init::<PermissionsContainer>(),
deno_node::init_ops_and_esm::<PermissionsContainer>(
options.npm_resolver.take(),
),
ops::os::init(exit_code),
ops::permissions::init(),
ops::process::init_ops(),
ops::signal::init(),
ops::tty::init(),
deno_http::init_ops_and_esm(),
deno_flash::init_ops_and_esm::<PermissionsContainer>(unstable),
ops::http::init(),
deno_node::init_polyfill_ops_and_esm(),
]
}
impl MainWorker { impl MainWorker {
pub fn bootstrap_from_options( pub fn bootstrap_from_options(
main_module: ModuleSpecifier, main_module: ModuleSpecifier,
@ -365,13 +211,73 @@ impl MainWorker {
}) })
.build(); .build();
let exit_code = ExitCode(Arc::new(AtomicI32::new(0))); let exit_code = ExitCode(Arc::new(AtomicI32::new(0)));
let create_cache = options.cache_storage_dir.map(|storage_dir| {
let create_cache_fn = move || SqliteBackedCache::new(storage_dir.clone());
CreateCache(Arc::new(create_cache_fn))
});
let mut extensions = get_extensions( let mut extensions = vec![
&mut options, // Web APIs
unstable, deno_webidl::init(),
exit_code.clone(), deno_console::init(),
main_module.clone(), deno_url::init_ops(),
); deno_web::init_ops::<PermissionsContainer>(
options.blob_store.clone(),
options.bootstrap.location.clone(),
),
deno_fetch::init_ops::<PermissionsContainer>(deno_fetch::Options {
user_agent: options.bootstrap.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Rc::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_cache::init_ops::<SqliteBackedCache>(create_cache),
deno_websocket::init_ops::<PermissionsContainer>(
options.bootstrap.user_agent.clone(),
options.root_cert_store.clone(),
options.unsafely_ignore_certificate_errors.clone(),
),
deno_webstorage::init_ops(options.origin_storage_dir.clone()),
deno_broadcast_channel::init_ops(
options.broadcast_channel.clone(),
unstable,
),
deno_crypto::init_ops(options.seed),
deno_webgpu::init_ops(unstable),
// ffi
deno_ffi::init_ops::<PermissionsContainer>(unstable),
// Runtime ops
ops::runtime::init(main_module.clone()),
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.web_worker_preload_module_cb.clone(),
options.web_worker_pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
ops::fs_events::init(),
deno_fs::init_ops::<PermissionsContainer>(unstable),
deno_io::init_ops(options.stdio),
deno_tls::init_ops(),
deno_net::init_ops::<PermissionsContainer>(
options.root_cert_store.clone(),
unstable,
options.unsafely_ignore_certificate_errors.clone(),
),
deno_napi::init_ops::<PermissionsContainer>(),
deno_node::init_ops::<PermissionsContainer>(options.npm_resolver),
deno_node::init_polyfill_ops(),
ops::os::init(exit_code.clone()),
ops::permissions::init(),
ops::process::init_ops(),
ops::signal::init(),
ops::tty::init(),
deno_http::init_ops(),
deno_flash::init_ops::<PermissionsContainer>(unstable),
ops::http::init(),
];
extensions.push(perm_ext); extensions.push(perm_ext);