diff options
Diffstat (limited to 'cli/ops')
-rw-r--r-- | cli/ops/worker_host.rs | 34 |
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"); |