From 1f8209ac2a63bc39cad01c9db7c280ebd32fd57e Mon Sep 17 00:00:00 2001 From: Elliott de Launay Date: Thu, 26 Mar 2026 22:49:29 -0400 Subject: [PATCH] refactor(McpOAuthClientProvider): add TOKEN_EXPIRY_BUFFER --- src/services/mcp/McpHub.ts | 5 +---- src/services/mcp/McpOAuthClientProvider.ts | 3 ++- src/services/mcp/constants.ts | 1 + 3 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 src/services/mcp/constants.ts diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index be5ded9dd3..18ca2568fa 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -36,6 +36,7 @@ import { GlobalFileNames } from "../../shared/globalFileNames" import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js" import { fileExistsAtPath } from "../../utils/fs" +import { TOKEN_EXPIRY_BUFFER_MS } from "./constants" import { SecretStorageService } from "./SecretStorageService" import { McpOAuthClientProvider } from "./McpOAuthClientProvider" import { arePathsEqual, getWorkspacePath } from "../../utils/path" @@ -1053,8 +1054,6 @@ export class McpHub { return } - const TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000 - // Check if another window already saved valid tokens const existing = await this.secretStorage.getOAuthData(serverUrl) if (existing && Date.now() < existing.expires_at - TOKEN_EXPIRY_BUFFER_MS) { @@ -1163,8 +1162,6 @@ export class McpHub { this._oauthWatchers.delete(watcherKey) } - const TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000 - // Called when SecretStorage fires onDidChange for this server's key. // Runs in all VS Code windows the instant tokens are saved — no polling delay. const onTokensChanged = async () => { diff --git a/src/services/mcp/McpOAuthClientProvider.ts b/src/services/mcp/McpOAuthClientProvider.ts index 1017746c31..cb8e34b1ac 100644 --- a/src/services/mcp/McpOAuthClientProvider.ts +++ b/src/services/mcp/McpOAuthClientProvider.ts @@ -9,6 +9,7 @@ import type { OAuthTokens, } from "@modelcontextprotocol/sdk/shared/auth.js" +import { TOKEN_EXPIRY_BUFFER_MS } from "./constants" import { SecretStorageService } from "./SecretStorageService" import { startCallbackServer, stopCallbackServer } from "./utils/callbackServer" import { fetchOAuthAuthServerMetadata } from "./utils/oauth" @@ -265,7 +266,7 @@ export class McpOAuthClientProvider implements OAuthClientProvider { if (!data) return undefined // If the access token is still valid (with 5m buffer), return it. - if (Date.now() < data.expires_at - 5 * 60 * 1000) { + if (Date.now() < data.expires_at - TOKEN_EXPIRY_BUFFER_MS) { return data.tokens } diff --git a/src/services/mcp/constants.ts b/src/services/mcp/constants.ts new file mode 100644 index 0000000000..e49ed4e027 --- /dev/null +++ b/src/services/mcp/constants.ts @@ -0,0 +1 @@ +export const TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000 // 5 minutes