mirror of
https://github.com/denoland/deno.git
synced 2025-09-29 13:44:47 +00:00

This extracts out the shared libraries and `.node` native modules to a temp file and opens them from there. **This means that this implementation will not work in every scenario.** For example, a library could require other files that only exist in the in-memory file system. To solve that, we'll introduce https://github.com/denoland/deno/issues/28918 later or adapt this solution to solve more issues. Additionally, this will not work when run on readonly file systems.
75 lines
2.4 KiB
Rust
75 lines
2.4 KiB
Rust
// Copyright 2018-2025 the Deno authors. MIT license.
|
|
|
|
#![allow(clippy::print_stdout)]
|
|
#![allow(clippy::print_stderr)]
|
|
|
|
use std::path::Path;
|
|
use std::rc::Rc;
|
|
use std::sync::Arc;
|
|
|
|
use deno_core::error::AnyError;
|
|
use deno_core::op2;
|
|
use deno_core::FsModuleLoader;
|
|
use deno_core::ModuleSpecifier;
|
|
use deno_fs::RealFs;
|
|
use deno_resolver::npm::DenoInNpmPackageChecker;
|
|
use deno_resolver::npm::NpmResolver;
|
|
use deno_runtime::deno_permissions::PermissionsContainer;
|
|
use deno_runtime::permissions::RuntimePermissionDescriptorParser;
|
|
use deno_runtime::worker::MainWorker;
|
|
use deno_runtime::worker::WorkerOptions;
|
|
use deno_runtime::worker::WorkerServiceOptions;
|
|
|
|
#[op2(fast)]
|
|
fn op_hello(#[string] text: &str) {
|
|
println!("Hello {} from an op!", text);
|
|
}
|
|
|
|
deno_core::extension!(
|
|
hello_runtime,
|
|
ops = [op_hello],
|
|
esm_entry_point = "ext:hello_runtime/bootstrap.js",
|
|
esm = [dir "examples/extension", "bootstrap.js"]
|
|
);
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), AnyError> {
|
|
let js_path =
|
|
Path::new(env!("CARGO_MANIFEST_DIR")).join("examples/extension/main.js");
|
|
let main_module = ModuleSpecifier::from_file_path(js_path).unwrap();
|
|
eprintln!("Running {main_module}...");
|
|
let fs = Arc::new(RealFs);
|
|
let permission_desc_parser = Arc::new(
|
|
RuntimePermissionDescriptorParser::new(sys_traits::impls::RealSys),
|
|
);
|
|
let mut worker = MainWorker::bootstrap_from_options(
|
|
&main_module,
|
|
WorkerServiceOptions::<
|
|
DenoInNpmPackageChecker,
|
|
NpmResolver<sys_traits::impls::RealSys>,
|
|
sys_traits::impls::RealSys,
|
|
> {
|
|
deno_rt_native_addon_loader: None,
|
|
module_loader: Rc::new(FsModuleLoader),
|
|
permissions: PermissionsContainer::allow_all(permission_desc_parser),
|
|
blob_store: Default::default(),
|
|
broadcast_channel: Default::default(),
|
|
feature_checker: Default::default(),
|
|
node_services: Default::default(),
|
|
npm_process_state_provider: Default::default(),
|
|
root_cert_store_provider: Default::default(),
|
|
fetch_dns_resolver: Default::default(),
|
|
shared_array_buffer_store: Default::default(),
|
|
compiled_wasm_module_store: Default::default(),
|
|
v8_code_cache: Default::default(),
|
|
fs,
|
|
},
|
|
WorkerOptions {
|
|
extensions: vec![hello_runtime::init_ops_and_esm()],
|
|
..Default::default()
|
|
},
|
|
);
|
|
worker.execute_main_module(&main_module).await?;
|
|
worker.run_event_loop(false).await?;
|
|
Ok(())
|
|
}
|