summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/main.rs26
-rw-r--r--cli/standalone.rs4
-rw-r--r--cli/tests/integration/compat_tests.rs5
-rw-r--r--cli/tests/testdata/compat/worker/worker.mjs9
-rw-r--r--cli/tests/testdata/compat/worker/worker_test.mjs18
-rw-r--r--cli/tests/testdata/compat/worker/worker_test.out2
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]