Socket
Socket
Sign inDemoInstall

@microsoft/dev-tunnels-connections

Package Overview
Dependencies
Maintainers
4
Versions
110
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@microsoft/dev-tunnels-connections - npm Package Compare versions

Comparing version 1.0.7456 to 1.0.7458

refreshingTunnelEventArgs.d.ts

3

connectionStatus.d.ts

@@ -26,4 +26,3 @@ /**

/**
* Refreshing tunnel host public key.
* This may happen when a client is connecting to a tunnel with a stale host public key. SDK client will try to fetch a fresh tunnel from the tunnelManagementClient.
* @deprecated Use {@link TunnelConnection.refreshingTunnel} instead.
*/

@@ -30,0 +29,0 @@ RefreshingTunnelHostPublicKey = "refreshingTunnelHostPublicKey"

@@ -32,4 +32,3 @@ "use strict";

/**
* Refreshing tunnel host public key.
* This may happen when a client is connecting to a tunnel with a stale host public key. SDK client will try to fetch a fresh tunnel from the tunnelManagementClient.
* @deprecated Use {@link TunnelConnection.refreshingTunnel} instead.
*/

@@ -36,0 +35,0 @@ ConnectionStatus["RefreshingTunnelHostPublicKey"] = "refreshingTunnelHostPublicKey";

@@ -9,5 +9,3 @@ export * from './tunnelClient';

export * from './tunnelClient';
export * from './tunnelClientBase';
export * from './tunnelHost';
export * from './tunnelHostBase';
export * from './tunnelRelayStreamFactory';

@@ -21,5 +19,7 @@ export * from './defaultTunnelRelayStreamFactory';

export * from './connectionStatusChangedEventArgs';
export { maxReconnectDelayMs } from './relayTunnelConnector';
export * from './refreshingTunnelAccessTokenEventArgs';
export * from './refreshingTunnelEventArgs';
export * from './retryingTunnelConnectionEventArgs';
export * from './tunnelConnector';
//# sourceMappingURL=index.d.ts.map

@@ -19,2 +19,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.maxReconnectDelayMs = void 0;
__exportStar(require("./tunnelClient"), exports);

@@ -28,5 +29,3 @@ __exportStar(require("./tunnelHost"), exports);

__exportStar(require("./tunnelClient"), exports);
__exportStar(require("./tunnelClientBase"), exports);
__exportStar(require("./tunnelHost"), exports);
__exportStar(require("./tunnelHostBase"), exports);
__exportStar(require("./tunnelRelayStreamFactory"), exports);

@@ -40,5 +39,8 @@ __exportStar(require("./defaultTunnelRelayStreamFactory"), exports);

__exportStar(require("./connectionStatusChangedEventArgs"), exports);
var relayTunnelConnector_1 = require("./relayTunnelConnector");
Object.defineProperty(exports, "maxReconnectDelayMs", { enumerable: true, get: function () { return relayTunnelConnector_1.maxReconnectDelayMs; } });
__exportStar(require("./refreshingTunnelAccessTokenEventArgs"), exports);
__exportStar(require("./refreshingTunnelEventArgs"), exports);
__exportStar(require("./retryingTunnelConnectionEventArgs"), exports);
__exportStar(require("./tunnelConnector"), exports);
//# sourceMappingURL=index.js.map
{
"name": "@microsoft/dev-tunnels-connections",
"version": "1.0.7456",
"version": "1.0.7458",
"description": "Tunnels library for Visual Studio tools",

@@ -5,0 +5,0 @@ "keywords": [

@@ -5,2 +5,3 @@ import { CancellationToken } from '@microsoft/dev-tunnels-ssh';

import { TunnelConnectionOptions } from './tunnelConnectionOptions';
export declare const maxReconnectDelayMs = 13000;
/**

@@ -7,0 +8,0 @@ * Tunnel connector that connects a tunnel session to a web socket stream in the tunnel Relay service.

@@ -5,3 +5,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.RelayTunnelConnector = void 0;
exports.RelayTunnelConnector = exports.maxReconnectDelayMs = void 0;
const dev_tunnels_ssh_1 = require("@microsoft/dev-tunnels-ssh");

@@ -12,3 +12,3 @@ const utils_1 = require("./utils");

// After the 6th attemt, each next attempt will happen after a delay of 2^7 * 100ms = 12.8s
const maxReconnectDelayMs = 13000;
exports.maxReconnectDelayMs = 13000;
// Delay between the 1st and the 2nd attempts.

@@ -39,3 +39,4 @@ const reconnectInitialDelayMs = 100;

function throwIfCancellation(e) {
if (e instanceof dev_tunnels_ssh_1.CancellationError && (cancellation === null || cancellation === void 0 ? void 0 : cancellation.isCancellationRequested)) {
if ((e instanceof dev_tunnels_ssh_1.CancellationError && (cancellation === null || cancellation === void 0 ? void 0 : cancellation.isCancellationRequested)) ||
e instanceof dev_tunnels_ssh_1.ObjectDisposedError) {
error = undefined;

@@ -61,155 +62,176 @@ disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.byApplication;

let errorDescription;
for (let attempt = 0;; attempt++) {
if (cancellation === null || cancellation === void 0 ? void 0 : cancellation.isCancellationRequested) {
throw new dev_tunnels_ssh_1.CancellationError();
}
if (attempt > 0) {
if (error) {
if (!((_a = options === null || options === void 0 ? void 0 : options.enableRetry) !== null && _a !== void 0 ? _a : true)) {
throw error;
this.tunnelSession.startConnecting();
try {
for (let attempt = 0;; attempt++) {
if (cancellation === null || cancellation === void 0 ? void 0 : cancellation.isCancellationRequested) {
throw new dev_tunnels_ssh_1.CancellationError();
}
if (attempt > 0) {
if (error) {
if (!((_a = options === null || options === void 0 ? void 0 : options.enableRetry) !== null && _a !== void 0 ? _a : true)) {
throw error;
}
const args = new retryingTunnelConnectionEventArgs_1.RetryingTunnelConnectionEventArgs(error, attemptDelayMs);
this.tunnelSession.onRetrying(args);
if (!args.retry) {
// Stop retries.
throw error;
}
if (args.delayMs >= reconnectInitialDelayMs) {
attemptDelayMs = args.delayMs;
}
else {
isDelayNeeded = false;
}
}
const args = new retryingTunnelConnectionEventArgs_1.RetryingTunnelConnectionEventArgs(error, attemptDelayMs);
this.tunnelSession.onRetrying(args);
if (!args.retry) {
// Stop retries.
throw error;
const retryTiming = isDelayNeeded
? ` in ${attemptDelayMs < 1000
? `0.${attemptDelayMs / 100}s`
: `${attemptDelayMs / 1000}s`}`
: '';
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Error connecting to tunnel SSH session, retrying${retryTiming}${errorDescription ? `: ${errorDescription}` : ''}`);
if (isDelayNeeded) {
try {
await (0, utils_1.delay)(attemptDelayMs, cancellation);
}
catch (e) {
throwIfCancellation(e);
throw e;
}
if (attemptDelayMs < exports.maxReconnectDelayMs) {
attemptDelayMs = attemptDelayMs << 1;
}
}
if (args.delayMs >= reconnectInitialDelayMs) {
attemptDelayMs = args.delayMs;
}
else {
isDelayNeeded = false;
}
}
const retryTiming = isDelayNeeded
? ` in ${attemptDelayMs < 1000
? `0.${attemptDelayMs / 100}s`
: `${attemptDelayMs / 1000}s`}`
: '';
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Error connecting to tunnel SSH session, retrying${retryTiming}${errorDescription ? `: ${errorDescription}` : ''}`);
if (isDelayNeeded) {
await (0, utils_1.delay)(attemptDelayMs, cancellation);
if (attemptDelayMs < maxReconnectDelayMs) {
attemptDelayMs = attemptDelayMs << 1;
}
isDelayNeeded = true;
let stream = undefined;
errorDescription = undefined;
disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.connectionLost;
error = undefined;
try {
const streamAndProtocol = await this.tunnelSession.createSessionStream(options, cancellation);
stream = streamAndProtocol.stream;
await this.tunnelSession.configureSession(stream, streamAndProtocol.protocol, isReconnect, cancellation);
stream = undefined;
disconnectReason = undefined;
return;
}
}
isDelayNeeded = true;
let stream = undefined;
errorDescription = undefined;
disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.connectionLost;
error = undefined;
try {
const streamAndProtocol = await this.tunnelSession.createSessionStream(options, cancellation);
stream = streamAndProtocol.stream;
await this.tunnelSession.configureSession(stream, streamAndProtocol.protocol, isReconnect, cancellation);
stream = undefined;
disconnectReason = undefined;
return;
}
catch (e) {
if (!(e instanceof Error)) {
// Not recoverable if we cannot recognize the error object.
throwError(`Failed to connect to the tunnel service and start tunnel SSH session: ${e}`);
}
throwIfCancellation(e);
error = e;
errorDescription = error.message;
// Browser web socket relay error - retry until max number of attempts is exceeded.
if (e instanceof sshHelpers_1.BrowserWebSocketRelayError) {
if (browserReconnectAttempt++ >= maxBrowserReconnectAttempts) {
throw e;
catch (e) {
if (!(e instanceof Error)) {
// Not recoverable if we cannot recognize the error object.
throwError(`Failed to connect to the tunnel service and start tunnel SSH session: ${e}`);
}
continue;
}
// SSH reconnection error. Disable reconnection and try again without delay.
if (e instanceof dev_tunnels_ssh_1.SshReconnectError) {
disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.protocolError;
isDelayNeeded = false;
isReconnect = false;
continue;
}
// SSH connection error. Only 'connection lost' is recoverable.
if (e instanceof dev_tunnels_ssh_1.SshConnectionError) {
const reason = e.reason;
if (reason === dev_tunnels_ssh_1.SshDisconnectReason.connectionLost) {
throwIfCancellation(e);
error = e;
errorDescription = error.message;
// Browser web socket relay error - retry until max number of attempts is exceeded.
if (e instanceof sshHelpers_1.BrowserWebSocketRelayError) {
if (browserReconnectAttempt++ >= maxBrowserReconnectAttempts) {
throw e;
}
continue;
}
disconnectReason = reason || dev_tunnels_ssh_1.SshDisconnectReason.byApplication;
throwError(`Failed to start tunnel SSH session: ${errorDescription}`);
}
// Web socket connection error
if (e instanceof sshHelpers_1.RelayConnectionError) {
const statusCode = (_b = e.errorContext) === null || _b === void 0 ? void 0 : _b.statusCode;
const statusCodeText = statusCode ? ` (${statusCode})` : '';
switch (errorDescription) {
case 'error.relayClientUnauthorized': {
const notAuthorizedText = 'Not authorized' + statusCodeText;
if (isTunnelAccessTokenRefreshed) {
// We've already refreshed the tunnel access token once.
throwError(`${notAuthorizedText}. Refreshed tunnel access token also does not work.`);
}
try {
isTunnelAccessTokenRefreshed = await this.tunnelSession.refreshTunnelAccessToken(cancellation);
}
catch (refreshError) {
throwIfCancellation(refreshError);
throwError(`${notAuthorizedText}. Refreshing tunnel access token failed with error ${(0, utils_1.getErrorMessage)(refreshError)}`);
}
if (!isTunnelAccessTokenRefreshed) {
throwError(`${notAuthorizedText}. Provide a fresh tunnel access token with '${this.tunnelSession.tunnelAccessScope}' scope.`);
}
isDelayNeeded = false;
errorDescription =
'The tunnel access token was no longer valid and had just been refreshed.';
// SSH reconnection error. Disable reconnection and try again without delay.
if (e instanceof dev_tunnels_ssh_1.SshReconnectError) {
disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.protocolError;
isDelayNeeded = false;
isReconnect = false;
continue;
}
// SSH connection error. Only 'connection lost' is recoverable.
if (e instanceof dev_tunnels_ssh_1.SshConnectionError) {
const reason = e.reason;
if (reason === dev_tunnels_ssh_1.SshDisconnectReason.connectionLost) {
continue;
}
case 'error.relayClientForbidden':
throwError(`Forbidden${statusCodeText}. Provide a fresh tunnel access token with '${this.tunnelSession.tunnelAccessScope}' scope.`);
break;
case 'error.tunnelPortNotFound':
throwError(`The tunnel or port is not found${statusCodeText}`);
break;
case 'error.serviceUnavailable':
// Normally nginx choses another healthy pod when it encounters 503.
// However, if there are no other pods, it returns 503 to the client.
disconnectReason = reason || dev_tunnels_ssh_1.SshDisconnectReason.byApplication;
throwError(`Failed to start tunnel SSH session: ${errorDescription}`);
}
// Web socket connection error
if (e instanceof sshHelpers_1.RelayConnectionError) {
const statusCode = (_b = e.errorContext) === null || _b === void 0 ? void 0 : _b.statusCode;
const statusCodeText = statusCode ? ` (${statusCode})` : '';
switch (errorDescription) {
case 'error.relayClientUnauthorized': {
const notAuthorizedText = 'Not authorized' + statusCodeText;
disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.authCancelledByUser;
if (isTunnelAccessTokenRefreshed) {
// We've already refreshed the tunnel access token once.
throwError(`${notAuthorizedText}. Refreshed tunnel access token also does not work.`);
}
try {
isTunnelAccessTokenRefreshed = await this.tunnelSession.refreshTunnelAccessToken(cancellation);
}
catch (refreshError) {
throwIfCancellation(refreshError);
throwError(`${notAuthorizedText}. Refreshing tunnel access token failed with error ${(0, utils_1.getErrorMessage)(refreshError)}`);
}
if (!isTunnelAccessTokenRefreshed) {
throwError(`${notAuthorizedText}. Provide a fresh tunnel access token with '${this.tunnelSession.tunnelAccessScope}' scope.`);
}
isDelayNeeded = false;
errorDescription =
'The tunnel access token was no longer valid and had just been refreshed.';
continue;
}
case 'error.relayClientForbidden':
disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.authCancelledByUser;
throwError(`Forbidden${statusCodeText}. Provide a fresh tunnel access token with '${this.tunnelSession.tunnelAccessScope}' scope.`);
break;
case 'error.tunnelPortNotFound':
throwError(`The tunnel or port is not found${statusCodeText}`);
break;
// Normally nginx choses another healthy pod when it cannot establish connection to a pod.
// However, if there are no other pods, it may returns 502 (Bad Gateway) to the client.
// This rare case may happen when the cluster recovers from a failure
// and the nginx controller has started but Relay service has not yet.
errorDescription = `Service temporarily unavailable${statusCodeText}`;
continue;
case 'error.tooManyRequests':
errorDescription = `Rate limit exceeded${statusCodeText}. Too many requests in a given amount of time.`;
if (attempt > 3) {
throwError(errorDescription);
}
if (attemptDelayMs < maxReconnectDelayMs) {
attemptDelayMs = attemptDelayMs << 1;
}
continue;
default:
if (errorDescription === null || errorDescription === void 0 ? void 0 : errorDescription.startsWith('error.relayConnectionError ')) {
const recoverableError = recoverableNetworkErrors.find((s) => errorDescription.includes(s));
if (recoverableError) {
errorDescription = `Failed to connect to Relay server: ${recoverableError}`;
continue;
// 503 (Service Unavailable) can happen when Relay calls control plane to authenticate the request,
// control plane hits 429s from Cosmos DB and replies back with 503.
// 429 (Too Many Requests) can happen if client exceeds request rate limits.
case 'error.badGateway':
case 'error.serviceUnavailable':
case 'error.tooManyRequests':
errorDescription = errorDescription === 'error.tooManyRequests'
? `Rate limit exceeded${statusCodeText}. Too many requests in a given amount of time.`
: `Service temporarily unavailable${statusCodeText}`;
disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.serviceNotAvailable;
// Do not attempt more than 3 times to not overwhelm the service.
if (attempt > 3) {
throwError(errorDescription);
}
}
// Increase the attempt delay to reduce load on the service and let it recover.
if (attemptDelayMs < exports.maxReconnectDelayMs / 2) {
attemptDelayMs = exports.maxReconnectDelayMs / 2;
}
continue;
default:
if (errorDescription === null || errorDescription === void 0 ? void 0 : errorDescription.startsWith('error.relayConnectionError ')) {
const recoverableError = recoverableNetworkErrors.find((s) => errorDescription.includes(s));
if (recoverableError) {
errorDescription = `Failed to connect to Relay server: ${recoverableError}`;
continue;
}
}
}
}
// Everything else is not recoverable
throw e;
}
// Everything else is not recoverable
throw e;
}
finally {
// Graft SSH disconnect reason on to the error object as 'reason' property.
if (error && disconnectReason && !error.reason) {
error.reason = disconnectReason;
finally {
// Graft SSH disconnect reason on to the error object as 'reason' property.
if (error && disconnectReason && !error.reason) {
error.reason = disconnectReason;
}
if (disconnectReason) {
await this.tunnelSession.closeSession(disconnectReason, error);
}
if (stream) {
await stream.close(error);
}
}
if (disconnectReason) {
await this.tunnelSession.closeSession(error);
}
if (stream) {
await stream.close(error);
}
}
}
finally {
this.tunnelSession.finishConnecting(disconnectReason, error);
}
}

@@ -216,0 +238,0 @@ }

@@ -112,3 +112,4 @@ /// <reference types="node" />

TooManyRequests = 7,
ServiceUnavailable = 8
ServiceUnavailable = 8,
BadGateway = 9
}

@@ -115,0 +116,0 @@ /**

@@ -208,2 +208,3 @@ "use strict";

RelayErrorType[RelayErrorType["ServiceUnavailable"] = 8] = "ServiceUnavailable";
RelayErrorType[RelayErrorType["BadGateway"] = 9] = "BadGateway";
})(RelayErrorType = exports.RelayErrorType || (exports.RelayErrorType = {}));

@@ -256,2 +257,8 @@ /**

{
regex: /status: 502/,
statusCode: 502,
error: 'badGateway',
errorType: RelayErrorType.BadGateway,
},
{
regex: /status: 503/,

@@ -258,0 +265,0 @@ statusCode: 503,

@@ -1,1 +0,1 @@

{"program":{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../src/connections/connectionStatus.ts","../../../src/connections/connectionStatusChangedEventArgs.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/events/index.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/sshAlgorithm.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/vscode-jsonrpc/lib/thenable.d.ts","../../../node_modules/vscode-jsonrpc/lib/messages.d.ts","../../../node_modules/vscode-jsonrpc/lib/events.d.ts","../../../node_modules/vscode-jsonrpc/lib/messageReader.d.ts","../../../node_modules/vscode-jsonrpc/lib/messageWriter.d.ts","../../../node_modules/vscode-jsonrpc/lib/cancellation.d.ts","../../../node_modules/vscode-jsonrpc/lib/linkedMap.d.ts","../../../node_modules/vscode-jsonrpc/lib/pipeSupport.d.ts","../../../node_modules/vscode-jsonrpc/lib/socketSupport.d.ts","../../../node_modules/vscode-jsonrpc/lib/main.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/hmacAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/keyExchangeAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/io/bigInt.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/publicKeyAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/encryptionAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/compressionAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/web/webRsa.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/ecdsaCurves.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/web/webECDsa.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/web/webEncryption.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/sshAlgorithms.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/trace.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/cancellation.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/streams.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/io/sshData.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/sshMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/connectionMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/metrics/channelMetrics.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshRequestEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshChannelClosedEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshExtendedDataEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshChannel.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshVersionInfo.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/kexMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshSessionAlgorithms.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/keyExchangeService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/promiseCompletionSource.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/connectionService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/transportMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/metrics/sessionMetrics.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/authenticationMethod.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/authenticationMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshAuthenticatingEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshSessionClosedEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshChannelOpeningEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshSession.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/sshService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshSessionConfiguration.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshCredentials.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshClientSession.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshServerSession.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshRpcMessageStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/serviceActivation.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/io/derData.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/errors.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/semaphore.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/queue.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/metrics/sessionContour.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/multiChannelStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/secureStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/index.d.ts","../../../node_modules/@types/websocket/index.d.ts","../../../src/connections/tunnelRelayStreamFactory.ts","../../../src/connections/sshHelpers.ts","../../../src/connections/defaultTunnelRelayStreamFactory.ts","../contracts/tunnelAccessControlEntryType.d.ts","../contracts/tunnelAccessControlEntry.d.ts","../contracts/tunnelAccessControlStatics.d.ts","../contracts/tunnelAccessControl.d.ts","../contracts/tunnelConnectionMode.d.ts","../contracts/tunnelEndpointStatics.d.ts","../contracts/tunnelEndpoint.d.ts","../contracts/tunnelOptions.d.ts","../contracts/resourceStatus.d.ts","../contracts/rateStatus.d.ts","../contracts/tunnelPortStatus.d.ts","../contracts/tunnelPort.d.ts","../contracts/tunnelStatus.d.ts","../contracts/tunnel.d.ts","../contracts/namedRateStatus.d.ts","../contracts/problemDetails.d.ts","../contracts/tunnelAccessScopes.d.ts","../contracts/tunnelHeaderNames.d.ts","../contracts/tunnelProtocol.d.ts","../contracts/tunnelRelayTunnelEndpoint.d.ts","../contracts/tunnelServicePropertiesStatics.d.ts","../contracts/tunnelServiceProperties.d.ts","../contracts/clusterDetails.d.ts","../contracts/innerErrorDetail.d.ts","../contracts/errorDetail.d.ts","../contracts/tunnelListByRegion.d.ts","../contracts/tunnelListByRegionResponse.d.ts","../contracts/tunnelPortListResponse.d.ts","../contracts/tunnelConstraints.d.ts","../contracts/index.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/sshClient.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/tcpListenerFactory.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/sshServer.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/events/forwardedPort.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/events/forwardedPortEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/events/forwardedPortsCollection.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/messages/portForwardChannelOpenMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/messages/portForwardRequestMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/messages/portForwardSuccessMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/portForwardMessageFactory.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/localPortForwarder.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/remotePortConnector.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/remotePortForwarder.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/remotePortStreamer.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/portForwardingService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/index.d.ts","../../../src/connections/refreshingTunnelAccessTokenEventArgs.ts","../../../src/connections/retryingTunnelConnectionEventArgs.ts","../../../src/connections/tunnelConnection.ts","../../../src/connections/tunnelConnectionOptions.ts","../../../src/connections/tunnelClient.ts","../../../src/connections/tunnelHost.ts","../management/tunnelRequestOptions.d.ts","../management/tunnelManagementClient.d.ts","../../../node_modules/axios/index.d.ts","../management/tunnelManagementHttpClient.d.ts","../management/tunnelAccessTokenProperties.d.ts","../management/index.d.ts","../../../src/connections/tunnelConnectionBase.ts","../../../src/connections/multiModeTunnelClient.ts","../../../node_modules/@types/uuid/interfaces.d.ts","../../../node_modules/@types/uuid/index.d.ts","../../../src/connections/multiModeTunnelHost.ts","../../../src/connections/retryTcpListenerFactory.ts","../../../src/connections/sessionPortKey.ts","../../../src/connections/utils.ts","../../../src/connections/tunnelConnector.ts","../../../src/connections/tunnelSession.ts","../../../src/connections/relayTunnelConnector.ts","../../../src/connections/messages/portRelayRequestMessage.ts","../../../src/connections/messages/portRelayConnectRequestMessage.ts","../../../src/connections/tunnelConnectionSession.ts","../../../src/connections/tunnelSshSessionClass.ts","../../../src/connections/messages/portRelayConnectResponseMessage.ts","../../../src/connections/tunnelClientBase.ts","../../../src/connections/tunnelHostBase.ts","../../../src/connections/tunnelRelaySessionClass.ts","../../../src/connections/tunnelRelayTunnelClient.ts","../../../src/connections/tunnelRelayTunnelHost.ts","../../../src/connections/index.ts","../../../src/connections/package.json","../../../node_modules/@types/ms/index.d.ts","../../../node_modules/@types/debug/index.d.ts","../../../node_modules/@types/json-schema/index.d.ts","../../../node_modules/@types/mocha/index.d.ts","../../../node_modules/@types/semver/classes/semver.d.ts","../../../node_modules/@types/semver/functions/parse.d.ts","../../../node_modules/@types/semver/functions/valid.d.ts","../../../node_modules/@types/semver/functions/clean.d.ts","../../../node_modules/@types/semver/functions/inc.d.ts","../../../node_modules/@types/semver/functions/diff.d.ts","../../../node_modules/@types/semver/functions/major.d.ts","../../../node_modules/@types/semver/functions/minor.d.ts","../../../node_modules/@types/semver/functions/patch.d.ts","../../../node_modules/@types/semver/functions/prerelease.d.ts","../../../node_modules/@types/semver/functions/compare.d.ts","../../../node_modules/@types/semver/functions/rcompare.d.ts","../../../node_modules/@types/semver/functions/compare-loose.d.ts","../../../node_modules/@types/semver/functions/compare-build.d.ts","../../../node_modules/@types/semver/functions/sort.d.ts","../../../node_modules/@types/semver/functions/rsort.d.ts","../../../node_modules/@types/semver/functions/gt.d.ts","../../../node_modules/@types/semver/functions/lt.d.ts","../../../node_modules/@types/semver/functions/eq.d.ts","../../../node_modules/@types/semver/functions/neq.d.ts","../../../node_modules/@types/semver/functions/gte.d.ts","../../../node_modules/@types/semver/functions/lte.d.ts","../../../node_modules/@types/semver/functions/cmp.d.ts","../../../node_modules/@types/semver/functions/coerce.d.ts","../../../node_modules/@types/semver/classes/comparator.d.ts","../../../node_modules/@types/semver/classes/range.d.ts","../../../node_modules/@types/semver/functions/satisfies.d.ts","../../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../../node_modules/@types/semver/ranges/min-version.d.ts","../../../node_modules/@types/semver/ranges/valid.d.ts","../../../node_modules/@types/semver/ranges/outside.d.ts","../../../node_modules/@types/semver/ranges/gtr.d.ts","../../../node_modules/@types/semver/ranges/ltr.d.ts","../../../node_modules/@types/semver/ranges/intersects.d.ts","../../../node_modules/@types/semver/ranges/simplify.d.ts","../../../node_modules/@types/semver/ranges/subset.d.ts","../../../node_modules/@types/semver/internals/identifiers.d.ts","../../../node_modules/@types/semver/index.d.ts","../../../node_modules/@types/tmp/index.d.ts","../../../node_modules/@types/yargs-parser/index.d.ts","../../../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},{"version":"b99b7dcd3a860b854950d267b2ea30d4974b5388651120ba39c4bc732101796e","signature":"32c3c3459c7f34727b96d66fd599c4bd2ac05a2bae524402cafcb5573dc2b2c7"},{"version":"decc3668581814d2ced27e20d2ef6316c574045ece13a855e03aa0c7469486de","signature":"7e072f7bb0c132684823961a9a1a47e2c58faa68f30eadfae723924014cfdc7c"},"7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"54ba7456adb777a685250cd144115ea51379784012ba1311255b715c6bdcff2a","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"e193e634a99c9c1d71f1c6e4e1567a4a73584328d21ea02dd5cddbaad6693f61","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","5450889a3b688f9da80e7c96963b2cfebc6097e8e95790a23a48558b61e6aea7","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","489532ff54b714f0e0939947a1c560e516d3ae93d51d639ab02e907a0e950114","f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea","400db42c3a46984118bff14260d60cec580057dc1ab4c2d7310beb643e4f5935",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"80473bd0dd90ca1e166514c2dfead9d5803f9c51418864ca35abbeec6e6847e1","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","5eec82ac21f84d83586c59a16b9b8502d34505d1393393556682fe7e7fde9ef2","04eb6578a588d6a46f50299b55f30e3a04ef27d0c5a46c57d8fcc211cd530faa","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","fd93cee2621ff42dabe57b7be402783fd1aa69ece755bcba1e0290547ae60513","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","09326ae5f7e3d49be5cd9ea00eb814770e71870a438faa2efd8bdd9b4db21320",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3","ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"d8d555f3d607ecaa18d55de6995ea8f206342ecc93305919eac945c7c78c78c6","f6259ad9b506fd8640cd915d3794deb2df964fb2192132a4d02c9bd2b07fe958","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6",{"version":"9e526b48daf9ed82ee32a65b7a0b02e246a97fdab86ddd6d68802dd4b1ca34e6","affectsGlobalScope":true},"a51001b14af412097f3f4dd61018b75d260237e3b32e8a597466acc99e04d637","268c82abfac6e4e67e1109b2e2262440bc0551e25aa74ecafce19e7fb41a8a8b","29402e2e2b6f2d8ede6fd5810941c03273da2b974f90a28582f09b3ddfbe8e39","13375560ea53f92da84deed1e69d3419493c5a3fbbdf66f73d0cdd2a822294a4","39b86da3e11ecd654e5ce829a304f1be3db0b803b7a37039ae731c6c1a2835b9","cc0ab71a27bb4cffe308853ae2b3f0874f698f8dee3e17169268339260884534","ee689049f0f13efbb5cb9b06661955dedd3f0b7841da943f96bd53a9e5c928bb","a0c4ba7b6c496a6b5ca41b99964dc0dd4f1a2910d6618c1cf57872b33fab3cf7","df82b712e3a8bfa6db2842413fae7bb96d123485a34050e155bd58b239b11fec","7a5d3d9417d3efab38b40ce5c38573daadb74f5c96f9b73101d2c84c38887bd8","48365ed293c7815814dd11e8622c88015d95445c150fef2b71395d5278483831","d63729cd59ce33d1a5c9b2bc6563765757658262c3b26992c500d2e7c1e9718c","bc1c1f0843e2713c271bfa6531bef834d53b73abaedbdad1960e6c93853160d9","5a03eec99f9a44fa96f59189aee0553a803a94ef912aafb8baad9d37bdf31dc8","6b2ef19c9c01f6804ef1099c5a85cc4f3697114acbaf48a499f444c6391c8679","685c78042596b61520eab9677a4f2ce833dc289b35604d9baaf380a1ec15ba7b","f1d228aab6b6dc510ea676bd0259cf7813c1a24bce305e0997312ecb887ab8ca","21fdd0062ee806a0d27363dfb21438e75e9499f27ea291558ae6b2cdfc09b914","7933a8833713cf7d3ab9af2c0c3a442e79c48363897c362effa5fc1274f1e0f9","d4ac93945fbba934bd598b0b15ef1345c698d2b5a9686004bd6da419bf28d489","c0e54c09700c065c611062aaddf728450b8da8fc8ae539e5d6408d3983ab9acf","c97711dcdb9c68616450371513791a56754a738fd63086554fd66609eb3e41c1","542302fff6817f84d7052d22b716437f48630a6f57b3a64287537ad1e04e418b","96cb6afc4af05d374d13fe7abae3806bea9365966aeb31d0eb24ad5478944e8c","88463f7a918b8cfb5674d97c493c4095cd4f86d2ddc68966f570aa556fb35c2a","c8d1c45037bffd66e187352c0ad9f73c0fac9fd2c602dd664efe8a87089b19b0","d9e34bf22ce6a4e2d7b135ad264c6fb5c65fc0a04f3be6edf938fb63807145c7","7646ad33c8143471820804c29ff0a55c273efbd867717cc25c0638ce87e781e7","027bf37dc149524e75c2bbdd66346895d653151fbacffbc31201d6bc84ea4672","a15927c50cf507a92889c1f74d49136ae8ad12691120fd2af2d956cdccd70a1b","67a6391280a26c6464ba992d7b1664b687424fccb7ef7797d814d194d21bd45b","62184fd5e53177387d3e3346ed458cfebaa2d92ec0752ffdde612aad9a1007cb","a9eb4a36c25afff2575847cf87ddf8c9a7bb4485d8a914cbd60d3caffbaba694","c0d6650724b1edbcd52eafab66688eab05877e19145830cfed52a1824e028f45","d8dc7f167de2ea5e5df34ed54d0b3fc81cb8fbccc109f10bd97deb593f1a5324","505c56023c9801b5be8e8acbc8d312ac7631e459bb71f7cc2b76facf2a6c54ab","6485e7a69fe5d08b619cd90367ddd49080bd1b129288da01828149062360b444","d372da3876456ee3ff14f86553ab20541c0016c2d74b46ea4dcaa6cd946ff322","230932e88945ebeb3a23dd4cb006f6e327e39d7b01fc2c7c8f9ce79406d942a8","692bbfd3171fcbedbd96bfa8faf39334ef9ca023fb7168d84f0d6b423dc91caa","819566f750e645a92176557eff07253960766dd5c97288b21f4c3bfa0772eb72","bab596666b137bb10f4fae2a1cf86b889d33f1b70181be3529523062ca9a7f79","a9c002a14fd0504e5fba3fd3f7768d01a2ecd164b43d930e22a34c428d3099ca","7f469bc04e278c431487cc2bb24c655d46c783ea429e76765885d10aea651b43","687f411bc92cce9ddd9f3c5c764e556fcb4b349d70d2f8dbb9954e941c471f54","9317fc82ccc2b38ba78728a130d4d2689e626ca1fb4af37a39d9d618259f93ee","5a3acefaf46d0d5497376f42568c499e385b400a51d86984276243811466cdff","12c9e37cfbae388df848b6fd782e7dd70b1eb4870fa23cdcc958cb5044234aeb","9d7c538168820f96f354ce4a6e1c0fdc318a861ab8bd44334248cdeae6ad39eb","3f4d0ca0d91fcb25b1b29739f29b2b6b67d65b1869126e71ab4dd0307ec9659f","15fef124608f12ac616f58bf21a3ce715cb14c4158bf508d6e8f110d9d253ba9","d3ed3f2ce2e7ae3e2fcb503245f5810c7510aa46da817c8644ff9bbe4055eab1","721fb99058ca6781e576e37c0fcd7c3a37a267d3bada9c384d7bda29921907c0","49ca2153f16df845acc410201ed84ca4d0aa724d73a31920a4b89c35ce83d68a","03bd288fef35ed4167ff6bdea677e4f504a812c5b84492e3a9568ac9595fc189","64a88bfa83e76b84a9feb4cfec220ae2864a86b000999bfb9c32cc1aec06d441","b60e3d174629af4f78b0c61411d97c548bee526f1b3e73bbbddea16eb2d07cc8","c3694c07badc314e2ed02dd7de70b9afb5317a67dd7350deaab801b6f8da45e4","2cdcabe47a68751d95a2c373d87fa81402b16cf73a4e2244da5c6b9e10b67390","39cebdf3459bbb70d3a6bcbd9c5e32ca9259379a832678918424d8d03ea79ec7","660200d718c14443e5f5e080045429c4c9825e55e68ac2114290b01a317242a4","6e40a3a87126255d4c1aa4d613923b6e3c5c28273d018a8591af338232f393ab",{"version":"52743bd0514d63720473b770a8afc9d725f3a535882e7a691609d255abe0573b","signature":"87ee375c482a5556bb46475916896835e2a67d05c00ad03a3c1eef5783e73266"},{"version":"3690a23b5fcf9c3f84e9fe3596374972bc843af8ef3b2fff1fd02b21c4fe8747","signature":"273467f929896251d6600c4f8837b9e76598a1543b423a04dcb904d560117bb0"},{"version":"b48db14fbfe3865295a9b5ffeae0ccddb2b57d679d22df686b2d696e685010ae","signature":"3aa796846d4c76c107696390ae061886931b5790b8187bba8d16f37d0bf4a998"},"0631af7a01d5c038c926e4995b90e960c8dfb334aa832f1ae17731cf10dba7b8","32781cf95f0f871de1a85f9334178516946e3a1bad66e7a4fd2e72bfba634541","ed131ca0aa394f683cda8478ebd893f46554c2df17b45409b1d0ed13964f885b","0fbd13b4e3f8932b9fb1cf5841d46e629d94744058ef8d7445df0d74b7890896","35e49678ec00b2f77eff897d3eb7131f3f0ba185278125a495fd021a1f65ce68","0731e7b6a6dbd598e361b43c61274382aa12f3f2310cd2be1af2217a9d7a3194","9d5cf0a1c021b426993094960f7bf8cdfe87b3168ebe19cd259af2d5e614eeb0","c3b5d29bfc6a9c31b26f5f65f37b61c0a2af3017855032c1cf009ff8a66c253d","d3f2a1d403c6923251f005f4966bc9573188838262c77624680ed0fe7280898e","59cb1d2cc5b705363eefe21176dbfdf41c0bed528fb302decb7652474b8b9849","25f49e92b42a4e8ff69a8f3c3ad941038e14b1db1979d4f4e8f15dafd89d14a3","9479944210303c893a99beb6d0a3eeea4a93744f16dc5ac35b3cf31448fb51a6","c85d9f442f84ced3c2ab8e0ff0e0a02c48d8111af11f2de71f28aa63b0b89eec","54f08a3025507ee4298a7dbeac9d3d1e57ee3e25d3090d4624e3ede9c3b13eea","24e6620d9be33ed3c989b78be8c02d23e6c9250547cfa6d63e2391cf073750f5","a76e9101aa9359690a697c9cdaef16e5ae5a3340683558716d6cf34f05407881","884bc4095e0e65711caf80c792e4094f2d3ea25bc4a16f6bd6827627f21ceaed","0ab75de3a5765d443b25a0a98505aa876cbf00860b9e420e248edd77ff728b7f","4bdcba92cfa9c33db4119043105ba9a4be26328b4157302c9260ce94fc2e1317","a5d88d0548bb5b5b8d20976e45bb31d13b1153b9dac8b6abdf005dd05e0d4309","4e77675d511f9fdea854f4261f319481466d3253de25da8c9c968c5d951dbc48","a303090c5df80577a00c82faabe1b504ba174797c9bcd6c88a3b3d3f88aafd38","7a7ee7def2f98061225cc5ca12a585ab8bb68f0fd97473688faf61496a1132b6","442af7c8c071f3aecd54f0940336d9d9f0226a1e534297ebb0abfdee67a43b37","d23f1c5f6a24c81fa2c7279cad9aceb208f8238c4eea582d226c0046a7cd4624","4761e8ec280db92bf51bba16ab3c4e8fd4220e8b90c190afff42449c603eb0a4","c5ac3106651ef6fae89e30baaa50b2e819c088253bcba435a6e0447be706a898","842ff146e8da3624a3b0274c11fc50ea2c9f8d9559475b6b74143393c375089a","746396caf387bae7b47b13383cbcaf120c1598662b1b5ac1d8a42f4629bfb56d","517e0cc96d0967ac1200df80c65b485b6db1c3c61fb311a9faa4dd4b5807f778","6f8514d49cbf7e8a20b2f16a9f15fca9712dfcb962976f6142dd3b5271315c2e","0aa049f167c79469d142f7439e9182d05909f44860f083cd73c88c9e28757f7c","b6d47e05515908d5973e6bf6455388f1d52d739008940d4322e0df2d7111d76f","011bd3c1e8fc015fb3e36aefb47e8a2e134e31782ff9e6d7977547640ed7314b","2186b2002c92d853604a19e399a477835842ca49aa1c6a0bd1bd16158bd748f5","03e16449ce8b52f429359facd8a2a6187714db69db0fe646f222c0e25b8ac376","4a726a8e031a6052c1ad2d0972d2b577203b54caf424e21fa3e6df5ea41f8f07","cc61a9995a53eed6cedf38475dc8116adec717de774237a2797fe708a47c3479","9eabe3888e0b96ef1fc609c22bfc43fd3eb7d6be6393538657e813a90c44702f","a65f5ee60ef6ac262c1403467f70f2e54f3c3923988fcccb41958b9ac85b33bc","4d8ecb29be63a6e060401ae63c67c957bad5f823d017c9a350c123ddb8025761","b488f970002fae106829afdaf93f880aaa8d0e56af2c79a19e1dbb4ff74db39a","d519e6b3a94058e3406dccdea8fc8e93b699b7fe169a1bf625e8aa390094e808","be39d5fdfe27914072f4b056f9fb05f7442c8a70ca8186f35fc48ac1a7d3e292","7c0dbd01a794e5f072d9a21bf4cc6959e1b11ed18ef48239031c0458bec5c1b3","28ee0c27dcd7a251a003326230cbd0be7f7c9eda0cbecf438c9f66bf06d68756",{"version":"e42fe6bbdaa0f8211fffb76e2762d9acd6ddc7f5eb5f81a1f57396a844c4c0af","signature":"a94b7c6b0c74947034f8d89296cdd9cee981e27d75634abbecb1f8c7aafb9a35"},{"version":"15390eb15749436066008ab752173e06b0acf2c1fa4b7b6b2ec04be6541974b2","signature":"4ebfcc60aeb7d3f1e2ae28f21fe137b1e5e4f14565b60aa62147d9e6f4f46cb4"},{"version":"030a6ab0f95240edf2b5afef944088231b94204984b2708b7a2387a78d26045c","signature":"b8a2355ec4f0d12edf741b5a83fbfd54cffc4066759413871071a9f144bfffd5"},{"version":"bec0a4af8682d429c9f8d6bd271269deab328d894fb8389fe0e3c2185b9931f1","signature":"2e1ad36e643709dc5775d434895254df89e0c5a06fc72dab58776b3257ee8a3c"},{"version":"08361caa4618aac21444a0ff38d2169dccb1afca634a47937816ba479dc6546c","signature":"e40e31e4cb51c1cf36f1ca8243f2d82c832a3752f14e421500c471512b4bd238"},{"version":"b6983a928d176a2bf2e9777e6b6a7c68a29598e0ee512024401d39977f26d55d","signature":"1b2fe35d886683723e448a2ebebc1212273e77f6f9769ce6e5ebfe1e1566afce"},"d4965f9a819e046d84c5adf3630efc1ecff2f264d1686cb251753046a6285108","b1579532b1ad2680f7d245b4c905a27b29ef15804932bc648aafd96dc69dba3e","3154a026075044aa102298fe9e6a7a14aaa26a06270680c7478a1765af8ffb09","a1112a382ac2382c5e20878d36ef4e14994982c07b4d69e3fe7d00714c40be48","d53fe8326a03515b89b338151d0adfa19a17ebabff44aae298ce15702cf4e3fb","e2f2d3eb66a2834664223376e901d52de62bab11801c463c39f4ce63ce9928a6",{"version":"b72efd3a56f7495190199535b807ec497d8bbe09dda4da6031bac8725d48f1f8","signature":"2ee68d3585bf075c5b3e6acbabbbd526e8dbe2d9e596832e8e2472da5f14ee6b"},{"version":"cbe3f985a8e80dcfb6ba172cceff88ff7d18d3ae85631092045d98c503cff110","signature":"a9c9db68612c9456a09e2975c43353c19d211a9de5679e0010a244e10294a86d"},"4116dff2582ecc8645c3a90d26707ec6fd9ede6631f63fb65f11d42806bb47f1","8486ee0cb2ef80c6555941e2e0d081b27e9a07eca9df720c99f001f5220f14b5",{"version":"eb1be3d0b519af0f44051649ab431b5c336ac6cedc01d5e389165a357d44d57c","signature":"4ce5942c6dfd0df604f4dcc11a4a2230368ddfc434857540a6c6c4f761af2e71"},{"version":"3abc9376abd406c580ef4074fdfb1774e5e64da1a97e7f30d193ee9b532d187c","signature":"98e6edc2890ce1e5ef39711090fed8b1225d5ee48cc093d9a675eb80bb07221f"},{"version":"b4c0ef76526f3d59c0fe18eb7bcd7e34f7b6f4be39b3ea65175ee70b6deb53ce","signature":"bb7765503260a633de9ab418df57e5292b157ebace274b2dcc9f630d616caf4e"},{"version":"370eb203ad74a914ad0c225e9cfb322ba173afb74c5bc32289936e4a664242b7","signature":"6c8496d84080d524b567909171c5030a32027d566dcbbfd6f3b9e455867ee2ac"},{"version":"fb8ab9e480bc86fc4adfc319cf7d288b279bf593bc0db0ecac7f7de22d379b08","signature":"b90e756822803e966351faf97e3ecd887bf6ca8d3236cfdab1d5a212b971773e"},{"version":"be5668bacea7e69f4067e471044806a6cbd1b6957a33152bf8dc57cac4e40043","signature":"b7010e0f1991e3f0b8453002ac04423efbc23bf02891f2cc4011e822ce892022"},{"version":"163c664a5ef0bc99872cfe5a9445e4c78657e24b87023ff76bbae79d2b7c01e9","signature":"0d6a694a319392d84dfb13f4b8c7b5aec709242c965e86d86ad05684c801e815"},{"version":"5c96232d86cf755ae1147fe908531f18189954bf7bfa196bc73153077d73223b","signature":"7c771de6671dea66634ca6cd82239206b98a4660b2818b4f3346a30b23a31c50"},{"version":"9f9dbf836253b074da07f5a38eb3883c887ee7bd6c461d2a30e90db11e6be554","signature":"69350cd89aedbf28d9f71c535dca88153a17fc6f24194c0b330a92a15df925ec"},{"version":"e6eabf673aa29799bfa74c48868d2e27c5c4ae7c82d41fab3b1a64b072ebb141","signature":"9833ba1d46a431d10b50e7408ca521e865f528bfd8b0552cb15247b1775c671a"},{"version":"c9c618143c4bc8764f33ab0dbf5d6fab31c2fb1540cbe193a1c5f5dd5aadafbf","signature":"d37d976c4fe70261d0590ab077e4482d1e0dd1f183aac9752f91e1a0a3de7e77"},{"version":"a352753028b1faf596838da2287d6835f33706b92889683b2d444b077d46f1e6","signature":"3dc17f0d08aa6e87ad45d55160e54960cc26c9aaa2bae04df62779fe66713949"},{"version":"3074652fb790dbad84d332b2c278644a0123ed4b14f0cf1c580d015178c75226","signature":"3dce75668b1f0d8a54f87adf3fd36f8a1806f8d7fa0d51c41f621ede9de0cc9c"},{"version":"34a7a74cdc62810b67bab485c0ba06ca025fc01607319cc59c02f084da2dd50b","signature":"9604f0ba29cbe0d1b225edacaa736c0b8059b7e01f4f0e2e06ab4aacd7ade538"},{"version":"a6b018631cdd05b35dd7cc42be9ccfe871d26e7f3d4f94abc4bcd0e91eff00c8","signature":"ec84b76de69e66077e71fd1a0aaaae7584b8032996d9b431ffe6bcd8a4952eae"},{"version":"a31d8c08b4d56a26483e083b334491625c49c74a179500fc0bbdf0192de6df42","signature":"cab1dcbe12d80ddbd2399fb337c1d2d712626680f06ef93466b7d41cdf224e50"},{"version":"0b1051f0b8434aa37912f1ffbfe84621ab416ca6dfb1621e69f272326b4a7c59","signature":"2f9573a7a0264ee316da0bfe9ca655563a58713e31203f1a61f70a19727735a4"},{"version":"4328a729d4efc8e4da83d8311ca7e9661ce46e302ee403dd24fc642372322f86","signature":"7fe31482f658c8e227b5a871092f3edbdb34dc667a178a8a0611ef6bd7ead4b2"},"f16bedf337341c18d7daab08bacafc68eeb92af927fc3fae2befd1eb1f6f897d","6a9c5127096b35264eb7cd21b2417bfc1d42cceca9ba4ce2bb0c3410b7816042","78828b06c0d3b586954015e9ebde5480b009e166c71244763bda328ec0920f41","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6",{"version":"c4c03cf65951d980ba618ae9601d10438730803fc9c8a1f7b34af8739981e205","affectsGlobalScope":true},"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","6aee496bf0ecfbf6731aa8cca32f4b6e92cdc0a444911a7d88410408a45ecc5d","e2e10045d93d3b029dcd62784bafb7200d4eb51b1ef6a98b77baa763b9a5e1d3","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","ae84439d1ae42b30ced3df38c4285f35b805be40dfc95b0647d0e59c70b11f97"],"options":{"composite":true,"declaration":true,"declarationMap":true,"experimentalDecorators":true,"module":1,"outDir":"./","rootDir":"../../../src/connections","sourceMap":true,"strict":true,"stripInternal":true,"target":4,"tsBuildInfoFile":"./tsbuildinfo.json"},"fileIdsList":[[92],[80,92,99,163,201],[92,111,163,201,202],[92,198,199,200,201,202,203,204,205,206,207,208,210,211,212],[92,163],[92,204,205,206],[80,92,99,111,163,199,202,203,207,208,210,211],[92,209],[92,111,163,209],[92,111,163],[70,92,99,111,163,199],[70,92,99,111],[49,92,99,100],[49,92,99,100,111],[49,92,99,100,112],[49,92,99,100,111,112,114],[92,99,100,112,113,115,116,117,118,120,121],[49,92,99,112,115,119],[49,92,99,116],[49,92,99,112,115],[92,111,128,140],[92,111,115,143],[92,111,128,133],[92,99],[92,111,127],[92,140],[92,114,122,123,124,125,126,127,128,129,130,131,132,133,134,138,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[49,92,99],[49,92,99,114],[92,99,126,127,142],[49,92,99,126,127],[49,92,99,126,149],[49,92,99,126,127,128],[92,111,141],[92,111],[92,111,123,125,133,145,146,147,153],[80,92,99,111,123,125,133,138,144,145,147,150,152,153],[92,111,128,133,138,147,148],[92,111,122,135,136,147,148],[92,148],[92,111,123,127,128,130,133,140,146,147],[92,99,111,124,128,129,130,131,132,147],[92,111,125,128,133,147,149,150],[92,111,115],[92,111,133],[92,111,147,149,150],[49,92,99,111,123,125,127,128,130,133,134,136,137,139,140,141,144,145,146,148,149],[92,111,122],[92,122,127,142,148],[80,92,99,133],[49,70,80,92,99,111,124],[92,111,124],[92,249],[45,92],[48,92],[49,54,83,92],[50,62,63,70,80,91,92],[50,51,62,70,92],[52,92],[53,54,63,71,92],[54,80,88,92],[55,57,62,70,92],[56,92],[57,58,92],[62,92],[59,62,92],[62,63,64,80,91,92],[62,63,64,77,80,83,92],[92,96],[57,65,70,80,91,92],[62,63,65,66,70,80,88,91,92],[65,67,80,88,91,92],[45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],[62,68,92],[69,91,92],[57,62,70,80,92],[71,92],[72,92],[48,73,92],[74,90,92,96],[75,92],[76,92],[62,77,78,92],[77,79,92,94],[49,62,80,81,82,83,92],[49,80,82,92],[80,81,92],[83,92],[84,92],[62,86,87,92],[86,87,92],[54,70,80,88,92],[89,92],[70,90,92],[49,65,76,91,92],[54,92],[80,92,93],[92,94],[92,95],[49,54,62,64,73,80,91,92,94,96],[80,92,97],[92,253,292],[92,253,277,292],[92,292],[92,253],[92,253,278,292],[92,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291],[92,278,292],[92,228],[62,65,67,70,91,92,99],[92,294],[92,104],[92,99,102,103,104,105,106,107,108,109,110],[50,70,92,99,103,104],[92,105,106],[92,191],[92,168,169,171,172,174,175,178,179,180,181,182,183,184,185,186,187,189,190,194,195,196],[92,177],[92,176],[92,171,174,175,179,180],[92,169,170],[92,168],[92,172,173],[92,174],[92,181,192],[92,193],[92,171,175,178],[92,179],[92,176,177],[92,188],[92,189],[92,220,221,223,224],[92,197],[67,92,99,197,220],[67,92,99,197,220,221,222],[43,92],[92,163,164,165,166],[43,44,92,165,166,167,214,215,216,218,219,226,227,230,231,232,234,242,243,245,246],[92,163,213],[92,163,197,213,217,226,247],[92,163,197,217,226,229,247],[65,92,163,166,215,217,233,234,235],[70,92,111,199],[65,92,163,164,166],[80,92,163,197,213,216,217],[43,80,92,111,163,166,197,213,217,218,225,231,233,239,240,241],[43,44,92,111,213,214,215],[43,44,92,111,163,213,214,215,216,225],[65,92],[43,65,92,111,163,197,213,217,225,226,233,234,235,236,237,238],[92,163,217],[92,163,197,216,217],[92,163,166,197,213,217,219,225,232,239,240],[65,92,111,163,164,166,197,217,225,235,247],[92,163,164,166],[92,111,163,197,225,242,244],[92,111,163,166,197,213,225,229,230,232,238,241,243,244],[65,92,163,197,215,217],[92,163,216,235,239],[43],[163,164,165,166],[43,44,165,166,167,214,215,216,218,219,226,227,230,231,232,234,242,243,245,246],[163,213],[163],[163,197,213,217,226,247],[163,197,217,226,247],[163,217,234,235],[70,111,199],[65,163,164,166],[80,163,197,213,216,217],[43,44,65,80,111,163,197,213,214,215,217,218,225,239],[43,44,111,213,214,215],[43,44,111,213,214,215,216],[65],[65,111,163,197,217,225,226,234,235],[163,217],[163,197,216,217],[43,44,65,111,163,197,213,214,215,217,219,225,239],[65,111,163,197,215,217,235,247],[163,164,166],[65,111,163,165,197,215,217,225,242],[65,111,163,165,197,213,215,217,225,243],[65,163,197,215,217],[43,44,65,111,163,197,213,214,215,216,217,235,239]],"referencedMap":[[201,1],[202,2],[203,3],[213,4],[204,5],[205,5],[206,5],[207,6],[208,5],[212,7],[209,5],[210,8],[211,9],[198,10],[200,11],[199,12],[117,13],[119,1],[116,14],[112,14],[113,15],[115,16],[100,1],[122,17],[120,18],[121,19],[118,20],[157,21],[144,22],[131,1],[146,23],[132,24],[130,25],[145,26],[163,27],[114,28],[156,29],[126,29],[143,30],[142,1],[128,31],[135,31],[127,32],[140,33],[129,1],[160,34],[141,35],[161,36],[162,37],[139,38],[137,39],[155,40],[148,41],[133,42],[151,43],[150,44],[154,45],[152,46],[147,47],[136,48],[149,49],[153,50],[134,1],[125,51],[123,1],[124,35],[138,1],[159,1],[158,52],[250,53],[60,1],[251,1],[252,1],[249,1],[45,54],[46,54],[48,55],[49,56],[50,57],[51,58],[52,59],[53,60],[54,61],[55,62],[56,63],[57,64],[58,64],[61,65],[59,66],[62,65],[63,67],[64,68],[47,69],[98,1],[65,70],[66,71],[67,72],[99,73],[68,74],[69,75],[70,76],[71,77],[72,78],[73,79],[74,80],[75,81],[76,82],[77,83],[78,83],[79,84],[80,85],[82,86],[81,87],[83,88],[84,89],[85,1],[86,90],[87,91],[88,92],[89,93],[90,94],[91,95],[92,96],[93,97],[94,98],[95,99],[96,100],[97,101],[277,102],[278,103],[253,104],[256,104],[275,102],[276,102],[266,102],[265,105],[263,102],[258,102],[271,102],[269,102],[273,102],[257,102],[270,102],[274,102],[259,102],[260,102],[272,102],[254,102],[261,102],[262,102],[264,102],[268,102],[279,106],[267,102],[255,102],[292,107],[291,1],[286,106],[288,108],[287,106],[280,106],[281,106],[283,106],[285,106],[289,108],[290,108],[282,108],[284,108],[293,1],[229,109],[228,1],[164,110],[294,1],[295,111],[222,1],[101,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[107,112],[104,1],[108,1],[111,113],[105,114],[106,114],[103,1],[109,115],[110,115],[102,1],[190,1],[192,116],[197,117],[191,1],[182,118],[183,1],[177,119],[176,1],[181,120],[171,121],[169,122],[168,1],[170,1],[184,1],[172,1],[196,1],[174,123],[173,124],[185,1],[193,125],[194,126],[175,1],[179,127],[195,128],[178,129],[186,1],[187,124],[189,130],[188,131],[180,129],[225,132],[224,133],[221,134],[223,135],[220,1],[43,1],[44,136],[167,137],[247,138],[238,139],[241,5],[237,139],[227,140],[230,141],[248,1],[214,5],[236,142],[231,143],[215,1],[232,1],[166,144],[218,145],[242,146],[216,147],[226,148],[217,149],[239,150],[234,151],[219,152],[243,153],[244,154],[165,155],[245,156],[246,157],[235,158],[240,159],[233,10]],"exportedModulesMap":[[201,1],[202,2],[203,3],[213,4],[204,5],[205,5],[206,5],[207,6],[208,5],[212,7],[209,5],[210,8],[211,9],[198,10],[200,11],[199,12],[117,13],[119,1],[116,14],[112,14],[113,15],[115,16],[100,1],[122,17],[120,18],[121,19],[118,20],[157,21],[144,22],[131,1],[146,23],[132,24],[130,25],[145,26],[163,27],[114,28],[156,29],[126,29],[143,30],[142,1],[128,31],[135,31],[127,32],[140,33],[129,1],[160,34],[141,35],[161,36],[162,37],[139,38],[137,39],[155,40],[148,41],[133,42],[151,43],[150,44],[154,45],[152,46],[147,47],[136,48],[149,49],[153,50],[134,1],[125,51],[123,1],[124,35],[138,1],[159,1],[158,52],[250,53],[60,1],[251,1],[252,1],[249,1],[45,54],[46,54],[48,55],[49,56],[50,57],[51,58],[52,59],[53,60],[54,61],[55,62],[56,63],[57,64],[58,64],[61,65],[59,66],[62,65],[63,67],[64,68],[47,69],[98,1],[65,70],[66,71],[67,72],[99,73],[68,74],[69,75],[70,76],[71,77],[72,78],[73,79],[74,80],[75,81],[76,82],[77,83],[78,83],[79,84],[80,85],[82,86],[81,87],[83,88],[84,89],[85,1],[86,90],[87,91],[88,92],[89,93],[90,94],[91,95],[92,96],[93,97],[94,98],[95,99],[96,100],[97,101],[277,102],[278,103],[253,104],[256,104],[275,102],[276,102],[266,102],[265,105],[263,102],[258,102],[271,102],[269,102],[273,102],[257,102],[270,102],[274,102],[259,102],[260,102],[272,102],[254,102],[261,102],[262,102],[264,102],[268,102],[279,106],[267,102],[255,102],[292,107],[291,1],[286,106],[288,108],[287,106],[280,106],[281,106],[283,106],[285,106],[289,108],[290,108],[282,108],[284,108],[293,1],[229,109],[228,1],[164,110],[294,1],[295,111],[222,1],[101,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[107,112],[104,1],[108,1],[111,113],[105,114],[106,114],[103,1],[109,115],[110,115],[102,1],[190,1],[192,116],[197,117],[191,1],[182,118],[183,1],[177,119],[176,1],[181,120],[171,121],[169,122],[168,1],[170,1],[184,1],[172,1],[196,1],[174,123],[173,124],[185,1],[193,125],[194,126],[175,1],[179,127],[195,128],[178,129],[186,1],[187,124],[189,130],[188,131],[180,129],[225,132],[224,133],[221,134],[223,135],[220,1],[44,160],[167,161],[247,162],[238,163],[241,164],[237,163],[227,165],[230,166],[248,1],[214,164],[236,167],[231,168],[166,169],[218,170],[242,171],[216,172],[226,173],[217,174],[239,175],[234,176],[219,177],[243,178],[244,179],[165,180],[245,181],[246,182],[235,183],[240,184],[233,164]],"semanticDiagnosticsPerFile":[201,202,203,213,204,205,206,207,208,212,209,210,211,198,200,199,117,119,116,112,113,115,100,122,120,121,118,157,144,131,146,132,130,145,163,114,156,126,143,142,128,135,127,140,129,160,141,161,162,139,137,155,148,133,151,150,154,152,147,136,149,153,134,125,123,124,138,159,158,250,60,251,252,249,45,46,48,49,50,51,52,53,54,55,56,57,58,61,59,62,63,64,47,98,65,66,67,99,68,69,70,71,72,73,74,75,76,77,78,79,80,82,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,277,278,253,256,275,276,266,265,263,258,271,269,273,257,270,274,259,260,272,254,261,262,264,268,279,267,255,292,291,286,288,287,280,281,283,285,289,290,282,284,293,229,228,164,294,295,222,101,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,107,104,108,111,105,106,103,109,110,102,190,192,197,191,182,183,177,176,181,171,169,168,170,184,172,196,174,173,185,193,194,175,179,195,178,186,187,189,188,180,225,224,221,223,220,43,44,167,247,238,241,237,227,230,248,214,236,231,215,232,166,218,242,216,226,217,239,234,219,243,244,165,245,246,235,240,233],"latestChangedDtsFile":"./index.d.ts"},"version":"4.9.5"}
{"program":{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../src/connections/connectionStatus.ts","../../../src/connections/connectionStatusChangedEventArgs.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/events/index.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/sshAlgorithm.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/vscode-jsonrpc/lib/thenable.d.ts","../../../node_modules/vscode-jsonrpc/lib/messages.d.ts","../../../node_modules/vscode-jsonrpc/lib/events.d.ts","../../../node_modules/vscode-jsonrpc/lib/messageReader.d.ts","../../../node_modules/vscode-jsonrpc/lib/messageWriter.d.ts","../../../node_modules/vscode-jsonrpc/lib/cancellation.d.ts","../../../node_modules/vscode-jsonrpc/lib/linkedMap.d.ts","../../../node_modules/vscode-jsonrpc/lib/pipeSupport.d.ts","../../../node_modules/vscode-jsonrpc/lib/socketSupport.d.ts","../../../node_modules/vscode-jsonrpc/lib/main.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/hmacAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/keyExchangeAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/io/bigInt.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/publicKeyAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/encryptionAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/compressionAlgorithm.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/web/webRsa.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/ecdsaCurves.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/web/webECDsa.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/web/webEncryption.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/algorithms/sshAlgorithms.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/trace.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/cancellation.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/streams.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/io/sshData.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/sshMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/connectionMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/metrics/channelMetrics.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshRequestEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshChannelClosedEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshExtendedDataEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshChannel.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshVersionInfo.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/kexMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshSessionAlgorithms.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/keyExchangeService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/promiseCompletionSource.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/connectionService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/transportMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/metrics/sessionMetrics.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/authenticationMethod.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/messages/authenticationMessages.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshAuthenticatingEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshSessionClosedEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/events/sshChannelOpeningEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshSession.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/sshService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshSessionConfiguration.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshCredentials.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshClientSession.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshServerSession.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/sshRpcMessageStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/services/serviceActivation.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/io/derData.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/errors.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/semaphore.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/util/queue.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/metrics/sessionContour.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/multiChannelStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/secureStream.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh/index.d.ts","../../../node_modules/@types/websocket/index.d.ts","../../../src/connections/tunnelRelayStreamFactory.ts","../../../src/connections/sshHelpers.ts","../../../src/connections/defaultTunnelRelayStreamFactory.ts","../contracts/tunnelAccessControlEntryType.d.ts","../contracts/tunnelAccessControlEntry.d.ts","../contracts/tunnelAccessControlStatics.d.ts","../contracts/tunnelAccessControl.d.ts","../contracts/tunnelConnectionMode.d.ts","../contracts/tunnelEndpointStatics.d.ts","../contracts/tunnelEndpoint.d.ts","../contracts/tunnelOptions.d.ts","../contracts/resourceStatus.d.ts","../contracts/rateStatus.d.ts","../contracts/tunnelPortStatus.d.ts","../contracts/tunnelPort.d.ts","../contracts/tunnelStatus.d.ts","../contracts/tunnel.d.ts","../contracts/namedRateStatus.d.ts","../contracts/problemDetails.d.ts","../contracts/tunnelAccessScopes.d.ts","../contracts/tunnelHeaderNames.d.ts","../contracts/tunnelProtocol.d.ts","../contracts/tunnelRelayTunnelEndpoint.d.ts","../contracts/tunnelServicePropertiesStatics.d.ts","../contracts/tunnelServiceProperties.d.ts","../contracts/clusterDetails.d.ts","../contracts/innerErrorDetail.d.ts","../contracts/errorDetail.d.ts","../contracts/tunnelListByRegion.d.ts","../contracts/tunnelListByRegionResponse.d.ts","../contracts/tunnelPortListResponse.d.ts","../contracts/tunnelConstraints.d.ts","../contracts/index.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/sshClient.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/tcpListenerFactory.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/sshServer.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/events/forwardedPort.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/events/forwardedPortEventArgs.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/events/forwardedPortsCollection.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/messages/portForwardChannelOpenMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/messages/portForwardRequestMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/messages/portForwardSuccessMessage.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/portForwardMessageFactory.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/localPortForwarder.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/remotePortConnector.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/remotePortForwarder.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/remotePortStreamer.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/services/portForwardingService.d.ts","../../../node_modules/@microsoft/dev-tunnels-ssh-tcp/index.d.ts","../../../src/connections/refreshingTunnelAccessTokenEventArgs.ts","../../../src/connections/retryingTunnelConnectionEventArgs.ts","../../../src/connections/tunnelConnection.ts","../../../src/connections/tunnelConnectionOptions.ts","../../../src/connections/tunnelClient.ts","../../../src/connections/tunnelHost.ts","../management/tunnelRequestOptions.d.ts","../management/tunnelManagementClient.d.ts","../../../node_modules/axios/index.d.ts","../management/tunnelManagementHttpClient.d.ts","../management/tunnelAccessTokenProperties.d.ts","../management/index.d.ts","../../../src/connections/utils.ts","../../../src/connections/tunnelConnectionBase.ts","../../../src/connections/multiModeTunnelClient.ts","../../../node_modules/@types/uuid/interfaces.d.ts","../../../node_modules/@types/uuid/index.d.ts","../../../src/connections/multiModeTunnelHost.ts","../../../src/connections/retryTcpListenerFactory.ts","../../../src/connections/sessionPortKey.ts","../../../src/connections/messages/portRelayConnectResponseMessage.ts","../../../src/connections/tunnelConnector.ts","../../../src/connections/refreshingTunnelEventArgs.ts","../../../src/connections/tunnelSession.ts","../../../src/connections/relayTunnelConnector.ts","../../../src/connections/messages/portRelayRequestMessage.ts","../../../src/connections/messages/portRelayConnectRequestMessage.ts","../../../src/connections/tunnelConnectionSession.ts","../../../src/connections/tunnelRelayTunnelClient.ts","../../../src/connections/tunnelRelayTunnelHost.ts","../../../src/connections/index.ts","../../../src/connections/package.json","../../../node_modules/@types/ms/index.d.ts","../../../node_modules/@types/debug/index.d.ts","../../../node_modules/@types/json-schema/index.d.ts","../../../node_modules/@types/mocha/index.d.ts","../../../node_modules/@types/semver/classes/semver.d.ts","../../../node_modules/@types/semver/functions/parse.d.ts","../../../node_modules/@types/semver/functions/valid.d.ts","../../../node_modules/@types/semver/functions/clean.d.ts","../../../node_modules/@types/semver/functions/inc.d.ts","../../../node_modules/@types/semver/functions/diff.d.ts","../../../node_modules/@types/semver/functions/major.d.ts","../../../node_modules/@types/semver/functions/minor.d.ts","../../../node_modules/@types/semver/functions/patch.d.ts","../../../node_modules/@types/semver/functions/prerelease.d.ts","../../../node_modules/@types/semver/functions/compare.d.ts","../../../node_modules/@types/semver/functions/rcompare.d.ts","../../../node_modules/@types/semver/functions/compare-loose.d.ts","../../../node_modules/@types/semver/functions/compare-build.d.ts","../../../node_modules/@types/semver/functions/sort.d.ts","../../../node_modules/@types/semver/functions/rsort.d.ts","../../../node_modules/@types/semver/functions/gt.d.ts","../../../node_modules/@types/semver/functions/lt.d.ts","../../../node_modules/@types/semver/functions/eq.d.ts","../../../node_modules/@types/semver/functions/neq.d.ts","../../../node_modules/@types/semver/functions/gte.d.ts","../../../node_modules/@types/semver/functions/lte.d.ts","../../../node_modules/@types/semver/functions/cmp.d.ts","../../../node_modules/@types/semver/functions/coerce.d.ts","../../../node_modules/@types/semver/classes/comparator.d.ts","../../../node_modules/@types/semver/classes/range.d.ts","../../../node_modules/@types/semver/functions/satisfies.d.ts","../../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../../node_modules/@types/semver/ranges/min-version.d.ts","../../../node_modules/@types/semver/ranges/valid.d.ts","../../../node_modules/@types/semver/ranges/outside.d.ts","../../../node_modules/@types/semver/ranges/gtr.d.ts","../../../node_modules/@types/semver/ranges/ltr.d.ts","../../../node_modules/@types/semver/ranges/intersects.d.ts","../../../node_modules/@types/semver/ranges/simplify.d.ts","../../../node_modules/@types/semver/ranges/subset.d.ts","../../../node_modules/@types/semver/internals/identifiers.d.ts","../../../node_modules/@types/semver/index.d.ts","../../../node_modules/@types/tmp/index.d.ts","../../../node_modules/@types/yargs-parser/index.d.ts","../../../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},{"version":"c996eb4759609bd4f3f053e202944501d6430bbfdd66952a05ecc65b36d3cdc3","signature":"21456e03d718961e1f00346e722e29e42d7c777b6fc455ce1ff4376766f99582"},{"version":"decc3668581814d2ced27e20d2ef6316c574045ece13a855e03aa0c7469486de","signature":"7e072f7bb0c132684823961a9a1a47e2c58faa68f30eadfae723924014cfdc7c"},"7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"54ba7456adb777a685250cd144115ea51379784012ba1311255b715c6bdcff2a","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"e193e634a99c9c1d71f1c6e4e1567a4a73584328d21ea02dd5cddbaad6693f61","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","5450889a3b688f9da80e7c96963b2cfebc6097e8e95790a23a48558b61e6aea7","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","489532ff54b714f0e0939947a1c560e516d3ae93d51d639ab02e907a0e950114","f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea","400db42c3a46984118bff14260d60cec580057dc1ab4c2d7310beb643e4f5935",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"80473bd0dd90ca1e166514c2dfead9d5803f9c51418864ca35abbeec6e6847e1","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","5eec82ac21f84d83586c59a16b9b8502d34505d1393393556682fe7e7fde9ef2","04eb6578a588d6a46f50299b55f30e3a04ef27d0c5a46c57d8fcc211cd530faa","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","fd93cee2621ff42dabe57b7be402783fd1aa69ece755bcba1e0290547ae60513","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","09326ae5f7e3d49be5cd9ea00eb814770e71870a438faa2efd8bdd9b4db21320",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3","ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"d8d555f3d607ecaa18d55de6995ea8f206342ecc93305919eac945c7c78c78c6","f6259ad9b506fd8640cd915d3794deb2df964fb2192132a4d02c9bd2b07fe958","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6",{"version":"9e526b48daf9ed82ee32a65b7a0b02e246a97fdab86ddd6d68802dd4b1ca34e6","affectsGlobalScope":true},"a51001b14af412097f3f4dd61018b75d260237e3b32e8a597466acc99e04d637","268c82abfac6e4e67e1109b2e2262440bc0551e25aa74ecafce19e7fb41a8a8b","29402e2e2b6f2d8ede6fd5810941c03273da2b974f90a28582f09b3ddfbe8e39","13375560ea53f92da84deed1e69d3419493c5a3fbbdf66f73d0cdd2a822294a4","39b86da3e11ecd654e5ce829a304f1be3db0b803b7a37039ae731c6c1a2835b9","cc0ab71a27bb4cffe308853ae2b3f0874f698f8dee3e17169268339260884534","ee689049f0f13efbb5cb9b06661955dedd3f0b7841da943f96bd53a9e5c928bb","a0c4ba7b6c496a6b5ca41b99964dc0dd4f1a2910d6618c1cf57872b33fab3cf7","df82b712e3a8bfa6db2842413fae7bb96d123485a34050e155bd58b239b11fec","7a5d3d9417d3efab38b40ce5c38573daadb74f5c96f9b73101d2c84c38887bd8","48365ed293c7815814dd11e8622c88015d95445c150fef2b71395d5278483831","d63729cd59ce33d1a5c9b2bc6563765757658262c3b26992c500d2e7c1e9718c","bc1c1f0843e2713c271bfa6531bef834d53b73abaedbdad1960e6c93853160d9","5a03eec99f9a44fa96f59189aee0553a803a94ef912aafb8baad9d37bdf31dc8","6b2ef19c9c01f6804ef1099c5a85cc4f3697114acbaf48a499f444c6391c8679","685c78042596b61520eab9677a4f2ce833dc289b35604d9baaf380a1ec15ba7b","f1d228aab6b6dc510ea676bd0259cf7813c1a24bce305e0997312ecb887ab8ca","21fdd0062ee806a0d27363dfb21438e75e9499f27ea291558ae6b2cdfc09b914","7933a8833713cf7d3ab9af2c0c3a442e79c48363897c362effa5fc1274f1e0f9","d4ac93945fbba934bd598b0b15ef1345c698d2b5a9686004bd6da419bf28d489","c0e54c09700c065c611062aaddf728450b8da8fc8ae539e5d6408d3983ab9acf","c97711dcdb9c68616450371513791a56754a738fd63086554fd66609eb3e41c1","542302fff6817f84d7052d22b716437f48630a6f57b3a64287537ad1e04e418b","96cb6afc4af05d374d13fe7abae3806bea9365966aeb31d0eb24ad5478944e8c","88463f7a918b8cfb5674d97c493c4095cd4f86d2ddc68966f570aa556fb35c2a","c8d1c45037bffd66e187352c0ad9f73c0fac9fd2c602dd664efe8a87089b19b0","d9e34bf22ce6a4e2d7b135ad264c6fb5c65fc0a04f3be6edf938fb63807145c7","7646ad33c8143471820804c29ff0a55c273efbd867717cc25c0638ce87e781e7","027bf37dc149524e75c2bbdd66346895d653151fbacffbc31201d6bc84ea4672","a15927c50cf507a92889c1f74d49136ae8ad12691120fd2af2d956cdccd70a1b","67a6391280a26c6464ba992d7b1664b687424fccb7ef7797d814d194d21bd45b","62184fd5e53177387d3e3346ed458cfebaa2d92ec0752ffdde612aad9a1007cb","a9eb4a36c25afff2575847cf87ddf8c9a7bb4485d8a914cbd60d3caffbaba694","c0d6650724b1edbcd52eafab66688eab05877e19145830cfed52a1824e028f45","d8dc7f167de2ea5e5df34ed54d0b3fc81cb8fbccc109f10bd97deb593f1a5324","505c56023c9801b5be8e8acbc8d312ac7631e459bb71f7cc2b76facf2a6c54ab","6485e7a69fe5d08b619cd90367ddd49080bd1b129288da01828149062360b444","d372da3876456ee3ff14f86553ab20541c0016c2d74b46ea4dcaa6cd946ff322","230932e88945ebeb3a23dd4cb006f6e327e39d7b01fc2c7c8f9ce79406d942a8","692bbfd3171fcbedbd96bfa8faf39334ef9ca023fb7168d84f0d6b423dc91caa","819566f750e645a92176557eff07253960766dd5c97288b21f4c3bfa0772eb72","bab596666b137bb10f4fae2a1cf86b889d33f1b70181be3529523062ca9a7f79","a9c002a14fd0504e5fba3fd3f7768d01a2ecd164b43d930e22a34c428d3099ca","7f469bc04e278c431487cc2bb24c655d46c783ea429e76765885d10aea651b43","687f411bc92cce9ddd9f3c5c764e556fcb4b349d70d2f8dbb9954e941c471f54","9317fc82ccc2b38ba78728a130d4d2689e626ca1fb4af37a39d9d618259f93ee","5a3acefaf46d0d5497376f42568c499e385b400a51d86984276243811466cdff","12c9e37cfbae388df848b6fd782e7dd70b1eb4870fa23cdcc958cb5044234aeb","9d7c538168820f96f354ce4a6e1c0fdc318a861ab8bd44334248cdeae6ad39eb","3f4d0ca0d91fcb25b1b29739f29b2b6b67d65b1869126e71ab4dd0307ec9659f","15fef124608f12ac616f58bf21a3ce715cb14c4158bf508d6e8f110d9d253ba9","d3ed3f2ce2e7ae3e2fcb503245f5810c7510aa46da817c8644ff9bbe4055eab1","721fb99058ca6781e576e37c0fcd7c3a37a267d3bada9c384d7bda29921907c0","49ca2153f16df845acc410201ed84ca4d0aa724d73a31920a4b89c35ce83d68a","03bd288fef35ed4167ff6bdea677e4f504a812c5b84492e3a9568ac9595fc189","64a88bfa83e76b84a9feb4cfec220ae2864a86b000999bfb9c32cc1aec06d441","b60e3d174629af4f78b0c61411d97c548bee526f1b3e73bbbddea16eb2d07cc8","c3694c07badc314e2ed02dd7de70b9afb5317a67dd7350deaab801b6f8da45e4","2cdcabe47a68751d95a2c373d87fa81402b16cf73a4e2244da5c6b9e10b67390","39cebdf3459bbb70d3a6bcbd9c5e32ca9259379a832678918424d8d03ea79ec7","660200d718c14443e5f5e080045429c4c9825e55e68ac2114290b01a317242a4","6e40a3a87126255d4c1aa4d613923b6e3c5c28273d018a8591af338232f393ab",{"version":"52743bd0514d63720473b770a8afc9d725f3a535882e7a691609d255abe0573b","signature":"87ee375c482a5556bb46475916896835e2a67d05c00ad03a3c1eef5783e73266"},{"version":"fe157af358a916a6fd4f220769886ce94c8c6a627a7c3007bdd0d6dd690ac770","signature":"ad1b047843f8f49f6960f881be736f101708c06902b33c6c3afe46f777dc7211"},{"version":"b48db14fbfe3865295a9b5ffeae0ccddb2b57d679d22df686b2d696e685010ae","signature":"3aa796846d4c76c107696390ae061886931b5790b8187bba8d16f37d0bf4a998"},"0631af7a01d5c038c926e4995b90e960c8dfb334aa832f1ae17731cf10dba7b8","32781cf95f0f871de1a85f9334178516946e3a1bad66e7a4fd2e72bfba634541","ed131ca0aa394f683cda8478ebd893f46554c2df17b45409b1d0ed13964f885b","0fbd13b4e3f8932b9fb1cf5841d46e629d94744058ef8d7445df0d74b7890896","35e49678ec00b2f77eff897d3eb7131f3f0ba185278125a495fd021a1f65ce68","0731e7b6a6dbd598e361b43c61274382aa12f3f2310cd2be1af2217a9d7a3194","9d5cf0a1c021b426993094960f7bf8cdfe87b3168ebe19cd259af2d5e614eeb0","c3b5d29bfc6a9c31b26f5f65f37b61c0a2af3017855032c1cf009ff8a66c253d","d3f2a1d403c6923251f005f4966bc9573188838262c77624680ed0fe7280898e","59cb1d2cc5b705363eefe21176dbfdf41c0bed528fb302decb7652474b8b9849","25f49e92b42a4e8ff69a8f3c3ad941038e14b1db1979d4f4e8f15dafd89d14a3","9479944210303c893a99beb6d0a3eeea4a93744f16dc5ac35b3cf31448fb51a6","c85d9f442f84ced3c2ab8e0ff0e0a02c48d8111af11f2de71f28aa63b0b89eec","54f08a3025507ee4298a7dbeac9d3d1e57ee3e25d3090d4624e3ede9c3b13eea","24e6620d9be33ed3c989b78be8c02d23e6c9250547cfa6d63e2391cf073750f5","a76e9101aa9359690a697c9cdaef16e5ae5a3340683558716d6cf34f05407881","884bc4095e0e65711caf80c792e4094f2d3ea25bc4a16f6bd6827627f21ceaed","0ab75de3a5765d443b25a0a98505aa876cbf00860b9e420e248edd77ff728b7f","4bdcba92cfa9c33db4119043105ba9a4be26328b4157302c9260ce94fc2e1317","a5d88d0548bb5b5b8d20976e45bb31d13b1153b9dac8b6abdf005dd05e0d4309","4e77675d511f9fdea854f4261f319481466d3253de25da8c9c968c5d951dbc48","a303090c5df80577a00c82faabe1b504ba174797c9bcd6c88a3b3d3f88aafd38","7a7ee7def2f98061225cc5ca12a585ab8bb68f0fd97473688faf61496a1132b6","442af7c8c071f3aecd54f0940336d9d9f0226a1e534297ebb0abfdee67a43b37","d23f1c5f6a24c81fa2c7279cad9aceb208f8238c4eea582d226c0046a7cd4624","4761e8ec280db92bf51bba16ab3c4e8fd4220e8b90c190afff42449c603eb0a4","c5ac3106651ef6fae89e30baaa50b2e819c088253bcba435a6e0447be706a898","842ff146e8da3624a3b0274c11fc50ea2c9f8d9559475b6b74143393c375089a","746396caf387bae7b47b13383cbcaf120c1598662b1b5ac1d8a42f4629bfb56d","517e0cc96d0967ac1200df80c65b485b6db1c3c61fb311a9faa4dd4b5807f778","6f8514d49cbf7e8a20b2f16a9f15fca9712dfcb962976f6142dd3b5271315c2e","0aa049f167c79469d142f7439e9182d05909f44860f083cd73c88c9e28757f7c","b6d47e05515908d5973e6bf6455388f1d52d739008940d4322e0df2d7111d76f","011bd3c1e8fc015fb3e36aefb47e8a2e134e31782ff9e6d7977547640ed7314b","2186b2002c92d853604a19e399a477835842ca49aa1c6a0bd1bd16158bd748f5","03e16449ce8b52f429359facd8a2a6187714db69db0fe646f222c0e25b8ac376","4a726a8e031a6052c1ad2d0972d2b577203b54caf424e21fa3e6df5ea41f8f07","cc61a9995a53eed6cedf38475dc8116adec717de774237a2797fe708a47c3479","9eabe3888e0b96ef1fc609c22bfc43fd3eb7d6be6393538657e813a90c44702f","a65f5ee60ef6ac262c1403467f70f2e54f3c3923988fcccb41958b9ac85b33bc","4d8ecb29be63a6e060401ae63c67c957bad5f823d017c9a350c123ddb8025761","b488f970002fae106829afdaf93f880aaa8d0e56af2c79a19e1dbb4ff74db39a","d519e6b3a94058e3406dccdea8fc8e93b699b7fe169a1bf625e8aa390094e808","be39d5fdfe27914072f4b056f9fb05f7442c8a70ca8186f35fc48ac1a7d3e292","7c0dbd01a794e5f072d9a21bf4cc6959e1b11ed18ef48239031c0458bec5c1b3","28ee0c27dcd7a251a003326230cbd0be7f7c9eda0cbecf438c9f66bf06d68756",{"version":"e42fe6bbdaa0f8211fffb76e2762d9acd6ddc7f5eb5f81a1f57396a844c4c0af","signature":"a94b7c6b0c74947034f8d89296cdd9cee981e27d75634abbecb1f8c7aafb9a35"},{"version":"15390eb15749436066008ab752173e06b0acf2c1fa4b7b6b2ec04be6541974b2","signature":"4ebfcc60aeb7d3f1e2ae28f21fe137b1e5e4f14565b60aa62147d9e6f4f46cb4"},{"version":"030a6ab0f95240edf2b5afef944088231b94204984b2708b7a2387a78d26045c","signature":"b8a2355ec4f0d12edf741b5a83fbfd54cffc4066759413871071a9f144bfffd5"},{"version":"bec0a4af8682d429c9f8d6bd271269deab328d894fb8389fe0e3c2185b9931f1","signature":"2e1ad36e643709dc5775d434895254df89e0c5a06fc72dab58776b3257ee8a3c"},{"version":"08361caa4618aac21444a0ff38d2169dccb1afca634a47937816ba479dc6546c","signature":"e40e31e4cb51c1cf36f1ca8243f2d82c832a3752f14e421500c471512b4bd238"},{"version":"b6983a928d176a2bf2e9777e6b6a7c68a29598e0ee512024401d39977f26d55d","signature":"1b2fe35d886683723e448a2ebebc1212273e77f6f9769ce6e5ebfe1e1566afce"},"d4965f9a819e046d84c5adf3630efc1ecff2f264d1686cb251753046a6285108","b1579532b1ad2680f7d245b4c905a27b29ef15804932bc648aafd96dc69dba3e","3154a026075044aa102298fe9e6a7a14aaa26a06270680c7478a1765af8ffb09","a1112a382ac2382c5e20878d36ef4e14994982c07b4d69e3fe7d00714c40be48","d53fe8326a03515b89b338151d0adfa19a17ebabff44aae298ce15702cf4e3fb","e2f2d3eb66a2834664223376e901d52de62bab11801c463c39f4ce63ce9928a6",{"version":"e247b9caae123ab3d80200992179741cd6a0608f078253a1ee0dedf9c635a495","signature":"669f2d63652e15ed834c74b662dadcad24a5ce0192b719791fd68dce9172ba79"},{"version":"cbb0c35b891740783a8e0b95691efd545100f3dcd8837cc78905ead98970e3c2","signature":"a97cd12c85ef66c37220f71077f4d038620c9977a3e819a918d8a142a8552a59"},{"version":"cbe3f985a8e80dcfb6ba172cceff88ff7d18d3ae85631092045d98c503cff110","signature":"a9c9db68612c9456a09e2975c43353c19d211a9de5679e0010a244e10294a86d"},"4116dff2582ecc8645c3a90d26707ec6fd9ede6631f63fb65f11d42806bb47f1","8486ee0cb2ef80c6555941e2e0d081b27e9a07eca9df720c99f001f5220f14b5",{"version":"eb1be3d0b519af0f44051649ab431b5c336ac6cedc01d5e389165a357d44d57c","signature":"4ce5942c6dfd0df604f4dcc11a4a2230368ddfc434857540a6c6c4f761af2e71"},{"version":"3abc9376abd406c580ef4074fdfb1774e5e64da1a97e7f30d193ee9b532d187c","signature":"98e6edc2890ce1e5ef39711090fed8b1225d5ee48cc093d9a675eb80bb07221f"},{"version":"b4c0ef76526f3d59c0fe18eb7bcd7e34f7b6f4be39b3ea65175ee70b6deb53ce","signature":"bb7765503260a633de9ab418df57e5292b157ebace274b2dcc9f630d616caf4e"},{"version":"a352753028b1faf596838da2287d6835f33706b92889683b2d444b077d46f1e6","signature":"3dc17f0d08aa6e87ad45d55160e54960cc26c9aaa2bae04df62779fe66713949"},{"version":"fb8ab9e480bc86fc4adfc319cf7d288b279bf593bc0db0ecac7f7de22d379b08","signature":"b90e756822803e966351faf97e3ecd887bf6ca8d3236cfdab1d5a212b971773e"},{"version":"9683f764f152f01bbd856b4cd9306b0d991ceb7272ed33c9a456f72f870c0d12","signature":"94afd7ae6e6d62dc7eff655c4139cbad7aad32a74183ec47ecf73f3b3c61c93c"},{"version":"077b889ea438205287abee878d472aca8659e07ae49e71903b2d8b20caa0e028","signature":"4b177e3504b1f7731bb7823a9cf0534a7f733121643960630f00335d7c44c5ba"},{"version":"590da7b15098c9c2a4c74d449bcbd3e7eb7b66e1aa115c4ae0d6169205d9e538","signature":"6e4094fd8c1d4d7b7f69bad18624c1825edef8237b594da112f426bd34c6733b"},{"version":"5c96232d86cf755ae1147fe908531f18189954bf7bfa196bc73153077d73223b","signature":"7c771de6671dea66634ca6cd82239206b98a4660b2818b4f3346a30b23a31c50"},{"version":"9f9dbf836253b074da07f5a38eb3883c887ee7bd6c461d2a30e90db11e6be554","signature":"69350cd89aedbf28d9f71c535dca88153a17fc6f24194c0b330a92a15df925ec"},{"version":"5206153c4b132b36ce3d390610371abf0928f0a34a0545732fd3e5add0439f44","signature":"970c2d0c42cb05eb574ecb4ba62459151b68bf1e7324cd65330abb1d20bf8391"},{"version":"f950fc9cf0837441260906a9bbac1e68045e4f12a49cd8588d4b330f9edb4dfd","signature":"e6d9c8a54f55db1d6550e14b70a65c1b43d2b0c24f19fac2db9d4208c80dbc20"},{"version":"846d5ab90ef549763102dbb44e16b39e7f2b605335c10107a1b551d8760aa283","signature":"c4a8029329dca0614aad47612348375abd2476d6b63fd65fcd08a0feb2629a49"},{"version":"8c4f7ad3fc3212cf2969e0a60e02eed14097d4b3ff61ea1483b4526557611e15","signature":"306919f7f38625b795e88e981b67222623b3c8e6f26ded91c6b27e656bcdf367"},"f16bedf337341c18d7daab08bacafc68eeb92af927fc3fae2befd1eb1f6f897d","6a9c5127096b35264eb7cd21b2417bfc1d42cceca9ba4ce2bb0c3410b7816042","78828b06c0d3b586954015e9ebde5480b009e166c71244763bda328ec0920f41","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6",{"version":"c4c03cf65951d980ba618ae9601d10438730803fc9c8a1f7b34af8739981e205","affectsGlobalScope":true},"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","6aee496bf0ecfbf6731aa8cca32f4b6e92cdc0a444911a7d88410408a45ecc5d","e2e10045d93d3b029dcd62784bafb7200d4eb51b1ef6a98b77baa763b9a5e1d3","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","ae84439d1ae42b30ced3df38c4285f35b805be40dfc95b0647d0e59c70b11f97"],"options":{"composite":true,"declaration":true,"declarationMap":true,"experimentalDecorators":true,"module":1,"outDir":"./","rootDir":"../../../src/connections","sourceMap":true,"strict":true,"stripInternal":true,"target":4,"tsBuildInfoFile":"./tsbuildinfo.json"},"fileIdsList":[[92],[80,92,99,163,201],[92,111,163,201,202],[92,198,199,200,201,202,203,204,205,206,207,208,210,211,212],[92,163],[92,204,205,206],[80,92,99,111,163,199,202,203,207,208,210,211],[92,209],[92,111,163,209],[92,111,163],[70,92,99,111,163,199],[70,92,99,111],[49,92,99,100],[49,92,99,100,111],[49,92,99,100,112],[49,92,99,100,111,112,114],[92,99,100,112,113,115,116,117,118,120,121],[49,92,99,112,115,119],[49,92,99,116],[49,92,99,112,115],[92,111,128,140],[92,111,115,143],[92,111,128,133],[92,99],[92,111,127],[92,140],[92,114,122,123,124,125,126,127,128,129,130,131,132,133,134,138,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[49,92,99],[49,92,99,114],[92,99,126,127,142],[49,92,99,126,127],[49,92,99,126,149],[49,92,99,126,127,128],[92,111,141],[92,111],[92,111,123,125,133,145,146,147,153],[80,92,99,111,123,125,133,138,144,145,147,150,152,153],[92,111,128,133,138,147,148],[92,111,122,135,136,147,148],[92,148],[92,111,123,127,128,130,133,140,146,147],[92,99,111,124,128,129,130,131,132,147],[92,111,125,128,133,147,149,150],[92,111,115],[92,111,133],[92,111,147,149,150],[49,92,99,111,123,125,127,128,130,133,134,136,137,139,140,141,144,145,146,148,149],[92,111,122],[92,122,127,142,148],[80,92,99,133],[49,70,80,92,99,111,124],[92,111,124],[92,246],[45,92],[48,92],[49,54,83,92],[50,62,63,70,80,91,92],[50,51,62,70,92],[52,92],[53,54,63,71,92],[54,80,88,92],[55,57,62,70,92],[56,92],[57,58,92],[62,92],[59,62,92],[62,63,64,80,91,92],[62,63,64,77,80,83,92],[92,96],[57,65,70,80,91,92],[62,63,65,66,70,80,88,91,92],[65,67,80,88,91,92],[45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],[62,68,92],[69,91,92],[57,62,70,80,92],[71,92],[72,92],[48,73,92],[74,90,92,96],[75,92],[76,92],[62,77,78,92],[77,79,92,94],[49,62,80,81,82,83,92],[49,80,82,92],[80,81,92],[83,92],[84,92],[62,86,87,92],[86,87,92],[54,70,80,88,92],[89,92],[70,90,92],[49,65,76,91,92],[54,92],[80,92,93],[92,94],[92,95],[49,54,62,64,73,80,91,92,94,96],[80,92,97],[92,250,289],[92,250,274,289],[92,289],[92,250],[92,250,275,289],[92,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288],[92,275,289],[92,229],[62,65,67,70,91,92,99],[92,291],[92,104],[92,99,102,103,104,105,106,107,108,109,110],[50,70,92,99,103,104],[92,105,106],[92,191],[92,168,169,171,172,174,175,178,179,180,181,182,183,184,185,186,187,189,190,194,195,196],[92,177],[92,176],[92,171,174,175,179,180],[92,169,170],[92,168],[92,172,173],[92,174],[92,181,192],[92,193],[92,171,175,178],[92,179],[92,176,177],[92,188],[92,189],[92,220,221,223,224],[92,197],[67,92,99,197,220],[67,92,99,197,220,221,222],[43,92],[92,163,164,165,166],[43,44,92,165,166,167,214,215,216,218,219,227,228,231,232,233,235,236,238,242,243],[92,163,213],[92,163,197,213,217,227,244],[92,163,197,217,227,230,244],[92,163,197,225],[92,163,166,215,217,226,235,237],[70,92,111,199],[65,92,163,164,166],[80,92,163,197,213,216,217],[43,44,92,111,213,214,215],[43,44,92,111,163,213,214,215,216,225,226],[65,92],[43,65,92,111,163,164,165,166,167,197,213,217,225,226,227,235,236,237,238,239,240],[92,163,217],[92,163,197,216,217],[92,163,164,166],[80,92,111,163,166,197,213,217,218,225,226,232,234,241],[92,111,163,166,197,213,217,219,225,230,231,233,234,240,241],[65,92,111,163,197,215,216,217,236],[43],[163,164,165,166],[43,44,165,166,167,214,215,216,218,219,227,228,231,232,233,235,236,238,242,243],[163,213],[163],[163,197,213,217,227,244],[163,197,217,227,244],[163,197,225],[163,217,235,237],[70,111,199],[65,163,164,166],[80,163,197,213,216,217],[43,44,111,213,214,215],[43,44,111,213,214,215,216],[65],[65,111,163,165,197,217,225,227,235,236,237],[163,217],[163,197,216,217],[163,164,166],[80,111,163,197,213,217,218,225,241],[111,163,197,213,217,219,225,241],[65,111,163,197,215,216,217,236],[111,163]],"referencedMap":[[201,1],[202,2],[203,3],[213,4],[204,5],[205,5],[206,5],[207,6],[208,5],[212,7],[209,5],[210,8],[211,9],[198,10],[200,11],[199,12],[117,13],[119,1],[116,14],[112,14],[113,15],[115,16],[100,1],[122,17],[120,18],[121,19],[118,20],[157,21],[144,22],[131,1],[146,23],[132,24],[130,25],[145,26],[163,27],[114,28],[156,29],[126,29],[143,30],[142,1],[128,31],[135,31],[127,32],[140,33],[129,1],[160,34],[141,35],[161,36],[162,37],[139,38],[137,39],[155,40],[148,41],[133,42],[151,43],[150,44],[154,45],[152,46],[147,47],[136,48],[149,49],[153,50],[134,1],[125,51],[123,1],[124,35],[138,1],[159,1],[158,52],[247,53],[60,1],[248,1],[249,1],[246,1],[45,54],[46,54],[48,55],[49,56],[50,57],[51,58],[52,59],[53,60],[54,61],[55,62],[56,63],[57,64],[58,64],[61,65],[59,66],[62,65],[63,67],[64,68],[47,69],[98,1],[65,70],[66,71],[67,72],[99,73],[68,74],[69,75],[70,76],[71,77],[72,78],[73,79],[74,80],[75,81],[76,82],[77,83],[78,83],[79,84],[80,85],[82,86],[81,87],[83,88],[84,89],[85,1],[86,90],[87,91],[88,92],[89,93],[90,94],[91,95],[92,96],[93,97],[94,98],[95,99],[96,100],[97,101],[274,102],[275,103],[250,104],[253,104],[272,102],[273,102],[263,102],[262,105],[260,102],[255,102],[268,102],[266,102],[270,102],[254,102],[267,102],[271,102],[256,102],[257,102],[269,102],[251,102],[258,102],[259,102],[261,102],[265,102],[276,106],[264,102],[252,102],[289,107],[288,1],[283,106],[285,108],[284,106],[277,106],[278,106],[280,106],[282,106],[286,108],[287,108],[279,108],[281,108],[290,1],[230,109],[229,1],[164,110],[291,1],[292,111],[222,1],[101,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[107,112],[104,1],[108,1],[111,113],[105,114],[106,114],[103,1],[109,115],[110,115],[102,1],[190,1],[192,116],[197,117],[191,1],[182,118],[183,1],[177,119],[176,1],[181,120],[171,121],[169,122],[168,1],[170,1],[184,1],[172,1],[196,1],[174,123],[173,124],[185,1],[193,125],[194,126],[175,1],[179,127],[195,128],[178,129],[186,1],[187,124],[189,130],[188,131],[180,129],[225,132],[224,133],[221,134],[223,135],[220,1],[43,1],[44,136],[167,137],[244,138],[240,139],[234,5],[239,139],[228,140],[231,141],[245,1],[214,5],[236,142],[238,143],[232,144],[215,1],[233,1],[166,145],[218,146],[216,147],[227,148],[217,149],[241,150],[235,151],[219,152],[165,153],[242,154],[243,155],[237,156],[226,10]],"exportedModulesMap":[[201,1],[202,2],[203,3],[213,4],[204,5],[205,5],[206,5],[207,6],[208,5],[212,7],[209,5],[210,8],[211,9],[198,10],[200,11],[199,12],[117,13],[119,1],[116,14],[112,14],[113,15],[115,16],[100,1],[122,17],[120,18],[121,19],[118,20],[157,21],[144,22],[131,1],[146,23],[132,24],[130,25],[145,26],[163,27],[114,28],[156,29],[126,29],[143,30],[142,1],[128,31],[135,31],[127,32],[140,33],[129,1],[160,34],[141,35],[161,36],[162,37],[139,38],[137,39],[155,40],[148,41],[133,42],[151,43],[150,44],[154,45],[152,46],[147,47],[136,48],[149,49],[153,50],[134,1],[125,51],[123,1],[124,35],[138,1],[159,1],[158,52],[247,53],[60,1],[248,1],[249,1],[246,1],[45,54],[46,54],[48,55],[49,56],[50,57],[51,58],[52,59],[53,60],[54,61],[55,62],[56,63],[57,64],[58,64],[61,65],[59,66],[62,65],[63,67],[64,68],[47,69],[98,1],[65,70],[66,71],[67,72],[99,73],[68,74],[69,75],[70,76],[71,77],[72,78],[73,79],[74,80],[75,81],[76,82],[77,83],[78,83],[79,84],[80,85],[82,86],[81,87],[83,88],[84,89],[85,1],[86,90],[87,91],[88,92],[89,93],[90,94],[91,95],[92,96],[93,97],[94,98],[95,99],[96,100],[97,101],[274,102],[275,103],[250,104],[253,104],[272,102],[273,102],[263,102],[262,105],[260,102],[255,102],[268,102],[266,102],[270,102],[254,102],[267,102],[271,102],[256,102],[257,102],[269,102],[251,102],[258,102],[259,102],[261,102],[265,102],[276,106],[264,102],[252,102],[289,107],[288,1],[283,106],[285,108],[284,106],[277,106],[278,106],[280,106],[282,106],[286,108],[287,108],[279,108],[281,108],[290,1],[230,109],[229,1],[164,110],[291,1],[292,111],[222,1],[101,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[107,112],[104,1],[108,1],[111,113],[105,114],[106,114],[103,1],[109,115],[110,115],[102,1],[190,1],[192,116],[197,117],[191,1],[182,118],[183,1],[177,119],[176,1],[181,120],[171,121],[169,122],[168,1],[170,1],[184,1],[172,1],[196,1],[174,123],[173,124],[185,1],[193,125],[194,126],[175,1],[179,127],[195,128],[178,129],[186,1],[187,124],[189,130],[188,131],[180,129],[225,132],[224,133],[221,134],[223,135],[220,1],[44,157],[167,158],[244,159],[240,160],[234,161],[239,160],[228,162],[231,163],[245,1],[214,161],[236,164],[238,165],[232,166],[166,167],[218,168],[216,169],[227,170],[217,171],[241,172],[235,173],[219,174],[165,175],[242,176],[243,177],[237,178],[226,179]],"semanticDiagnosticsPerFile":[201,202,203,213,204,205,206,207,208,212,209,210,211,198,200,199,117,119,116,112,113,115,100,122,120,121,118,157,144,131,146,132,130,145,163,114,156,126,143,142,128,135,127,140,129,160,141,161,162,139,137,155,148,133,151,150,154,152,147,136,149,153,134,125,123,124,138,159,158,247,60,248,249,246,45,46,48,49,50,51,52,53,54,55,56,57,58,61,59,62,63,64,47,98,65,66,67,99,68,69,70,71,72,73,74,75,76,77,78,79,80,82,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,274,275,250,253,272,273,263,262,260,255,268,266,270,254,267,271,256,257,269,251,258,259,261,265,276,264,252,289,288,283,285,284,277,278,280,282,286,287,279,281,290,230,229,164,291,292,222,101,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,107,104,108,111,105,106,103,109,110,102,190,192,197,191,182,183,177,176,181,171,169,168,170,184,172,196,174,173,185,193,194,175,179,195,178,186,187,189,188,180,225,224,221,223,220,43,44,167,244,240,234,239,228,231,245,214,236,238,232,215,233,166,218,216,227,217,241,235,219,165,242,243,237,226],"latestChangedDtsFile":"./index.d.ts"},"version":"4.9.5"}

@@ -19,3 +19,2 @@ import { CancellationToken } from 'vscode-jsonrpc';

private error?;
protected isRefreshingTunnelAccessTokenEventHandled: boolean;
private readonly refreshingTunnelAccessTokenEmitter;

@@ -34,2 +33,3 @@ private readonly connectionStatusChangedEmitter;

get isDisposed(): boolean;
protected get isRefreshingTunnelAccessTokenEventHandled(): boolean;
/**

@@ -36,0 +36,0 @@ * Gets dispose cancellation token.

@@ -12,2 +12,3 @@ "use strict";

const dev_tunnels_management_1 = require("@microsoft/dev-tunnels-management");
const utils_1 = require("./utils");
/**

@@ -25,7 +26,3 @@ * Tunnel connection base class.

this.status = connectionStatus_1.ConnectionStatus.None;
this.isRefreshingTunnelAccessTokenEventHandled = false;
this.refreshingTunnelAccessTokenEmitter = new vscode_jsonrpc_1.Emitter({
onFirstListenerAdd: () => (this.isRefreshingTunnelAccessTokenEventHandled = true),
onLastListenerRemove: () => (this.isRefreshingTunnelAccessTokenEventHandled = false),
});
this.refreshingTunnelAccessTokenEmitter = new utils_1.TrackingEmitter();
this.connectionStatusChangedEmitter = new vscode_jsonrpc_1.Emitter();

@@ -59,2 +56,5 @@ this.retryingTunnelConnectionEmitter = new vscode_jsonrpc_1.Emitter();

}
get isRefreshingTunnelAccessTokenEventHandled() {
return this.refreshingTunnelAccessTokenEmitter.isSubscribed;
}
/**

@@ -80,8 +80,8 @@ * Gets dispose cancellation token.

}
if (value === connectionStatus_1.ConnectionStatus.RefreshingTunnelAccessToken && this.status !== connectionStatus_1.ConnectionStatus.Connecting) {
throw new Error('Refreshing tunnel access token is allowed only when connecting.');
}
if (value !== this.status) {
const previousStatus = this.connectionStatus;
this.status = value;
if (value === connectionStatus_1.ConnectionStatus.Connected) {
this.error = undefined;
}
this.onConnectionStatusChanged(previousStatus, value);

@@ -136,3 +136,5 @@ }

onConnectionStatusChanged(previousStatus, status) {
const event = new connectionStatusChangedEventArgs_1.ConnectionStatusChangedEventArgs(previousStatus, status, this.disconnectError);
// Disconnect error is provided only during disconnection, not disposal.
const disconnectError = this.connectionStatus === connectionStatus_1.ConnectionStatus.Disconnected && !this.isDisposed ? this.disconnectError : undefined;
const event = new connectionStatusChangedEventArgs_1.ConnectionStatusChangedEventArgs(previousStatus, status, disconnectError);
this.connectionStatusChangedEmitter.fire(event);

@@ -139,0 +141,0 @@ }

/// <reference types="node" />
import { Tunnel } from '@microsoft/dev-tunnels-contracts';
import { TunnelManagementClient } from '@microsoft/dev-tunnels-management';
import { Stream, Trace } from '@microsoft/dev-tunnels-ssh';
import { CancellationToken } from 'vscode-jsonrpc';
import { SshDisconnectReason, SshSessionClosedEventArgs, Trace } from '@microsoft/dev-tunnels-ssh';
import { CancellationToken, Disposable, Event } from 'vscode-jsonrpc';
import { TunnelConnector } from './tunnelConnector';

@@ -11,2 +11,4 @@ import { TunnelSession } from './tunnelSession';

import { TunnelConnectionOptions } from './tunnelConnectionOptions';
import { RefreshingTunnelEventArgs } from './refreshingTunnelEventArgs';
import { TunnelRelayStreamFactory } from './tunnelRelayStreamFactory';
/**

@@ -16,2 +18,3 @@ * Tunnel connection session.

export declare class TunnelConnectionSession extends TunnelConnectionBase implements TunnelSession {
protected readonly connectionProtocols: string[];
/**

@@ -26,4 +29,10 @@ * Gets the management client used for the connection.

private connectionProtocolValue?;
private disconnectionReason?;
private readonly refreshingTunnelEmitter;
httpAgent?: http.Agent;
/**
* Gets or sets a factory for creating relay streams.
*/
streamFactory: TunnelRelayStreamFactory;
/**
* Name of the protocol used to connect to the tunnel.

@@ -34,6 +43,15 @@ */

/**
* A value indicating if this is a client tunnel connection (as opposed to host connection).
*/
protected get isClientConnection(): boolean;
/**
* tunnel connection role, either "client", or "host", depending on @link tunnelAccessScope.
*/
protected get connectionRole(): string;
/**
* Tunnel access token.
*/
protected accessToken?: string;
constructor(tunnelAccessScope: string, trace?: Trace,
protected sshSessionDisposables: Disposable[];
constructor(tunnelAccessScope: string, connectionProtocols: string[], trace?: Trace,
/**

@@ -53,2 +71,6 @@ * Gets the management client used for the connection.

/**
* An event which fires when tunnel connection refreshes tunnel.
*/
readonly refreshingTunnel: Event<RefreshingTunnelEventArgs>;
/**
* Tunnel has been assigned to or changed.

@@ -77,22 +99,18 @@ */

/**
* Creates a stream to the tunnel.
* Gets the disconnection reason.
* {@link SshDisconnectReason.none } if not yet disconnected.
* {@link SshDisconnectReason.connectionLost} if network connection was lost and reconnects are not enabled or unsuccesfull.
* {@link SshDisconnectReason.byApplication} if connection was disposed.
* {@link SshDisconnectReason.tooManyConnections} if host connection was disconnected because another host connected for the same tunnel.
*/
createSessionStream(options?: TunnelConnectionOptions, cancellation?: CancellationToken): Promise<{
stream: Stream;
protocol: string;
}>;
get disconnectReason(): SshDisconnectReason | undefined;
/**
* Configures the tunnel session with the given stream.
* Sets the disconnect reason that caused disconnection.
*/
configureSession(stream: Stream, protocol: string, isReconnect: boolean, cancellation: CancellationToken): Promise<void>;
protected set disconnectReason(reason: SshDisconnectReason | undefined);
/**
* Closes the tunnel session due to an error.
* Disposes this tunnel session, closing the SSH session used for it.
*/
closeSession(error?: Error): Promise<void>;
dispose(): Promise<void>;
/**
* Refreshes the tunnel access token. This may be useful when the Relay service responds with 401 Unauthorized.
* Does nothing if the object is disposed, or there is no way to refresh the token.
*/
refreshTunnelAccessToken(cancellation: CancellationToken): Promise<boolean>;
/**
* Get a value indicating whether this session can attempt refreshing tunnel.

@@ -102,7 +120,7 @@ * Note: tunnel refresh may still fail if the tunnel doesn't exist in the service,

*/
protected get canRefreshTunnel(): TunnelManagementClient | null | undefined;
protected get canRefreshTunnel(): boolean | TunnelManagementClient;
/**
* Fetch the tunnel from the service if {@link managementClient} and {@link tunnel} are set.
*/
protected refreshTunnel(cancellation?: CancellationToken): Promise<void>;
protected refreshTunnel(includePorts?: boolean, cancellation?: CancellationToken): Promise<boolean>;
/**

@@ -129,6 +147,14 @@ * Creates a tunnel connector

/**
* SSH session closed event handler. Child classes may use it unsubscribe session events and maybe start reconnecting.
*/
protected onSshSessionClosed(e: SshSessionClosedEventArgs): void;
/**
* Start reconnecting if the tunnel connection is not yet disposed.
*/
protected startReconnectingIfNotDisposed(): void;
protected maybeStartReconnecting(reason?: SshDisconnectReason, message?: string, error?: Error | null): void;
/**
* Get a user-readable reason for SSH session disconnection, or an empty string.
*/
protected getDisconnectReason(reason?: SshDisconnectReason, message?: string, error?: Error | null): string;
/**
* Connect to the tunnel session by running the provided {@link action}.

@@ -153,3 +179,7 @@ */

validateAccessToken(): string | undefined;
/**
* Unsubscribe SSH session events in @link TunnelSshConnectionSession.sshSessionDisposables
*/
protected unsubscribeSessionEvents(): void;
}
//# sourceMappingURL=tunnelConnectionSession.d.ts.map

@@ -17,2 +17,4 @@ "use strict";

const portRelayConnectRequestMessage_1 = require("./messages/portRelayConnectRequestMessage");
const refreshingTunnelEventArgs_1 = require("./refreshingTunnelEventArgs");
const defaultTunnelRelayStreamFactory_1 = require("./defaultTunnelRelayStreamFactory");
/**

@@ -31,4 +33,16 @@ * Tunnel connection session.

}
constructor(tunnelAccessScope, trace,
/**
* A value indicating if this is a client tunnel connection (as opposed to host connection).
*/
get isClientConnection() {
return this.tunnelAccessScope === dev_tunnels_contracts_1.TunnelAccessScopes.Connect;
}
/**
* tunnel connection role, either "client", or "host", depending on @link tunnelAccessScope.
*/
get connectionRole() {
return this.isClientConnection ? 'client' : 'host';
}
constructor(tunnelAccessScope, connectionProtocols, trace,
/**
* Gets the management client used for the connection.

@@ -38,5 +52,16 @@ */

super(tunnelAccessScope);
this.connectionProtocols = connectionProtocols;
this.managementClient = managementClient;
this.connectedTunnel = null;
this.refreshingTunnelEmitter = new utils_1.TrackingEmitter();
/**
* Gets or sets a factory for creating relay streams.
*/
this.streamFactory = new defaultTunnelRelayStreamFactory_1.DefaultTunnelRelayStreamFactory();
this.sshSessionDisposables = [];
/**
* An event which fires when tunnel connection refreshes tunnel.
*/
this.refreshingTunnel = this.refreshingTunnelEmitter.event;
/**
* Determines whether E2E encryption is requested when opening connections through the tunnel

@@ -89,10 +114,43 @@ * (V2 protocol only).

/**
* Creates a stream to the tunnel.
* Gets the disconnection reason.
* {@link SshDisconnectReason.none } if not yet disconnected.
* {@link SshDisconnectReason.connectionLost} if network connection was lost and reconnects are not enabled or unsuccesfull.
* {@link SshDisconnectReason.byApplication} if connection was disposed.
* {@link SshDisconnectReason.tooManyConnections} if host connection was disconnected because another host connected for the same tunnel.
*/
createSessionStream(options, cancellation) {
throw new Error('Not implemented');
get disconnectReason() {
return this.disconnectionReason;
}
/**
* Configures the tunnel session with the given stream.
* Sets the disconnect reason that caused disconnection.
*/
set disconnectReason(reason) {
this.disconnectionReason = reason;
}
/**
* @internal Creates a stream to the tunnel.
*/
async createSessionStream(options, cancellation) {
if (!this.relayUri) {
throw new Error('Cannot create tunnel session stream. Tunnel relay endpoint URI is missing');
}
const accessToken = this.validateAccessToken();
this.trace(dev_tunnels_ssh_1.TraceLevel.Info, 0, `Connecting to ${this.connectionRole} tunnel relay ${this.relayUri}`);
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Sec-WebSocket-Protocol: ${this.connectionProtocols.join(', ')}`);
if (accessToken) {
const tokenTrace = dev_tunnels_management_1.TunnelAccessTokenProperties.getTokenTrace(accessToken);
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Authorization: tunnel <${tokenTrace}>`);
}
const clientConfig = {
tlsOptions: {
agent: this.httpAgent,
},
};
const streamAndProtocol = await this.streamFactory.createRelayStream(this.relayUri, this.connectionProtocols, accessToken, clientConfig);
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Connected with subprotocol '${streamAndProtocol.protocol}'`);
return streamAndProtocol;
}
/**
* @internal Configures the tunnel session with the given stream.
*/
configureSession(stream, protocol, isReconnect, cancellation) {

@@ -102,11 +160,42 @@ throw new Error('Not implemented');

/**
* Closes the tunnel session due to an error.
* @internal Closes the tunnel session due to an error.
*/
closeSession(error) {
this.disconnectError = error;
return Promise.resolve();
async closeSession(reason, error) {
this.unsubscribeSessionEvents();
const session = this.sshSession;
if (!session) {
return;
}
if (!session.isClosed) {
await session.close(reason || dev_tunnels_ssh_1.SshDisconnectReason.none, undefined, error);
}
else {
this.sshSession = undefined;
}
// Closing the SSH session does nothing if the session is in disconnected state,
// which may happen for a reconnectable session when the connection drops.
// Disposing of the session forces closing and frees up the resources.
session.dispose();
}
/**
* Disposes this tunnel session, closing the SSH session used for it.
*/
async dispose() {
if (this.disconnectReason === dev_tunnels_ssh_1.SshDisconnectReason.none ||
this.disconnectReason === undefined) {
this.disconnectReason = dev_tunnels_ssh_1.SshDisconnectReason.byApplication;
}
await super.dispose();
try {
await this.closeSession(this.disconnectReason, this.disconnectError);
}
catch (e) {
if (!(e instanceof dev_tunnels_ssh_1.ObjectDisposedError))
throw e;
}
}
/**
* Refreshes the tunnel access token. This may be useful when the Relay service responds with 401 Unauthorized.
* Does nothing if the object is disposed, or there is no way to refresh the token.
* @internal
*/

@@ -121,3 +210,2 @@ async refreshTunnelAccessToken(cancellation) {

}
const previousStatus = this.connectionStatus;
this.connectionStatus = connectionStatus_1.ConnectionStatus.RefreshingTunnelAccessToken;

@@ -130,3 +218,3 @@ try {

else {
await this.refreshTunnel(cancellation);
await this.refreshTunnel(false, cancellation);
}

@@ -140,7 +228,34 @@ if (this.accessToken) {

finally {
this.connectionStatus = previousStatus;
this.connectionStatus = connectionStatus_1.ConnectionStatus.Connecting;
}
return false;
}
/**
* @internal Start connecting relay client.
*/
startConnecting() {
this.connectionStatus = connectionStatus_1.ConnectionStatus.Connecting;
}
/**
* @internal Finish connecting relay client.
*/
finishConnecting(reason, disconnectError) {
if (reason === undefined || reason === dev_tunnels_ssh_1.SshDisconnectReason.none) {
if (this.connectionStatus === connectionStatus_1.ConnectionStatus.Connecting) {
// If there were temporary connection issue, disconnectError may contain the old error.
// Since we have successfully connected after all, clean it up.
this.disconnectError = undefined;
this.disconnectReason = undefined;
}
this.connectionStatus = connectionStatus_1.ConnectionStatus.Connected;
}
else if (this.connectionStatus !== connectionStatus_1.ConnectionStatus.Disconnected) {
// Do not overwrite disconnect error and reason if already disconnected.
this.disconnectReason = reason;
if (disconnectError) {
this.disconnectError = disconnectError;
}
this.connectionStatus = connectionStatus_1.ConnectionStatus.Disconnected;
}
}
/**
* Get a value indicating whether this session can attempt refreshing tunnel.

@@ -151,3 +266,3 @@ * Note: tunnel refresh may still fail if the tunnel doesn't exist in the service,

get canRefreshTunnel() {
return this.tunnel && this.managementClient;
return (this.tunnel && this.managementClient) || this.refreshingTunnelEmitter.isSubscribed;
}

@@ -157,9 +272,20 @@ /**

*/
async refreshTunnel(cancellation) {
if (this.canRefreshTunnel) {
this.traceInfo('Refreshing tunnel.');
async refreshTunnel(includePorts, cancellation) {
this.traceInfo('Refreshing tunnel.');
let isRefreshed = false;
const e = new refreshingTunnelEventArgs_1.RefreshingTunnelEventArgs(this.tunnelAccessScope, this.tunnel, !!includePorts, this.managementClient, cancellation);
this.refreshingTunnelEmitter.fire(e);
if (e.tunnelPromise) {
this.tunnel = await e.tunnelPromise;
isRefreshed = true;
}
if (!isRefreshed && this.tunnel && this.managementClient) {
const options = {
tokenScopes: [this.tunnelAccessScope],
includePorts,
};
this.tunnel = await (0, utils_1.withCancellation)(this.managementClient.getTunnel(this.tunnel, options), cancellation);
isRefreshed = true;
}
if (isRefreshed) {
if (this.tunnel) {

@@ -172,2 +298,3 @@ this.traceInfo('Refreshed tunnel.');

}
return true;
}

@@ -205,9 +332,36 @@ /**

/**
* SSH session closed event handler. Child classes may use it unsubscribe session events and maybe start reconnecting.
*/
onSshSessionClosed(e) {
this.unsubscribeSessionEvents();
this.sshSession = undefined;
this.maybeStartReconnecting(e.reason, e.message, e.error);
}
/**
* Start reconnecting if the tunnel connection is not yet disposed.
*/
startReconnectingIfNotDisposed() {
maybeStartReconnecting(reason, message, error) {
var _a, _b;
if (!this.isDisposed &&
((_b = (_a = this.connectionOptions) === null || _a === void 0 ? void 0 : _a.enableReconnect) !== null && _b !== void 0 ? _b : true) &&
!this.reconnectPromise) {
const traceMessage = `Connection to ${this.connectionRole} tunnel relay closed.${this.getDisconnectReason(reason, message, error)}`;
if (this.isDisposed || this.connectionStatus === connectionStatus_1.ConnectionStatus.Disconnected) {
// Disposed or disconnected already.
// This reconnection attempt may be caused by closing SSH session on dispose.
this.traceInfo(traceMessage);
return;
}
if (error) {
this.disconnectError = error;
this.disconnectReason = reason;
}
if (this.connectionStatus !== connectionStatus_1.ConnectionStatus.Connected || this.reconnectPromise) {
// Not connected or already connecting.
this.traceInfo(traceMessage);
return;
}
// Reconnect if connection is lost, reconnect is enabled, and connector exists.
// The connector may be undefined if the tunnel client/host was created directly from a stream.
if (((_b = (_a = this.connectionOptions) === null || _a === void 0 ? void 0 : _a.enableReconnect) !== null && _b !== void 0 ? _b : true) &&
reason === dev_tunnels_ssh_1.SshDisconnectReason.connectionLost &&
this.connector) {
this.traceInfo(`${traceMessage} Reconnecting.`);
this.reconnectPromise = (async () => {

@@ -227,2 +381,3 @@ try {

else {
this.traceInfo(traceMessage);
this.connectionStatus = connectionStatus_1.ConnectionStatus.Disconnected;

@@ -232,24 +387,43 @@ }

/**
* Get a user-readable reason for SSH session disconnection, or an empty string.
*/
getDisconnectReason(reason, message, error) {
switch (reason) {
case dev_tunnels_ssh_1.SshDisconnectReason.connectionLost:
return ` ${message || (error === null || error === void 0 ? void 0 : error.message) || 'Connection lost.'}`;
case dev_tunnels_ssh_1.SshDisconnectReason.authCancelledByUser:
case dev_tunnels_ssh_1.SshDisconnectReason.noMoreAuthMethodsAvailable:
case dev_tunnels_ssh_1.SshDisconnectReason.hostNotAllowedToConnect:
case dev_tunnels_ssh_1.SshDisconnectReason.illegalUserName:
return ' Not authorized.';
case dev_tunnels_ssh_1.SshDisconnectReason.serviceNotAvailable:
return ' Service not available.';
case dev_tunnels_ssh_1.SshDisconnectReason.compressionError:
case dev_tunnels_ssh_1.SshDisconnectReason.keyExchangeFailed:
case dev_tunnels_ssh_1.SshDisconnectReason.macError:
case dev_tunnels_ssh_1.SshDisconnectReason.protocolError:
return ' Protocol error.';
case dev_tunnels_ssh_1.SshDisconnectReason.tooManyConnections:
return this.isClientConnection ? ' Too many client connections.' : ' Another host for the tunnel has connected.';
default:
return '';
}
}
/**
* Connect to the tunnel session by running the provided {@link action}.
*/
async connectSession(action) {
this.connectionStatus = connectionStatus_1.ConnectionStatus.Connecting;
try {
await action();
this.connectionStatus = connectionStatus_1.ConnectionStatus.Connected;
}
catch (e) {
if (!(e instanceof dev_tunnels_ssh_1.CancellationError)) {
const name = this.tunnelAccessScope === dev_tunnels_contracts_1.TunnelAccessScopes.Connect ? 'client' : 'host';
if (e instanceof Error) {
this.traceError(`Error connecting ${name} tunnel session: ${e.message}`, e);
this.disconnectError = e;
this.traceError(`Error connecting ${this.connectionRole} tunnel session: ${e.message}`, e);
}
else {
const message = `Error connecting ${name} tunnel session: ${e}`;
const message = `Error connecting ${this.connectionRole} tunnel session: ${e}`;
this.traceError(message);
this.disconnectError = new Error(message);
}
}
this.connectionStatus = connectionStatus_1.ConnectionStatus.Disconnected;
throw e;

@@ -338,4 +512,11 @@ }

}
/**
* Unsubscribe SSH session events in @link TunnelSshConnectionSession.sshSessionDisposables
*/
unsubscribeSessionEvents() {
this.sshSessionDisposables.forEach((d) => d.dispose());
this.sshSessionDisposables = [];
}
}
exports.TunnelConnectionSession = TunnelConnectionSession;
//# sourceMappingURL=tunnelConnectionSession.js.map
/// <reference types="node" />
import { TunnelConnectionMode } from '@microsoft/dev-tunnels-contracts';
import { CancellationToken } from 'vscode-jsonrpc';
import { Duplex } from 'stream';
import { Tunnel, TunnelConnectionMode, TunnelEndpoint } from '@microsoft/dev-tunnels-contracts';
import { CancellationToken, SshSessionClosedEventArgs, Stream, Trace } from '@microsoft/dev-tunnels-ssh';
import { ForwardedPortConnectingEventArgs, ForwardedPortsCollection } from '@microsoft/dev-tunnels-ssh-tcp';
import { TunnelClient } from './tunnelClient';
import { TunnelManagementClient } from '@microsoft/dev-tunnels-management';
import { Stream, Trace } from '@microsoft/dev-tunnels-ssh';
import { TunnelClientBase } from './tunnelClientBase';
declare const TunnelRelayTunnelClient_base: {
new (...args: any[]): {
relayUri?: string | undefined;
streamFactory: import("./tunnelRelayStreamFactory").TunnelRelayStreamFactory;
createSessionStream(options?: import("./tunnelConnectionOptions").TunnelConnectionOptions | undefined, cancellation?: CancellationToken | undefined): Promise<{
stream: Stream;
protocol: string;
}>;
connectTunnelSession(tunnel?: import("@microsoft/dev-tunnels-contracts").Tunnel | undefined, options?: import("./tunnelConnectionOptions").TunnelConnectionOptions | undefined, cancellation?: CancellationToken | undefined): Promise<void>;
tunnel: import("@microsoft/dev-tunnels-contracts").Tunnel | null;
trace: Trace;
tunnelAccessScope: string;
httpAgent?: import("http").Agent | undefined;
validateAccessToken(): string | undefined;
onRetrying(event: import("./retryingTunnelConnectionEventArgs").RetryingTunnelConnectionEventArgs): void;
onConnectingToTunnel(): Promise<void>;
connectSession(action: () => Promise<void>): Promise<void>;
configureSession(stream: Stream, protocol: string, isReconnect: boolean, cancellation?: CancellationToken | undefined): Promise<void>;
closeSession(error?: Error | undefined): Promise<void>;
refreshTunnelAccessToken(cancellation?: CancellationToken | undefined): Promise<boolean>;
};
} & typeof TunnelClientBase;
import { TunnelConnectionOptions } from './tunnelConnectionOptions';
import { TunnelConnectionSession } from './tunnelConnectionSession';
export declare const webSocketSubProtocol = "tunnel-relay-client";
export declare const webSocketSubProtocolv2 = "tunnel-relay-client-v2-dev";
/**
* Tunnel client implementation that connects via a tunnel relay.
*/
export declare class TunnelRelayTunnelClient extends TunnelRelayTunnelClient_base {
export declare class TunnelRelayTunnelClient extends TunnelConnectionSession implements TunnelClient {
static readonly webSocketSubProtocol = "tunnel-relay-client";
static readonly webSocketSubProtocolv2 = "tunnel-relay-client-v2-dev";
constructor(trace?: Trace, managementClient?: TunnelManagementClient);
private readonly sshSessionClosedEmitter;
private acceptLocalConnectionsForForwardedPortsValue;
private localForwardingHostAddressValue;
private hostId?;
private readonly disconnectedStreams;
connectionModes: TunnelConnectionMode[];
constructor(trace?: Trace, managementClient?: TunnelManagementClient);
/**
* Tunnel endpoints this client connects to.
* Depending on implementation, the client may connect to one or more endpoints.
*/
endpoints?: TunnelEndpoint[];
/**
* One or more SSH public keys published by the host with the tunnel endpoint.
*/
protected hostPublicKeys?: string[];
protected get isSshSessionActive(): boolean;
/**
* Extensibility point and unit test hook.
* This event fires when the client SSH session is disconnected or closed either by this client or Relay.
*/
protected readonly sshSessionClosed: import("vscode-jsonrpc").Event<this>;
/**
* Get a value indicating if remote port is forwarded and has any channels open on the client,
* whether used by local tcp listener if {AcceptLocalConnectionsForForwardedPorts} is true, or
* streamed via <see cref="ConnectToForwardedPortAsync(int, CancellationToken)"/>.
*/
protected hasForwardedChannels(port: number): boolean;
/**
* A value indicating whether local connections for forwarded ports are accepted.
* Local connections are not accepted if the host is not NodeJS (e.g. browser).
*/
get acceptLocalConnectionsForForwardedPorts(): boolean;
set acceptLocalConnectionsForForwardedPorts(value: boolean);
/**
* Gets the local network interface address that the tunnel client listens on when
* accepting connections for forwarded ports.
*/
get localForwardingHostAddress(): string;
set localForwardingHostAddress(value: string);
get forwardedPorts(): ForwardedPortsCollection | undefined;
connect(tunnel: Tunnel, options?: TunnelConnectionOptions, cancellation?: CancellationToken): Promise<void>;
protected tunnelChanged(): void;
private onRequest;
startSshSession(stream: Stream, cancellation?: CancellationToken): Promise<void>;
private configurePortForwardingService;
private onForwardedPortAdded;
/**
* Invoked when a forwarded port is connecting. (Only for V2 protocol.)
*/
protected onForwardedPortConnecting(e: ForwardedPortConnectingEventArgs): void;
private onSecureStreamDisconnected;
private onHostAuthenticating;
private onSshServerAuthenticating;
connectToForwardedPort(fowardedPort: number, cancellation?: CancellationToken): Promise<Duplex>;
waitForForwardedPort(forwardedPort: number, cancellation?: CancellationToken): Promise<void>;
private getSshSessionPfs;
refreshPorts(): Promise<void>;
/**
* SSH session closed event handler.
*/
protected onSshSessionClosed(e: SshSessionClosedEventArgs): void;
private onSshSessionDisconnected;
/**
* Connect to the tunnel session on the relay service using the given access token for authorization.

@@ -43,3 +86,2 @@ */

}
export {};
//# sourceMappingURL=tunnelRelayTunnelClient.d.ts.map

@@ -5,29 +5,118 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.TunnelRelayTunnelClient = void 0;
exports.TunnelRelayTunnelClient = exports.webSocketSubProtocolv2 = exports.webSocketSubProtocol = void 0;
const dev_tunnels_contracts_1 = require("@microsoft/dev-tunnels-contracts");
const tunnelClientBase_1 = require("./tunnelClientBase");
const tunnelRelaySessionClass_1 = require("./tunnelRelaySessionClass");
const dev_tunnels_ssh_1 = require("@microsoft/dev-tunnels-ssh");
const dev_tunnels_ssh_tcp_1 = require("@microsoft/dev-tunnels-ssh-tcp");
const retryTcpListenerFactory_1 = require("./retryTcpListenerFactory");
const sshHelpers_1 = require("./sshHelpers");
const utils_1 = require("./utils");
const vscode_jsonrpc_1 = require("vscode-jsonrpc");
const portRelayConnectResponseMessage_1 = require("./messages/portRelayConnectResponseMessage");
const tunnelConnectionSession_1 = require("./tunnelConnectionSession");
exports.webSocketSubProtocol = 'tunnel-relay-client';
exports.webSocketSubProtocolv2 = 'tunnel-relay-client-v2-dev';
// Check for an environment variable to determine which protocol version to use.
// By default, prefer V2 and fall back to V1.
const protocolVersion = (process === null || process === void 0 ? void 0 : process.env) && process.env.DEVTUNNELS_PROTOCOL_VERSION;
const connectionProtocols = protocolVersion === '1' ? [tunnelClientBase_1.webSocketSubProtocol] :
protocolVersion === '2' ? [tunnelClientBase_1.webSocketSubProtocolv2] :
[tunnelClientBase_1.webSocketSubProtocolv2, tunnelClientBase_1.webSocketSubProtocol];
const connectionProtocols = protocolVersion === '1' ? [exports.webSocketSubProtocol] :
protocolVersion === '2' ? [exports.webSocketSubProtocolv2] :
[exports.webSocketSubProtocolv2, exports.webSocketSubProtocol];
/**
* Tunnel client implementation that connects via a tunnel relay.
*/
class TunnelRelayTunnelClient extends (0, tunnelRelaySessionClass_1.tunnelRelaySessionClass)(tunnelClientBase_1.TunnelClientBase, connectionProtocols) {
class TunnelRelayTunnelClient extends tunnelConnectionSession_1.TunnelConnectionSession {
constructor(trace, managementClient) {
super(trace, managementClient);
super(dev_tunnels_contracts_1.TunnelAccessScopes.Connect, connectionProtocols, trace, managementClient);
this.sshSessionClosedEmitter = new vscode_jsonrpc_1.Emitter();
this.acceptLocalConnectionsForForwardedPortsValue = (0, sshHelpers_1.isNode)();
this.localForwardingHostAddressValue = '127.0.0.1';
this.disconnectedStreams = new Map();
this.connectionModes = [];
/**
* Extensibility point and unit test hook.
* This event fires when the client SSH session is disconnected or closed either by this client or Relay.
*/
this.sshSessionClosed = this.sshSessionClosedEmitter.event;
}
get isSshSessionActive() {
var _a;
return !!((_a = this.sshSession) === null || _a === void 0 ? void 0 : _a.isConnected);
}
/**
* Get a value indicating if remote port is forwarded and has any channels open on the client,
* whether used by local tcp listener if {AcceptLocalConnectionsForForwardedPorts} is true, or
* streamed via <see cref="ConnectToForwardedPortAsync(int, CancellationToken)"/>.
*/
hasForwardedChannels(port) {
var _a;
if (!this.isSshSessionActive) {
return false;
}
const pfs = (_a = this.sshSession) === null || _a === void 0 ? void 0 : _a.activateService(dev_tunnels_ssh_tcp_1.PortForwardingService);
const remoteForwardedPorts = pfs === null || pfs === void 0 ? void 0 : pfs.remoteForwardedPorts;
const forwardedPort = remoteForwardedPorts === null || remoteForwardedPorts === void 0 ? void 0 : remoteForwardedPorts.find((p) => p.remotePort === port);
return !!forwardedPort && remoteForwardedPorts.getChannels(forwardedPort).length > 0;
}
/**
* A value indicating whether local connections for forwarded ports are accepted.
* Local connections are not accepted if the host is not NodeJS (e.g. browser).
*/
get acceptLocalConnectionsForForwardedPorts() {
return this.acceptLocalConnectionsForForwardedPortsValue;
}
set acceptLocalConnectionsForForwardedPorts(value) {
if (value === this.acceptLocalConnectionsForForwardedPortsValue) {
return;
}
if (value && !(0, sshHelpers_1.isNode)()) {
throw new Error('Cannot accept local connections for forwarded ports on this platform.');
}
this.acceptLocalConnectionsForForwardedPortsValue = value;
this.configurePortForwardingService();
}
/**
* Gets the local network interface address that the tunnel client listens on when
* accepting connections for forwarded ports.
*/
get localForwardingHostAddress() {
return this.localForwardingHostAddressValue;
}
set localForwardingHostAddress(value) {
if (value !== this.localForwardingHostAddressValue) {
this.localForwardingHostAddressValue = value;
this.configurePortForwardingService();
}
}
get forwardedPorts() {
var _a;
const pfs = (_a = this.sshSession) === null || _a === void 0 ? void 0 : _a.activateService(dev_tunnels_ssh_tcp_1.PortForwardingService);
return pfs === null || pfs === void 0 ? void 0 : pfs.remoteForwardedPorts;
}
async connect(tunnel, options, cancellation) {
this.hostId = options === null || options === void 0 ? void 0 : options.hostId;
await this.connectTunnelSession(tunnel, options, cancellation);
}
tunnelChanged() {
super.tunnelChanged();
if (!this.tunnel) {
this.relayUri = undefined;
}
else {
if (!this.endpoints || this.endpoints.length === 0) {
this.endpoints = undefined;
if (this.tunnel) {
if (!this.tunnel.endpoints) {
throw new Error('Tunnel endpoints cannot be null');
}
if (this.tunnel.endpoints.length === 0) {
throw new Error('No hosts are currently accepting connections for the tunnel.');
}
const endpointGroups = utils_1.List.groupBy(this.tunnel.endpoints, (ep) => ep.hostId);
if (this.hostId) {
this.endpoints = endpointGroups.get(this.hostId);
if (!this.endpoints) {
throw new Error('The specified host is not currently accepting connections to the tunnel.');
}
}
else if (endpointGroups.size > 1) {
throw new Error('There are multiple hosts for the tunnel. Specify a host ID to connect to.');
}
else {
this.endpoints = endpointGroups.entries().next().value[1];
}
const tunnelEndpoints = this.endpoints.filter((ep) => ep.connectionMode === dev_tunnels_contracts_1.TunnelConnectionMode.TunnelRelay);

@@ -43,13 +132,11 @@ if (tunnelEndpoints.length === 0) {

}
else {
this.relayUri = undefined;
}
}
/**
* Connect to the tunnel session on the relay service using the given access token for authorization.
*/
async connectClientToRelayServer(clientRelayUri, accessToken) {
if (!clientRelayUri) {
throw new Error('Client relay URI must be a non-empty string');
onRequest(e) {
if (e.request.requestType === dev_tunnels_ssh_tcp_1.PortForwardingService.portForwardRequestType ||
e.request.requestType === dev_tunnels_ssh_tcp_1.PortForwardingService.cancelPortForwardRequestType) {
e.isAuthorized = true;
}
this.relayUri = clientRelayUri;
this.accessToken = accessToken;
await this.connectTunnelSession();
}

@@ -69,6 +156,252 @@ /**

}
startSshSession(stream, cancellation) {
return this.connectSession(async () => {
this.sshSession = sshHelpers_1.SshHelpers.createSshClientSession((config) => {
// Enable port-forwarding via the SSH protocol.
config.addService(dev_tunnels_ssh_tcp_1.PortForwardingService);
if (this.connectionProtocol === exports.webSocketSubProtocol) {
// Enable client SSH session reconnect for V1 protocol only.
// (V2 SSH reconnect is handled by the SecureStream class.)
config.protocolExtensions.push(dev_tunnels_ssh_1.SshProtocolExtensionNames.sessionReconnect);
}
else {
// The V2 protocol configures optional encryption, including "none" as an enabled
// and preferred key-exchange algorithm, because encryption of the outer SSH
// session is optional since it is already over a TLS websocket.
config.keyExchangeAlgorithms.splice(0, 0, dev_tunnels_ssh_1.SshAlgorithms.keyExchange.none);
}
});
this.sshSession.trace = this.trace;
this.sshSession.onClosed(this.onSshSessionClosed, this, this.sshSessionDisposables);
this.sshSession.onAuthenticating(this.onSshServerAuthenticating, this, this.sshSessionDisposables);
this.sshSession.onDisconnected(this.onSshSessionDisconnected, this, this.sshSessionDisposables);
this.sshSession.onRequest(this.onRequest, this, this.sshSessionDisposables);
const pfs = this.sshSession.activateService(dev_tunnels_ssh_tcp_1.PortForwardingService);
if (this.connectionProtocol === exports.webSocketSubProtocolv2) {
pfs.messageFactory = this;
pfs.onForwardedPortConnecting(this.onForwardedPortConnecting, this, this.sshSessionDisposables);
pfs.remoteForwardedPorts.onPortAdded((e) => this.onForwardedPortAdded(pfs, e), this, this.sshSessionDisposables);
pfs.remoteForwardedPorts.onPortUpdated((e) => this.onForwardedPortAdded(pfs, e), this, this.sshSessionDisposables);
}
this.configurePortForwardingService();
await this.sshSession.connect(stream, cancellation);
// SSH authentication is required in V1 protocol, optional in V2 depending on
// whether the session enabled key exchange (as indicated by having a session ID
// or not).In either case a password is not required. Strong authentication was
// already handled by the relay service via the tunnel access token used for the
// websocket connection.
if (this.sshSession.sessionId) {
// Use a snapshot of this.sshSession because if authenticate() fails, it closes the session,
// and onSshSessionClosed() clears up this.sshSession.
const session = this.sshSession;
const clientCredentials = { username: 'tunnel' };
if (!await session.authenticate(clientCredentials, cancellation)) {
throw new Error(session.principal ?
'SSH client authentication failed.' :
'SSH server authentication failed.');
}
}
});
}
configurePortForwardingService() {
const pfs = this.getSshSessionPfs();
if (!pfs) {
return;
}
// Do not start forwarding local connections for browser client connections or if this is not allowed.
if (this.acceptLocalConnectionsForForwardedPortsValue && (0, sshHelpers_1.isNode)()) {
pfs.tcpListenerFactory = new retryTcpListenerFactory_1.RetryTcpListenerFactory(this.localForwardingHostAddressValue);
}
else {
pfs.acceptLocalConnectionsForForwardedPorts = false;
}
}
onForwardedPortAdded(pfs, e) {
var _a, _b;
const port = e.port.remotePort;
if (typeof port !== 'number') {
return;
}
// If there are disconnected streams for the port, re-connect them now.
const disconnectedStreamsCount = (_b = (_a = this.disconnectedStreams.get(port)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;
for (let i = 0; i < disconnectedStreamsCount; i++) {
pfs.connectToForwardedPort(port)
.then(() => {
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Reconnected stream to fowarded port ${port}`);
}).catch((error) => {
this.trace(dev_tunnels_ssh_1.TraceLevel.Warning, 0, `Failed to reconnect to forwarded port ${port}: ${error}`);
// The host is no longer accepting connections on the forwarded port?
// Clear the list of disconnected streams for the port, because
// it seems it is no longer possible to reconnect them.
const streams = this.disconnectedStreams.get(port);
if (streams) {
while (streams.length > 0) {
streams.pop().dispose();
}
}
});
}
}
/**
* Invoked when a forwarded port is connecting. (Only for V2 protocol.)
*/
onForwardedPortConnecting(e) {
// With V2 protocol, the relay server always sends an extended response message
// with a property indicating whether E2E encryption is enabled for the connection.
const channel = e.stream.channel;
const relayResponseMessage = channel.openConfirmationMessage
.convertTo(new portRelayConnectResponseMessage_1.PortRelayConnectResponseMessage());
if (relayResponseMessage.isE2EEncryptionEnabled) {
// The host trusts the relay to authenticate the client, so it doesn't require
// any additional password/token for client authentication.
const clientCredentials = { username: "tunnel" };
e.transformPromise = new Promise((resolve, reject) => {
var _a;
// If there's a disconnected SecureStream for the port, try to reconnect it.
// If there are multiple, pick one and the host will match by SSH session ID.
let secureStream = (_a = this.disconnectedStreams.get(e.port)) === null || _a === void 0 ? void 0 : _a.shift();
if (secureStream) {
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Reconnecting encrypted stream for port ${e.port}...`);
secureStream.reconnect(e.stream)
.then(() => {
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Reconnecting encrypted stream for port ${e.port} succeeded.`);
resolve(secureStream);
}).catch(reject);
}
else {
secureStream = new dev_tunnels_ssh_1.SecureStream(e.stream, clientCredentials);
secureStream.trace = this.trace;
secureStream.onAuthenticating((authEvent) => authEvent.authenticationPromise =
this.onHostAuthenticating(authEvent).catch());
secureStream.onDisconnected(() => this.onSecureStreamDisconnected(e.port, secureStream));
// Do not pass the cancellation token from the connecting event,
// because the connection will outlive the event.
secureStream.connect().then(() => resolve(secureStream)).catch(reject);
}
});
}
super.onForwardedPortConnecting(e);
}
onSecureStreamDisconnected(port, secureStream) {
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, `Encrypted stream for port ${port} disconnected.`);
const streams = this.disconnectedStreams.get(port);
if (streams) {
streams.push(secureStream);
}
else {
this.disconnectedStreams.set(port, [secureStream]);
}
}
async onHostAuthenticating(e) {
var _a, _b;
if (e.authenticationType !== dev_tunnels_ssh_1.SshAuthenticationType.serverPublicKey || !e.publicKey) {
this.traceWarning('Invalid host authenticating event.');
return null;
}
// The public key property on this event comes from SSH key-exchange; at this point the
// SSH server has cryptographically proven that it holds the corresponding private key.
// Convert host key bytes to base64 to match the format in which the keys are published.
const hostKey = (_b = (_a = (await e.publicKey.getPublicKeyBytes(e.publicKey.keyAlgorithmName))) === null || _a === void 0 ? void 0 : _a.toString('base64')) !== null && _b !== void 0 ? _b : '';
// Host public keys are obtained from the tunnel endpoint record published by the host.
if (!this.hostPublicKeys) {
this.traceWarning('Host identity could not be verified because ' +
'no public keys were provided.');
this.traceVerbose(`Host key: ${hostKey}`);
return {};
}
if (this.hostPublicKeys.includes(hostKey)) {
this.traceVerbose(`Verified host identity with public key ${hostKey}`);
return {};
}
// The tunnel host may have reconnected with a different host public key.
// Try fetching the tunnel again to refresh the key.
if (!this.disposeToken.isCancellationRequested &&
await this.refreshTunnel(false, this.disposeToken) &&
this.hostPublicKeys.includes(hostKey)) {
this.traceVerbose('Verified host identity with public key ' + hostKey);
return {};
}
this.traceError('Host public key verification failed.');
this.traceVerbose(`Host key: ${hostKey}`);
this.traceVerbose(`Expected key(s): ${this.hostPublicKeys.join(', ')}`);
return null;
}
onSshServerAuthenticating(e) {
if (this.connectionProtocol === exports.webSocketSubProtocol) {
// For V1 protocol the SSH server is the host; it should be authenticated with public key.
e.authenticationPromise = this.onHostAuthenticating(e);
}
else {
// For V2 protocol the SSH server is the relay.
// Relay server authentication is done via the websocket TLS host certificate.
// If SSH encryption/authentication is used anyway, just accept any SSH host key.
e.authenticationPromise = Promise.resolve({});
}
}
async connectToForwardedPort(fowardedPort, cancellation) {
const pfs = this.getSshSessionPfs();
if (!pfs) {
throw new Error('Failed to connect to remote port. Ensure that the client has connected by calling connectClient.');
}
return pfs.connectToForwardedPort(fowardedPort, cancellation);
}
async waitForForwardedPort(forwardedPort, cancellation) {
const pfs = this.getSshSessionPfs();
if (!pfs) {
throw new Error('Port forwarding has not been started. Ensure that the client has connected by calling connectClient.');
}
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, 'Waiting for forwarded port ' + forwardedPort);
await pfs.waitForForwardedPort(forwardedPort, cancellation);
this.trace(dev_tunnels_ssh_1.TraceLevel.Verbose, 0, 'Forwarded port ' + forwardedPort + ' is ready.');
}
getSshSessionPfs() {
var _a, _b;
return (_b = (_a = this.sshSession) === null || _a === void 0 ? void 0 : _a.getService(dev_tunnels_ssh_tcp_1.PortForwardingService)) !== null && _b !== void 0 ? _b : undefined;
}
async refreshPorts() {
if (!this.sshSession || this.sshSession.isClosed) {
throw new Error('Not connected.');
}
const request = new dev_tunnels_ssh_1.SessionRequestMessage();
request.requestType = 'RefreshPorts';
request.wantReply = true;
await this.sshSession.request(request);
}
/**
* @internal Closes the tunnel session due to an error.
*/
async closeSession(reason, error) {
if (this.isSshSessionActive) {
this.sshSessionClosedEmitter.fire(this);
}
await super.closeSession(reason, error);
}
/**
* SSH session closed event handler.
*/
onSshSessionClosed(e) {
this.sshSessionClosedEmitter.fire(this);
super.onSshSessionClosed(e);
}
onSshSessionDisconnected() {
this.sshSessionClosedEmitter.fire(this);
const reason = dev_tunnels_ssh_1.SshDisconnectReason.connectionLost;
const error = new dev_tunnels_ssh_1.SshConnectionError("Connection lost.", dev_tunnels_ssh_1.SshDisconnectReason.connectionLost);
this.maybeStartReconnecting(reason, undefined, error);
}
/**
* Connect to the tunnel session on the relay service using the given access token for authorization.
*/
async connectClientToRelayServer(clientRelayUri, accessToken) {
if (!clientRelayUri) {
throw new Error('Client relay URI must be a non-empty string');
}
this.relayUri = clientRelayUri;
this.accessToken = accessToken;
await this.connectTunnelSession();
}
}
exports.TunnelRelayTunnelClient = TunnelRelayTunnelClient;
TunnelRelayTunnelClient.webSocketSubProtocol = tunnelClientBase_1.webSocketSubProtocol;
TunnelRelayTunnelClient.webSocketSubProtocolv2 = tunnelClientBase_1.webSocketSubProtocolv2;
TunnelRelayTunnelClient.webSocketSubProtocol = exports.webSocketSubProtocol;
TunnelRelayTunnelClient.webSocketSubProtocolv2 = exports.webSocketSubProtocolv2;
//# sourceMappingURL=tunnelRelayTunnelClient.js.map

@@ -1,29 +0,9 @@

/// <reference types="node" />
import { TunnelPort, Tunnel } from '@microsoft/dev-tunnels-contracts';
import { TunnelManagementClient } from '@microsoft/dev-tunnels-management';
import { Trace, Stream } from '@microsoft/dev-tunnels-ssh';
import { ForwardedPortConnectingEventArgs } from '@microsoft/dev-tunnels-ssh-tcp';
import { KeyPair, Trace } from '@microsoft/dev-tunnels-ssh';
import { ForwardedPortConnectingEventArgs, PortForwardingService, RemotePortForwarder } from '@microsoft/dev-tunnels-ssh-tcp';
import { CancellationToken } from 'vscode-jsonrpc';
import { TunnelHostBase } from './tunnelHostBase';
declare const TunnelRelayTunnelHost_base: {
new (...args: any[]): {
relayUri?: string | undefined;
streamFactory: import("./tunnelRelayStreamFactory").TunnelRelayStreamFactory;
createSessionStream(options?: import("./tunnelConnectionOptions").TunnelConnectionOptions | undefined, cancellation?: CancellationToken | undefined): Promise<{
stream: Stream;
protocol: string;
}>;
connectTunnelSession(tunnel?: import("@microsoft/dev-tunnels-contracts").Tunnel | undefined, options?: import("./tunnelConnectionOptions").TunnelConnectionOptions | undefined, cancellation?: CancellationToken | undefined): Promise<void>;
tunnel: import("@microsoft/dev-tunnels-contracts").Tunnel | null;
trace: Trace;
tunnelAccessScope: string;
httpAgent?: import("http").Agent | undefined;
validateAccessToken(): string | undefined;
onRetrying(event: import("./retryingTunnelConnectionEventArgs").RetryingTunnelConnectionEventArgs): void;
onConnectingToTunnel(): Promise<void>;
connectSession(action: () => Promise<void>): Promise<void>;
configureSession(stream: Stream, protocol: string, isReconnect: boolean, cancellation?: CancellationToken | undefined): Promise<void>;
closeSession(error?: Error | undefined): Promise<void>;
refreshTunnelAccessToken(cancellation?: CancellationToken | undefined): Promise<boolean>;
};
} & typeof TunnelHostBase;
import { TunnelHost } from './tunnelHost';
import { TunnelConnectionOptions } from './tunnelConnectionOptions';
import { TunnelConnectionSession } from './tunnelConnectionSession';
/**

@@ -33,3 +13,3 @@ * Tunnel host implementation that uses data-plane relay

*/
export declare class TunnelRelayTunnelHost extends TunnelRelayTunnelHost_base {
export declare class TunnelRelayTunnelHost extends TunnelConnectionSession implements TunnelHost {
static readonly webSocketSubProtocol = "tunnel-relay-host";

@@ -45,4 +25,55 @@ static readonly webSocketSubProtocolv2 = "tunnel-relay-host-v2-dev";

private readonly reconnectableSessions;
/**
* Port Forwarders between host and clients
*/
readonly remoteForwarders: Map<string, RemotePortForwarder>;
/**
* Private key used for connections.
*/
hostPrivateKey?: KeyPair;
/**
* Public keys used for connections.
*/
hostPublicKeys?: string[];
/**
* Promise task to get private key used for connections.
*/
hostPrivateKeyPromise?: Promise<KeyPair>;
private loopbackIp;
private forwardConnectionsToLocalPortsValue;
/**
* Synthetic endpoint signature of the endpoint created when host connects.
* undefined if the endpoint has not been created yet.
*/
private endpointSignature?;
constructor(managementClient: TunnelManagementClient, trace?: Trace);
onConnectingToTunnel(): Promise<void>;
/**
* A value indicating whether the port-forwarding service forwards connections to local TCP sockets.
* Forwarded connections are not possible if the host is not NodeJS (e.g. browser).
* The default value for NodeJS hosts is true.
*/
get forwardConnectionsToLocalPorts(): boolean;
set forwardConnectionsToLocalPorts(value: boolean);
/**
* Connects to a tunnel as a host and starts accepting incoming connections
* to local ports as defined on the tunnel.
* @deprecated Use `connect()` instead.
*/
start(tunnel: Tunnel): Promise<void>;
/**
* Connects to a tunnel as a host and starts accepting incoming connections
* to local ports as defined on the tunnel.
*/
connect(tunnel: Tunnel, options?: TunnelConnectionOptions, cancellation?: CancellationToken): Promise<void>;
/**
* Connect to the tunnel session with the tunnel connector.
* @param tunnel Tunnel to use for the connection.
* Undefined if the connection information is already known and the tunnel is not needed.
* Tunnel object to get the connection information from that tunnel.
*/
connectTunnelSession(tunnel?: Tunnel, options?: TunnelConnectionOptions, cancellation?: CancellationToken): Promise<void>;
/**
* Disposes this tunnel session, closing all client connections, the host SSH session, and deleting the endpoint.
*/
dispose(): Promise<void>;
private hostSession_ChannelOpening;

@@ -62,10 +93,5 @@ protected onForwardedPortConnecting(e: ForwardedPortConnectingEventArgs): void;

private session_Closed;
private hostSession_Closed;
refreshPorts(cancellation?: CancellationToken): Promise<void>;
/**
* Disposes this tunnel session, closing all client connections, the host SSH session, and deleting the endpoint.
*/
dispose(): Promise<void>;
protected forwardPort(pfs: PortForwardingService, port: TunnelPort): Promise<void>;
}
export {};
//# sourceMappingURL=tunnelRelayTunnelHost.d.ts.map

@@ -11,4 +11,2 @@ "use strict";

const multiModeTunnelHost_1 = require("./multiModeTunnelHost");
const tunnelHostBase_1 = require("./tunnelHostBase");
const tunnelRelaySessionClass_1 = require("./tunnelRelaySessionClass");
const sessionPortKey_1 = require("./sessionPortKey");

@@ -18,2 +16,4 @@ const portRelayConnectRequestMessage_1 = require("./messages/portRelayConnectRequestMessage");

const uuid_1 = require("uuid");
const sshHelpers_2 = require("./sshHelpers");
const tunnelConnectionSession_1 = require("./tunnelConnectionSession");
const webSocketSubProtocol = 'tunnel-relay-host';

@@ -31,7 +31,22 @@ const webSocketSubProtocolv2 = 'tunnel-relay-host-v2-dev';

*/
class TunnelRelayTunnelHost extends (0, tunnelRelaySessionClass_1.tunnelRelaySessionClass)(tunnelHostBase_1.TunnelHostBase, connectionProtocols) {
class TunnelRelayTunnelHost extends tunnelConnectionSession_1.TunnelConnectionSession {
constructor(managementClient, trace) {
super(managementClient, trace);
super(dev_tunnels_contracts_1.TunnelAccessScopes.Host, connectionProtocols, trace, managementClient);
this.clientSessionPromises = [];
this.reconnectableSessions = [];
/**
* Sessions created between this host and clients
* @internal
*/
this.sshSessions = [];
/**
* Port Forwarders between host and clients
*/
this.remoteForwarders = new Map();
this.loopbackIp = '127.0.0.1';
this.forwardConnectionsToLocalPortsValue = (0, sshHelpers_2.isNode)();
const publicKey = dev_tunnels_ssh_1.SshAlgorithms.publicKey.ecdsaSha2Nistp384;
if (publicKey) {
this.hostPrivateKeyPromise = publicKey.generateKeyPair();
}
this.hostId = multiModeTunnelHost_1.MultiModeTunnelHost.hostId;

@@ -41,2 +56,51 @@ this.id = (0, uuid_1.v4)() + "-relay";

/**
* A value indicating whether the port-forwarding service forwards connections to local TCP sockets.
* Forwarded connections are not possible if the host is not NodeJS (e.g. browser).
* The default value for NodeJS hosts is true.
*/
get forwardConnectionsToLocalPorts() {
return this.forwardConnectionsToLocalPortsValue;
}
set forwardConnectionsToLocalPorts(value) {
if (value === this.forwardConnectionsToLocalPortsValue) {
return;
}
if (value && !(0, sshHelpers_2.isNode)()) {
throw new Error('Cannot forward connections to local TCP sockets on this platform.');
}
this.forwardConnectionsToLocalPortsValue = value;
}
/**
* Connects to a tunnel as a host and starts accepting incoming connections
* to local ports as defined on the tunnel.
* @deprecated Use `connect()` instead.
*/
async start(tunnel) {
await this.connect(tunnel);
}
/**
* Connects to a tunnel as a host and starts accepting incoming connections
* to local ports as defined on the tunnel.
*/
async connect(tunnel, options, cancellation) {
await this.connectTunnelSession(tunnel, options, cancellation);
}
/**
* Connect to the tunnel session with the tunnel connector.
* @param tunnel Tunnel to use for the connection.
* Undefined if the connection information is already known and the tunnel is not needed.
* Tunnel object to get the connection information from that tunnel.
*/
async connectTunnelSession(tunnel, options, cancellation) {
if (this.disconnectReason === dev_tunnels_ssh_1.SshDisconnectReason.tooManyConnections) {
// If another host for the same tunnel connects, the first connection is disconnected
// with "too many connections" reason. Reconnecting it again would cause the second host to
// be kicked out, and then it would try to reconnect, kicking out this one.
// To prevent this tug of war, do not allow reconnection in this case.
throw new dev_tunnels_ssh_1.SshConnectionError('Cannot retry connection because another host for this tunnel has connected. ' +
'Only one host connection at a time is supported.', dev_tunnels_ssh_1.SshDisconnectReason.tooManyConnections);
}
await super.connectTunnelSession(tunnel, options, cancellation);
}
/**
* Configures the tunnel session with the given stream.

@@ -47,9 +111,10 @@ * @internal

this.connectionProtocol = protocol;
let session;
if (this.connectionProtocol === webSocketSubProtocol) {
// The V1 protocol always configures no security, equivalent to SSH MultiChannelStream.
// The websocket transport is still encrypted and authenticated.
this.sshSession = new dev_tunnels_ssh_1.SshClientSession(new dev_tunnels_ssh_1.SshSessionConfiguration(false)); // no encryption
session = new dev_tunnels_ssh_1.SshClientSession(new dev_tunnels_ssh_1.SshSessionConfiguration(false)); // no encryption
}
else {
this.sshSession = sshHelpers_1.SshHelpers.createSshClientSession((config) => {
session = sshHelpers_1.SshHelpers.createSshClientSession((config) => {
// The V2 protocol configures optional encryption, including "none" as an enabled

@@ -61,14 +126,11 @@ // and preferred key-exchange algorithm, because encryption of the outer SSH

});
const hostPfs = this.sshSession.activateService(dev_tunnels_ssh_tcp_1.PortForwardingService);
const hostPfs = session.activateService(dev_tunnels_ssh_tcp_1.PortForwardingService);
hostPfs.messageFactory = this;
hostPfs.onForwardedPortConnecting((e) => this.onForwardedPortConnecting(e));
hostPfs.onForwardedPortConnecting(this.onForwardedPortConnecting, this, this.sshSessionDisposables);
}
const channelOpenEventRegistration = this.sshSession.onChannelOpening((e) => {
this.hostSession_ChannelOpening(this.sshSession, e);
});
const closeEventRegistration = this.sshSession.onClosed((e) => {
this.hostSession_Closed(e, channelOpenEventRegistration, closeEventRegistration);
});
this.sshSession.trace = this.trace;
await this.sshSession.connect(stream, cancellation);
session.onChannelOpening(this.hostSession_ChannelOpening, this, this.sshSessionDisposables);
session.onClosed(this.onSshSessionClosed, this, this.sshSessionDisposables);
session.trace = this.trace;
this.sshSession = session;
await session.connect(stream, cancellation);
// SSH authentication is skipped in V1 protocol, optional in V2 depending on whether the

@@ -78,4 +140,4 @@ // session performed a key exchange (as indicated by having a session ID or not). In the

// the relay service via the tunnel access token used for the websocket connection.
if (this.sshSession.sessionId) {
await this.sshSession.authenticate({ username: 'tunnel' });
if (session.sessionId) {
await session.authenticate({ username: 'tunnel' });
}

@@ -85,8 +147,28 @@ if (this.connectionProtocol === webSocketSubProtocolv2) {

// Then the relay will forward the forwarded ports to clients as they connect.
await this.startForwardingExistingPorts(this.sshSession);
await this.startForwardingExistingPorts(session);
}
}
/**
* Validate the {@link tunnel} and get data needed to connect to it, if the tunnel is provided;
* otherwise, ensure that there is already sufficient data to connect to a tunnel.
* @internal
*/
async onConnectingToTunnel() {
await super.onConnectingToTunnel();
if (!this.relayUri) {
var _a, _b, _c, _d, _e;
if (!this.hostPrivateKey || !this.hostPublicKeys) {
if (!this.hostPrivateKeyPromise) {
throw new Error('Cannot create host keys');
}
this.hostPrivateKey = await this.hostPrivateKeyPromise;
const buffer = await this.hostPrivateKey.getPublicKeyBytes(this.hostPrivateKey.keyAlgorithmName);
if (!buffer) {
throw new Error('Host private key public key bytes is not initialized');
}
this.hostPublicKeys = [buffer.toString('base64')];
}
const tunnelHasSshPort = ((_a = this.tunnel) === null || _a === void 0 ? void 0 : _a.ports) != null && this.tunnel.ports.find((v) => v.protocol === dev_tunnels_contracts_1.TunnelProtocol.Ssh);
const endpointSignature = `${(_b = this.tunnel) === null || _b === void 0 ? void 0 : _b.tunnelId}.${(_c = this.tunnel) === null || _c === void 0 ? void 0 : _c.clusterId}:` +
`${(_d = this.tunnel) === null || _d === void 0 ? void 0 : _d.name}.${(_e = this.tunnel) === null || _e === void 0 ? void 0 : _e.domain}:` +
`${tunnelHasSshPort}:${this.hostId}:${this.hostPublicKeys}`;
if (!this.relayUri || this.endpointSignature !== endpointSignature) {
if (!this.tunnel) {

@@ -102,3 +184,3 @@ throw new Error('Tunnel is required');

let additionalQueryParameters = undefined;
if (this.tunnel.ports != null && this.tunnel.ports.find((v) => v.protocol === dev_tunnels_contracts_1.TunnelProtocol.Ssh)) {
if (tunnelHasSshPort) {
additionalQueryParameters = { includeSshGatewayPublicKey: 'true' };

@@ -110,5 +192,30 @@ }

this.relayUri = endpoint.hostRelayUri;
this.endpointSignature = endpointSignature;
}
}
hostSession_ChannelOpening(sender, e) {
/**
* Disposes this tunnel session, closing all client connections, the host SSH session, and deleting the endpoint.
*/
async dispose() {
await super.dispose();
const promises = Object.assign([], this.clientSessionPromises);
// No new client session should be added because the channel requests are rejected when the tunnel host is disposed.
this.clientSessionPromises.length = 0;
// If the tunnel is present, the endpoint was created, and this host was not closed because of
// too many connections, delete the endpoint.
// Too many connections closure means another host has connected, and that other host, while
// connecting, would have updated the endpoint. So this host won't be able to delete it anyway.
if (this.tunnel &&
this.endpointSignature &&
this.disconnectReason !== dev_tunnels_ssh_1.SshDisconnectReason.tooManyConnections) {
const promise = this.managementClient.deleteTunnelEndpoints(this.tunnel, this.id);
promises.push(promise);
}
for (const forwarder of this.remoteForwarders.values()) {
forwarder.dispose();
}
// When client session promises finish, they remove the sessions from this.sshSessions
await Promise.all(promises);
}
hostSession_ChannelOpening(e) {
if (!e.isRemoteRequest) {

@@ -337,17 +444,7 @@ // Auto approve all local requests (not that there are any for the time being).

}
hostSession_Closed(e, channelOpenEventRegistration, closeEventRegistration) {
closeEventRegistration.dispose();
channelOpenEventRegistration.dispose();
this.sshSession = undefined;
this.traceInfo(`Connection to host tunnel relay closed.${this.isDisposed ? '' : ' Reconnecting.'}`);
if (e.reason === dev_tunnels_ssh_1.SshDisconnectReason.connectionLost) {
this.startReconnectingIfNotDisposed();
}
}
async refreshPorts(cancellation) {
var _a, _b;
if (!this.canRefreshTunnel) {
if (!await this.refreshTunnel(true, cancellation)) {
return;
}
await this.refreshTunnel(cancellation);
const ports = (_b = (_a = this.tunnel) === null || _a === void 0 ? void 0 : _a.ports) !== null && _b !== void 0 ? _b : [];

@@ -379,19 +476,17 @@ let sessions = this.sshSessions;

}
/**
* Disposes this tunnel session, closing all client connections, the host SSH session, and deleting the endpoint.
*/
async dispose() {
await super.dispose();
const promises = Object.assign([], this.clientSessionPromises);
// No new client session should be added because the channel requests are rejected when the tunnel host is disposed.
this.clientSessionPromises.length = 0;
if (this.tunnel) {
const promise = this.managementClient.deleteTunnelEndpoints(this.tunnel, this.id);
promises.push(promise);
async forwardPort(pfs, port) {
const portNumber = Number(port.portNumber);
if (pfs.localForwardedPorts.find((p) => p.localPort === portNumber)) {
// The port is already forwarded. This may happen if we try to add the same port twice after reconnection.
return;
}
for (const forwarder of this.remoteForwarders.values()) {
forwarder.dispose();
// When forwarding from a Remote port we assume that the RemotePortNumber
// and requested LocalPortNumber are the same.
const forwarder = await pfs.forwardFromRemotePort(this.loopbackIp, portNumber, 'localhost', portNumber);
if (!forwarder) {
// The forwarding request was rejected by the client.
return;
}
// When client session promises finish, they remove the sessions from this.sshSessions
await Promise.all(promises);
const key = new sessionPortKey_1.SessionPortKey(pfs.session.sessionId, Number(forwarder.localPort));
this.remoteForwarders.set(key.toString(), forwarder);
}

@@ -398,0 +493,0 @@ }

/// <reference types="node" />
import { Event } from 'vscode-jsonrpc';
import { Tunnel } from '@microsoft/dev-tunnels-contracts';
import { Stream, Trace, CancellationToken } from '@microsoft/dev-tunnels-ssh';
import { Trace, CancellationToken, SshDisconnectReason } from '@microsoft/dev-tunnels-ssh';
import { RetryingTunnelConnectionEventArgs } from './retryingTunnelConnectionEventArgs';
import { TunnelConnectionOptions } from './tunnelConnectionOptions';
import * as http from 'http';
import { RefreshingTunnelEventArgs } from './refreshingTunnelEventArgs';
import { TunnelConnection } from './tunnelConnection';
/**
* Tunnel session.
*/
export interface TunnelSession {
export interface TunnelSession extends TunnelConnection {
/**

@@ -28,2 +31,10 @@ * Gets the tunnel.

/**
* Gets the disconnection reason.
* {@link SshDisconnectReason.none} or undefined if not yet disconnected.
* {@link SshDisconnectReason.connectionLost} if network connection was lost and reconnects are not enabled or unsuccesfull.
* {@link SshDisconnectReason.byApplication} if connection was disposed.
* {@link SshDisconnectReason.tooManyConnections} if host connection was disconnected because another host connected for the same tunnel.
*/
readonly disconnectReason: SshDisconnectReason | undefined;
/**
* Validates tunnel access token if it's present. Returns the token.

@@ -42,6 +53,2 @@ */

/**
* Connect to the tunnel session by running the provided {@link action}.
*/
connectSession(action: () => Promise<void>): Promise<void>;
/**
* Connect to the tunnel session with the tunnel connector.

@@ -54,21 +61,6 @@ * @param tunnel Tunnel to use for the connection.

/**
* Creates a stream to the tunnel for the tunnel session.
* An event which fires when tunnel connection refreshes tunnel.
*/
createSessionStream(options?: TunnelConnectionOptions, cancellation?: CancellationToken): Promise<{
stream: Stream;
protocol: string;
}>;
/**
* Configures the tunnel session with the given stream.
*/
configureSession(stream: Stream, protocol: string, isReconnect: boolean, cancellation?: CancellationToken): Promise<void>;
/**
* Closes the tunnel session.
*/
closeSession(error?: Error): Promise<void>;
/**
* Refreshes the tunnel access token. This may be useful when the tunnel service responds with 401 Unauthorized.
*/
refreshTunnelAccessToken(cancellation?: CancellationToken): Promise<boolean>;
readonly refreshingTunnel: Event<RefreshingTunnelEventArgs>;
}
//# sourceMappingURL=tunnelSession.d.ts.map
import { CancellationToken } from '@microsoft/dev-tunnels-ssh';
import { Emitter } from 'vscode-jsonrpc';
export declare class List {

@@ -23,2 +24,13 @@ static groupBy<T, K>(list: {

export declare function withCancellation<T>(promise: Promise<T>, cancellation?: CancellationToken): Promise<T>;
/**
* Tracking event emitter.
*/
export declare class TrackingEmitter<T> extends Emitter<T> {
private subscribed;
constructor();
/**
* A value indicating whether there event handlers subscribed to the event emitter.
*/
get isSubscribed(): boolean;
}
//# sourceMappingURL=utils.d.ts.map

@@ -5,4 +5,5 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.withCancellation = exports.getError = exports.getErrorMessage = exports.delay = exports.List = void 0;
exports.TrackingEmitter = exports.withCancellation = exports.getError = exports.getErrorMessage = exports.delay = exports.List = void 0;
const dev_tunnels_ssh_1 = require("@microsoft/dev-tunnels-ssh");
const vscode_jsonrpc_1 = require("vscode-jsonrpc");
class List {

@@ -89,2 +90,21 @@ static groupBy(list, keyGetter) {

exports.withCancellation = withCancellation;
/**
* Tracking event emitter.
*/
class TrackingEmitter extends vscode_jsonrpc_1.Emitter {
constructor() {
super({
onFirstListenerAdd: () => this.subscribed = true,
onLastListenerRemove: () => this.subscribed = false,
});
this.subscribed = false;
}
/**
* A value indicating whether there event handlers subscribed to the event emitter.
*/
get isSubscribed() {
return this.subscribed;
}
}
exports.TrackingEmitter = TrackingEmitter;
//# sourceMappingURL=utils.js.map

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc