Setting for restoring forwarded ports

Part of #81388
This commit is contained in:
Alex Ross 2019-12-18 15:09:47 +01:00
parent 65bdd32da1
commit 369fa90ac4
2 changed files with 36 additions and 3 deletions

View file

@ -401,6 +401,11 @@ Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration)
type: 'boolean',
markdownDescription: nls.localize('remote.downloadExtensionsLocally', "When enabled extensions are downloaded locally and installed on remote."),
default: false
},
'remote.restoreForwardedPorts': {
type: 'boolean',
markdownDescription: nls.localize('remote.restoreForwardedPorts', "Restores the ports you forwarded in a workspace."),
default: false
}
}
});

View file

@ -13,9 +13,11 @@ import { ExtensionsRegistry, IExtensionPointUser } from 'vs/workbench/services/e
import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel';
import { Disposable } from 'vs/base/common/lifecycle';
import { IEditableData } from 'vs/workbench/common/views';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
export const IRemoteExplorerService = createDecorator<IRemoteExplorerService>('remoteExplorerService');
export const REMOTE_EXPLORER_TYPE_KEY: string = 'remote.explorerType';
const TUNNELS_TO_RESTORE = 'remote.tunnels.toRestore';
export interface Tunnel {
remoteHost: string;
@ -46,7 +48,9 @@ export class TunnelModel extends Disposable {
private _candidateFinder: (() => Promise<{ host: string, port: number, detail: string }[]>) | undefined;
constructor(
@ITunnelService private readonly tunnelService: ITunnelService
@ITunnelService private readonly tunnelService: ITunnelService,
@IStorageService private readonly storageService: IStorageService,
@IConfigurationService private readonly configurationService: IConfigurationService
) {
super();
this.forwarded = new Map();
@ -74,6 +78,7 @@ export class TunnelModel extends Disposable {
localPort: tunnel.tunnelLocalPort,
closeable: true
});
this.storeForwarded();
}
this._onForwardPort.fire(this.forwarded.get(key)!);
}));
@ -81,9 +86,29 @@ export class TunnelModel extends Disposable {
const key = MakeAddress(address.host, address.port);
if (this.forwarded.has(key)) {
this.forwarded.delete(key);
this.storeForwarded();
this._onClosePort.fire(address);
}
}));
this.restoreForwarded();
}
private async restoreForwarded() {
if (this.configurationService.getValue('remote.restoreForwardedPorts')) {
const tunnelsString = this.storageService.get(TUNNELS_TO_RESTORE, StorageScope.WORKSPACE);
if (tunnelsString) {
(<Tunnel[] | undefined>JSON.parse(tunnelsString))?.forEach(tunnel => {
this.forward({ host: tunnel.remoteHost, port: tunnel.remotePort }, tunnel.localPort, tunnel.name);
});
}
}
}
private storeForwarded() {
if (this.configurationService.getValue('remote.restoreForwardedPorts')) {
this.storageService.store(TUNNELS_TO_RESTORE, JSON.stringify(Array.from(this.forwarded.values())), StorageScope.WORKSPACE);
}
}
async forward(remote: { host: string, port: number }, local?: number, name?: string): Promise<RemoteTunnel | void> {
@ -110,6 +135,7 @@ export class TunnelModel extends Disposable {
const key = MakeAddress(host, port);
if (this.forwarded.has(key)) {
this.forwarded.get(key)!.name = name;
this.storeForwarded();
this._onPortName.fire({ host, port });
} else if (this.detected.has(key)) {
this.detected.get(key)!.name = name;
@ -212,8 +238,10 @@ class RemoteExplorerService implements IRemoteExplorerService {
constructor(
@IStorageService private readonly storageService: IStorageService,
@ITunnelService tunnelService: ITunnelService) {
this._tunnelModel = new TunnelModel(tunnelService);
@ITunnelService tunnelService: ITunnelService,
@IConfigurationService configurationService: IConfigurationService
) {
this._tunnelModel = new TunnelModel(tunnelService, storageService, configurationService);
remoteHelpExtPoint.setHandler((extensions) => {
let helpInformation: HelpInformation[] = [];
for (let extension of extensions) {