fix(cli/worker): Print error stacks from the origin Worker (#7987)

Fixes #4728
This commit is contained in:
Nayeem Rahman 2020-10-20 05:05:42 +01:00 committed by GitHub
parent 57e95032c8
commit 7aba07cc77
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 172 additions and 46 deletions

View file

@ -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");