@@ -37,8 +37,6 @@ const {
37
37
isIP
38
38
} = cares ;
39
39
40
- const defaultChannel = new ChannelWrap ( ) ;
41
-
42
40
const isLegalPort = internalNet . isLegalPort ;
43
41
44
42
@@ -244,6 +242,12 @@ function onresolve(err, result, ttls) {
244
242
this . callback ( null , result ) ;
245
243
}
246
244
245
+ // Resolver instances correspond 1:1 to c-ares channels.
246
+ class Resolver {
247
+ constructor ( ) {
248
+ this . _handle = new ChannelWrap ( ) ;
249
+ }
250
+ }
247
251
248
252
function resolver ( bindingName ) {
249
253
return function query ( name , /* options, */ callback ) {
@@ -266,26 +270,27 @@ function resolver(bindingName) {
266
270
req . hostname = name ;
267
271
req . oncomplete = onresolve ;
268
272
req . ttl = ! ! ( options && options . ttl ) ;
269
- var err = defaultChannel [ bindingName ] ( req , name ) ;
273
+ var err = this . _handle [ bindingName ] ( req , name ) ;
270
274
if ( err ) throw errnoException ( err , bindingName ) ;
271
275
return req ;
272
276
} ;
273
277
}
274
278
275
-
276
279
var resolveMap = Object . create ( null ) ;
277
- resolveMap . ANY = resolver ( 'queryAny' ) ;
278
- resolveMap . A = resolver ( 'queryA' ) ;
279
- resolveMap . AAAA = resolver ( 'queryAaaa' ) ;
280
- resolveMap . CNAME = resolver ( 'queryCname' ) ;
281
- resolveMap . MX = resolver ( 'queryMx' ) ;
282
- resolveMap . NS = resolver ( 'queryNs' ) ;
283
- resolveMap . TXT = resolver ( 'queryTxt' ) ;
284
- resolveMap . SRV = resolver ( 'querySrv' ) ;
285
- resolveMap . PTR = resolver ( 'queryPtr' ) ;
286
- resolveMap . NAPTR = resolver ( 'queryNaptr' ) ;
287
- resolveMap . SOA = resolver ( 'querySoa' ) ;
288
-
280
+ Resolver . prototype . resolveAny = resolveMap . ANY = resolver ( 'queryAny' ) ;
281
+ Resolver . prototype . resolve4 = resolveMap . A = resolver ( 'queryA' ) ;
282
+ Resolver . prototype . resolve6 = resolveMap . AAAA = resolver ( 'queryAaaa' ) ;
283
+ Resolver . prototype . resolveCname = resolveMap . CNAME = resolver ( 'queryCname' ) ;
284
+ Resolver . prototype . resolveMx = resolveMap . MX = resolver ( 'queryMx' ) ;
285
+ Resolver . prototype . resolveNs = resolveMap . NS = resolver ( 'queryNs' ) ;
286
+ Resolver . prototype . resolveTxt = resolveMap . TXT = resolver ( 'queryTxt' ) ;
287
+ Resolver . prototype . resolveSrv = resolveMap . SRV = resolver ( 'querySrv' ) ;
288
+ Resolver . prototype . resolvePtr = resolveMap . PTR = resolver ( 'queryPtr' ) ;
289
+ Resolver . prototype . resolveNaptr = resolveMap . NAPTR = resolver ( 'queryNaptr' ) ;
290
+ Resolver . prototype . resolveSoa = resolveMap . SOA = resolver ( 'querySoa' ) ;
291
+ Resolver . prototype . reverse = resolver ( 'getHostByAddr' ) ;
292
+
293
+ Resolver . prototype . resolve = resolve ;
289
294
290
295
function resolve ( hostname , rrtype , callback ) {
291
296
var resolver ;
@@ -300,15 +305,16 @@ function resolve(hostname, rrtype, callback) {
300
305
}
301
306
302
307
if ( typeof resolver === 'function' ) {
303
- return resolver ( hostname , callback ) ;
308
+ return resolver . call ( this , hostname , callback ) ;
304
309
} else {
305
310
throw new errors . TypeError ( 'ERR_INVALID_OPT_VALUE' , 'rrtype' , rrtype ) ;
306
311
}
307
312
}
308
313
309
314
315
+ Resolver . prototype . getServers = getServers ;
310
316
function getServers ( ) {
311
- const ret = defaultChannel . getServers ( ) ;
317
+ const ret = this . _handle . getServers ( ) ;
312
318
return ret . map ( ( val ) => {
313
319
if ( ! val [ 1 ] || val [ 1 ] === IANA_DNS_PORT ) return val [ 0 ] ;
314
320
@@ -318,10 +324,11 @@ function getServers() {
318
324
}
319
325
320
326
327
+ Resolver . prototype . setServers = setServers ;
321
328
function setServers ( servers ) {
322
329
// cache the original servers because in the event of an error setting the
323
330
// servers cares won't have any servers available for resolution
324
- const orig = defaultChannel . getServers ( ) ;
331
+ const orig = this . _handle . getServers ( ) ;
325
332
const newSet = [ ] ;
326
333
const IPv6RE = / \[ ( .* ) \] / ;
327
334
const addrSplitRE = / ( ^ .+ ?) (?: : ( \d + ) ) ? $ / ;
@@ -353,35 +360,39 @@ function setServers(servers) {
353
360
throw new errors . Error ( 'ERR_INVALID_IP_ADDRESS' , serv ) ;
354
361
} ) ;
355
362
356
- const errorNumber = defaultChannel . setServers ( newSet ) ;
363
+ const errorNumber = this . _handle . setServers ( newSet ) ;
357
364
358
365
if ( errorNumber !== 0 ) {
359
366
// reset the servers to the old servers, because ares probably unset them
360
- defaultChannel . setServers ( orig . join ( ',' ) ) ;
367
+ this . _handle . setServers ( orig . join ( ',' ) ) ;
361
368
362
369
var err = cares . strerror ( errorNumber ) ;
363
370
throw new errors . Error ( 'ERR_DNS_SET_SERVERS_FAILED' , err , servers ) ;
364
371
}
365
372
}
366
373
374
+ const defaultResolver = new Resolver ( ) ;
375
+
367
376
module . exports = {
368
377
lookup,
369
378
lookupService,
370
- getServers,
371
- setServers,
372
- resolve,
373
- resolveAny : resolveMap . ANY ,
374
- resolve4 : resolveMap . A ,
375
- resolve6 : resolveMap . AAAA ,
376
- resolveCname : resolveMap . CNAME ,
377
- resolveMx : resolveMap . MX ,
378
- resolveNs : resolveMap . NS ,
379
- resolveTxt : resolveMap . TXT ,
380
- resolveSrv : resolveMap . SRV ,
381
- resolvePtr : resolveMap . PTR ,
382
- resolveNaptr : resolveMap . NAPTR ,
383
- resolveSoa : resolveMap . SOA ,
384
- reverse : resolver ( 'getHostByAddr' ) ,
379
+
380
+ Resolver,
381
+ getServers : defaultResolver . getServers . bind ( defaultResolver ) ,
382
+ setServers : defaultResolver . setServers . bind ( defaultResolver ) ,
383
+ resolve : defaultResolver . resolve . bind ( defaultResolver ) ,
384
+ resolveAny : defaultResolver . resolveAny . bind ( defaultResolver ) ,
385
+ resolve4 : defaultResolver . resolve4 . bind ( defaultResolver ) ,
386
+ resolve6 : defaultResolver . resolve6 . bind ( defaultResolver ) ,
387
+ resolveCname : defaultResolver . resolveCname . bind ( defaultResolver ) ,
388
+ resolveMx : defaultResolver . resolveMx . bind ( defaultResolver ) ,
389
+ resolveNs : defaultResolver . resolveNs . bind ( defaultResolver ) ,
390
+ resolveTxt : defaultResolver . resolveTxt . bind ( defaultResolver ) ,
391
+ resolveSrv : defaultResolver . resolveSrv . bind ( defaultResolver ) ,
392
+ resolvePtr : defaultResolver . resolvePtr . bind ( defaultResolver ) ,
393
+ resolveNaptr : defaultResolver . resolveNaptr . bind ( defaultResolver ) ,
394
+ resolveSoa : defaultResolver . resolveSoa . bind ( defaultResolver ) ,
395
+ reverse : defaultResolver . reverse . bind ( defaultResolver ) ,
385
396
386
397
// uv_getaddrinfo flags
387
398
ADDRCONFIG : cares . AI_ADDRCONFIG ,
0 commit comments