1#![allow(clippy::print_stdout)]
4#![allow(clippy::print_stderr)]
5
6use std::path::Path;
7use std::rc::Rc;
8use std::sync::Arc;
9
10use deno_core::error::AnyError;
11use deno_core::op2;
12use deno_core::FsModuleLoader;
13use deno_core::ModuleSpecifier;
14use deno_fs::RealFs;
15use deno_runtime::deno_permissions::PermissionsContainer;
16use deno_runtime::permissions::RuntimePermissionDescriptorParser;
17use deno_runtime::worker::MainWorker;
18use deno_runtime::worker::WorkerOptions;
19use deno_runtime::worker::WorkerServiceOptions;
20
21#[op2(fast)]
22fn op_hello(#[string] text: &str) {
23 println!("Hello {} from an op!", text);
24}
25
26deno_core::extension!(
27 hello_runtime,
28 ops = [op_hello],
29 esm_entry_point = "ext:hello_runtime/bootstrap.js",
30 esm = [dir "examples/extension", "bootstrap.js"]
31);
32
33#[tokio::main]
34async fn main() -> Result<(), AnyError> {
35 let js_path =
36 Path::new(env!("CARGO_MANIFEST_DIR")).join("examples/extension/main.js");
37 let main_module = ModuleSpecifier::from_file_path(js_path).unwrap();
38 eprintln!("Running {main_module}...");
39 let fs = Arc::new(RealFs);
40 let permission_desc_parser =
41 Arc::new(RuntimePermissionDescriptorParser::new(fs.clone()));
42 let mut worker = MainWorker::bootstrap_from_options(
43 main_module.clone(),
44 WorkerServiceOptions {
45 module_loader: Rc::new(FsModuleLoader),
46 permissions: PermissionsContainer::allow_all(permission_desc_parser),
47 blob_store: Default::default(),
48 broadcast_channel: Default::default(),
49 feature_checker: Default::default(),
50 node_services: Default::default(),
51 npm_process_state_provider: Default::default(),
52 root_cert_store_provider: Default::default(),
53 fetch_dns_resolver: Default::default(),
54 shared_array_buffer_store: Default::default(),
55 compiled_wasm_module_store: Default::default(),
56 v8_code_cache: Default::default(),
57 fs,
58 },
59 WorkerOptions {
60 extensions: vec![hello_runtime::init_ops_and_esm()],
61 ..Default::default()
62 },
63 );
64 worker.execute_main_module(&main_module).await?;
65 worker.run_event_loop(false).await?;
66 Ok(())
67}