@@ -14,14 +14,19 @@ const MIN_SUPPORTED_WIRE_VERSION = WIRE_CONSTANTS.MIN_SUPPORTED_WIRE_VERSION;
14
14
const MIN_SUPPORTED_SERVER_VERSION = WIRE_CONSTANTS . MIN_SUPPORTED_SERVER_VERSION ;
15
15
let AUTH_PROVIDERS ;
16
16
17
- function connect ( options , callback ) {
17
+ function connect ( options , cancellationToken , callback ) {
18
+ if ( typeof cancellationToken === 'function' ) {
19
+ callback = cancellationToken ;
20
+ cancellationToken = undefined ;
21
+ }
22
+
18
23
const ConnectionType = options && options . connectionType ? options . connectionType : Connection ;
19
24
if ( AUTH_PROVIDERS == null ) {
20
25
AUTH_PROVIDERS = defaultAuthProviders ( options . bson ) ;
21
26
}
22
27
23
28
const family = options . family !== void 0 ? options . family : 0 ;
24
- makeConnection ( family , options , ( err , socket ) => {
29
+ makeConnection ( family , options , cancellationToken , ( err , socket ) => {
25
30
if ( err ) {
26
31
callback ( err , socket ) ; // in the error case, `socket` is the originating error event name
27
32
return ;
@@ -219,7 +224,7 @@ function parseSslOptions(family, options) {
219
224
}
220
225
221
226
const SOCKET_ERROR_EVENTS = new Set ( [ 'error' , 'close' , 'timeout' , 'parseError' ] ) ;
222
- function makeConnection ( family , options , _callback ) {
227
+ function makeConnection ( family , options , cancellationToken , _callback ) {
223
228
const useSsl = typeof options . ssl === 'boolean' ? options . ssl : false ;
224
229
const keepAlive = typeof options . keepAlive === 'boolean' ? options . keepAlive : true ;
225
230
let keepAliveInitialDelay =
@@ -240,6 +245,7 @@ function makeConnection(family, options, _callback) {
240
245
if ( err && socket ) {
241
246
socket . destroy ( ) ;
242
247
}
248
+
243
249
_callback ( err , ret ) ;
244
250
} ;
245
251
@@ -264,7 +270,7 @@ function makeConnection(family, options, _callback) {
264
270
return err => {
265
271
SOCKET_ERROR_EVENTS . forEach ( event => socket . removeAllListeners ( event ) ) ;
266
272
socket . removeListener ( 'connect' , connectHandler ) ;
267
- callback ( connectionFailureError ( eventName , err ) , eventName ) ;
273
+ callback ( connectionFailureError ( eventName , err ) ) ;
268
274
} ;
269
275
}
270
276
@@ -279,6 +285,10 @@ function makeConnection(family, options, _callback) {
279
285
}
280
286
281
287
SOCKET_ERROR_EVENTS . forEach ( event => socket . once ( event , errorHandler ( event ) ) ) ;
288
+ if ( cancellationToken ) {
289
+ cancellationToken . once ( 'cancel' , errorHandler ( 'cancel' ) ) ;
290
+ }
291
+
282
292
socket . once ( 'connect' , connectHandler ) ;
283
293
}
284
294
@@ -359,6 +369,8 @@ function connectionFailureError(type, err) {
359
369
return new MongoNetworkError ( `connection timed out` ) ;
360
370
case 'close' :
361
371
return new MongoNetworkError ( `connection closed` ) ;
372
+ case 'cancel' :
373
+ return new MongoNetworkError ( `connection establishment was cancelled` ) ;
362
374
default :
363
375
return new MongoNetworkError ( `unknown network error` ) ;
364
376
}
0 commit comments