neo4j / neo4j-javascript-driver

Neo4j Bolt driver for JavaScript
https://neo4j.com/docs/javascript-manual/current/
Apache License 2.0
839 stars 148 forks source link

Connection attempts time out when connecting using Bun #1140

Open Giant-Jelly opened 9 months ago

Giant-Jelly commented 9 months ago

It looks like when running the neo4j driver with bun (bun index.ts or bun index.js ) the connection to the database times out. But when running with node (node index.js) it connects fine.

Here is my index.js

import neo4j from "neo4j-driver-lite";
import 'dotenv/config'

async function main() {
    const NEO4J_URI = process.env.NEO4J_URI || "";
    const NEO4J_USERNAME = process.env.NEO4J_USERNAME || "";
    const NEO4J_PASSWORD = process.env.NEO4J_PASSWORD || "";

    console.log(NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD);
    const driver = neo4j.driver(NEO4J_URI, neo4j.auth.basic(NEO4J_USERNAME, NEO4J_PASSWORD));

    const serverInfo = await driver.getServerInfo();
    console.log(serverInfo);
}

main()

Output from bun index.js

 */
73 |     function Neo4jError(message, code, cause) {
74 |         var _this =
75 |         // eslint-disable-next-line
76 |         // @ts-ignore: not available in ES6 yet
77 |         _super.call(this, message, cause != null ? { cause: cause } : undefined) || this;
            ^
Neo4jError: Connection acquisition timed out in 60000 ms. Pool status: Active conn count = 0, Idle conn count = 0.
 code: "N/A"

output from node index.js


ServerInfo {
  address: '<ommitted>.databases.neo4j.io:7687',
  agent: 'Neo4j/5.11-aura',
  protocolVersion: 5.3
}

Node version v20.3.1 Bun version 1.0.0 Driver version: Latest Neo4j version: Latest

Same behaviour with neo4j-driver and neo4j-driver-lite

Is this already a known issue? I feel like if it was because the driver is using something in node that is not supported by Bun that there would be an error instead of a timeout.

bigmontz commented 9 months ago

Hey @Giant-Jelly, thanks for reporting.

This driver has not support for Bun yet.

I will register the request in our internally and I will keep this thread issue updated.

bigmontz commented 9 months ago

The problem with Bun happens when use SSL (neo4j+s and bolt+s). The root cause of the issue is lack of full support to tls and crypto. See, `https://bun.sh/docs/runtime/nodejs-apis#node-crypto and https://bun.sh/docs/runtime/nodejs-apis#node-tls.

Driver's Websocket channel implementation works fine in most of the cases, but this still pending more extensive tests.

thecoldstone commented 8 months ago

Has it not been fixed yet?

bigmontz commented 8 months ago

This feature stills depending on Bun implements crypto and TLS. WebSockets is not production ready either, see https://bun.sh/docs/runtime/web-apis.

bigmontz commented 8 months ago

You can also import the driver like this:

import neo4j from 'neo4j-driver/lib/browser/neo4j-web.esm.js'

and use the browser version of the driver.

It will might work for most of the cases, but I don't consider this production ready since WebSocket is not production ready in Bun and we don't have test suite for this. So, this is a non supported feature.

GuiBibeau commented 6 months ago

@bigmontz does the browser substitute sockets for fetch calls?

The browser version does work well in bun but I would like to know the tradeoffs when it comes to using only the browser version

bigmontz commented 6 months ago

The browser version uses WebSockets instead of TCP Sockets. This causes performance losses, especially when creating and closing connections.

PS: This usage is not homologated by integration and acceptance tests, also.