Skip to content

Commit e65b7d4

Browse files
committed
Unify showWsNotRunningDialog for all cases
1 parent 5099036 commit e65b7d4

File tree

4 files changed

+14
-50
lines changed

4 files changed

+14
-50
lines changed

src/extension.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { RemoteConnector } from './remoteConnector';
1515
import { SettingsSync } from './settingsSync';
1616
import { TelemetryService } from './services/telemetryService';
1717
import { RemoteSession } from './remoteSession';
18-
import { SSHConnectionParams, checkForStoppedWorkspaces, getGitpodRemoteWindowConnectionInfo } from './remote';
18+
import { SSHConnectionParams, getGitpodRemoteWindowConnectionInfo } from './remote';
1919
import { HostService } from './services/hostService';
2020
import { SessionService } from './services/sessionService';
2121
import { CommandManager } from './commandManager';
@@ -89,7 +89,7 @@ export async function activate(context: vscode.ExtensionContext) {
8989
const remoteConnector = new RemoteConnector(context, sessionService, hostService, experiments, logger, telemetryService, notificationService);
9090
context.subscriptions.push(remoteConnector);
9191

92-
const extensionIPCService = new ExtensionServiceServer(context, logger, sessionService, hostService, notificationService, telemetryService, experiments);
92+
const extensionIPCService = new ExtensionServiceServer(logger, sessionService, hostService, telemetryService, experiments);
9393
context.subscriptions.push(extensionIPCService);
9494

9595
context.subscriptions.push(vscode.window.registerUriHandler({
@@ -124,9 +124,6 @@ export async function activate(context: vscode.ExtensionContext) {
124124

125125
remoteSession = new RemoteSession(remoteConnectionInfo.remoteAuthority, remoteConnectionInfo.connectionInfo, context, hostService!, sessionService, settingsSync, experiments, logger!, telemetryService!, notificationService);
126126
await remoteSession.initialize();
127-
} else if (sessionService.isSignedIn()) {
128-
const restartFlow = { flow: 'restart_workspace', userId: sessionService.getUserId(), gitpodHost: hostService!.gitpodHost };
129-
checkForStoppedWorkspaces(context, restartFlow, notificationService, logger!);
130127
}
131128
});
132129

src/local-ssh/ipc/extension.ts

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import * as vscode from 'vscode';
76
import { ExtensionServiceDefinition, ExtensionServiceImplementation, GetWorkspaceAuthInfoRequest, GetWorkspaceAuthInfoResponse, LocalSSHServiceDefinition, ExtensionServicePingRequest, SendErrorReportRequest, SendLocalSSHUserFlowStatusRequest, SendLocalSSHUserFlowStatusRequest_Code, SendLocalSSHUserFlowStatusRequest_ConnType, SendLocalSSHUserFlowStatusRequest_Status } from '../../proto/typescript/ipc/v1/ipc';
87
import { Disposable } from '../../common/dispose';
98
import { retry, timeout } from '../../common/async';
@@ -17,8 +16,6 @@ import { ISessionService } from '../../services/sessionService';
1716
import { CallContext, ServerError, Status } from 'nice-grpc-common';
1817
import { IHostService } from '../../services/hostService';
1918
import { Server, createClient, createServer, createChannel } from 'nice-grpc';
20-
import { INotificationService } from '../../services/notificationService';
21-
import { getGitpodRemoteWindowConnectionInfo, showWsNotRunningDialog } from '../../remote';
2219
import { ITelemetryService, UserFlowTelemetry } from '../../services/telemetryService';
2320
import { ExperimentalSettings } from '../../experiments';
2421
import { Configuration } from '../../configuration';
@@ -38,23 +35,14 @@ const phaseMap: Record<WorkspaceInstanceStatus_Phase, WorkspaceInstancePhase | u
3835
};
3936

4037
export class ExtensionServiceImpl implements ExtensionServiceImplementation {
41-
private notificationGapSet = new Set<string>();
42-
43-
constructor(private readonly context: vscode.ExtensionContext, private logService: ILogService, private sessionService: ISessionService, private hostService: IHostService, private notificationService: INotificationService, private experiments: ExperimentalSettings, private telemetryService: ITelemetryService) { }
38+
constructor(
39+
private logService: ILogService,
40+
private sessionService: ISessionService,
41+
private hostService: IHostService,
42+
private experiments: ExperimentalSettings,
43+
private telemetryService: ITelemetryService
44+
) {
4445

45-
private canShowNotification(id: string) {
46-
let remoteConnectionInfo = getGitpodRemoteWindowConnectionInfo(this.context);
47-
if (!remoteConnectionInfo || remoteConnectionInfo.connectionInfo.workspaceId !== id) {
48-
return false;
49-
}
50-
if (this.notificationGapSet.has(id)) {
51-
return false;
52-
}
53-
this.notificationGapSet.add(id);
54-
setTimeout(() => {
55-
this.notificationGapSet.delete(id);
56-
}, 10000); // clean gap after 10s
57-
return true;
5846
}
5947

6048
async ping(_request: ExtensionServicePingRequest, _context: CallContext): Promise<{}> {
@@ -80,11 +68,6 @@ export class ExtensionServiceImpl implements ExtensionServiceImplementation {
8068

8169
const phase = usePublicApi ? phaseMap[(workspace as Workspace).status?.instance?.status?.phase ?? WorkspaceInstanceStatus_Phase.UNSPECIFIED] : (workspace as WorkspaceInfo).latestInstance?.status.phase;
8270
if (phase !== 'running') {
83-
const show = this.canShowNotification(workspaceId);
84-
if (show) {
85-
const flow: UserFlowTelemetry = { workspaceId, gitpodHost, userId: userId, flow: 'extension_ipc' };
86-
showWsNotRunningDialog(workspaceId, gitpodHost, flow, this.notificationService, this.logService);
87-
}
8871
throw new ServerError(Status.UNAVAILABLE, 'workspace is not running, current phase: ' + phase);
8972
}
9073

@@ -161,11 +144,9 @@ export class ExtensionServiceServer extends Disposable {
161144
private localSSHServiceClient = createClient(LocalSSHServiceDefinition, createChannel('127.0.0.1:' + Configuration.getLocalSshIpcPort()));
162145

163146
constructor(
164-
private readonly context: vscode.ExtensionContext,
165147
private readonly logService: ILogService,
166148
private readonly sessionService: ISessionService,
167149
private readonly hostService: IHostService,
168-
private readonly notificationService: INotificationService,
169150
private readonly telemetryService: ITelemetryService,
170151
private experiments: ExperimentalSettings,
171152
) {
@@ -180,7 +161,7 @@ export class ExtensionServiceServer extends Disposable {
180161

181162
private getServer(): Server {
182163
const server = createServer();
183-
const serviceImpl = new ExtensionServiceImpl(this.context, this.logService, this.sessionService, this.hostService, this.notificationService, this.experiments, this.telemetryService);
164+
const serviceImpl = new ExtensionServiceImpl(this.logService, this.sessionService, this.hostService, this.experiments, this.telemetryService);
184165
server.add(ExtensionServiceDefinition, serviceImpl);
185166
return server;
186167
}

src/remote.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export class NoSSHGatewayError extends Error {
3333
}
3434

3535
export const SSH_DEST_KEY = 'ssh-dest:';
36-
export const WORKSPACE_STOPPED_PREFIX = 'stopped_workspace:';
3736

3837
export function getGitpodRemoteWindowConnectionInfo(context: vscode.ExtensionContext): { remoteAuthority: string; connectionInfo: SSHConnectionParams } | undefined {
3938
const remoteUri = vscode.workspace.workspaceFile || vscode.workspace.workspaceFolders?.[0].uri;
@@ -57,23 +56,11 @@ export async function showWsNotRunningDialog(workspaceId: string, gitpodHost: st
5756
workspaceUrl.hash = workspaceId;
5857

5958
const openUrl = 'Restart workspace';
60-
const resp = await notificationService.showErrorMessage(msg, { id: 'ws_not_running', flow }, openUrl);
59+
const resp = await notificationService.showErrorMessage(msg, { id: 'ws_not_running', flow, modal: true }, openUrl);
6160
if (resp === openUrl) {
6261
const opened = await vscode.env.openExternal(vscode.Uri.parse(workspaceUrl.toString()));
6362
if (opened) {
6463
vscode.commands.executeCommand('workbench.action.closeWindow');
6564
}
6665
}
6766
}
68-
69-
export async function checkForStoppedWorkspaces(context: vscode.ExtensionContext, flow: UserFlowTelemetry, notificationService: INotificationService, logService: ILogService) {
70-
const keys = context.globalState.keys();
71-
const stopped_ws_keys = keys.filter(k => k.startsWith(WORKSPACE_STOPPED_PREFIX));
72-
for (const k of stopped_ws_keys) {
73-
const ws = context.globalState.get<WorkspaceRestartInfo>(k)!;
74-
context.globalState.update(k, undefined);
75-
if (new URL(flow.gitpodHost).host === new URL(ws.gitpodHost).host) {
76-
showWsNotRunningDialog(ws.workspaceId, ws.gitpodHost, { ...flow, workspaceId: ws.workspaceId, gitpodHost: ws.gitpodHost }, notificationService, logService);
77-
}
78-
}
79-
}

src/remoteSession.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as vscode from 'vscode';
77
import { v4 as uuid } from 'uuid';
8-
import { NoRunningInstanceError, SSHConnectionParams, SSH_DEST_KEY, WORKSPACE_STOPPED_PREFIX, WorkspaceRestartInfo, showWsNotRunningDialog } from './remote';
8+
import { NoRunningInstanceError, SSHConnectionParams, SSH_DEST_KEY, showWsNotRunningDialog } from './remote';
99
import { Disposable } from './common/dispose';
1010
import { HeartbeatManager } from './heartbeat';
1111
import { WorkspaceState } from './workspaceState';
@@ -79,10 +79,9 @@ export class RemoteSession extends Disposable {
7979
if (this.usePublicApi) {
8080
this.workspaceState = new WorkspaceState(this.connectionInfo.workspaceId, this.sessionService, this.logService);
8181
await this.workspaceState.initialize();
82-
8382
this._register(this.workspaceState.onWorkspaceStopped(async () => {
84-
await this.context.globalState.update(`${WORKSPACE_STOPPED_PREFIX}${this.connectionInfo.workspaceId}`, { workspaceId: this.connectionInfo.workspaceId, gitpodHost: this.connectionInfo.gitpodHost } as WorkspaceRestartInfo);
85-
vscode.commands.executeCommand('workbench.action.remote.close');
83+
const remoteFlow: UserFlowTelemetry = { ...this.connectionInfo, userId: this.sessionService.getUserId(), flow: 'remote_window', phase: 'stopped' };
84+
showWsNotRunningDialog(this.connectionInfo.workspaceId, this.connectionInfo.gitpodHost, remoteFlow, this.notificationService, this.logService);
8685
}));
8786
}
8887

0 commit comments

Comments
 (0)