Mark Pigge created TINKERPOP-3160:
-------------------------------------

             Summary: Node.js 22+: Gremlin Fails with network error and HTTP 
101 Status Due to WebSocket Limitation in undici
                 Key: TINKERPOP-3160
                 URL: https://issues.apache.org/jira/browse/TINKERPOP-3160
             Project: TinkerPop
          Issue Type: Bug
          Components: javascript
    Affects Versions: 3.7.3
            Reporter: Mark Pigge


*📌 Overview:*

After upgrading to {*}Node.js 22 or newer{*}, applications using the *Gremlin 
driver* encounter {{network error}} failures when trying to connect to graph 
database AWS Neptune. These failures are caused by the removal of built-in 
WebSocket support in Node.js and reliance on {{{}undici{}}}, which does *not 
support custom headers* or handle the WebSocket handshake properly in this 
context.


----
*❌ Symptoms:*
 * {{Gremlin}} client fails to connect

 * Network error during connection

 * HTTP 101 Switching Protocols error with no upgrade

 * Headers like {{Authorization}} or {{Host}} are missing or ignored

 * Stack trace shows underlying issues in WebSocket handshake

 
----
*🎯 Root Cause:*
 * Node.js 22+ no longer includes a global {{WebSocket}} implementation

 * The fallback (via {{{}undici{}}}) *does not support* custom headers

 * This breaks clients that rely on authenticated WebSocket connections (like 
Gremlin)

 * Result: WebSocket upgrade fails with a 101 status and unresolved {{network 
error}}

 
----
*✅ Workaround:*

You can override the default WebSocket globally with the {{ws}} library, which 
supports custom headers and proper handshake behavior.
import \{ WebSocket as WS } from 'ws';
(globalThis as any).WebSocket = WS;
 
This should be done *early in your application startup* before any Gremlin 
connections are created.

 
----
*📄 Example Fix for Gremlin Driver:*
import \{ WebSocket as WS } from 'ws';
(globalThis as any).WebSocket = WS;

import \{ DriverRemoteConnection } from 'gremlin';

const connection = new DriverRemoteConnection(
  'wss://your-gremlin-endpoint:8182/gremlin', \{
    // headers like Authorization must now be passed via a custom WebSocket
  }
);
 
 
----
*📚 References:*
 * Node.js change: [{{undici}} removed WebSocket 
support|https://github.com/nodejs/undici/discussions/3836]

 * Community write-up: [Resolving Gremlin network errors after upgrading to 
Node.js 
23|https://medium.com/@python-javascript-php-html-css/resolving-gremlin-network-errors-after-upgrading-to-node-js-23-3591c0e45caa]



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to