summaryrefslogtreecommitdiff
path: root/cli/ops
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops')
-rw-r--r--cli/ops/worker_host.rs34
1 files changed, 33 insertions, 1 deletions
diff --git a/cli/ops/worker_host.rs b/cli/ops/worker_host.rs
index ad915f7f7..4c344e78d 100644
--- a/cli/ops/worker_host.rs
+++ b/cli/ops/worker_host.rs
@@ -1,5 +1,6 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+use crate::colors;
use crate::fmt_errors::JsError;
use crate::ops::io::get_stdio;
use crate::permissions::Permissions;
@@ -8,7 +9,9 @@ use crate::tokio_util::create_basic_runtime;
use crate::worker::WebWorker;
use crate::worker::WebWorkerHandle;
use crate::worker::WorkerEvent;
+use deno_core::error::generic_error;
use deno_core::error::AnyError;
+use deno_core::futures::channel::mpsc;
use deno_core::futures::future::FutureExt;
use deno_core::serde_json;
use deno_core::serde_json::json;
@@ -25,7 +28,15 @@ use std::rc::Rc;
use std::sync::Arc;
use std::thread::JoinHandle;
-pub fn init(rt: &mut deno_core::JsRuntime) {
+#[derive(Deserialize)]
+struct HostUnhandledErrorArgs {
+ message: String,
+}
+
+pub fn init(
+ rt: &mut deno_core::JsRuntime,
+ sender: Option<mpsc::Sender<WorkerEvent>>,
+) {
{
let op_state = rt.op_state();
let mut state = op_state.borrow_mut();
@@ -40,6 +51,21 @@ pub fn init(rt: &mut deno_core::JsRuntime) {
);
super::reg_json_sync(rt, "op_host_post_message", op_host_post_message);
super::reg_json_async(rt, "op_host_get_message", op_host_get_message);
+ super::reg_json_sync(
+ rt,
+ "op_host_unhandled_error",
+ move |_state, args, _zero_copy| {
+ if let Some(mut sender) = sender.clone() {
+ let args: HostUnhandledErrorArgs = serde_json::from_value(args)?;
+ sender
+ .try_send(WorkerEvent::Error(generic_error(args.message)))
+ .expect("Failed to propagate error event to parent worker");
+ Ok(json!(true))
+ } else {
+ Err(generic_error("Cannot be called from main worker."))
+ }
+ },
+ );
}
pub type WorkersTable = HashMap<u32, (JoinHandle<()>, WebWorkerHandle)>;
@@ -162,6 +188,12 @@ fn run_worker_thread(
}
if let Err(e) = result {
+ eprintln!(
+ "{}: Uncaught (in worker \"{}\") {}",
+ colors::red_bold("error"),
+ name,
+ e.to_string().trim_start_matches("Uncaught "),
+ );
sender
.try_send(WorkerEvent::TerminalError(e))
.expect("Failed to post message to host");