diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/main.rs | 26 | ||||
-rw-r--r-- | cli/standalone.rs | 4 | ||||
-rw-r--r-- | cli/tests/integration/compat_tests.rs | 5 | ||||
-rw-r--r-- | cli/tests/testdata/compat/worker/worker.mjs | 9 | ||||
-rw-r--r-- | cli/tests/testdata/compat/worker/worker_test.mjs | 18 | ||||
-rw-r--r-- | cli/tests/testdata/compat/worker/worker_test.out | 2 |
6 files changed, 64 insertions, 0 deletions
diff --git a/cli/main.rs b/cli/main.rs index ecadf65bd..acf49bb3f 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -71,6 +71,7 @@ use deno_ast::MediaType; use deno_core::error::generic_error; use deno_core::error::AnyError; use deno_core::futures::future::FutureExt; +use deno_core::futures::future::LocalFutureObj; use deno_core::futures::Future; use deno_core::located_script_name; use deno_core::parking_lot::RwLock; @@ -82,6 +83,7 @@ use deno_core::Extension; use deno_core::ModuleSpecifier; use deno_runtime::colors; use deno_runtime::ops::worker_host::CreateWebWorkerCb; +use deno_runtime::ops::worker_host::PreloadModuleCb; use deno_runtime::permissions::Permissions; use deno_runtime::tokio_util::run_basic; use deno_runtime::web_worker::WebWorker; @@ -100,6 +102,24 @@ use std::pin::Pin; use std::rc::Rc; use std::sync::Arc; +fn create_web_worker_preload_module_callback( + ps: ProcState, +) -> Arc<PreloadModuleCb> { + let compat = ps.flags.compat; + + Arc::new(move |mut worker| { + let fut = async move { + if compat { + worker.execute_side_module(&compat::GLOBAL_URL).await?; + worker.execute_side_module(&compat::MODULE_URL).await?; + } + + Ok(worker) + }; + LocalFutureObj::new(Box::new(fut)) + }) +} + fn create_web_worker_callback(ps: ProcState) -> Arc<CreateWebWorkerCb> { Arc::new(move |args| { let global_state_ = ps.clone(); @@ -116,6 +136,8 @@ fn create_web_worker_callback(ps: ProcState) -> Arc<CreateWebWorkerCb> { args.parent_permissions.clone(), ); let create_web_worker_cb = create_web_worker_callback(ps.clone()); + let preload_module_cb = + create_web_worker_preload_module_callback(ps.clone()); let extensions = ops::cli_exts(ps.clone(), args.use_deno_namespace); @@ -145,6 +167,7 @@ fn create_web_worker_callback(ps: ProcState) -> Arc<CreateWebWorkerCb> { seed: ps.flags.seed, module_loader, create_web_worker_cb, + preload_module_cb, js_error_create_fn: Some(js_error_create_fn), use_deno_namespace: args.use_deno_namespace, worker_type: args.worker_type, @@ -187,6 +210,8 @@ pub fn create_main_worker( let should_break_on_first_statement = ps.flags.inspect_brk.is_some(); let create_web_worker_cb = create_web_worker_callback(ps.clone()); + let web_worker_preload_module_cb = + create_web_worker_preload_module_callback(ps.clone()); let maybe_storage_key = if let Some(location) = &ps.flags.location { // if a location is set, then the ascii serialization of the location is @@ -240,6 +265,7 @@ pub fn create_main_worker( seed: ps.flags.seed, js_error_create_fn: Some(js_error_create_fn), create_web_worker_cb, + web_worker_preload_module_cb, maybe_inspector_server, should_break_on_first_statement, module_loader, diff --git a/cli/standalone.rs b/cli/standalone.rs index e31fa15f7..a50e7d80d 100644 --- a/cli/standalone.rs +++ b/cli/standalone.rs @@ -208,6 +208,9 @@ pub async fn run( let create_web_worker_cb = Arc::new(|_| { todo!("Worker are currently not supported in standalone binaries"); }); + let web_worker_preload_module_cb = Arc::new(|_| { + todo!("Worker are currently not supported in standalone binaries"); + }); // Keep in sync with `main.rs`. v8_set_flags( @@ -257,6 +260,7 @@ pub async fn run( seed: metadata.seed, js_error_create_fn: None, create_web_worker_cb, + web_worker_preload_module_cb, maybe_inspector_server: None, should_break_on_first_statement: false, module_loader, diff --git a/cli/tests/integration/compat_tests.rs b/cli/tests/integration/compat_tests.rs index bafe24af3..189e1eb41 100644 --- a/cli/tests/integration/compat_tests.rs +++ b/cli/tests/integration/compat_tests.rs @@ -90,6 +90,11 @@ itest!(top_level_fail_esm { output: "compat/test_runner/top_level_fail_esm.out", }); +itest!(compat_worker { + args: "run --compat --unstable -A --quiet --no-check compat/worker/worker_test.mjs", + output: "compat/worker/worker_test.out", +}); + #[test] fn globals_in_repl() { let (out, _err) = util::run_and_collect_output_with_args( diff --git a/cli/tests/testdata/compat/worker/worker.mjs b/cli/tests/testdata/compat/worker/worker.mjs new file mode 100644 index 000000000..eb7cfed19 --- /dev/null +++ b/cli/tests/testdata/compat/worker/worker.mjs @@ -0,0 +1,9 @@ +console.log("hello from worker"); + +self.onmessage = (e) => { + if (e.data != "hello") { + throw new Error("wrong message"); + } + + self.postMessage({ pid: process.pid }); +} diff --git a/cli/tests/testdata/compat/worker/worker_test.mjs b/cli/tests/testdata/compat/worker/worker_test.mjs new file mode 100644 index 000000000..215605487 --- /dev/null +++ b/cli/tests/testdata/compat/worker/worker_test.mjs @@ -0,0 +1,18 @@ +import { deferred } from "../../../../../test_util/std/async/deferred.ts"; + +const promise = deferred(); +const url = new URL("./worker.mjs", import.meta.url); +const worker = new Worker(url.href, { type: "module", deno: true }); + +worker.onmessage = (e) => { + const pid = e.data.pid; + if (typeof pid != "number") { + throw new Error("pid is not a number"); + } + console.log("process.pid from worker:", pid); + promise.resolve(); +}; + +worker.postMessage("hello"); +await promise; +worker.terminate(); diff --git a/cli/tests/testdata/compat/worker/worker_test.out b/cli/tests/testdata/compat/worker/worker_test.out new file mode 100644 index 000000000..373841945 --- /dev/null +++ b/cli/tests/testdata/compat/worker/worker_test.out @@ -0,0 +1,2 @@ +hello from worker +process.pid from worker: [WILDCARD] |