From 03d1c3a031e57c86fa573cb290e200b65d0dbf1a Mon Sep 17 00:00:00 2001 From: Heiko Mamerow Date: Fri, 14 Apr 2023 18:17:39 +0200 Subject: [PATCH] feat(ports): check if port is already in use --- bin/cli.js | 10 ++++++++++ bin/cli.js.map | 2 +- src/cli.ts | 19 ++++++++++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/bin/cli.js b/bin/cli.js index 68082fd..6592ee7 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -5,6 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); +const net_1 = __importDefault(require("net")); +const server = net_1.default.createServer(); const port = getPortnumber(); const testsPort = port + 1; const objPorts = { 'port': port, 'testsPort': testsPort }; @@ -46,6 +48,14 @@ function getPortnumber() { if (notWantedPorts.includes(portnumber)) { getPortnumber(); } + // Check if the port is already in use. + server.on('error', (err) => { + if (err.code === 'EADDRINUSE') { + server.close(); + getPortnumber(); + } + }); + server.listen(portnumber, 'localhost'); return portnumber; } //# sourceMappingURL=cli.js.map \ No newline at end of file diff --git a/bin/cli.js.map b/bin/cli.js.map index d714635..e531500 100644 --- a/bin/cli.js.map +++ b/bin/cli.js.map @@ -1 +1 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,4CAAoB;AACpB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;AAC7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;AAC3B,MAAM,QAAQ,GAAgC,EAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAC,CAAA;AACpF,MAAM,SAAS,GAAG,cAAc,CAAC;AACjC,IAAI,aAA0C,CAAA;AAE9C;;GAEG;AACH,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;IAC1B,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9D,0CAA0C;IAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAChC,aAAa,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtC,CAAC,CAAC,CAAC;CACN;KAAM;IACH,wBAAwB;IACxB,aAAa,GAAG,QAAQ,CAAC;CAC5B;AAED;;GAEG;AACH,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAEnE;;;;;GAKG;AACH,SAAS,aAAa;IAClB,qCAAqC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAA;IACvB,IAAI,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAI,UAAU,IAAI,SAAS,EAAE;QACzB,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1D;IAED,0BAA0B;IAC1B,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC3G,IAAI,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACrC,aAAa,EAAE,CAAA;KAClB;IAED,OAAO,UAAU,CAAA;AACrB,CAAC"} \ No newline at end of file +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,4CAAoB;AACpB,8CAAsB;AAEtB,MAAM,MAAM,GAAG,aAAG,CAAC,YAAY,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;AAC7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;AAC3B,MAAM,QAAQ,GAAgC,EAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAC,CAAA;AACpF,MAAM,SAAS,GAAG,cAAc,CAAC;AACjC,IAAI,aAA0C,CAAA;AAG9C;;GAEG;AACH,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;IAC1B,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9D,0CAA0C;IAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAChC,aAAa,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtC,CAAC,CAAC,CAAC;CACN;KAAM;IACH,wBAAwB;IACxB,aAAa,GAAG,QAAQ,CAAA;CAC3B;AAED;;GAEG;AACH,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAEnE;;;;;GAKG;AACH,SAAS,aAAa;IAClB,qCAAqC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAA;IACvB,IAAI,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,IAAI,UAAU,IAAI,SAAS,EAAE;QACzB,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KACzD;IAED,0BAA0B;IAC1B,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC3G,IAAI,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACrC,aAAa,EAAE,CAAA;KAClB;IAED,uCAAuC;IACvC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;QAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;YAC3B,MAAM,CAAC,KAAK,EAAE,CAAA;YACd,aAAa,EAAE,CAAA;SAClB;IACL,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAEtC,OAAO,UAAU,CAAA;AACrB,CAAC"} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index fe55e2e..718044e 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,12 +1,16 @@ #!/usr/bin/env node import fs from 'fs'; +import net from 'net'; + +const server = net.createServer(); const port = getPortnumber(); const testsPort = port + 1; const objPorts: { [index: string]: number } = {'port': port, 'testsPort': testsPort} const wpEnvJson = '.wp-env.json'; let wpEnvJsonData: { [index: string]: number } + /** * Check if ".wp-env.json" exist. */ @@ -18,7 +22,7 @@ if (fs.existsSync(wpEnvJson)) { }); } else { // No wp-env.json exist. - wpEnvJsonData = objPorts; + wpEnvJsonData = objPorts } /** @@ -35,9 +39,9 @@ fs.writeFileSync(wpEnvJson, JSON.stringify(wpEnvJsonData, null, 2)) function getPortnumber() { // Build port numbers from timestamp. const maxNumber = 65535 - let portnumber = parseInt(Date.now().toString().slice(-5)); + let portnumber = parseInt(Date.now().toString().slice(-5)) if (portnumber >= maxNumber) { - portnumber = parseInt(portnumber.toString().slice(-4)); + portnumber = parseInt(portnumber.toString().slice(-4)) } // Prevent unwanted ports. @@ -46,5 +50,14 @@ function getPortnumber() { getPortnumber() } + // Check if the port is already in use. + server.on('error', (err: NodeJS.ErrnoException) => { + if (err.code === 'EADDRINUSE') { + server.close() + getPortnumber() + } + }); + server.listen(portnumber, 'localhost') + return portnumber } \ No newline at end of file