From 40da87c0ef8a2fc21978b071b51d5717df205c56 Mon Sep 17 00:00:00 2001 From: Roman Date: Sun, 12 Jul 2020 10:37:10 +0300 Subject: [PATCH] port.ts refactoring Signed-off-by: Roman --- src/main/index.ts | 1 - src/main/port.ts | 43 ++++++++++++++++--------------------------- src/main/port_spec.ts | 9 +++++++-- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 8f7a212239..c78b450d48 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -50,7 +50,6 @@ async function main() { try { proxyPort = await getFreePort() } catch (error) { - logger.error(error) await dialog.showErrorBox("Lens Error", "Could not find a free port for the cluster proxy") app.quit(); } diff --git a/src/main/port.ts b/src/main/port.ts index 90b636cf78..a938ff4ae3 100644 --- a/src/main/port.ts +++ b/src/main/port.ts @@ -1,31 +1,20 @@ +import net, { AddressInfo } from "net" import logger from "./logger" -import { createServer, AddressInfo } from "net" -// todo: use https://github.com/http-party/node-portfinder ? +// todo: check https://github.com/http-party/node-portfinder ? -const getNextAvailablePort = () => { - logger.debug("getNextAvailablePort() start") - const server = createServer() - server.unref() - return new Promise((resolve, reject) => - server - .on('error', (error: any) => reject(error)) - .on('listening', () => { - logger.debug("*** server listening event ***") - const _port = (server.address() as AddressInfo).port - server.close(() => resolve(_port)) - }) - .listen({host: "127.0.0.1", port: 0})) -} - -export const getFreePort = async () => { - logger.debug("getFreePort() start") - let freePort: number = null - try { - freePort = await getNextAvailablePort() - logger.debug("got port : " + freePort) - } catch(error) { - throw("getNextAvailablePort() threw: '" + error + "'") - } - return freePort +export async function getFreePort(): Promise { + logger.debug("Lookup new free port.."); + return new Promise((resolve, reject) => { + const server = net.createServer().unref().listen({ port: 0 }); + server.on("listening", () => { + const port = (server.address() as AddressInfo).port + server.close(() => resolve(port)); + logger.debug(`New port found: ${port}`); + }); + server.on("error", error => { + logger.error(`Can't resolve new port: "${error}"`); + reject(error); + }); + }) } diff --git a/src/main/port_spec.ts b/src/main/port_spec.ts index bce8cce413..c9be25e514 100644 --- a/src/main/port_spec.ts +++ b/src/main/port_spec.ts @@ -1,6 +1,8 @@ import { EventEmitter } from 'events' import { getFreePort } from "./port" +let newPort = 0; + jest.mock("net", () => { return { createServer() { @@ -10,7 +12,10 @@ jest.mock("net", () => { return this }) address = () => { - return { port: 12345 } + newPort = Math.round(Math.random() * 10000) + return { + port: newPort + } } unref = jest.fn() close = jest.fn(cb => cb()) @@ -21,6 +26,6 @@ jest.mock("net", () => { describe("getFreePort", () => { it("finds the next free port", async () => { - return expect(getFreePort()).resolves.toEqual(expect.any(Number)) + return expect(getFreePort()).resolves.toEqual(newPort); }) })