@@ -127,47 +127,48 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio
127
127
timeline : { open : Date . now ( ) } ,
128
128
129
129
async close ( options : AbortOptions = { } ) {
130
- if ( socket . destroyed ) {
131
- log ( 'The %s socket is destroyed ' , lOptsStr )
130
+ if ( socket . closed ) {
131
+ log ( 'The %s socket is already closed ' , lOptsStr )
132
132
return
133
133
}
134
134
135
- if ( closePromise != null ) {
136
- log ( 'The %s socket is closed or closing' , lOptsStr )
137
- return closePromise
138
- }
139
-
140
- if ( options . signal == null ) {
141
- const signal = AbortSignal . timeout ( closeTimeout )
142
-
143
- options = {
144
- ...options ,
145
- signal
146
- }
135
+ if ( socket . destroyed ) {
136
+ log ( 'The %s socket is already destroyed' , lOptsStr )
137
+ return
147
138
}
148
139
149
140
const abortSignalListener = ( ) : void => {
150
141
socket . destroy ( new AbortError ( 'Destroying socket after timeout' ) )
151
142
}
152
143
153
- options . signal ?. addEventListener ( 'abort' , abortSignalListener )
154
-
155
144
try {
145
+ if ( closePromise != null ) {
146
+ log ( 'The %s socket is already closing' , lOptsStr )
147
+ await closePromise
148
+ return
149
+ }
150
+
151
+ if ( options . signal == null ) {
152
+ const signal = AbortSignal . timeout ( closeTimeout )
153
+
154
+ options = {
155
+ ...options ,
156
+ signal
157
+ }
158
+ }
159
+
160
+ options . signal ?. addEventListener ( 'abort' , abortSignalListener )
161
+
156
162
log ( '%s closing socket' , lOptsStr )
157
163
closePromise = new Promise < void > ( ( resolve , reject ) => {
158
164
socket . once ( 'close' , ( ) => {
159
165
// socket completely closed
160
166
log ( '%s socket closed' , lOptsStr )
161
-
162
167
resolve ( )
163
168
} )
164
169
socket . once ( 'error' , ( err : Error ) => {
165
170
log ( '%s socket error' , lOptsStr , err )
166
171
167
- // error closing socket
168
- if ( maConn . timeline . close == null ) {
169
- maConn . timeline . close = Date . now ( )
170
- }
171
172
if ( ! socket . destroyed ) {
172
173
reject ( err )
173
174
}
@@ -210,6 +211,10 @@ export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptio
210
211
socket . destroy ( err )
211
212
}
212
213
214
+ // closing a socket is always asynchronous (must wait for "close" event)
215
+ // but the tests expect this to be a synchronous operation so we have to
216
+ // set the close time here. the tests should be refactored to reflect
217
+ // reality.
213
218
if ( maConn . timeline . close == null ) {
214
219
maConn . timeline . close = Date . now ( )
215
220
}
0 commit comments