Browse Source

fix: assert module in the renderer process (#39622)

* fix: assert module in the renderer process

Co-authored-by: Shelley Vohr <[email protected]>

* chore: update patches after trop

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <[email protected]>
Co-authored-by: John Kleinschmidt <[email protected]>
trop[bot] 1 year ago
parent
commit
84d7f7f071

+ 1 - 0
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

+ 75 - 0
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 <[email protected]>
+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<Function>());
+   }
+ }
+ 
+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<Value>& args) {
+   Local<Context> context = env->context();
+   Local<Object> 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()))