diff --git a/patches/node/.patches b/patches/node/.patches index e4aa5d754824d..bd935562fa361 100644 --- a/patches/node/.patches +++ b/patches/node/.patches @@ -38,3 +38,4 @@ lib_fix_broadcastchannel_initialization_location.patch fix_adapt_debugger_tests_for_upstream_v8_changes.patch fix_do_not_resolve_electron_entrypoints.patch dns_expose_getdefaultresultorder.patch +fix_assert_module_in_the_renderer_process.patch diff --git a/patches/node/fix_assert_module_in_the_renderer_process.patch b/patches/node/fix_assert_module_in_the_renderer_process.patch new file mode 100644 index 0000000000000..275e1f8021c03 --- /dev/null +++ b/patches/node/fix_assert_module_in_the_renderer_process.patch @@ -0,0 +1,75 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Shelley Vohr +Date: Wed, 16 Aug 2023 19:15:29 +0200 +Subject: fix: assert module in the renderer process + +When creating a Node.js Environment, embedders have the option to disable Node.js' +default overriding of Error.prepareStackTrace. However, the assert module depends on +a WeakMap that is populated with the error stacktraces in the overridden function. + +This adds handling to fall back to the default implementation if Error.prepareStackTrace +if the override has been disabled. + +This will be upstreamed. + +diff --git a/lib/assert.js b/lib/assert.js +index 82c3a285f51abd1d517e7930887492652628e8c6..f68f22a4737ce395d3ee8a375513cb24ed1e8d2d 100644 +--- a/lib/assert.js ++++ b/lib/assert.js +@@ -66,6 +66,7 @@ const { inspect } = require('internal/util/inspect'); + const { isPromise, isRegExp } = require('internal/util/types'); + const { EOL } = require('internal/constants'); + const { BuiltinModule } = require('internal/bootstrap/loaders'); ++const { getEmbedderOptions } = require('internal/options'); + const { isError } = require('internal/util'); + + const errorCache = new SafeMap(); +@@ -289,8 +290,16 @@ function getErrMessage(message, fn) { + ErrorCaptureStackTrace(err, fn); + if (errorStackTraceLimitIsWritable) Error.stackTraceLimit = tmpLimit; + +- overrideStackTrace.set(err, (_, stack) => stack); +- const call = err.stack[0]; ++ let call; ++ if (getEmbedderOptions().hasPrepareStackTraceCallback) { ++ overrideStackTrace.set(err, (_, stack) => stack); ++ call = err.stack[0]; ++ } else { ++ const tmpPrepare = Error.prepareStackTrace; ++ Error.prepareStackTrace = (_, stack) => stack; ++ call = err.stack[0]; ++ Error.prepareStackTrace = tmpPrepare; ++ } + + const filename = call.getFileName(); + const line = call.getLineNumber() - 1; +diff --git a/src/api/environment.cc b/src/api/environment.cc +index d6c6fd9c257cb51ba387c4b4d07a24ff80f9f060..d1c457424eedd3ee6cfdd60fac4edaf91246e98e 100644 +--- a/src/api/environment.cc ++++ b/src/api/environment.cc +@@ -262,6 +262,9 @@ void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s) { + auto* prepare_stack_trace_cb = s.prepare_stack_trace_callback ? + s.prepare_stack_trace_callback : PrepareStackTraceCallback; + isolate->SetPrepareStackTraceCallback(prepare_stack_trace_cb); ++ } else { ++ auto env = Environment::GetCurrent(isolate); ++ env->set_prepare_stack_trace_callback(Local()); + } + } + +diff --git a/src/node_options.cc b/src/node_options.cc +index bc3c58b0ce8666f978de39ef57832b077bb181a3..22a7b8ca7a2c1832c44a7005a52d652f3544960a 100644 +--- a/src/node_options.cc ++++ b/src/node_options.cc +@@ -1206,6 +1206,11 @@ void GetEmbedderOptions(const FunctionCallbackInfo& args) { + Local context = env->context(); + Local ret = Object::New(isolate); + ++ if (ret->Set(context, ++ FIXED_ONE_BYTE_STRING(env->isolate(), "hasPrepareStackTraceCallback"), ++ Boolean::New(isolate, !env->prepare_stack_trace_callback().IsEmpty())) ++ .IsNothing()) return; ++ + if (ret->Set(context, + FIXED_ONE_BYTE_STRING(env->isolate(), "shouldNotRegisterESMLoader"), + Boolean::New(isolate, env->should_not_register_esm_loader()))