@@ -36,8 +36,6 @@ const {
3636 isIP
3737} = cares ;
3838
39- const defaultChannel = new ChannelWrap ( ) ;
40-
4139const isLegalPort = internalNet . isLegalPort ;
4240
4341
@@ -243,6 +241,12 @@ function onresolve(err, result, ttls) {
243241 this . callback ( null , result ) ;
244242}
245243
244+ // Resolver instances correspond 1:1 to c-ares channels.
245+ class Resolver {
246+ constructor ( ) {
247+ this . _handle = new ChannelWrap ( ) ;
248+ }
249+ }
246250
247251function resolver ( bindingName ) {
248252 return function query ( name , /* options, */ callback ) {
@@ -264,26 +268,27 @@ function resolver(bindingName) {
264268 req . hostname = name ;
265269 req . oncomplete = onresolve ;
266270 req . ttl = ! ! ( options && options . ttl ) ;
267- var err = defaultChannel [ bindingName ] ( req , name ) ;
271+ var err = this . _handle [ bindingName ] ( req , name ) ;
268272 if ( err ) throw errnoException ( err , bindingName ) ;
269273 return req ;
270274 } ;
271275}
272276
273-
274277var 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 ;
287292
288293function resolve ( hostname , type_ , callback_ ) {
289294 var resolver , callback ;
@@ -298,15 +303,16 @@ function resolve(hostname, type_, callback_) {
298303 }
299304
300305 if ( typeof resolver === 'function' ) {
301- return resolver ( hostname , callback ) ;
306+ return resolver . call ( this , hostname , callback ) ;
302307 } else {
303308 throw new Error ( `Unknown type "${ type_ } "` ) ;
304309 }
305310}
306311
307312
313+ Resolver . prototype . getServers = getServers ;
308314function getServers ( ) {
309- const ret = defaultChannel . getServers ( ) ;
315+ const ret = this . _handle . getServers ( ) ;
310316 return ret . map ( ( val ) => {
311317 if ( ! val [ 1 ] || val [ 1 ] === IANA_DNS_PORT ) return val [ 0 ] ;
312318
@@ -316,10 +322,11 @@ function getServers() {
316322}
317323
318324
325+ Resolver . prototype . setServers = setServers ;
319326function setServers ( servers ) {
320327 // cache the original servers because in the event of an error setting the
321328 // servers cares won't have any servers available for resolution
322- const orig = defaultChannel . getServers ( ) ;
329+ const orig = this . _handle . getServers ( ) ;
323330 const newSet = [ ] ;
324331 const IPv6RE = / \[ ( .* ) \] / ;
325332 const addrSplitRE = / ( ^ .+ ?) (?: : ( \d + ) ) ? $ / ;
@@ -351,35 +358,39 @@ function setServers(servers) {
351358 throw new Error ( `IP address is not properly formatted: ${ serv } ` ) ;
352359 } ) ;
353360
354- const errorNumber = defaultChannel . setServers ( newSet ) ;
361+ const errorNumber = this . _handle . setServers ( newSet ) ;
355362
356363 if ( errorNumber !== 0 ) {
357364 // reset the servers to the old servers, because ares probably unset them
358- defaultChannel . setServers ( orig . join ( ',' ) ) ;
365+ this . _handle . setServers ( orig . join ( ',' ) ) ;
359366
360367 var err = cares . strerror ( errorNumber ) ;
361368 throw new Error ( `c-ares failed to set servers: "${ err } " [${ servers } ]` ) ;
362369 }
363370}
364371
372+ const defaultResolver = new Resolver ( ) ;
373+
365374module . exports = {
366375 lookup,
367376 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 ) ,
383394
384395 // uv_getaddrinfo flags
385396 ADDRCONFIG : cares . AI_ADDRCONFIG ,
0 commit comments