From 6e1aa42fa1270a24a312d3772779beca37668ede Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Fri, 31 Jan 2025 22:11:19 +0530 Subject: [PATCH] fix: set default port to 3020 (#37) * fix: set default port to 3020 * feat: add test file * fix: remove two dev server * fix: test * fix: format check --- cli/dev/register.ts | 22 ++++++++++++++++-- lib/server/createHttpServer.ts | 2 +- tests/test3-dev-server-port.test.ts | 36 +++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 tests/test3-dev-server-port.test.ts 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) => { diff --git a/tests/test3-dev-server-port.test.ts b/tests/test3-dev-server-port.test.ts new file mode 100644 index 0000000..a325554 --- /dev/null +++ b/tests/test3-dev-server-port.test.ts @@ -0,0 +1,36 @@ +import { test, expect, afterEach } from "bun:test" +import { DevServer } from "cli/dev/DevServer" +import { getTestFixture } from "tests/fixtures/get-test-fixture" +import * as http from "node:http" + +test("test3 dev server port handling", async () => { + const { tempDirPath } = await getTestFixture({ + vfs: { + "snippet.tsx": ` + export const MyCircuit = () => ( + + + + ) + `, + }, + }) + + 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)) + + const res = await fetch(`http://localhost:3021`) + expect(res.status).toBe(200) + + afterEach(async () => { + server.close() + await devServer.stop() + }) +})