diff --git a/tools/nodejs_api/src_js/connection.js b/tools/nodejs_api/src_js/connection.js index 7135a50f4c..56f92ef2d3 100644 --- a/tools/nodejs_api/src_js/connection.js +++ b/tools/nodejs_api/src_js/connection.js @@ -1,6 +1,6 @@ "use strict"; -const KuzuNative = require("./kuzujs.node"); +const KuzuNative = require("./kuzu_native.js"); const QueryResult = require("./query_result.js"); const PreparedStatement = require("./prepared_statement.js"); diff --git a/tools/nodejs_api/src_js/database.js b/tools/nodejs_api/src_js/database.js index 38073f92c7..cf5b351ba3 100644 --- a/tools/nodejs_api/src_js/database.js +++ b/tools/nodejs_api/src_js/database.js @@ -1,6 +1,6 @@ "use strict"; -const KuzuNative = require("./kuzujs.node"); +const KuzuNative = require("./kuzu_native.js"); const LoggingLevel = require("./logging_level.js"); class Database { diff --git a/tools/nodejs_api/src_js/kuzu_native.js b/tools/nodejs_api/src_js/kuzu_native.js new file mode 100644 index 0000000000..68eb7dfb1d --- /dev/null +++ b/tools/nodejs_api/src_js/kuzu_native.js @@ -0,0 +1,25 @@ +/** + * This file is a customized loader for the kuzujs.node native module. + * It is used to load the native module with the correct flags on Linux so that + * extension loading works correctly. + * @module kuzu_native + * @private + */ + +const process = require("process"); +const constants = require("constants"); +const join = require("path").join; + +const kuzuNativeModule = { exports: {} }; +const modulePath = join(__dirname, "kuzujs.node"); +if (process.platform === "linux") { + process.dlopen( + kuzuNativeModule, + modulePath, + constants.RTLD_LAZY | constants.RTLD_GLOBAL + ); +} else { + process.dlopen(kuzuNativeModule, modulePath); +} + +module.exports = kuzuNativeModule.exports; diff --git a/tools/nodejs_api/test/test_extension.js b/tools/nodejs_api/test/test_extension.js index 6929b73d0e..ced7410941 100644 --- a/tools/nodejs_api/test/test_extension.js +++ b/tools/nodejs_api/test/test_extension.js @@ -2,8 +2,8 @@ const { assert } = require("chai"); describe("Extension loading", () => { it("should install and load httpfs extension", async function () { + this.timeout(10000); await conn.query("INSTALL httpfs"); - // Skip this test until the fix is in place - // await conn.query("LOAD EXTENSION httpfs"); + await conn.query("LOAD EXTENSION httpfs"); }); });