diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49e4bcf016..6bea685779 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -236,7 +236,7 @@ jobs: ~/.cargo/registry/index ~/.cargo/registry/cache ~/.cargo/git/db - key: 11-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }} + key: 12-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }} # In main branch, always creates fresh cache - name: Cache build output (main) @@ -252,7 +252,7 @@ jobs: !./target/*/*.zip !./target/*/*.tar.gz key: | - 11-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ github.sha }} + 12-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ github.sha }} # Restore cache from the latest 'main' branch build. - name: Cache build output (PR) @@ -268,7 +268,7 @@ jobs: !./target/*/*.tar.gz key: never_saved restore-keys: | - 11-cargo-target-${{ matrix.os }}-${{ matrix.profile }}- + 12-cargo-target-${{ matrix.os }}-${{ matrix.profile }}- # Don't save cache after building PRs or branches other than 'main'. - name: Skip save cache (PR) diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index d2f11499bb..1cf22a51a4 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -2714,6 +2714,14 @@ itest!(event_listener_error_immediate_exit { exit_code: 1, }); +// https://github.com/denoland/deno/pull/14159#issuecomment-1092285446 +itest!(event_listener_error_immediate_exit_worker { + args: + "run --quiet --unstable -A event_listener_error_immediate_exit_worker.ts", + output: "event_listener_error_immediate_exit_worker.ts.out", + exit_code: 1, +}); + itest!(set_timeout_error { args: "run --quiet set_timeout_error.ts", output: "set_timeout_error.ts.out", diff --git a/cli/tests/testdata/event_listener_error_immediate_exit_worker.ts b/cli/tests/testdata/event_listener_error_immediate_exit_worker.ts new file mode 100644 index 0000000000..87e2ecb196 --- /dev/null +++ b/cli/tests/testdata/event_listener_error_immediate_exit_worker.ts @@ -0,0 +1,4 @@ +new Worker( + new URL("event_listener_error_immediate_exit.ts", import.meta.url).href, + { type: "module", deno: { namespace: true } }, +); diff --git a/cli/tests/testdata/event_listener_error_immediate_exit_worker.ts.out b/cli/tests/testdata/event_listener_error_immediate_exit_worker.ts.out new file mode 100644 index 0000000000..8bd3122980 --- /dev/null +++ b/cli/tests/testdata/event_listener_error_immediate_exit_worker.ts.out @@ -0,0 +1,8 @@ +1 +error: Uncaught (in worker "") Error: bar + throw new Error("bar"); + ^ + at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9 + at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1 +error: Uncaught (in promise) Error: Unhandled error in child worker. + at [WILDCARD] diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index 9f120539ce..23281ad68d 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -557,6 +557,8 @@ impl WebWorker { let id = self.preload_module(module_specifier, false).await?; let mut receiver = self.js_runtime.mod_evaluate(id); tokio::select! { + biased; + maybe_result = &mut receiver => { debug!("received module evaluate {:#?}", maybe_result); maybe_result.expect("Module evaluation result not provided.") @@ -579,6 +581,8 @@ impl WebWorker { ) -> Result<(), AnyError> { let mut receiver = self.js_runtime.mod_evaluate(id); tokio::select! { + biased; + maybe_result = &mut receiver => { debug!("received worker module evaluate {:#?}", maybe_result); // If `None` is returned it means that runtime was destroyed before diff --git a/runtime/worker.rs b/runtime/worker.rs index 23fe8e4c0d..7165b04f07 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -304,6 +304,7 @@ impl MainWorker { ) -> T { loop { tokio::select! { + biased; result = &mut fut => { return result; }