UNPKG

3.8 kBJavaScriptView Raw
1"use strict";
2/*
3 * Copyright 2021 gRPC authors.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17Object.defineProperty(exports, "__esModule", { value: true });
18exports.setup = void 0;
19const net_1 = require("net");
20const constants_1 = require("./constants");
21const metadata_1 = require("./metadata");
22const resolver_1 = require("./resolver");
23const uri_parser_1 = require("./uri-parser");
24const logging = require("./logging");
25const TRACER_NAME = 'ip_resolver';
26function trace(text) {
27 logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text);
28}
29const IPV4_SCHEME = 'ipv4';
30const IPV6_SCHEME = 'ipv6';
31/**
32 * The default TCP port to connect to if not explicitly specified in the target.
33 */
34const DEFAULT_PORT = 443;
35class IpResolver {
36 constructor(target, listener, channelOptions) {
37 var _a;
38 this.target = target;
39 this.listener = listener;
40 this.addresses = [];
41 this.error = null;
42 trace('Resolver constructed for target ' + uri_parser_1.uriToString(target));
43 const addresses = [];
44 if (!(target.scheme === IPV4_SCHEME || target.scheme === IPV6_SCHEME)) {
45 this.error = {
46 code: constants_1.Status.UNAVAILABLE,
47 details: `Unrecognized scheme ${target.scheme} in IP resolver`,
48 metadata: new metadata_1.Metadata(),
49 };
50 return;
51 }
52 const pathList = target.path.split(',');
53 for (const path of pathList) {
54 const hostPort = uri_parser_1.splitHostPort(path);
55 if (hostPort === null) {
56 this.error = {
57 code: constants_1.Status.UNAVAILABLE,
58 details: `Failed to parse ${target.scheme} address ${path}`,
59 metadata: new metadata_1.Metadata(),
60 };
61 return;
62 }
63 if ((target.scheme === IPV4_SCHEME && !net_1.isIPv4(hostPort.host)) ||
64 (target.scheme === IPV6_SCHEME && !net_1.isIPv6(hostPort.host))) {
65 this.error = {
66 code: constants_1.Status.UNAVAILABLE,
67 details: `Failed to parse ${target.scheme} address ${path}`,
68 metadata: new metadata_1.Metadata(),
69 };
70 return;
71 }
72 addresses.push({
73 host: hostPort.host,
74 port: (_a = hostPort.port) !== null && _a !== void 0 ? _a : DEFAULT_PORT,
75 });
76 }
77 this.addresses = addresses;
78 trace('Parsed ' + target.scheme + ' address list ' + this.addresses);
79 }
80 updateResolution() {
81 process.nextTick(() => {
82 if (this.error) {
83 this.listener.onError(this.error);
84 }
85 else {
86 this.listener.onSuccessfulResolution(this.addresses, null, null, null, {});
87 }
88 });
89 }
90 destroy() {
91 // This resolver owns no resources, so we do nothing here.
92 }
93 static getDefaultAuthority(target) {
94 return target.path.split(',')[0];
95 }
96}
97function setup() {
98 resolver_1.registerResolver(IPV4_SCHEME, IpResolver);
99 resolver_1.registerResolver(IPV6_SCHEME, IpResolver);
100}
101exports.setup = setup;
102//# sourceMappingURL=resolver-ip.js.map
\No newline at end of file