mirror of
https://github.com/denoland/deno.git
synced 2024-11-26 16:09:27 -05:00
feat(runtime): Add example for extension with ops (#19204)
Spend quite some time trying to get this working. With proper example would have been a lot faster. So this is pr with the example. I also rearranged examples a little bit to allow for addition of more examples
This commit is contained in:
parent
be71285b4f
commit
efc8372241
6 changed files with 59 additions and 8 deletions
|
@ -29,8 +29,12 @@ name = "deno_runtime"
|
|||
path = "lib.rs"
|
||||
|
||||
[[example]]
|
||||
name = "hello_runtime"
|
||||
path = "examples/hello_runtime.rs"
|
||||
name = "extension_with_esm"
|
||||
path = "examples/extension_with_esm/main.rs"
|
||||
|
||||
[[example]]
|
||||
name = "extension_with_ops"
|
||||
path = "examples/extension_with_ops/main.rs"
|
||||
|
||||
[build-dependencies]
|
||||
deno_ast.workspace = true
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use std::path::Path;
|
||||
use std::rc::Rc;
|
||||
|
||||
use deno_core::error::AnyError;
|
||||
use deno_core::FsModuleLoader;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_runtime::permissions::PermissionsContainer;
|
||||
use deno_runtime::worker::MainWorker;
|
||||
use deno_runtime::worker::WorkerOptions;
|
||||
use std::path::Path;
|
||||
use std::rc::Rc;
|
||||
|
||||
deno_core::extension!(
|
||||
hello_runtime,
|
||||
esm_entry_point = "ext:hello_runtime/hello_runtime_bootstrap.js",
|
||||
esm = ["hello_runtime_bootstrap.js"]
|
||||
esm_entry_point = "ext:hello_runtime/bootstrap.js",
|
||||
esm = ["bootstrap.js"]
|
||||
);
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), AnyError> {
|
||||
let js_path =
|
||||
Path::new(env!("CARGO_MANIFEST_DIR")).join("examples/hello_runtime.js");
|
||||
let js_path = Path::new(env!("CARGO_MANIFEST_DIR"))
|
||||
.join("examples/extension_with_esm/main.js");
|
||||
let main_module = ModuleSpecifier::from_file_path(js_path).unwrap();
|
||||
let mut worker = MainWorker::bootstrap_from_options(
|
||||
main_module.clone(),
|
2
runtime/examples/extension_with_ops/main.js
Normal file
2
runtime/examples/extension_with_ops/main.js
Normal file
|
@ -0,0 +1,2 @@
|
|||
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
||||
Deno[Deno.internal].core.ops.op_hello("World");
|
44
runtime/examples/extension_with_ops/main.rs
Normal file
44
runtime/examples/extension_with_ops/main.rs
Normal file
|
@ -0,0 +1,44 @@
|
|||
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use std::path::Path;
|
||||
use std::rc::Rc;
|
||||
|
||||
use deno_core::error::AnyError;
|
||||
use deno_core::op;
|
||||
use deno_core::FsModuleLoader;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_runtime::permissions::PermissionsContainer;
|
||||
use deno_runtime::worker::MainWorker;
|
||||
use deno_runtime::worker::WorkerOptions;
|
||||
|
||||
deno_core::extension!(
|
||||
hello_runtime,
|
||||
ops = [op_hello],
|
||||
customizer = |ext: &mut deno_core::ExtensionBuilder| {
|
||||
ext.force_op_registration();
|
||||
},
|
||||
);
|
||||
|
||||
#[op]
|
||||
fn op_hello(text: &str) {
|
||||
println!("Hello {}!", text);
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), AnyError> {
|
||||
let js_path = Path::new(env!("CARGO_MANIFEST_DIR"))
|
||||
.join("examples/extension_with_ops/main.js");
|
||||
let main_module = ModuleSpecifier::from_file_path(js_path).unwrap();
|
||||
let mut worker = MainWorker::bootstrap_from_options(
|
||||
main_module.clone(),
|
||||
PermissionsContainer::allow_all(),
|
||||
WorkerOptions {
|
||||
module_loader: Rc::new(FsModuleLoader),
|
||||
extensions: vec![hello_runtime::init_ops()],
|
||||
..Default::default()
|
||||
},
|
||||
);
|
||||
worker.execute_main_module(&main_module).await?;
|
||||
worker.run_event_loop(false).await?;
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in a new issue