diff --git a/plugins/auth-oauth2/src/callbackServer.ts b/plugins/auth-oauth2/src/callbackServer.ts index a351bca8..55beec32 100644 --- a/plugins/auth-oauth2/src/callbackServer.ts +++ b/plugins/auth-oauth2/src/callbackServer.ts @@ -184,6 +184,18 @@ export function buildHostedCallbackRedirectUri(localPort: number, localPath: str return `${HOSTED_CALLBACK_URL}?redirect_to=${encodeURIComponent(localRedirectUri)}`; } +/** + * Stop the active callback server if one is running. + * Called during plugin dispose to ensure the server is cleaned up before the process exits. + */ +export function stopActiveServer(): void { + if (activeServer) { + console.log('[oauth2] Stopping active callback server during dispose'); + activeServer.stop(); + activeServer = null; + } +} + /** * Open an authorization URL in the system browser, start a local callback server, * and wait for the OAuth provider to redirect back. diff --git a/plugins/auth-oauth2/src/index.ts b/plugins/auth-oauth2/src/index.ts index ba384f49..8b337b8c 100644 --- a/plugins/auth-oauth2/src/index.ts +++ b/plugins/auth-oauth2/src/index.ts @@ -5,7 +5,7 @@ import type { JsonPrimitive, PluginDefinition, } from '@yaakapp/api'; -import { DEFAULT_LOCALHOST_PORT, HOSTED_CALLBACK_URL } from './callbackServer'; +import { DEFAULT_LOCALHOST_PORT, HOSTED_CALLBACK_URL, stopActiveServer } from './callbackServer'; import { type CallbackType, DEFAULT_PKCE_METHOD, @@ -78,6 +78,9 @@ const accessTokenUrls = [ ]; export const plugin: PluginDefinition = { + dispose() { + stopActiveServer(); + }, authentication: { name: 'oauth2', label: 'OAuth 2.0',