mirror of
https://github.com/denoland/deno.git
synced 2025-08-03 18:38:33 +00:00
fix(cli/worker): Print error stacks from the origin Worker (#7987)
Fixes #4728
This commit is contained in:
parent
57e95032c8
commit
7aba07cc77
12 changed files with 172 additions and 46 deletions
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue