Skip to content

Commit e2a93d1

Browse files
George Kampitakisgkampitakis
authored andcommitted
fix: support authority overrides in the DNS resolver
1 parent a4c2106 commit e2a93d1

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

packages/grpc-js/src/resolver-dns.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
registerDefaultScheme,
2222
} from './resolver';
2323
import * as dns from 'dns';
24+
import * as dnsPromises from 'dns/promises';
2425
import * as util from 'util';
2526
import { extractAndSelectServiceConfig, ServiceConfig } from './service-config';
2627
import { Status } from './constants';
@@ -48,7 +49,6 @@ export const DEFAULT_PORT = 443;
4849
const DEFAULT_MIN_TIME_BETWEEN_RESOLUTIONS_MS = 30_000;
4950

5051
const resolveTxtPromise = util.promisify(dns.resolveTxt);
51-
const dnsLookupPromise = util.promisify(dns.lookup);
5252

5353
/**
5454
* Resolver implementation that handles DNS names and IP addresses.
@@ -63,7 +63,7 @@ class DnsResolver implements Resolver {
6363
* Failures are handled by the backoff timer.
6464
*/
6565
private readonly minTimeBetweenResolutionsMs: number;
66-
private pendingLookupPromise: Promise<dns.LookupAddress[]> | null = null;
66+
private pendingLookupPromise: Promise<string[]> | null = null;
6767
private pendingTxtPromise: Promise<string[][]> | null = null;
6868
private latestLookupResult: Endpoint[] | null = null;
6969
private latestServiceConfig: ServiceConfig | null = null;
@@ -76,12 +76,17 @@ class DnsResolver implements Resolver {
7676
private isNextResolutionTimerRunning = false;
7777
private isServiceConfigEnabled = true;
7878
private returnedIpResult = false;
79+
private resolver = new dnsPromises.Resolver();
80+
7981
constructor(
8082
private target: GrpcUri,
8183
private listener: ResolverListener,
8284
channelOptions: ChannelOptions
8385
) {
8486
trace('Resolver constructed for target ' + uriToString(target));
87+
if (target.authority) {
88+
this.resolver.setServers([target.authority]);
89+
}
8590
const hostPort = splitHostPort(target.path);
8691
if (hostPort === null) {
8792
this.ipResult = null;
@@ -189,7 +194,7 @@ class DnsResolver implements Resolver {
189194
* because when looking up a single family, dns.lookup outputs an error
190195
* if the name exists but there are no records for that family, and that
191196
* error is indistinguishable from other kinds of errors */
192-
this.pendingLookupPromise = dnsLookupPromise(hostname, { all: true });
197+
this.pendingLookupPromise = this.resolver.resolve(hostname);
193198
this.pendingLookupPromise.then(
194199
addressList => {
195200
if (this.pendingLookupPromise === null) {
@@ -199,7 +204,7 @@ class DnsResolver implements Resolver {
199204
this.backoff.reset();
200205
this.backoff.stop();
201206
const subchannelAddresses: TcpSubchannelAddress[] = addressList.map(
202-
addr => ({ host: addr.address, port: +this.port! })
207+
addr => ({ host: addr, port: +this.port! })
203208
);
204209
this.latestLookupResult = subchannelAddresses.map(address => ({
205210
addresses: [address],

0 commit comments

Comments
 (0)