From b41a8e04cb082ad408eb38153c00b5972f348b60 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Mon, 2 Feb 2026 07:31:55 -0800 Subject: [PATCH] Graceful oauth server shutdown --- plugins/auth-oauth2/src/callbackServer.ts | 12 ++++++++++++ plugins/auth-oauth2/src/index.ts | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) 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',