extension/
main.rs

1// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
2
3#![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}