Skip to content

Commit acf26aa

Browse files
committed
Deployment management refactoring
1 parent 190d8ed commit acf26aa

File tree

7 files changed

+40
-50
lines changed

7 files changed

+40
-50
lines changed

src/commands.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { type ContextManager } from "./core/contextManager";
1313
import { type MementoManager } from "./core/mementoManager";
1414
import { type PathResolver } from "./core/pathResolver";
1515
import { type SecretsManager } from "./core/secretsManager";
16-
import { type DeploymentManager } from "./deployment";
16+
import { type DeploymentManager } from "./deployment/deploymentManager";
1717
import { CertificateError } from "./error";
1818
import { type Logger } from "./logging/logger";
1919
import { type LoginCoordinator } from "./login/loginCoordinator";

src/core/secretsManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { toSafeHost } from "../util";
33

44
import type { Memento, SecretStorage, Disposable } from "vscode";
55

6-
import type { Deployment } from "../deployment";
6+
import type { Deployment } from "../deployment/types";
77

88
// Each deployment has its own key to ensure atomic operations (multiple windows
99
// writing to a shared key could drop data) and to receive proper VS Code events.

src/deployment/deploymentManager.ts

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
1-
import { type CoderApi } from "../api/coderApi";
2-
import { type ServiceContainer } from "../core/container";
3-
import { type ContextManager } from "../core/contextManager";
4-
import { type MementoManager } from "../core/mementoManager";
5-
import { type SecretsManager } from "../core/secretsManager";
6-
import { type Logger } from "../logging/logger";
7-
import { type WorkspaceProvider } from "../workspace/workspacesProvider";
8-
9-
import {
10-
type Deployment,
11-
type DeploymentWithAuth,
12-
isAuthenticated,
13-
} from "./types";
14-
151
import type { User } from "coder/site/src/api/typesGenerated";
162
import type * as vscode from "vscode";
173

4+
import type { CoderApi } from "../api/coderApi";
5+
import type { ServiceContainer } from "../core/container";
6+
import type { ContextManager } from "../core/contextManager";
7+
import type { MementoManager } from "../core/mementoManager";
8+
import type { SecretsManager } from "../core/secretsManager";
9+
import type { Logger } from "../logging/logger";
10+
import type { WorkspaceProvider } from "../workspace/workspacesProvider";
11+
12+
import type { Deployment, DeploymentWithAuth } from "./types";
13+
1814
/**
1915
* Manages deployment state for the extension.
2016
*
@@ -72,7 +68,7 @@ export class DeploymentManager implements vscode.Disposable {
7268
* Check if we have an authenticated deployment (with a valid user).
7369
*/
7470
public isAuthenticated(): boolean {
75-
return isAuthenticated(this.currentDeployment);
71+
return this.currentDeployment?.user !== undefined;
7672
}
7773

7874
/**
@@ -101,6 +97,17 @@ export class DeploymentManager implements vscode.Disposable {
10197
await this.tryFetchAndUpgradeUser();
10298
}
10399

100+
private setDeploymentCore(deployment: DeploymentWithAuth): void {
101+
if (deployment.token === undefined) {
102+
this.client.setHost(deployment.url);
103+
} else {
104+
this.client.setCredentials(deployment.url, deployment.token);
105+
}
106+
this.registerAuthListener(deployment.safeHostname);
107+
this.currentDeployment = { ...deployment };
108+
this.updateAuthContexts(deployment.user);
109+
}
110+
104111
/**
105112
* Log out from the current deployment.
106113
*/
@@ -116,17 +123,6 @@ export class DeploymentManager implements vscode.Disposable {
116123
await this.secretsManager.setCurrentDeployment(undefined);
117124
}
118125

119-
private setDeploymentCore(deployment: DeploymentWithAuth): void {
120-
if (deployment.token === undefined) {
121-
this.client.setHost(deployment.url);
122-
} else {
123-
this.client.setCredentials(deployment.url, deployment.token);
124-
}
125-
this.registerAuthListener(deployment.safeHostname);
126-
this.currentDeployment = { ...deployment };
127-
this.updateAuthContexts(deployment.user);
128-
}
129-
130126
public dispose(): void {
131127
this.authListenerDisposable?.dispose();
132128
this.crossWindowSyncDisposable?.dispose();
@@ -137,6 +133,7 @@ export class DeploymentManager implements vscode.Disposable {
137133
this.secretsManager.onDidChangeCurrentDeployment(
138134
async ({ deployment }) => {
139135
if (this.isAuthenticated()) {
136+
// Ignore if we are already authenticated
140137
return;
141138
}
142139

@@ -158,15 +155,15 @@ export class DeploymentManager implements vscode.Disposable {
158155
* Register auth listener for the given deployment hostname.
159156
* Updates credentials when they change (token refresh, cross-window sync).
160157
*/
161-
private registerAuthListener(safeHost: string): void {
158+
private registerAuthListener(safeHostname: string): void {
162159
this.authListenerDisposable?.dispose();
163160

164-
this.logger.debug("Registering auth listener for hostname", safeHost);
161+
this.logger.debug("Registering auth listener for hostname", safeHostname);
165162
this.authListenerDisposable = this.secretsManager.onDidChangeSessionAuth(
166-
safeHost,
163+
safeHostname,
167164
async (auth) => {
168165
if (auth) {
169-
if (this.currentDeployment?.safeHostname !== safeHost) {
166+
if (this.currentDeployment?.safeHostname !== safeHostname) {
170167
return;
171168
}
172169

@@ -212,7 +209,7 @@ export class DeploymentManager implements vscode.Disposable {
212209
}
213210

214211
/**
215-
* Refresh all workspace providers.
212+
* Refresh all workspace providers asynchronously.
216213
*/
217214
private refreshWorkspaces(): void {
218215
for (const provider of this.workspaceProviders) {

src/deployment/index.ts

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/deployment/types.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,7 @@ export interface Deployment {
1717
* - Undefined token means that we should not override the existing token (if any).
1818
* - Undefined user means the deployment is set but not authenticated yet.
1919
*/
20-
export type DeploymentWithAuth = Deployment & { token?: string; user?: User };
21-
22-
/**
23-
* Type guard to check if a deployment has a valid authenticated user.
24-
*/
25-
export function isAuthenticated(
26-
deployment: DeploymentWithAuth | null,
27-
): deployment is Deployment & { user: User } {
28-
return deployment?.user !== undefined;
29-
}
20+
export type DeploymentWithAuth = Deployment & {
21+
readonly token?: string;
22+
readonly user?: User;
23+
};

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { needToken } from "./api/utils";
1212
import { Commands } from "./commands";
1313
import { ServiceContainer } from "./core/container";
1414
import { type SecretsManager } from "./core/secretsManager";
15-
import { DeploymentManager } from "./deployment";
15+
import { DeploymentManager } from "./deployment/deploymentManager";
1616
import { CertificateError, getErrorDetail } from "./error";
1717
import { maybeAskUrl } from "./promptUtils";
1818
import { Remote } from "./remote/remote";

src/login/loginCoordinator.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ import * as vscode from "vscode";
33

44
import { CoderApi } from "../api/coderApi";
55
import { needToken } from "../api/utils";
6-
import { type MementoManager } from "../core/mementoManager";
7-
import { type SecretsManager } from "../core/secretsManager";
8-
import { type Deployment } from "../deployment";
96
import { CertificateError } from "../error";
10-
import { type Logger } from "../logging/logger";
117
import { maybeAskUrl } from "../promptUtils";
128

139
import type { User } from "coder/site/src/api/typesGenerated";
1410

11+
import type { MementoManager } from "../core/mementoManager";
12+
import type { SecretsManager } from "../core/secretsManager";
13+
import type { Deployment } from "../deployment/types";
14+
import type { Logger } from "../logging/logger";
15+
1516
interface LoginResult {
1617
success: boolean;
1718
user?: User;

0 commit comments

Comments
 (0)