2023-08-31 00:38:07 +00:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Samuel Attard <marshallofsound@electronjs.org>
|
|
|
|
Date: Wed, 8 Mar 2023 13:02:17 -0800
|
|
|
|
Subject: chore: expose ImportModuleDynamically and
|
|
|
|
HostInitializeImportMetaObjectCallback to embedders
|
|
|
|
|
|
|
|
This also subtly changes the behavior of shouldNotRegisterESMLoader to ensure that node sets up the handlers
|
|
|
|
internally but simply avoids setting its own handlers on the Isolate. This is so that Electron can set it to
|
|
|
|
its own blended handler between Node and Blink.
|
|
|
|
|
|
|
|
Not upstreamable.
|
|
|
|
|
2023-11-30 14:51:35 +00:00
|
|
|
diff --git a/lib/internal/modules/esm/utils.js b/lib/internal/modules/esm/utils.js
|
2024-04-17 16:39:13 +00:00
|
|
|
index 39e87338dc5a799a8a30bd2399b8ec5d6b554fad..7b1939fa25379b333f2be07f4ff483f53d8a2ac6 100644
|
2023-11-30 14:51:35 +00:00
|
|
|
--- a/lib/internal/modules/esm/utils.js
|
|
|
|
+++ b/lib/internal/modules/esm/utils.js
|
2024-04-17 16:39:13 +00:00
|
|
|
@@ -24,7 +24,7 @@ const {
|
2023-11-30 14:51:35 +00:00
|
|
|
ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING,
|
|
|
|
ERR_INVALID_ARG_VALUE,
|
|
|
|
} = require('internal/errors').codes;
|
|
|
|
-const { getOptionValue } = require('internal/options');
|
|
|
|
+const { getOptionValue, getEmbedderOptions } = require('internal/options');
|
|
|
|
const {
|
|
|
|
loadPreloadModules,
|
|
|
|
initializeFrozenIntrinsics,
|
2024-04-17 16:39:13 +00:00
|
|
|
@@ -239,12 +239,13 @@ let _forceDefaultLoader = false;
|
2024-01-18 21:16:45 +00:00
|
|
|
* @param {boolean} [forceDefaultLoader=false] - A boolean indicating disabling custom loaders.
|
2023-12-11 20:09:50 +00:00
|
|
|
*/
|
2024-01-18 21:16:45 +00:00
|
|
|
function initializeESM(forceDefaultLoader = false) {
|
2023-08-31 00:38:07 +00:00
|
|
|
+ const shouldSetOnIsolate = !getEmbedderOptions().shouldNotRegisterESMLoader;
|
2024-01-18 21:16:45 +00:00
|
|
|
_forceDefaultLoader = forceDefaultLoader;
|
2023-11-30 14:51:35 +00:00
|
|
|
initializeDefaultConditions();
|
2024-01-18 21:16:45 +00:00
|
|
|
// Setup per-realm callbacks that locate data or callbacks that we keep
|
2023-08-31 00:38:07 +00:00
|
|
|
// track of for different ESM modules.
|
2023-11-30 14:51:35 +00:00
|
|
|
- setInitializeImportMetaObjectCallback(initializeImportMetaObject);
|
|
|
|
- setImportModuleDynamicallyCallback(importModuleDynamicallyCallback);
|
|
|
|
+ setInitializeImportMetaObjectCallback(initializeImportMetaObject, shouldSetOnIsolate);
|
|
|
|
+ setImportModuleDynamicallyCallback(importModuleDynamicallyCallback, shouldSetOnIsolate);
|
|
|
|
}
|
2023-08-31 00:38:07 +00:00
|
|
|
|
2023-12-11 20:09:50 +00:00
|
|
|
/**
|
2023-08-31 00:38:07 +00:00
|
|
|
diff --git a/src/module_wrap.cc b/src/module_wrap.cc
|
2024-04-17 16:39:13 +00:00
|
|
|
index 501e4d7b7ea180588737fcbb2bf6ff79abfb9d9a..cce67100588bf6b47d26ee9168a123cb813b822e 100644
|
2023-08-31 00:38:07 +00:00
|
|
|
--- a/src/module_wrap.cc
|
|
|
|
+++ b/src/module_wrap.cc
|
2024-04-17 16:39:13 +00:00
|
|
|
@@ -561,7 +561,7 @@ MaybeLocal<Module> ModuleWrap::ResolveModuleCallback(
|
2023-08-31 00:38:07 +00:00
|
|
|
return module->module_.Get(isolate);
|
|
|
|
}
|
|
|
|
|
|
|
|
-static MaybeLocal<Promise> ImportModuleDynamically(
|
|
|
|
+MaybeLocal<Promise> ImportModuleDynamically(
|
|
|
|
Local<Context> context,
|
|
|
|
Local<v8::Data> host_defined_options,
|
|
|
|
Local<Value> resource_name,
|
2024-04-17 16:39:13 +00:00
|
|
|
@@ -626,12 +626,13 @@ void ModuleWrap::SetImportModuleDynamicallyCallback(
|
2024-01-18 21:16:45 +00:00
|
|
|
Realm* realm = Realm::GetCurrent(args);
|
2023-08-31 00:38:07 +00:00
|
|
|
HandleScope handle_scope(isolate);
|
|
|
|
|
|
|
|
- CHECK_EQ(args.Length(), 1);
|
|
|
|
+ CHECK_EQ(args.Length(), 2);
|
|
|
|
CHECK(args[0]->IsFunction());
|
|
|
|
Local<Function> import_callback = args[0].As<Function>();
|
2024-01-18 21:16:45 +00:00
|
|
|
realm->set_host_import_module_dynamically_callback(import_callback);
|
2023-08-31 00:38:07 +00:00
|
|
|
|
|
|
|
- isolate->SetHostImportModuleDynamicallyCallback(ImportModuleDynamically);
|
|
|
|
+ if (args[1]->IsBoolean() && args[1]->BooleanValue(isolate))
|
|
|
|
+ isolate->SetHostImportModuleDynamicallyCallback(ImportModuleDynamically);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModuleWrap::HostInitializeImportMetaObjectCallback(
|
2024-04-17 16:39:13 +00:00
|
|
|
@@ -673,13 +674,14 @@ void ModuleWrap::SetInitializeImportMetaObjectCallback(
|
2024-01-18 21:16:45 +00:00
|
|
|
Realm* realm = Realm::GetCurrent(args);
|
|
|
|
Isolate* isolate = realm->isolate();
|
2023-08-31 00:38:07 +00:00
|
|
|
|
|
|
|
- CHECK_EQ(args.Length(), 1);
|
|
|
|
+ CHECK_EQ(args.Length(), 2);
|
|
|
|
CHECK(args[0]->IsFunction());
|
|
|
|
Local<Function> import_meta_callback = args[0].As<Function>();
|
2024-01-18 21:16:45 +00:00
|
|
|
realm->set_host_initialize_import_meta_object_callback(import_meta_callback);
|
2023-08-31 00:38:07 +00:00
|
|
|
|
|
|
|
- isolate->SetHostInitializeImportMetaObjectCallback(
|
|
|
|
- HostInitializeImportMetaObjectCallback);
|
|
|
|
+ if (args[1]->IsBoolean() && args[1]->BooleanValue(isolate))
|
|
|
|
+ isolate->SetHostInitializeImportMetaObjectCallback(
|
|
|
|
+ HostInitializeImportMetaObjectCallback);
|
|
|
|
}
|
|
|
|
|
|
|
|
MaybeLocal<Value> ModuleWrap::SyntheticModuleEvaluationStepsCallback(
|
|
|
|
diff --git a/src/module_wrap.h b/src/module_wrap.h
|
2024-03-29 12:34:56 +00:00
|
|
|
index e17048357feca2419087621ed280de30882a90bc..63682be31ce00a3bf7b9be909cac4b7f9ec02a8e 100644
|
2023-08-31 00:38:07 +00:00
|
|
|
--- a/src/module_wrap.h
|
|
|
|
+++ b/src/module_wrap.h
|
2024-03-29 12:34:56 +00:00
|
|
|
@@ -7,6 +7,7 @@
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
#include "base_object.h"
|
|
|
|
+#include "node.h"
|
|
|
|
|
|
|
|
namespace node {
|
|
|
|
|
|
|
|
@@ -31,7 +32,14 @@ enum HostDefinedOptions : int {
|
2023-11-30 14:51:35 +00:00
|
|
|
kLength = 9,
|
2023-08-31 00:38:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
-class ModuleWrap : public BaseObject {
|
|
|
|
+NODE_EXTERN v8::MaybeLocal<v8::Promise> ImportModuleDynamically(
|
|
|
|
+ v8::Local<v8::Context> context,
|
|
|
|
+ v8::Local<v8::Data> host_defined_options,
|
|
|
|
+ v8::Local<v8::Value> resource_name,
|
|
|
|
+ v8::Local<v8::String> specifier,
|
|
|
|
+ v8::Local<v8::FixedArray> import_assertions);
|
|
|
|
+
|
|
|
|
+class NODE_EXTERN ModuleWrap : public BaseObject {
|
|
|
|
public:
|
|
|
|
enum InternalFields {
|
2023-11-30 14:51:35 +00:00
|
|
|
kModuleSlot = BaseObject::kInternalFieldCount,
|
2024-03-29 12:34:56 +00:00
|
|
|
@@ -68,6 +76,8 @@ class ModuleWrap : public BaseObject {
|
2024-01-16 13:29:00 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ static ModuleWrap* GetFromModule(node::Environment*, v8::Local<v8::Module>);
|
|
|
|
+
|
|
|
|
private:
|
2024-01-18 21:16:45 +00:00
|
|
|
ModuleWrap(Realm* realm,
|
2024-01-16 13:29:00 +00:00
|
|
|
v8::Local<v8::Object> object,
|
2024-03-29 12:34:56 +00:00
|
|
|
@@ -102,7 +112,6 @@ class ModuleWrap : public BaseObject {
|
2024-01-16 13:29:00 +00:00
|
|
|
v8::Local<v8::String> specifier,
|
|
|
|
v8::Local<v8::FixedArray> import_attributes,
|
|
|
|
v8::Local<v8::Module> referrer);
|
|
|
|
- static ModuleWrap* GetFromModule(node::Environment*, v8::Local<v8::Module>);
|
|
|
|
|
|
|
|
v8::Global<v8::Module> module_;
|
|
|
|
std::unordered_map<std::string, v8::Global<v8::Promise>> resolve_cache_;
|