/var/www/greso.tech/server/nsm/node_modules/@grpc/grpc-js/build/src
NameSizeModeActions
generated/-0755rm
admin.d.ts4470644editdlrm
admin.js12770644editdlrm
admin.js.map4710644editdlrm
backoff-timeout.d.ts21870644editdlrm
backoff-timeout.js50710644editdlrm
backoff-timeout.js.map29110644editdlrm
call-credentials-filter.d.ts6840644editdlrm
call-credentials-filter.js32740644editdlrm
call-credentials-filter.js.map17240644editdlrm
call-credentials.d.ts24070644editdlrm
call-credentials.js51780644editdlrm
call-credentials.js.map33630644editdlrm
call-interface.d.ts28340644editdlrm
call-interface.js31430644editdlrm
call-interface.js.map18880644editdlrm
call-number.d.ts530644editdlrm
call-number.js8850644editdlrm
call-number.js.map2400644editdlrm
call-stream.d.ts57950644editdlrm
call-stream.js301440644editdlrm
call-stream.js.map185160644editdlrm
call.d.ts36000644editdlrm
call.js50730644editdlrm
call.js.map28850644editdlrm
channel-credentials.d.ts38590644editdlrm
channel-credentials.js73160644editdlrm
channel-credentials.js.map36790644editdlrm
channel-options.d.ts27530644editdlrm
channel-options.js24300644editdlrm
channel-options.js.map13460644editdlrm
channel.d.ts37470644editdlrm
channel.js27290644editdlrm
channel.js.map14230644editdlrm
channelz.d.ts39000644editdlrm
channelz.js229800644editdlrm
channelz.js.map173670644editdlrm
client-interceptors.d.ts46110644editdlrm
client-interceptors.js177870644editdlrm
client-interceptors.js.map106010644editdlrm
client.d.ts58170644editdlrm
client.js189740644editdlrm
client.js.map118550644editdlrm
compression-algorithms.d.ts940644editdlrm
compression-algorithms.js11580644editdlrm
compression-algorithms.js.map3110644editdlrm
compression-filter.d.ts12150644editdlrm
compression-filter.js103070644editdlrm
compression-filter.js.map62650644editdlrm
connectivity-state.d.ts1350644editdlrm
connectivity-state.js12640644editdlrm
connectivity-state.js.map3270644editdlrm
constants.d.ts9440644editdlrm
constants.js31060644editdlrm
constants.js.map9500644editdlrm
control-plane-status.d.ts1690644editdlrm
control-plane-status.js15810644editdlrm
control-plane-status.js.map6700644editdlrm
deadline-filter.d.ts8250644editdlrm
deadline-filter.js36280644editdlrm
deadline-filter.js.map25790644editdlrm
deadline.d.ts7520644editdlrm
deadline.js33510644editdlrm
deadline.js.map19190644editdlrm
duration.d.ts2670644editdlrm
duration.js12530644editdlrm
duration.js.map6060644editdlrm
error.d.ts1340644editdlrm
error.js12360644editdlrm
error.js.map5200644editdlrm
events.d.ts5210644editdlrm
events.js7110644editdlrm
events.js.map1310644editdlrm
experimental.d.ts13140644editdlrm
experimental.js42110644editdlrm
experimental.js.map7640644editdlrm
filter-stack.d.ts9690644editdlrm
filter-stack.js25420644editdlrm
filter-stack.js.map20900644editdlrm
filter.d.ts11920644editdlrm
filter.js11110644editdlrm
filter.js.map4640644editdlrm
http_proxy.d.ts7270644editdlrm
http_proxy.js94240644editdlrm
http_proxy.js.map60840644editdlrm
index.d.ts53500644editdlrm
index.js92340644editdlrm
index.js.map30990644editdlrm
internal-channel.d.ts48890644editdlrm
internal-channel.js214740644editdlrm
internal-channel.js.map142310644editdlrm
load-balancer-child-handler.d.ts8150644editdlrm
load-balancer-child-handler.js52360644editdlrm
load-balancer-child-handler.js.map32460644editdlrm
load-balancer-outlier-detection.d.ts26630644editdlrm
load-balancer-outlier-detection.js257850644editdlrm
load-balancer-outlier-detection.js.map183100644editdlrm
load-balancer-pick-first.d.ts28280644editdlrm
load-balancer-pick-first.js175090644editdlrm
load-balancer-pick-first.js.map95060644editdlrm
load-balancer-round-robin.d.ts8040644editdlrm
load-balancer-round-robin.js78160644editdlrm
load-balancer-round-robin.js.map50190644editdlrm
load-balancer.d.ts44530644editdlrm
load-balancer.js48450644editdlrm
load-balancer.js.map24280644editdlrm
load-balancing-call.d.ts18470644editdlrm
load-balancing-call.js116470644editdlrm
load-balancing-call.js.map75310644editdlrm
logging.d.ts4770644editdlrm
logging.js40060644editdlrm
logging.js.map27950644editdlrm
make-client.d.ts30020644editdlrm
make-client.js54980644editdlrm
make-client.js.map31120644editdlrm
max-message-size-filter.d.ts7620644editdlrm
max-message-size-filter.js33600644editdlrm
max-message-size-filter.js.map15960644editdlrm
metadata.d.ts32410644editdlrm
metadata.js88390644editdlrm
metadata.js.map56450644editdlrm
object-stream.d.ts16040644editdlrm
object-stream.js7180644editdlrm
object-stream.js.map1450644editdlrm
picker.d.ts30390644editdlrm
picker.js31080644editdlrm
picker.js.map12520644editdlrm
resolver-dns.d.ts2320644editdlrm
resolver-dns.js133900644editdlrm
resolver-dns.js.map75580644editdlrm
resolver-ip.d.ts390644editdlrm
resolver-ip.js38330644editdlrm
resolver-ip.js.map25120644editdlrm
resolver-uds.d.ts390644editdlrm
resolver-uds.js15220644editdlrm
resolver-uds.js.map8230644editdlrm
resolver.d.ts42880644editdlrm
resolver.js32310644editdlrm
resolver.js.map13990644editdlrm
resolving-call.d.ts17540644editdlrm
resolving-call.js107110644editdlrm
resolving-call.js.map85510644editdlrm
resolving-load-balancer.d.ts28390644editdlrm
resolving-load-balancer.js120270644editdlrm
resolving-load-balancer.js.map62850644editdlrm
retrying-call.d.ts35280644editdlrm
retrying-call.js246580644editdlrm
retrying-call.js.map183180644editdlrm
server-call.d.ts82830644editdlrm
server-call.js242810644editdlrm
server-call.js.map195340644editdlrm
server-credentials.d.ts5110644editdlrm
server-credentials.js28340644editdlrm
server-credentials.js.map17870644editdlrm
server.d.ts22140644editdlrm
server.js382510644editdlrm
server.js.map268510644editdlrm
service-config.d.ts21630644editdlrm
service-config.js161610644editdlrm
service-config.js.map104750644editdlrm
status-builder.d.ts6570644editdlrm
status-builder.js17670644editdlrm
status-builder.js.map9720644editdlrm
stream-decoder.d.ts3130644editdlrm
stream-decoder.js42670644editdlrm
stream-decoder.js.map27150644editdlrm
subchannel-address.d.ts9500644editdlrm
subchannel-address.js22280644editdlrm
subchannel-address.js.map11950644editdlrm
subchannel-call.d.ts22580644editdlrm
subchannel-call.js200120644editdlrm
subchannel-call.js.map111560644editdlrm
subchannel-interface.d.ts18420644editdlrm
subchannel-interface.js17030644editdlrm
subchannel-interface.js.map9740644editdlrm
subchannel-pool.d.ts14720644editdlrm
subchannel-pool.js56740644editdlrm
subchannel-pool.js.map24940644editdlrm
subchannel.d.ts46540644editdlrm
subchannel.js145900644editdlrm
subchannel.js.map81870644editdlrm
tls-helpers.d.ts1490644editdlrm
tls-helpers.js12720644editdlrm
tls-helpers.js.map5020644editdlrm
transport.d.ts44730644editdlrm
transport.js268880644editdlrm
transport.js.map148010644editdlrm
uri-parser.d.ts3570644editdlrm
uri-parser.js32740644editdlrm
uri-parser.js.map20100644editdlrm
Edit: /var/www/greso.tech/server/nsm/node_modules/@grpc/grpc-js/build/src/transport.js (26888B)
"use strict"; /* * Copyright 2023 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ Object.defineProperty(exports, "__esModule", { value: true }); exports.Http2SubchannelConnector = void 0; const http2 = require("http2"); const tls_1 = require("tls"); const channelz_1 = require("./channelz"); const constants_1 = require("./constants"); const http_proxy_1 = require("./http_proxy"); const logging = require("./logging"); const resolver_1 = require("./resolver"); const subchannel_address_1 = require("./subchannel-address"); const uri_parser_1 = require("./uri-parser"); const net = require("net"); const subchannel_call_1 = require("./subchannel-call"); const call_number_1 = require("./call-number"); const TRACER_NAME = 'transport'; const FLOW_CONTROL_TRACER_NAME = 'transport_flowctrl'; const clientVersion = require('../../package.json').version; const { HTTP2_HEADER_AUTHORITY, HTTP2_HEADER_CONTENT_TYPE, HTTP2_HEADER_METHOD, HTTP2_HEADER_PATH, HTTP2_HEADER_TE, HTTP2_HEADER_USER_AGENT, } = http2.constants; /* setInterval and setTimeout only accept signed 32 bit integers. JS doesn't * have a constant for the max signed 32 bit integer, so this is a simple way * to calculate it */ const KEEPALIVE_MAX_TIME_MS = ~(1 << 31); const KEEPALIVE_TIMEOUT_MS = 20000; const tooManyPingsData = Buffer.from('too_many_pings', 'ascii'); class Http2Transport { constructor(session, subchannelAddress, options) { this.session = session; /** * The amount of time in between sending pings */ this.keepaliveTimeMs = -1; /** * The amount of time to wait for an acknowledgement after sending a ping */ this.keepaliveTimeoutMs = KEEPALIVE_TIMEOUT_MS; /** * Timer reference tracking when the most recent ping will be considered lost */ this.keepaliveTimeoutId = null; /** * Indicates whether keepalive pings should be sent without any active calls */ this.keepaliveWithoutCalls = false; this.activeCalls = new Set(); this.disconnectListeners = []; this.disconnectHandled = false; this.channelzEnabled = true; /** * Name of the remote server, if it is not the same as the subchannel * address, i.e. if connecting through an HTTP CONNECT proxy. */ this.remoteName = null; this.streamTracker = new channelz_1.ChannelzCallTracker(); this.keepalivesSent = 0; this.messagesSent = 0; this.messagesReceived = 0; this.lastMessageSentTimestamp = null; this.lastMessageReceivedTimestamp = null; // Build user-agent string. this.userAgent = [ options['grpc.primary_user_agent'], `grpc-node-js/${clientVersion}`, options['grpc.secondary_user_agent'], ] .filter((e) => e) .join(' '); // remove falsey values first if ('grpc.keepalive_time_ms' in options) { this.keepaliveTimeMs = options['grpc.keepalive_time_ms']; } if ('grpc.keepalive_timeout_ms' in options) { this.keepaliveTimeoutMs = options['grpc.keepalive_timeout_ms']; } if ('grpc.keepalive_permit_without_calls' in options) { this.keepaliveWithoutCalls = options['grpc.keepalive_permit_without_calls'] === 1; } else { this.keepaliveWithoutCalls = false; } this.keepaliveIntervalId = setTimeout(() => { }, 0); clearTimeout(this.keepaliveIntervalId); if (this.keepaliveWithoutCalls) { this.startKeepalivePings(); } this.subchannelAddressString = (0, subchannel_address_1.subchannelAddressToString)(subchannelAddress); if (options['grpc.enable_channelz'] === 0) { this.channelzEnabled = false; } this.channelzRef = (0, channelz_1.registerChannelzSocket)(this.subchannelAddressString, () => this.getChannelzInfo(), this.channelzEnabled); session.once('close', () => { this.trace('session closed'); this.stopKeepalivePings(); this.handleDisconnect(); }); session.once('goaway', (errorCode, lastStreamID, opaqueData) => { let tooManyPings = false; /* See the last paragraph of * https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md#basic-keepalive */ if (errorCode === http2.constants.NGHTTP2_ENHANCE_YOUR_CALM && opaqueData.equals(tooManyPingsData)) { tooManyPings = true; } this.trace('connection closed by GOAWAY with code ' + errorCode); this.reportDisconnectToOwner(tooManyPings); }); session.once('error', error => { /* Do nothing here. Any error should also trigger a close event, which is * where we want to handle that. */ this.trace('connection closed with error ' + error.message); }); if (logging.isTracerEnabled(TRACER_NAME)) { session.on('remoteSettings', (settings) => { this.trace('new settings received' + (this.session !== session ? ' on the old connection' : '') + ': ' + JSON.stringify(settings)); }); session.on('localSettings', (settings) => { this.trace('local settings acknowledged by remote' + (this.session !== session ? ' on the old connection' : '') + ': ' + JSON.stringify(settings)); }); } } getChannelzInfo() { var _a, _b, _c; const sessionSocket = this.session.socket; const remoteAddress = sessionSocket.remoteAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.remoteAddress, sessionSocket.remotePort) : null; const localAddress = sessionSocket.localAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.localAddress, sessionSocket.localPort) : null; let tlsInfo; if (this.session.encrypted) { const tlsSocket = sessionSocket; const cipherInfo = tlsSocket.getCipher(); const certificate = tlsSocket.getCertificate(); const peerCertificate = tlsSocket.getPeerCertificate(); tlsInfo = { cipherSuiteStandardName: (_a = cipherInfo.standardName) !== null && _a !== void 0 ? _a : null, cipherSuiteOtherName: cipherInfo.standardName ? null : cipherInfo.name, localCertificate: (certificate && 'raw' in certificate) ? certificate.raw : null, remoteCertificate: (peerCertificate && 'raw' in peerCertificate) ? peerCertificate.raw : null }; } else { tlsInfo = null; } const socketInfo = { remoteAddress: remoteAddress, localAddress: localAddress, security: tlsInfo, remoteName: this.remoteName, streamsStarted: this.streamTracker.callsStarted, streamsSucceeded: this.streamTracker.callsSucceeded, streamsFailed: this.streamTracker.callsFailed, messagesSent: this.messagesSent, messagesReceived: this.messagesReceived, keepAlivesSent: this.keepalivesSent, lastLocalStreamCreatedTimestamp: this.streamTracker.lastCallStartedTimestamp, lastRemoteStreamCreatedTimestamp: null, lastMessageSentTimestamp: this.lastMessageSentTimestamp, lastMessageReceivedTimestamp: this.lastMessageReceivedTimestamp, localFlowControlWindow: (_b = this.session.state.localWindowSize) !== null && _b !== void 0 ? _b : null, remoteFlowControlWindow: (_c = this.session.state.remoteWindowSize) !== null && _c !== void 0 ? _c : null }; return socketInfo; } trace(text) { logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, '(' + this.channelzRef.id + ') ' + this.subchannelAddressString + ' ' + text); } keepaliveTrace(text) { logging.trace(constants_1.LogVerbosity.DEBUG, 'keepalive', '(' + this.channelzRef.id + ') ' + this.subchannelAddressString + ' ' + text); } flowControlTrace(text) { logging.trace(constants_1.LogVerbosity.DEBUG, FLOW_CONTROL_TRACER_NAME, '(' + this.channelzRef.id + ') ' + this.subchannelAddressString + ' ' + text); } internalsTrace(text) { logging.trace(constants_1.LogVerbosity.DEBUG, 'transport_internals', '(' + this.channelzRef.id + ') ' + this.subchannelAddressString + ' ' + text); } /** * Indicate to the owner of this object that this transport should no longer * be used. That happens if the connection drops, or if the server sends a * GOAWAY. * @param tooManyPings If true, this was triggered by a GOAWAY with data * indicating that the session was closed becaues the client sent too many * pings. * @returns */ reportDisconnectToOwner(tooManyPings) { if (this.disconnectHandled) { return; } this.disconnectHandled = true; this.disconnectListeners.forEach(listener => listener(tooManyPings)); } /** * Handle connection drops, but not GOAWAYs. */ handleDisconnect() { this.reportDisconnectToOwner(false); /* Give calls an event loop cycle to finish naturally before reporting the * disconnnection to them. */ setImmediate(() => { for (const call of this.activeCalls) { call.onDisconnect(); } }); } addDisconnectListener(listener) { this.disconnectListeners.push(listener); } clearKeepaliveTimeout() { if (!this.keepaliveTimeoutId) { return; } clearTimeout(this.keepaliveTimeoutId); this.keepaliveTimeoutId = null; } sendPing() { var _a, _b; if (this.channelzEnabled) { this.keepalivesSent += 1; } this.keepaliveTrace('Sending ping with timeout ' + this.keepaliveTimeoutMs + 'ms'); if (!this.keepaliveTimeoutId) { this.keepaliveTimeoutId = setTimeout(() => { this.keepaliveTrace('Ping timeout passed without response'); this.handleDisconnect(); }, this.keepaliveTimeoutMs); (_b = (_a = this.keepaliveTimeoutId).unref) === null || _b === void 0 ? void 0 : _b.call(_a); } try { this.session.ping((err, duration, payload) => { this.keepaliveTrace('Received ping response'); this.clearKeepaliveTimeout(); }); } catch (e) { /* If we fail to send a ping, the connection is no longer functional, so * we should discard it. */ this.handleDisconnect(); } } startKeepalivePings() { var _a, _b; if (this.keepaliveTimeMs < 0) { return; } this.keepaliveIntervalId = setInterval(() => { this.sendPing(); }, this.keepaliveTimeMs); (_b = (_a = this.keepaliveIntervalId).unref) === null || _b === void 0 ? void 0 : _b.call(_a); /* Don't send a ping immediately because whatever caused us to start * sending pings should also involve some network activity. */ } /** * Stop keepalive pings when terminating a connection. This discards the * outstanding ping timeout, so it should not be called if the same * connection will still be used. */ stopKeepalivePings() { clearInterval(this.keepaliveIntervalId); this.clearKeepaliveTimeout(); } removeActiveCall(call) { this.activeCalls.delete(call); if (this.activeCalls.size === 0) { this.session.unref(); if (!this.keepaliveWithoutCalls) { this.stopKeepalivePings(); } } } addActiveCall(call) { if (this.activeCalls.size === 0) { this.session.ref(); if (!this.keepaliveWithoutCalls) { this.startKeepalivePings(); } } this.activeCalls.add(call); } createCall(metadata, host, method, listener, subchannelCallStatsTracker) { const headers = metadata.toHttp2Headers(); headers[HTTP2_HEADER_AUTHORITY] = host; headers[HTTP2_HEADER_USER_AGENT] = this.userAgent; headers[HTTP2_HEADER_CONTENT_TYPE] = 'application/grpc'; headers[HTTP2_HEADER_METHOD] = 'POST'; headers[HTTP2_HEADER_PATH] = method; headers[HTTP2_HEADER_TE] = 'trailers'; let http2Stream; /* In theory, if an error is thrown by session.request because session has * become unusable (e.g. because it has received a goaway), this subchannel * should soon see the corresponding close or goaway event anyway and leave * READY. But we have seen reports that this does not happen * (https://github.com/googleapis/nodejs-firestore/issues/1023#issuecomment-653204096) * so for defense in depth, we just discard the session when we see an * error here. */ try { http2Stream = this.session.request(headers); } catch (e) { this.handleDisconnect(); throw e; } this.flowControlTrace('local window size: ' + this.session.state.localWindowSize + ' remote window size: ' + this.session.state.remoteWindowSize); this.internalsTrace('session.closed=' + this.session.closed + ' session.destroyed=' + this.session.destroyed + ' session.socket.destroyed=' + this.session.socket.destroyed); let eventTracker; let call; if (this.channelzEnabled) { this.streamTracker.addCallStarted(); eventTracker = { addMessageSent: () => { var _a; this.messagesSent += 1; this.lastMessageSentTimestamp = new Date(); (_a = subchannelCallStatsTracker.addMessageSent) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker); }, addMessageReceived: () => { var _a; this.messagesReceived += 1; this.lastMessageReceivedTimestamp = new Date(); (_a = subchannelCallStatsTracker.addMessageReceived) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker); }, onCallEnd: status => { var _a; (_a = subchannelCallStatsTracker.onCallEnd) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker, status); this.removeActiveCall(call); }, onStreamEnd: success => { var _a; if (success) { this.streamTracker.addCallSucceeded(); } else { this.streamTracker.addCallFailed(); } (_a = subchannelCallStatsTracker.onStreamEnd) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker, success); } }; } else { eventTracker = { addMessageSent: () => { var _a; (_a = subchannelCallStatsTracker.addMessageSent) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker); }, addMessageReceived: () => { var _a; (_a = subchannelCallStatsTracker.addMessageReceived) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker); }, onCallEnd: (status) => { var _a; (_a = subchannelCallStatsTracker.onCallEnd) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker, status); this.removeActiveCall(call); }, onStreamEnd: (success) => { var _a; (_a = subchannelCallStatsTracker.onStreamEnd) === null || _a === void 0 ? void 0 : _a.call(subchannelCallStatsTracker, success); } }; } call = new subchannel_call_1.Http2SubchannelCall(http2Stream, eventTracker, listener, this, (0, call_number_1.getNextCallNumber)()); this.addActiveCall(call); return call; } getChannelzRef() { return this.channelzRef; } getPeerName() { return this.subchannelAddressString; } shutdown() { this.session.close(); (0, channelz_1.unregisterChannelzRef)(this.channelzRef); } } class Http2SubchannelConnector { constructor(channelTarget) { this.channelTarget = channelTarget; this.session = null; this.isShutdown = false; } trace(text) { } createSession(address, credentials, options, proxyConnectionResult) { if (this.isShutdown) { return Promise.reject(); } return new Promise((resolve, reject) => { var _a, _b, _c; let remoteName; if (proxyConnectionResult.realTarget) { remoteName = (0, uri_parser_1.uriToString)(proxyConnectionResult.realTarget); this.trace('creating HTTP/2 session through proxy to ' + (0, uri_parser_1.uriToString)(proxyConnectionResult.realTarget)); } else { remoteName = null; this.trace('creating HTTP/2 session to ' + (0, subchannel_address_1.subchannelAddressToString)(address)); } const targetAuthority = (0, resolver_1.getDefaultAuthority)((_a = proxyConnectionResult.realTarget) !== null && _a !== void 0 ? _a : this.channelTarget); let connectionOptions = credentials._getConnectionOptions() || {}; connectionOptions.maxSendHeaderBlockLength = Number.MAX_SAFE_INTEGER; if ('grpc-node.max_session_memory' in options) { connectionOptions.maxSessionMemory = options['grpc-node.max_session_memory']; } else { /* By default, set a very large max session memory limit, to effectively * disable enforcement of the limit. Some testing indicates that Node's * behavior degrades badly when this limit is reached, so we solve that * by disabling the check entirely. */ connectionOptions.maxSessionMemory = Number.MAX_SAFE_INTEGER; } let addressScheme = 'http://'; if ('secureContext' in connectionOptions) { addressScheme = 'https://'; // If provided, the value of grpc.ssl_target_name_override should be used // to override the target hostname when checking server identity. // This option is used for testing only. if (options['grpc.ssl_target_name_override']) { const sslTargetNameOverride = options['grpc.ssl_target_name_override']; connectionOptions.checkServerIdentity = (host, cert) => { return (0, tls_1.checkServerIdentity)(sslTargetNameOverride, cert); }; connectionOptions.servername = sslTargetNameOverride; } else { const authorityHostname = (_c = (_b = (0, uri_parser_1.splitHostPort)(targetAuthority)) === null || _b === void 0 ? void 0 : _b.host) !== null && _c !== void 0 ? _c : 'localhost'; // We want to always set servername to support SNI connectionOptions.servername = authorityHostname; } if (proxyConnectionResult.socket) { /* This is part of the workaround for * https://github.com/nodejs/node/issues/32922. Without that bug, * proxyConnectionResult.socket would always be a plaintext socket and * this would say * connectionOptions.socket = proxyConnectionResult.socket; */ connectionOptions.createConnection = (authority, option) => { return proxyConnectionResult.socket; }; } } else { /* In all but the most recent versions of Node, http2.connect does not use * the options when establishing plaintext connections, so we need to * establish that connection explicitly. */ connectionOptions.createConnection = (authority, option) => { if (proxyConnectionResult.socket) { return proxyConnectionResult.socket; } else { /* net.NetConnectOpts is declared in a way that is more restrictive * than what net.connect will actually accept, so we use the type * assertion to work around that. */ return net.connect(address); } }; } connectionOptions = Object.assign(Object.assign({}, connectionOptions), address); /* http2.connect uses the options here: * https://github.com/nodejs/node/blob/70c32a6d190e2b5d7b9ff9d5b6a459d14e8b7d59/lib/internal/http2/core.js#L3028-L3036 * The spread operator overides earlier values with later ones, so any port * or host values in the options will be used rather than any values extracted * from the first argument. In addition, the path overrides the host and port, * as documented for plaintext connections here: * https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener * and for TLS connections here: * https://nodejs.org/api/tls.html#tls_tls_connect_options_callback. In * earlier versions of Node, http2.connect passes these options to * tls.connect but not net.connect, so in the insecure case we still need * to set the createConnection option above to create the connection * explicitly. We cannot do that in the TLS case because http2.connect * passes necessary additional options to tls.connect. * The first argument just needs to be parseable as a URL and the scheme * determines whether the connection will be established over TLS or not. */ const session = http2.connect(addressScheme + targetAuthority, connectionOptions); this.session = session; session.unref(); session.once('connect', () => { session.removeAllListeners(); resolve(new Http2Transport(session, address, options)); this.session = null; }); session.once('close', () => { this.session = null; reject(); }); session.once('error', error => { this.trace('connection failed with error ' + error.message); }); }); } connect(address, credentials, options) { var _a, _b; if (this.isShutdown) { return Promise.reject(); } /* Pass connection options through to the proxy so that it's able to * upgrade it's connection to support tls if needed. * This is a workaround for https://github.com/nodejs/node/issues/32922 * See https://github.com/grpc/grpc-node/pull/1369 for more info. */ const connectionOptions = credentials._getConnectionOptions() || {}; if ('secureContext' in connectionOptions) { connectionOptions.ALPNProtocols = ['h2']; // If provided, the value of grpc.ssl_target_name_override should be used // to override the target hostname when checking server identity. // This option is used for testing only. if (options['grpc.ssl_target_name_override']) { const sslTargetNameOverride = options['grpc.ssl_target_name_override']; connectionOptions.checkServerIdentity = (host, cert) => { return (0, tls_1.checkServerIdentity)(sslTargetNameOverride, cert); }; connectionOptions.servername = sslTargetNameOverride; } else { if ('grpc.http_connect_target' in options) { /* This is more or less how servername will be set in createSession * if a connection is successfully established through the proxy. * If the proxy is not used, these connectionOptions are discarded * anyway */ const targetPath = (0, resolver_1.getDefaultAuthority)((_a = (0, uri_parser_1.parseUri)(options['grpc.http_connect_target'])) !== null && _a !== void 0 ? _a : { path: 'localhost', }); const hostPort = (0, uri_parser_1.splitHostPort)(targetPath); connectionOptions.servername = (_b = hostPort === null || hostPort === void 0 ? void 0 : hostPort.host) !== null && _b !== void 0 ? _b : targetPath; } } } return (0, http_proxy_1.getProxiedConnection)(address, options, connectionOptions).then(result => this.createSession(address, credentials, options, result)); } shutdown() { var _a; this.isShutdown = true; (_a = this.session) === null || _a === void 0 ? void 0 : _a.close(); this.session = null; } } exports.Http2SubchannelConnector = Http2SubchannelConnector; //# sourceMappingURL=transport.js.map