deno_core 0.246.0

A modern JavaScript/TypeScript runtime built with V8, Rust, and Tokio
Documentation
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
use anyhow::Context;
use deno_core::anyhow::Error;
use deno_core::*;
use std::rc::Rc;

#[op2]
fn op_use_state(
  state: &mut OpState,
  #[global] callback: v8::Global<v8::Function>,
) -> Result<(), Error> {
  state.put(callback);
  Ok(())
}

extension!(
  op2_sample,
  ops = [op_use_state],
  esm_entry_point = "ext:op2_sample/op2.js",
  esm = [ dir "examples", "op2.js" ],
  docs = "A small example demonstrating op2 usage.", "Contains one op."
);

fn main() -> Result<(), Error> {
  let module_name = "test.js";
  let module_code = "
      op2_sample.use_state(() => {
          console.log('Hello World');
      });
  "
  .to_string();

  let mut js_runtime = JsRuntime::new(deno_core::RuntimeOptions {
    module_loader: Some(Rc::new(FsModuleLoader)),
    extensions: vec![op2_sample::init_ops_and_esm()],
    ..Default::default()
  });

  let main_module = resolve_path(
    module_name,
    &std::env::current_dir()
      .context("Unable to get current working directory")?,
  )?;

  let future = async move {
    let mod_id = js_runtime
      .load_main_module(
        &main_module,
        Some(deno_core::FastString::from(module_code)),
      )
      .await?;

    let result = js_runtime.mod_evaluate(mod_id);
    js_runtime.run_event_loop(Default::default()).await?;
    result.await
  };

  tokio::runtime::Builder::new_current_thread()
    .enable_all()
    .build()
    .unwrap()
    .block_on(future)
}