Path: blob/main/src/vs/sessions/contrib/chat/browser/openInVSCodeUtils.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IRemoteAgentHostService, IRemoteAgentHostSSHConnection, RemoteAgentHostEntryType } from '../../../../platform/agentHost/common/remoteAgentHostService.js';6import { ISessionsProvidersService } from '../../../services/sessions/browser/sessionsProvidersService.js';7import { isAgentHostProvider } from '../../../common/agentHostSessionsProvider.js';8import { encodeHex, VSBuffer } from '../../../../base/common/buffer.js';910/**11* Resolves the VS Code remote authority for the given session provider,12* e.g. `ssh-remote+myhost` or `tunnel+myTunnel`.13*14* Returns `undefined` for local or WebSocket-only providers where no15* VS Code remote extension can handle the connection.16*/17export function resolveRemoteAuthority(18providerId: string,19sessionsProvidersService: ISessionsProvidersService,20remoteAgentHostService: IRemoteAgentHostService,21): string | undefined {22const provider = sessionsProvidersService.getProvider(providerId);23if (!provider || !isAgentHostProvider(provider) || !provider.remoteAddress) {24return undefined;25}2627const entry = remoteAgentHostService.getEntryByAddress(provider.remoteAddress);28if (!entry) {29return undefined;30}3132switch (entry.connection.type) {33case RemoteAgentHostEntryType.SSH:34if (entry.connection.sshConfigHost) {35return `ssh-remote+${entry.connection.sshConfigHost}`;36}37return `ssh-remote+${sshAuthorityString(entry.connection)}`;38case RemoteAgentHostEntryType.Tunnel:39return `tunnel+${entry.connection.label ?? `${entry.connection.tunnelId}.${entry.connection.clusterId}`}`;40default:41return undefined;42}43}4445/**46* Encodes an SSH connection into the authority string format expected by47* the Remote SSH extension.48*/49export function sshAuthorityString(connection: IRemoteAgentHostSSHConnection): string {50const hostName = connection.hostName;51const needsEncoding = connection.user || connection.port52|| /[A-Z/\\+]/.test(hostName) || !/^[a-zA-Z0-9.:\-]+$/.test(hostName);53if (!needsEncoding) {54return hostName;55}5657const obj: Record<string, string | number> = { hostName };58if (connection.user) {59obj.user = connection.user;60}61if (connection.port) {62obj.port = connection.port;63}6465const json = JSON.stringify(obj);66return encodeHex(VSBuffer.fromString(json));67}686970