From 6a9d7fb466471e92918d127a6b8d0b456b5b19ed Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:04:55 +0530 Subject: [PATCH 1/5] fix: set default port to 3020 --- cli/dev/register.ts | 22 ++++++++++++++++++++-- lib/server/createHttpServer.ts | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/cli/dev/register.ts b/cli/dev/register.ts index f471f65..7fa0f1b 100644 --- a/cli/dev/register.ts +++ b/cli/dev/register.ts @@ -7,15 +7,33 @@ import { getLocalFileDependencies } from "lib/dependency-analysis/getLocalFileDe import { installNodeModuleTypesForSnippet } from "../../lib/dependency-analysis/installNodeModuleTypesForSnippet" import { EventsWatcher } from "../../lib/server/EventsWatcher" import { DevServer } from "./DevServer" +import * as net from "node:net" export const registerDev = (program: Command) => { program .command("dev") .description("Start development server for a snippet") .argument("[file]", "Path to the snippet file") - .option("-p, --port ", "Port to run server on", "3000") + .option("-p, --port ", "Port to run server on", "3020") .action(async (file: string, options: { port: string }) => { - const port = parseInt(options.port) + let port = parseInt(options.port) + + const isPortAvailable = (port: number): Promise => { + return new Promise((resolve) => { + const server = net.createServer() + server.once("error", () => resolve(false)) + server.once("listening", () => { + server.close(() => resolve(true)) + }) + server.listen(port) + }) + } + + while (!(await isPortAvailable(port))) { + console.log(`Port ${port} is in use, trying port ${port + 1}...`) + port += 1 + } + let absolutePath: string if (file) { diff --git a/lib/server/createHttpServer.ts b/lib/server/createHttpServer.ts index a88828f..029607f 100644 --- a/lib/server/createHttpServer.ts +++ b/lib/server/createHttpServer.ts @@ -8,7 +8,7 @@ import pkg from "../../package.json" import winterspecBundle from "@tscircuit/file-server/dist/bundle.js" import { getIndex } from "../site/getIndex" -export const createHttpServer = async (port = 3000) => { +export const createHttpServer = async (port = 3020) => { const fileServerHandler = getNodeHandler(winterspecBundle as any, {}) const server = http.createServer(async (req, res) => { From f9898f80cf060860c6a54d20276fb6889023cc74 Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:55:20 +0530 Subject: [PATCH 2/5] feat: add test file --- tests/test3-dev-server-port.test.ts | 67 +++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/test3-dev-server-port.test.ts diff --git a/tests/test3-dev-server-port.test.ts b/tests/test3-dev-server-port.test.ts new file mode 100644 index 0000000..cb867a1 --- /dev/null +++ b/tests/test3-dev-server-port.test.ts @@ -0,0 +1,67 @@ +import { test, expect, afterEach } from "bun:test" +import * as net from "node:net" +import { DevServer } from "cli/dev/DevServer" +import { getTestFixture } from "tests/fixtures/get-test-fixture" + +const isPortAvailable = (port: number): Promise => { + return new Promise((resolve) => { + const server = net.createServer() + server.once("error", () => resolve(false)) + server.once("listening", () => { + server.close(() => resolve(true)) + }) + server.listen(port) + }) +} + +const getAvailablePort = async (startPort: number): Promise => { + let port = startPort + while (!(await isPortAvailable(port))) { + port++ + } + return port +} + +test("test3 dev server port handling", async () => { + const { tempDirPath } = await getTestFixture({ + vfs: { + "snippet.tsx": ` + export const MyCircuit = () => ( + + + + ) + `, + }, + }) + + const server = net.createServer().listen(3020) + + const availablePort1 = await getAvailablePort(3020) + const devServer1 = new DevServer({ + port: availablePort1, + componentFilePath: `${tempDirPath}/snippet.tsx`, + }) + await devServer1.start() + + const availablePort2 = await getAvailablePort(availablePort1 + 1) + const devServer2 = new DevServer({ + port: availablePort2, + componentFilePath: `${tempDirPath}/snippet.tsx`, + }) + await devServer2.start() + + const is3020Available = await isPortAvailable(3020) + expect(is3020Available).toBe(false) + const isPort1Available = await isPortAvailable(availablePort1) + expect(isPort1Available).toBe(false) + + const isPort2Available = await isPortAvailable(availablePort2) + expect(isPort2Available).toBe(false) + + afterEach(async () => { + await devServer1.stop() + await devServer2.stop() + server.close() + }) +}) From 25c30e9913ecae18c0d343efa4f824aeff8e9f51 Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Thu, 23 Jan 2025 12:39:39 +0530 Subject: [PATCH 3/5] fix: remove two dev server --- tests/test3-dev-server-port.test.ts | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/tests/test3-dev-server-port.test.ts b/tests/test3-dev-server-port.test.ts index cb867a1..022d839 100644 --- a/tests/test3-dev-server-port.test.ts +++ b/tests/test3-dev-server-port.test.ts @@ -35,33 +35,20 @@ test("test3 dev server port handling", async () => { }, }) - const server = net.createServer().listen(3020) - - const availablePort1 = await getAvailablePort(3020) - const devServer1 = new DevServer({ - port: availablePort1, - componentFilePath: `${tempDirPath}/snippet.tsx`, - }) - await devServer1.start() - - const availablePort2 = await getAvailablePort(availablePort1 + 1) - const devServer2 = new DevServer({ - port: availablePort2, + const availablePort = await getAvailablePort(3020) + const devServer = new DevServer({ + port: availablePort, componentFilePath: `${tempDirPath}/snippet.tsx`, }) - await devServer2.start() + await devServer.start() const is3020Available = await isPortAvailable(3020) expect(is3020Available).toBe(false) - const isPort1Available = await isPortAvailable(availablePort1) - expect(isPort1Available).toBe(false) - const isPort2Available = await isPortAvailable(availablePort2) - expect(isPort2Available).toBe(false) + const isPortAvailableForDevServer = await isPortAvailable(availablePort) + expect(isPortAvailableForDevServer).toBe(false) afterEach(async () => { - await devServer1.stop() - await devServer2.stop() - server.close() + await devServer.stop() }) }) From dbe87ed1d7b6384878668a01dcc371479fa6b6a9 Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Thu, 23 Jan 2025 23:28:25 +0530 Subject: [PATCH 4/5] fix: test --- tests/test3-dev-server-port.test.ts | 34 +++++++---------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/tests/test3-dev-server-port.test.ts b/tests/test3-dev-server-port.test.ts index 022d839..9ee7408 100644 --- a/tests/test3-dev-server-port.test.ts +++ b/tests/test3-dev-server-port.test.ts @@ -1,26 +1,7 @@ import { test, expect, afterEach } from "bun:test" -import * as net from "node:net" import { DevServer } from "cli/dev/DevServer" import { getTestFixture } from "tests/fixtures/get-test-fixture" - -const isPortAvailable = (port: number): Promise => { - return new Promise((resolve) => { - const server = net.createServer() - server.once("error", () => resolve(false)) - server.once("listening", () => { - server.close(() => resolve(true)) - }) - server.listen(port) - }) -} - -const getAvailablePort = async (startPort: number): Promise => { - let port = startPort - while (!(await isPortAvailable(port))) { - port++ - } - return port -} +import * as http from "node:http" test("test3 dev server port handling", async () => { const { tempDirPath } = await getTestFixture({ @@ -35,20 +16,21 @@ test("test3 dev server port handling", async () => { }, }) - const availablePort = await getAvailablePort(3020) + const server = http.createServer(() => {}).listen(3020) + const devServer = new DevServer({ - port: availablePort, + port: 3021, componentFilePath: `${tempDirPath}/snippet.tsx`, }) await devServer.start() - const is3020Available = await isPortAvailable(3020) - expect(is3020Available).toBe(false) + await new Promise(resolve => setTimeout(resolve, 1000)) - const isPortAvailableForDevServer = await isPortAvailable(availablePort) - expect(isPortAvailableForDevServer).toBe(false) + const res = await fetch(`http://localhost:3021`) + expect(res.status).toBe(200) afterEach(async () => { + server.close() await devServer.stop() }) }) From 8d637179931b3bc4526ec30de9dd4ece3afe9bbd Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Thu, 23 Jan 2025 23:30:06 +0530 Subject: [PATCH 5/5] fix: format check --- tests/test3-dev-server-port.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test3-dev-server-port.test.ts b/tests/test3-dev-server-port.test.ts index 9ee7408..a325554 100644 --- a/tests/test3-dev-server-port.test.ts +++ b/tests/test3-dev-server-port.test.ts @@ -17,14 +17,14 @@ test("test3 dev server port handling", async () => { }) const server = http.createServer(() => {}).listen(3020) - + const devServer = new DevServer({ port: 3021, componentFilePath: `${tempDirPath}/snippet.tsx`, }) await devServer.start() - await new Promise(resolve => setTimeout(resolve, 1000)) + await new Promise((resolve) => setTimeout(resolve, 1000)) const res = await fetch(`http://localhost:3021`) expect(res.status).toBe(200)