diff --git a/packages/transport-tcp/src/constants.ts b/packages/transport-tcp/src/constants.ts index 91477850d0..4bc2fbaab4 100644 --- a/packages/transport-tcp/src/constants.ts +++ b/packages/transport-tcp/src/constants.ts @@ -4,7 +4,7 @@ export const CODE_CIRCUIT = 290 export const CODE_UNIX = 400 // Time to wait for a connection to close gracefully before destroying it manually -export const CLOSE_TIMEOUT = 500 +export const CLOSE_TIMEOUT = 250 // Close the socket if there is no activity after this long in ms export const SOCKET_TIMEOUT = 2 * 60000 // 2 mins diff --git a/packages/transport-tcp/src/socket-to-conn.ts b/packages/transport-tcp/src/socket-to-conn.ts index 9e4203a53f..a75f4e460e 100644 --- a/packages/transport-tcp/src/socket-to-conn.ts +++ b/packages/transport-tcp/src/socket-to-conn.ts @@ -80,7 +80,7 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio // by default there is no timeout // https://nodejs.org/dist/latest-v16.x/docs/api/net.html#socketsettimeouttimeout-callback socket.setTimeout(inactivityTimeout) - + socket.once('timeout', () => { timedOut = true log('%s %s socket read timeout', direction, lOptsStr) diff --git a/packages/transport-tcp/src/tcp.ts b/packages/transport-tcp/src/tcp.ts index af2e461a21..f0f94a061f 100644 --- a/packages/transport-tcp/src/tcp.ts +++ b/packages/transport-tcp/src/tcp.ts @@ -109,7 +109,7 @@ export class TCP implements Transport { } async _connect (ma: Multiaddr, options: TCPDialOptions): Promise { - options.signal.throwIfAborted() + options.signal?.throwIfAborted() options.onProgress?.(new CustomProgressEvent('tcp:open-connection')) let rawSocket: Socket diff --git a/packages/transport-tcp/test/connection-time.spec.ts b/packages/transport-tcp/test/connection-time.spec.ts new file mode 100644 index 0000000000..ec78387f0c --- /dev/null +++ b/packages/transport-tcp/test/connection-time.spec.ts @@ -0,0 +1,43 @@ +/* eslint-env mocha */ + +import { expect } from 'aegir/chai' +import net from 'node:net' +import { tcp } from '../src/index.js' + +describe('TCP connection time', () => { + it('should establish a raw TCP connection quickly', async () => { + // Create a simple TCP server + const server = net.createServer() + const port = 8080 + Math.floor(Math.random() * 1000) + + await new Promise(resolve => { + server.listen(port, '127.0.0.1', () => { resolve() }) + }) + + try { + // Measure connection time + const start = Date.now() + + const socket = await new Promise((resolve, reject) => { + const socket = net.connect(port, '127.0.0.1') + socket.on('connect', () => resolve(socket)) + socket.on('error', reject) + }) + + const connectionTime = Date.now() - start + console.log(`Raw TCP connection established in ${connectionTime}ms`) + + // Close the socket + socket.end() + + // Note: This test only verifies local connection speed + // The actual issue (#3029) involves connections between data centers + // This test serves as a baseline for local development + } finally { + // Close the server + await new Promise(resolve => { + server.close(() => { resolve() }) + }) + } + }) +}) \ No newline at end of file