@microsoft/dev-tunnels-ssh
Version:
SSH library for Dev Tunnels
93 lines • 3.63 kB
JavaScript
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
Object.defineProperty(exports, "__esModule", { value: true });
exports.SshVersionInfo = void 0;
const packageJson = require("./package.json");
const packageName = packageJson.name.replace(/^@\w+\//, ''); // Strip scope from name.
const packageVersion = packageJson.version;
/**
* Parses the SSH software name and version from the version string exchanged via the
* initial packets sent between client and server.
*/
class SshVersionInfo {
/**
* Attempts to parse an SSH version string into a version info object.
*/
static tryParse(versionString) {
if (!versionString) {
throw new TypeError('Version string expected.');
}
if (!versionString.startsWith('SSH-')) {
return null;
}
const firstDashIndex = 3;
const secondDashIndex = versionString.indexOf('-', firstDashIndex + 1);
if (secondDashIndex <= 0) {
return null;
}
const protocolVersion = versionString.substring(firstDashIndex + 1, secondDashIndex);
if (!/^\d+\.\d+$/.test(protocolVersion)) {
return null;
}
let name;
let version;
const nameAndVersion = versionString.substring(secondDashIndex + 1);
const spaceIndex = nameAndVersion.indexOf(' ');
const lastUnderscoreBeforeSpace = nameAndVersion.lastIndexOf('_', spaceIndex >= 0 ? spaceIndex : nameAndVersion.length - 1);
if (lastUnderscoreBeforeSpace >= 0) {
name = nameAndVersion.substring(0, lastUnderscoreBeforeSpace).replace(/_/g, ' ');
// Ignore any non-digit characters after the version.
version = nameAndVersion.substring(lastUnderscoreBeforeSpace + 1);
for (let i = 0; i < version.length; i++) {
const c = version[i];
if (!(c >= '0' && c <= '9') && c !== '.') {
version = version.substring(0, i);
break;
}
}
if (!/^\d+(\.\d+)*$/.test(version)) {
version = null;
}
}
else {
name = nameAndVersion;
version = null;
}
return new SshVersionInfo(versionString, protocolVersion, name, version);
}
/**
* Gets the version info for the current SSH library.
*/
static getLocalVersion() {
const protocolVersion = '2.0';
const versionString = `SSH-${protocolVersion}-${packageName}_${packageVersion}`;
return new SshVersionInfo(versionString, protocolVersion, packageName, packageVersion);
}
constructor(versionString, protocolVersion, name, version) {
this.versionString = versionString;
this.protocolVersion = protocolVersion;
this.name = name;
this.version = version;
}
/** Returns the original SSH version string that was parsed. */
toString() {
return this.versionString;
}
/**
* Gets a value indicating whether this version info represents some version of
* this library.
*/
get isVsSsh() {
return this.isVsSshCS || this.isVsSshTS;
}
get isVsSshCS() {
return this.name === 'Microsoft.VisualStudio.Ssh' || this.name === 'Microsoft.DevTunnels.Ssh';
}
get isVsSshTS() {
return this.name === 'vs-ssh' || this.name === 'dev-tunnels-ssh';
}
}
exports.SshVersionInfo = SshVersionInfo;
//# sourceMappingURL=sshVersionInfo.js.map
;