|
"use strict"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.setup = setup; |
|
const net_1 = require("net"); |
|
const constants_1 = require("./constants"); |
|
const metadata_1 = require("./metadata"); |
|
const resolver_1 = require("./resolver"); |
|
const uri_parser_1 = require("./uri-parser"); |
|
const logging = require("./logging"); |
|
const TRACER_NAME = 'ip_resolver'; |
|
function trace(text) { |
|
logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); |
|
} |
|
const IPV4_SCHEME = 'ipv4'; |
|
const IPV6_SCHEME = 'ipv6'; |
|
|
|
|
|
|
|
const DEFAULT_PORT = 443; |
|
class IpResolver { |
|
constructor(target, listener, channelOptions) { |
|
var _a; |
|
this.listener = listener; |
|
this.endpoints = []; |
|
this.error = null; |
|
this.hasReturnedResult = false; |
|
trace('Resolver constructed for target ' + (0, uri_parser_1.uriToString)(target)); |
|
const addresses = []; |
|
if (!(target.scheme === IPV4_SCHEME || target.scheme === IPV6_SCHEME)) { |
|
this.error = { |
|
code: constants_1.Status.UNAVAILABLE, |
|
details: `Unrecognized scheme ${target.scheme} in IP resolver`, |
|
metadata: new metadata_1.Metadata(), |
|
}; |
|
return; |
|
} |
|
const pathList = target.path.split(','); |
|
for (const path of pathList) { |
|
const hostPort = (0, uri_parser_1.splitHostPort)(path); |
|
if (hostPort === null) { |
|
this.error = { |
|
code: constants_1.Status.UNAVAILABLE, |
|
details: `Failed to parse ${target.scheme} address ${path}`, |
|
metadata: new metadata_1.Metadata(), |
|
}; |
|
return; |
|
} |
|
if ((target.scheme === IPV4_SCHEME && !(0, net_1.isIPv4)(hostPort.host)) || |
|
(target.scheme === IPV6_SCHEME && !(0, net_1.isIPv6)(hostPort.host))) { |
|
this.error = { |
|
code: constants_1.Status.UNAVAILABLE, |
|
details: `Failed to parse ${target.scheme} address ${path}`, |
|
metadata: new metadata_1.Metadata(), |
|
}; |
|
return; |
|
} |
|
addresses.push({ |
|
host: hostPort.host, |
|
port: (_a = hostPort.port) !== null && _a !== void 0 ? _a : DEFAULT_PORT, |
|
}); |
|
} |
|
this.endpoints = addresses.map(address => ({ addresses: [address] })); |
|
trace('Parsed ' + target.scheme + ' address list ' + addresses); |
|
} |
|
updateResolution() { |
|
if (!this.hasReturnedResult) { |
|
this.hasReturnedResult = true; |
|
process.nextTick(() => { |
|
if (this.error) { |
|
this.listener.onError(this.error); |
|
} |
|
else { |
|
this.listener.onSuccessfulResolution(this.endpoints, null, null, null, {}); |
|
} |
|
}); |
|
} |
|
} |
|
destroy() { |
|
this.hasReturnedResult = false; |
|
} |
|
static getDefaultAuthority(target) { |
|
return target.path.split(',')[0]; |
|
} |
|
} |
|
function setup() { |
|
(0, resolver_1.registerResolver)(IPV4_SCHEME, IpResolver); |
|
(0, resolver_1.registerResolver)(IPV6_SCHEME, IpResolver); |
|
} |
|
|