From 49890508cb0ed7967fb14d80829bc36c483fedd6 Mon Sep 17 00:00:00 2001 From: Tuyen Nguyen Date: Tue, 16 Apr 2024 13:08:57 +0700 Subject: [PATCH 1/2] fix: use same promise when closing maconn multiple times --- packages/transport-tcp/src/socket-to-conn.ts | 24 ++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/transport-tcp/src/socket-to-conn.ts b/packages/transport-tcp/src/socket-to-conn.ts index 2e4365697d..76e8f070e9 100644 --- a/packages/transport-tcp/src/socket-to-conn.ts +++ b/packages/transport-tcp/src/socket-to-conn.ts @@ -23,7 +23,7 @@ interface ToConnectionOptions { * https://github.com/libp2p/interface-transport#multiaddrconnection */ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptions): MultiaddrConnection => { - let status: 'open' | 'closing' | 'closed' = 'open' + let closePromise: Promise | null = null const log = options.logger.forComponent('libp2p:tcp:socket') const metrics = options.metrics const metricPrefix = options.metricPrefix ?? '' @@ -127,11 +127,15 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio timeline: { open: Date.now() }, async close (options: AbortOptions = {}) { - if (status === 'closed' || status === 'closing' || socket.destroyed) { - log('The %s socket is either closed, closing, or already destroyed', lOptsStr) + if (socket.destroyed) { + log('The %s socket is destroyed', lOptsStr) return } - status = 'closing' + + if (closePromise != null) { + log('The %s socket is closed or closing', lOptsStr) + return closePromise + } if (options.signal == null) { const signal = AbortSignal.timeout(closeTimeout) @@ -150,12 +154,11 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio try { log('%s closing socket', lOptsStr) - await new Promise((resolve, reject) => { + closePromise = new Promise((resolve, reject) => { socket.once('close', () => { // socket completely closed log('%s socket closed', lOptsStr) - status = 'closed' resolve() }) socket.once('error', (err: Error) => { @@ -165,9 +168,10 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio if (maConn.timeline.close == null) { maConn.timeline.close = Date.now() } - - status = 'closed' - reject(err) + if (!socket.destroyed) { + reject(err) + } + // if socket is destroyed, 'closed' event will be emitted later to resolve the promise }) // shorten inactivity timeout @@ -189,6 +193,8 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio socket.destroy() } }) + + return await closePromise } catch (err: any) { this.abort(err) } finally { From 2bbddd7431f213a57970a0cc09b82fe478233fc4 Mon Sep 17 00:00:00 2001 From: Tuyen Nguyen Date: Tue, 16 Apr 2024 13:29:14 +0700 Subject: [PATCH 2/2] chore: fix lint --- packages/transport-tcp/src/socket-to-conn.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transport-tcp/src/socket-to-conn.ts b/packages/transport-tcp/src/socket-to-conn.ts index 76e8f070e9..9221c6698c 100644 --- a/packages/transport-tcp/src/socket-to-conn.ts +++ b/packages/transport-tcp/src/socket-to-conn.ts @@ -194,7 +194,7 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio } }) - return await closePromise + await closePromise } catch (err: any) { this.abort(err) } finally {