@microsoft/dev-tunnels-ssh-tcp
Version:
SSH TCP extensions library for Dev Tunnels
68 lines • 2.77 kB
JavaScript
;
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
Object.defineProperty(exports, "__esModule", { value: true });
exports.RemotePortConnector = void 0;
const dev_tunnels_ssh_1 = require("@microsoft/dev-tunnels-ssh");
const portForwardRequestMessage_1 = require("../messages/portForwardRequestMessage");
const portForwardSuccessMessage_1 = require("../messages/portForwardSuccessMessage");
const portForwardingService_1 = require("./portForwardingService");
/**
* Base class for services that receive SSH channels forwarded from a remote port.
*/
class RemotePortConnector extends dev_tunnels_ssh_1.SshService {
/* @internal */
constructor(session, remoteIPAddress, remotePort) {
super(session);
this.forwarding = false;
this.remoteIPAddress = remoteIPAddress;
this.port = remotePort;
}
/**
* Port that the remote server is listening on. If the request specified port 0, this
* property returns the actual available port that was chosen by the server.
*/
get remotePort() {
return this.port;
}
/* @internal */
async request(request, cancellation) {
if (this.forwarding) {
throw new Error('Already forwarding.');
}
request.addressToBind = this.remoteIPAddress;
request.port = this.remotePort;
request.wantReply = true;
const response = await this.session.requestResponse(request, portForwardSuccessMessage_1.PortForwardSuccessMessage, dev_tunnels_ssh_1.SessionRequestFailureMessage, cancellation);
let result = false;
if (response instanceof portForwardSuccessMessage_1.PortForwardSuccessMessage) {
if (response.port !== 0) {
this.port = response.port;
}
result = true;
}
this.forwarding = result;
return result;
}
dispose() {
if (this.forwarding) {
this.forwarding = false;
const request = new portForwardRequestMessage_1.PortForwardRequestMessage();
request.requestType = portForwardingService_1.PortForwardingService.cancelPortForwardRequestType;
request.addressToBind = this.remoteIPAddress;
request.port = this.remotePort;
request.wantReply = false;
try {
this.session.request(request).catch((e) => {
// Ignore async cancel failure.
// Error details have already been trace.
});
}
catch (e) { }
}
super.dispose();
}
}
exports.RemotePortConnector = RemotePortConnector;
//# sourceMappingURL=remotePortConnector.js.map