src/bun.js/bindings/v8/node.cpp (81 lines of code) (raw):

#include "node.h" #include "V8HandleScope.h" #include "JavaScriptCore/ObjectConstructor.h" #include "CommonJSModuleRecord.h" #include <charconv> using v8::Context; using v8::HandleScope; using v8::Isolate; using v8::Local; using v8::Object; using v8::Value; using JSC::JSObject; using JSC::jsUndefined; using JSC::JSValue; namespace node { void AddEnvironmentCleanupHook(v8::Isolate* isolate, void (*fun)(void* arg), void* arg) { // TODO } void RemoveEnvironmentCleanupHook(v8::Isolate* isolate, void (*fun)(void* arg), void* arg) { // TODO } void node_module_register(void* opaque_mod) { // TODO unify this with napi_module_register auto* globalObject = defaultGlobalObject(); auto& vm = globalObject->vm(); auto* mod = reinterpret_cast<struct node_module*>(opaque_mod); // Error: The module '/Users/ben/code/bun/test/v8/v8-module/build/Release/v8tests.node' // was compiled against a different Node.js version using // NODE_MODULE_VERSION 127. This version of Node.js requires // NODE_MODULE_VERSION 108. Please try re-compiling or re-installing // the module (for instance, using `npm rebuild` or `npm install`). if (mod->nm_version != REPORTED_NODEJS_ABI_VERSION) { } auto keyStr = WTF::String::fromUTF8(mod->nm_modname); globalObject->napiModuleRegisterCallCount++; JSValue pendingNapiModule = globalObject->m_pendingNapiModuleAndExports[0].get(); JSObject* object = (pendingNapiModule && pendingNapiModule.isObject()) ? pendingNapiModule.getObject() : nullptr; auto scope = DECLARE_THROW_SCOPE(vm); JSC::Strong<JSC::JSObject> strongExportsObject; if (mod->nm_version != REPORTED_NODEJS_ABI_VERSION) { auto* error = JSC::createError(globalObject, WTF::makeString("The module '"_s, keyStr, "' was compiled against a different Node.js ABI version using NODE_MODULE_VERSION "_s, mod->nm_version, ". This version of Bun requires NODE_MODULE_VERSION "_s, REPORTED_NODEJS_ABI_VERSION, ". Please try re-compiling or re-installing the module."_s)); globalObject->m_pendingNapiModuleAndExports[0].set(vm, globalObject, error); return; } if (!object) { auto* exportsObject = JSC::constructEmptyObject(globalObject); RETURN_IF_EXCEPTION(scope, void()); object = Bun::JSCommonJSModule::create(globalObject, keyStr, exportsObject, false, jsUndefined()); strongExportsObject = { vm, exportsObject }; } else { JSValue exportsObject = object->getIfPropertyExists(globalObject, WebCore::builtinNames(vm).exportsPublicName()); RETURN_IF_EXCEPTION(scope, void()); if (exportsObject && exportsObject.isObject()) { strongExportsObject = { vm, exportsObject.getObject() }; } } JSC::Strong<JSC::JSObject> strongObject = { vm, object }; HandleScope hs(Isolate::fromGlobalObject(globalObject)); // exports, module Local<Object> exports = hs.createLocal<Object>(vm, *strongExportsObject); Local<Value> module = hs.createLocal<Value>(vm, object); Local<Context> context = Isolate::fromGlobalObject(globalObject)->GetCurrentContext(); if (mod->nm_context_register_func) { mod->nm_context_register_func(exports, module, context, mod->nm_priv); } else if (mod->nm_register_func) { mod->nm_register_func(exports, module, mod->nm_priv); } else { auto* error = JSC::createError(globalObject, WTF::makeString("The module '"_s, keyStr, "' has no declared entry point."_s)); globalObject->m_pendingNapiModuleAndExports[0].set(vm, globalObject, error); return; } RETURN_IF_EXCEPTION(scope, void()); globalObject->m_pendingNapiModuleAndExports[1].set(vm, globalObject, object); } }