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