提交 14bb2fdc 编写于 作者: A Alex Ross

Tunnels from a tunnel factory can have async dispose

上级 a84603f4
......@@ -17,7 +17,7 @@ export interface RemoteTunnel {
readonly tunnelRemoteHost: string;
readonly tunnelLocalPort?: number;
readonly localAddress: string;
dispose(silent?: boolean): void;
dispose(silent?: boolean): Promise<void>;
}
export interface TunnelOptions {
......@@ -119,10 +119,10 @@ export abstract class AbstractTunnelService implements ITunnelService {
});
}
dispose(): void {
async dispose(): Promise<void> {
for (const portMap of this._tunnels.values()) {
for (const { value } of portMap.values()) {
value.then(tunnel => tunnel?.dispose());
await value.then(tunnel => tunnel?.dispose());
}
portMap.clear();
}
......@@ -163,13 +163,13 @@ export abstract class AbstractTunnelService implements ITunnelService {
tunnelRemoteHost: tunnel.tunnelRemoteHost,
tunnelLocalPort: tunnel.tunnelLocalPort,
localAddress: tunnel.localAddress,
dispose: () => {
dispose: async () => {
const existingHost = this._tunnels.get(tunnel.tunnelRemoteHost);
if (existingHost) {
const existing = existingHost.get(tunnel.tunnelRemotePort);
if (existing) {
existing.refcount--;
this.tryDisposeTunnel(tunnel.tunnelRemoteHost, tunnel.tunnelRemotePort, existing);
await this.tryDisposeTunnel(tunnel.tunnelRemoteHost, tunnel.tunnelRemotePort, existing);
}
}
}
......@@ -178,9 +178,9 @@ export abstract class AbstractTunnelService implements ITunnelService {
private async tryDisposeTunnel(remoteHost: string, remotePort: number, tunnel: { refcount: number, readonly value: Promise<RemoteTunnel | undefined> }): Promise<void> {
if (tunnel.refcount <= 0) {
const disposePromise: Promise<void> = tunnel.value.then(tunnel => {
const disposePromise: Promise<void> = tunnel.value.then(async (tunnel) => {
if (tunnel) {
tunnel.dispose(true);
await tunnel.dispose(true);
this._onTunnelClosed.fire({ host: tunnel.tunnelRemoteHost, port: tunnel.tunnelRemotePort });
}
});
......
......@@ -57,7 +57,7 @@ class NodeRemoteTunnel extends Disposable implements RemoteTunnel {
this.tunnelRemoteHost = tunnelRemoteHost;
}
public dispose(): void {
public async dispose(): Promise<void> {
super.dispose();
this._server.removeListener('listening', this._listeningListener);
this._server.removeListener('connection', this._connectionListener);
......
......@@ -60,9 +60,9 @@ export class WebviewPortMappingManager implements IDisposable {
return undefined;
}
dispose() {
async dispose() {
for (const tunnel of this._tunnels.values()) {
tunnel.dispose();
await tunnel.dispose();
}
this._tunnels.clear();
}
......
......@@ -189,7 +189,7 @@ declare module 'vscode' {
export interface Tunnel extends TunnelDescription {
// Implementers of Tunnel should fire onDidDispose when dispose is called.
onDidDispose: Event<void>;
dispose(): void;
dispose(): void | Thenable<void>;
}
/**
......
......@@ -66,8 +66,8 @@ export class MainThreadTunnelService extends Disposable implements MainThreadTun
tunnelRemoteHost: tunnel.remoteAddress.host,
localAddress: typeof tunnel.localAddress === 'string' ? tunnel.localAddress : makeAddress(tunnel.localAddress.host, tunnel.localAddress.port),
tunnelLocalPort: typeof tunnel.localAddress !== 'string' ? tunnel.localAddress.port : undefined,
dispose: (silent?: boolean) => {
this._proxy.$closeTunnel({ host: tunnel.remoteAddress.host, port: tunnel.remoteAddress.port }, silent);
dispose: async (silent?: boolean) => {
return this._proxy.$closeTunnel({ host: tunnel.remoteAddress.host, port: tunnel.remoteAddress.port }, silent);
}
};
});
......
......@@ -30,11 +30,11 @@ class ExtensionTunnel implements vscode.Tunnel {
constructor(
public readonly remoteAddress: { port: number, host: string },
public readonly localAddress: { port: number, host: string } | string,
private readonly _dispose: () => void) { }
private readonly _dispose: () => Promise<void>) { }
dispose(): void {
dispose(): Promise<void> {
this._onDispose.fire();
this._dispose();
return this._dispose();
}
}
......@@ -212,7 +212,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe
if (silent) {
hostMap.get(remote.port)!.disposeListener.dispose();
}
hostMap.get(remote.port)!.tunnel.dispose();
await hostMap.get(remote.port)!.tunnel.dispose();
hostMap.delete(remote.port);
}
}
......
......@@ -36,7 +36,7 @@ export class TunnelFactoryContribution extends Disposable implements IWorkbenchC
// The tunnel factory may give us an inaccessible local address.
// To make sure this doesn't happen, resolve the uri immediately.
localAddress: (await openerService.resolveExternalUri(URI.parse(localAddress))).resolved.toString(),
dispose: tunnel.dispose
dispose: async () => { await tunnel.dispose; }
};
resolve(remoteTunnel);
});
......
......@@ -73,7 +73,7 @@ export interface TunnelCreationOptions {
elevationRequired?: boolean;
}
interface ITunnel extends IDisposable {
interface ITunnel {
remoteAddress: { port: number, host: string };
/**
......@@ -85,6 +85,8 @@ interface ITunnel extends IDisposable {
* Implementers of Tunnel should fire onDidDispose when dispose is called.
*/
onDidDispose: Event<void>;
dispose(): Promise<void> | void;
}
interface IShowPortCandidate {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册