From 2048a877f7c2df543061349a61fecbc2ea85cddb Mon Sep 17 00:00:00 2001 From: IYODA Atsushi Date: Sun, 15 Feb 2026 04:42:21 +0900 Subject: [PATCH 1/2] refactor(mcp-oauth): delegate port utilities to shared/port-utils --- src/features/mcp-oauth/callback-server.ts | 25 +++-------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/src/features/mcp-oauth/callback-server.ts b/src/features/mcp-oauth/callback-server.ts index 3f201202..c8d856fa 100644 --- a/src/features/mcp-oauth/callback-server.ts +++ b/src/features/mcp-oauth/callback-server.ts @@ -1,5 +1,6 @@ +import { findAvailablePort as findAvailablePortShared } from "../../shared/port-utils" + const DEFAULT_PORT = 19877 -const MAX_PORT_ATTEMPTS = 20 const TIMEOUT_MS = 5 * 60 * 1000 export type OAuthCallbackResult = { @@ -33,28 +34,8 @@ const SUCCESS_HTML = ` ` -async function isPortAvailable(port: number): Promise { - try { - const server = Bun.serve({ - port, - hostname: "127.0.0.1", - fetch: () => new Response(), - }) - server.stop(true) - return true - } catch { - return false - } -} - export async function findAvailablePort(startPort: number = DEFAULT_PORT): Promise { - for (let attempt = 0; attempt < MAX_PORT_ATTEMPTS; attempt++) { - const port = startPort + attempt - if (await isPortAvailable(port)) { - return port - } - } - throw new Error(`No available port found in range ${startPort}-${startPort + MAX_PORT_ATTEMPTS - 1}`) + return findAvailablePortShared(startPort) } export async function startCallbackServer(startPort: number = DEFAULT_PORT): Promise { From e03169597520a1167ba0ea026e16f9b6dd4bd32a Mon Sep 17 00:00:00 2001 From: IYODA Atsushi Date: Sun, 15 Feb 2026 04:44:23 +0900 Subject: [PATCH 2/2] test(mcp-oauth): remove redundant findAvailablePort tests (covered by port-utils) --- .../mcp-oauth/callback-server.test.ts | 32 +------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/src/features/mcp-oauth/callback-server.test.ts b/src/features/mcp-oauth/callback-server.test.ts index 3958ad70..060cdb58 100644 --- a/src/features/mcp-oauth/callback-server.test.ts +++ b/src/features/mcp-oauth/callback-server.test.ts @@ -1,38 +1,8 @@ import { afterEach, describe, expect, it } from "bun:test" -import { findAvailablePort, startCallbackServer, type CallbackServer } from "./callback-server" +import { startCallbackServer, type CallbackServer } from "./callback-server" const nativeFetch = Bun.fetch.bind(Bun) -describe("findAvailablePort", () => { - it("returns the start port when it is available", async () => { - // given - const startPort = 19877 - - // when - const port = await findAvailablePort(startPort) - - // then - expect(port).toBeGreaterThanOrEqual(startPort) - expect(port).toBeLessThan(startPort + 20) - }) - - it("skips busy ports and returns next available", async () => { - // given - const blocker = Bun.serve({ - port: 19877, - hostname: "127.0.0.1", - fetch: () => new Response(), - }) - - // when - const port = await findAvailablePort(19877) - - // then - expect(port).toBeGreaterThan(19877) - blocker.stop(true) - }) -}) - describe("startCallbackServer", () => { let server: CallbackServer | null = null