Browse Source

chore: upgrade to Node.js v14.9.0 (#25249)

Shelley Vohr 4 years ago
parent
commit
77038b7bda
66 changed files with 735 additions and 1354 deletions
  1. 1 1
      DEPS
  2. 24 25
      docs/api/remote.md
  3. 9 1
      lib/browser/api/net.ts
  4. 2 1
      lib/browser/init.ts
  5. 1 1
      lib/browser/remote/server.ts
  6. 1 1
      npm/package.json
  7. 2 2
      package.json
  8. 3 15
      patches/node/.patches
  9. 0 22
      patches/node/avoid_calling_deprecated_method.patch
  10. 25 37
      patches/node/build_add_gn_build_files.patch
  11. 2 2
      patches/node/build_bring_back_node_with_ltcg_configuration.patch
  12. 2 2
      patches/node/build_modify_js2c_py_to_allow_injection_of_original-fs_and_custom_embedder_js.patch
  13. 2 2
      patches/node/call_process_log_from_fallback_stream_on_windows.patch
  14. 18 12
      patches/node/chore_prevent_warn_non_context-aware_native_modules_being_loaded.patch
  15. 1 1
      patches/node/chore_read_nobrowserglobals_from_global_not_process.patch
  16. 0 145
      patches/node/chore_sethostcleanupfinalizationgroupcallback_has_been_removed_from.patch
  17. 0 64
      patches/node/darwin_work_around_clock_jumping_back_in_time.patch
  18. 12 26
      patches/node/enable_31_bit_smis_on_64bit_arch_and_ptr_compression.patch
  19. 2 2
      patches/node/expose_get_builtin_module_function.patch
  20. 7 7
      patches/node/feat_add_flags_for_low-level_hooks_and_exceptions.patch
  21. 4 4
      patches/node/feat_add_implementation_of_v8_platform_postjob.patch
  22. 6 6
      patches/node/feat_add_uv_loop_watcher_queue_code.patch
  23. 3 3
      patches/node/feat_initialize_asar_support.patch
  24. 24 0
      patches/node/fix_-wincompatible-pointer-types-discards-qualifiers_error.patch
  25. 4 4
      patches/node/fix_add_default_values_for_enable_lto_and_build_v8_with_gn_in.patch
  26. 82 0
      patches/node/fix_allow_preventing_initializeinspector_in_env.patch
  27. 0 50
      patches/node/fix_allow_preventing_setpromiserejectcallback.patch
  28. 6 6
      patches/node/fix_build_and_expose_inspector_agent.patch
  29. 20 9
      patches/node/fix_comment_out_incompatible_crypto_modules.patch
  30. 0 29
      patches/node/fix_do_not_register_the_esm_loader_in_renderer_processes.patch
  31. 0 27
      patches/node/fix_enable_tls_renegotiation.patch
  32. 2 2
      patches/node/fix_expose_internalcallbackscope.patch
  33. 11 11
      patches/node/fix_expose_tracing_agent_and_use_tracing_tracingcontroller_instead.patch
  34. 10 10
      patches/node/fix_key_gen_apis_are_not_available_in_boringssl.patch
  35. 2 2
      patches/node/fix_use_crypto_impls_for_compat.patch
  36. 2 2
      patches/node/fixme_comment_trace_event_macro.patch
  37. 2 2
      patches/node/fixme_remove_async_id_assertion_check.patch
  38. 0 234
      patches/node/lib_src_switch_buffer_kmaxlength_to_size_t.patch
  39. 0 30
      patches/node/lib_use_non-symbols_in_isurlinstance_check.patch
  40. 2 2
      patches/node/make_module_globalpaths_a_reference.patch
  41. 274 179
      patches/node/n-api_src_provide_asynchronous_cleanup_hooks.patch
  42. 0 23
      patches/node/override_existing_v8_reallocate.patch
  43. 6 6
      patches/node/pass_all_globals_through_require.patch
  44. 17 17
      patches/node/refactor_allow_embedder_overriding_of_internal_fs_calls.patch
  45. 2 2
      patches/node/refactor_alter_child_process_fork_to_use_execute_script_with.patch
  46. 0 79
      patches/node/refactor_transferrablemodule_is_deprecated_use_compiledwasmmodule.patch
  47. 0 28
      patches/node/remove_deprecated_task_api_override_removed_in_latest_v8.patch
  48. 0 36
      patches/node/remove_deprecated_wasm_module_type_check.patch
  49. 0 34
      patches/node/remove_serialization_deserialization_of_wasmmoduleobject.patch
  50. 2 2
      patches/node/revert_crypto_add_oaeplabel_option.patch
  51. 80 0
      patches/node/test_make_some_tests_embedder_agnostic.patch
  52. 0 48
      patches/node/weakrefs_rename_finalizationgroup_to_finalizationregistry_for_js.patch
  53. 0 33
      patches/node/weakrefs_split_out_finalizationregistry_cleanupsome.patch
  54. 1 1
      script/gen-filenames.ts
  55. 1 0
      script/node-disabled-tests.json
  56. 9 9
      shell/app/node_main.cc
  57. 0 2
      shell/browser/javascript_environment.cc
  58. 14 22
      shell/common/node_bindings.cc
  59. 2 0
      shell/common/node_includes.h
  60. 0 1
      shell/renderer/electron_renderer_client.cc
  61. 1 1
      spec-main/api-context-bridge-spec.ts
  62. 6 6
      spec-main/api-ipc-spec.ts
  63. 8 2
      spec-main/api-remote-spec.ts
  64. 5 7
      spec/ts-smoke/electron/main.ts
  65. 5 6
      spec/ts-smoke/electron/renderer.ts
  66. 8 8
      yarn.lock

+ 1 - 1
DEPS

@@ -16,7 +16,7 @@ vars = {
   'chromium_version':
     'b04584161e07d4ac110045b7647fa8a81f5f0709',
   'node_version':
-    'v12.18.3',
+    'v14.9.0',
   'nan_version':
     '2c4ee8a32a299eada3cd6e468bbd0a473bfea96d',
   'squirrel.mac_version':

+ 24 - 25
docs/api/remote.md

@@ -150,11 +150,32 @@ console.log(app)
 
 The `remote` module has the following methods:
 
-### `remote.require(module)`
+### `remote.getCurrentWindow()`
+
+Returns [`BrowserWindow`](browser-window.md) - The window to which this web page
+belongs.
+
+**Note:** Do not use `removeAllListeners` on [`BrowserWindow`](browser-window.md).
+Use of this can remove all [`blur`](https://developer.mozilla.org/en-US/docs/Web/Events/blur)
+listeners, disable click events on touch bar buttons, and other unintended
+consequences.
+
+### `remote.getCurrentWebContents()`
+
+Returns [`WebContents`](web-contents.md) - The web contents of this web page.
+
+### `remote.getGlobal(name)`
+
+* `name` String
+
+Returns `any` - The global variable of `name` (e.g. `global[name]`) in the main
+process.
+
+## Properties
 
-* `module` String
+### `remote.require`
 
-Returns `any` - The object returned by `require(module)` in the main process.
+A `NodeJS.Require` function equivalent to `require(module)` in the main process.
 Modules specified by their relative path will resolve relative to the entrypoint
 of the main process.
 
@@ -186,28 +207,6 @@ module.exports = 'bar'
 const foo = require('electron').remote.require('./foo') // bar
 ```
 
-### `remote.getCurrentWindow()`
-
-Returns [`BrowserWindow`](browser-window.md) - The window to which this web page
-belongs.
-
-**Note:** Do not use `removeAllListeners` on [`BrowserWindow`](browser-window.md).
-Use of this can remove all [`blur`](https://developer.mozilla.org/en-US/docs/Web/Events/blur)
-listeners, disable click events on touch bar buttons, and other unintended
-consequences.
-
-### `remote.getCurrentWebContents()`
-
-Returns [`WebContents`](web-contents.md) - The web contents of this web page.
-
-### `remote.getGlobal(name)`
-
-* `name` String
-
-Returns `any` - The global variable of `name` (e.g. `global[name]`) in the main
-process.
-
-## Properties
 
 ### `remote.process` _Readonly_
 

+ 9 - 1
lib/browser/api/net.ts

@@ -362,7 +362,7 @@ export class ClientRequest extends Writable implements Electron.ClientRequest {
     delete this._urlLoaderOptions.extraHeaders[key];
   }
 
-  _write (chunk: Buffer, encoding: string, callback: () => void) {
+  _write (chunk: Buffer, encoding: BufferEncoding, callback: () => void) {
     this._firstWrite = true;
     if (!this._body) {
       this._body = new SlurpStream();
@@ -481,6 +481,14 @@ export class ClientRequest extends Writable implements Electron.ClientRequest {
   }
 
   _die (err?: Error) {
+    // Node.js assumes that any stream which is ended is no longer capable of emitted events
+    // which is a faulty assumption for the case of an object that is acting like a stream
+    // (our urlRequest). If we don't emit here, this causes errors since we *do* expect
+    // that error events can be emitted after urlRequest.end().
+    if ((this as any)._writableState.destroyed && err) {
+      this.emit('error', err);
+    }
+
     this.destroy(err);
     if (this._urlLoader) {
       this._urlLoader.cancel();

+ 2 - 1
lib/browser/init.ts

@@ -4,6 +4,7 @@ import * as fs from 'fs';
 import { Socket } from 'net';
 import * as path from 'path';
 import * as util from 'util';
+
 const Module = require('module');
 
 // We modified the original process.argv to let node.js load the init.js,
@@ -62,7 +63,7 @@ process.on('uncaughtException', function (error) {
 // Emit 'exit' event on quit.
 const { app } = require('electron');
 
-app.on('quit', function (event, exitCode) {
+app.on('quit', (_event, exitCode) => {
   process.emit('exit', exitCode);
 });
 

+ 1 - 1
lib/browser/remote/server.ts

@@ -353,7 +353,7 @@ handleRemoteCommand('ELECTRON_BROWSER_REQUIRE', function (event, contextId, modu
     if (customEvent.defaultPrevented) {
       throw new Error(`Blocked remote.require('${moduleName}')`);
     } else {
-      customEvent.returnValue = process.mainModule!.require(moduleName);
+      customEvent.returnValue = (process as any).mainModule.require(moduleName);
     }
   }
 

+ 1 - 1
npm/package.json

@@ -9,7 +9,7 @@
   },
   "dependencies": {
     "@electron/get": "^1.0.1",
-    "@types/node": "^12.0.12",
+    "@types/node": "^14.6.2",
     "extract-zip": "^1.0.3"
   },
   "engines": {

+ 2 - 2
package.json

@@ -5,7 +5,7 @@
   "description": "Build cross platform desktop apps with JavaScript, HTML, and CSS",
   "devDependencies": {
     "@electron/docs-parser": "^0.9.1",
-    "@electron/typescript-definitions": "^8.7.8",
+    "@electron/typescript-definitions": "^8.7.9",
     "@octokit/rest": "^18.0.3",
     "@primer/octicons": "^10.0.0",
     "@types/basic-auth": "^1.1.3",
@@ -16,7 +16,7 @@
     "@types/express": "^4.17.7",
     "@types/fs-extra": "^9.0.1",
     "@types/mocha": "^7.0.2",
-    "@types/node": "^12.12.6",
+    "@types/node": "^14.6.2",
     "@types/semver": "^7.3.3",
     "@types/send": "^0.14.5",
     "@types/split": "^1.0.0",

+ 3 - 15
patches/node/.patches

@@ -22,26 +22,14 @@ chore_prevent_warn_non_context-aware_native_modules_being_loaded.patch
 chore_read_nobrowserglobals_from_global_not_process.patch
 build_bring_back_node_with_ltcg_configuration.patch
 revert_crypto_add_oaeplabel_option.patch
-refactor_transferrablemodule_is_deprecated_use_compiledwasmmodule.patch
 enable_31_bit_smis_on_64bit_arch_and_ptr_compression.patch
-remove_deprecated_task_api_override_removed_in_latest_v8.patch
-remove_serialization_deserialization_of_wasmmoduleobject.patch
-override_existing_v8_reallocate.patch
 fix_use_crypto_impls_for_compat.patch
-avoid_calling_deprecated_method.patch
-remove_deprecated_wasm_module_type_check.patch
-weakrefs_rename_finalizationgroup_to_finalizationregistry_for_js.patch
-weakrefs_split_out_finalizationregistry_cleanupsome.patch
 fix_window_c-ares_incompatibilities.patch
-chore_sethostcleanupfinalizationgroupcallback_has_been_removed_from.patch
 fix_comment_out_incompatible_crypto_modules.patch
-lib_src_switch_buffer_kmaxlength_to_size_t.patch
 update_tests_after_increasing_typed_array_size.patch
-darwin_work_around_clock_jumping_back_in_time.patch
-fix_do_not_register_the_esm_loader_in_renderer_processes.patch
-fix_allow_preventing_setpromiserejectcallback.patch
-lib_use_non-symbols_in_isurlinstance_check.patch
 feat_add_implementation_of_v8_platform_postjob.patch
-fix_enable_tls_renegotiation.patch
 n-api_src_provide_asynchronous_cleanup_hooks.patch
 crypto_update_certdata_to_nss_3_56.patch
+fix_-wincompatible-pointer-types-discards-qualifiers_error.patch
+fix_allow_preventing_initializeinspector_in_env.patch
+test_make_some_tests_embedder_agnostic.patch

+ 0 - 22
patches/node/avoid_calling_deprecated_method.patch

@@ -1,22 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Samuel Attard <[email protected]>
-Date: Thu, 13 Feb 2020 10:34:31 -0800
-Subject: Avoid calling deprecated method
-
-The {SetExpectInlineWasm} method is deprecated and non-functional since
-V8 v8.1.
-
-This is already present in Node.js v14 and can be removed when we upgrade.
-
-diff --git a/src/node_serdes.cc b/src/node_serdes.cc
-index bcdcd19b261e8815e3c0c0f150f2eda72ef47cf5..86fb822dd5bfa9da7767418e6c6f206f8e96ca73 100644
---- a/src/node_serdes.cc
-+++ b/src/node_serdes.cc
-@@ -286,7 +286,6 @@ DeserializerContext::DeserializerContext(Environment* env,
-     length_(Buffer::Length(buffer)),
-     deserializer_(env->isolate(), data_, length_, this) {
-   object()->Set(env->context(), env->buffer_string(), buffer).Check();
--  deserializer_.SetExpectInlineWasm(true);
- 
-   MakeWeak();
- }

+ 25 - 37
patches/node/build_add_gn_build_files.patch

@@ -7,10 +7,10 @@ This adds GN build files for Node, so we don't have to build with GYP.
 
 diff --git a/BUILD.gn b/BUILD.gn
 new file mode 100644
-index 0000000000000000000000000000000000000000..99192976f2bdfd900240aa58b8989fe2c9d8c771
+index 0000000000000000000000000000000000000000..446119163d1f7bad577cb0b7b217ecf24b994526
 --- /dev/null
 +++ b/BUILD.gn
-@@ -0,0 +1,361 @@
+@@ -0,0 +1,360 @@
 +import("//electron/build/asar.gni")
 +import("//v8/gni/v8.gni")
 +
@@ -205,7 +205,6 @@ index 0000000000000000000000000000000000000000..99192976f2bdfd900240aa58b8989fe2
 +    ":node_js2c",
 +    "deps/cares",
 +    "deps/histogram",
-+    "deps/http_parser",
 +    "deps/llhttp",
 +    "deps/nghttp2",
 +    "deps/uvwasi",
@@ -532,25 +531,6 @@ index 0000000000000000000000000000000000000000..e741a2a9c238a782a674ddcb9a1f98de
 +    "src/hdr_histogram.h",
 +  ]
 +}
-diff --git a/deps/http_parser/BUILD.gn b/deps/http_parser/BUILD.gn
-new file mode 100644
-index 0000000000000000000000000000000000000000..da9e2b42dccacc1ed9b00202c1ff73ebc60d0e8a
---- /dev/null
-+++ b/deps/http_parser/BUILD.gn
-@@ -0,0 +1,13 @@
-+config("http_parser_config") {
-+  defines = [ "HTTP_PARSER_STRICT=0" ]
-+  include_dirs = [ "." ]
-+}
-+
-+static_library("http_parser") {
-+  include_dirs = [ "." ]
-+  public_configs = [ ":http_parser_config" ]
-+  cflags_c = [ "-Wno-string-conversion" ]
-+  sources = [
-+    "http_parser.c",
-+  ]
-+}
 diff --git a/deps/llhttp/BUILD.gn b/deps/llhttp/BUILD.gn
 new file mode 100644
 index 0000000000000000000000000000000000000000..ce15bc57093caa1bd84ea77e7438e892fb916427
@@ -625,7 +605,7 @@ index 0000000000000000000000000000000000000000..66af819990b338caa49ca59d1fe6c5ad
 +}
 diff --git a/deps/uv/BUILD.gn b/deps/uv/BUILD.gn
 new file mode 100644
-index 0000000000000000000000000000000000000000..67116f2070bb9200aace81afdf0b1e7a6e4fd0c0
+index 0000000000000000000000000000000000000000..565819942513be6b7e9d7ad21c8531ad51a8d557
 --- /dev/null
 +++ b/deps/uv/BUILD.gn
 @@ -0,0 +1,191 @@
@@ -664,6 +644,7 @@ index 0000000000000000000000000000000000000000..67116f2070bb9200aace81afdf0b1e7a
 +  defines += [ "BUILDING_UV_SHARED=1" ]
 +
 +  cflags_c = [
++    "-Wno-incompatible-pointer-types",
 +    "-Wno-bitwise-op-parentheses",
 +    "-Wno-implicit-function-declaration",
 +    "-Wno-missing-braces",
@@ -806,7 +787,6 @@ index 0000000000000000000000000000000000000000..67116f2070bb9200aace81afdf0b1e7a
 +      "src/unix/procfs-exepath.c",
 +      "src/unix/random-getrandom.c",
 +      "src/unix/random-sysctl-linux.c",
-+      "src/unix/sysinfo-loadavg.c",
 +    ]
 +    libs += [
 +      "dl",
@@ -866,10 +846,10 @@ index 0000000000000000000000000000000000000000..2c9d2826c85bdd033f1df1d6188df636
 +}
 diff --git a/filenames.json b/filenames.json
 new file mode 100644
-index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a56f4d6751
+index 0000000000000000000000000000000000000000..b09510a6048f6cff3905240e3c969f143a382047
 --- /dev/null
 +++ b/filenames.json
-@@ -0,0 +1,519 @@
+@@ -0,0 +1,527 @@
 +// This file is automatically generated by generate_gn_filenames_json.py
 +// DO NOT EDIT
 +{
@@ -892,6 +872,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +        "//v8/include/cppgc/allocation.h",
 +        "//v8/include/cppgc/common.h",
 +        "//v8/include/cppgc/custom-space.h",
++        "//v8/include/cppgc/default-platform.h",
 +        "//v8/include/cppgc/garbage-collected.h",
 +        "//v8/include/cppgc/heap.h",
 +        "//v8/include/cppgc/liveness-broker.h",
@@ -929,6 +910,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +        "//v8/include/v8-cppgc.h",
 +        "//v8/include/v8-fast-api-calls.h",
 +        "//v8/include/v8-internal.h",
++        "//v8/include/v8-metrics.h",
 +        "//v8/include/v8-platform.h",
 +        "//v8/include/v8-profiler.h",
 +        "//v8/include/v8-util.h",
@@ -1001,6 +983,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "lib/domain.js",
 +    "lib/events.js",
 +    "lib/fs.js",
++    "lib/fs/promises.js",
 +    "lib/http.js",
 +    "lib/http2.js",
 +    "lib/_http_agent.js",
@@ -1045,6 +1028,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "lib/zlib.js",
 +    "lib/internal/assert.js",
 +    "lib/internal/assert/assertion_error.js",
++    "lib/internal/assert/calltracker.js",
 +    "lib/internal/async_hooks.js",
 +    "lib/internal/buffer.js",
 +    "lib/internal/cli_table.js",
@@ -1076,7 +1060,8 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "lib/internal/dtrace.js",
 +    "lib/internal/encoding.js",
 +    "lib/internal/errors.js",
-+    "lib/internal/error-serdes.js",
++    "lib/internal/error_serdes.js",
++    "lib/internal/event_target.js",
 +    "lib/internal/fixed_queue.js",
 +    "lib/internal/freelist.js",
 +    "lib/internal/freeze_intrinsics.js",
@@ -1151,6 +1136,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "lib/internal/url.js",
 +    "lib/internal/util.js",
 +    "lib/internal/util/comparisons.js",
++    "lib/internal/util/compositekey.js",
 +    "lib/internal/util/debuglog.js",
 +    "lib/internal/util/inspect.js",
 +    "lib/internal/util/inspector.js",
@@ -1165,6 +1151,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "lib/internal/vm/module.js",
 +    "lib/internal/worker.js",
 +    "lib/internal/worker/io.js",
++    "lib/internal/worker/js_transferable.js",
 +    "lib/internal/watchdog.js",
 +    "lib/internal/streams/lazy_transform.js",
 +    "lib/internal/streams/async_iterator.js",
@@ -1223,6 +1210,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/js_native_api_v8_internals.h",
 +    "src/js_stream.cc",
 +    "src/json_utils.cc",
++    "src/js_udp_wrap.cc",
 +    "src/module_wrap.cc",
 +    "src/node.cc",
 +    "src/node_api.cc",
@@ -1236,8 +1224,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/node_env_var.cc",
 +    "src/node_errors.cc",
 +    "src/node_file.cc",
-+    "src/node_http_parser_llhttp.cc",
-+    "src/node_http_parser_traditional.cc",
++    "src/node_http_parser.cc",
 +    "src/node_http2.cc",
 +    "src/node_i18n.cc",
 +    "src/node_main_instance.cc",
@@ -1272,7 +1259,6 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/node_zlib.cc",
 +    "src/pipe_wrap.cc",
 +    "src/process_wrap.cc",
-+    "src/sharedarraybuffer_metadata.cc",
 +    "src/signal_wrap.cc",
 +    "src/spawn_sync.cc",
 +    "src/stream_base.cc",
@@ -1292,6 +1278,10 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/util.cc",
 +    "src/uv.cc",
 +    "src/aliased_buffer.h",
++    "src/aliased_struct.h",
++    "src/aliased_struct-inl.h",
++    "src/allocated_buffer.h",
++    "src/allocated_buffer-inl.h",
 +    "src/async_wrap.h",
 +    "src/async_wrap-inl.h",
 +    "src/base_object.h",
@@ -1308,7 +1298,6 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/handle_wrap.h",
 +    "src/histogram.h",
 +    "src/histogram-inl.h",
-+    "src/http_parser_adaptor.h",
 +    "src/js_stream.h",
 +    "src/json_utils.h",
 +    "src/large_pages/node_large_page.cc",
@@ -1328,7 +1317,8 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/node_errors.h",
 +    "src/node_file.h",
 +    "src/node_file-inl.h",
-+    "src/node_http_parser_impl.h",
++    "src/node_http_common.h",
++    "src/node_http_common-inl.h",
 +    "src/node_http2.h",
 +    "src/node_http2_state.h",
 +    "src/node_i18n.h",
@@ -1364,7 +1354,6 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/pipe_wrap.h",
 +    "src/req_wrap.h",
 +    "src/req_wrap-inl.h",
-+    "src/sharedarraybuffer_metadata.h",
 +    "src/spawn_sync.h",
 +    "src/stream_base.h",
 +    "src/stream_base-inl.h",
@@ -1385,8 +1374,7 @@ index 0000000000000000000000000000000000000000..2e07ea28437ee25ddaea4d730e1a65a5
 +    "src/udp_wrap.h",
 +    "src/util.h",
 +    "src/util-inl.h",
-+    "deps/http_parser/http_parser.h",
-+    "deps/v8/include/v8.h"
++    "//v8/include/v8.h"
 +  ]
 +}
 diff --git a/src/inspector/BUILD.gn b/src/inspector/BUILD.gn
@@ -1595,7 +1583,7 @@ index 0000000000000000000000000000000000000000..f3c5c798c0aefcb8cf9b1570a7b4817c
 +  args = rebase_path(inputs + outputs, root_build_dir)
 +}
 diff --git a/src/node_version.h b/src/node_version.h
-index 9252d51555f0e1bf0957bc4f8bc6e399c1ac6c23..431dd57a7dddc7476a179a5f30ce9e66814006ec 100644
+index 49e4e9d16f8732641248fd3ab15be1a74d9fd45f..35f90fcae715c5421c672a9397a8e25d93f80cd6 100644
 --- a/src/node_version.h
 +++ b/src/node_version.h
 @@ -89,7 +89,10 @@
@@ -1604,7 +1592,7 @@ index 9252d51555f0e1bf0957bc4f8bc6e399c1ac6c23..431dd57a7dddc7476a179a5f30ce9e66
   */
 +// Electron sets NODE_MODULE_VERSION in their GN configuration
 +#ifndef NODE_MODULE_VERSION
- #define NODE_MODULE_VERSION 72
+ #define NODE_MODULE_VERSION 83
 +#endif
  
  // The NAPI_VERSION provided by this version of the runtime. This is the version

+ 2 - 2
patches/node/build_bring_back_node_with_ltcg_configuration.patch

@@ -10,7 +10,7 @@ THe fix for this should land in node-gyp as discussed in above issue,
 landing this as temporary patch.
 
 diff --git a/common.gypi b/common.gypi
-index df69aecc74ef66b9501d4bed0e1311e7cda2d5b8..dfcf529cd501dc890c05425fcf9a33414a45f1a5 100644
+index 2fda2d685edc6b8f45441cda017f7cabfe60d91f..bd42d6cfa6006630d316faf2cddd93bea57102ba 100644
 --- a/common.gypi
 +++ b/common.gypi
 @@ -19,7 +19,7 @@
@@ -22,7 +22,7 @@ index df69aecc74ef66b9501d4bed0e1311e7cda2d5b8..dfcf529cd501dc890c05425fcf9a3341
      'node_shared_openssl%': 'false',
  
      'node_tag%': '',
-@@ -239,6 +239,26 @@
+@@ -215,6 +215,26 @@
              'cflags': [ '-fPIC' ],
              'ldflags': [ '-fPIC' ]
            }],

+ 2 - 2
patches/node/build_modify_js2c_py_to_allow_injection_of_original-fs_and_custom_embedder_js.patch

@@ -14,7 +14,7 @@ renderer/browser/worker/sandboxed bootstrap scripts).  These are loaded
 through LoadEmbedderJavaScriptSource()
 
 diff --git a/src/node_native_module.cc b/src/node_native_module.cc
-index 7362207412efa49bddfab4e32a64c7e07cf29074..acd9afa62d3aa1b01ce54f189a7261e7e61aa60d 100644
+index 74729c412674be2cbf01d68be1bc496b06b8ce1e..7311f249fbb24e0612d9f4f174e96fa13ed77acb 100644
 --- a/src/node_native_module.cc
 +++ b/src/node_native_module.cc
 @@ -20,6 +20,7 @@ NativeModuleLoader NativeModuleLoader::instance_;
@@ -26,7 +26,7 @@ index 7362207412efa49bddfab4e32a64c7e07cf29074..acd9afa62d3aa1b01ce54f189a7261e7
  
  NativeModuleLoader* NativeModuleLoader::GetInstance() {
 diff --git a/src/node_native_module.h b/src/node_native_module.h
-index c0bce3bce42c848d63a10147ef483c9d4465f5ce..7f296e459d46b4cda51baf9887df060f0372227d 100644
+index 3be3f2364dd252bcdd668c699a0e7ae1e754e873..b2af1bce312ffca44e7005e11f92327e7cb240f6 100644
 --- a/src/node_native_module.h
 +++ b/src/node_native_module.h
 @@ -44,6 +44,7 @@ class NativeModuleLoader {

+ 2 - 2
patches/node/call_process_log_from_fallback_stream_on_windows.patch

@@ -6,10 +6,10 @@ Subject: Call process.log from fallback stream on Windows
 (cherry picked from commit d31e629b4f2daf3500a485caab2b2990a41e3ad4)
 
 diff --git a/lib/internal/bootstrap/switches/is_main_thread.js b/lib/internal/bootstrap/switches/is_main_thread.js
-index ac8336fb6229e7f44eb00f43abb07bea83a9463c..2005e8ef9ebd090c1be19ff320f48b9cd365239e 100644
+index 08623898edafacfa8cee47ab35bd75887f9d3e2a..828589d4047ac49d16e9080ad1f364484941aa6e 100644
 --- a/lib/internal/bootstrap/switches/is_main_thread.js
 +++ b/lib/internal/bootstrap/switches/is_main_thread.js
-@@ -80,6 +80,11 @@ function createWritableStdioStream(fd) {
+@@ -85,6 +85,11 @@ function createWritableStdioStream(fd) {
        const { Writable } = require('stream');
        stream = new Writable({
          write(buf, enc, cb) {

+ 18 - 12
patches/node/chore_prevent_warn_non_context-aware_native_modules_being_loaded.patch

@@ -8,25 +8,31 @@ once we stop warning and begin to unilaterally prevent non-context aware modules
 from being loaded.
 
 diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js
-index 0a7c4a47c11eb4bb360b6a46fccb4692241bd2dc..b4a0f71af5853f427a10449b52509052fbe3facd 100644
+index f947c6bf27e80c534a8f72265d0139a8b5b3f13a..d7e56d9c3fe5a56897989915984cb823d27b9c52 100644
 --- a/lib/internal/bootstrap/pre_execution.js
 +++ b/lib/internal/bootstrap/pre_execution.js
-@@ -89,8 +89,10 @@ function patchProcessObject(expandArgv1) {
+@@ -92,10 +92,12 @@ function patchProcessObject(expandArgv1) {
  
    if (expandArgv1 && process.argv[1] && !process.argv[1].startsWith('-')) {
      // Expand process.argv[1] into a full path.
+-    const path = require('path');
+-    try {
+-      process.argv[1] = path.resolve(process.argv[1]);
+-    } catch {}
 +    if (!process.argv[1] || !process.argv[1].startsWith('electron/js2c')) {
-     const path = require('path');
-     process.argv[1] = path.resolve(process.argv[1]);
++      const path = require('path');
++      try {
++        process.argv[1] = path.resolve(process.argv[1]);
++      } catch {}
 +    }
    }
  
    // TODO(joyeecheung): most of these should be deprecated and removed,
 diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
-index 7d08fb05e9a0abeb82d416891968b23002dc3685..1f6f5e0cee36fb2a07963264f513a930c349b8fa 100644
+index c633daa2b3557c98b05cca5f428d87775ef8a02a..4846370adb5206c53d57deef303b2c3f02342d24 100644
 --- a/lib/internal/modules/cjs/loader.js
 +++ b/lib/internal/modules/cjs/loader.js
-@@ -1111,6 +1111,13 @@ Module.prototype._compile = function(content, filename) {
+@@ -1049,6 +1049,13 @@ Module.prototype._compile = function(content, filename) {
    if (getOptionValue('--inspect-brk') && process._eval == null) {
      if (!resolvedArgv) {
        // We enter the repl if we're not given a filename argument.
@@ -41,11 +47,11 @@ index 7d08fb05e9a0abeb82d416891968b23002dc3685..1f6f5e0cee36fb2a07963264f513a930
          try {
            resolvedArgv = Module._resolveFilename(process.argv[1], null, false);
 diff --git a/src/env.h b/src/env.h
-index d22b579b25ce4e6af8ec042e282e94248ea14162..67cefbe35f390ba25b49e422d10bca8b423a49a8 100644
+index bc222804010a035333cf6d7becc9a0a8f385af85..dea62b38cb20a0a0913128e17e8904c4ca71ac1a 100644
 --- a/src/env.h
 +++ b/src/env.h
-@@ -890,6 +890,15 @@ class Environment : public MemoryRetainer {
-               uint64_t thread_id = kNoThreadId);
+@@ -885,6 +885,15 @@ class Environment : public MemoryRetainer {
+               ThreadId thread_id);
    ~Environment() override;
  
 +  void ForceOnlyContextAwareNativeModules() {
@@ -57,10 +63,10 @@ index d22b579b25ce4e6af8ec042e282e94248ea14162..67cefbe35f390ba25b49e422d10bca8b
 +  bool force_context_aware() { return force_context_aware_; }
 +  bool warn_non_context_aware() { return warn_non_context_aware_; }
 +
-   void InitializeLibuv(bool start_profiler_idle_notifier);
+   void InitializeLibuv();
    inline const std::vector<std::string>& exec_argv();
    inline const std::vector<std::string>& argv();
-@@ -1271,6 +1280,9 @@ class Environment : public MemoryRetainer {
+@@ -1235,6 +1244,9 @@ class Environment : public MemoryRetainer {
    inline void ThrowError(v8::Local<v8::Value> (*fun)(v8::Local<v8::String>),
                           const char* errmsg);
  
@@ -71,7 +77,7 @@ index d22b579b25ce4e6af8ec042e282e94248ea14162..67cefbe35f390ba25b49e422d10bca8b
    v8::Isolate* const isolate_;
    IsolateData* const isolate_data_;
 diff --git a/src/node_binding.cc b/src/node_binding.cc
-index 5291858bb164a262ca1d69d2582e037aeab23d55..a9ce41fbba4e8b0c4704c1d7795308ce18916739 100644
+index 0ab18f7aeda3511338cbf115a4b636a6c72437b2..51ae4c89a61a176a9629e537f9409b38c3397aa2 100644
 --- a/src/node_binding.cc
 +++ b/src/node_binding.cc
 @@ -3,6 +3,7 @@

+ 1 - 1
patches/node/chore_read_nobrowserglobals_from_global_not_process.patch

@@ -7,7 +7,7 @@ This is used so that we can modify the flag at runtime where
 config can only be set at compile time.
 
 diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js
-index 4e7c3c10255a0eae4d5333f88e51cf7178163a44..a6e33757ca00771671583203c37d9b121abf489b 100644
+index e1f70addc28e4fe31d3a7089ecec3b5874dde75a..659145e31bbfb6ce782e8dcad452b59202df7573 100644
 --- a/lib/internal/bootstrap/node.js
 +++ b/lib/internal/bootstrap/node.js
 @@ -118,7 +118,7 @@ const {

+ 0 - 145
patches/node/chore_sethostcleanupfinalizationgroupcallback_has_been_removed_from.patch

@@ -1,145 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Samuel Attard <[email protected]>
-Date: Mon, 4 May 2020 16:57:05 -0700
-Subject: chore: SetHostCleanupFinalizationGroupCallback has been removed from
- V8
-
-diff --git a/src/api/environment.cc b/src/api/environment.cc
-index e2aa9c821de685a022fd78935399b7d219468403..2bfba8a011c2b902932e6b1714bbb55b945cd96d 100644
---- a/src/api/environment.cc
-+++ b/src/api/environment.cc
-@@ -12,7 +12,6 @@ using errors::TryCatchScope;
- using v8::Array;
- using v8::Context;
- using v8::EscapableHandleScope;
--using v8::FinalizationGroup;
- using v8::Function;
- using v8::FunctionCallbackInfo;
- using v8::HandleScope;
-@@ -72,15 +71,6 @@ static MaybeLocal<Value> PrepareStackTraceCallback(Local<Context> context,
-   return result;
- }
- 
--static void HostCleanupFinalizationGroupCallback(
--    Local<Context> context, Local<FinalizationGroup> group) {
--  Environment* env = Environment::GetCurrent(context);
--  if (env == nullptr) {
--    return;
--  }
--  env->RegisterFinalizationGroupForCleanup(group);
--}
--
- void* NodeArrayBufferAllocator::Allocate(size_t size) {
-   void* ret;
-   if (zero_fill_field_ || per_process::cli_options->zero_fill_all_buffers)
-@@ -249,11 +239,6 @@ void SetIsolateMiscHandlers(v8::Isolate* isolate, const IsolateSettings& s) {
-     s.promise_reject_callback : task_queue::PromiseRejectCallback;
-   isolate->SetPromiseRejectCallback(promise_reject_cb);
- 
--  auto* host_cleanup_cb = s.host_cleanup_finalization_group_callback ?
--    s.host_cleanup_finalization_group_callback :
--    HostCleanupFinalizationGroupCallback;
--  isolate->SetHostCleanupFinalizationGroupCallback(host_cleanup_cb);
--
-   if (s.flags & DETAILED_SOURCE_POSITIONS_FOR_PROFILING)
-     v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate);
- }
-diff --git a/src/env-inl.h b/src/env-inl.h
-index c6ef9dc13ab6f1d1a778871a62a0a98a01d84ec6..222555831aa1bf0b7b29b4b46e235c98a5dd4ac5 100644
---- a/src/env-inl.h
-+++ b/src/env-inl.h
-@@ -1123,12 +1123,6 @@ void Environment::RemoveCleanupHook(void (*fn)(void*), void* arg) {
-   cleanup_hooks_.erase(search);
- }
- 
--inline void Environment::RegisterFinalizationGroupForCleanup(
--    v8::Local<v8::FinalizationGroup> group) {
--  cleanup_finalization_groups_.emplace_back(isolate(), group);
--  uv_async_send(&task_queues_async_);
--}
--
- size_t CleanupHookCallback::Hash::operator()(
-     const CleanupHookCallback& cb) const {
-   return std::hash<void*>()(cb.arg_);
-diff --git a/src/env.cc b/src/env.cc
-index 18788e4ceaf208c13704c9c43f017bb1b6dfb0b6..ee76d5889e5672716ac2f0c586f1ddc47fa56be7 100644
---- a/src/env.cc
-+++ b/src/env.cc
-@@ -30,7 +30,6 @@ using v8::ArrayBuffer;
- using v8::Boolean;
- using v8::Context;
- using v8::EmbedderGraph;
--using v8::FinalizationGroup;
- using v8::Function;
- using v8::FunctionTemplate;
- using v8::HandleScope;
-@@ -487,7 +486,6 @@ void Environment::InitializeLibuv(bool start_profiler_idle_notifier) {
-       [](uv_async_t* async) {
-         Environment* env = ContainerOf(
-             &Environment::task_queues_async_, async);
--        env->CleanupFinalizationGroups();
-         env->RunAndClearNativeImmediates();
-       });
-   uv_unref(reinterpret_cast<uv_handle_t*>(&idle_prepare_handle_));
-@@ -1085,25 +1083,6 @@ void Environment::RunWeakRefCleanup() {
-   isolate()->ClearKeptObjects();
- }
- 
--void Environment::CleanupFinalizationGroups() {
--  HandleScope handle_scope(isolate());
--  Context::Scope context_scope(context());
--  TryCatchScope try_catch(this);
--
--  while (!cleanup_finalization_groups_.empty() && can_call_into_js()) {
--    Local<FinalizationGroup> fg =
--        cleanup_finalization_groups_.front().Get(isolate());
--    cleanup_finalization_groups_.pop_front();
--    if (!FinalizationGroup::Cleanup(fg).FromMaybe(false)) {
--      if (try_catch.HasCaught() && !try_catch.HasTerminated())
--        errors::TriggerUncaughtException(isolate(), try_catch);
--      // Re-schedule the execution of the remainder of the queue.
--      uv_async_send(&task_queues_async_);
--      return;
--    }
--  }
--}
--
- // Not really any better place than env.cc at this moment.
- void BaseObject::DeleteMe(void* data) {
-   BaseObject* self = static_cast<BaseObject*>(data);
-diff --git a/src/env.h b/src/env.h
-index 67cefbe35f390ba25b49e422d10bca8b423a49a8..9420bdf3f71e2df1011ddd7e583071f5c99beac8 100644
---- a/src/env.h
-+++ b/src/env.h
-@@ -1130,9 +1130,7 @@ class Environment : public MemoryRetainer {
-   void AtExit(void (*cb)(void* arg), void* arg);
-   void RunAtExitCallbacks();
- 
--  void RegisterFinalizationGroupForCleanup(v8::Local<v8::FinalizationGroup> fg);
-   void RunWeakRefCleanup();
--  void CleanupFinalizationGroups();
- 
-   // Strings and private symbols are shared across shared contexts
-   // The getters simply proxy to the per-isolate primitive.
-@@ -1355,8 +1353,6 @@ class Environment : public MemoryRetainer {
-   uint64_t thread_id_;
-   std::unordered_set<worker::Worker*> sub_worker_contexts_;
- 
--  std::deque<v8::Global<v8::FinalizationGroup>> cleanup_finalization_groups_;
--
-   static void* const kNodeContextTagPtr;
-   static int const kNodeContextTag;
- 
-diff --git a/src/node.h b/src/node.h
-index 638a1a85b046ce4db303d532f7cf36cca2271db5..b9b11b4331bd3ae4a87f65758ee09af25222e19a 100644
---- a/src/node.h
-+++ b/src/node.h
-@@ -322,8 +322,6 @@ struct IsolateSettings {
-   v8::PromiseRejectCallback promise_reject_callback = nullptr;
-   v8::AllowWasmCodeGenerationCallback
-       allow_wasm_code_generation_callback = nullptr;
--  v8::HostCleanupFinalizationGroupCallback
--      host_cleanup_finalization_group_callback = nullptr;
- };
- 
- // Overriding IsolateSettings may produce unexpected behavior

+ 0 - 64
patches/node/darwin_work_around_clock_jumping_back_in_time.patch

@@ -1,64 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ben Noordhuis <[email protected]>
-Date: Wed, 1 Jul 2020 10:32:57 +0200
-Subject: darwin: work around clock jumping back in time
-
-It was reported that mach_absolute_time() can jump backward in time when
-the machine is suspended. Use mach_continuous_time() when available to
-work around that (macOS 10.12 and up.)
-
-Fixes: https://github.com/libuv/libuv/issues/2891
-PR-URL: https://github.com/libuv/libuv/pull/2894
-Reviewed-By: Phil Willoughby <[email protected]>
-Reviewed-By: Santiago Gimeno <[email protected]>
-
-diff --git a/deps/uv/src/unix/darwin.c b/deps/uv/src/unix/darwin.c
-index 654aba26b1f9249e3e76b48ae1ad674d9fd12718..4f53ad1fc7f1907281013ca5dc4b251c692d3a7b 100644
---- a/deps/uv/src/unix/darwin.c
-+++ b/deps/uv/src/unix/darwin.c
-@@ -25,6 +25,7 @@
- #include <stdint.h>
- #include <errno.h>
- 
-+#include <dlfcn.h>
- #include <mach/mach.h>
- #include <mach/mach_time.h>
- #include <mach-o/dyld.h> /* _NSGetExecutablePath */
-@@ -32,6 +33,10 @@
- #include <sys/sysctl.h>
- #include <unistd.h>  /* sysconf */
- 
-+static uv_once_t once = UV_ONCE_INIT;
-+static uint64_t (*time_func)(void);
-+static mach_timebase_info_data_t timebase;
-+
- 
- int uv__platform_loop_init(uv_loop_t* loop) {
-   loop->cf_state = NULL;
-@@ -48,15 +53,19 @@ void uv__platform_loop_delete(uv_loop_t* loop) {
- }
- 
- 
--uint64_t uv__hrtime(uv_clocktype_t type) {
--  static mach_timebase_info_data_t info;
--
--  if ((ACCESS_ONCE(uint32_t, info.numer) == 0 ||
--       ACCESS_ONCE(uint32_t, info.denom) == 0) &&
--      mach_timebase_info(&info) != KERN_SUCCESS)
-+static void uv__hrtime_init_once(void) {
-+  if (KERN_SUCCESS != mach_timebase_info(&timebase))
-     abort();
- 
--  return mach_absolute_time() * info.numer / info.denom;
-+  time_func = (uint64_t (*)(void)) dlsym(RTLD_DEFAULT, "mach_continuous_time");
-+  if (time_func == NULL)
-+    time_func = mach_absolute_time;
-+}
-+
-+
-+uint64_t uv__hrtime(uv_clocktype_t type) {
-+  uv_once(&once, uv__hrtime_init_once);
-+  return time_func() * timebase.numer / timebase.denom;
- }
- 
- 

+ 12 - 26
patches/node/enable_31_bit_smis_on_64bit_arch_and_ptr_compression.patch

@@ -8,22 +8,21 @@ node modules will have different (wrong) ideas about how v8 structs are laid
 out in memory on 64-bit machines, and will summarily fail to work.
 
 diff --git a/common.gypi b/common.gypi
-index dfcf529cd501dc890c05425fcf9a33414a45f1a5..38e7b2802f6225ac0e1ff4789b9ff8f4fb04cb79 100644
+index bd42d6cfa6006630d316faf2cddd93bea57102ba..734c2917535c50e260192abe6acb4726104b7b6a 100644
 --- a/common.gypi
 +++ b/common.gypi
-@@ -71,6 +71,9 @@
-     # TODO(refack): make v8-perfetto happen
-     'v8_use_perfetto': 0,
+@@ -64,7 +64,7 @@
+     # options but default values are required here as this file is also used by
+     # node-gyp to build addons.
+     'v8_enable_pointer_compression%': 0,
+-    'v8_enable_31bit_smis_on_64bit_arch%': 0,
++    'v8_enable_31bit_smis_on_64bit_arch%': 1,
  
-+    'v8_enable_pointer_compression%': 0,
-+    'v8_enable_31bit_smis_on_64bit_arch': 1,
-+
-     ##### end V8 defaults #####
- 
-     # When building native modules using 'npm install' with the system npm,
-@@ -148,6 +151,9 @@
-       ['OS=="mac"', {
-         'clang%': 1,
+     # Disable V8 untrusted code mitigations.
+     # See https://github.com/v8/v8/wiki/Untrusted-code-mitigations
+@@ -124,6 +124,9 @@
+         'obj_dir%': '<(PRODUCT_DIR)/obj.target',
+         'v8_base': '<(PRODUCT_DIR)/libv8_snapshot.a',
        }],
 +      ['target_arch == "arm64" or target_arch == "x64"', {
 +        'v8_enable_pointer_compression': 1,
@@ -31,16 +30,3 @@ index dfcf529cd501dc890c05425fcf9a33414a45f1a5..38e7b2802f6225ac0e1ff4789b9ff8f4
        ['target_arch in "ppc64 s390x"', {
          'v8_enable_backtrace': 1,
        }],
-@@ -378,6 +384,12 @@
-           }],
-         ],
-       }],
-+      ['v8_enable_pointer_compression == 1', {
-+        'defines': ['V8_COMPRESS_POINTERS'],
-+      }],
-+      ['v8_enable_pointer_compression == 1 or v8_enable_31bit_smis_on_64bit_arch == 1', {
-+        'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH'],
-+      }],
-       ['OS == "win"', {
-         'defines': [
-           'WIN32',

+ 2 - 2
patches/node/expose_get_builtin_module_function.patch

@@ -9,10 +9,10 @@ modules to sandboxed renderers.
 TODO(codebytere): remove and replace with a public facing API.
 
 diff --git a/src/node_binding.cc b/src/node_binding.cc
-index 0b5f6cfa038369be758e3b0857ee6fa594358b58..5291858bb164a262ca1d69d2582e037aeab23d55 100644
+index 1072ed34667262d7ef729c3235766f056acd659c..0ab18f7aeda3511338cbf115a4b636a6c72437b2 100644
 --- a/src/node_binding.cc
 +++ b/src/node_binding.cc
-@@ -605,6 +605,10 @@ void GetInternalBinding(const FunctionCallbackInfo<Value>& args) {
+@@ -608,6 +608,10 @@ void GetInternalBinding(const FunctionCallbackInfo<Value>& args) {
    args.GetReturnValue().Set(exports);
  }
  

+ 7 - 7
patches/node/feat_add_flags_for_low-level_hooks_and_exceptions.patch

@@ -24,10 +24,10 @@ Environment on the V8 context of blink, so no new V8 context is created.
 As a result, a renderer process may have multiple Node Environments in it.
 
 diff --git a/src/node.cc b/src/node.cc
-index 728785d5d2773df68a891a4c81e7b0ebfa6021bb..15abe45edb39597d4fcc686cca4d79314090fa6f 100644
+index 0dc7040381889541d9b5257158c2564ef0e728a2..cda0220071196fb7eced326985002bf0588aa23f 100644
 --- a/src/node.cc
 +++ b/src/node.cc
-@@ -122,6 +122,8 @@ using v8::Undefined;
+@@ -134,6 +134,8 @@ using v8::Undefined;
  using v8::V8;
  using v8::Value;
  
@@ -36,7 +36,7 @@ index 728785d5d2773df68a891a4c81e7b0ebfa6021bb..15abe45edb39597d4fcc686cca4d7931
  namespace per_process {
  
  // node_revert.h
-@@ -736,7 +738,9 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
+@@ -836,7 +838,9 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
    binding::RegisterBuiltinModules();
  
    // Make inherited handles noninheritable.
@@ -47,7 +47,7 @@ index 728785d5d2773df68a891a4c81e7b0ebfa6021bb..15abe45edb39597d4fcc686cca4d7931
  
    // Cache the original command line to be
    // used in diagnostic reports.
-@@ -770,6 +774,8 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
+@@ -870,6 +874,8 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
      if (exit_code != 0) return exit_code;
    }
  #endif
@@ -56,7 +56,7 @@ index 728785d5d2773df68a891a4c81e7b0ebfa6021bb..15abe45edb39597d4fcc686cca4d7931
  
    const int exit_code = ProcessGlobalArgs(argv,
                                            exec_argv,
-@@ -814,6 +820,7 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
+@@ -914,6 +920,7 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
    }
    per_process::metadata.versions.InitializeIntlVersions();
  #endif
@@ -65,10 +65,10 @@ index 728785d5d2773df68a891a4c81e7b0ebfa6021bb..15abe45edb39597d4fcc686cca4d7931
    NativeModuleEnv::InitializeCodeCache();
  
 diff --git a/src/node.h b/src/node.h
-index 886216e2cb533e7337bc4f6816e2de796f64f81e..8378553f28671e4685b4ed20279b2be5d202e527 100644
+index 1914e72ee8fa4361379725b8d44892c8a62084e1..d051b422d7c5a51a8590abda382676d3f661b532 100644
 --- a/src/node.h
 +++ b/src/node.h
-@@ -211,6 +211,8 @@ namespace node {
+@@ -218,6 +218,8 @@ namespace node {
  
  class IsolateData;
  class Environment;

+ 4 - 4
patches/node/feat_add_implementation_of_v8_platform_postjob.patch

@@ -9,10 +9,10 @@ Refs: https://chromium-review.googlesource.com/c/v8/v8/+/2315981
 Refs: https://chromium-review.googlesource.com/c/v8/v8/+/2304812
 
 diff --git a/src/node_platform.cc b/src/node_platform.cc
-index 5b878f886a13204a3a53f1e57ab2434d68fc9d21..a0ea118861867277d8f5f15625227d49505d1c6a 100644
+index 4bb9b919f60a91225ddb531e5e5e8acb1bc6a5b5..802c49cf027735302a8c5c504635a1f15e647c78 100644
 --- a/src/node_platform.cc
 +++ b/src/node_platform.cc
-@@ -500,6 +500,10 @@ Platform::StackTracePrinter NodePlatform::GetStackTracePrinter() {
+@@ -541,6 +541,10 @@ Platform::StackTracePrinter NodePlatform::GetStackTracePrinter() {
    };
  }
  
@@ -24,10 +24,10 @@ index 5b878f886a13204a3a53f1e57ab2434d68fc9d21..a0ea118861867277d8f5f15625227d49
  TaskQueue<T>::TaskQueue()
      : lock_(), tasks_available_(), tasks_drained_(),
 diff --git a/src/node_platform.h b/src/node_platform.h
-index 3c855afeb4019adfb5389721357abe3cd620a01c..1e14daa711ba62f9619ca83a8655482b11cef41d 100644
+index dc512ddf08facf1ebb0d8c9e7677d349d0d2c87c..a274be6bbea19a4488bca393712a9ac8b50fe16a 100644
 --- a/src/node_platform.h
 +++ b/src/node_platform.h
-@@ -158,6 +158,7 @@ class NodePlatform : public MultiIsolatePlatform {
+@@ -162,6 +162,7 @@ class NodePlatform : public MultiIsolatePlatform {
    void UnregisterIsolate(v8::Isolate* isolate) override;
    void AddIsolateFinishedCallback(v8::Isolate* isolate,
                                    void (*callback)(void*), void* data) override;

+ 6 - 6
patches/node/feat_add_uv_loop_watcher_queue_code.patch

@@ -6,10 +6,10 @@ Subject: feat: add uv_loop watcher_queue code
 Electron's Node Integration works by listening to Node's backend file descriptor in a separate thread; when an event is ready the backend file descriptor will trigger a new event for it, and the main thread will then iterate the libuv loop. For certain operations (ex. adding a timeout task) the backend file descriptor isn't informed, & as a result the main thread doesn't know it needs to iterate the libuv loop so the timeout task will never execute until something else trigger a new event. This commit should be removed when https://github.com/libuv/libuv/pull/1921 is merged
 
 diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h
-index fec663136a4ff14480cc8edcf846cba320ddd4eb..653c8910d7350185d1db4d343e19236a899b3a04 100644
+index 06b6d001040e0422c672bbed0722343a852a7907..3c2b2eb68c3ea4e81833a376204cd955183f649b 100644
 --- a/deps/uv/include/uv.h
 +++ b/deps/uv/include/uv.h
-@@ -1770,6 +1770,8 @@ union uv_any_req {
+@@ -1773,6 +1773,8 @@ union uv_any_req {
  struct uv_loop_s {
    /* User data - use this for whatever. */
    void* data;
@@ -19,10 +19,10 @@ index fec663136a4ff14480cc8edcf846cba320ddd4eb..653c8910d7350185d1db4d343e19236a
    unsigned int active_handles;
    void* handle_queue[2];
 diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c
-index 949eefae339919c36775d6c1bbca5f6f9b3b6201..454bd1bd3c2c7be34b764be39962b35e4e3066f6 100644
+index 1597828c868b383439f7442a3f22eee5d6ac539d..a0fbc07a21c66cc91b7b342640e5bc4ba579fd78 100644
 --- a/deps/uv/src/unix/core.c
 +++ b/deps/uv/src/unix/core.c
-@@ -885,8 +885,11 @@ void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
+@@ -897,8 +897,11 @@ void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
      return;
  #endif
  
@@ -35,7 +35,7 @@ index 949eefae339919c36775d6c1bbca5f6f9b3b6201..454bd1bd3c2c7be34b764be39962b35e
  
    if (loop->watchers[w->fd] == NULL) {
      loop->watchers[w->fd] = w;
-@@ -922,8 +925,11 @@ void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
+@@ -934,8 +937,11 @@ void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
        w->events = 0;
      }
    }
@@ -48,7 +48,7 @@ index 949eefae339919c36775d6c1bbca5f6f9b3b6201..454bd1bd3c2c7be34b764be39962b35e
  }
  
  
-@@ -940,6 +946,8 @@ void uv__io_close(uv_loop_t* loop, uv__io_t* w) {
+@@ -952,6 +958,8 @@ void uv__io_close(uv_loop_t* loop, uv__io_t* w) {
  void uv__io_feed(uv_loop_t* loop, uv__io_t* w) {
    if (QUEUE_EMPTY(&w->pending_queue))
      QUEUE_INSERT_TAIL(&loop->pending_queue, &w->pending_queue);

+ 3 - 3
patches/node/feat_initialize_asar_support.patch

@@ -6,10 +6,10 @@ Subject: feat: initialize asar support
 This patch initializes asar support in Node.js.
 
 diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js
-index 3d5e0061daa8d11a1c8c535eb0ae7179864a2d02..0a7c4a47c11eb4bb360b6a46fccb4692241bd2dc 100644
+index dfbefa955cab8adcafc5f46151ac83ed893645e0..f947c6bf27e80c534a8f72265d0139a8b5b3f13a 100644
 --- a/lib/internal/bootstrap/pre_execution.js
 +++ b/lib/internal/bootstrap/pre_execution.js
-@@ -70,6 +70,7 @@ function prepareMainThreadExecution(expandArgv1 = false) {
+@@ -73,6 +73,7 @@ function prepareMainThreadExecution(expandArgv1 = false) {
    assert(!CJSLoader.hasLoadedAnyUserCJSModule);
    loadPreloadModules();
    initializeFrozenIntrinsics();
@@ -17,7 +17,7 @@ index 3d5e0061daa8d11a1c8c535eb0ae7179864a2d02..0a7c4a47c11eb4bb360b6a46fccb4692
  }
  
  function patchProcessObject(expandArgv1) {
-@@ -440,6 +441,10 @@ function loadPreloadModules() {
+@@ -447,6 +448,10 @@ function loadPreloadModules() {
    }
  }
  

+ 24 - 0
patches/node/fix_-wincompatible-pointer-types-discards-qualifiers_error.patch

@@ -0,0 +1,24 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Shelley Vohr <[email protected]>
+Date: Tue, 1 Sep 2020 10:17:37 -0700
+Subject: fix: -Wincompatible-pointer-types-discards-qualifiers error
+
+Fixes an 'assigment to 'char *' from 'const char *'' error in libuv.
+
+This will be upstreamed.
+
+diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c
+index 8a801749d472b041fa4472a84e8499cf02b29fc4..99b30f579763e068d907dd17c21ce22265b6bf6f 100644
+--- a/deps/uv/src/win/fs.c
++++ b/deps/uv/src/win/fs.c
+@@ -1242,8 +1242,8 @@ void fs__mktemp(uv_fs_t* req, uv__fs_mktemp_func func) {
+   size_t len;
+   uint64_t v;
+   char* path;
+-  
+-  path = req->path;
++
++  path = (char*) req->path;
+   len = wcslen(req->file.pathw);
+   ep = req->file.pathw + len;
+   if (len < num_x || wcsncmp(ep - num_x, L"XXXXXX", num_x)) {

+ 4 - 4
patches/node/fix_add_default_values_for_enable_lto_and_build_v8_with_gn_in.patch

@@ -8,10 +8,10 @@ common.gypi is a file that's included in the node header bundle, despite
 the fact that we do not build node with gyp.
 
 diff --git a/common.gypi b/common.gypi
-index cebf2121ff913080ab0771f6c4dfa35ce6812bc0..df69aecc74ef66b9501d4bed0e1311e7cda2d5b8 100644
+index 0025a6782f36a2643416bf015fff66503216e403..2fda2d685edc6b8f45441cda017f7cabfe60d91f 100644
 --- a/common.gypi
 +++ b/common.gypi
-@@ -73,6 +73,22 @@
+@@ -81,6 +81,22 @@
  
      ##### end V8 defaults #####
  
@@ -32,5 +32,5 @@ index cebf2121ff913080ab0771f6c4dfa35ce6812bc0..df69aecc74ef66b9501d4bed0e1311e7
 +    'enable_lto%': 'false',
 +
      'conditions': [
-       ['target_arch=="arm64"', {
-         # Disabled pending https://github.com/nodejs/node/issues/23913.
+       ['OS == "win"', {
+         'os_posix': 0,

+ 82 - 0
patches/node/fix_allow_preventing_initializeinspector_in_env.patch

@@ -0,0 +1,82 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Shelley Vohr <[email protected]>
+Date: Tue, 1 Sep 2020 19:30:08 -0700
+Subject: fix: allow preventing InitializeInspector in env
+
+https://github.com/nodejs/node/commit/8c5ad1392f30cfe6b107e9bd85f4cb918ba04aab
+made it such that env->InitializeInspector was called in CreateEnvironment
+no matter what, which creates an issue for embedders seeking to manage
+the InspectorAgent themselves as Electron does. This adds a new
+EnvironmentFlags option which allows preventing that invocation.
+
+This will be upstreamed.
+
+diff --git a/src/api/environment.cc b/src/api/environment.cc
+index ac6b47e0f327ca0ffe28e97f747c72ebaa5d7005..97610a12be47cdbf0d39d61e5982bab09ff09e95 100644
+--- a/src/api/environment.cc
++++ b/src/api/environment.cc
+@@ -358,12 +358,14 @@ Environment* CreateEnvironment(
+       thread_id);
+ 
+ #if HAVE_INSPECTOR
+-  if (inspector_parent_handle) {
+-    env->InitializeInspector(
+-        std::move(static_cast<InspectorParentHandleImpl*>(
+-            inspector_parent_handle.get())->impl));
+-  } else {
+-    env->InitializeInspector({});
++  if (!env->should_not_initialize_inspector()) {
++    if (inspector_parent_handle) {
++      env->InitializeInspector(
++          std::move(static_cast<InspectorParentHandleImpl*>(
++              inspector_parent_handle.get())->impl));
++    } else {
++      env->InitializeInspector({});
++    }
+   }
+ #endif
+ 
+diff --git a/src/env-inl.h b/src/env-inl.h
+index ddae5766127119f727f52212d5147d29eb72ebc0..a4f48dd1f7e5f765858dbce4a080a775c0d6a124 100644
+--- a/src/env-inl.h
++++ b/src/env-inl.h
+@@ -817,6 +817,10 @@ inline bool Environment::owns_inspector() const {
+   return flags_ & EnvironmentFlags::kOwnsInspector;
+ }
+ 
++inline bool Environment::should_not_initialize_inspector() const {
++  return flags_ & EnvironmentFlags::kNoInitializeInspector;
++}
++
+ inline bool Environment::tracks_unmanaged_fds() const {
+   return flags_ & EnvironmentFlags::kTrackUnmanagedFds;
+ }
+diff --git a/src/env.h b/src/env.h
+index dea62b38cb20a0a0913128e17e8904c4ca71ac1a..18305853a4f0da3382f827e38f3b120d807a67c6 100644
+--- a/src/env.h
++++ b/src/env.h
+@@ -1023,6 +1023,7 @@ class Environment : public MemoryRetainer {
+ 
+   inline bool is_main_thread() const;
+   inline bool should_not_register_esm_loader() const;
++  inline bool should_not_initialize_inspector() const;
+   inline bool owns_process_state() const;
+   inline bool owns_inspector() const;
+   inline bool tracks_unmanaged_fds() const;
+diff --git a/src/node.h b/src/node.h
+index 80acb3f9f04ef8e6c363cf31384af4037abeeb87..6b657f6941b8f96da08b6397e01e19a2763edf8f 100644
+--- a/src/node.h
++++ b/src/node.h
+@@ -424,7 +424,11 @@ enum Flags : uint64_t {
+   kNoRegisterESMLoader = 1 << 3,
+   // Set this flag to make Node.js track "raw" file descriptors, i.e. managed
+   // by fs.open() and fs.close(), and close them during FreeEnvironment().
+-  kTrackUnmanagedFds = 1 << 4
++  kTrackUnmanagedFds = 1 << 4,
++  // This flag should be set to prevent InspectorAgent initialization from
++  // within the environment. This is used by embedders who wish to manage the
++  // InspectorAgent themselves.
++  kNoInitializeInspector = 1 << 5
+ };
+ }  // namespace EnvironmentFlags
+ 

+ 0 - 50
patches/node/fix_allow_preventing_setpromiserejectcallback.patch

@@ -1,50 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Shelley Vohr <[email protected]>
-Date: Wed, 15 Jul 2020 18:43:32 -0700
-Subject: fix: allow preventing SetPromiseRejectCallback
-
-We do not want to use the promise rejection callback that Node.js uses,
-because it does not send PromiseRejectionEvents to the global script context.
-We need to use the one Blink already provides, and so we need to
-slightly augment IsolateSettings to allow for that.
-
-diff --git a/src/api/environment.cc b/src/api/environment.cc
-index 2bfba8a011c2b902932e6b1714bbb55b945cd96d..28851b8a8f8bdd6dec0f54c62f79fd75a3be08ed 100644
---- a/src/api/environment.cc
-+++ b/src/api/environment.cc
-@@ -235,9 +235,11 @@ void SetIsolateMiscHandlers(v8::Isolate* isolate, const IsolateSettings& s) {
-     s.allow_wasm_code_generation_callback : AllowWasmCodeGenerationCallback;
-   isolate->SetAllowWasmCodeGenerationCallback(allow_wasm_codegen_cb);
- 
--  auto* promise_reject_cb = s.promise_reject_callback ?
--    s.promise_reject_callback : task_queue::PromiseRejectCallback;
--  isolate->SetPromiseRejectCallback(promise_reject_cb);
-+  if (s.flags & SHOULD_SET_PROMISE_REJECTION_CALLBACK) {
-+    auto* promise_reject_cb = s.promise_reject_callback ?
-+      s.promise_reject_callback : task_queue::PromiseRejectCallback;
-+    isolate->SetPromiseRejectCallback(promise_reject_cb);
-+  }
- 
-   if (s.flags & DETAILED_SOURCE_POSITIONS_FOR_PROFILING)
-     v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate);
-diff --git a/src/node.h b/src/node.h
-index b9b11b4331bd3ae4a87f65758ee09af25222e19a..60ecc3bd3499c23b297bc11e7f052aede20520c2 100644
---- a/src/node.h
-+++ b/src/node.h
-@@ -304,12 +304,14 @@ class NODE_EXTERN MultiIsolatePlatform : public v8::Platform {
- 
- enum IsolateSettingsFlags {
-   MESSAGE_LISTENER_WITH_ERROR_LEVEL = 1 << 0,
--  DETAILED_SOURCE_POSITIONS_FOR_PROFILING = 1 << 1
-+  DETAILED_SOURCE_POSITIONS_FOR_PROFILING = 1 << 1,
-+  SHOULD_SET_PROMISE_REJECTION_CALLBACK = 1 << 2
- };
- 
- struct IsolateSettings {
-   uint64_t flags = MESSAGE_LISTENER_WITH_ERROR_LEVEL |
--      DETAILED_SOURCE_POSITIONS_FOR_PROFILING;
-+      DETAILED_SOURCE_POSITIONS_FOR_PROFILING | 
-+      SHOULD_SET_PROMISE_REJECTION_CALLBACK;
-   v8::MicrotasksPolicy policy = v8::MicrotasksPolicy::kExplicit;
- 
-   // Error handling callbacks

+ 6 - 6
patches/node/fix_build_and_expose_inspector_agent.patch

@@ -6,10 +6,10 @@ Subject: fix: build and expose inspector agent
 Node inspector initialization happens in a different start-up function in node.cc, which we don't call in Electron. This allows for us to use the inspector agent in electron/atom/browser/node_debugger.cc
 
 diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc
-index 7712a62d7cbeb0975f00877be36b55da150f1459..1e990059198de3fedc912bfbd5eb6eae8e5c3eea 100644
+index e6ab76abf56168041108972d54d741af988342b4..7de9d75e49a08625bbd37f5bfcee3f88c5fa978d 100644
 --- a/src/inspector_agent.cc
 +++ b/src/inspector_agent.cc
-@@ -220,7 +220,7 @@ const int CONTEXT_GROUP_ID = 1;
+@@ -203,7 +203,7 @@ const int CONTEXT_GROUP_ID = 1;
  
  std::string GetWorkerLabel(node::Environment* env) {
    std::ostringstream result;
@@ -18,7 +18,7 @@ index 7712a62d7cbeb0975f00877be36b55da150f1459..1e990059198de3fedc912bfbd5eb6eae
    return result.str();
  }
  
-@@ -468,7 +468,7 @@ class NodeInspectorClient : public V8InspectorClient {
+@@ -458,7 +458,7 @@ class NodeInspectorClient : public V8InspectorClient {
      client_ = V8Inspector::create(env->isolate(), this);
      // TODO(bnoordhuis) Make name configurable from src/node.cc.
      std::string name =
@@ -28,7 +28,7 @@ index 7712a62d7cbeb0975f00877be36b55da150f1459..1e990059198de3fedc912bfbd5eb6eae
      info.is_default = true;
      contextCreated(env->context(), info);
 diff --git a/src/inspector_agent.h b/src/inspector_agent.h
-index 089077370db049a7e6d00ff2bf4d6b61cbc427d9..5594f4ba637c5c890a8226d9face18815c41a97b 100644
+index efd090c49b4311bcf3d8b717d6e5c65553849aed..a508ddd43ce613441eae759cd6110b6cc15819e4 100644
 --- a/src/inspector_agent.h
 +++ b/src/inspector_agent.h
 @@ -6,7 +6,9 @@
@@ -51,10 +51,10 @@ index 089077370db049a7e6d00ff2bf4d6b61cbc427d9..5594f4ba637c5c890a8226d9face1881
    explicit Agent(node::Environment* env);
    ~Agent();
 diff --git a/src/inspector_io.cc b/src/inspector_io.cc
-index 75290317d2fcae8585ac8d91f49add5fdd0d79c0..8af7427c463e98705dc7a6a4c86341faec3620b2 100644
+index d3bd1911214f83fbf841a91bf01072d4c12fe870..01b92d5b6b17015eb6037978b36ab20b7d2ad651 100644
 --- a/src/inspector_io.cc
 +++ b/src/inspector_io.cc
-@@ -13,6 +13,8 @@
+@@ -14,6 +14,8 @@
  #include "util-inl.h"
  #include "zlib.h"
  

+ 20 - 9
patches/node/fix_comment_out_incompatible_crypto_modules.patch

@@ -9,10 +9,10 @@ with what's exposed through BoringSSL. I plan to upstream parts of this or
 otherwise introduce shims to reduce friction.
 
 diff --git a/src/node_crypto.cc b/src/node_crypto.cc
-index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d87773dcd6 100644
+index c87b00ad87cf133ed30227b8dfd3b8e8d02e9963..0e8a63c38b23ede2003d8dabc1f72161726b53a6 100644
 --- a/src/node_crypto.cc
 +++ b/src/node_crypto.cc
-@@ -5145,6 +5145,7 @@ bool DiffieHellman::Init(int primeLength, int g) {
+@@ -5187,6 +5187,7 @@ bool DiffieHellman::Init(int primeLength, int g) {
  
  bool DiffieHellman::Init(const char* p, int p_len, int g) {
    dh_.reset(DH_new());
@@ -20,7 +20,7 @@ index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d8
    if (p_len <= 0) {
      BNerr(BN_F_BN_GENERATE_PRIME_EX, BN_R_BITS_TOO_SMALL);
      return false;
-@@ -5153,6 +5154,7 @@ bool DiffieHellman::Init(const char* p, int p_len, int g) {
+@@ -5195,6 +5196,7 @@ bool DiffieHellman::Init(const char* p, int p_len, int g) {
      DHerr(DH_F_DH_BUILTIN_GENPARAMS, DH_R_BAD_GENERATOR);
      return false;
    }
@@ -28,7 +28,7 @@ index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d8
    BIGNUM* bn_p =
        BN_bin2bn(reinterpret_cast<const unsigned char*>(p), p_len, nullptr);
    BIGNUM* bn_g = BN_new();
-@@ -5168,6 +5170,7 @@ bool DiffieHellman::Init(const char* p, int p_len, int g) {
+@@ -5210,6 +5212,7 @@ bool DiffieHellman::Init(const char* p, int p_len, int g) {
  
  bool DiffieHellman::Init(const char* p, int p_len, const char* g, int g_len) {
    dh_.reset(DH_new());
@@ -36,7 +36,7 @@ index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d8
    if (p_len <= 0) {
      BNerr(BN_F_BN_GENERATE_PRIME_EX, BN_R_BITS_TOO_SMALL);
      return false;
-@@ -5190,6 +5193,7 @@ bool DiffieHellman::Init(const char* p, int p_len, const char* g, int g_len) {
+@@ -5232,6 +5235,7 @@ bool DiffieHellman::Init(const char* p, int p_len, const char* g, int g_len) {
      BN_free(bn_g);
      return false;
    }
@@ -44,7 +44,18 @@ index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d8
    return VerifyContext();
  }
  
-@@ -6157,6 +6161,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
+@@ -5714,8 +5718,9 @@ void ECDH::SetPrivateKey(const FunctionCallbackInfo<Value>& args) {
+ 
+   if (!EC_KEY_set_public_key(new_key.get(), pub.get()))
+     return env->ThrowError("Failed to set generated public key");
+-
++#if 0
+   EC_KEY_copy(ecdh->key_.get(), new_key.get());
++#endif
+   ecdh->group_ = EC_KEY_get0_group(ecdh->key_.get());
+ }
+ 
+@@ -6203,6 +6208,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
    EVPKeyCtxPointer Setup() override {
      EVPKeyPointer params;
      if (prime_info_.fixed_value_) {
@@ -52,7 +63,7 @@ index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d8
        DHPointer dh(DH_new());
        if (!dh)
          return nullptr;
-@@ -6173,6 +6178,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
+@@ -6219,6 +6225,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
        params = EVPKeyPointer(EVP_PKEY_new());
        CHECK(params);
        EVP_PKEY_assign_DH(params.get(), dh.release());
@@ -60,7 +71,7 @@ index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d8
      } else {
        EVPKeyCtxPointer param_ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_DH, nullptr));
        if (!param_ctx)
-@@ -6180,7 +6186,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
+@@ -6226,7 +6233,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
  
        if (EVP_PKEY_paramgen_init(param_ctx.get()) <= 0)
          return nullptr;
@@ -69,7 +80,7 @@ index c373533ce85241f86d64eab8a49af79f935acdeb..454fff5ada0c271db7fb975f809c84d8
        if (EVP_PKEY_CTX_set_dh_paramgen_prime_len(param_ctx.get(),
                                                   prime_info_.prime_size_) <= 0)
          return nullptr;
-@@ -6188,7 +6194,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
+@@ -6234,7 +6241,7 @@ class DHKeyPairGenerationConfig : public KeyPairGenerationConfig {
        if (EVP_PKEY_CTX_set_dh_paramgen_generator(param_ctx.get(),
                                                   generator_) <= 0)
          return nullptr;

+ 0 - 29
patches/node/fix_do_not_register_the_esm_loader_in_renderer_processes.patch

@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Samuel Attard <[email protected]>
-Date: Thu, 25 Jun 2020 09:29:04 -0700
-Subject: fix: do not register the ESM loader in renderer processes
-
-Only one ESM loader can be registered per isolate, in renderer processes this should be blink.  This patches node so that it won't register it's handler (overriding blinks) in non-browser processes.
-
-This has been upstreamed in:
- * https://github.com/nodejs/node/pull/34060
- * https://github.com/nodejs/node/pull/34127
-
-We can't easily rebase on that accepted solution here but we can as soon as we upgrade to
-Node.js v14, since we need to leverage the new version of node::CreateEnvironment
-introduced in https://github.com/nodejs/node/pull/30467.
-
-diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js
-index b4a0f71af5853f427a10449b52509052fbe3facd..ba5b0b6e51bcddbc5b9dd9c31231585d61b131a0 100644
---- a/lib/internal/bootstrap/pre_execution.js
-+++ b/lib/internal/bootstrap/pre_execution.js
-@@ -411,6 +411,9 @@ function initializeESMLoader() {
-   // Create this WeakMap in js-land because V8 has no C++ API for WeakMap.
-   internalBinding('module_wrap').callbackMap = new SafeWeakMap();
- 
-+  // Do not hook the ESM loader in renderer processes as it overrides blinks loader
-+  if (typeof process.type === 'string' && process.type !== 'browser') return;
-+
-   const {
-     setImportModuleDynamicallyCallback,
-     setInitializeImportMetaObjectCallback

+ 0 - 27
patches/node/fix_enable_tls_renegotiation.patch

@@ -1,27 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jeremy Rose <[email protected]>
-Date: Tue, 18 Aug 2020 09:51:46 -0700
-Subject: fix: enable TLS renegotiation
-
-This configures BoringSSL to behave more similarly to OpenSSL.
-See https://github.com/electron/electron/issues/18380.
-
-This should be upstreamed.
-
-diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc
-index bb09ee99e070172a3764119cf85f3eef4d79df87..95bbc4c6a62ccf19a9d94a6afa4f2ce277c9bd4c 100644
---- a/src/tls_wrap.cc
-+++ b/src/tls_wrap.cc
-@@ -128,6 +128,12 @@ void TLSWrap::InitSSL() {
-   // - https://wiki.openssl.org/index.php/TLS1.3#Non-application_data_records
-   SSL_set_mode(ssl_.get(), SSL_MODE_AUTO_RETRY);
- 
-+#ifdef OPENSSL_IS_BORINGSSL
-+  // OpenSSL allows renegotiation by default, but BoringSSL disables it.
-+  // Configure BoringSSL to match OpenSSL's behavior.
-+  SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
-+#endif
-+
-   SSL_set_app_data(ssl_.get(), this);
-   // Using InfoCallback isn't how we are supposed to check handshake progress:
-   //   https://github.com/openssl/openssl/issues/7199#issuecomment-420915993

+ 2 - 2
patches/node/fix_expose_internalcallbackscope.patch

@@ -6,10 +6,10 @@ Subject: fix: expose InternalCallbackScope
 This commit exposes InternalCallbackScope in order to allow us access to its internal flags.
 
 diff --git a/src/node_internals.h b/src/node_internals.h
-index c1555b312e2f22e191d91d34a348d2e163d85b5b..084ecfa73657d1958d7552baa896e170934639c8 100644
+index dffaa084db409b833a869a851521e290e6789396..54e24d41e25293d3535cd853eb5a80a7b0fee122 100644
 --- a/src/node_internals.h
 +++ b/src/node_internals.h
-@@ -209,7 +209,7 @@ v8::MaybeLocal<v8::Value> InternalMakeCallback(
+@@ -204,7 +204,7 @@ v8::MaybeLocal<v8::Value> InternalMakeCallback(
      v8::Local<v8::Value> argv[],
      async_context asyncContext);
  

+ 11 - 11
patches/node/fix_expose_tracing_agent_and_use_tracing_tracingcontroller_instead.patch

@@ -5,11 +5,11 @@ Subject: fix: expose tracing::Agent and use tracing::TracingController instead
  of v8::TracingController
 
 diff --git a/src/api/environment.cc b/src/api/environment.cc
-index 5526859e551c10b31e9999d1f8ba89a94db9abfc..e2aa9c821de685a022fd78935399b7d219468403 100644
+index ea2be2c5c0bad66fbc70124c72aa6fa36de6ea60..ac6b47e0f327ca0ffe28e97f747c72ebaa5d7005 100644
 --- a/src/api/environment.cc
 +++ b/src/api/environment.cc
-@@ -352,6 +352,10 @@ MultiIsolatePlatform* GetMainThreadMultiIsolatePlatform() {
-   return per_process::v8_platform.Platform();
+@@ -472,6 +472,10 @@ MultiIsolatePlatform* GetMultiIsolatePlatform(IsolateData* env) {
+   return env->platform();
  }
  
 +node::tracing::Agent* CreateAgent() {
@@ -20,10 +20,10 @@ index 5526859e551c10b31e9999d1f8ba89a94db9abfc..e2aa9c821de685a022fd78935399b7d2
      int thread_pool_size,
      node::tracing::TracingController* tracing_controller) {
 diff --git a/src/node.h b/src/node.h
-index 8378553f28671e4685b4ed20279b2be5d202e527..638a1a85b046ce4db303d532f7cf36cca2271db5 100644
+index d051b422d7c5a51a8590abda382676d3f661b532..80acb3f9f04ef8e6c363cf31384af4037abeeb87 100644
 --- a/src/node.h
 +++ b/src/node.h
-@@ -116,6 +116,7 @@ namespace node {
+@@ -123,6 +123,7 @@ namespace node {
  
  namespace tracing {
  
@@ -31,12 +31,12 @@ index 8378553f28671e4685b4ed20279b2be5d202e527..638a1a85b046ce4db303d532f7cf36cc
  class TracingController;
  
  }
-@@ -386,6 +387,8 @@ NODE_EXTERN Environment* GetCurrentEnvironment(v8::Local<v8::Context> context);
- // it returns nullptr.
- NODE_EXTERN MultiIsolatePlatform* GetMainThreadMultiIsolatePlatform();
+@@ -510,6 +511,8 @@ NODE_DEPRECATED("Use GetMultiIsolatePlatform(env) instead",
+ NODE_EXTERN MultiIsolatePlatform* GetMultiIsolatePlatform(Environment* env);
+ NODE_EXTERN MultiIsolatePlatform* GetMultiIsolatePlatform(IsolateData* env);
  
 +NODE_EXTERN node::tracing::Agent* CreateAgent();
 +
- NODE_EXTERN MultiIsolatePlatform* CreatePlatform(
-     int thread_pool_size,
-     node::tracing::TracingController* tracing_controller);
+ // Legacy variants of MultiIsolatePlatform::Create().
+ NODE_DEPRECATED("Use variant taking a v8::TracingController* pointer instead",
+     NODE_EXTERN MultiIsolatePlatform* CreatePlatform(

+ 10 - 10
patches/node/fix_key_gen_apis_are_not_available_in_boringssl.patch

@@ -6,10 +6,10 @@ Subject: fix: key gen APIs are not available in BoringSSL
 This will make Node's key pair generation APIs fail.
 
 diff --git a/src/node_crypto.cc b/src/node_crypto.cc
-index c132e6a089b3cb7119910131fe740574d7917b89..82afaee6e2b929faac76fc5d930a8c0fd6558df3 100644
+index 05da3af09c63dcec2a4b20a4ffd8cb73c2c96982..fc780a4387c9a838a80b063276043f6087ce8259 100644
 --- a/src/node_crypto.cc
 +++ b/src/node_crypto.cc
-@@ -267,24 +267,14 @@ Maybe<bool> Decorate(Environment* env, Local<Object> obj,
+@@ -288,24 +288,14 @@ Maybe<bool> Decorate(Environment* env, Local<Object> obj,
      V(BIO)                                                                    \
      V(PKCS7)                                                                  \
      V(X509V3)                                                                 \
@@ -34,7 +34,7 @@ index c132e6a089b3cb7119910131fe740574d7917b89..82afaee6e2b929faac76fc5d930a8c0f
      V(USER)                                                                   \
  
  #define V(name) case ERR_LIB_##name: lib = #name "_"; break;
-@@ -6085,6 +6075,7 @@ class DSAKeyPairGenerationConfig : public KeyPairGenerationConfig {
+@@ -6131,6 +6121,7 @@ class DSAKeyPairGenerationConfig : public KeyPairGenerationConfig {
      if (EVP_PKEY_paramgen_init(param_ctx.get()) <= 0)
        return nullptr;
  
@@ -42,7 +42,7 @@ index c132e6a089b3cb7119910131fe740574d7917b89..82afaee6e2b929faac76fc5d930a8c0f
      if (EVP_PKEY_CTX_set_dsa_paramgen_bits(param_ctx.get(), modulus_bits_) <= 0)
        return nullptr;
  
-@@ -6095,6 +6086,7 @@ class DSAKeyPairGenerationConfig : public KeyPairGenerationConfig {
+@@ -6141,6 +6132,7 @@ class DSAKeyPairGenerationConfig : public KeyPairGenerationConfig {
          return nullptr;
        }
      }
@@ -51,10 +51,10 @@ index c132e6a089b3cb7119910131fe740574d7917b89..82afaee6e2b929faac76fc5d930a8c0f
      EVP_PKEY* raw_params = nullptr;
      if (EVP_PKEY_paramgen(param_ctx.get(), &raw_params) <= 0)
 diff --git a/src/node_crypto_common.cc b/src/node_crypto_common.cc
-index 3b35ee1ff7ba8a6aac6419ba6ca13ea33e7bcf42..83f4c1127081542aad2d12b9dc45f99cbd7a106d 100644
+index 6473b652ac95609aff555d99be38b48a5aa513a5..caaaf19dc02101c2024b511780c94fc85476b7a2 100644
 --- a/src/node_crypto_common.cc
 +++ b/src/node_crypto_common.cc
-@@ -239,10 +239,10 @@ int UseSNIContext(const SSLPointer& ssl, BaseObjectPtr<SecureContext> context) {
+@@ -240,10 +240,10 @@ int UseSNIContext(const SSLPointer& ssl, BaseObjectPtr<SecureContext> context) {
  }
  
  const char* GetClientHelloALPN(const SSLPointer& ssl) {
@@ -66,7 +66,7 @@ index 3b35ee1ff7ba8a6aac6419ba6ca13ea33e7bcf42..83f4c1127081542aad2d12b9dc45f99c
    if (!SSL_client_hello_get0_ext(
            ssl.get(),
            TLSEXT_TYPE_application_layer_protocol_negotiation,
-@@ -251,17 +251,18 @@ const char* GetClientHelloALPN(const SSLPointer& ssl) {
+@@ -252,17 +252,18 @@ const char* GetClientHelloALPN(const SSLPointer& ssl) {
        rem < 2) {
      return nullptr;
    }
@@ -87,7 +87,7 @@ index 3b35ee1ff7ba8a6aac6419ba6ca13ea33e7bcf42..83f4c1127081542aad2d12b9dc45f99c
    if (!SSL_client_hello_get0_ext(
            ssl.get(),
            TLSEXT_TYPE_server_name,
-@@ -283,6 +284,8 @@ const char* GetClientHelloServerName(const SSLPointer& ssl) {
+@@ -284,6 +285,8 @@ const char* GetClientHelloServerName(const SSLPointer& ssl) {
    if (len + 2 > rem)
      return nullptr;
    return reinterpret_cast<const char*>(buf + 5);
@@ -96,7 +96,7 @@ index 3b35ee1ff7ba8a6aac6419ba6ca13ea33e7bcf42..83f4c1127081542aad2d12b9dc45f99c
  }
  
  const char* GetServerName(SSL* ssl) {
-@@ -290,7 +293,10 @@ const char* GetServerName(SSL* ssl) {
+@@ -291,7 +294,10 @@ const char* GetServerName(SSL* ssl) {
  }
  
  bool SetGroups(SecureContext* sc, const char* groups) {
@@ -107,7 +107,7 @@ index 3b35ee1ff7ba8a6aac6419ba6ca13ea33e7bcf42..83f4c1127081542aad2d12b9dc45f99c
  }
  
  const char* X509ErrorCode(long err) {  // NOLINT(runtime/int)
-@@ -772,13 +778,13 @@ MaybeLocal<Array> GetClientHelloCiphers(
+@@ -768,13 +774,13 @@ MaybeLocal<Array> GetClientHelloCiphers(
      Environment* env,
      const SSLPointer& ssl) {
    EscapableHandleScope scope(env->isolate());

+ 2 - 2
patches/node/fix_use_crypto_impls_for_compat.patch

@@ -8,10 +8,10 @@ by using the implementations of those functions as found in the OpenSSL repo.
 I plan to try and upstream a version of this.
 
 diff --git a/src/node_crypto.cc b/src/node_crypto.cc
-index ce64dbca7ce6555bd37d3b6f85ecf41a98e3dd29..c373533ce85241f86d64eab8a49af79f935acdeb 100644
+index 43bdb88d48324cf8b206c711d3c3133f147aba24..c87b00ad87cf133ed30227b8dfd3b8e8d02e9963 100644
 --- a/src/node_crypto.cc
 +++ b/src/node_crypto.cc
-@@ -4525,7 +4525,7 @@ static unsigned int GetBytesOfRS(const ManagedEVPPKey& pkey) {
+@@ -4567,7 +4567,7 @@ static unsigned int GetBytesOfRS(const ManagedEVPPKey& pkey) {
    if (base_id == EVP_PKEY_DSA) {
      DSA* dsa_key = EVP_PKEY_get0_DSA(pkey.get());
      // Both r and s are computed mod q, so their width is limited by that of q.

+ 2 - 2
patches/node/fixme_comment_trace_event_macro.patch

@@ -7,10 +7,10 @@ This broke the build at some point. Does it still? We should probably remove
 this patch and find out!
 
 diff --git a/src/node_internals.h b/src/node_internals.h
-index 084ecfa73657d1958d7552baa896e170934639c8..cb388f3a9f12949fd3ecb0406f7b550f4ca5ca7c 100644
+index 54e24d41e25293d3535cd853eb5a80a7b0fee122..59b7e0c225a096acaa191bd144f876cc9a1c4432 100644
 --- a/src/node_internals.h
 +++ b/src/node_internals.h
-@@ -375,10 +375,11 @@ class TraceEventScope {
+@@ -372,10 +372,11 @@ class TraceEventScope {
    TraceEventScope(const char* category,
                    const char* name,
                    void* id) : category_(category), name_(name), id_(id) {

+ 2 - 2
patches/node/fixme_remove_async_id_assertion_check.patch

@@ -7,10 +7,10 @@ async hooks are hella broken in Electron. This was checking that they weren't,
 but they are, so we just disabled the check. YOLO.
 
 diff --git a/src/api/callback.cc b/src/api/callback.cc
-index 9f52c25cf0d9005c2e70b76eb52eae1bd15f0a53..e151871dc90b6c29dc3fc3db162e24baeb45923d 100644
+index 84664c089594eb44a8752ab17852157782fb4d62..6ebe2ec08a1bc875f5e26ba5fedce132596835da 100644
 --- a/src/api/callback.cc
 +++ b/src/api/callback.cc
-@@ -117,12 +117,14 @@ void InternalCallbackScope::Close() {
+@@ -116,12 +116,14 @@ void InternalCallbackScope::Close() {
      perform_stopping_check();
    }
  

+ 0 - 234
patches/node/lib_src_switch_buffer_kmaxlength_to_size_t.patch

@@ -1,234 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ben Noordhuis <[email protected]>
-Date: Sat, 18 Jan 2020 10:55:31 +0100
-Subject: lib,src: switch Buffer::kMaxLength to size_t
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Change the type of `Buffer::kMaxLength` to size_t because upcoming
-changes in V8 will allow typed arrays > 2 GB on 64 bits platforms.
-
-Not all platforms handle file reads and writes > 2 GB though so keep
-enforcing the 2 GB typed array limit for I/O operations.
-
-Fixes: https://github.com/nodejs/node/issues/31399
-Refs: https://github.com/libuv/libuv/pull/1501
-
-PR-URL: https://github.com/nodejs/node/pull/31406
-Reviewed-By: Richard Lau <[email protected]>
-Reviewed-By: David Carlier <[email protected]>
-Reviewed-By: Colin Ihrig <[email protected]>
-Reviewed-By: Luigi Pinca <[email protected]>
-Reviewed-By: Anna Henningsen <[email protected]>
-Reviewed-By: Rich Trott <[email protected]>
-Reviewed-By: Tobias Nießen <[email protected]>
-Reviewed-By: Shelley Vohr <[email protected]>
-
-diff --git a/lib/fs.js b/lib/fs.js
-index 9b70b237ef00e19983b39902b50233c682492771..7e1cb0e9e72078340e1f2cc77cd70e7a1f6bf595 100644
---- a/lib/fs.js
-+++ b/lib/fs.js
-@@ -24,6 +24,10 @@
- 
- 'use strict';
- 
-+// Most platforms don't allow reads or writes >= 2 GB.
-+// See https://github.com/libuv/libuv/pull/1501.
-+const kIoMaxLength = 2 ** 31 - 1;
-+
- const {
-   Map,
-   MathMax,
-@@ -53,7 +57,7 @@ const {
- const pathModule = require('path');
- const { isArrayBufferView } = require('internal/util/types');
- const binding = internalBinding('fs');
--const { Buffer, kMaxLength } = require('buffer');
-+const { Buffer } = require('buffer');
- const {
-   codes: {
-     ERR_FS_FILE_TOO_LARGE,
-@@ -278,7 +282,7 @@ function readFileAfterStat(err, stats) {
- 
-   const size = context.size = isFileType(stats, S_IFREG) ? stats[8] : 0;
- 
--  if (size > kMaxLength) {
-+  if (size > kIoMaxLength) {
-     err = new ERR_FS_FILE_TOO_LARGE(size);
-     return context.close(err);
-   }
-@@ -335,7 +339,7 @@ function tryCreateBuffer(size, fd, isUserFd) {
-   let threw = true;
-   let buffer;
-   try {
--    if (size > kMaxLength) {
-+    if (size > kIoMaxLength) {
-       throw new ERR_FS_FILE_TOO_LARGE(size);
-     }
-     buffer = Buffer.allocUnsafe(size);
-diff --git a/lib/internal/errors.js b/lib/internal/errors.js
-index a3d99a79c6340c3bc2955bf3b36d11e8676d1aa1..4e2d1e48257acff20131ee998a0774b709d5dbcc 100644
---- a/lib/internal/errors.js
-+++ b/lib/internal/errors.js
-@@ -827,9 +827,7 @@ E('ERR_FALSY_VALUE_REJECTION', function(reason) {
-   this.reason = reason;
-   return 'Promise was rejected with falsy value';
- }, Error);
--E('ERR_FS_FILE_TOO_LARGE', 'File size (%s) is greater than possible Buffer: ' +
--    `${kMaxLength} bytes`,
--  RangeError);
-+E('ERR_FS_FILE_TOO_LARGE', 'File size (%s) is greater than 2 GB', RangeError);
- E('ERR_FS_INVALID_SYMLINK_TYPE',
-   'Symlink type must be one of "dir", "file", or "junction". Received "%s"',
-   Error); // Switch to TypeError. The current implementation does not seem right
-diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js
-index 31eaeef28462166036c5a71a474e1b3c018cfa53..91cf9f6be52d47ba7353ca19f687ab2bb41cbd22 100644
---- a/lib/internal/fs/promises.js
-+++ b/lib/internal/fs/promises.js
-@@ -1,5 +1,9 @@
- 'use strict';
- 
-+// Most platforms don't allow reads or writes >= 2 GB.
-+// See https://github.com/libuv/libuv/pull/1501.
-+const kIoMaxLength = 2 ** 31 - 1;
-+
- const {
-   MathMax,
-   MathMin,
-@@ -15,7 +19,7 @@ const {
-   S_IFREG
- } = internalBinding('constants').fs;
- const binding = internalBinding('fs');
--const { Buffer, kMaxLength } = require('buffer');
-+const { Buffer } = require('buffer');
- const {
-   ERR_FS_FILE_TOO_LARGE,
-   ERR_INVALID_ARG_TYPE,
-@@ -166,7 +170,7 @@ async function readFileHandle(filehandle, options) {
-     size = 0;
-   }
- 
--  if (size > kMaxLength)
-+  if (size > kIoMaxLength)
-     throw new ERR_FS_FILE_TOO_LARGE(size);
- 
-   const chunks = [];
-diff --git a/lib/internal/fs/utils.js b/lib/internal/fs/utils.js
-index ed4e9bb66ad79ffd542b769ab17a28bb801764c6..84f9e3b806a237c599f85dcb8fb93bfe9a098eda 100644
---- a/lib/internal/fs/utils.js
-+++ b/lib/internal/fs/utils.js
-@@ -12,7 +12,7 @@ const {
-   Symbol,
- } = primordials;
- 
--const { Buffer, kMaxLength } = require('buffer');
-+const { Buffer } = require('buffer');
- const {
-   codes: {
-     ERR_FS_INVALID_SYMLINK_TYPE,
-@@ -72,6 +72,10 @@ const {
- 
- const isWindows = process.platform === 'win32';
- 
-+// Most platforms don't allow reads or writes >= 2 GB.
-+// See https://github.com/libuv/libuv/pull/1501.
-+const kIoMaxLength = 2 ** 31 - 1;
-+
- let fs;
- function lazyLoadFs() {
-   if (!fs) {
-@@ -569,7 +573,7 @@ const validateOffsetLengthWrite = hideStackFrames(
-       throw new ERR_OUT_OF_RANGE('offset', `<= ${byteLength}`, offset);
-     }
- 
--    const max = byteLength > kMaxLength ? kMaxLength : byteLength;
-+    const max = byteLength > kIoMaxLength ? kIoMaxLength : byteLength;
-     if (length > max - offset) {
-       throw new ERR_OUT_OF_RANGE('length', `<= ${max - offset}`, length);
-     }
-diff --git a/src/node_buffer.cc b/src/node_buffer.cc
-index 59baa45413d500272d0e293ab06bfe4d24e5e0cb..4d1951b740240bff231b7f4c855beb5b73d076af 100644
---- a/src/node_buffer.cc
-+++ b/src/node_buffer.cc
-@@ -62,6 +62,7 @@ using v8::Local;
- using v8::Maybe;
- using v8::MaybeLocal;
- using v8::Nothing;
-+using v8::Number;
- using v8::Object;
- using v8::String;
- using v8::Uint32;
-@@ -1161,7 +1162,7 @@ void Initialize(Local<Object> target,
- 
-   target->Set(env->context(),
-               FIXED_ONE_BYTE_STRING(env->isolate(), "kMaxLength"),
--              Integer::NewFromUnsigned(env->isolate(), kMaxLength)).Check();
-+              Number::New(env->isolate(), kMaxLength)).Check();
- 
-   target->Set(env->context(),
-               FIXED_ONE_BYTE_STRING(env->isolate(), "kStringMaxLength"),
-diff --git a/src/node_buffer.h b/src/node_buffer.h
-index 11010017ce0df8367b1992bd9df57117ff50454d..606a6f5caa3b11b6d2a9068ed2fd65800530a5eb 100644
---- a/src/node_buffer.h
-+++ b/src/node_buffer.h
-@@ -29,7 +29,7 @@ namespace node {
- 
- namespace Buffer {
- 
--static const unsigned int kMaxLength = v8::TypedArray::kMaxLength;
-+static const size_t kMaxLength = v8::TypedArray::kMaxLength;
- 
- typedef void (*FreeCallback)(char* data, void* hint);
- 
-diff --git a/test/parallel/test-fs-util-validateoffsetlengthwrite.js b/test/parallel/test-fs-util-validateoffsetlengthwrite.js
-index be6d8acea77efa5adc82a6bcaaa192167b510fb0..e2c583749d041d76da630bbbf6b46ac490076c56 100644
---- a/test/parallel/test-fs-util-validateoffsetlengthwrite.js
-+++ b/test/parallel/test-fs-util-validateoffsetlengthwrite.js
-@@ -4,7 +4,10 @@
- require('../common');
- const assert = require('assert');
- const { validateOffsetLengthWrite } = require('internal/fs/utils');
--const { kMaxLength } = require('buffer');
-+
-+// Most platforms don't allow reads or writes >= 2 GB.
-+// See https://github.com/libuv/libuv/pull/1501.
-+const kIoMaxLength = 2 ** 31 - 1;
- 
- // RangeError when offset > byteLength
- {
-@@ -22,27 +25,27 @@ const { kMaxLength } = require('buffer');
-   );
- }
- 
--// RangeError when byteLength > kMaxLength, and length > kMaxLength - offset .
-+// RangeError when byteLength > kIoMaxLength, and length > kIoMaxLength - offset .
- {
--  const offset = kMaxLength;
-+  const offset = kIoMaxLength;
-   const length = 100;
--  const byteLength = kMaxLength + 1;
-+  const byteLength = kIoMaxLength + 1;
-   assert.throws(
-     () => validateOffsetLengthWrite(offset, length, byteLength),
-     {
-       code: 'ERR_OUT_OF_RANGE',
-       name: 'RangeError',
-       message: 'The value of "length" is out of range. ' +
--               `It must be <= ${kMaxLength - offset}. Received ${length}`
-+               `It must be <= ${kIoMaxLength - offset}. Received ${length}`
-     }
-   );
- }
- 
--// RangeError when byteLength < kMaxLength, and length > byteLength - offset .
-+// RangeError when byteLength < kIoMaxLength, and length > byteLength - offset.
- {
--  const offset = kMaxLength - 150;
-+  const offset = kIoMaxLength - 150;
-   const length = 200;
--  const byteLength = kMaxLength - 100;
-+  const byteLength = kIoMaxLength - 100;
-   assert.throws(
-     () => validateOffsetLengthWrite(offset, length, byteLength),
-     {

+ 0 - 30
patches/node/lib_use_non-symbols_in_isurlinstance_check.patch

@@ -1,30 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Shelley Vohr <[email protected]>
-Date: Tue, 4 Aug 2020 09:17:06 -0700
-Subject: lib: use non-symbols in isURLInstance check
-
-This slightly changes the conditional used to determine whether or
-not something is a URL instance. Since Node.js adds symbols to the URL
-not specified by the WHATWG, those symbols are not present in other
-implementations (like Blink's) and therefore can cause false negatives.
-
-This fixes that by slightly changing the check to properties present
-in all URL instances as specified in the WHATWG spec.
-
-Upstreamed at: https://github.com/nodejs/node/pull/34622.
-
-diff --git a/lib/internal/url.js b/lib/internal/url.js
-index 78f5b32745a0436337233e8a4b57b89263effad6..ace274501f2c1f6bb06f600abb850e737c988338 100644
---- a/lib/internal/url.js
-+++ b/lib/internal/url.js
-@@ -1394,8 +1394,8 @@ function pathToFileURL(filepath) {
- }
- 
- function isURLInstance(fileURLOrPath) {
--  return fileURLOrPath != null && fileURLOrPath[searchParams] &&
--    fileURLOrPath[searchParams][searchParams];
-+  return fileURLOrPath != null && fileURLOrPath['href'] &&
-+    fileURLOrPath['origin'];
- }
- 
- function toPathIfFileURL(fileURLOrPath) {

+ 2 - 2
patches/node/make_module_globalpaths_a_reference.patch

@@ -10,10 +10,10 @@ node's module code.
 (cherry picked from commit 76ba048c37588ee32636817fa7b8dffc64330cbf)
 
 diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
-index 98668573db651a42876c3369e6fa7c2ef97d6e73..d041ce0470ee48d44897fb77f37f6013d9cc108a 100644
+index a7fa93b9cfa9468f068fcfb950bade8137483121..a24ab3c2ee7d664700a6c4c8e17c9ef2b74efa5a 100644
 --- a/lib/internal/modules/cjs/loader.js
 +++ b/lib/internal/modules/cjs/loader.js
-@@ -1254,8 +1254,8 @@ Module._initPaths = function() {
+@@ -1198,8 +1198,8 @@ Module._initPaths = function() {
  
    modulePaths = paths;
  

+ 274 - 179
patches/node/n-api_src_provide_asynchronous_cleanup_hooks.patch

@@ -1,148 +1,155 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Shelley Vohr <shelley.vohr@gmail.com>
-Date: Tue, 25 Aug 2020 19:34:12 -0700
-Subject: n-api,src: provide asynchronous cleanup hooks
+From: Gabriel Schulhof <gabriel.schulhof@intel.com>
+Date: Mon, 17 Aug 2020 10:13:00 -0700
+Subject: n-api: re-implement async env cleanup hooks
 
-Backports https://github.com/nodejs/node/pull/34572 and
-https://github.com/nodejs/node/pull/34819.
+* Avoid passing core `void*` and function pointers into add-on.
+* Document `napi_async_cleanup_hook_handle` type.
+* Render receipt of the handle mandatory from the point where the
+  hook gets called. Removal of the handle remains mandatory.
 
-Sometimes addons need to perform cleanup actions, for example
-closing libuv handles or waiting for requests to finish, that
-cannot be performed synchronously.
+Fixes: https://github.com/nodejs/node/issues/34715
+Signed-off-by: Gabriel Schulhof <[email protected]>
+Co-authored-by: Anna Henningsen <[email protected]>
+PR-URL: https://github.com/nodejs/node/pull/34819
+Reviewed-By: Michael Dawson <[email protected]>
+Reviewed-By: Zeyu Yang <[email protected]>
 
-Add C++ API and N-API functions that allow providing such
-asynchronous cleanup hooks.
-
-This patch can be removed when Electron upgrades to a version of Node.js
-which contains the above referenced commit(s).
-
-diff --git a/src/api/hooks.cc b/src/api/hooks.cc
-index 037bdda6f41c825dd112b0cc9fca0ebde47c6163..3b16c0350d8a8494202144407664af41d338fe04 100644
---- a/src/api/hooks.cc
-+++ b/src/api/hooks.cc
-@@ -73,8 +73,35 @@ int EmitExit(Environment* env) {
-       .ToChecked();
- }
+diff --git a/doc/api/n-api.md b/doc/api/n-api.md
+index d9b757721c880388664f11cc5c0425379e105e2b..161f61308e5e5faa1ddf68802fdafacf1e5c1613 100644
+--- a/doc/api/n-api.md
++++ b/doc/api/n-api.md
+@@ -623,6 +623,15 @@ typedef struct {
+ } napi_type_tag;
+ ```
  
-+typedef void (*CleanupHook)(void* arg);
-+typedef void (*AsyncCleanupHook)(void* arg, void(*)(void*), void*);
-+
-+struct AsyncCleanupHookInfo final {
-+  Environment* env;
-+  AsyncCleanupHook fun;
-+  void* arg;
-+  bool started = false;
-+  // Use a self-reference to make sure the storage is kept alive while the
-+  // cleanup hook is registered but not yet finished.
-+  std::shared_ptr<AsyncCleanupHookInfo> self;
-+};
-+
-+// Opaque type that is basically an alias for `shared_ptr<AsyncCleanupHookInfo>`
-+// (but not publicly so for easier ABI/API changes). In particular,
-+// std::shared_ptr does not generally maintain a consistent ABI even on a
-+// specific platform.
-+struct ACHHandle final {
-+  std::shared_ptr<AsyncCleanupHookInfo> info;
-+};
-+// This is implemented as an operator on a struct because otherwise you can't
-+// default-initialize AsyncCleanupHookHandle, because in C++ for a
-+// std::unique_ptr to be default-initializable the deleter type also needs
-+// to be default-initializable; in particular, function types don't satisfy
-+// this.
-+void DeleteACHHandle::operator ()(ACHHandle* handle) const { delete handle; }
-+
- void AddEnvironmentCleanupHook(Isolate* isolate,
--                               void (*fun)(void* arg),
-+                               CleanupHook fun,
-                                void* arg) {
-   Environment* env = Environment::GetCurrent(isolate);
-   CHECK_NOT_NULL(env);
-@@ -82,13 +109,50 @@ void AddEnvironmentCleanupHook(Isolate* isolate,
- }
++#### napi_async_cleanup_hook_handle
++<!-- YAML
++added: REPLACEME
++-->
++
++An opaque value returned by [`napi_add_async_cleanup_hook`][]. It must be passed
++to [`napi_remove_async_cleanup_hook`][] when the chain of asynchronous cleanup
++events completes.
++
+ ### N-API callback types
  
- void RemoveEnvironmentCleanupHook(Isolate* isolate,
--                                  void (*fun)(void* arg),
-+                                  CleanupHook fun,
-                                   void* arg) {
-   Environment* env = Environment::GetCurrent(isolate);
-   CHECK_NOT_NULL(env);
-   env->RemoveCleanupHook(fun, arg);
- }
+ #### napi_callback_info
+@@ -751,6 +760,30 @@ typedef void (*napi_threadsafe_function_call_js)(napi_env env,
+ Unless for reasons discussed in [Object Lifetime Management][], creating a
+ handle and/or callback scope inside the function body is not necessary.
+ 
++#### napi_async_cleanup_hook
++<!-- YAML
++added: REPLACEME
++-->
++
++Function pointer used with [`napi_add_async_cleanup_hook`][]. It will be called
++when the environment is being torn down.
++
++Callback functions must satisfy the following signature:
++
++```c
++typedef void (*napi_async_cleanup_hook)(napi_async_cleanup_hook_handle handle,
++                                        void* data);
++```
++
++* `[in] handle`: The handle that must be passed to
++[`napi_remove_async_cleanup_hook`][] after completion of the asynchronous
++cleanup.
++* `[in] data`: The data that was passed to [`napi_add_async_cleanup_hook`][].
++
++The body of the function should initiate the asynchronous cleanup actions at the
++end of which `handle` must be passed in a call to
++[`napi_remove_async_cleanup_hook`][].
++
+ ## Error handling
+ 
+ N-API uses both return values and JavaScript exceptions for error handling.
+@@ -1580,6 +1613,10 @@ with `napi_add_env_cleanup_hook`, otherwise the process will abort.
+ #### napi_add_async_cleanup_hook
+ <!-- YAML
+ added: v14.8.0
++changes:
++  - version: REPLACEME
++    pr-url: https://github.com/nodejs/node/pull/34819
++    description: Changed signature of the `hook` callback.
+ -->
  
-+static void FinishAsyncCleanupHook(void* arg) {
-+  AsyncCleanupHookInfo* info = static_cast<AsyncCleanupHookInfo*>(arg);
-+  std::shared_ptr<AsyncCleanupHookInfo> keep_alive = info->self;
-+
-+  info->env->DecreaseWaitingRequestCounter();
-+  info->self.reset();
-+}
-+
-+static void RunAsyncCleanupHook(void* arg) {
-+  AsyncCleanupHookInfo* info = static_cast<AsyncCleanupHookInfo*>(arg);
-+  info->env->IncreaseWaitingRequestCounter();
-+  info->started = true;
-+  info->fun(info->arg, FinishAsyncCleanupHook, info);
-+}
-+
-+AsyncCleanupHookHandle AddEnvironmentCleanupHook(
-+    Isolate* isolate,
-+    AsyncCleanupHook fun,
-+    void* arg) {
-+  Environment* env = Environment::GetCurrent(isolate);
-+  CHECK_NOT_NULL(env);
-+  auto info = std::make_shared<AsyncCleanupHookInfo>();
-+  info->env = env;
-+  info->fun = fun;
-+  info->arg = arg;
-+  info->self = info;
-+  env->AddCleanupHook(RunAsyncCleanupHook, info.get());
-+  return AsyncCleanupHookHandle(new ACHHandle { info });
-+}
-+
-+void RemoveEnvironmentCleanupHook(
-+    AsyncCleanupHookHandle handle) {
-+  if (handle->info->started) return;
-+  handle->info->self.reset();
-+  handle->info->env->RemoveCleanupHook(RunAsyncCleanupHook, handle->info.get());
-+}
-+
- async_id AsyncHooksGetExecutionAsyncId(Isolate* isolate) {
-   Environment* env = Environment::GetCurrent(isolate);
-   if (env == nullptr) return -1;
-diff --git a/src/node.h b/src/node.h
-index 60ecc3bd3499c23b297bc11e7f052aede20520c2..4c4e55e338d7b42c36818a45f6b41170c495adde 100644
---- a/src/node.h
-+++ b/src/node.h
-@@ -739,6 +739,20 @@ NODE_EXTERN void RemoveEnvironmentCleanupHook(v8::Isolate* isolate,
-                                               void (*fun)(void* arg),
-                                               void* arg);
- 
-+/* These are async equivalents of the above. After the cleanup hook is invoked,
-+ * `cb(cbarg)` *must* be called, and attempting to remove the cleanup hook will
-+ * have no effect. */
-+struct ACHHandle;
-+struct NODE_EXTERN DeleteACHHandle { void operator()(ACHHandle*) const; };
-+typedef std::unique_ptr<ACHHandle, DeleteACHHandle> AsyncCleanupHookHandle;
-+
-+NODE_EXTERN AsyncCleanupHookHandle AddEnvironmentCleanupHook(
-+    v8::Isolate* isolate,
-+    void (*fun)(void* arg, void (*cb)(void*), void* cbarg),
-+    void* arg);
-+
-+NODE_EXTERN void RemoveEnvironmentCleanupHook(AsyncCleanupHookHandle holder);
-+
- /* Returns the id of the current execution context. If the return value is
-  * zero then no execution has been set. This will happen if the user handles
-  * I/O from native code. */
+ > Stability: 1 - Experimental
+@@ -1587,15 +1624,22 @@ added: v14.8.0
+ ```c
+ NAPI_EXTERN napi_status napi_add_async_cleanup_hook(
+     napi_env env,
+-    void (*fun)(void* arg, void(* cb)(void*), void* cbarg),
++    napi_async_cleanup_hook hook,
+     void* arg,
+     napi_async_cleanup_hook_handle* remove_handle);
+ ```
+ 
+-Registers `fun` as a function to be run with the `arg` parameter once the
+-current Node.js environment exits. Unlike [`napi_add_env_cleanup_hook`][],
+-the hook is allowed to be asynchronous in this case, and must invoke the passed
+-`cb()` function with `cbarg` once all asynchronous activity is finished.
++* `[in] env`: The environment that the API is invoked under.
++* `[in] hook`: The function pointer to call at environment teardown.
++* `[in] arg`: The pointer to pass to `hook` when it gets called.
++* `[out] remove_handle`: Optional handle that refers to the asynchronous cleanup
++hook.
++
++Registers `hook`, which is a function of type [`napi_async_cleanup_hook`][], as
++a function to be run with the `remove_handle` and `arg` parameters once the
++current Node.js environment exits.
++
++Unlike [`napi_add_env_cleanup_hook`][], the hook is allowed to be asynchronous.
+ 
+ Otherwise, behavior generally matches that of [`napi_add_env_cleanup_hook`][].
+ 
+@@ -1608,19 +1652,25 @@ is being torn down anyway.
+ #### napi_remove_async_cleanup_hook
+ <!-- YAML
+ added: v14.8.0
++changes:
++  - version: REPLACEME
++    pr-url: https://github.com/nodejs/node/pull/34819
++    description: Removed `env` parameter.
+ -->
+ 
+ > Stability: 1 - Experimental
+ 
+ ```c
+ NAPI_EXTERN napi_status napi_remove_async_cleanup_hook(
+-    napi_env env,
+     napi_async_cleanup_hook_handle remove_handle);
+ ```
+ 
++* `[in] remove_handle`: The handle to an asynchronous cleanup hook that was
++created with [`napi_add_async_cleanup_hook`][].
++
+ Unregisters the cleanup hook corresponding to `remove_handle`. This will prevent
+ the hook from being executed, unless it has already started executing.
+-This must be called on any `napi_async_cleanup_hook_handle` value retrieved
++This must be called on any `napi_async_cleanup_hook_handle` value obtained
+ from [`napi_add_async_cleanup_hook`][].
+ 
+ ## Module registration
+@@ -5757,6 +5807,7 @@ This API may only be called from the main thread.
+ [`napi_add_async_cleanup_hook`]: #n_api_napi_add_async_cleanup_hook
+ [`napi_add_env_cleanup_hook`]: #n_api_napi_add_env_cleanup_hook
+ [`napi_add_finalizer`]: #n_api_napi_add_finalizer
++[`napi_async_cleanup_hook`]: #n_api_napi_async_cleanup_hook
+ [`napi_async_complete_callback`]: #n_api_napi_async_complete_callback
+ [`napi_async_init`]: #n_api_napi_async_init
+ [`napi_callback`]: #n_api_napi_callback
 diff --git a/src/node_api.cc b/src/node_api.cc
-index fe24eca1b8e2d81fbafd0a1e2da38d957fbaa1c1..66168bd2c28ce6481516e63734616f487e3ec3e1 100644
+index 4fbab771d5840004a303094c87981409d8bac848..93488146d56690c27c56a21f2795796d027cfa02 100644
 --- a/src/node_api.cc
 +++ b/src/node_api.cc
-@@ -507,6 +507,70 @@ napi_status napi_remove_env_cleanup_hook(napi_env env,
-   return napi_ok;
+@@ -519,41 +519,68 @@ napi_status napi_remove_env_cleanup_hook(napi_env env,
  }
  
-+struct napi_async_cleanup_hook_handle__ {
+ struct napi_async_cleanup_hook_handle__ {
+-  node::AsyncCleanupHookHandle handle;
 +  napi_async_cleanup_hook_handle__(napi_env env,
 +                                   napi_async_cleanup_hook user_hook,
 +                                   void* user_data):
@@ -177,74 +184,162 @@ index fe24eca1b8e2d81fbafd0a1e2da38d957fbaa1c1..66168bd2c28ce6481516e63734616f48
 +  void* user_data_ = nullptr;
 +  void (*done_cb_)(void*) = nullptr;
 +  void* done_data_ = nullptr;
-+};
-+
-+napi_status napi_add_async_cleanup_hook(
-+    napi_env env,
+ };
+ 
+ napi_status napi_add_async_cleanup_hook(
+     napi_env env,
+-    void (*fun)(void* arg, void(* cb)(void*), void* cbarg),
 +    napi_async_cleanup_hook hook,
-+    void* arg,
-+    napi_async_cleanup_hook_handle* remove_handle) {
-+  CHECK_ENV(env);
+     void* arg,
+     napi_async_cleanup_hook_handle* remove_handle) {
+   CHECK_ENV(env);
+-  CHECK_ARG(env, fun);
 +  CHECK_ARG(env, hook);
-+
+ 
+-  auto handle = node::AddEnvironmentCleanupHook(env->isolate, fun, arg);
+-  if (remove_handle != nullptr) {
+-    *remove_handle = new napi_async_cleanup_hook_handle__ { std::move(handle) };
+-    env->Ref();
+-  }
 +  napi_async_cleanup_hook_handle__* handle =
 +    new napi_async_cleanup_hook_handle__(env, hook, arg);
 +
 +  if (remove_handle != nullptr)
 +    *remove_handle = handle;
-+
-+  return napi_clear_last_error(env);
-+}
-+
-+napi_status napi_remove_async_cleanup_hook(
-+    napi_async_cleanup_hook_handle remove_handle) {
-+
+ 
+   return napi_clear_last_error(env);
+ }
+ 
+ napi_status napi_remove_async_cleanup_hook(
+-    napi_env env,
+     napi_async_cleanup_hook_handle remove_handle) {
+-  CHECK_ENV(env);
+-  CHECK_ARG(env, remove_handle);
+ 
+-  node::RemoveEnvironmentCleanupHook(std::move(remove_handle->handle));
+-  delete remove_handle;
 +  if (remove_handle == nullptr)
 +    return napi_invalid_arg;
-+
+ 
+-  // Release the `env` handle asynchronously since it would be surprising if
+-  // a call to a N-API function would destroy `env` synchronously.
+-  static_cast<node_napi_env>(env)->node_env()
+-      ->SetImmediate([env](node::Environment*) { env->Unref(); });
 +  delete remove_handle;
+ 
+-  return napi_clear_last_error(env);
 +  return napi_ok;
-+}
-+
+ }
+ 
  napi_status napi_fatal_exception(napi_env env, napi_value err) {
-   NAPI_PREAMBLE(env);
-   CHECK_ARG(env, err);
 diff --git a/src/node_api.h b/src/node_api.h
-index 2f1b45572d8130f27492eb6188c1aa611f2e01a3..577a1dcd94987202819e7a36a2d9674f13d13614 100644
+index 4f3eb8f2caae6375d5334486d75be76bf912d4e3..577a1dcd94987202819e7a36a2d9674f13d13614 100644
 --- a/src/node_api.h
 +++ b/src/node_api.h
-@@ -250,6 +250,19 @@ napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func);
+@@ -254,12 +254,11 @@ napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func);
  
- #endif  // NAPI_VERSION >= 4
- 
-+#ifdef NAPI_EXPERIMENTAL
-+
-+NAPI_EXTERN napi_status napi_add_async_cleanup_hook(
-+    napi_env env,
+ NAPI_EXTERN napi_status napi_add_async_cleanup_hook(
+     napi_env env,
+-    void (*fun)(void* arg, void(* cb)(void*), void* cbarg),
 +    napi_async_cleanup_hook hook,
-+    void* arg,
-+    napi_async_cleanup_hook_handle* remove_handle);
-+
-+NAPI_EXTERN napi_status napi_remove_async_cleanup_hook(
-+    napi_async_cleanup_hook_handle remove_handle);
-+
-+#endif  // NAPI_EXPERIMENTAL
-+
- EXTERN_C_END
+     void* arg,
+     napi_async_cleanup_hook_handle* remove_handle);
+ 
+ NAPI_EXTERN napi_status napi_remove_async_cleanup_hook(
+-    napi_env env,
+     napi_async_cleanup_hook_handle remove_handle);
  
- #endif  // SRC_NODE_API_H_
+ #endif  // NAPI_EXPERIMENTAL
 diff --git a/src/node_api_types.h b/src/node_api_types.h
-index 1c9a2b8aa21889c0d29fb02b234ae9698d122c2c..0e400e9676df5ba09d350fe7a2a70a1dc9e4d3d6 100644
+index b8711d3eddc408bc239a964528c23d71555a5d72..0e400e9676df5ba09d350fe7a2a70a1dc9e4d3d6 100644
 --- a/src/node_api_types.h
 +++ b/src/node_api_types.h
-@@ -41,4 +41,10 @@ typedef struct {
-   const char* release;
- } napi_node_version;
+@@ -43,6 +43,8 @@ typedef struct {
  
-+#ifdef NAPI_EXPERIMENTAL
-+typedef struct napi_async_cleanup_hook_handle__* napi_async_cleanup_hook_handle;
+ #ifdef NAPI_EXPERIMENTAL
+ typedef struct napi_async_cleanup_hook_handle__* napi_async_cleanup_hook_handle;
 +typedef void (*napi_async_cleanup_hook)(napi_async_cleanup_hook_handle handle,
 +                                        void* data);
-+#endif  // NAPI_EXPERIMENTAL
-+
+ #endif  // NAPI_EXPERIMENTAL
+ 
  #endif  // SRC_NODE_API_TYPES_H_
+diff --git a/test/node-api/test_async_cleanup_hook/binding.c b/test/node-api/test_async_cleanup_hook/binding.c
+index f0c9cd97a26c48c3f7323930dc856e49e1755f35..7bbde56bb0ec888a97926f36425f7a1dca719514 100644
+--- a/test/node-api/test_async_cleanup_hook/binding.c
++++ b/test/node-api/test_async_cleanup_hook/binding.c
+@@ -5,7 +5,7 @@
+ #include <stdlib.h>
+ #include "../../js-native-api/common.h"
+ 
+-void MustNotCall(void* arg, void(*cb)(void*), void* cbarg) {
++static void MustNotCall(napi_async_cleanup_hook_handle hook, void* arg) {
+   assert(0);
+ }
+ 
+@@ -13,36 +13,26 @@ struct AsyncData {
+   uv_async_t async;
+   napi_env env;
+   napi_async_cleanup_hook_handle handle;
+-  void (*done_cb)(void*);
+-  void* done_arg;
+ };
+ 
+-struct AsyncData* CreateAsyncData() {
++static struct AsyncData* CreateAsyncData() {
+   struct AsyncData* data = (struct AsyncData*) malloc(sizeof(struct AsyncData));
+   data->handle = NULL;
+   return data;
+ }
+ 
+-void AfterCleanupHookTwo(uv_handle_t* handle) {
++static void AfterCleanupHookTwo(uv_handle_t* handle) {
+   struct AsyncData* data = (struct AsyncData*) handle->data;
+-  data->done_cb(data->done_arg);
++  napi_status status = napi_remove_async_cleanup_hook(data->handle);
++  assert(status == napi_ok);
+   free(data);
+ }
+ 
+-void AfterCleanupHookOne(uv_async_t* async) {
+-  struct AsyncData* data = (struct AsyncData*) async->data;
+-  if (data->handle != NULL) {
+-    // Verify that removing the hook is okay between starting and finishing
+-    // of its execution.
+-    napi_status status =
+-        napi_remove_async_cleanup_hook(data->env, data->handle);
+-    assert(status == napi_ok);
+-  }
+-
++static void AfterCleanupHookOne(uv_async_t* async) {
+   uv_close((uv_handle_t*) async, AfterCleanupHookTwo);
+ }
+ 
+-void AsyncCleanupHook(void* arg, void(*cb)(void*), void* cbarg) {
++static void AsyncCleanupHook(napi_async_cleanup_hook_handle handle, void* arg) {
+   struct AsyncData* data = (struct AsyncData*) arg;
+   uv_loop_t* loop;
+   napi_status status = napi_get_uv_event_loop(data->env, &loop);
+@@ -51,12 +41,11 @@ void AsyncCleanupHook(void* arg, void(*cb)(void*), void* cbarg) {
+   assert(err == 0);
+ 
+   data->async.data = data;
+-  data->done_cb = cb;
+-  data->done_arg = cbarg;
++  data->handle = handle;
+   uv_async_send(&data->async);
+ }
+ 
+-napi_value Init(napi_env env, napi_value exports) {
++static napi_value Init(napi_env env, napi_value exports) {
+   {
+     struct AsyncData* data = CreateAsyncData();
+     data->env = env;
+@@ -73,7 +62,7 @@ napi_value Init(napi_env env, napi_value exports) {
+     napi_async_cleanup_hook_handle must_not_call_handle;
+     napi_add_async_cleanup_hook(
+         env, MustNotCall, NULL, &must_not_call_handle);
+-    napi_remove_async_cleanup_hook(env, must_not_call_handle);
++    napi_remove_async_cleanup_hook(must_not_call_handle);
+   }
+ 
+   return NULL;

+ 0 - 23
patches/node/override_existing_v8_reallocate.patch

@@ -1,23 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Shelley Vohr <[email protected]>
-Date: Mon, 3 Feb 2020 10:06:45 -0800
-Subject: Override existing V8 Reallocate
-
-Refs https://chromium-review.googlesource.com/c/v8/v8/+/2007274.
-Reallocate has been implemented by V8 itself, so this function must now
-be overridden. This patch can be removed once the relevant version of V8
-makes its way into Node.js.
-
-diff --git a/src/node_internals.h b/src/node_internals.h
-index cb388f3a9f12949fd3ecb0406f7b550f4ca5ca7c..f4b5c9bb7058da2355204a7285e5f7cc70c4ffda 100644
---- a/src/node_internals.h
-+++ b/src/node_internals.h
-@@ -115,7 +115,7 @@ class NodeArrayBufferAllocator : public ArrayBufferAllocator {
-   void* Allocate(size_t size) override;  // Defined in src/node.cc
-   void* AllocateUninitialized(size_t size) override;
-   void Free(void* data, size_t size) override;
--  virtual void* Reallocate(void* data, size_t old_size, size_t size);
-+  virtual void* Reallocate(void* data, size_t old_size, size_t size) override;
-   virtual void RegisterPointer(void* data, size_t size) {
-     total_mem_usage_.fetch_add(size, std::memory_order_relaxed);
-   }

+ 6 - 6
patches/node/pass_all_globals_through_require.patch

@@ -6,10 +6,10 @@ Subject: Pass all globals through "require"
 (cherry picked from commit 7d015419cb7a0ecfe6728431a4ed2056cd411d62)
 
 diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
-index d041ce0470ee48d44897fb77f37f6013d9cc108a..0ef46569924354ea3ef59f3220637e30b316a761 100644
+index a24ab3c2ee7d664700a6c4c8e17c9ef2b74efa5a..cab75bce3624cc74a87283d86c30277c82292982 100644
 --- a/lib/internal/modules/cjs/loader.js
 +++ b/lib/internal/modules/cjs/loader.js
-@@ -102,6 +102,13 @@ const {
+@@ -105,6 +105,13 @@ const {
    CHAR_COLON
  } = require('internal/constants');
  
@@ -20,10 +20,10 @@ index d041ce0470ee48d44897fb77f37f6013d9cc108a..0ef46569924354ea3ef59f3220637e30
 +// Do the same for "Buffer".
 +const localBuffer = Buffer;
 +
- const isWindows = process.platform === 'win32';
- 
- const relativeResolveCache = ObjectCreate(null);
-@@ -1132,10 +1139,12 @@ Module.prototype._compile = function(content, filename) {
+ const {
+   isProxy
+ } = require('internal/util/types');
+@@ -1070,10 +1077,12 @@ Module.prototype._compile = function(content, filename) {
    if (requireDepth === 0) statCache = new Map();
    if (inspectorWrapper) {
      result = inspectorWrapper(compiledWrapper, thisValue, exports,

+ 17 - 17
patches/node/refactor_allow_embedder_overriding_of_internal_fs_calls.patch

@@ -7,10 +7,10 @@ We use this to allow node's 'fs' module to read from ASAR files as if they were
 a real filesystem.
 
 diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js
-index c872941b974216d94863bcbf0e597b9c09ca50e2..4e7c3c10255a0eae4d5333f88e51cf7178163a44 100644
+index 6d6ca2af629c41df68fe1a4652cf94fef30be038..e1f70addc28e4fe31d3a7089ecec3b5874dde75a 100644
 --- a/lib/internal/bootstrap/node.js
 +++ b/lib/internal/bootstrap/node.js
-@@ -57,6 +57,10 @@ setupBuffer();
+@@ -56,6 +56,10 @@ setupBuffer();
  process.domain = null;
  process._exiting = false;
  
@@ -20,21 +20,21 @@ index c872941b974216d94863bcbf0e597b9c09ca50e2..4e7c3c10255a0eae4d5333f88e51cf71
 +
  // process.config is serialized config.gypi
  process.config = JSONParse(internalBinding('native_module').config);
- 
+ require('internal/worker/js_transferable').setup();
 diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
-index 0ef46569924354ea3ef59f3220637e30b316a761..7d08fb05e9a0abeb82d416891968b23002dc3685 100644
+index cab75bce3624cc74a87283d86c30277c82292982..c633daa2b3557c98b05cca5f428d87775ef8a02a 100644
 --- a/lib/internal/modules/cjs/loader.js
 +++ b/lib/internal/modules/cjs/loader.js
-@@ -55,7 +55,7 @@ const assert = require('internal/assert');
- const fs = require('fs');
- const internalFS = require('internal/fs/utils');
+@@ -67,7 +67,7 @@ const internalFS = require('internal/fs/utils');
  const path = require('path');
+ const { sep } = path;
+ const { emitWarningSync } = require('internal/process/warning');
 -const { internalModuleStat } = internalBinding('fs');
 +const internalFsBinding = internalBinding('fs');
  const packageJsonReader = require('internal/modules/package_json_reader');
  const { safeGetenv } = internalBinding('credentials');
  const {
-@@ -147,7 +147,7 @@ function stat(filename) {
+@@ -159,7 +159,7 @@ function stat(filename) {
      const result = statCache.get(filename);
      if (result !== undefined) return result;
    }
@@ -44,7 +44,7 @@ index 0ef46569924354ea3ef59f3220637e30b316a761..7d08fb05e9a0abeb82d416891968b230
    return result;
  }
 diff --git a/lib/internal/modules/package_json_reader.js b/lib/internal/modules/package_json_reader.js
-index 066047b55eb9d82bc1eea66dc54aa68abd116b6b..4fcc65e235692d7d5fe2643571f006c593c4e173 100644
+index 25edfee027c35baba9d8add054895d0aa48bbafa..d545e24e72b2a6fb91b7aa35a576712e831ff937 100644
 --- a/lib/internal/modules/package_json_reader.js
 +++ b/lib/internal/modules/package_json_reader.js
 @@ -1,7 +1,7 @@
@@ -53,15 +53,15 @@ index 066047b55eb9d82bc1eea66dc54aa68abd116b6b..4fcc65e235692d7d5fe2643571f006c5
  const { SafeMap } = primordials;
 -const { internalModuleReadJSON } = internalBinding('fs');
 +const internalFsBinding = internalBinding('fs');
+ const { pathToFileURL } = require('url');
+ const { toNamespacedPath } = require('path');
  
- const cache = new SafeMap();
- 
-@@ -14,7 +14,7 @@ function read(path) {
-     return cache.get(path);
+@@ -16,7 +16,7 @@ function read(jsonPath) {
+     return cache.get(jsonPath);
    }
  
--  const [string, containsKeys] = internalModuleReadJSON(path);
-+  const [string, containsKeys] = internalFsBinding.internalModuleReadJSON(path);
+-  const [string, containsKeys] = internalModuleReadJSON(
++  const [string, containsKeys] = internalFsBinding.internalModuleReadJSON(
+     toNamespacedPath(jsonPath)
+   );
    const result = { string, containsKeys };
-   cache.set(path, result);
-   return result;

+ 2 - 2
patches/node/refactor_alter_child_process_fork_to_use_execute_script_with.patch

@@ -7,10 +7,10 @@ Subject: refactor: alter child_process.fork to use execute script with
 When forking a child script, we setup a special environment to make the Electron binary run like the upstream node. On Mac, we use the helper app as node binary.
 
 diff --git a/lib/child_process.js b/lib/child_process.js
-index 77bce9c386bb3f5f23a003e6e7290b2d84ac06e0..5ed166e1ed76b830c2d97f8170a4a72841201537 100644
+index 9e1c37af8f169f57891a5d814a31c02d91ec0cdc..17266798cbab11591fd6c18cf416fdcaa11568de 100644
 --- a/lib/child_process.js
 +++ b/lib/child_process.js
-@@ -110,6 +110,15 @@ function fork(modulePath /* , args, options */) {
+@@ -115,6 +115,15 @@ function fork(modulePath /* , args, options */) {
      throw new ERR_CHILD_PROCESS_IPC_REQUIRED('options.stdio');
    }
  

+ 0 - 79
patches/node/refactor_transferrablemodule_is_deprecated_use_compiledwasmmodule.patch

@@ -1,79 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Samuel Attard <[email protected]>
-Date: Mon, 2 Dec 2019 17:25:38 -0800
-Subject: refactor: TransferrableModule is deprecated, use CompiledWasmModule
- instead
-
-This is already present in Node.js v14 and can be removed when we upgrade.
-
-diff --git a/src/node_messaging.cc b/src/node_messaging.cc
-index f19e541bff08fb69209a50f4b21257de77efaf9f..f42ed9661500d862545c09cdb233ca8a99cafd35 100644
---- a/src/node_messaging.cc
-+++ b/src/node_messaging.cc
-@@ -56,7 +56,7 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
-       Environment* env,
-       const std::vector<MessagePort*>& message_ports,
-       const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers,
--      const std::vector<WasmModuleObject::TransferrableModule>& wasm_modules)
-+      const std::vector<v8::CompiledWasmModule>& wasm_modules)
-       : message_ports_(message_ports),
-         shared_array_buffers_(shared_array_buffers),
-         wasm_modules_(wasm_modules) {}
-@@ -80,7 +80,7 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
-   MaybeLocal<WasmModuleObject> GetWasmModuleFromId(
-       Isolate* isolate, uint32_t transfer_id) override {
-     CHECK_LE(transfer_id, wasm_modules_.size());
--    return WasmModuleObject::FromTransferrableModule(
-+    return WasmModuleObject::FromCompiledModule(
-         isolate, wasm_modules_[transfer_id]);
-   }
- 
-@@ -89,7 +89,7 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
-  private:
-   const std::vector<MessagePort*>& message_ports_;
-   const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers_;
--  const std::vector<WasmModuleObject::TransferrableModule>& wasm_modules_;
-+  const std::vector<v8::CompiledWasmModule>& wasm_modules_;
- };
- 
- }  // anonymous namespace
-@@ -179,7 +179,7 @@ void Message::AddMessagePort(std::unique_ptr<MessagePortData>&& data) {
-   message_ports_.emplace_back(std::move(data));
- }
- 
--uint32_t Message::AddWASMModule(WasmModuleObject::TransferrableModule&& mod) {
-+uint32_t Message::AddWASMModule(v8::CompiledWasmModule&& mod) {
-   wasm_modules_.emplace_back(std::move(mod));
-   return wasm_modules_.size() - 1;
- }
-@@ -276,7 +276,7 @@ class SerializerDelegate : public ValueSerializer::Delegate {
- 
-   Maybe<uint32_t> GetWasmModuleTransferId(
-       Isolate* isolate, Local<WasmModuleObject> module) override {
--    return Just(msg_->AddWASMModule(module->GetTransferrableModule()));
-+    return Just(msg_->AddWASMModule(module->GetCompiledModule()));
-   }
- 
-   void Finish() {
-diff --git a/src/node_messaging.h b/src/node_messaging.h
-index 43f710a84e831502bcfb574d2c456a0f9e815994..28986814b9f32ab310510f93ef9e6e97851e032d 100644
---- a/src/node_messaging.h
-+++ b/src/node_messaging.h
-@@ -58,7 +58,7 @@ class Message : public MemoryRetainer {
-   void AddMessagePort(std::unique_ptr<MessagePortData>&& data);
-   // Internal method of Message that is called when a new WebAssembly.Module
-   // object is encountered in the incoming value's structure.
--  uint32_t AddWASMModule(v8::WasmModuleObject::TransferrableModule&& mod);
-+  uint32_t AddWASMModule(v8::CompiledWasmModule&& mod);
- 
-   // The MessagePorts that will be transferred, as recorded by Serialize().
-   // Used for warning user about posting the target MessagePort to itself,
-@@ -77,7 +77,7 @@ class Message : public MemoryRetainer {
-   std::vector<MallocedBuffer<char>> array_buffer_contents_;
-   std::vector<SharedArrayBufferMetadataReference> shared_array_buffers_;
-   std::vector<std::unique_ptr<MessagePortData>> message_ports_;
--  std::vector<v8::WasmModuleObject::TransferrableModule> wasm_modules_;
-+  std::vector<v8::CompiledWasmModule> wasm_modules_;
- 
-   friend class MessagePort;
- };

+ 0 - 28
patches/node/remove_deprecated_task_api_override_removed_in_latest_v8.patch

@@ -1,28 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Andy Locascio <[email protected]>
-Date: Thu, 9 Jan 2020 15:48:36 -0800
-Subject: remove deprecated task API override removed in latest v8
-
-This is already present in Node.js v14 and can be removed when we upgrade.
-
-CL: https://chromium-review.googlesource.com/c/v8/v8/+/1868620
-
-diff --git a/src/node_platform.h b/src/node_platform.h
-index 533ae1bcca824837aca327d4ff8f122da12d94f0..3c855afeb4019adfb5389721357abe3cd620a01c 100644
---- a/src/node_platform.h
-+++ b/src/node_platform.h
-@@ -148,14 +148,6 @@ class NodePlatform : public MultiIsolatePlatform {
-   void CallOnWorkerThread(std::unique_ptr<v8::Task> task) override;
-   void CallDelayedOnWorkerThread(std::unique_ptr<v8::Task> task,
-                                  double delay_in_seconds) override;
--  void CallOnForegroundThread(v8::Isolate* isolate, v8::Task* task) override {
--    UNREACHABLE();
--  }
--  void CallDelayedOnForegroundThread(v8::Isolate* isolate,
--                                     v8::Task* task,
--                                     double delay_in_seconds) override {
--    UNREACHABLE();
--  }
-   bool IdleTasksEnabled(v8::Isolate* isolate) override;
-   double MonotonicallyIncreasingTime() override;
-   double CurrentClockTimeMillis() override;

+ 0 - 36
patches/node/remove_deprecated_wasm_module_type_check.patch

@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: deepak1556 <[email protected]>
-Date: Sun, 1 Mar 2020 00:25:19 -0800
-Subject: Remove deprecated wasm module type check
-
-The method was deprecated in favor of {IsWasmModuleObject}.
-https://chromium-review.googlesource.com/c/v8/v8/+/2033170
-
-This is already present in Node.js v14 and can be removed when we upgrade.
-
-diff --git a/src/node_types.cc b/src/node_types.cc
-index a53bcba555448fd99d582da7dc0c7af528627ca5..e816e0af54d1cf52f2af9ded49e25625b782d5be 100644
---- a/src/node_types.cc
-+++ b/src/node_types.cc
-@@ -35,7 +35,7 @@ namespace {
-   V(DataView)                                                                 \
-   V(SharedArrayBuffer)                                                        \
-   V(Proxy)                                                                    \
--  V(WebAssemblyCompiledModule)                                                \
-+  V(WasmModuleObject)                                                         \
-   V(ModuleNamespaceObject)                                                    \
- 
- 
-diff --git a/test/parallel/test-util-types.js b/test/parallel/test-util-types.js
-index 6a9bad016993339dccf8b90e1c0cf4e9d09adcc2..ddf1af8c9183dc61bac9a8bd662edec6459d253e 100644
---- a/test/parallel/test-util-types.js
-+++ b/test/parallel/test-util-types.js
-@@ -50,7 +50,7 @@ for (const [ value, _method ] of [
-   [ new DataView(new ArrayBuffer()) ],
-   [ new SharedArrayBuffer() ],
-   [ new Proxy({}, {}), 'isProxy' ],
--  [ new WebAssembly.Module(wasmBuffer), 'isWebAssemblyCompiledModule' ],
-+  [ new WebAssembly.Module(wasmBuffer), 'isWasmModuleObject' ],
- ]) {
-   const method = _method || `is${value.constructor.name}`;
-   assert(method in types, `Missing ${method} for ${inspect(value)}`);

+ 0 - 34
patches/node/remove_serialization_deserialization_of_wasmmoduleobject.patch

@@ -1,34 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: John Kleinschmidt <[email protected]>
-Date: Tue, 28 Jan 2020 12:12:28 -0500
-Subject: Remove serialization/deserialization of WasmModuleObject
-
-This is already present in Node.js v14 and can be removed when we upgrade.
-
-Serialization of WasmModuleObject was removed here:
-https://chromium.googlesource.com/v8/v8/+/30e4ba6df4cdf5582de4d79850bcd270e6a75a7a
-
-diff --git a/test/parallel/test-v8-serdes.js b/test/parallel/test-v8-serdes.js
-index a992ba42ce46bfcdccdca997ee13718086d3256d..62096edec540ec3dd70e56fee53b9813b2ebbbfc 100644
---- a/test/parallel/test-v8-serdes.js
-+++ b/test/parallel/test-v8-serdes.js
-@@ -23,8 +23,7 @@ const objects = [
-   undefined,
-   null,
-   42,
--  circular,
--  wasmModule
-+  circular
- ];
- 
- const hostObject = new (internalBinding('js_stream').JSStream)();
-@@ -236,9 +235,3 @@ const deserializerTypeError =
-     /^TypeError: buffer must be a TypedArray or a DataView$/,
-   );
- }
--
--{
--  const deserializedWasmModule = v8.deserialize(v8.serialize(wasmModule));
--  const instance = new WebAssembly.Instance(deserializedWasmModule);
--  assert.strictEqual(instance.exports.add(10, 20), 30);
--}

+ 2 - 2
patches/node/revert_crypto_add_oaeplabel_option.patch

@@ -8,10 +8,10 @@ The BoringSSL incompatibilities (OPENSSL_memdup) will be shimmed in and this sho
 be removed when the associated update is rolled into Chromium.
 
 diff --git a/src/node_crypto.cc b/src/node_crypto.cc
-index 82afaee6e2b929faac76fc5d930a8c0fd6558df3..ce64dbca7ce6555bd37d3b6f85ecf41a98e3dd29 100644
+index fc780a4387c9a838a80b063276043f6087ce8259..43bdb88d48324cf8b206c711d3c3133f147aba24 100644
 --- a/src/node_crypto.cc
 +++ b/src/node_crypto.cc
-@@ -5014,18 +5014,6 @@ bool PublicKeyCipher::Cipher(Environment* env,
+@@ -5055,18 +5055,6 @@ bool PublicKeyCipher::Cipher(Environment* env,
        return false;
    }
  

+ 80 - 0
patches/node/test_make_some_tests_embedder_agnostic.patch

@@ -0,0 +1,80 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Shelley Vohr <[email protected]>
+Date: Thu, 3 Sep 2020 13:35:35 -0700
+Subject: test: make some tests embedder agnostic
+
+Make the .out checks process-agnostic.
+
+Upstreamed at https://github.com/nodejs/node/pull/35040.
+
+diff --git a/test/message/esm_loader_not_found.out b/test/message/esm_loader_not_found.out
+index 60abb529a3c87152087f4a2c52f79ac5dfdf7f25..26292512d9b00225100d2af91f0f7507072099e2 100644
+--- a/test/message/esm_loader_not_found.out
++++ b/test/message/esm_loader_not_found.out
+@@ -1,5 +1,5 @@
+ (node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
+-(Use `node --trace-warnings ...` to show where the warning was created)
++(Use `* --trace-warnings ...` to show where the warning was created)
+ internal/process/esm_loader.js:*
+     internalBinding('errors').triggerUncaughtException(
+                               ^
+diff --git a/test/message/esm_loader_not_found_cjs_hint_relative.out b/test/message/esm_loader_not_found_cjs_hint_relative.out
+index f7460c31416dc97ca971d5a88cc8d424276f6d42..1c43c0d3a2eb31e31fbb2cf2496e2bd0ef3bea1d 100644
+--- a/test/message/esm_loader_not_found_cjs_hint_relative.out
++++ b/test/message/esm_loader_not_found_cjs_hint_relative.out
+@@ -1,5 +1,5 @@
+ (node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
+-(Use `node --trace-warnings ...` to show where the warning was created)
++(Use `* --trace-warnings ...` to show where the warning was created)
+ internal/process/esm_loader.js:*
+     internalBinding('errors').triggerUncaughtException(
+                               ^
+diff --git a/test/message/esm_loader_syntax_error.out b/test/message/esm_loader_syntax_error.out
+index 6201de95208ff3e08c58cfe2cab5bcda2218fbf3..d6c6df0a338c848127ba0cfa11a98d13b0326848 100644
+--- a/test/message/esm_loader_syntax_error.out
++++ b/test/message/esm_loader_syntax_error.out
+@@ -1,5 +1,5 @@
+ (node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
+-(Use `node --trace-warnings ...` to show where the warning was created)
++(Use `* --trace-warnings ...` to show where the warning was created)
+ file://*/test/fixtures/es-module-loaders/syntax-error.mjs:2
+ await async () => 0;
+ ^^^^^^^^^^^^^
+diff --git a/test/message/promise_unhandled_warn_with_error.out b/test/message/promise_unhandled_warn_with_error.out
+index b539adb2d1e76931a41f73b606c6e1611b998883..66c98c57f71717046d26e6672897030dfd770da6 100644
+--- a/test/message/promise_unhandled_warn_with_error.out
++++ b/test/message/promise_unhandled_warn_with_error.out
+@@ -6,5 +6,5 @@
+     at *
+     at *
+     at *
+-(Use `node --trace-warnings ...` to show where the warning was created)
++(Use `* --trace-warnings ...` to show where the warning was created)
+ *UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
+\ No newline at end of file
+diff --git a/test/pseudo-tty/test-tty-color-support-warning-2.out b/test/pseudo-tty/test-tty-color-support-warning-2.out
+index d17fa99b96974a54ad443a37b5f828fe7bd33152..37b470a5f108f9cffc8a08cfb15bf04bbea4d9d5 100644
+--- a/test/pseudo-tty/test-tty-color-support-warning-2.out
++++ b/test/pseudo-tty/test-tty-color-support-warning-2.out
+@@ -1,3 +1,3 @@
+ 
+ (node:*) Warning: The 'NODE_DISABLE_COLORS' env is ignored due to the 'FORCE_COLOR' env being set.
+-(Use `node --trace-warnings ...` to show where the warning was created)
++(Use `* --trace-warnings ...` to show where the warning was created)
+diff --git a/test/pseudo-tty/test-tty-color-support-warning.out b/test/pseudo-tty/test-tty-color-support-warning.out
+index 7a9df4725486d28062ebbcfa4269bf543a051c00..b25d2e42cf7244a6513de2f29c2f647d91983782 100644
+--- a/test/pseudo-tty/test-tty-color-support-warning.out
++++ b/test/pseudo-tty/test-tty-color-support-warning.out
+@@ -1,3 +1,3 @@
+ 
+ (node:*) Warning: The 'NODE_DISABLE_COLORS' and 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
+-(Use `node --trace-warnings ...` to show where the warning was created)
++(Use `* --trace-warnings ...` to show where the warning was created)
+diff --git a/test/pseudo-tty/test-tty-color-support.out b/test/pseudo-tty/test-tty-color-support.out
+index 86ed488ee8c1b292c43434f869e19d190e19cf66..df5831c555be1914e28986df62bbb4421a29d68a 100644
+--- a/test/pseudo-tty/test-tty-color-support.out
++++ b/test/pseudo-tty/test-tty-color-support.out
+@@ -1,2 +1,2 @@
+ (node:*) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
+-(Use `node --trace-warnings ...` to show where the warning was created)
++(Use `* --trace-warnings ...` to show where the warning was created)

+ 0 - 48
patches/node/weakrefs_rename_finalizationgroup_to_finalizationregistry_for_js.patch

@@ -1,48 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: deepak1556 <[email protected]>
-Date: Sun, 1 Mar 2020 13:59:57 -0800
-Subject: Rename FinalizationGroup to FinalizationRegistry for JS
-
-https://chromium-review.googlesource.com/c/v8/v8/+/2071236
-
-This is already present in Node.js v14 and can be removed when we upgrade.
-
-diff --git a/test/parallel/test-finalization-group-error.js b/test/parallel/test-finalization-group-error.js
-index 0685811f55b7f8efc88e04ffd5e173ed7d415258..46a670073b1dbba9729e54166378991a7edba5a0 100644
---- a/test/parallel/test-finalization-group-error.js
-+++ b/test/parallel/test-finalization-group-error.js
-@@ -5,7 +5,7 @@
- const common = require('../common');
- const assert = require('assert');
- 
--const g = new globalThis.FinalizationGroup(common.mustCallAtLeast(() => {
-+const g = new globalThis.FinalizationRegistry(common.mustCallAtLeast(() => {
-   throw new Error('test');
- }, 1));
- g.register({}, 42);
-diff --git a/test/parallel/test-finalization-group-regular-gc.js b/test/parallel/test-finalization-group-regular-gc.js
-index 7a4a4797eadcf02867ad30c20b37060fa7abb5fb..3c16cfcee23e971fde8793a0478a819d3fc59d90 100644
---- a/test/parallel/test-finalization-group-regular-gc.js
-+++ b/test/parallel/test-finalization-group-regular-gc.js
-@@ -7,7 +7,7 @@ const assert = require('assert');
- // GC (not global.gc()).
- 
- const start = Date.now();
--const g = new globalThis.FinalizationGroup(() => {
-+const g = new globalThis.FinalizationRegistry(() => {
-   const diff = Date.now() - start;
-   assert(diff < 10000, `${diff} >= 10000`);
- });
-diff --git a/test/parallel/test-finalization-group.js b/test/parallel/test-finalization-group.js
-index 3e6b9d72e356480e2b78f0b336f252d0eec641d4..4b9357e4d18e6c21d53fc6534f5af1f98805b150 100644
---- a/test/parallel/test-finalization-group.js
-+++ b/test/parallel/test-finalization-group.js
-@@ -4,7 +4,7 @@
- 
- const common = require('../common');
- 
--const g = new globalThis.FinalizationGroup(common.mustCallAtLeast(1));
-+const g = new globalThis.FinalizationRegistry(common.mustCallAtLeast(1));
- g.register({}, 42);
- 
- setTimeout(() => {

+ 0 - 33
patches/node/weakrefs_split_out_finalizationregistry_cleanupsome.patch

@@ -1,33 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: deepak1556 <[email protected]>
-Date: Sun, 12 Apr 2020 15:58:34 -0700
-Subject: Split out FinalizationRegistry#cleanupSome to a different flag
-
-https://chromium-review.googlesource.com/c/v8/v8/+/2141011
-
-This is already present in Node.js v14 and can be removed when we upgrade.
-
-diff --git a/test/parallel/test-finalization-group-error.js b/test/parallel/test-finalization-group-error.js
-index 46a670073b1dbba9729e54166378991a7edba5a0..0857bedd043f0436bddc6d8641c51e78a8b4c562 100644
---- a/test/parallel/test-finalization-group-error.js
-+++ b/test/parallel/test-finalization-group-error.js
-@@ -1,6 +1,6 @@
- 'use strict';
- 
--// Flags: --expose-gc --harmony-weak-refs
-+// Flags: --expose-gc --harmony-weak-refs-with-cleanup-some
- 
- const common = require('../common');
- const assert = require('assert');
-diff --git a/test/parallel/test-finalization-group.js b/test/parallel/test-finalization-group.js
-index 4b9357e4d18e6c21d53fc6534f5af1f98805b150..95d36cd3506503b99d4b950b6b1caaf8be96b9e9 100644
---- a/test/parallel/test-finalization-group.js
-+++ b/test/parallel/test-finalization-group.js
-@@ -1,6 +1,6 @@
- 'use strict';
- 
--// Flags: --expose-gc --harmony-weak-refs
-+// Flags: --expose-gc --harmony-weak-refs-with-cleanup-some
- 
- const common = require('../common');
- 

+ 1 - 1
script/gen-filenames.ts

@@ -101,7 +101,7 @@ ${target.dependencies.map(dep => `    "${dep}",`).join('\n')}
 `);
 };
 
-if (process.mainModule === module) {
+if (require.main === module) {
   main().catch((err) => {
     console.error(err);
     process.exit(1);

+ 1 - 0
script/node-disabled-tests.json

@@ -47,6 +47,7 @@
   "parallel/test-https-agent-session-reuse",
   "parallel/test-http2-reset-flood",
   "parallel/test-https-options-boolean-check",
+  "parallel/test-inspector-inspect-brk-node",
   "parallel/test-inspector-multisession-ws",
   "parallel/test-inspector-port-zero-cluster",
   "parallel/test-inspector-tracing-domain",

+ 9 - 9
shell/app/node_main.cc

@@ -198,13 +198,17 @@ int NodeMain(int argc, char* argv[]) {
       isolate_data = node::CreateIsolateData(isolate, loop, gin_env.platform());
       CHECK_NE(nullptr, isolate_data);
 
-      env = node::CreateEnvironment(isolate_data, gin_env.context(), argc, argv,
-                                    exec_argc, exec_argv);
+      uint64_t flags = node::EnvironmentFlags::kDefaultFlags |
+                       node::EnvironmentFlags::kNoInitializeInspector;
+
+      std::vector<std::string> args(argv, argv + argc);  // NOLINT
+      std::vector<std::string> exec_args(exec_argv,
+                                         exec_argv + exec_argc);  // NOLINT
+      env = node::CreateEnvironment(isolate_data, gin_env.context(), args,
+                                    exec_args,
+                                    (node::EnvironmentFlags::Flags)flags);
       CHECK_NE(nullptr, env);
 
-      // This needs to be called before the inspector is initialized.
-      env->InitializeDiagnostics();
-
       node::IsolateSettings is;
       node::SetIsolateUpForNode(isolate, is);
 
@@ -285,10 +289,6 @@ int NodeMain(int argc, char* argv[]) {
     node::ResetStdio();
 
     node::Stop(env);
-    env->stop_sub_worker_contexts();
-    env->RunCleanup();
-
-    node::RunAtExit(env);
     node::FreeEnvironment(env);
     node::FreeIsolateData(isolate_data);
 

+ 0 - 2
shell/browser/javascript_environment.cc

@@ -281,8 +281,6 @@ void JavascriptEnvironment::OnMessageLoopDestroying() {
     gin_helper::CleanedUpAtExit::DoCleanup();
   }
   base::CurrentThread::Get()->RemoveTaskObserver(microtasks_runner_.get());
-  platform_->DrainTasks(isolate_);
-  platform_->UnregisterIsolate(isolate_);
 }
 
 NodeEnvironment::NodeEnvironment(node::Environment* env) : env_(env) {}

+ 14 - 22
shell/common/node_bindings.cc

@@ -246,18 +246,6 @@ namespace electron {
 
 namespace {
 
-// Convert the given vector to an array of C-strings. The strings in the
-// returned vector are only guaranteed valid so long as the vector of strings
-// is not modified.
-std::unique_ptr<const char* []> StringVectorToArgArray(
-    const std::vector<std::string>& vector) {
-  std::unique_ptr<const char*[]> array(new const char*[vector.size()]);
-  for (size_t i = 0; i < vector.size(); ++i) {
-    array[i] = vector[i].c_str();
-  }
-  return array;
-}
-
 base::FilePath GetResourcesPath() {
 #if defined(OS_MAC)
   return MainApplicationBundlePath().Append("Contents").Append("Resources");
@@ -394,21 +382,28 @@ node::Environment* NodeBindings::CreateEnvironment(
   if (browser_env_ != BrowserEnvironment::BROWSER)
     global.Set("_noBrowserGlobals", true);
 
+  std::vector<std::string> exec_args;
   base::FilePath resources_path = GetResourcesPath();
   std::string init_script = "electron/js2c/" + process_type + "_init";
 
   args.insert(args.begin() + 1, init_script);
 
-  std::unique_ptr<const char*[]> c_argv = StringVectorToArgArray(args);
   isolate_data_ =
       node::CreateIsolateData(context->GetIsolate(), uv_loop_, platform);
 
   node::Environment* env;
+  uint64_t flags = node::EnvironmentFlags::kDefaultFlags |
+                   node::EnvironmentFlags::kNoInitializeInspector;
   if (browser_env_ != BrowserEnvironment::BROWSER) {
+    // Only one ESM loader can be registered per isolate -
+    // in renderer processes this should be blink. We need to tell Node.js
+    // not to register its handler (overriding blinks) in non-browser processes.
+    flags |= node::EnvironmentFlags::kNoRegisterESMLoader;
     v8::TryCatch try_catch(context->GetIsolate());
-    env = node::CreateEnvironment(isolate_data_, context, args.size(),
-                                  c_argv.get(), 0, nullptr);
+    env = node::CreateEnvironment(isolate_data_, context, args, exec_args,
+                                  (node::EnvironmentFlags::Flags)flags);
     DCHECK(env);
+
     // This will only be caught when something has gone terrible wrong as all
     // electron scripts are wrapped in a try {} catch {} in run-compiler.js
     if (try_catch.HasCaught()) {
@@ -416,8 +411,8 @@ node::Environment* NodeBindings::CreateEnvironment(
                  << process_type;
     }
   } else {
-    env = node::CreateEnvironment(isolate_data_, context, args.size(),
-                                  c_argv.get(), 0, nullptr);
+    env = node::CreateEnvironment(isolate_data_, context, args, exec_args,
+                                  (node::EnvironmentFlags::Flags)flags);
     DCHECK(env);
   }
 
@@ -450,13 +445,10 @@ node::Environment* NodeBindings::CreateEnvironment(
     // We do not want to use the promise rejection callback that Node.js uses,
     // because it does not send PromiseRejectionEvents to the global script
     // context. We need to use the one Blink already provides.
-    is.flags &=
-        ~node::IsolateSettingsFlags::SHOULD_SET_PROMISE_REJECTION_CALLBACK;
+    is.flags |=
+        node::IsolateSettingsFlags::SHOULD_NOT_SET_PROMISE_REJECTION_CALLBACK;
   }
 
-  // This needs to be called before the inspector is initialized.
-  env->InitializeDiagnostics();
-
   node::SetIsolateUpForNode(context->GetIsolate(), is);
 
   gin_helper::Dictionary process(context->GetIsolate(), env->process_object());

+ 2 - 0
shell/common/node_includes.h

@@ -59,6 +59,7 @@
 
 #undef debug_string    // This is defined in macOS SDK in AssertMacros.h.
 #undef require_string  // This is defined in macOS SDK in AssertMacros.h.
+
 #include "env-inl.h"
 #include "env.h"
 #include "node.h"
@@ -67,6 +68,7 @@
 #include "node_options-inl.h"
 #include "node_options.h"
 #include "node_platform.h"
+#include "tracing/agent.h"
 
 // Alternative to NODE_MODULE_CONTEXT_AWARE_X.
 // Allows to explicitly register builtin modules instead of using

+ 0 - 1
shell/renderer/electron_renderer_client.cc

@@ -178,7 +178,6 @@ void ElectronRendererClient::WillReleaseScriptContext(
   if (command_line->HasSwitch(switches::kNodeIntegrationInSubFrames) ||
       command_line->HasSwitch(
           switches::kDisableElectronSiteInstanceOverrides)) {
-    node::RunAtExit(env);
     node::FreeEnvironment(env);
     if (env == node_bindings_->uv_env())
       node::FreeIsolateData(node_bindings_->isolate_data());

+ 1 - 1
spec-main/api-context-bridge-spec.ts

@@ -375,7 +375,7 @@ describe('contextBridge', () => {
       if (!useSandbox) {
         it('should release the global hold on methods sent across contexts', async () => {
           await makeBindingWindow(() => {
-            require('electron').ipcRenderer.on('get-gc-info', e => e.sender.send('gc-info', { trackedValues: process._linkedBinding('electron_common_v8_util').getWeaklyTrackedValues().length }));
+            require('electron').ipcRenderer.on('get-gc-info', (e: Electron.IpcRendererEvent) => e.sender.send('gc-info', { trackedValues: process._linkedBinding('electron_common_v8_util').getWeaklyTrackedValues().length }));
             const { weaklyTrackValue } = process._linkedBinding('electron_common_v8_util');
             contextBridge.exposeInMainWorld('example', {
               getFunction: () => () => 123,

+ 6 - 6
spec-main/api-ipc-spec.ts

@@ -285,7 +285,7 @@ describe('ipc module', () => {
           w.loadURL('about:blank');
           await w.webContents.executeJavaScript(`(${function () {
             const { ipcRenderer } = require('electron');
-            ipcRenderer.on('port', (e) => {
+            ipcRenderer.on('port', e => {
               const [port] = e.ports;
               port.start();
               (port as any).onclose = () => {
@@ -349,7 +349,7 @@ describe('ipc module', () => {
         w.loadURL('about:blank');
         await w.webContents.executeJavaScript(`(${function () {
           const { ipcRenderer } = require('electron');
-          ipcRenderer.on('port', (ev) => {
+          ipcRenderer.on('port', ev => {
             const [port] = ev.ports;
             port.onmessage = () => {
               ipcRenderer.send('done');
@@ -367,9 +367,9 @@ describe('ipc module', () => {
         w.loadURL('about:blank');
         await w.webContents.executeJavaScript(`(${function () {
           const { ipcRenderer } = require('electron');
-          ipcRenderer.on('port', (e1) => {
-            e1.ports[0].onmessage = (e2) => {
-              e2.ports[0].onmessage = (e3) => {
+          ipcRenderer.on('port', e1 => {
+            e1.ports[0].onmessage = e2 => {
+              e2.ports[0].onmessage = e3 => {
                 ipcRenderer.send('done', e3.data);
               };
             };
@@ -455,7 +455,7 @@ describe('ipc module', () => {
         w.loadURL('about:blank');
         await w.webContents.executeJavaScript(`(${function () {
           const { ipcRenderer } = require('electron');
-          ipcRenderer.on('foo', (e, msg) => {
+          ipcRenderer.on('foo', (_e, msg) => {
             ipcRenderer.send('bar', msg);
           });
         }})()`);

+ 8 - 2
spec-main/api-remote-spec.ts

@@ -498,11 +498,17 @@ ifdescribe(features.isRemoteModuleEnabled())('remote module', () => {
 
     it('should search module from the user app', async () => {
       expectPathsEqual(
-        path.normalize(await remotely(() => require('electron').remote.process.mainModule!.filename)),
+        path.normalize(await remotely(() => {
+          const { remote } = require('electron');
+          return (remote as any).process.mainModule.filename;
+        })),
         path.resolve(__dirname, 'index.js')
       );
       expectPathsEqual(
-        path.normalize(await remotely(() => require('electron').remote.process.mainModule!.paths[0])),
+        path.normalize(await remotely(() => {
+          const { remote } = require('electron');
+          return (remote as any).process.mainModule.paths[0];
+        })),
         path.resolve(__dirname, 'node_modules')
       );
     });

+ 5 - 7
spec/ts-smoke/electron/main.ts

@@ -1068,21 +1068,19 @@ shell.writeShortcutLink('/home/user/Desktop/shortcut.lnk', 'update', shell.readS
 // cookies
 // https://github.com/electron/electron/blob/master/docs/api/cookies.md
 {
-  const { session } = require('electron')
-
   // Query all cookies.
   session.defaultSession.cookies.get({})
-    .then((cookies) => {
+    .then(cookies => {
       console.log(cookies)
-    }).catch((error) => {
+    }).catch((error: Error) => {
       console.log(error)
     })
 
   // Query all cookies associated with a specific url.
   session.defaultSession.cookies.get({ url: 'http://www.github.com' })
-    .then((cookies) => {
+    .then(cookies => {
       console.log(cookies)
-    }).catch((error) => {
+    }).catch((error: Error) => {
       console.log(error)
     })
 
@@ -1092,7 +1090,7 @@ shell.writeShortcutLink('/home/user/Desktop/shortcut.lnk', 'update', shell.readS
   session.defaultSession.cookies.set(cookie)
     .then(() => {
       // success
-    }, (error) => {
+    }, (error: Error) => {
       console.error(error)
     })
 }

+ 5 - 6
spec/ts-smoke/electron/renderer.ts

@@ -1,5 +1,6 @@
 
 import {
+  desktopCapturer,
   ipcRenderer,
   remote,
   webFrame,
@@ -33,16 +34,16 @@ remote.getCurrentWindow().on('close', () => {
   // blabla...
 })
 
-remote.getCurrentWindow().capturePage().then(buf => {
-  fs.writeFile('/tmp/screenshot.png', buf, err => {
+remote.getCurrentWindow().capturePage().then(image => {
+  fs.writeFile('/tmp/screenshot.png', image.toBitmap(), err => {
     console.log(err)
   })
 })
 
 remote.getCurrentWebContents().print()
 
-remote.getCurrentWindow().capturePage().then(buf => {
-  remote.require('fs').writeFile('/tmp/screenshot.png', buf, (err: Error) => {
+remote.getCurrentWindow().capturePage().then(image => {
+  remote.require('fs').writeFile('/tmp/screenshot.png', image.toBitmap(), (err: Error) => {
     console.log(err)
   })
 })
@@ -107,8 +108,6 @@ crashReporter.start({
 // desktopCapturer
 // https://github.com/electron/electron/blob/master/docs/api/desktop-capturer.md
 
-const desktopCapturer = require('electron').desktopCapturer
-
 desktopCapturer.getSources({ types: ['window', 'screen'] }).then(sources => {
   for (let i = 0; i < sources.length; ++i) {
     if (sources[i].name == 'Electron') {

+ 8 - 8
yarn.lock

@@ -33,10 +33,10 @@
     ora "^4.0.3"
     pretty-ms "^5.1.0"
 
-"@electron/typescript-definitions@^8.7.8":
-  version "8.7.8"
-  resolved "https://registry.yarnpkg.com/@electron/typescript-definitions/-/typescript-definitions-8.7.8.tgz#31d5c79889bc0671fb2c3452cb061682f595f9be"
-  integrity sha512-B5fG7X1IZU4R20fGpZFLqfNTMJIDrprBAkYYlRzMTGgI74hMxVdcS1HU1eCGRiJISe/pznUS0QYJa7BpuYx+cA==
+"@electron/typescript-definitions@^8.7.9":
+  version "8.7.9"
+  resolved "https://registry.yarnpkg.com/@electron/typescript-definitions/-/typescript-definitions-8.7.9.tgz#6fe8856341e9ff77af803a9094be92759518c926"
+  integrity sha512-fiJr1KDR1auWTBfggMTRK/ouhHZV2iVumitkkNIA7NKONlVPLtcYf6/JgkWDla+y4CUTzM7M7R5AVSE0f/RuYA==
   dependencies:
     "@types/node" "^11.13.7"
     chalk "^2.4.2"
@@ -347,10 +347,10 @@
   resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.22.tgz#91ee88ebfa25072433497f6f3150f84fa8c3a91b"
   integrity sha512-rOsaPRUGTOXbRBOKToy4cgZXY4Y+QSVhxcLwdEveozbk7yuudhWMpxxcaXqYizLMP3VY7OcWCFtx9lGFh5j5kg==
 
-"@types/node@^12.12.6":
-  version "12.12.30"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.30.tgz#3501e6f09b954de9c404671cefdbcc5d9d7c45f6"
-  integrity sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==
+"@types/node@^14.6.2":
+  version "14.6.3"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.3.tgz#cc4f979548ca4d8e7b90bc0180052ab99ee64224"
+  integrity sha512-pC/hkcREG6YfDfui1FBmj8e20jFU5Exjw4NYDm8kEdrW+mOh0T1Zve8DWKnS7ZIZvgncrctcNCXF4Q2I+loyww==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.0"