UNPKG

@microsoft/dev-tunnels-ssh

Version:

SSH library for Dev Tunnels

97 lines 4.42 kB
"use strict"; // // Copyright (c) Microsoft Corporation. All rights reserved. // Object.defineProperty(exports, "__esModule", { value: true }); exports.SshService = void 0; const vscode_jsonrpc_1 = require("vscode-jsonrpc"); const sshSession_1 = require("../sshSession"); /** * Base class for SSH session services that handle incoming requests. * * Services can be on either the server side or the client side, because either side may * send requests to the other's services. * * Service subclasses must have one or more `serviceActivation` decorators applied to them to * declare the type(s) of requests that cause the service to be activated. Only one instance * of each service type gets activated for a session, even if there are multiple activation * rules. After activation, a service remains active for the duration of the session, * handling any additional requests, until it is disposed when the session is disposed. * * To enable activation of a service, add the service type to * `SshSessionConfiguration.services`. When a service is activated, the session raises a * `SshSession.serviceActivated` event. */ class SshService { constructor(session) { this.session = session; this.disposed = false; this.disposedEmitter = new vscode_jsonrpc_1.Emitter(); this.onDisposed = this.disposedEmitter.event; if (!(session instanceof sshSession_1.SshSession)) { // Other packages provide services that inherit from SshService. When they do, they // reference the SshSession type from a specific version of this package. But at runtime, // the service may be activated with a session from a different version of this package, // if there are multiple instances due to version mismatches. Multiple instances of SSH // types causes problems, so it's best to detect the error at initialization time. throw new TypeError('Session is not an instance of SshSession. ' + '(This may be due to a version mismatch between SSH packages.)'); } } get trace() { return this.session.trace; } raiseReportProgress(progress) { this.session.raiseReportProgress(progress); } dispose() { if (this.disposed) return; this.disposed = true; this.disposedEmitter.fire(); } /** * Services that are activated via session requests must override this method to handle * incoming session requests. * * Implementations must set `SshRequestEventArgs.isAuthorized` or * `SshRequestEventArgs.responsePromise` to indicate whether the request was allowed. */ async onSessionRequest(request, cancellation) { this.session.raiseSessionRequest(request); } /** * Services that are activated via channel types must override this method to handle * incoming requests to open a channel. * * Implementations may set `SshChannelOpeningEventArgs.failureReason` or * `SshChannelOpeningEventArgs.openingPromise` to block opening of the channel. * The default behavior allows the channel to open. * * Requests on the opened channel will not be directed to `onChannelRequest` * unless the service also declares activation on specific channel request(s). Otherwise, * an implementation of this method may add any event-handlers to the * `SshChannelOpeningEventArgs.channel` including a request event handler. */ async onChannelOpening(request, cancellation) { if (!request) throw new TypeError('Request is required.'); return this.session.handleChannelOpening(request, cancellation, false); } /** * Services that are activated via channel requests must override this method to handle * incoming channel requests. * * Implementations must set `SshRequestEventArgs.isAuthorized` or * `SshRequestEventArgs.responsePromise` to indicate whether the request was allowed. */ async onChannelRequest(channel, request, cancellation) { } /** * Sends any message. */ async sendMessage(message, cancellation) { await this.session.sendMessage(message, cancellation); } } exports.SshService = SshService; //# sourceMappingURL=sshService.js.map