Skip to content

Commit ac314ec

Browse files
committed
Fix sequencing in tunnel service
Fixes microsoft#100822
1 parent ae6e90c commit ac314ec

5 files changed

Lines changed: 24 additions & 22 deletions

File tree

src/vs/platform/remote/common/tunnel.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { IDisposable } from 'vs/base/common/lifecycle';
88
import { URI } from 'vs/base/common/uri';
99
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
1010
import { ILogService } from 'vs/platform/log/common/log';
11-
import { IAddress } from 'vs/platform/remote/common/remoteAgentConnection';
11+
import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection';
1212

1313
export const ITunnelService = createDecorator<ITunnelService>('tunnelService');
1414

@@ -37,7 +37,7 @@ export interface ITunnelService {
3737
readonly onTunnelOpened: Event<RemoteTunnel>;
3838
readonly onTunnelClosed: Event<{ host: string, port: number }>;
3939

40-
openTunnel(resolveAuthority: IAddress | undefined, remoteHost: string | undefined, remotePort: number, localPort?: number): Promise<RemoteTunnel> | undefined;
40+
openTunnel(addressProvider: IAddressProvider | undefined, remoteHost: string | undefined, remotePort: number, localPort?: number): Promise<RemoteTunnel> | undefined;
4141
closeTunnel(remoteHost: string, remotePort: number): Promise<void>;
4242
setTunnelProvider(provider: ITunnelProvider | undefined): IDisposable;
4343
}
@@ -102,16 +102,16 @@ export abstract class AbstractTunnelService implements ITunnelService {
102102
this._tunnels.clear();
103103
}
104104

105-
openTunnel(resolvedAuthority: IAddress | undefined, remoteHost: string | undefined, remotePort: number, localPort: number): Promise<RemoteTunnel> | undefined {
106-
if (!resolvedAuthority) {
105+
openTunnel(addressProvider: IAddressProvider | undefined, remoteHost: string | undefined, remotePort: number, localPort: number): Promise<RemoteTunnel> | undefined {
106+
if (!addressProvider) {
107107
return undefined;
108108
}
109109

110110
if (!remoteHost || (remoteHost === '127.0.0.1')) {
111111
remoteHost = 'localhost';
112112
}
113113

114-
const resolvedTunnel = this.retainOrCreateTunnel(resolvedAuthority, remoteHost, remotePort, localPort);
114+
const resolvedTunnel = this.retainOrCreateTunnel(addressProvider, remoteHost, remotePort, localPort);
115115
if (!resolvedTunnel) {
116116
return resolvedTunnel;
117117
}
@@ -174,11 +174,11 @@ export abstract class AbstractTunnelService implements ITunnelService {
174174
this._tunnels.get(remoteHost)!.set(remotePort, { refcount: 1, value: tunnel });
175175
}
176176

177-
protected abstract retainOrCreateTunnel(resolveRemoteAuthority: IAddress, remoteHost: string, remotePort: number, localPort?: number): Promise<RemoteTunnel> | undefined;
177+
protected abstract retainOrCreateTunnel(addressProvider: IAddressProvider, remoteHost: string, remotePort: number, localPort?: number): Promise<RemoteTunnel> | undefined;
178178
}
179179

180180
export class TunnelService extends AbstractTunnelService {
181-
protected retainOrCreateTunnel(_resolveRemoteAuthority: IAddress, remoteHost: string, remotePort: number, localPort?: number | undefined): Promise<RemoteTunnel> | undefined {
181+
protected retainOrCreateTunnel(_addressProvider: IAddressProvider, remoteHost: string, remotePort: number, localPort?: number | undefined): Promise<RemoteTunnel> | undefined {
182182
const portMap = this._tunnels.get(remoteHost);
183183
const existing = portMap ? portMap.get(remotePort) : undefined;
184184
if (existing) {

src/vs/platform/remote/node/tunnelService.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { findFreePortFaster } from 'vs/base/node/ports';
1010
import { NodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
1111
import { ILogService } from 'vs/platform/log/common/log';
1212
import { IProductService } from 'vs/platform/product/common/productService';
13-
import { connectRemoteAgentTunnel, IAddress, IConnectionOptions } from 'vs/platform/remote/common/remoteAgentConnection';
13+
import { connectRemoteAgentTunnel, IConnectionOptions, IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection';
1414
import { AbstractTunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel';
1515
import { nodeSocketFactory } from 'vs/platform/remote/node/nodeSocketFactory';
1616
import { ISignService } from 'vs/platform/sign/common/sign';
@@ -131,7 +131,7 @@ export class TunnelService extends AbstractTunnelService {
131131
super(logService);
132132
}
133133

134-
protected retainOrCreateTunnel(resolveRemoteAuthority: IAddress, remoteHost: string, remotePort: number, localPort?: number): Promise<RemoteTunnel> | undefined {
134+
protected retainOrCreateTunnel(addressProvider: IAddressProvider, remoteHost: string, remotePort: number, localPort?: number): Promise<RemoteTunnel> | undefined {
135135
const portMap = this._tunnels.get(remoteHost);
136136
const existing = portMap ? portMap.get(remotePort) : undefined;
137137
if (existing) {
@@ -149,11 +149,7 @@ export class TunnelService extends AbstractTunnelService {
149149
const options: IConnectionOptions = {
150150
commit: this.productService.commit,
151151
socketFactory: nodeSocketFactory,
152-
addressProvider: {
153-
getAddress: async () => {
154-
return resolveRemoteAuthority;
155-
}
156-
},
152+
addressProvider,
157153
signService: this.signService,
158154
logService: this.logService
159155
};

src/vs/platform/webview/common/webviewPortMapping.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export class WebviewPortMappingManager implements IDisposable {
7272
if (existing) {
7373
return existing;
7474
}
75-
const tunnel = this.tunnelService.openTunnel(remoteAuthority, undefined, remotePort);
75+
const tunnel = this.tunnelService.openTunnel({ getAddress: async () => remoteAuthority }, undefined, remotePort);
7676
if (tunnel) {
7777
this._tunnels.set(remotePort, tunnel);
7878
}

src/vs/workbench/electron-browser/window.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import { Event } from 'vs/base/common/event';
6565
import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService';
6666
import { clearAllFontInfos } from 'vs/editor/browser/config/configuration';
6767
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
68+
import { IAddressProvider, IAddress } from 'vs/platform/remote/common/remoteAgentConnection';
6869

6970
export class NativeWindow extends Disposable {
7071

@@ -473,8 +474,13 @@ export class NativeWindow extends Disposable {
473474
if (options?.allowTunneling) {
474475
const portMappingRequest = extractLocalHostUriMetaDataForPortMapping(uri);
475476
if (portMappingRequest) {
476-
const resolvedRemote = this.environmentService.configuration.remoteAuthority ? await this.remoteAuthorityResolverService.resolveAuthority(this.environmentService.configuration.remoteAuthority) : undefined;
477-
const tunnel = await this.tunnelService.openTunnel(resolvedRemote?.authority, undefined, portMappingRequest.port);
477+
const remoteAuthority = this.environmentService.configuration.remoteAuthority;
478+
const addressProvider: IAddressProvider | undefined = remoteAuthority ? {
479+
getAddress: async (): Promise<IAddress> => {
480+
return (await this.remoteAuthorityResolverService.resolveAuthority(remoteAuthority)).authority;
481+
}
482+
} : undefined;
483+
const tunnel = await this.tunnelService.openTunnel(addressProvider, undefined, portMappingRequest.port);
478484
if (tunnel) {
479485
return {
480486
resolved: uri.with({ authority: `127.0.0.1:${tunnel.tunnelLocalPort}` }),

src/vs/workbench/services/remote/common/remoteExplorerService.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { IEditableData } from 'vs/workbench/common/views';
1313
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1414
import { TunnelInformation, TunnelDescription, IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
1515
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
16+
import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection';
1617

1718
export const IRemoteExplorerService = createDecorator<IRemoteExplorerService>('remoteExplorerService');
1819
export const REMOTE_EXPLORER_TYPE_KEY: string = 'remote.explorerType';
@@ -141,12 +142,11 @@ export class TunnelModel extends Disposable {
141142
const key = MakeAddress(remote.host, remote.port);
142143
if (!this.forwarded.has(key)) {
143144
const authority = this.environmentService.configuration.remoteAuthority;
144-
const resolvedRemote = authority ? await this.remoteAuthorityResolverService.resolveAuthority(authority) : undefined;
145-
if (!resolvedRemote) {
146-
return;
147-
}
145+
const addressProvider: IAddressProvider | undefined = authority ? {
146+
getAddress: async () => { return (await this.remoteAuthorityResolverService.resolveAuthority(authority)).authority; }
147+
} : undefined;
148148

149-
const tunnel = await this.tunnelService.openTunnel(resolvedRemote.authority, remote.host, remote.port, local);
149+
const tunnel = await this.tunnelService.openTunnel(addressProvider, remote.host, remote.port, local);
150150
if (tunnel && tunnel.localAddress) {
151151
const newForward: Tunnel = {
152152
remoteHost: tunnel.tunnelRemoteHost,

0 commit comments

Comments
 (0)