getModuleRequests

This commit is contained in:
Kai Tamkun
2025-05-02 19:38:22 -07:00
parent a8cae2853e
commit a58c2a9050
4 changed files with 45 additions and 7 deletions

View File

@@ -1916,10 +1916,14 @@ public:
JSObject* namespace_() const { return m_namespace.get(); }
void namespace_(VM& vm, JSObject* value) { m_namespace.set(vm, this, value); }
const WTF::Vector<NodeVMModuleRequest>& moduleRequests() const { return m_moduleRequests; }
void addModuleRequest(NodeVMModuleRequest request) { m_moduleRequests.append(WTFMove(request)); }
protected:
WTF::String m_identifier;
Status m_status = Status::Unlinked;
mutable WriteBarrier<JSObject> m_namespace;
WTF::Vector<NodeVMModuleRequest> m_moduleRequests;
NodeVMModule(JSC::VM& vm, JSC::Structure* structure, WTF::String identifier)
: Base(vm, structure)
@@ -2005,8 +2009,10 @@ NodeVMSourceTextModule* NodeVMSourceTextModule::create(VM& vm, JSGlobalObject* g
}
JSValue contextValue = args.at(1);
if (!contextValue.isObject()) {
// TODO(@heimskr): if undefined, use current execution context
if (contextValue.isUndefined()) {
// TODO(@heimskr): should this be `globalObject->globalThis()` instead?
contextValue = globalObject;
} else if (!contextValue.isObject()) {
throwArgumentTypeError(*globalObject, scope, 1, "context"_s, "Module"_s, "Module"_s, "object"_s);
return nullptr;
}
@@ -2108,8 +2114,16 @@ JSC_DEFINE_HOST_FUNCTION(jsNodeVmModuleGetError, (JSC::JSGlobalObject * globalOb
JSC_DEFINE_HOST_FUNCTION(jsNodeVmModuleGetModuleRequests, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
{
// auto* thisObject = jsCast<NodeVMSourceTextModule*>(callFrame->thisValue());
return JSC::encodedJSUndefined();
auto* thisObject = jsCast<NodeVMModule*>(callFrame->thisValue());
const WTF::Vector<NodeVMModuleRequest>& requests = thisObject->moduleRequests();
JSArray* array = constructEmptyArray(globalObject, nullptr, requests.size());
for (unsigned i = 0; const NodeVMModuleRequest& request : requests) {
array->putDirectIndex(globalObject, i++, request.toJS(globalObject));
}
return JSValue::encode(array);
}
JSC_DEFINE_HOST_FUNCTION(jsNodeVmModuleEvaluate, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))

View File

@@ -32,6 +32,7 @@ public:
void finishCreation(JSC::VM&);
static void destroy(JSCell* cell);
void setContextifiedObject(JSC::JSObject* contextifiedObject);
JSC::JSObject* contextifiedObject() const { return m_sandbox.get(); }
void clearContextifiedObject();
// Override property access to delegate to contextified object

View File

@@ -94,7 +94,29 @@ const arrayToSafePromiseIterable = (promises, mapFn) =>
),
);
const PromiseAll = Promise.all;
const PromiseResolve = Promise.resolve;
const SafePromiseAll = (promises, mapFn) => PromiseAll(arrayToSafePromiseIterable(promises, mapFn));
const SafePromiseAllReturnArrayLike = (promises, mapFn) =>
new Promise((resolve, reject) => {
const { length } = promises;
const returnVal = Array(length);
ObjectSetPrototypeOf(returnVal, null);
if (length === 0) resolve(returnVal);
let pendingPromises = length;
for (let i = 0; i < length; i++) {
const promise = mapFn != null ? mapFn(promises[i], i) : promises[i];
PromisePrototypeThen(
PromiseResolve(promise),
result => {
returnVal[i] = result;
if (--pendingPromises === 0) resolve(returnVal);
},
reject,
);
}
});
export default {
Array,
@@ -113,6 +135,7 @@ export default {
},
),
SafePromiseAll,
SafePromiseAllReturnArrayLike,
SafeSet: makeSafe(
Set,
class SafeSet extends Set {

View File

@@ -9,7 +9,7 @@ const {
validateBuffer,
validateFunction,
} = require("internal/validators");
const { SafePromiseAll } = require("internal/primordials");
const { SafePromiseAllReturnArrayLike } = require("internal/primordials");
const vm = $cpp("NodeVM.cpp", "Bun::createNodeVMBinding");
@@ -267,7 +267,7 @@ class SourceTextModule extends Module {
}
try {
const modules = await SafePromiseAll(modulePromises);
const modules = await SafePromiseAllReturnArrayLike(modulePromises);
this[kNative].link(specifiers, modules);
} catch (e) {
this.#error = e;
@@ -279,7 +279,7 @@ class SourceTextModule extends Module {
get dependencySpecifiers() {
this[kDependencySpecifiers] ??= ObjectFreeze(
ArrayPrototypeMap.$call(this[kNative].getModuleRequests(), request => request.specifier),
ArrayPrototypeMap.$call(this[kNative].getModuleRequests(), request => request[0]),
);
return this[kDependencySpecifiers];
}